fix: retain Zoko opening and ending metadata through playback
This commit is contained in:
@@ -82,7 +82,8 @@ enum ZokoResolver {
|
||||
guard enrichTitle, let name = metadata.name else { return source }
|
||||
try Task.checkCancellation()
|
||||
return ResolvedSource(url: source.url, headers: source.headers, identity: source.identity,
|
||||
title: "\(name) · Episode \(episode) (sub)", subtitles: source.subtitles, requirements: source.requirements)
|
||||
title: "\(name) · Episode \(episode) (sub)", subtitles: source.subtitles,
|
||||
intervals: source.intervals, requirements: source.requirements, playbackLifetime: source.playbackLifetime)
|
||||
}
|
||||
|
||||
static func parse(page: String, mediaID: String, episode: Int) throws -> ResolvedSource {
|
||||
@@ -106,8 +107,37 @@ enum ZokoResolver {
|
||||
}
|
||||
struct Config: Decodable {
|
||||
struct Subtitle: Decodable { let src: String; let lang: String; let label: String; let `default`: Bool? }
|
||||
struct Timing: Decodable {
|
||||
let start: Double
|
||||
let end: Double
|
||||
enum CodingKeys: CodingKey { case start, end }
|
||||
init(from decoder: any Decoder) throws {
|
||||
let values = try decoder.container(keyedBy: CodingKeys.self)
|
||||
start = try values.decode(Double.self, forKey: .start)
|
||||
end = try values.decode(Double.self, forKey: .end)
|
||||
guard start.isFinite, end.isFinite, start >= 0, end > start else { throw ZokoError.malformed }
|
||||
}
|
||||
}
|
||||
struct Skip: Decodable {
|
||||
let intro: Timing?
|
||||
let outro: Timing?
|
||||
enum CodingKeys: CodingKey { case intro, outro }
|
||||
init(from decoder: any Decoder) throws {
|
||||
let values = try decoder.container(keyedBy: CodingKeys.self)
|
||||
intro = try? values.decode(Timing.self, forKey: .intro)
|
||||
outro = try? values.decode(Timing.self, forKey: .outro)
|
||||
}
|
||||
}
|
||||
let src: String
|
||||
let subtitles: [Subtitle]
|
||||
let skip: Skip?
|
||||
enum CodingKeys: CodingKey { case src, subtitles, skip }
|
||||
init(from decoder: any Decoder) throws {
|
||||
let values = try decoder.container(keyedBy: CodingKeys.self)
|
||||
src = try values.decode(String.self, forKey: .src)
|
||||
subtitles = try values.decode([Subtitle].self, forKey: .subtitles)
|
||||
skip = try? values.decode(Skip.self, forKey: .skip)
|
||||
}
|
||||
}
|
||||
let config: Config
|
||||
do { config = try JSONDecoder().decode(Config.self, from: decoded) }
|
||||
@@ -119,9 +149,16 @@ enum ZokoResolver {
|
||||
isDefault: row.default ?? false, headers: ["Referer": "https://zokoanime.video/"])
|
||||
}
|
||||
guard ResolvedSource.validSubtitles(subtitles) else { throw ZokoError.malformed }
|
||||
var intervals: [ProviderInterval] = []
|
||||
if let intro = config.skip?.intro {
|
||||
intervals.append(ProviderInterval(kind: .intro, start: intro.start, end: intro.end))
|
||||
}
|
||||
if let outro = config.skip?.outro {
|
||||
intervals.append(ProviderInterval(kind: .outro, start: outro.start, end: outro.end))
|
||||
}
|
||||
return ResolvedSource(url: config.src, headers: referer, identity: "anilist:\(mediaID):\(episode)",
|
||||
title: "AniList \(mediaID) · Episode \(episode) (sub)", subtitles: subtitles,
|
||||
requirements: .init(zoko: true))
|
||||
intervals: intervals, requirements: .init(zoko: true))
|
||||
}
|
||||
|
||||
struct Catalog: Decodable {
|
||||
|
||||
Reference in New Issue
Block a user