forked from AlmightyHak/extensions-source
Kickassanime & Hianime: Fix subtitles (#937)
* Fix subtitles * Update PlaylistUtils.kt * Update MegaCloudExtractor.kt * Update AniPlay.kt * Update MegaCloudExtractor.kt * Fix regex * Fix subtitles for kickassanime * Update build.gradle * Update build.gradle * Update build.gradle.kts * Update build.gradle.kts * Update build.gradle * Update build.gradle
This commit is contained in:
parent
ac1938c1e4
commit
f57e2ea5af
4 changed files with 35 additions and 5 deletions
|
@ -132,6 +132,7 @@ class MegaCloudExtractor(
|
||||||
?.filter { it.kind == "captions" }
|
?.filter { it.kind == "captions" }
|
||||||
?.map { Track(it.file, it.label) }
|
?.map { Track(it.file, it.label) }
|
||||||
.orEmpty()
|
.orEmpty()
|
||||||
|
.let { playlistUtils.fixSubtitles(it) }
|
||||||
return playlistUtils.extractFromHls(
|
return playlistUtils.extractFromHls(
|
||||||
masterUrl,
|
masterUrl,
|
||||||
videoNameGen = { "$name - $it - $type" },
|
videoNameGen = { "$name - $it - $type" },
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package eu.kanade.tachiyomi.lib.playlistutils
|
package eu.kanade.tachiyomi.lib.playlistutils
|
||||||
|
|
||||||
|
import android.net.Uri
|
||||||
import eu.kanade.tachiyomi.animesource.model.Track
|
import eu.kanade.tachiyomi.animesource.model.Track
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
@ -8,6 +9,7 @@ import okhttp3.Headers
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.internal.commonEmptyHeaders
|
import okhttp3.internal.commonEmptyHeaders
|
||||||
|
import java.io.File
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
class PlaylistUtils(private val client: OkHttpClient, private val headers: Headers = commonEmptyHeaders) {
|
class PlaylistUtils(private val client: OkHttpClient, private val headers: Headers = commonEmptyHeaders) {
|
||||||
|
@ -342,7 +344,32 @@ class PlaylistUtils(private val client: OkHttpClient, private val headers: Heade
|
||||||
return "${result}p"
|
return "${result}p"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun cleanSubtitleData(matchResult: MatchResult): String {
|
||||||
|
val lineCount = matchResult.groupValues[1].count { it == '\n' }
|
||||||
|
return "\n" + " \n".repeat(lineCount - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun fixSubtitles(subtitleList: List<Track>): List<Track> {
|
||||||
|
return subtitleList.mapNotNull {
|
||||||
|
try {
|
||||||
|
val subData = client.newCall(GET(it.url)).execute().body.string()
|
||||||
|
|
||||||
|
val file = File.createTempFile("subs", "vtt")
|
||||||
|
.also(File::deleteOnExit)
|
||||||
|
|
||||||
|
file.writeText(FIX_SUBTITLE_REGEX.replace(subData, ::cleanSubtitleData))
|
||||||
|
val uri = Uri.fromFile(file)
|
||||||
|
|
||||||
|
Track(uri.toString(), it.lang)
|
||||||
|
} catch (_: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
private val FIX_SUBTITLE_REGEX = Regex("""${'$'}(\n{2,})(?!(?:\d+:)*\d+(?:\.\d+)?\s-+>\s(?:\d+:)*\d+(?:\.\d+)?)""", RegexOption.MULTILINE)
|
||||||
|
|
||||||
private const val PLAYLIST_SEPARATOR = "#EXT-X-STREAM-INF:"
|
private const val PLAYLIST_SEPARATOR = "#EXT-X-STREAM-INF:"
|
||||||
|
|
||||||
private val SUBTITLE_REGEX by lazy { Regex("""#EXT-X-MEDIA:TYPE=SUBTITLES.*?NAME="(.*?)".*?URI="(.*?)"""") }
|
private val SUBTITLE_REGEX by lazy { Regex("""#EXT-X-MEDIA:TYPE=SUBTITLES.*?NAME="(.*?)".*?URI="(.*?)"""") }
|
||||||
|
|
|
@ -291,7 +291,7 @@ class AniPlay : AniListAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
return playlistUtils.extractFromHls(
|
return playlistUtils.extractFromHls(
|
||||||
playlistUrl = url,
|
playlistUrl = url,
|
||||||
videoNameGen = { quality -> "$serverName - $quality - $typeName" },
|
videoNameGen = { quality -> "$serverName - $quality - $typeName" },
|
||||||
subtitleList = subtitles,
|
subtitleList = playlistUtils.fixSubtitles(subtitles),
|
||||||
masterHeadersGen = { baseHeaders: Headers, _: String ->
|
masterHeadersGen = { baseHeaders: Headers, _: String ->
|
||||||
baseHeaders.newBuilder().apply {
|
baseHeaders.newBuilder().apply {
|
||||||
set("Accept", "*/*")
|
set("Accept", "*/*")
|
||||||
|
|
|
@ -18,6 +18,8 @@ class KickAssAnimeExtractor(
|
||||||
private val json: Json,
|
private val json: Json,
|
||||||
private val headers: Headers,
|
private val headers: Headers,
|
||||||
) {
|
) {
|
||||||
|
private val playlistUtils by lazy { PlaylistUtils(client, headers) }
|
||||||
|
|
||||||
fun videosFromUrl(url: String, name: String): List<Video> {
|
fun videosFromUrl(url: String, name: String): List<Video> {
|
||||||
val host = url.toHttpUrl().host
|
val host = url.toHttpUrl().host
|
||||||
val mid = if (name == "DuckStream") "mid" else "id"
|
val mid = if (name == "DuckStream") "mid" else "id"
|
||||||
|
@ -77,7 +79,7 @@ class KickAssAnimeExtractor(
|
||||||
val language = "${it.name} (${it.language})"
|
val language = "${it.name} (${it.language})"
|
||||||
|
|
||||||
Track(subUrl, language)
|
Track(subUrl, language)
|
||||||
}
|
}.let { playlistUtils.fixSubtitles(it) }
|
||||||
|
|
||||||
fun getVideoHeaders(baseHeaders: Headers, referer: String, videoUrl: String): Headers {
|
fun getVideoHeaders(baseHeaders: Headers, referer: String, videoUrl: String): Headers {
|
||||||
return baseHeaders.newBuilder().apply {
|
return baseHeaders.newBuilder().apply {
|
||||||
|
@ -92,8 +94,8 @@ class KickAssAnimeExtractor(
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
videoObject.hls.isBlank() ->
|
videoObject.hls.isBlank() ->
|
||||||
PlaylistUtils(client, headers).extractFromDash(videoObject.playlistUrl, videoNameGen = { res -> "$name - $res" }, subtitleList = subtitles)
|
playlistUtils.extractFromDash(videoObject.playlistUrl, videoNameGen = { res -> "$name - $res" }, subtitleList = subtitles)
|
||||||
else -> PlaylistUtils(client, headers).extractFromHls(
|
else -> playlistUtils.extractFromHls(
|
||||||
videoObject.playlistUrl,
|
videoObject.playlistUrl,
|
||||||
videoNameGen = { "$name - $it" },
|
videoNameGen = { "$name - $it" },
|
||||||
videoHeadersGen = ::getVideoHeaders,
|
videoHeadersGen = ::getVideoHeaders,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue