simplify episode url extraction
This commit is contained in:
parent
188207eea0
commit
da825cd735
1 changed files with 18 additions and 40 deletions
|
@ -31,10 +31,8 @@ import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import java.util.regex.Pattern
|
|
||||||
|
|
||||||
private const val PAGE_SIZE = 20
|
private const val PAGE_SIZE = 20
|
||||||
private val MOVIE_ID_PATTERN = Pattern.compile("""data-movie-id=\\"(\d+)\\"""", Pattern.MULTILINE)
|
|
||||||
|
|
||||||
class NewGrounds : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
class NewGrounds : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
|
|
||||||
|
@ -260,14 +258,25 @@ class NewGrounds : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
override suspend fun getEpisodeList(anime: SAnime): List<SEpisode> {
|
override suspend fun getEpisodeList(anime: SAnime): List<SEpisode> {
|
||||||
val response = client.newCall(GET("${baseUrl}${anime.url}", headers)).execute()
|
val response = client.newCall(GET("${baseUrl}${anime.url}", headers)).execute()
|
||||||
val document = response.asJsoup()
|
val document = response.asJsoup()
|
||||||
val relatedSeriesUrl = document.selectFirst("div[id^=\"related_playlists\"] a:not([id^=\"related_playlists\"])")?.absUrl("href")
|
|
||||||
|
|
||||||
val episodes = if (relatedSeriesUrl != null) {
|
val relatedPlaylistUrl = document.selectFirst("div[id^=\"related_playlists\"] a:not([id^=\"related_playlists\"])")?.absUrl("href")
|
||||||
val response2 = client.newCall(GET(relatedSeriesUrl, headers)).execute()
|
val isPartOfSeries = relatedPlaylistUrl?.startsWith("$baseUrl/series") ?: false
|
||||||
|
|
||||||
|
val episodes = if (isPartOfSeries) {
|
||||||
|
val response2 = client.newCall(GET(relatedPlaylistUrl!!, headers)).execute()
|
||||||
val document2 = response2.asJsoup()
|
val document2 = response2.asJsoup()
|
||||||
parseEpisodeList(document2)
|
parseEpisodeList(document2)
|
||||||
} else {
|
} else {
|
||||||
parseSingleEpisode(document)
|
val dateString = document.selectFirst("#sidestats > dl:nth-of-type(2) > dd:first-of-type")?.text()
|
||||||
|
|
||||||
|
return listOf(
|
||||||
|
SEpisode.create().apply {
|
||||||
|
episode_number = 1f
|
||||||
|
date_upload = dateFormat.tryParse(dateString)
|
||||||
|
name = document.selectFirst("meta[name=\"title\"]")!!.attr("content")
|
||||||
|
setUrlWithoutDomain("$baseUrl${anime.url.replace("/view/","/video/")}")
|
||||||
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return episodes
|
return episodes
|
||||||
|
@ -277,31 +286,6 @@ class NewGrounds : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
|
|
||||||
override fun episodeListParse(response: Response): List<SEpisode> = throw UnsupportedOperationException()
|
override fun episodeListParse(response: Response): List<SEpisode> = throw UnsupportedOperationException()
|
||||||
|
|
||||||
private fun parseSingleEpisode(document: Document): List<SEpisode> {
|
|
||||||
val episodeIdScript = document.selectFirst("#ng-global-video-player script")
|
|
||||||
val episodeId = extractEpisodeIdFromScript(episodeIdScript)
|
|
||||||
val dateString = document.selectFirst("#sidestats > dl:nth-of-type(2) > dd:first-of-type")?.text()
|
|
||||||
|
|
||||||
return listOf(
|
|
||||||
SEpisode.create().apply {
|
|
||||||
episode_number = 1f
|
|
||||||
date_upload = dateFormat.tryParse(dateString)
|
|
||||||
name = document.selectFirst("meta[name=\"title\"]")!!.attr("content")
|
|
||||||
setUrlWithoutDomain("$baseUrl/portal/video/$episodeId")
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun extractEpisodeIdFromScript(element: Element?): String? {
|
|
||||||
val scriptContent = element!!.html().toString()
|
|
||||||
val matcher = MOVIE_ID_PATTERN.matcher(scriptContent)
|
|
||||||
return if (matcher.find()) {
|
|
||||||
matcher.group(1)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun parseEpisodeList(document: Document): List<SEpisode> {
|
private fun parseEpisodeList(document: Document): List<SEpisode> {
|
||||||
val ids = document.select("li.visual-link-container").map { it.attr("data-visual-link") }
|
val ids = document.select("li.visual-link-container").map { it.attr("data-visual-link") }
|
||||||
val formBody = FormBody.Builder()
|
val formBody = FormBody.Builder()
|
||||||
|
@ -314,11 +298,7 @@ class NewGrounds : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
val request = Request.Builder()
|
val request = Request.Builder()
|
||||||
.url("$baseUrl/visual-links-fetch")
|
.url("$baseUrl/visual-links-fetch")
|
||||||
.post(formBody)
|
.post(formBody)
|
||||||
.apply {
|
.headers(headers)
|
||||||
headers.forEach { (key, value) ->
|
|
||||||
addHeader(key, value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
|
@ -339,7 +319,7 @@ class NewGrounds : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
episode_number = index.toFloat()
|
episode_number = index.toFloat()
|
||||||
name = episodeData.getString("title")
|
name = episodeData.getString("title")
|
||||||
scanlator = uploaderData.getString("user_name")
|
scanlator = uploaderData.getString("user_name")
|
||||||
setUrlWithoutDomain(episodeData.getString("url"))
|
setUrlWithoutDomain("$baseUrl/portal/video/${episodeData.getString("id")}")
|
||||||
}
|
}
|
||||||
|
|
||||||
episodes.add(episode)
|
episodes.add(episode)
|
||||||
|
@ -534,9 +514,7 @@ class NewGrounds : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
|
|
||||||
if (!usernameCookie) {
|
if (!usernameCookie) {
|
||||||
handler.post {
|
handler.post {
|
||||||
context.let {
|
Toast.makeText(context, "Log in via WebView to include adult content", Toast.LENGTH_SHORT).show()
|
||||||
Toast.makeText(it, "Log in via WebView to include adult content", Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue