forked from Ascoware/get-iplayer-automator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSTVMetadataExtractor.swift
86 lines (72 loc) · 3.55 KB
/
STVMetadataExtractor.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//
// STVMetadataExtractor.swift
// Get iPlayer Automator
//
// Created by Scott Kovatch on 3/3/21.
//
import Foundation
import Kanna
import SwiftyJSON
import CocoaLumberjackSwift
class STVMetadataExtractor {
static func getShowMetadata(html: String) -> [Programme] {
let longDateFormatter = ISO8601DateFormatter()
longDateFormatter.timeZone = TimeZone(secondsFromGMT:0)
let newProgram = Programme()
newProgram.tvNetwork = "STV"
// Find the "props" JSON dictionary. Then traverse the tree
if let htmlPage = try? HTML(html: html, encoding: .utf8) {
guard let propertiesElement = htmlPage.at_xpath("//script[@id='__NEXT_DATA__']") else {
DDLogError("**** No metadata found")
return []
}
if let propertiesContent = propertiesElement.content {
let propertiesJSON = JSON(parseJSON: propertiesContent)
let propsDict = propertiesJSON["props"].dictionaryValue
if let pageProps = propsDict["pageProps"] {
newProgram.pid = pageProps["episodeId"].stringValue
let episodesKey = "/episodes/\(newProgram.pid)"
if let showData = propsDict["initialReduxState"]?["playerApiCache"][episodesKey]["results"] {
let protectedMedia = showData["programme"]["drmEnabled"].boolValue
if protectedMedia {
return []
}
newProgram.seriesName = showData["programme"]["name"].stringValue
newProgram.episodeName = showData["title"].stringValue
let seriesString = showData["playerSeries"]["name"].stringValue
let seriesComponents = seriesString.components(separatedBy: .whitespacesAndNewlines)
for item in seriesComponents {
if let number = Int(item) {
newProgram.season = number
}
}
newProgram.episode = showData["number"].intValue
let startTime = showData["schedule"]["startTime"].stringValue
newProgram.lastBroadcast = longDateFormatter.date(from: startTime)
if let lastAirDate = newProgram.lastBroadcast {
newProgram.lastBroadcastString = DateFormatter.localizedString(from: lastAirDate, dateStyle: .medium, timeStyle: .none)
}
}
newProgram.url = pageProps["currentUrl"].stringValue
let rawDesc = pageProps["summary"].string ?? "None available"
newProgram.desc = rawDesc.filter { !$0.isNewline }
newProgram.thumbnailURLString = pageProps["image"].stringValue
}
}
}
// The series number should appear in the showName.
// STV provides us a "Series xx" string, so if that's available use it.
newProgram.showName = newProgram.seriesName
if newProgram.season != 0 {
newProgram.showName = "\(newProgram.seriesName): Series \(newProgram.season)"
}
if newProgram.episodeName.isEmpty {
if newProgram.episode != 0 {
newProgram.episodeName = "Episode \(newProgram.episode)"
} else {
newProgram.episodeName = newProgram.lastBroadcastString
}
}
return [newProgram]
}
}