Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,15 @@ class MlipLibraryIndexImporter @Inject constructor(
private fun readSnapshot(database: SQLiteDatabase, sourceId: Long): MlipSnapshot {
val genresBySeriesId = database.readGenresBySeriesId()
val externalIdsBySeriesId = database.readExternalIdsBySeriesId()
val releaseDatesBySeriesId = database.readReleaseDatesBySeriesId()
val posterBySeriesId = database.readPosterBySeriesId()
val seriesById = database.readSeries(sourceId, genresBySeriesId, externalIdsBySeriesId, posterBySeriesId)
val seriesById = database.readSeries(
sourceId,
genresBySeriesId,
externalIdsBySeriesId,
releaseDatesBySeriesId,
posterBySeriesId,
)
val mediaFiles = mutableListOf<MlipMediaFile>()
var skippedFiles = 0
var nonIntegerEpisodes = 0
Expand Down Expand Up @@ -264,6 +271,7 @@ class MlipLibraryIndexImporter @Inject constructor(
sourceId: Long,
genresBySeriesId: Map<Long, List<String>>,
externalIdsBySeriesId: Map<Long, MlipExternalIds>,
releaseDatesBySeriesId: Map<Long, String>,
posterBySeriesId: Map<Long, String>,
): Map<Long, MlipSeries> {
val result = linkedMapOf<Long, MlipSeries>()
Expand All @@ -288,7 +296,8 @@ class MlipLibraryIndexImporter @Inject constructor(
titleCn = title.takeIf { originalTitle != null && it != originalTitle },
summary = cursor.stringOrNull("summary").orEmpty(),
genres = genresBySeriesId[id].orEmpty(),
airDate = cursor.intOrNull("year")?.takeIf { it > 0 }?.toString(),
airDate = releaseDatesBySeriesId[id]
?: cursor.intOrNull("year")?.takeIf { it > 0 }?.toString(),
bangumiId = externalIds.bangumiId,
tmdbId = externalIds.tmdbId,
)
Expand All @@ -303,6 +312,21 @@ class MlipLibraryIndexImporter @Inject constructor(
return result
}

private fun SQLiteDatabase.readReleaseDatesBySeriesId(): Map<Long, String> {
if ("series_release_date" !in tableNames()) return emptyMap()
val result = mutableMapOf<Long, String>()
rawQuery(
"SELECT series_id, air_date FROM series_release_date",
emptyArray(),
).use { cursor ->
while (cursor.moveToNext()) {
val airDate = cursor.string("air_date").trim()
if (airDate.isNotEmpty()) result[cursor.long("series_id")] = airDate
}
}
return result
}

private fun SQLiteDatabase.readGenresBySeriesId(): Map<Long, List<String>> {
val result = mutableMapOf<Long, MutableList<String>>()
rawQuery(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ class MlipLibraryIndexImporterTest {
assertEquals("Original Title", anime.title)
assertEquals("中文标题", anime.titleCn)
assertEquals("简介", anime.summary)
assertEquals("2024", anime.airDate)
assertEquals("2024-04-03", anime.airDate)
assertEquals(listOf("科幻"), anime.genres)
assertEquals(431767, anime.bangumiId)
assertEquals(98765, anime.tmdbId)
Expand All @@ -256,6 +256,28 @@ class MlipLibraryIndexImporterTest {
}
}

@Test
fun `legacy mlip database falls back to release year`() = runBlocking {
val databaseFile = File.createTempFile("mlip-test-", ".db")
val source = mlipSource()
val metadataRepository = RecordingMetadataRepository()
val mediaSource = FakeMediaSource(
info = source,
streams = mapOf("library.db" to { databaseFile.inputStream() }),
)
try {
createMlipDatabase(databaseFile, includeReleaseDate = false)

val result = MlipLibraryIndexImporter(RecordingIndexRepository(), metadataRepository)
.importLibrary(source, mediaSource)

assertTrue(result.isSuccess())
assertEquals("2024", metadataRepository.anime.single().airDate)
} finally {
databaseFile.delete()
}
}

private suspend fun importDatabase(databaseFile: File): Result<MlipImportResult> {
val source = mlipSource()
val mediaSource = FakeMediaSource(
Expand Down Expand Up @@ -284,6 +306,7 @@ class MlipLibraryIndexImporterTest {
file: File,
userVersion: Int = 1,
includeRequiredTables: Boolean = true,
includeReleaseDate: Boolean = true,
mediaPath: String = "Series/01.mkv",
) {
file.delete()
Expand All @@ -303,6 +326,10 @@ class MlipLibraryIndexImporterTest {
database.execSQL("CREATE TABLE series_external_id (series_id INTEGER NOT NULL, provider INTEGER NOT NULL, value TEXT NOT NULL)")
database.execSQL("CREATE TABLE episode_external_id (episode_id INTEGER NOT NULL, provider INTEGER NOT NULL, value TEXT NOT NULL)")
database.execSQL("CREATE TABLE capability (key TEXT PRIMARY KEY, value TEXT NOT NULL)")
if (includeReleaseDate) {
database.execSQL("CREATE TABLE series_release_date (series_id INTEGER PRIMARY KEY, air_date TEXT NOT NULL)")
database.execSQL("INSERT INTO series_release_date (series_id, air_date) VALUES (1, '2024-04-03')")
}
database.execSQL("INSERT INTO series (id, uuid, title, original_title, summary, year, series_type) VALUES (1, 'series-uuid', '中文标题', 'Original Title', '简介', 2024, 1)")
database.execSQL("INSERT INTO episode (id, uuid, series_id, season, episode, sort_order, title, summary, runtime) VALUES (10, 'episode-uuid-1', 1, 1, 1.0, 1.0, '第 1 集', '', 1440)")
database.execSQL("INSERT INTO episode (id, uuid, series_id, season, episode, sort_order, title, summary, runtime) VALUES (11, 'episode-uuid-1-5', 1, 1, 1.5, 1.5, '第 1.5 集', '', 1440)")
Expand Down
Loading