diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/CategoryManga.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/CategoryManga.kt index 69a512a3..1b9817fb 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/impl/CategoryManga.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/CategoryManga.kt @@ -48,7 +48,7 @@ object CategoryManga { } } -/** + /** * list of mangas that belong to a category */ fun getCategoryMangaList(categoryId: Int): List { @@ -59,7 +59,7 @@ object CategoryManga { } } -/** + /** * list of categories that a manga belongs to */ fun getMangaCategories(mangaId: Int): List { diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/Chapter.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/Chapter.kt index 3a02566f..6ed0d765 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/impl/Chapter.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/Chapter.kt @@ -10,7 +10,7 @@ package ir.armor.tachidesk.impl import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import ir.armor.tachidesk.impl.Manga.getManga -import ir.armor.tachidesk.impl.Source.getHttpSource +import ir.armor.tachidesk.impl.util.GetHttpSource.getHttpSource import ir.armor.tachidesk.impl.util.awaitSingle import ir.armor.tachidesk.model.database.ChapterTable import ir.armor.tachidesk.model.database.MangaTable diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/Manga.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/Manga.kt index f759e1b8..25b696b2 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/impl/Manga.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/Manga.kt @@ -10,9 +10,9 @@ package ir.armor.tachidesk.impl import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.SManga import ir.armor.tachidesk.impl.MangaList.proxyThumbnailUrl -import ir.armor.tachidesk.impl.Source.getHttpSource import ir.armor.tachidesk.impl.Source.getSource import ir.armor.tachidesk.impl.util.CachedImageResponse.getCachedImageResponse +import ir.armor.tachidesk.impl.util.GetHttpSource.getHttpSource import ir.armor.tachidesk.impl.util.await import ir.armor.tachidesk.impl.util.awaitSingle import ir.armor.tachidesk.model.database.MangaStatus diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/MangaList.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/MangaList.kt index 8a78ff70..dfbeec57 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/impl/MangaList.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/MangaList.kt @@ -8,7 +8,7 @@ package ir.armor.tachidesk.impl * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import eu.kanade.tachiyomi.source.model.MangasPage -import ir.armor.tachidesk.impl.Source.getHttpSource +import ir.armor.tachidesk.impl.util.GetHttpSource.getHttpSource import ir.armor.tachidesk.impl.util.awaitSingle import ir.armor.tachidesk.model.database.MangaStatus import ir.armor.tachidesk.model.database.MangaTable diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/Page.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/Page.kt index 85314c92..aff86daa 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/impl/Page.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/Page.kt @@ -9,8 +9,8 @@ package ir.armor.tachidesk.impl import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.online.HttpSource -import ir.armor.tachidesk.impl.Source.getHttpSource import ir.armor.tachidesk.impl.util.CachedImageResponse.getCachedImageResponse +import ir.armor.tachidesk.impl.util.GetHttpSource.getHttpSource import ir.armor.tachidesk.impl.util.awaitSingle import ir.armor.tachidesk.model.database.ChapterTable import ir.armor.tachidesk.model.database.MangaTable diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/Search.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/Search.kt index bd0f968b..3dedb20c 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/impl/Search.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/Search.kt @@ -8,7 +8,7 @@ package ir.armor.tachidesk.impl * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import ir.armor.tachidesk.impl.MangaList.processEntries -import ir.armor.tachidesk.impl.Source.getHttpSource +import ir.armor.tachidesk.impl.util.GetHttpSource.getHttpSource import ir.armor.tachidesk.impl.util.awaitSingle import ir.armor.tachidesk.model.dataclass.PagedMangaListDataClass diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/Source.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/Source.kt index cc8e1ccf..9fec2bf1 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/impl/Source.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/Source.kt @@ -7,59 +7,19 @@ package ir.armor.tachidesk.impl * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import eu.kanade.tachiyomi.source.SourceFactory -import eu.kanade.tachiyomi.source.online.HttpSource import ir.armor.tachidesk.impl.Extension.getExtensionIconUrl -import ir.armor.tachidesk.impl.Extension.loadExtensionInstance +import ir.armor.tachidesk.impl.util.GetHttpSource.getHttpSource import ir.armor.tachidesk.model.database.ExtensionTable import ir.armor.tachidesk.model.database.SourceTable import ir.armor.tachidesk.model.dataclass.SourceDataClass -import ir.armor.tachidesk.server.ApplicationDirs import mu.KotlinLogging import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.transactions.transaction -import java.util.concurrent.ConcurrentHashMap object Source { private val logger = KotlinLogging.logger {} - private val sourceCache = ConcurrentHashMap() - - fun getHttpSource(sourceId: Long): HttpSource { - val cachedResult: HttpSource? = sourceCache[sourceId] - if (cachedResult != null) { - return cachedResult - } - - val sourceRecord = transaction { - SourceTable.select { SourceTable.id eq sourceId }.firstOrNull()!! - } - - val extensionId = sourceRecord[SourceTable.extension] - val extensionRecord = transaction { - ExtensionTable.select { ExtensionTable.id eq extensionId }.firstOrNull()!! - } - - val apkName = extensionRecord[ExtensionTable.apkName] - val className = extensionRecord[ExtensionTable.classFQName] - val jarName = apkName.substringBefore(".apk") + ".jar" - val jarPath = "${ApplicationDirs.extensionsRoot}/$jarName" - - val extensionInstance = loadExtensionInstance(jarPath, className) - - if (sourceRecord[SourceTable.partOfFactorySource]) { - (extensionInstance as SourceFactory).createSources().forEach { - sourceCache[it.id] = it as HttpSource - } - } else { - (extensionInstance as HttpSource).also { - sourceCache[it.id] = it - } - } - return sourceCache[sourceId]!! - } - fun getSourceList(): List { return transaction { SourceTable.selectAll().map { diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/util/GetHttpSource.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/util/GetHttpSource.kt new file mode 100644 index 00000000..a20e31c2 --- /dev/null +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/util/GetHttpSource.kt @@ -0,0 +1,56 @@ +package ir.armor.tachidesk.impl.util + +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +import eu.kanade.tachiyomi.source.SourceFactory +import eu.kanade.tachiyomi.source.online.HttpSource +import ir.armor.tachidesk.impl.Extension +import ir.armor.tachidesk.model.database.ExtensionTable +import ir.armor.tachidesk.model.database.SourceTable +import ir.armor.tachidesk.server.ApplicationDirs +import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.transactions.transaction +import java.util.concurrent.ConcurrentHashMap + +object GetHttpSource { + private val sourceCache = ConcurrentHashMap() + + fun getHttpSource(sourceId: Long): HttpSource { + val cachedResult: HttpSource? = sourceCache[sourceId] + if (cachedResult != null) { + return cachedResult + } + + val sourceRecord = transaction { + SourceTable.select { SourceTable.id eq sourceId }.firstOrNull()!! + } + + val extensionId = sourceRecord[SourceTable.extension] + val extensionRecord = transaction { + ExtensionTable.select { ExtensionTable.id eq extensionId }.firstOrNull()!! + } + + val apkName = extensionRecord[ExtensionTable.apkName] + val className = extensionRecord[ExtensionTable.classFQName] + val jarName = apkName.substringBefore(".apk") + ".jar" + val jarPath = "${ApplicationDirs.extensionsRoot}/$jarName" + + val extensionInstance = Extension.loadExtensionInstance(jarPath, className) + + if (sourceRecord[SourceTable.partOfFactorySource]) { + (extensionInstance as SourceFactory).createSources().forEach { + sourceCache[it.id] = it as HttpSource + } + } else { + (extensionInstance as HttpSource).also { + sourceCache[it.id] = it + } + } + return sourceCache[sourceId]!! + } +}