mirror of
https://github.com/Suwayomi/Suwayomi-Server.git
synced 2026-07-04 19:34:35 -05:00
let's not polute the namespace
This commit is contained in:
@@ -7,6 +7,7 @@ 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 ir.armor.tachidesk.impl.CategoryManga.removeMangaFromCategory
|
||||
import ir.armor.tachidesk.model.database.CategoryMangaTable
|
||||
import ir.armor.tachidesk.model.database.CategoryTable
|
||||
import ir.armor.tachidesk.model.database.toDataClass
|
||||
@@ -19,11 +20,11 @@ import org.jetbrains.exposed.sql.selectAll
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
import org.jetbrains.exposed.sql.update
|
||||
|
||||
|
||||
/**
|
||||
object Category {
|
||||
/**
|
||||
* The new category will be placed at the end of the list
|
||||
*/
|
||||
fun createCategory(name: String) {
|
||||
fun createCategory(name: String) {
|
||||
transaction {
|
||||
val count = CategoryTable.selectAll().count()
|
||||
if (CategoryTable.select { CategoryTable.name eq name }.firstOrNull() == null)
|
||||
@@ -32,16 +33,16 @@ fun createCategory(name: String) {
|
||||
it[CategoryTable.order] = count.toInt() + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun updateCategory(categoryId: Int, name: String?, isLanding: Boolean?) {
|
||||
fun updateCategory(categoryId: Int, name: String?, isLanding: Boolean?) {
|
||||
transaction {
|
||||
CategoryTable.update({ CategoryTable.id eq categoryId }) {
|
||||
if (name != null) it[CategoryTable.name] = name
|
||||
if (isLanding != null) it[CategoryTable.isLanding] = isLanding
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Move the category from position `from` to `to`
|
||||
@@ -74,3 +75,4 @@ fun getCategoryList(): List<CategoryDataClass> {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import org.jetbrains.exposed.sql.select
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
import org.jetbrains.exposed.sql.update
|
||||
|
||||
object CategoryManga {
|
||||
fun addMangaToCategory(mangaId: Int, categoryId: Int) {
|
||||
transaction {
|
||||
if (CategoryMangaTable.select { (CategoryMangaTable.category eq categoryId) and (CategoryMangaTable.manga eq mangaId) }.firstOrNull() == null) {
|
||||
@@ -69,3 +70,4 @@ fun getMangaCategories(mangaId: Int): List<CategoryDataClass> {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,8 @@ 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.model.database.ChapterTable
|
||||
import ir.armor.tachidesk.model.database.MangaTable
|
||||
import ir.armor.tachidesk.model.database.PageTable
|
||||
@@ -21,7 +23,8 @@ import org.jetbrains.exposed.sql.selectAll
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
import org.jetbrains.exposed.sql.update
|
||||
|
||||
fun getChapterList(mangaId: Int): List<ChapterDataClass> {
|
||||
object Chapter {
|
||||
fun getChapterList(mangaId: Int): List<ChapterDataClass> {
|
||||
val mangaDetails = getManga(mangaId)
|
||||
val source = getHttpSource(mangaDetails.sourceId.toLong())
|
||||
|
||||
@@ -81,9 +84,9 @@ fun getChapterList(mangaId: Int): List<ChapterDataClass> {
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getChapter(chapterIndex: Int, mangaId: Int): ChapterDataClass {
|
||||
fun getChapter(chapterIndex: Int, mangaId: Int): ChapterDataClass {
|
||||
return transaction {
|
||||
val chapterEntry = ChapterTable.select {
|
||||
ChapterTable.chapterIndex eq chapterIndex and (ChapterTable.manga eq mangaId)
|
||||
@@ -138,4 +141,5 @@ fun getChapter(chapterIndex: Int, mangaId: Int): ChapterDataClass {
|
||||
|
||||
chapter
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.NetworkHelper
|
||||
import eu.kanade.tachiyomi.source.SourceFactory
|
||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||
import ir.armor.tachidesk.impl.ExtensionsList.extensionTableAsDataClass
|
||||
import ir.armor.tachidesk.model.database.ExtensionTable
|
||||
import ir.armor.tachidesk.model.database.SourceTable
|
||||
import ir.armor.tachidesk.impl.util.APKExtractor
|
||||
@@ -37,6 +38,7 @@ import java.net.URLClassLoader
|
||||
import java.nio.file.Files
|
||||
import java.nio.file.Path
|
||||
|
||||
object Extension {
|
||||
private val logger = KotlinLogging.logger {}
|
||||
|
||||
/**
|
||||
@@ -205,7 +207,7 @@ fun uninstallExtension(pkgName: String) {
|
||||
}
|
||||
|
||||
fun updateExtension(pkgName: String): Int {
|
||||
val targetExtension = ExtensionListData.updateMap.remove(pkgName)!!
|
||||
val targetExtension = ExtensionsList.updateMap.remove(pkgName)!!
|
||||
uninstallExtension(pkgName)
|
||||
transaction {
|
||||
ExtensionTable.update({ ExtensionTable.pkgName eq pkgName }) {
|
||||
@@ -239,3 +241,4 @@ fun getExtensionIcon(apkName: String): Pair<InputStream, String> {
|
||||
fun getExtensionIconUrl(apkName: String): String {
|
||||
return "/api/v1/extension/icon/$apkName"
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ package ir.armor.tachidesk.impl
|
||||
|
||||
import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi
|
||||
import eu.kanade.tachiyomi.extension.model.Extension
|
||||
import ir.armor.tachidesk.impl.Extension.getExtensionIconUrl
|
||||
import ir.armor.tachidesk.model.database.ExtensionTable
|
||||
import ir.armor.tachidesk.model.dataclass.ExtensionDataClass
|
||||
import kotlinx.coroutines.runBlocking
|
||||
@@ -21,21 +22,22 @@ import org.jetbrains.exposed.sql.transactions.transaction
|
||||
import org.jetbrains.exposed.sql.update
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
object ExtensionsList {
|
||||
private val logger = KotlinLogging.logger {}
|
||||
|
||||
object ExtensionListData {
|
||||
|
||||
var lastUpdateCheck: Long = 0
|
||||
var updateMap = ConcurrentHashMap<String, Extension.Available>()
|
||||
}
|
||||
|
||||
|
||||
// const val ExtensionUpdateDelayTime = 60 * 1000 // 60,000 milliseconds = 60 seconds
|
||||
const val ExtensionUpdateDelayTime = 0
|
||||
|
||||
fun getExtensionList(): List<ExtensionDataClass> {
|
||||
// update if {ExtensionUpdateDelayTime} seconds has passed or requested offline and database is empty
|
||||
if (ExtensionListData.lastUpdateCheck + ExtensionUpdateDelayTime < System.currentTimeMillis()) {
|
||||
if (lastUpdateCheck + ExtensionUpdateDelayTime < System.currentTimeMillis()) {
|
||||
logger.debug("Getting extensions list from the internet")
|
||||
ExtensionListData.lastUpdateCheck = System.currentTimeMillis()
|
||||
lastUpdateCheck = System.currentTimeMillis()
|
||||
runBlocking {
|
||||
val foundExtensions = ExtensionGithubApi.findExtensions()
|
||||
updateExtensionDatabase(foundExtensions)
|
||||
@@ -76,7 +78,7 @@ private fun updateExtensionDatabase(foundExtensions: List<Extension.Available>)
|
||||
ExtensionTable.update({ ExtensionTable.pkgName eq foundExtension.pkgName }) {
|
||||
it[hasUpdate] = true
|
||||
}
|
||||
ExtensionListData.updateMap.putIfAbsent(foundExtension.pkgName, foundExtension)
|
||||
updateMap.putIfAbsent(foundExtension.pkgName, foundExtension)
|
||||
} else if (foundExtension.versionCode < extensionRecord[ExtensionTable.versionCode]) {
|
||||
// some how the user installed an invalid version
|
||||
ExtensionTable.update({ ExtensionTable.pkgName eq foundExtension.pkgName }) {
|
||||
@@ -131,3 +133,4 @@ private fun updateExtensionDatabase(foundExtensions: List<Extension.Available>)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ 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 ir.armor.tachidesk.impl.Manga.getManga
|
||||
import ir.armor.tachidesk.model.database.CategoryMangaTable
|
||||
import ir.armor.tachidesk.model.database.MangaTable
|
||||
import ir.armor.tachidesk.model.database.toDataClass
|
||||
@@ -17,6 +18,7 @@ import org.jetbrains.exposed.sql.select
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
import org.jetbrains.exposed.sql.update
|
||||
|
||||
object Library {
|
||||
// TODO: `Category.isLanding` is to handle the default categories a new library manga gets,
|
||||
// ..implement that shit at some time...
|
||||
// ..also Consider to rename it to `isDefault`
|
||||
@@ -51,3 +53,4 @@ fun getLibraryMangas(): List<MangaDataClass> {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,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.model.database.MangaStatus
|
||||
import ir.armor.tachidesk.model.database.MangaTable
|
||||
import ir.armor.tachidesk.model.dataclass.MangaDataClass
|
||||
@@ -18,6 +21,7 @@ import org.jetbrains.exposed.sql.transactions.transaction
|
||||
import org.jetbrains.exposed.sql.update
|
||||
import java.io.InputStream
|
||||
|
||||
object Manga {
|
||||
fun getManga(mangaId: Int, proxyThumbnail: Boolean = true): MangaDataClass {
|
||||
var mangaEntry = transaction { MangaTable.select { MangaTable.id eq mangaId }.firstOrNull()!! }
|
||||
|
||||
@@ -106,3 +110,4 @@ fun getMangaThumbnail(mangaId: Int): Pair<InputStream, String> {
|
||||
).execute()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,6 +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.model.database.MangaStatus
|
||||
import ir.armor.tachidesk.model.database.MangaTable
|
||||
import ir.armor.tachidesk.model.dataclass.MangaDataClass
|
||||
@@ -16,6 +17,7 @@ import org.jetbrains.exposed.sql.insertAndGetId
|
||||
import org.jetbrains.exposed.sql.select
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
|
||||
object MangaList {
|
||||
fun proxyThumbnailUrl(mangaId: Int): String {
|
||||
return "/api/v1/manga/$mangaId/thumbnail"
|
||||
}
|
||||
@@ -96,3 +98,4 @@ fun MangasPage.processEntries(sourceId: Long): PagedMangaListDataClass {
|
||||
mangasPage.hasNextPage
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ 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.model.database.ChapterTable
|
||||
import ir.armor.tachidesk.model.database.MangaTable
|
||||
import ir.armor.tachidesk.model.database.PageTable
|
||||
@@ -21,6 +22,7 @@ import org.jetbrains.exposed.sql.update
|
||||
import java.io.File
|
||||
import java.io.InputStream
|
||||
|
||||
object Page{
|
||||
/**
|
||||
* A page might have a imageUrl ready from the get go, or we might need to
|
||||
* go an extra step and call fetchImageUrl to get it.
|
||||
@@ -88,3 +90,4 @@ fun getChapterDir(mangaId: Int, chapterId: Int): String {
|
||||
File(mangaDir).mkdirs()
|
||||
return mangaDir
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,11 @@ 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 ir.armor.tachidesk.impl.MangaList.processEntries
|
||||
import ir.armor.tachidesk.impl.Source.getHttpSource
|
||||
import ir.armor.tachidesk.model.dataclass.PagedMangaListDataClass
|
||||
|
||||
object Search {
|
||||
// TODO
|
||||
fun sourceFilters(sourceId: Long) {
|
||||
val source = getHttpSource(sourceId)
|
||||
@@ -68,3 +71,4 @@ data class FilterWrapper(
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@ package ir.armor.tachidesk.impl
|
||||
|
||||
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.model.database.ExtensionTable
|
||||
import ir.armor.tachidesk.model.database.SourceTable
|
||||
import ir.armor.tachidesk.model.dataclass.SourceDataClass
|
||||
@@ -19,6 +21,7 @@ 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<Long, HttpSource>()
|
||||
@@ -82,3 +85,4 @@ fun getSource(sourceId: Long): SourceDataClass {
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@ package ir.armor.tachidesk.model.database
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import ir.armor.tachidesk.impl.MangaList.proxyThumbnailUrl
|
||||
import ir.armor.tachidesk.model.dataclass.MangaDataClass
|
||||
import ir.armor.tachidesk.impl.proxyThumbnailUrl
|
||||
import org.jetbrains.exposed.dao.id.IntIdTable
|
||||
import org.jetbrains.exposed.sql.ResultRow
|
||||
|
||||
|
||||
@@ -2,34 +2,34 @@ package ir.armor.tachidesk.server
|
||||
|
||||
import io.javalin.Javalin
|
||||
import ir.armor.tachidesk.Main
|
||||
import ir.armor.tachidesk.impl.addMangaToCategory
|
||||
import ir.armor.tachidesk.impl.addMangaToLibrary
|
||||
import ir.armor.tachidesk.impl.createCategory
|
||||
import ir.armor.tachidesk.impl.getCategoryList
|
||||
import ir.armor.tachidesk.impl.getCategoryMangaList
|
||||
import ir.armor.tachidesk.impl.getChapter
|
||||
import ir.armor.tachidesk.impl.getChapterList
|
||||
import ir.armor.tachidesk.impl.getExtensionIcon
|
||||
import ir.armor.tachidesk.impl.getExtensionList
|
||||
import ir.armor.tachidesk.impl.getLibraryMangas
|
||||
import ir.armor.tachidesk.impl.getManga
|
||||
import ir.armor.tachidesk.impl.getMangaCategories
|
||||
import ir.armor.tachidesk.impl.getMangaList
|
||||
import ir.armor.tachidesk.impl.getPageImage
|
||||
import ir.armor.tachidesk.impl.getSource
|
||||
import ir.armor.tachidesk.impl.getSourceList
|
||||
import ir.armor.tachidesk.impl.getMangaThumbnail
|
||||
import ir.armor.tachidesk.impl.installExtension
|
||||
import ir.armor.tachidesk.impl.removeCategory
|
||||
import ir.armor.tachidesk.impl.removeMangaFromCategory
|
||||
import ir.armor.tachidesk.impl.removeMangaFromLibrary
|
||||
import ir.armor.tachidesk.impl.reorderCategory
|
||||
import ir.armor.tachidesk.impl.sourceFilters
|
||||
import ir.armor.tachidesk.impl.sourceGlobalSearch
|
||||
import ir.armor.tachidesk.impl.sourceSearch
|
||||
import ir.armor.tachidesk.impl.uninstallExtension
|
||||
import ir.armor.tachidesk.impl.updateCategory
|
||||
import ir.armor.tachidesk.impl.updateExtension
|
||||
import ir.armor.tachidesk.impl.Category.createCategory
|
||||
import ir.armor.tachidesk.impl.Category.getCategoryList
|
||||
import ir.armor.tachidesk.impl.Category.removeCategory
|
||||
import ir.armor.tachidesk.impl.Category.reorderCategory
|
||||
import ir.armor.tachidesk.impl.Category.updateCategory
|
||||
import ir.armor.tachidesk.impl.CategoryManga.addMangaToCategory
|
||||
import ir.armor.tachidesk.impl.CategoryManga.getCategoryMangaList
|
||||
import ir.armor.tachidesk.impl.CategoryManga.getMangaCategories
|
||||
import ir.armor.tachidesk.impl.CategoryManga.removeMangaFromCategory
|
||||
import ir.armor.tachidesk.impl.Chapter.getChapter
|
||||
import ir.armor.tachidesk.impl.Chapter.getChapterList
|
||||
import ir.armor.tachidesk.impl.Extension.getExtensionIcon
|
||||
import ir.armor.tachidesk.impl.Extension.installExtension
|
||||
import ir.armor.tachidesk.impl.Extension.uninstallExtension
|
||||
import ir.armor.tachidesk.impl.Extension.updateExtension
|
||||
import ir.armor.tachidesk.impl.ExtensionsList.getExtensionList
|
||||
import ir.armor.tachidesk.impl.Library.addMangaToLibrary
|
||||
import ir.armor.tachidesk.impl.Library.getLibraryMangas
|
||||
import ir.armor.tachidesk.impl.Library.removeMangaFromLibrary
|
||||
import ir.armor.tachidesk.impl.Manga.getManga
|
||||
import ir.armor.tachidesk.impl.Manga.getMangaThumbnail
|
||||
import ir.armor.tachidesk.impl.MangaList.getMangaList
|
||||
import ir.armor.tachidesk.impl.Page.getPageImage
|
||||
import ir.armor.tachidesk.impl.Search.sourceFilters
|
||||
import ir.armor.tachidesk.impl.Search.sourceGlobalSearch
|
||||
import ir.armor.tachidesk.impl.Search.sourceSearch
|
||||
import ir.armor.tachidesk.impl.Source.getSource
|
||||
import ir.armor.tachidesk.impl.Source.getSourceList
|
||||
import ir.armor.tachidesk.server.util.openInBrowser
|
||||
import mu.KotlinLogging
|
||||
import java.io.IOException
|
||||
|
||||
Reference in New Issue
Block a user