From 9ead615784ee87bd2933cfd704560477ec4e443c Mon Sep 17 00:00:00 2001 From: DokterKaj <54882101+DokterKaj@users.noreply.github.com> Date: Tue, 24 Dec 2024 19:50:16 +0800 Subject: [PATCH] Add DeviantArt (#6694) * Add DeviantArt * Slight cleanup * Use .absUrl(), remove not-null asserts * Use less volatile selectors * Use better selector for gallery name * Remove not-null assert on subFolderGallery * Remove autoVerify from manifest * Remove unnecessary RSS request, simplify query parsing * Fetch HQ image * Account for gallery:{username} and gallery:{username}/all * Reword search fallback message * Allow parseDate() to accept null --- src/all/deviantart/AndroidManifest.xml | 24 +++ src/all/deviantart/build.gradle | 8 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4310 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2172 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5545 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9416 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 14795 bytes .../extension/all/deviantart/DeviantArt.kt | 167 ++++++++++++++++++ .../all/deviantart/DeviantArtUrlActivity.kt | 37 ++++ 9 files changed, 236 insertions(+) create mode 100644 src/all/deviantart/AndroidManifest.xml create mode 100644 src/all/deviantart/build.gradle create mode 100644 src/all/deviantart/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/all/deviantart/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/all/deviantart/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/all/deviantart/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/all/deviantart/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/all/deviantart/src/eu/kanade/tachiyomi/extension/all/deviantart/DeviantArt.kt create mode 100644 src/all/deviantart/src/eu/kanade/tachiyomi/extension/all/deviantart/DeviantArtUrlActivity.kt diff --git a/src/all/deviantart/AndroidManifest.xml b/src/all/deviantart/AndroidManifest.xml new file mode 100644 index 000000000..7ceef95ab --- /dev/null +++ b/src/all/deviantart/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/all/deviantart/build.gradle b/src/all/deviantart/build.gradle new file mode 100644 index 000000000..2d28101d2 --- /dev/null +++ b/src/all/deviantart/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'DeviantArt' + extClass = '.DeviantArt' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/all/deviantart/res/mipmap-hdpi/ic_launcher.png b/src/all/deviantart/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..66c4fd94dfd877bd96d9a87efd3246f05f050e04 GIT binary patch literal 4310 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 Ef^zB^D*ylh literal 0 HcmV?d00001 diff --git a/src/all/deviantart/res/mipmap-mdpi/ic_launcher.png b/src/all/deviantart/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4baedaeca5359ea093b0852d625efb84ff53f00a GIT binary patch literal 2172 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 literal 0 HcmV?d00001 diff --git a/src/all/deviantart/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/deviantart/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..564beb16fb86bf8d1df0a1e465d28951b6b20d5e GIT binary patch literal 14795 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 literal 0 HcmV?d00001 diff --git a/src/all/deviantart/src/eu/kanade/tachiyomi/extension/all/deviantart/DeviantArt.kt b/src/all/deviantart/src/eu/kanade/tachiyomi/extension/all/deviantart/DeviantArt.kt new file mode 100644 index 000000000..b52a281da --- /dev/null +++ b/src/all/deviantart/src/eu/kanade/tachiyomi/extension/all/deviantart/DeviantArt.kt @@ -0,0 +1,167 @@ +package eu.kanade.tachiyomi.extension.all.deviantart + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.online.HttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.Jsoup +import org.jsoup.nodes.Document +import org.jsoup.parser.Parser +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale + +class DeviantArt : HttpSource() { + override val name = "DeviantArt" + override val baseUrl = "https://deviantart.com" + override val lang = "all" + override val supportsLatest = false + + private val backendBaseUrl = "https://backend.deviantart.com" + private fun backendBuilder() = backendBaseUrl.toHttpUrl().newBuilder() + + private val dateFormat by lazy { + SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH) + } + + private fun parseDate(dateStr: String?): Long { + return try { + dateFormat.parse(dateStr ?: "")!!.time + } catch (_: ParseException) { + 0L + } + } + + override fun popularMangaRequest(page: Int): Request { + throw UnsupportedOperationException(SEARCH_FORMAT_MSG) + } + + override fun popularMangaParse(response: Response): MangasPage { + throw UnsupportedOperationException(SEARCH_FORMAT_MSG) + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + require(query.startsWith("gallery:")) { SEARCH_FORMAT_MSG } + val querySegments = query.substringAfter(":").split("/") + val username = querySegments[0] + val folderId = querySegments.getOrElse(1) { "all" } + return GET("$baseUrl/$username/gallery/$folderId", headers) + } + + override fun searchMangaParse(response: Response): MangasPage { + val manga = mangaDetailsParse(response) + return MangasPage(listOf(manga), false) + } + + override fun latestUpdatesRequest(page: Int): Request { + throw UnsupportedOperationException() + } + + override fun latestUpdatesParse(response: Response): MangasPage { + throw UnsupportedOperationException() + } + + override fun mangaDetailsParse(response: Response): SManga { + val document = response.asJsoup() + val subFolderGallery = document.selectFirst("#sub-folder-gallery") + val manga = SManga.create().apply { + // If manga is sub-gallery then use sub-gallery name, else use gallery name + title = subFolderGallery?.selectFirst("._2vMZg + ._2vMZg")?.text()?.substringBeforeLast(" ") + ?: document.selectFirst(".ds-card-selected h2")!!.text() + author = document.title().substringBefore(" ") + description = subFolderGallery?.selectFirst(".legacy-journal")?.wholeText() + thumbnail_url = subFolderGallery?.selectFirst("img[property=contentUrl]")?.absUrl("src") + } + manga.setUrlWithoutDomain(response.request.url.toString()) + return manga + } + + override fun chapterListRequest(manga: SManga): Request { + val pathSegments = getMangaUrl(manga).toHttpUrl().pathSegments + val username = pathSegments[0] + val folderId = pathSegments[2] + + val query = if (folderId == "all") { + "gallery:$username" + } else { + "gallery:$username/$folderId" + } + + val url = backendBuilder() + .addPathSegment("rss.xml") + .addQueryParameter("q", query) + .build() + + return GET(url, headers) + } + + override fun chapterListParse(response: Response): List { + val document = response.asJsoupXml() + val chapterList = parseToChapterList(document).toMutableList() + var nextUrl = document.selectFirst("[rel=next]")?.absUrl("href") + + while (nextUrl != null) { + val newRequest = GET(nextUrl, headers) + val newResponse = client.newCall(newRequest).execute() + val newDocument = newResponse.asJsoupXml() + val newChapterList = parseToChapterList(newDocument) + chapterList.addAll(newChapterList) + + nextUrl = newDocument.selectFirst("[rel=next]")?.absUrl("href") + } + + return indexChapterList(chapterList.toList()) + } + + private fun parseToChapterList(document: Document): List { + val items = document.select("item") + return items.map { + val chapter = SChapter.create() + chapter.setUrlWithoutDomain(it.selectFirst("link")!!.text()) + chapter.apply { + name = it.selectFirst("title")!!.text() + date_upload = parseDate(it.selectFirst("pubDate")?.text()) + scanlator = it.selectFirst("media|credit")?.text() + } + } + } + + private fun indexChapterList(chapterList: List): List { + // DeviantArt allows users to arrange galleries arbitrarily so we will + // primitively index the list by checking the first and last dates + return if (chapterList.first().date_upload > chapterList.last().date_upload) { + chapterList.mapIndexed { i, chapter -> + chapter.apply { chapter_number = chapterList.size - i.toFloat() } + } + } else { + chapterList.mapIndexed { i, chapter -> + chapter.apply { chapter_number = i.toFloat() + 1 } + } + } + } + + override fun pageListParse(response: Response): List { + val document = response.asJsoup() + val imageUrl = document.selectFirst("img[fetchpriority=high]")?.absUrl("src") + return listOf(Page(0, imageUrl = imageUrl)) + } + + override fun imageUrlParse(response: Response): String { + throw UnsupportedOperationException() + } + + private fun Response.asJsoupXml(): Document { + return Jsoup.parse(body.string(), request.url.toString(), Parser.xmlParser()) + } + + companion object { + const val SEARCH_FORMAT_MSG = "Please enter a query in the format of gallery:{username} or gallery:{username}/{folderId}" + } +} diff --git a/src/all/deviantart/src/eu/kanade/tachiyomi/extension/all/deviantart/DeviantArtUrlActivity.kt b/src/all/deviantart/src/eu/kanade/tachiyomi/extension/all/deviantart/DeviantArtUrlActivity.kt new file mode 100644 index 000000000..9a4b0c625 --- /dev/null +++ b/src/all/deviantart/src/eu/kanade/tachiyomi/extension/all/deviantart/DeviantArtUrlActivity.kt @@ -0,0 +1,37 @@ +package eu.kanade.tachiyomi.extension.all.deviantart + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +class DeviantArtUrlActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + + if (pathSegments != null && pathSegments.size >= 3) { + val username = pathSegments[0] + val folderId = pathSegments[2] + + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", "gallery:$username/$folderId") + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e("DeviantArtUrlActivity", e.toString()) + } + } else { + Log.e("DeviantArtUrlActivity", "Could not parse URI from intent $intent") + } + + finish() + exitProcess(0) + } +}