diff --git a/build.gradle.kts b/build.gradle.kts index 05ab640e..3633b32f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -28,7 +28,7 @@ val h2Version = "2.2.224" val mockitoVersion = "5.11.0" plugins { - kotlin("jvm") version "2.0.0-RC1" + kotlin("jvm") version "2.0.0-RC2" kotlin("kapt") version "1.9.23" id("io.ktor.plugin") version "2.3.10" jacoco diff --git a/src/main/kotlin/fr/shikkanime/converters/episode_variant/EpisodeVariantToEpisodeVariantWithoutMappingDtoConverter.kt b/src/main/kotlin/fr/shikkanime/converters/episode_variant/EpisodeVariantToEpisodeVariantWithoutMappingDtoConverter.kt index 65879f8d..04130ff8 100644 --- a/src/main/kotlin/fr/shikkanime/converters/episode_variant/EpisodeVariantToEpisodeVariantWithoutMappingDtoConverter.kt +++ b/src/main/kotlin/fr/shikkanime/converters/episode_variant/EpisodeVariantToEpisodeVariantWithoutMappingDtoConverter.kt @@ -6,7 +6,8 @@ import fr.shikkanime.dtos.variants.EpisodeVariantWithoutMappingDto import fr.shikkanime.entities.EpisodeVariant import fr.shikkanime.utils.withUTCString -class EpisodeVariantToEpisodeVariantWithoutMappingDtoConverter : AbstractConverter() { +class EpisodeVariantToEpisodeVariantWithoutMappingDtoConverter : + AbstractConverter() { override fun convert(from: EpisodeVariant): EpisodeVariantWithoutMappingDto { return EpisodeVariantWithoutMappingDto( uuid = from.uuid!!, diff --git a/src/main/kotlin/fr/shikkanime/entities/EpisodeMapping.kt b/src/main/kotlin/fr/shikkanime/entities/EpisodeMapping.kt index ab8394af..b52964bb 100644 --- a/src/main/kotlin/fr/shikkanime/entities/EpisodeMapping.kt +++ b/src/main/kotlin/fr/shikkanime/entities/EpisodeMapping.kt @@ -12,7 +12,11 @@ import java.util.* @Table( name = "episode_mapping", indexes = [ - Index(name = "idx_episode_mapping_anime_episode_type_season_number", columnList = "anime_uuid, episode_type, season, number", unique = true), + Index( + name = "idx_episode_mapping_anime_episode_type_season_number", + columnList = "anime_uuid, episode_type, season, number", + unique = true + ), ] ) @Cacheable diff --git a/src/main/kotlin/fr/shikkanime/jobs/FetchCalendarJob.kt b/src/main/kotlin/fr/shikkanime/jobs/FetchCalendarJob.kt index f784b509..1797ff19 100644 --- a/src/main/kotlin/fr/shikkanime/jobs/FetchCalendarJob.kt +++ b/src/main/kotlin/fr/shikkanime/jobs/FetchCalendarJob.kt @@ -243,7 +243,8 @@ class FetchCalendarJob : AbstractJob { if (configCacheService.getValueAsBoolean(ConfigPropertyKey.TRANSLATE_CALENDAR)) { val alternativeTitles = - list.find { it.text().contains("Titre alternatif") }?.text()?.replace("Titre alternatif :", "")?.split("/") + list.find { it.text().contains("Titre alternatif") }?.text()?.replace("Titre alternatif :", "") + ?.split("/") ?: emptyList() val detectedLanguage = languageCacheService.detectLanguage(title) diff --git a/src/main/kotlin/fr/shikkanime/jobs/FetchEpisodesJob.kt b/src/main/kotlin/fr/shikkanime/jobs/FetchEpisodesJob.kt index 049cec4a..2b153763 100644 --- a/src/main/kotlin/fr/shikkanime/jobs/FetchEpisodesJob.kt +++ b/src/main/kotlin/fr/shikkanime/jobs/FetchEpisodesJob.kt @@ -70,7 +70,15 @@ class FetchEpisodesJob : AbstractJob { } val savedEpisodes = episodes - .sortedWith(compareBy({ it.releaseDateTime }, { it.anime }, { it.season }, { it.episodeType }, { it.number }, { it.audioLocale })) + .sortedWith( + compareBy( + { it.releaseDateTime }, + { it.anime }, + { it.season }, + { it.episodeType }, + { it.number }, + { it.audioLocale }) + ) .filter { (zonedDateTime.isEqualOrAfter(it.releaseDateTime)) && !identifiers.contains(it.getIdentifier()) } .mapNotNull { try { diff --git a/src/main/kotlin/fr/shikkanime/jobs/FetchOldEpisodesJob.kt b/src/main/kotlin/fr/shikkanime/jobs/FetchOldEpisodesJob.kt index 7c1b4293..01ea43d9 100644 --- a/src/main/kotlin/fr/shikkanime/jobs/FetchOldEpisodesJob.kt +++ b/src/main/kotlin/fr/shikkanime/jobs/FetchOldEpisodesJob.kt @@ -68,7 +68,9 @@ class FetchOldEpisodesJob : AbstractJob { val to = LocalDate.parse(config.propertyValue!!) val from = to.minusDays(range.toLong()) val dates = from.datesUntil(to.plusDays(1), Period.ofDays(1)).toList().sorted() - val simulcasts = dates.map { "${Constant.seasons[(it.monthValue - 1) / 3]}-${it.year}".lowercase().replace("autumn", "fall") }.toSet() + val simulcasts = dates.map { + "${Constant.seasons[(it.monthValue - 1) / 3]}-${it.year}".lowercase().replace("autumn", "fall") + }.toSet() val episodes = mutableListOf() val start = System.currentTimeMillis() logger.info("Fetching old episodes... (From ${dates.first()} to ${dates.last()})") @@ -118,14 +120,22 @@ class FetchOldEpisodesJob : AbstractJob { logger.info("Updating simulcasts...") animeService.recalculateSimulcasts() - MapCache.invalidate(Anime::class.java, EpisodeMapping::class.java, EpisodeVariant::class.java, Simulcast::class.java) + MapCache.invalidate( + Anime::class.java, + EpisodeMapping::class.java, + EpisodeVariant::class.java, + Simulcast::class.java + ) logger.info("Updating config to the next fetch date...") config.propertyValue = from.toString() configService.update(config) logger.info("Take ${(System.currentTimeMillis() - start) / 1000}s to check ${dates.size} dates") } - private fun fetchAnimationDigitalNetwork(countryCode: CountryCode, dates: List): List { + private fun fetchAnimationDigitalNetwork( + countryCode: CountryCode, + dates: List + ): List { val episodes = mutableListOf() dates.forEachIndexed { _, date -> @@ -140,14 +150,18 @@ class FetchOldEpisodesJob : AbstractJob { try { episodes.addAll( animationDigitalNetworkPlatform.convertEpisode( - countryCode, - episodeJson.asJsonObject, - zonedDateTime, - false + countryCode, + episodeJson.asJsonObject, + zonedDateTime, + false ) ) } catch (e: Exception) { - logger.log(Level.SEVERE, "Error while converting episode (Episode ID: ${episodeJson.getAsString("id")})", e) + logger.log( + Level.SEVERE, + "Error while converting episode (Episode ID: ${episodeJson.getAsString("id")})", + e + ) } } } @@ -181,8 +195,14 @@ class FetchOldEpisodesJob : AbstractJob { series.forEach { val postersTall = it.getAsJsonObject("images").getAsJsonArray("poster_tall")[0].asJsonArray val postersWide = it.getAsJsonObject("images").getAsJsonArray("poster_wide")[0].asJsonArray - val image = postersTall?.maxByOrNull { poster -> poster.asJsonObject.getAsInt("width")!! }?.asJsonObject?.getAsString("source")!! - val banner = postersWide?.maxByOrNull { poster -> poster.asJsonObject.getAsInt("width")!! }?.asJsonObject?.getAsString("source")!! + val image = + postersTall?.maxByOrNull { poster -> poster.asJsonObject.getAsInt("width")!! }?.asJsonObject?.getAsString( + "source" + )!! + val banner = + postersWide?.maxByOrNull { poster -> poster.asJsonObject.getAsInt("width")!! }?.asJsonObject?.getAsString( + "source" + )!! val description = it.getAsString("description") crunchyrollPlatform.animeInfoCache[CountryCodeIdKeyCache(countryCode, it.getAsString("id")!!)] = @@ -228,7 +248,11 @@ class FetchOldEpisodesJob : AbstractJob { ) ) } catch (e: Exception) { - logger.log(Level.SEVERE, "Error while converting episode (Episode ID: ${episodeJson.getAsString("id")})", e) + logger.log( + Level.SEVERE, + "Error while converting episode (Episode ID: ${episodeJson.getAsString("id")})", + e + ) } } } diff --git a/src/main/kotlin/fr/shikkanime/modules/Routing.kt b/src/main/kotlin/fr/shikkanime/modules/Routing.kt index bbf69ffb..b84793e8 100644 --- a/src/main/kotlin/fr/shikkanime/modules/Routing.kt +++ b/src/main/kotlin/fr/shikkanime/modules/Routing.kt @@ -260,6 +260,7 @@ private fun handleQueryParam(kParameter: KParameter, call: ApplicationCall): Any null } } + else -> throw Exception("Unknown type ${kParameter.type}") } } diff --git a/src/main/kotlin/fr/shikkanime/platforms/CrunchyrollPlatform.kt b/src/main/kotlin/fr/shikkanime/platforms/CrunchyrollPlatform.kt index 034978b9..2a30ea50 100644 --- a/src/main/kotlin/fr/shikkanime/platforms/CrunchyrollPlatform.kt +++ b/src/main/kotlin/fr/shikkanime/platforms/CrunchyrollPlatform.kt @@ -181,7 +181,10 @@ class CrunchyrollPlatform : AbstractPlatform(Duration.ofHours(3).plusMinutes(30), listOf(Config::class.java)) { - return@MapCache runBlocking { - DisneyPlusWrapper.getAccessToken( - configCacheService.getValueAsString(ConfigPropertyKey.DISNEY_PLUS_AUTHORIZATION), - configCacheService.getValueAsString(ConfigPropertyKey.DISNEY_PLUS_REFRESH_TOKEN) - ) + private val identifiers = + MapCache(Duration.ofHours(3).plusMinutes(30), listOf(Config::class.java)) { + return@MapCache runBlocking { + DisneyPlusWrapper.getAccessToken( + configCacheService.getValueAsString(ConfigPropertyKey.DISNEY_PLUS_AUTHORIZATION), + configCacheService.getValueAsString(ConfigPropertyKey.DISNEY_PLUS_REFRESH_TOKEN) + ) + } } - } private val seasons = MapCache>(Duration.ofDays(1)) { val accessToken = identifiers[it.countryCode]!! - return@MapCache runBlocking { DisneyPlusWrapper.getSeasons(accessToken, it.countryCode, it.disneyPlusSimulcast.name) } + return@MapCache runBlocking { + DisneyPlusWrapper.getSeasons( + accessToken, + it.countryCode, + it.disneyPlusSimulcast.name + ) + } } override suspend fun fetchApiContent( diff --git a/src/main/kotlin/fr/shikkanime/platforms/NetflixPlatform.kt b/src/main/kotlin/fr/shikkanime/platforms/NetflixPlatform.kt index c957ca65..d43f659e 100644 --- a/src/main/kotlin/fr/shikkanime/platforms/NetflixPlatform.kt +++ b/src/main/kotlin/fr/shikkanime/platforms/NetflixPlatform.kt @@ -13,7 +13,8 @@ import java.time.LocalTime import java.time.ZonedDateTime import java.time.format.DateTimeFormatter -class NetflixPlatform : AbstractPlatform>() { +class NetflixPlatform : + AbstractPlatform>() { override fun getPlatform(): Platform = Platform.NETF override fun getConfigurationClass() = NetflixConfiguration::class.java diff --git a/src/main/kotlin/fr/shikkanime/services/EpisodeVariantService.kt b/src/main/kotlin/fr/shikkanime/services/EpisodeVariantService.kt index de180913..e18783ff 100644 --- a/src/main/kotlin/fr/shikkanime/services/EpisodeVariantService.kt +++ b/src/main/kotlin/fr/shikkanime/services/EpisodeVariantService.kt @@ -64,7 +64,8 @@ class EpisodeVariantService : AbstractService variant.audioLocale }.any { audioLocale -> audioLocale != anime.countryCode!!.locale } + it.variants.map { variant -> variant.audioLocale } + .any { audioLocale -> audioLocale != anime.countryCode!!.locale } } val diff = previousEpisode?.releaseDateTime?.until(entity.releaseDateTime, ChronoUnit.MONTHS) ?: -1 @@ -81,24 +82,27 @@ class EpisodeVariantService : AbstractService currentSimulcast } - return simulcastService.findBySeasonAndYear(choosenSimulcast.season!!, choosenSimulcast.year!!) ?: choosenSimulcast + return simulcastService.findBySeasonAndYear(choosenSimulcast.season!!, choosenSimulcast.year!!) + ?: choosenSimulcast } fun save(episode: AbstractPlatform.Episode): EpisodeVariant { - val anime = animeService.findBySlug(episode.countryCode, StringUtils.toSlug(StringUtils.getShortName(episode.anime))) ?: animeService.save( - Anime( - countryCode = episode.countryCode, - name = episode.anime, - releaseDateTime = episode.releaseDateTime, - lastReleaseDateTime = episode.releaseDateTime, - image = episode.animeImage, - banner = episode.animeBanner, - description = episode.animeDescription, - slug = StringUtils.toSlug(StringUtils.getShortName(episode.anime)) - ).apply { - status = StringUtils.getStatus(this) - } - ) + val anime = + animeService.findBySlug(episode.countryCode, StringUtils.toSlug(StringUtils.getShortName(episode.anime))) + ?: animeService.save( + Anime( + countryCode = episode.countryCode, + name = episode.anime, + releaseDateTime = episode.releaseDateTime, + lastReleaseDateTime = episode.releaseDateTime, + image = episode.animeImage, + banner = episode.animeBanner, + description = episode.animeDescription, + slug = StringUtils.toSlug(StringUtils.getShortName(episode.anime)) + ).apply { + status = StringUtils.getStatus(this) + } + ) val mapping = getEpisodeMapping(anime, episode) mapping.lastReleaseDateTime = episode.releaseDateTime diff --git a/src/main/kotlin/fr/shikkanime/services/ImageService.kt b/src/main/kotlin/fr/shikkanime/services/ImageService.kt index d2fc73b4..ad1e7d85 100644 --- a/src/main/kotlin/fr/shikkanime/services/ImageService.kt +++ b/src/main/kotlin/fr/shikkanime/services/ImageService.kt @@ -519,7 +519,7 @@ object ImageService { val image = ImageIO.read(this).resize(32, 32) close() image - } + } return Tuple(backgroundImage, bannerImage, font, animeImage, platformImage) } diff --git a/src/main/kotlin/fr/shikkanime/services/caches/AnimeCacheService.kt b/src/main/kotlin/fr/shikkanime/services/caches/AnimeCacheService.kt index fa974df3..dd74b3f0 100644 --- a/src/main/kotlin/fr/shikkanime/services/caches/AnimeCacheService.kt +++ b/src/main/kotlin/fr/shikkanime/services/caches/AnimeCacheService.kt @@ -55,7 +55,12 @@ class AnimeCacheService : AbstractCacheService { } private val weeklyCache = - MapCache>(classes = listOf(EpisodeMapping::class.java, EpisodeVariant::class.java)) { + MapCache>( + classes = listOf( + EpisodeMapping::class.java, + EpisodeVariant::class.java + ) + ) { animeService.getWeeklyAnimes(it.localDate, it.countryCode) } diff --git a/src/main/kotlin/fr/shikkanime/socialnetworks/AbstractSocialNetwork.kt b/src/main/kotlin/fr/shikkanime/socialnetworks/AbstractSocialNetwork.kt index 892750c2..0da8f7c6 100644 --- a/src/main/kotlin/fr/shikkanime/socialnetworks/AbstractSocialNetwork.kt +++ b/src/main/kotlin/fr/shikkanime/socialnetworks/AbstractSocialNetwork.kt @@ -33,14 +33,18 @@ abstract class AbstractSocialNetwork { fun getEpisodeMessage(episodeDto: EpisodeVariantDto, baseMessage: String): String { val uncensored = if (episodeDto.uncensored) " non censuré" else "" - val isVoice = if (LangType.fromAudioLocale(episodeDto.mapping.anime.countryCode, episodeDto.audioLocale) == LangType.VOICE) " en VF " else " " + val isVoice = if (LangType.fromAudioLocale( + episodeDto.mapping.anime.countryCode, + episodeDto.audioLocale + ) == LangType.VOICE + ) " en VF " else " " var configMessage = baseMessage configMessage = configMessage.replace("{SHIKKANIME_URL}", getShikkanimeUrl(episodeDto)) configMessage = configMessage.replace("{URL}", episodeDto.url) configMessage = configMessage.replace("{PLATFORM_ACCOUNT}", platformAccount(episodeDto.platform)) - configMessage = - configMessage.replace("{ANIME_HASHTAG}", "#${StringUtils.getHashtag(episodeDto.mapping.anime.shortName)}") + configMessage = configMessage.replace("{PLATFORM_NAME}", episodeDto.platform.name) + configMessage = configMessage.replace("{ANIME_HASHTAG}", "#${StringUtils.getHashtag(episodeDto.mapping.anime.shortName)}") configMessage = configMessage.replace("{ANIME_TITLE}", episodeDto.mapping.anime.shortName) configMessage = configMessage.replace("{EPISODE_INFORMATION}", "${information(episodeDto)}${uncensored}") configMessage = configMessage.replace("{VOICE}", isVoice) diff --git a/src/main/kotlin/fr/shikkanime/socialnetworks/DiscordSocialNetwork.kt b/src/main/kotlin/fr/shikkanime/socialnetworks/DiscordSocialNetwork.kt index f08c078a..420567c8 100644 --- a/src/main/kotlin/fr/shikkanime/socialnetworks/DiscordSocialNetwork.kt +++ b/src/main/kotlin/fr/shikkanime/socialnetworks/DiscordSocialNetwork.kt @@ -74,7 +74,13 @@ class DiscordSocialNetwork : AbstractSocialNetwork() { ) embedMessage.setTitle(episodeDto.mapping.anime.shortName, getShikkanimeUrl(episodeDto)) embedMessage.setThumbnail(episodeDto.mapping.anime.image) - embedMessage.setDescription("**${episodeDto.mapping.title ?: "Untitled"}**\n${StringUtils.toEpisodeString(episodeDto)}") + embedMessage.setDescription( + "**${episodeDto.mapping.title ?: "Untitled"}**\n${ + StringUtils.toEpisodeString( + episodeDto + ) + }" + ) embedMessage.setImage(episodeDto.mapping.image) embedMessage.setFooter(Constant.NAME, "${Constant.baseUrl}/assets/img/favicons/favicon-64x64.png") embedMessage.setTimestamp(ZonedDateTime.parse(episodeDto.releaseDateTime).toInstant()) diff --git a/src/main/resources/db/changelog/2024/03/02-changelog.xml b/src/main/resources/db/changelog/2024/03/02-changelog.xml index f89888ed..c4774e61 100644 --- a/src/main/resources/db/changelog/2024/03/02-changelog.xml +++ b/src/main/resources/db/changelog/2024/03/02-changelog.xml @@ -3,7 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog - http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" + objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> diff --git a/src/main/resources/db/changelog/2024/03/03-changelog.xml b/src/main/resources/db/changelog/2024/03/03-changelog.xml index 49553c80..b9f3206a 100644 --- a/src/main/resources/db/changelog/2024/03/03-changelog.xml +++ b/src/main/resources/db/changelog/2024/03/03-changelog.xml @@ -3,7 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog - http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.26.xsd" + objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> diff --git a/src/main/resources/db/changelog/2024/03/06-changelog.xml b/src/main/resources/db/changelog/2024/03/06-changelog.xml index 52ca2559..612218c4 100644 --- a/src/main/resources/db/changelog/2024/03/06-changelog.xml +++ b/src/main/resources/db/changelog/2024/03/06-changelog.xml @@ -18,7 +18,8 @@ - + \ No newline at end of file diff --git a/src/main/resources/db/changelog/2024/04/01-changelog.xml b/src/main/resources/db/changelog/2024/04/01-changelog.xml index b1c88f80..9ba7c0c0 100644 --- a/src/main/resources/db/changelog/2024/04/01-changelog.xml +++ b/src/main/resources/db/changelog/2024/04/01-changelog.xml @@ -3,7 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog - http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" + objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> diff --git a/src/main/resources/db/changelog/2024/04/03-changelog.xml b/src/main/resources/db/changelog/2024/04/03-changelog.xml index 8333c53a..06847d27 100644 --- a/src/main/resources/db/changelog/2024/04/03-changelog.xml +++ b/src/main/resources/db/changelog/2024/04/03-changelog.xml @@ -3,7 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog - http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" + objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> diff --git a/src/main/resources/db/changelog/2024/04/05-changelog.xml b/src/main/resources/db/changelog/2024/04/05-changelog.xml index ed6bbcb6..69685bd9 100644 --- a/src/main/resources/db/changelog/2024/04/05-changelog.xml +++ b/src/main/resources/db/changelog/2024/04/05-changelog.xml @@ -3,7 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog - http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" + objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> diff --git a/src/main/resources/db/changelog/2024/04/06-changelog.xml b/src/main/resources/db/changelog/2024/04/06-changelog.xml index c4c2980c..fefcc5e2 100644 --- a/src/main/resources/db/changelog/2024/04/06-changelog.xml +++ b/src/main/resources/db/changelog/2024/04/06-changelog.xml @@ -3,7 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog - http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" + objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> @@ -89,31 +90,39 @@ - + - + - + - + - + - + diff --git a/src/main/resources/db/changelog/2024/04/08-changelog.xml b/src/main/resources/db/changelog/2024/04/08-changelog.xml index 5b6ecb1a..218446a9 100644 --- a/src/main/resources/db/changelog/2024/04/08-changelog.xml +++ b/src/main/resources/db/changelog/2024/04/08-changelog.xml @@ -3,7 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog - http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd" + objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"> diff --git a/src/main/resources/templates/admin/dashboard.ftl b/src/main/resources/templates/admin/dashboard.ftl index aa510980..ee728453 100644 --- a/src/main/resources/templates/admin/dashboard.ftl +++ b/src/main/resources/templates/admin/dashboard.ftl @@ -46,7 +46,8 @@

Simulcasts

- Invalidate + Invalidate
    @@ -56,7 +57,8 @@
    ${simulcast.season} ${simulcast.year?c}
- +