Add okio deps & Create ScriptLineData

This commit is contained in:
2026-03-07 03:56:19 +09:00
parent b782b4659f
commit 58f7a22aef
5 changed files with 47 additions and 11 deletions

View File

@@ -38,6 +38,7 @@ kotlin {
implementation(libs.ktor.serialization.kotlinx.json) implementation(libs.ktor.serialization.kotlinx.json)
implementation(libs.ksoup) implementation(libs.ksoup)
implementation(libs.kotlinx.datetime) implementation(libs.kotlinx.datetime)
implementation(libs.okio)
} }
commonTest.dependencies { commonTest.dependencies {
implementation(libs.kotlin.test) implementation(libs.kotlin.test)

View File

@@ -1,6 +1,8 @@
package yenru0.yrkaier.nue.data package yenru0.yrkaier.nue.data
import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDate
import okio.Path
data class NovelInfo( data class NovelInfo(
val id: Int, val id: Int,
@@ -18,3 +20,13 @@ data class EpisodeInfo(
val title: String, val title: String,
val uploadDate: LocalDate val uploadDate: LocalDate
) )
sealed class ScriptLineData {
data class Html(
val html: String
) : ScriptLineData()
data class Image(
val path: String
) : ScriptLineData()
}

View File

@@ -184,11 +184,27 @@ class NpiaDownloader {
return episodeList return episodeList
} }
suspend fun downloadEpisode(novelId: Int, episodeId: Int) { suspend fun downloadEpisode(episodeId: Int): List<ScriptLineData> {
client.request("https://novelpia.com/novel/$novelId") { val res = client.request("https://novelpia.com/novel/viewer/$episodeId") {
header(HttpHeaders.Cookie, "LOGINKEY=$loginkey") header(HttpHeaders.Cookie, "LOGINKEY=$loginkey")
} }
if (!res.status.isSuccess()) {
throw Exception("Failed to fetch episode content: ${res.status}")
}
println(res.bodyAsText())
return listOf()
val document = Ksoup.parse(res.bodyAsText())
val draw = document.select("#novel_drawing").first()!!;
val lines: List<ScriptLineData> = draw.select(".line").map {
val imgsel = it.select("img")
if (imgsel.isNotEmpty()) {
val imageUrl = imgsel[0].attr("abs:src").ifEmpty { imgsel[0].attr("src") }
ScriptLineData.Image(imageUrl)
} else {
ScriptLineData.Html(it.html())
}
}
return lines
} }
} }

View File

@@ -4,12 +4,10 @@ import kotlinx.coroutines.runBlocking
import kotlin.test.Test import kotlin.test.Test
const email = "" const val email: String = ""
const passwd = "" const val passwd: String = ""
class NpiaTest { class NpiaTest {
@Test @Test
fun testGetSession() { fun testGetSession() {
if (email.isEmpty() || passwd.isEmpty()) { if (email.isEmpty() || passwd.isEmpty()) {
@@ -25,6 +23,7 @@ class NpiaTest {
println("Login failed") println("Login failed")
return@runBlocking return@runBlocking
} }
/*
val id = 396851 val id = 396851
val info = downloader.getNovelInfo(id) val info = downloader.getNovelInfo(id)
val eps = downloader.getAllEpisodeList(id) val eps = downloader.getAllEpisodeList(id)
@@ -38,9 +37,16 @@ class NpiaTest {
for (ep in eps) { for (ep in eps) {
println("epid: ${ep.episodeId}, title: ${ep.title}, date: ${ep.uploadDate}") println("epid: ${ep.episodeId}, title: ${ep.title}, date: ${ep.uploadDate}")
} }
*/
val scripts = downloader.downloadEpisode(5221545)
for (line in scripts) {
println(line)
}
downloader.logout() downloader.logout()
} }
} }
} }

View File

@@ -19,6 +19,7 @@ material3 = "1.10.0-alpha05"
ktor = "3.4.0" ktor = "3.4.0"
ksoup = "0.2.6" ksoup = "0.2.6"
junitJupiter = "5.14.0" junitJupiter = "5.14.0"
okio = "3.16.2"
[libraries] [libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
@@ -46,7 +47,7 @@ ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negoti
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
ksoup = { module = "com.fleeksoft.ksoup:ksoup", version.ref = "ksoup" } ksoup = { module = "com.fleeksoft.ksoup:ksoup", version.ref = "ksoup" }
junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junitJupiter" } junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junitJupiter" }
okio = { module = "com.squareup.okio:okio", version.ref = "okio" }
[plugins] [plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" } androidApplication = { id = "com.android.application", version.ref = "agp" }