diff --git a/Podfile b/Podfile index e8b9e9a..dad5a5f 100644 --- a/Podfile +++ b/Podfile @@ -12,7 +12,7 @@ abstract_target 'TVGemistAbstract' do #pod 'NPOKit', :path => '../NPOKit' #pod 'GHKit', :path => '../GHKit' - pod 'NPOKit', :git => 'https://github.com/4np/NPOKit.git', :tag => '0.0.4' + pod 'NPOKit', :git => 'https://github.com/4np/NPOKit.git', :tag => '0.0.5' pod 'GHKit', :git => 'https://github.com/4np/GHKit.git', :tag => '0.0.3' end diff --git a/Podfile.lock b/Podfile.lock index 606538e..b60f56c 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -2,13 +2,13 @@ PODS: - GHKit (0.0.3): - GHKit/Core (= 0.0.3) - GHKit/Core (0.0.3) - - NPOKit (0.0.4): - - NPOKit/Core (= 0.0.4) - - NPOKit/Core (0.0.4) + - NPOKit (0.0.5): + - NPOKit/Core (= 0.0.5) + - NPOKit/Core (0.0.5) - ObjcExceptionBridging (1.0.1): - ObjcExceptionBridging/ObjcExceptionBridging (= 1.0.1) - ObjcExceptionBridging/ObjcExceptionBridging (1.0.1) - - SwiftLint (0.24.2) + - SwiftLint (0.25.0) - XCGLogger (6.0.2): - XCGLogger/Core (= 6.0.2) - XCGLogger/Core (6.0.2): @@ -16,7 +16,7 @@ PODS: DEPENDENCIES: - GHKit (from `https://github.com/4np/GHKit.git`, tag `0.0.3`) - - NPOKit (from `https://github.com/4np/NPOKit.git`, tag `0.0.4`) + - NPOKit (from `https://github.com/4np/NPOKit.git`, tag `0.0.5`) - SwiftLint - XCGLogger @@ -26,7 +26,7 @@ EXTERNAL SOURCES: :tag: 0.0.3 NPOKit: :git: https://github.com/4np/NPOKit.git - :tag: 0.0.4 + :tag: 0.0.5 CHECKOUT OPTIONS: GHKit: @@ -34,15 +34,15 @@ CHECKOUT OPTIONS: :tag: 0.0.3 NPOKit: :git: https://github.com/4np/NPOKit.git - :tag: 0.0.4 + :tag: 0.0.5 SPEC CHECKSUMS: GHKit: 581d518e05fdae0a10ea296cb5ff2dd90649da17 - NPOKit: e70f55bbb2a90a00d5ec4565dbff6231cc74636f + NPOKit: 5fcd87bbc346744dab1f983dbb29d8e864bd6ab3 ObjcExceptionBridging: c30e00eb3700467e695faeea30e26e18bd445001 - SwiftLint: 2aa21b96c8d13396a051bc1cb659d2ce1e0075b0 + SwiftLint: e14651157288e9e01d6e1a71db7014fb5744a8ea XCGLogger: c9601cae9a8912de34a58666ba931ed3d624dd31 -PODFILE CHECKSUM: 971bdfe6ef77afbd24d4df90271c8ca03668572f +PODFILE CHECKSUM: 1c79bab751b67c05e3337132eb9e277be5f190a1 COCOAPODS: 1.4.0 diff --git a/Pods/Local Podspecs/NPOKit.podspec.json b/Pods/Local Podspecs/NPOKit.podspec.json index fee1796..f05d6e3 100644 --- a/Pods/Local Podspecs/NPOKit.podspec.json +++ b/Pods/Local Podspecs/NPOKit.podspec.json @@ -1,6 +1,6 @@ { "name": "NPOKit", - "version": "0.0.4", + "version": "0.0.5", "summary": "NPOKit framework for interfacing with the Dutch Public Broadcaster", "homepage": "https://github.com/4np/NPOKit", "license": { @@ -22,7 +22,7 @@ }, "source": { "git": "https://github.com/4np/NPOKit.git", - "tag": "0.0.4" + "tag": "0.0.5" }, "default_subspecs": "Core", "subspecs": [ diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 606538e..b60f56c 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -2,13 +2,13 @@ PODS: - GHKit (0.0.3): - GHKit/Core (= 0.0.3) - GHKit/Core (0.0.3) - - NPOKit (0.0.4): - - NPOKit/Core (= 0.0.4) - - NPOKit/Core (0.0.4) + - NPOKit (0.0.5): + - NPOKit/Core (= 0.0.5) + - NPOKit/Core (0.0.5) - ObjcExceptionBridging (1.0.1): - ObjcExceptionBridging/ObjcExceptionBridging (= 1.0.1) - ObjcExceptionBridging/ObjcExceptionBridging (1.0.1) - - SwiftLint (0.24.2) + - SwiftLint (0.25.0) - XCGLogger (6.0.2): - XCGLogger/Core (= 6.0.2) - XCGLogger/Core (6.0.2): @@ -16,7 +16,7 @@ PODS: DEPENDENCIES: - GHKit (from `https://github.com/4np/GHKit.git`, tag `0.0.3`) - - NPOKit (from `https://github.com/4np/NPOKit.git`, tag `0.0.4`) + - NPOKit (from `https://github.com/4np/NPOKit.git`, tag `0.0.5`) - SwiftLint - XCGLogger @@ -26,7 +26,7 @@ EXTERNAL SOURCES: :tag: 0.0.3 NPOKit: :git: https://github.com/4np/NPOKit.git - :tag: 0.0.4 + :tag: 0.0.5 CHECKOUT OPTIONS: GHKit: @@ -34,15 +34,15 @@ CHECKOUT OPTIONS: :tag: 0.0.3 NPOKit: :git: https://github.com/4np/NPOKit.git - :tag: 0.0.4 + :tag: 0.0.5 SPEC CHECKSUMS: GHKit: 581d518e05fdae0a10ea296cb5ff2dd90649da17 - NPOKit: e70f55bbb2a90a00d5ec4565dbff6231cc74636f + NPOKit: 5fcd87bbc346744dab1f983dbb29d8e864bd6ab3 ObjcExceptionBridging: c30e00eb3700467e695faeea30e26e18bd445001 - SwiftLint: 2aa21b96c8d13396a051bc1cb659d2ce1e0075b0 + SwiftLint: e14651157288e9e01d6e1a71db7014fb5744a8ea XCGLogger: c9601cae9a8912de34a58666ba931ed3d624dd31 -PODFILE CHECKSUM: 971bdfe6ef77afbd24d4df90271c8ca03668572f +PODFILE CHECKSUM: 1c79bab751b67c05e3337132eb9e277be5f190a1 COCOAPODS: 1.4.0 diff --git a/Pods/NPOKit/README.md b/Pods/NPOKit/README.md index 6c6e980..a7ea80d 100644 --- a/Pods/NPOKit/README.md +++ b/Pods/NPOKit/README.md @@ -2,7 +2,7 @@ [![Build Status](https://travis-ci.org/4np/NPOKit.svg?branch=master)](https://travis-ci.org/4np/NPOKit) [![Release](https://img.shields.io/github/release/4np/NPOKit.svg)](https://github.com/4np/NPOKit/releases/latest) -[![Commits Since](https://img.shields.io/github/commits-since/4np/NPOKit/0.0.4.svg?maxAge=3600)](https://github.com/4np/NPOKit/commits/master) +[![Commits Since](https://img.shields.io/github/commits-since/4np/NPOKit/0.0.5.svg?maxAge=3600)](https://github.com/4np/NPOKit/commits/master) [![Platform](https://img.shields.io/badge/platform-tvOS%2011-green.svg?maxAge=3600)](https://developer.apple.com/tvos/) [![Swift](https://img.shields.io/badge/language-Swift-ed523f.svg?maxAge=3600)](https://swift.org) [![codebeat badge](https://codebeat.co/badges/6fb36ab9-1143-4a7d-92e3-59fced359a99)](https://codebeat.co/projects/github-com-4np-npokit-master) @@ -46,8 +46,8 @@ As `NPOKit` is a true Swift application and supports the `Swift Package Manager` Below you'll find some sample code on how to implement some paginated fetching of programs. Unfortunately the API currently does not support sorting in alphabetical order, so the result will be based by the sort order the NPO returns (which is by most used). ```swift -func getProgramPaginator(successHandler: @escaping Paginator.SuccessHandler, - failureHandler: Paginator.FailureHandler? = nil) -> Paginator +func getProgramPaginator(completionHandler: (Result<(paginator: Paginator, items: [Program])>) -> Void) -> Paginator +func getProgramPaginator(using programFilters: [ProgramFilter]?, completionHandler: (Result<(paginator: Paginator, items: [Program])>) -> Void) -> Paginator ``` #### Example: @@ -110,7 +110,7 @@ extension ProgramsViewController: UIScrollViewDelegate { Fetching episodes works very much like fetching programs (see above), it just requires a `program` argument when setting up the paginator: ```swift -func getEpisodePaginator(for item: Item, completionHandler: @escaping (Result<(paginator: Paginator, items: [Episode])>) -> Void) -> Paginator +func getEpisodePaginator(for item: Item, completionHandler: (Result<(paginator: Paginator, items: [Episode])>) -> Void) -> Paginator ``` ### Fetching images @@ -118,8 +118,35 @@ func getEpisodePaginator(for item: Item, completionHandler: @escaping (Result<(p `Item` bases resources (like `Program` and `Episode`) may provide images for different usages. The most common way you would use those images on `tvOS` are for populating collection view cells, or by showing a header: ```swift -func fetchHeaderImage(for item: Item, completionHandler: @escaping (Result<(UXImage, URLSessionDataTask)>) -> Void) -> URLSessionDataTask? -func fetchCollectionImage(for item: Item, completionHandler: @escaping (Result<(UXImage, URLSessionDataTask)>) -> Void) -> URLSessionDataTask? +func fetchOriginalImage(for item: ImageFetchable, completionHandler: (Result<(UXImage, URLSessionDataTask)>) -> Void) -> URLSessionDataTask? +func fetchHeaderImage(for item: Item, completionHandler: (Result<(UXImage, URLSessionDataTask)>) -> Void) -> URLSessionDataTask? +func fetchCollectionImage(for item: Item, completionHandler: (Result<(UXImage, URLSessionDataTask)>) -> Void) -> URLSessionDataTask? +``` + +### Fetching (srt) subtitles + +Fetching the (Dutch) SRT subtitle contents for an episode: + +``` +public func fetchSubtitleContents(for episode: Episode, completionHandler: @escaping (Result) -> Void) +``` + +Alternatively it is possiblr to fetch parsed subtitles: + +``` +public func fetchSubtitle(for item: Item, completionHandler: @escaping (Result<[SubtitleLine]>) -> Void) +``` + +Where `SubtitleLine` is a `tuple`: + +``` +public typealias SubtitleLine = (number: Int, from: TimeInterval, to: TimeInterval, text: String) +``` + +### Fetching live (and themed) broadcasts + +``` +public func fetchLiveBroadcasts(completionHandler: @escaping (Result<[LiveBroadcast]>) -> Void) ``` ## Logging @@ -201,24 +228,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } ``` -# Working on `NPOKit` - -In order to work on `NPOKit` in `Xcode`, you need to generate an Xcode project. Run the following command in the project root: - -```bash -swift package generate-xcodeproj -``` - -Before sending a pull request, make sure you used the same coding style and that you lint your code using the most recent [SwiftLint](https://github.com/realm/SwiftLint) release: - -```bash -$ swiftlint -... -Done linting! Found 0 violations, 0 serious in 34 files. -``` - -_Note: the Xcode project will not be comitted to git._ - # License See the accompanying [LICENSE](LICENSE) and [NOTICE](NOTICE) files for more information. diff --git a/Pods/NPOKit/Sources/NPOKit/Miscelaneous/NPOError.swift b/Pods/NPOKit/Sources/NPOKit/Miscelaneous/NPOError.swift index 2a31676..aa1dbde 100644 --- a/Pods/NPOKit/Sources/NPOKit/Miscelaneous/NPOError.swift +++ b/Pods/NPOKit/Sources/NPOKit/Miscelaneous/NPOError.swift @@ -14,6 +14,7 @@ public enum NPOError: Error { case missingImage case missingIdentifier case imageNotAvailable + case subtitleNotAvailable } extension NPOError: LocalizedError { @@ -31,6 +32,8 @@ extension NPOError: LocalizedError { return "Missing identifier" case .imageNotAvailable: return "Image not available" + case .subtitleNotAvailable: + return "Subtitle not available" } } } diff --git a/Pods/NPOKit/Sources/NPOKit/Model/Item Media/Media.swift b/Pods/NPOKit/Sources/NPOKit/Model/Item Media/Media.swift new file mode 100644 index 0000000..cf62b69 --- /dev/null +++ b/Pods/NPOKit/Sources/NPOKit/Model/Item Media/Media.swift @@ -0,0 +1,18 @@ +// +// Media.swift +// NPOKitPackageDescription +// +// Created by Jeroen Wesbeek on 11/02/2018. +// + +import Foundation + +public struct Media: Codable { + var images: ImageContainer + public private(set) var subtitles: [Subtitle] + + enum CodingKeys: String, CodingKey { + case images + case subtitles + } +} diff --git a/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveEPG.swift b/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveBroadcast.swift similarity index 81% rename from Pods/NPOKit/Sources/NPOKit/Model/Live/LiveEPG.swift rename to Pods/NPOKit/Sources/NPOKit/Model/Live/LiveBroadcast.swift index a2b77bd..9a15627 100644 --- a/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveEPG.swift +++ b/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveBroadcast.swift @@ -1,5 +1,5 @@ // -// LiveEPG.swift +// LiveBroadcast.swift // NPOKitPackageDescription // // Created by Jeroen Wesbeek on 09/02/2018. @@ -7,7 +7,7 @@ import Foundation -public struct LiveEPG: Codable { +public struct LiveBroadcast: Codable { public private(set) var schedules: [LiveSchedule] public private(set) var channel: LiveChannel @@ -17,7 +17,7 @@ public struct LiveEPG: Codable { } } -extension LiveEPG { +extension LiveBroadcast { public var currentSchedule: LiveSchedule? { let now = Date() return schedules.first(where: { $0.starts <= now && $0.ends > now }) @@ -34,8 +34,8 @@ extension LiveEPG { } } -extension LiveEPG: Equatable { } +extension LiveBroadcast: Equatable { } -public func == (lhs: LiveEPG, rhs: LiveEPG) -> Bool { +public func == (lhs: LiveBroadcast, rhs: LiveBroadcast) -> Bool { return lhs.channel == rhs.channel } diff --git a/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveComponent.swift b/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveComponent.swift index 20d8c42..36a2568 100644 --- a/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveComponent.swift +++ b/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveComponent.swift @@ -20,10 +20,10 @@ public struct LiveComponent: Codable { var subType: String var isPlaceholder: Bool - var epgSingular: LiveEPG? - var epgPlural: [LiveEPG]? + var epgSingular: LiveBroadcast? + var epgPlural: [LiveBroadcast]? - public var epg: [LiveEPG]? { + public var broadcasts: [LiveBroadcast]? { if let epg = epgSingular { return [epg] } else if let epg = epgPlural { diff --git a/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveStream.swift b/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveStream.swift index d77093e..809a89d 100644 --- a/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveStream.swift +++ b/Pods/NPOKit/Sources/NPOKit/Model/Live/LiveStream.swift @@ -9,7 +9,7 @@ import Foundation public struct LiveStream: Codable, ImageFetchable { var id: String - var title: String + public private(set) var title: String public private(set) var images: ImageContainer var quality: [QualityOption]? diff --git a/Pods/NPOKit/Sources/NPOKit/Model/Subtitles/Subtitle.swift b/Pods/NPOKit/Sources/NPOKit/Model/Subtitles/Subtitle.swift new file mode 100644 index 0000000..6ee83d4 --- /dev/null +++ b/Pods/NPOKit/Sources/NPOKit/Model/Subtitles/Subtitle.swift @@ -0,0 +1,36 @@ +// +// Subtitle.swift +// NPOKitPackageDescription +// +// Created by Jeroen Wesbeek on 11/02/2018. +// + +import Foundation + +public enum SubtitleType: String, Codable { + case srt + case vtt + case ebu + case unknown +} + +public struct Subtitle: Codable { + public private(set) var label: String + public private(set) var language: String + var url: URL + public private(set) var isDefault: Bool + public var type: SubtitleType { + guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else { return .unknown } + let elements = components.path.components(separatedBy: "/") + let fileName = elements.last + guard let fileExtension = fileName?.components(separatedBy: ".").last else { return .unknown } + return SubtitleType(rawValue: fileExtension) ?? .unknown + } + + enum CodingKeys: String, CodingKey { + case label + case language + case url = "src" + case isDefault = "default" + } +} diff --git a/Pods/NPOKit/Sources/NPOKit/NPOKit+LegacyStream.swift b/Pods/NPOKit/Sources/NPOKit/NPOKit+LegacyStream.swift index 8513f0c..057a0c7 100644 --- a/Pods/NPOKit/Sources/NPOKit/NPOKit+LegacyStream.swift +++ b/Pods/NPOKit/Sources/NPOKit/NPOKit+LegacyStream.swift @@ -30,7 +30,13 @@ public extension NPOKit { getToken { [weak self] (result) in switch result { case .success(let token): - self?.fetchModel(ofType: LegacyStream.self, forLegacyEndpoint: "/app.php/\(item.id!)?adaptive=yes&token=\(token.value)", postData: nil, completionHandler: completionHandler) + guard let id = item.id else { + let error = NPOError.missingIdentifier + completionHandler(.failure(error)) + return + } + + self?.fetchModel(ofType: LegacyStream.self, forLegacyEndpoint: "/app.php/\(id)?adaptive=yes&token=\(token.value)", postData: nil, completionHandler: completionHandler) case .failure(let error): completionHandler(.failure(error)) } diff --git a/Pods/NPOKit/Sources/NPOKit/NPOKit+Live.swift b/Pods/NPOKit/Sources/NPOKit/NPOKit+Live.swift index 2853040..57bee77 100644 --- a/Pods/NPOKit/Sources/NPOKit/NPOKit+Live.swift +++ b/Pods/NPOKit/Sources/NPOKit/NPOKit+Live.swift @@ -8,13 +8,17 @@ import Foundation public extension NPOKit { - public func fetchLiveChannels(completionHandler: @escaping (Result<[LiveComponent]>) -> Void) { + public func fetchLiveBroadcasts(completionHandler: @escaping (Result<[LiveBroadcast]>) -> Void) { fetchModel(ofType: LiveContainer.self, forEndpoint: "page/live", postData: nil) { (result) in switch result { case .success(let container): // we're really only interested in the now playing components let nowPlayingComponents = container.components.filter({ $0.type == .nowPlaying }) - completionHandler(.success(nowPlayingComponents)) + + // additionally, we're only interested in the live broadcasts + let broadcasts = nowPlayingComponents.flatMap({ $0.broadcasts }).flatMap({ $0 }) + + completionHandler(.success(broadcasts)) case .failure(let error): completionHandler(.failure(error)) } diff --git a/Pods/NPOKit/Sources/NPOKit/NPOKit+Subtitles.swift b/Pods/NPOKit/Sources/NPOKit/NPOKit+Subtitles.swift new file mode 100644 index 0000000..505a803 --- /dev/null +++ b/Pods/NPOKit/Sources/NPOKit/NPOKit+Subtitles.swift @@ -0,0 +1,110 @@ +// +// NPOKit+Subtitles.swift +// NPOKitPackageDescription +// +// Created by Jeroen Wesbeek on 11/02/2018. +// + +import Foundation + +public typealias SubtitleLine = (number: Int, from: TimeInterval, to: TimeInterval, text: String) + +public extension NPOKit { + + internal func fetchSubtitles(for item: Item, completionHandler: @escaping (Result<[Subtitle]>) -> Void) { + guard let id = item.id else { + let error = NPOError.missingIdentifier + completionHandler(.failure(error)) + return + } + + fetchModel(ofType: Media.self, forEndpoint: "media/\(id)", postData: nil) { (result) in + switch result { + case .success(let media): + completionHandler(.success(media.subtitles)) + case .failure(let error): + completionHandler(.failure(error)) + } + } + } + + public func fetchSubtitleContents(for item: Item, completionHandler: @escaping (Result) -> Void) { + fetchSubtitles(for: item) { (result) in + switch result { + case .success(let subtitles): + guard let url = subtitles.first(where: { $0.type == .srt })?.url else { + let error = NPOError.subtitleNotAvailable + completionHandler(.failure(error)) + return + } + + // read subtitle contents + do { + // about 50% of the subtitles fail using .utf8, + // using .macOSRoman which is more forgiving + let contents = try String(contentsOf: url, encoding: .macOSRoman) + completionHandler(.success(contents)) + } catch let error { + completionHandler(.failure(error)) + } + case .failure(let error): + completionHandler(.failure(error)) + } + } + } + + public func fetchSubtitle(for item: Item, completionHandler: @escaping (Result<[SubtitleLine]>) -> Void) { + fetchSubtitleContents(for: item) { (result) in + // parse srt / webvtt style subtitles + let pattern = "(\\d+)\\n([\\d:,.]+)\\s+-{2}\\>\\s+([\\d:,.]+)\\n([\\s\\S]*?(?=\\n{2,}|$))" + + guard case let .success(contents) = result, let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) else { + let error = NPOError.subtitleNotAvailable + completionHandler(.failure(error)) + return + } + + let matches = regex.matches(in: contents, range: NSRange(location: 0, length: contents.utf16.count)) + let lines = matches.map { (result) -> SubtitleLine? in + // 762\n01:03:07.007 --> 01:03:11.024\nOp 2doc.nl vindt u meer dan 1000 documentaires, interviews en tips. + guard + let index = self.integer(for: result, index: 1, contents: contents), + let from = self.timeInterval(for: result, index: 2, contents: contents), + let to = self.timeInterval(for: result, index: 3, contents: contents), + let text = self.string(for: result, index: 4, contents: contents) + else { return nil } + + return SubtitleLine(number: index, from: from, to: to, text: text) + } + + // remove optionals + let nonOptionalLines = lines.flatMap({ $0 }) + + completionHandler(.success(nonOptionalLines)) + } + } + + private func string(for result: NSTextCheckingResult, index: Int, contents: String) -> String? { + let range = result.range(at: index) + let start = String.UTF16Index(encodedOffset: range.location) + let end = String.UTF16Index(encodedOffset: range.location + range.length) + return String(contents.utf16[start.. Int? { + guard let value = self.string(for: result, index: index, contents: contents) else { return nil } + return Int(value) + } + + private func timeInterval(for result: NSTextCheckingResult, index: Int, contents: String) -> TimeInterval? { + guard + let elements = self.string(for: result, index: index, contents: contents)?.components(separatedBy: ":"), + elements.count == 3, + let hours = Double(elements[0]), + let minutes = Double(elements[1]), + let seconds = Double(elements[2].replacingOccurrences(of: ",", with: ".")) + else { return nil } + + return (hours * 3600.0 + minutes * 60.0 + seconds) + } +} diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index c553046..b5ec22b 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -3,104 +3,107 @@ archiveVersion = 1; classes = { }; - objectVersion = 48; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ - 005CA527C43087C3A5A3C8124790D0F9 /* LiveSchedule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E4CF494EEB3033949564788490289AF /* LiveSchedule.swift */; }; - 00DB73979F93F6CDBEFADD13BF329C0E /* FormatContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3594C9442CE647CB8EC193D86E629B15 /* FormatContainer.swift */; }; - 063CAFF47FF79696C38993BE55D0A323 /* FilterOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26F4F7457CF21AE6216E9F6DB7C318A7 /* FilterOption.swift */; }; - 06E51384AF4523B52BA5BB99A828F459 /* NPOError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B69186AC418B109EB378EBFA3C9279E6 /* NPOError.swift */; }; 0C54AC5F3FCCBE79348541775C3CBD8A /* ObjcExceptionBridging-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A410A0B22790AC528F70C072215925F0 /* ObjcExceptionBridging-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0E78D87BC0446B219832602F602DFC49 /* Pods-TVGemistAbstract-TVGemist-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F60AE8323D2E396B6F9DD6B9348FDD4 /* Pods-TVGemistAbstract-TVGemist-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 103C62E11BDEC2BFF1D3FE5BDD149F38 /* XCGLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 467FB7EE109833DEF10211F55BC37261 /* XCGLogger.swift */; }; - 11940047E2B7D448CF1977B04A0924FE /* Format.swift in Sources */ = {isa = PBXBuildFile; fileRef = A445EE336F73DD4D6FE3CB6199C2F12C /* Format.swift */; }; - 16A16E48797613B76D709E489037BF4A /* Paginator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14AF51C221D36BE9C5886C541DA0920A /* Paginator.swift */; }; - 17960C475E12CDE87914AAB40F6FA491 /* FilterLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = C785374F8AC314EFE851F01214EFD10C /* FilterLink.swift */; }; + 12D3E577C1DB70E49F3CDEB93E1DDF8E /* NPOKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77ACAC10FE8624C71300F640938CD7D6 /* NPOKit.swift */; }; + 13421C7130EC4B7E06F61FACA6545735 /* NPOKit+LegacyStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD7EF8F370112E7A8B320B0127A677A9 /* NPOKit+LegacyStream.swift */; }; + 17124DF5505796F4D140A172775DBB6D /* FairPlayStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9EDD0247328E890004E073878069ABC /* FairPlayStream.swift */; }; + 18657504794233A28E1E4D26FE25D3F7 /* FormatContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68DB81D0982FE8F2024A481467C9C100 /* FormatContainer.swift */; }; 1DD385D094FD4C85884F7955A7214C43 /* UserInfoFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DB19FDB4402C7373D604BC4B6C5CC2 /* UserInfoFilter.swift */; }; - 20AAA8247B06BF7418AF95308044721E /* NPOKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8839361DE1D17AE1BDA7AE96CE427C4 /* NPOKit.swift */; }; - 218C982A717039D212C9E126E789FA22 /* NPOKitLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D1A38382CC8F0780B9234840C8736C7 /* NPOKitLogger.swift */; }; + 216A4A74710B26B1D16469BCC2EA1F95 /* UXImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CAB59E6BBE489A1404E13699D24319 /* UXImage.swift */; }; 22A567EE5D6DE9F442F0A2CA9D55009D /* URL+XCGAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F13ED702B74504F5F642D976896E14 /* URL+XCGAdditions.swift */; }; - 24EE57016B6CFFA6801B4BE2D6116BA2 /* ProgramFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F387CA031B3AD7B629F2AC36D774A7F6 /* ProgramFilter.swift */; }; - 2586D6871177B0A632003CAD22EB3F82 /* LegacyStreamItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA8288D4978EEE60D2F8525821D582C /* LegacyStreamItem.swift */; }; - 2677873DC9C50D6F440BBC052BAFA084 /* ImageFetchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F4E2C6B7168660916BEBCEE04967E3 /* ImageFetchable.swift */; }; 277E85F94C9989ED897418DDC35C0AAD /* GHKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A462F146DF629E2F4F5C808C6DA12F00 /* GHKit-dummy.m */; }; + 27A16199619ECB542B86135687AE2EB6 /* NPOKitLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B985BFC7CF4AD568CE8B0EDB64AB379 /* NPOKitLogger.swift */; }; 2855879F3F4DD7C2C18861E54FA641D2 /* ConsoleDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A40B92AB2DBD0B332F51E4B15E86083 /* ConsoleDestination.swift */; }; - 2976211866BAD8DF8A05ABB22B7E7556 /* NPOKit+Live.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8D1C544E21F81AB63AF384A74B6016C /* NPOKit+Live.swift */; }; 2A666216C5394C9A9FDCAEF7E57A4DF3 /* GHRelease.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED362C36EA5A78DA827EE34037239B00 /* GHRelease.swift */; }; 2BCDC1E6A347BA1E9B6B9D0FA8CE0170 /* LogDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461972CF293641A9B4223C00DA216F44 /* LogDetails.swift */; }; 2BD09CCAB8B1574B2DBB7A64E405736B /* BaseDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEAD56F01FF3CE0D09D56B425ED6B99D /* BaseDestination.swift */; }; - 2BEA160235E2E6A79AB00091EE87240B /* LegacyStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC3AC0C167527004B9F9C1FD3581FDE /* LegacyStream.swift */; }; - 2F2CE53CA58A959519804DD8B48817A0 /* NPOKit+FairPlayStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1027DF5904917014F9B1F3B611122EEE /* NPOKit+FairPlayStream.swift */; }; + 2F6444613B5ED6BC304FE97E5E5A1398 /* NPOKit+Live.swift in Sources */ = {isa = PBXBuildFile; fileRef = C256A6DF8F6AFE52B9E60A581E3F6792 /* NPOKit+Live.swift */; }; 313C15894F67C8389F1DA80A58C34171 /* Pods-TVGemistAbstract-TVGemist-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F8EEB329322F9A2E0A366B3E314460FE /* Pods-TVGemistAbstract-TVGemist-dummy.m */; }; 31EBE0C8E01C26413CB9E5AF251FDFD2 /* .swift-version in Resources */ = {isa = PBXBuildFile; fileRef = 09BD62B5059BC1BBE1E4A0E05E50AC2F /* .swift-version */; }; 36660F03F35A597D3A304754828F9225 /* TagFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F613332628E9B1F5F0C705B73273254C /* TagFilter.swift */; }; + 37475A3FE56C8A40012DB8C428E050E3 /* Token.swift in Sources */ = {isa = PBXBuildFile; fileRef = D868548126C0A6C43A230691F825AC9E /* Token.swift */; }; 388B4D629A86400CE4E900BAE3AB8FD7 /* ObjcExceptionBridging.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FEBEA71CAFC116FF28F3F2CED5DD4E1 /* ObjcExceptionBridging.framework */; }; 38B221ABD09B9CA732239FFE37560AD7 /* UIViewController+Releases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E1CDB805CF05920C448BA15E09F2D3 /* UIViewController+Releases.swift */; }; - 3AD67A3E491089DF79F36F0F375EBD8F /* LiveContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97903708EE53D4F4D3D1E730851A209 /* LiveContainer.swift */; }; + 3A01D923E2CAFE7ED401065560A6BF95 /* Media.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A11AAC85843F7FD6F293F8F54751E7A /* Media.swift */; }; + 3AED2066AF85C30E5E0101D817C52751 /* JSONTransformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F9AB7C8EE2BD9A43074470B126EBE7C /* JSONTransformable.swift */; }; 3ED792B0A7ADD38095336D653C33AA66 /* ANSIColorLogFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C416E21217E0C95166C95D5EC86E7027 /* ANSIColorLogFormatter.swift */; }; - 473D5CCDC7E68F031F231F71FBFD2003 /* NPOKit+Programs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32FAE6F8B7FECA7E3FAD1B5CF8AF026D /* NPOKit+Programs.swift */; }; + 4575610F8D363E83536B8F9CB1329BF3 /* Subtitle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E5CB2A57B176A753DE769905AB14D6D /* Subtitle.swift */; }; 4CE603C068605588183EBAD1F3F9FEF9 /* TestDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71039F216267DF32D510E6DFB6B1DEC8 /* TestDestination.swift */; }; 4DFDACCF3FBED33DA74D14B856B9B30D /* DestinationProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAB1E03EBB0BF815441D9189B174DC9 /* DestinationProtocol.swift */; }; - 50C6A900F4F3235C8D63F80030FABD87 /* JSONTransformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA581126195C86D973BCD05A4CC91F6 /* JSONTransformable.swift */; }; - 58C2821A38B405BEB7731F40E1E8A58D /* NPOGenre.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61CC4B78E606D79AE10B67B79401ED99 /* NPOGenre.swift */; }; - 59923F0428786F94E41E3CA65D675FDC /* Component.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E511D67E6AF53FF55B4847EAC024C1E /* Component.swift */; }; + 5259223F60437C2502FD7FFFBC76DB4B /* ImageContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A92E4EBD5497790023162A2CB2E87342 /* ImageContainer.swift */; }; + 5A2081AF6F6A5D4F57DBEF2A6B6CD03E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2DCB7B3405EAE66872C4B27ADF66B79 /* Foundation.framework */; }; + 5A9BC95D80A0B219C638D03B6BE88F32 /* NPOKit+Generics.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4114072E4E65452087EF39397B554D7 /* NPOKit+Generics.swift */; }; 5C222257621147CFF37288CC42A2A06D /* FilterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B46A818D3C20B39B12AE6736A43A134 /* FilterProtocol.swift */; }; 5E632DDFA44C09C21110169843F23FBC /* ObjcExceptionBridging.h in Headers */ = {isa = PBXBuildFile; fileRef = 70ABDFB1783D5ED1B3EE1EE977961E90 /* ObjcExceptionBridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 66E9AFF771D71FC5B056CBF30AD2F423 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72EF45626EEED83350376E3B188AACE /* Channel.swift */; }; - 69BCA621005C3FF222DED31D52AF5419 /* Pageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 547906085FF1E56DDE9BC80969FC62FE /* Pageable.swift */; }; + 63EAF2D8CF2B5A37D22F1675FDE2CD19 /* LegacyPlaylist.swift in Sources */ = {isa = PBXBuildFile; fileRef = E522D71D8A80C61F1432CA8093AC9B61 /* LegacyPlaylist.swift */; }; + 64DFCF2FBFD18A17F84913367EEC03AE /* NPOKit+Programs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ADF983CA0B8030C087F5B4077FAD768 /* NPOKit+Programs.swift */; }; + 6833BF91A7A9457EF04FDF607A8B2398 /* PagedItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8DB95C88FD95857AC20DAD16595C45D /* PagedItems.swift */; }; + 69143E2D56FA8C88D61BE4A46D1E609B /* NPOError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C569B170CB93A021FCF2C504A1DF68D /* NPOError.swift */; }; 6D174735698E46AE7C22570B57308157 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2DCB7B3405EAE66872C4B27ADF66B79 /* Foundation.framework */; }; - 6DFA13B309660052803ADCE0EEDCBD34 /* NPOKit+LegacyStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90F6C39DC76A07D4D8D84847E4CFA4BE /* NPOKit+LegacyStream.swift */; }; - 7006FEA1A45A3C891FE41BE36A2192E8 /* NPOKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ABE0FA10EB32C2FDEB8129A0087ACECB /* NPOKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7030D562910BA36A960660F9B7395919 /* NPOKit+Images.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16F0AA9E75BC407760D8C7F505995A1B /* NPOKit+Images.swift */; }; 708EC3E3E50380B5ED5F9F530C9DF233 /* AutoRotatingFileDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF98DAE83D849286F4991C102810034 /* AutoRotatingFileDestination.swift */; }; - 7162A8D6440B8168507A0D23AF52C734 /* NPOKit+Images.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653CE03598B94A9315A725D3C8907A72 /* NPOKit+Images.swift */; }; + 7654205EAACFFA76A310AF471452BC23 /* Component.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5652451119FF652E22022F382FCCB6E8 /* Component.swift */; }; 78D55F8BC2CC40E697B6A5E6C222D261 /* XcodeColorsLogFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13DD1313C23E1786112509CDA8AC0E98 /* XcodeColorsLogFormatter.swift */; }; + 7A6C7A378E59607A96CEF167B8C51703 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2E6442F9D95B25FD6AC43310832293 /* Channel.swift */; }; + 7E0D29C6F0A4F0AB02A49A0D9F113593 /* NPOKit+FairPlayStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78BC46E7E4BCC33E90EBE3606A311BD5 /* NPOKit+FairPlayStream.swift */; }; 7E1323765611E0E586326028BA878F52 /* GHKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000253A353E919F24BE541127E1FB8D9 /* GHKit.swift */; }; - 7F44687EC6DB52FB58684754272B40DB /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = F37F811DE7C9E49A7A1AD219C85390A9 /* Result.swift */; }; + 7EE29383D57CD48B0D03477D0FE6AC36 /* NPOKit+Episodes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00EE6F27490377F4E0023960B6DBC1D3 /* NPOKit+Episodes.swift */; }; 7FC8213EF68CBDE987A14E6E366FFD32 /* FileNameFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E75D45BC3A1412AFFB64C90834267BB7 /* FileNameFilter.swift */; }; + 8356FE0D35DDD09487881FD5292909C6 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47E6953EBE2C8F867074E895A253FFE0 /* Filter.swift */; }; 847A45405A39B70D55DBF5B8AD406EA6 /* GHAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D39E4427E7CF5187FCCB42D97644A0E6 /* GHAuthor.swift */; }; 853F7CF1115C633EE0C6CD70CA88A180 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2DCB7B3405EAE66872C4B27ADF66B79 /* Foundation.framework */; }; - 87EEC90AA1E23ADD848BCEAA5615A98F /* String+Obfuscation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 577EB87CE5DEFD682AC464196876C279 /* String+Obfuscation.swift */; }; - 8BA7E084FD75B724D821EB8879A5368D /* Token.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7C4120390C30190BFCF28E5D05D86C1 /* Token.swift */; }; + 8DFE570442174B071C78A4DCA9EB02DD /* LiveComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74219EF73C834C9BC14A4050080D8277 /* LiveComponent.swift */; }; + 9110EF70066241F7FC782F16A577979F /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = D743609AD1EE27BF7BD4844633892263 /* Item.swift */; }; 9386750805EF33033054EF5116B1A32F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2DCB7B3405EAE66872C4B27ADF66B79 /* Foundation.framework */; }; + 95201848676253530ED078C27DAF393F /* ProgramFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED8B6F4CD1B9DBDDACA05CA16F214898 /* ProgramFilter.swift */; }; + 9672D41941005B73B56DE85B895B3424 /* ImageFetchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA8AE1F12A2E23200F9538B1F83887FC /* ImageFetchable.swift */; }; + 9801E6E40A32D979B20386912A8FED59 /* LegacyStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506C82E2581E4D21C5B2ABE1EABAEAE2 /* LegacyStream.swift */; }; 9CD37827B83D2C4FE7EB4D033F3B0F2D /* LogFormatterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A718A6FD135880ABFF9CCDA4B675E96 /* LogFormatterProtocol.swift */; }; - 9D1255CFF893915DA49B48396133A797 /* LiveComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1192A095D7135D02E519A205ACC8C2F /* LiveComponent.swift */; }; + 9D33B8AD40192370E93F8AAED9FC03B0 /* Pageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31C78B7C37D9A38870646A670996EBD1 /* Pageable.swift */; }; 9D497AECDE206E2E6D86362300C6B9C8 /* AppleSystemLogDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF3F19FB13FFCC921B1AE0BDAE9824 /* AppleSystemLogDestination.swift */; }; 9D7BA5BC5341793684EECB1FAE9CF52F /* ObjcExceptionBridging-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 81DCA7F9A564B577FD860A287FEC8DE8 /* ObjcExceptionBridging-dummy.m */; }; A10D59E6EEA7B28B4D5ECFF7AE844E4E /* DevFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B12771015BABC23C4643C8E75CA200E8 /* DevFilter.swift */; }; + A20A3FD547AAC9FB286B330693FADCAA /* LiveStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67857D49B56B7CC2127377342FC911CC /* LiveStream.swift */; }; A51835FF8670E6AD88CFE9865A19C1B3 /* GHError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5B1EDD8BACF5C9AA36B805975817DC /* GHError.swift */; }; + AB9ADB02BE48D75B5F300A6119AD1131 /* NPOKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D3AC0E09E88C3E300259830084FAF9D /* NPOKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ABAD096A04E2833D3C54545589BD49B8 /* NPOGenre.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD59039E7D513B291442C8B8F535510 /* NPOGenre.swift */; }; + AE2210E4BE44F1428F01D1C463351B69 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = A417DD1F7A9177E67E3AA67BC5963D69 /* Result.swift */; }; AEC93106FA64F5A57594BC9B4EA70DC6 /* BaseQueuedDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D58C2F4C3FB3370F8B8935E7EF3296C /* BaseQueuedDestination.swift */; }; B0821E96CBAC030265EDED6C5FF727D0 /* HelperFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D89248BDA8B55784FE071E7588D974A5 /* HelperFunctions.swift */; }; - B14E428281CBFCF943825D2B8B83588D /* FairPlayStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9904D6B1D78C7CCA7382D235DFFCE7 /* FairPlayStream.swift */; }; - B1CB73F28924E945A42BF3CF5EA72FAC /* LiveStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = B81BC0E4F42878B9A6E1B386BC128D12 /* LiveStream.swift */; }; B2C5017C474C5AF052196775FD1BD335 /* Base64LogFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA762AF9CBE15B24D90E42C4F34B226 /* Base64LogFormatter.swift */; }; - B536D8C46958FAACFD50F557CB4F1CBF /* NPOKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AEDEF18DBAD0912C8D47219B027FA980 /* NPOKit-dummy.m */; }; + B59D07D8E181D7C78E5C038FD2C48018 /* FilterOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74207E8A66CC5BDD6610B1BA1EDB605B /* FilterOption.swift */; }; B6B249561DF2998747E0E08B88744518 /* XCGLogger-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 94AFA058FB8F4193A68EAEA1BFA6FB58 /* XCGLogger-dummy.m */; }; - B914C1BFB9FCF8CFDC481D17F664AF2F /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6518B4E67F9DAC6670C9708DC9ACEA4 /* Filter.swift */; }; BB5C45A6BC472BF7AFF2982ED3816626 /* GHKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 434FD60B679554CBDDCC5A086C1F06FF /* GHKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BD79538DE83975ADDF3D7AB3C3A8D445 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2DCB7B3405EAE66872C4B27ADF66B79 /* Foundation.framework */; }; C3C73D7B4212417D33CAB50D2E19C898 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2DCB7B3405EAE66872C4B27ADF66B79 /* Foundation.framework */; }; + C3FF15F3EDA8D5E4E4694E0894D39E65 /* Paginator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28B34C565E184C31F7E2B1F14120F8C4 /* Paginator.swift */; }; + C4C6E025FFD600A4363C789A8E578CEB /* LiveChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183DDFAECB8630F96EA98716D7D1659F /* LiveChannel.swift */; }; C6867E5507E2F7FC8B37D6B1AE88DF28 /* PrePostFixLogFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F0450E75721141E36A6E10DE7140DD7 /* PrePostFixLogFormatter.swift */; }; + D04B0C659230A18A7386A947FD277469 /* Format.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9A16BE6B90D85DD991DB4E42493165 /* Format.swift */; }; D0A1A01C3755C6E45F1C8DAB0B71A741 /* ObjectiveCMarker.m in Sources */ = {isa = PBXBuildFile; fileRef = 50FE2C8C91AD89C7D235990F81DE8186 /* ObjectiveCMarker.m */; }; D15C456042C3AE802260E52FB2D69435 /* GHKit+Generics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A390FDC085B3026CE608302F615F3FF /* GHKit+Generics.swift */; }; - D3A0F6809275BD655211FA79388C5C74 /* UXImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35D5C2E3EDD90DCF735195AAAC8745ED /* UXImage.swift */; }; - D6FFD526EEBB878DB6F0D64A93FB4957 /* LiveEPG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81C15728E730CB1075EAC3D450C73014 /* LiveEPG.swift */; }; - D7EE049ADC645A2CD9F9ED936CFC46F0 /* GenreItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9954FE4C04E51488D4E7FDA346E9108B /* GenreItem.swift */; }; - DB8EAF1AB77EE5767AC8CF404A9D4E32 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 762350DB8A451770D5F541AC0EC41DD3 /* Item.swift */; }; + D4BC9E48F4AC568306C770DEEFB48729 /* FilterLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EF4CF176D917A1229FBED4290006389 /* FilterLink.swift */; }; + D7B1252A6165DEBCB19B3AB7DC597875 /* String+Obfuscation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D9EE43AD30810CDD1D85A01034E2177 /* String+Obfuscation.swift */; }; + D81FB3476D46983B19760290F9268D1A /* Data+JSONTransformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4F32CF5FE8302D32BA6E81F80039F9 /* Data+JSONTransformable.swift */; }; + DA1AB12D8689AAA52A4CA6419D952397 /* LegacyStreamItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B83C1FD6EE1B2A94B73F8BF25A72DDBF /* LegacyStreamItem.swift */; }; DCF6066A7382D5D23365BA1F306909C7 /* String+i18n.swift in Sources */ = {isa = PBXBuildFile; fileRef = 593DA4E791C912B67523908D5A5F0064 /* String+i18n.swift */; }; - E2D0906870CB7A293957B27BEFE7B0F3 /* NPOImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 776FA69EE3F7A98FD07054C86EF4D5E2 /* NPOImage.swift */; }; E3138BB5BF42D368A1521065F5C2B890 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 328009CFD01E690203E0DE5AB4C42E48 /* Result.swift */; }; E3D338B39540D88F62AAEED5E7A8CF6F /* DispatchQueue+XCGAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782A07A616B366621EE331A81392E157 /* DispatchQueue+XCGAdditions.swift */; }; - E5EFD8312AFA474D6C3707102E9D2749 /* NPOKit+Generics.swift in Sources */ = {isa = PBXBuildFile; fileRef = A02E2FC37C51D688A273F8E490F0F0D5 /* NPOKit+Generics.swift */; }; - E6363615F8C2C659BEACD6B88CC2747D /* Data+JSONTransformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C967A872F2098838B445B2A6C4A7EAF /* Data+JSONTransformable.swift */; }; - E758C17E9079320B1036E39FBAF7A642 /* LegacyPlaylist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3FB027348B73A82FCBC5686578CBA9 /* LegacyPlaylist.swift */; }; + E8A746B85AB508CB5071AE3D4329E3E0 /* LiveContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05F66EF0F52A7EB4B44D26BE7976CD5E /* LiveContainer.swift */; }; E92DD14A6BF0D659ABB786E7B15DAEEE /* FileDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388D319CE90993113B69D164CB030D90 /* FileDestination.swift */; }; - EAC6A390374F54968F3B3B2684ABF4BD /* PagedItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F250AB19AC5EC8D4766A5E7DD41695 /* PagedItems.swift */; }; - EBCE5B2BD872F60A7850B4514CAE31F7 /* LiveChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B1B0366E749140743D490AC21DE89C0 /* LiveChannel.swift */; }; - EF2C5CB8BD9C01803ACE5FDD62BA2EE4 /* QualityOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BE32B74FC7014D6ADEAF7FE759D008 /* QualityOption.swift */; }; - F3D27E2D3327F2EAC7F86EAC2B7A0D36 /* NPOKit+Episodes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCA2EB5E89C7F535BAE058A03889B22 /* NPOKit+Episodes.swift */; }; + E9C7EC8F1C35E76FCCAA62B00AE52A6A /* LiveBroadcast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DE98382AB5EFDF9C51DF51777B24E58 /* LiveBroadcast.swift */; }; + F2AAF50FD3F544DA78CB3F5BA6D08568 /* NPOKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 91AECF96A28F8C7B48AECF17FA6388D4 /* NPOKit-dummy.m */; }; + F3966B698511D72D510C44885E7BDA38 /* QualityOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2A9056037F2E065317450587251E867 /* QualityOption.swift */; }; + F4A6AAB4139BDB939BD5F03DF6D1AA74 /* GenreItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0D017EF20C1B438A40867BCD1105BA /* GenreItem.swift */; }; F5F5321C198D1602BA4A8FFACF90689D /* XCGLogger-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E95CF07E150D9E26213040223423C071 /* XCGLogger-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F6AE1695E771E407A67CD9D435188FF7 /* ImageContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78A62CCD3D6D646B5C3C27C884924C2A /* ImageContainer.swift */; }; + F842CA93E4BE66EDFFD162A14BD51EF4 /* NPOImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57D6373D824E6D7B2AD8895B550AD411 /* NPOImage.swift */; }; + FAB294D3B6B968C7F1171B1CBED66FF7 /* NPOKit+Subtitles.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE5A36A5025B34A024066354F5A18D12 /* NPOKit+Subtitles.swift */; }; + FB0CEB339B4A33B969C8D820FB8E0463 /* LiveSchedule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13F80AEDA271FB8DA269D5EF5AB9FB19 /* LiveSchedule.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -122,7 +125,7 @@ isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 293D84C621F54B8D17A497E8F1CA1A72; + remoteGlobalIDString = 82C99BDE5CC95E651CDE74549FBA3C5F; remoteInfo = NPOKit; }; D52A2A83E893CD50E6F80A22B2E6F493 /* PBXContainerItemProxy */ = { @@ -143,128 +146,139 @@ /* Begin PBXFileReference section */ 000253A353E919F24BE541127E1FB8D9 /* GHKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GHKit.swift; path = Sources/GHKit/GHKit.swift; sourceTree = ""; }; - 02F250AB19AC5EC8D4766A5E7DD41695 /* PagedItems.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PagedItems.swift; path = "Sources/NPOKit/Model/Paged Content/PagedItems.swift"; sourceTree = ""; }; - 059BB5DDE6E1E950B6CA91170ACE64B4 /* XCGLogger.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XCGLogger.framework; path = XCGLogger.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 09BD62B5059BC1BBE1E4A0E05E50AC2F /* .swift-version */ = {isa = PBXFileReference; includeInIndex = 1; path = ".swift-version"; sourceTree = ""; }; + 00EE6F27490377F4E0023960B6DBC1D3 /* NPOKit+Episodes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Episodes.swift"; path = "Sources/NPOKit/NPOKit+Episodes.swift"; sourceTree = ""; }; + 059BB5DDE6E1E950B6CA91170ACE64B4 /* XCGLogger.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XCGLogger.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05F66EF0F52A7EB4B44D26BE7976CD5E /* LiveContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveContainer.swift; path = Sources/NPOKit/Model/Live/LiveContainer.swift; sourceTree = ""; }; + 09BD62B5059BC1BBE1E4A0E05E50AC2F /* .swift-version */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = ".swift-version"; sourceTree = ""; }; + 0C9A16BE6B90D85DD991DB4E42493165 /* Format.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Format.swift; path = "Sources/NPOKit/Model/Images/Image Formats/Format.swift"; sourceTree = ""; }; 0F60AE8323D2E396B6F9DD6B9348FDD4 /* Pods-TVGemistAbstract-TVGemist-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TVGemistAbstract-TVGemist-umbrella.h"; sourceTree = ""; }; - 1027DF5904917014F9B1F3B611122EEE /* NPOKit+FairPlayStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+FairPlayStream.swift"; path = "Sources/NPOKit/NPOKit+FairPlayStream.swift"; sourceTree = ""; }; + 105870C2D1261D521E8C1D927A33B020 /* NPOKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NPOKit.xcconfig; sourceTree = ""; }; 13DD1313C23E1786112509CDA8AC0E98 /* XcodeColorsLogFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XcodeColorsLogFormatter.swift; path = Sources/XCGLogger/LogFormatters/XcodeColorsLogFormatter.swift; sourceTree = ""; }; - 14AF51C221D36BE9C5886C541DA0920A /* Paginator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Paginator.swift; path = Sources/NPOKit/Paginator/Paginator.swift; sourceTree = ""; }; + 13F80AEDA271FB8DA269D5EF5AB9FB19 /* LiveSchedule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveSchedule.swift; path = Sources/NPOKit/Model/Live/LiveSchedule.swift; sourceTree = ""; }; + 16F0AA9E75BC407760D8C7F505995A1B /* NPOKit+Images.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Images.swift"; path = "Sources/NPOKit/NPOKit+Images.swift"; sourceTree = ""; }; + 183DDFAECB8630F96EA98716D7D1659F /* LiveChannel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveChannel.swift; path = Sources/NPOKit/Model/Live/LiveChannel.swift; sourceTree = ""; }; 188CD674BBB2ECC28A863ABC87F29E2A /* Pods-TVGemistAbstract-TVGemist-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TVGemistAbstract-TVGemist-frameworks.sh"; sourceTree = ""; }; 1A718A6FD135880ABFF9CCDA4B675E96 /* LogFormatterProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LogFormatterProtocol.swift; path = Sources/XCGLogger/LogFormatters/LogFormatterProtocol.swift; sourceTree = ""; }; - 1B1B0366E749140743D490AC21DE89C0 /* LiveChannel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveChannel.swift; path = Sources/NPOKit/Model/Live/LiveChannel.swift; sourceTree = ""; }; - 26F4F7457CF21AE6216E9F6DB7C318A7 /* FilterOption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FilterOption.swift; path = Sources/NPOKit/Model/Filters/FilterOption.swift; sourceTree = ""; }; + 1D0D017EF20C1B438A40867BCD1105BA /* GenreItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenreItem.swift; path = Sources/NPOKit/Model/Genres/GenreItem.swift; sourceTree = ""; }; + 28B34C565E184C31F7E2B1F14120F8C4 /* Paginator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Paginator.swift; path = Sources/NPOKit/Paginator/Paginator.swift; sourceTree = ""; }; + 2A11AAC85843F7FD6F293F8F54751E7A /* Media.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Media.swift; path = "Sources/NPOKit/Model/Item Media/Media.swift"; sourceTree = ""; }; 2A390FDC085B3026CE608302F615F3FF /* GHKit+Generics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "GHKit+Generics.swift"; path = "Sources/GHKit/GHKit+Generics.swift"; sourceTree = ""; }; 2A5B1EDD8BACF5C9AA36B805975817DC /* GHError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GHError.swift; path = Sources/GHKit/Miscelaneous/GHError.swift; sourceTree = ""; }; - 2E4CF494EEB3033949564788490289AF /* LiveSchedule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveSchedule.swift; path = Sources/NPOKit/Model/Live/LiveSchedule.swift; sourceTree = ""; }; + 2C569B170CB93A021FCF2C504A1DF68D /* NPOError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOError.swift; path = Sources/NPOKit/Miscelaneous/NPOError.swift; sourceTree = ""; }; + 31C78B7C37D9A38870646A670996EBD1 /* Pageable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Pageable.swift; path = Sources/NPOKit/Paginator/Pageable.swift; sourceTree = ""; }; 328009CFD01E690203E0DE5AB4C42E48 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Sources/GHKit/Miscelaneous/Result.swift; sourceTree = ""; }; - 32FAE6F8B7FECA7E3FAD1B5CF8AF026D /* NPOKit+Programs.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Programs.swift"; path = "Sources/NPOKit/NPOKit+Programs.swift"; sourceTree = ""; }; - 354C70469181CAF521B7EF2F347BF4CD /* ObjcExceptionBridging.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = ObjcExceptionBridging.modulemap; sourceTree = ""; }; - 3594C9442CE647CB8EC193D86E629B15 /* FormatContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FormatContainer.swift; path = "Sources/NPOKit/Model/Images/Image Formats/FormatContainer.swift"; sourceTree = ""; }; - 35D5C2E3EDD90DCF735195AAAC8745ED /* UXImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UXImage.swift; path = "Sources/NPOKit/Cross Platform/UXImage.swift"; sourceTree = ""; }; + 354C70469181CAF521B7EF2F347BF4CD /* ObjcExceptionBridging.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = ObjcExceptionBridging.modulemap; sourceTree = ""; }; 388D319CE90993113B69D164CB030D90 /* FileDestination.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileDestination.swift; path = Sources/XCGLogger/Destinations/FileDestination.swift; sourceTree = ""; }; + 3C4F32CF5FE8302D32BA6E81F80039F9 /* Data+JSONTransformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+JSONTransformable.swift"; path = "Sources/NPOKit/Extensions/Data+JSONTransformable.swift"; sourceTree = ""; }; 3C5FDB0AFD7F47945BFFACF3478B5386 /* Pods-TVGemistAbstract-TVGemist-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TVGemistAbstract-TVGemist-acknowledgements.plist"; sourceTree = ""; }; - 3D4CDF59A1A3A53A399A434FC394E922 /* NPOKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = NPOKit.modulemap; sourceTree = ""; }; + 3D3AC0E09E88C3E300259830084FAF9D /* NPOKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NPOKit-umbrella.h"; sourceTree = ""; }; + 3EF4CF176D917A1229FBED4290006389 /* FilterLink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FilterLink.swift; path = Sources/NPOKit/Model/Filters/FilterLink.swift; sourceTree = ""; }; 42D00B371BAA5159C0880F6348840D4F /* Pods-TVGemistAbstract-TVGemist.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TVGemistAbstract-TVGemist.release.xcconfig"; sourceTree = ""; }; - 42F4E2C6B7168660916BEBCEE04967E3 /* ImageFetchable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFetchable.swift; path = Sources/NPOKit/Model/Images/ImageFetchable.swift; sourceTree = ""; }; 434FD60B679554CBDDCC5A086C1F06FF /* GHKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GHKit-umbrella.h"; sourceTree = ""; }; 461972CF293641A9B4223C00DA216F44 /* LogDetails.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LogDetails.swift; path = Sources/XCGLogger/Misc/LogDetails.swift; sourceTree = ""; }; 467FB7EE109833DEF10211F55BC37261 /* XCGLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XCGLogger.swift; path = Sources/XCGLogger/XCGLogger.swift; sourceTree = ""; }; + 47E6953EBE2C8F867074E895A253FFE0 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/NPOKit/Model/Filters/Filter.swift; sourceTree = ""; }; 4A40B92AB2DBD0B332F51E4B15E86083 /* ConsoleDestination.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConsoleDestination.swift; path = Sources/XCGLogger/Destinations/ConsoleDestination.swift; sourceTree = ""; }; 4B46A818D3C20B39B12AE6736A43A134 /* FilterProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FilterProtocol.swift; path = Sources/XCGLogger/Filters/FilterProtocol.swift; sourceTree = ""; }; + 4CD59039E7D513B291442C8B8F535510 /* NPOGenre.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOGenre.swift; path = Sources/NPOKit/Model/Genres/NPOGenre.swift; sourceTree = ""; }; 4EC2B3C2A40F646041325A47BD74D06C /* Pods-TVGemistAbstract-TVGemist-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TVGemistAbstract-TVGemist-acknowledgements.markdown"; sourceTree = ""; }; + 506C82E2581E4D21C5B2ABE1EABAEAE2 /* LegacyStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegacyStream.swift; path = "Sources/NPOKit/Model/Legacy Stream/LegacyStream.swift"; sourceTree = ""; }; 50E1CDB805CF05920C448BA15E09F2D3 /* UIViewController+Releases.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+Releases.swift"; path = "Sources/GHKit/Extensions/UIViewController+Releases.swift"; sourceTree = ""; }; 50FE2C8C91AD89C7D235990F81DE8186 /* ObjectiveCMarker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ObjectiveCMarker.m; path = Sources/ObjcExceptionBridging/ObjectiveCMarker.m; sourceTree = ""; }; 54712447618CE02FD438A32F2F1429A8 /* Pods-TVGemistAbstract-TVGemist-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TVGemistAbstract-TVGemist-resources.sh"; sourceTree = ""; }; - 547906085FF1E56DDE9BC80969FC62FE /* Pageable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Pageable.swift; path = Sources/NPOKit/Paginator/Pageable.swift; sourceTree = ""; }; - 577EB87CE5DEFD682AC464196876C279 /* String+Obfuscation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Obfuscation.swift"; path = "Sources/NPOKit/Extensions/String+Obfuscation.swift"; sourceTree = ""; }; + 5652451119FF652E22022F382FCCB6E8 /* Component.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Component.swift; path = Sources/NPOKit/Model/Components/Component.swift; sourceTree = ""; }; + 57D6373D824E6D7B2AD8895B550AD411 /* NPOImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOImage.swift; path = Sources/NPOKit/Model/Images/NPOImage.swift; sourceTree = ""; }; + 57F50C7D40629148BC781C44F296247E /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 593DA4E791C912B67523908D5A5F0064 /* String+i18n.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+i18n.swift"; path = "Sources/GHKit/Extensions/String+i18n.swift"; sourceTree = ""; }; 5BA762AF9CBE15B24D90E42C4F34B226 /* Base64LogFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Base64LogFormatter.swift; path = Sources/XCGLogger/LogFormatters/Base64LogFormatter.swift; sourceTree = ""; }; - 5C967A872F2098838B445B2A6C4A7EAF /* Data+JSONTransformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+JSONTransformable.swift"; path = "Sources/NPOKit/Extensions/Data+JSONTransformable.swift"; sourceTree = ""; }; - 61CC4B78E606D79AE10B67B79401ED99 /* NPOGenre.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOGenre.swift; path = Sources/NPOKit/Model/Genres/NPOGenre.swift; sourceTree = ""; }; - 653CE03598B94A9315A725D3C8907A72 /* NPOKit+Images.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Images.swift"; path = "Sources/NPOKit/NPOKit+Images.swift"; sourceTree = ""; }; + 5E5CB2A57B176A753DE769905AB14D6D /* Subtitle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Subtitle.swift; path = Sources/NPOKit/Model/Subtitles/Subtitle.swift; sourceTree = ""; }; + 67857D49B56B7CC2127377342FC911CC /* LiveStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveStream.swift; path = Sources/NPOKit/Model/Live/LiveStream.swift; sourceTree = ""; }; + 68DB81D0982FE8F2024A481467C9C100 /* FormatContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FormatContainer.swift; path = "Sources/NPOKit/Model/Images/Image Formats/FormatContainer.swift"; sourceTree = ""; }; 6B90E958AE15F396A56A159B50F1B49A /* XCGLogger.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = XCGLogger.xcconfig; sourceTree = ""; }; - 6D1A38382CC8F0780B9234840C8736C7 /* NPOKitLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOKitLogger.swift; path = Sources/NPOKit/Logging/NPOKitLogger.swift; sourceTree = ""; }; - 6D3FB027348B73A82FCBC5686578CBA9 /* LegacyPlaylist.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegacyPlaylist.swift; path = "Sources/NPOKit/Model/Legacy Stream/LegacyPlaylist.swift"; sourceTree = ""; }; - 6E511D67E6AF53FF55B4847EAC024C1E /* Component.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Component.swift; path = Sources/NPOKit/Model/Components/Component.swift; sourceTree = ""; }; 70ABDFB1783D5ED1B3EE1EE977961E90 /* ObjcExceptionBridging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ObjcExceptionBridging.h; path = Sources/ObjcExceptionBridging/include/ObjcExceptionBridging.h; sourceTree = ""; }; + 70AD52A2C2AE80A81A7F44EA1D1D011C /* NPOKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = NPOKit.modulemap; sourceTree = ""; }; 71039F216267DF32D510E6DFB6B1DEC8 /* TestDestination.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TestDestination.swift; path = Sources/XCGLogger/Destinations/TestDestination.swift; sourceTree = ""; }; 73A3208E2CA0CA145D345C9650BC32AA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7563F18D224DBA7FBB700D4888E07F30 /* GHKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = GHKit.modulemap; sourceTree = ""; }; - 762350DB8A451770D5F541AC0EC41DD3 /* Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Item.swift; path = Sources/NPOKit/Model/Items/Item.swift; sourceTree = ""; }; + 74207E8A66CC5BDD6610B1BA1EDB605B /* FilterOption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FilterOption.swift; path = Sources/NPOKit/Model/Filters/FilterOption.swift; sourceTree = ""; }; + 74219EF73C834C9BC14A4050080D8277 /* LiveComponent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveComponent.swift; path = Sources/NPOKit/Model/Live/LiveComponent.swift; sourceTree = ""; }; + 7563F18D224DBA7FBB700D4888E07F30 /* GHKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GHKit.modulemap; sourceTree = ""; }; 77023D887D8F5EA5649DF36F77024682 /* GHKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GHKit-prefix.pch"; sourceTree = ""; }; - 776FA69EE3F7A98FD07054C86EF4D5E2 /* NPOImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOImage.swift; path = Sources/NPOKit/Model/Images/NPOImage.swift; sourceTree = ""; }; + 77ACAC10FE8624C71300F640938CD7D6 /* NPOKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOKit.swift; path = Sources/NPOKit/NPOKit.swift; sourceTree = ""; }; 782A07A616B366621EE331A81392E157 /* DispatchQueue+XCGAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+XCGAdditions.swift"; path = "Sources/XCGLogger/Extensions/DispatchQueue+XCGAdditions.swift"; sourceTree = ""; }; - 78A62CCD3D6D646B5C3C27C884924C2A /* ImageContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageContainer.swift; path = Sources/NPOKit/Model/Images/ImageContainer.swift; sourceTree = ""; }; + 78BC46E7E4BCC33E90EBE3606A311BD5 /* NPOKit+FairPlayStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+FairPlayStream.swift"; path = "Sources/NPOKit/NPOKit+FairPlayStream.swift"; sourceTree = ""; }; 7ADF3F19FB13FFCC921B1AE0BDAE9824 /* AppleSystemLogDestination.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AppleSystemLogDestination.swift; path = Sources/XCGLogger/Destinations/AppleSystemLogDestination.swift; sourceTree = ""; }; 7D58C2F4C3FB3370F8B8935E7EF3296C /* BaseQueuedDestination.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BaseQueuedDestination.swift; path = Sources/XCGLogger/Destinations/BaseQueuedDestination.swift; sourceTree = ""; }; + 7D9EE43AD30810CDD1D85A01034E2177 /* String+Obfuscation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Obfuscation.swift"; path = "Sources/NPOKit/Extensions/String+Obfuscation.swift"; sourceTree = ""; }; 7FEBEA71CAFC116FF28F3F2CED5DD4E1 /* ObjcExceptionBridging.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ObjcExceptionBridging.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 81C15728E730CB1075EAC3D450C73014 /* LiveEPG.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveEPG.swift; path = Sources/NPOKit/Model/Live/LiveEPG.swift; sourceTree = ""; }; 81DCA7F9A564B577FD860A287FEC8DE8 /* ObjcExceptionBridging-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ObjcExceptionBridging-dummy.m"; sourceTree = ""; }; 84DB19FDB4402C7373D604BC4B6C5CC2 /* UserInfoFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserInfoFilter.swift; path = Sources/XCGLogger/Filters/UserInfoFilter.swift; sourceTree = ""; }; - 88D3FDD01C99727F578A4EE51AC023E3 /* NPOKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NPOKit-prefix.pch"; sourceTree = ""; }; + 8DE98382AB5EFDF9C51DF51777B24E58 /* LiveBroadcast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveBroadcast.swift; path = Sources/NPOKit/Model/Live/LiveBroadcast.swift; sourceTree = ""; }; 8F0450E75721141E36A6E10DE7140DD7 /* PrePostFixLogFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrePostFixLogFormatter.swift; path = Sources/XCGLogger/LogFormatters/PrePostFixLogFormatter.swift; sourceTree = ""; }; - 90F6C39DC76A07D4D8D84847E4CFA4BE /* NPOKit+LegacyStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+LegacyStream.swift"; path = "Sources/NPOKit/NPOKit+LegacyStream.swift"; sourceTree = ""; }; - 91C5B93A47D04540D4D3C6D6E7138701 /* NPOKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = NPOKit.framework; path = NPOKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 8F9AB7C8EE2BD9A43074470B126EBE7C /* JSONTransformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONTransformable.swift; path = Sources/NPOKit/Miscelaneous/JSONTransformable.swift; sourceTree = ""; }; + 91AECF96A28F8C7B48AECF17FA6388D4 /* NPOKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NPOKit-dummy.m"; sourceTree = ""; }; + 91C5B93A47D04540D4D3C6D6E7138701 /* NPOKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NPOKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 94AFA058FB8F4193A68EAEA1BFA6FB58 /* XCGLogger-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XCGLogger-dummy.m"; sourceTree = ""; }; - 9954FE4C04E51488D4E7FDA346E9108B /* GenreItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenreItem.swift; path = Sources/NPOKit/Model/Genres/GenreItem.swift; sourceTree = ""; }; - 99890FAE66A438BEC0D2D237F56C8947 /* Pods_TVGemistAbstract_TVGemist.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TVGemistAbstract_TVGemist.framework; path = "Pods-TVGemistAbstract-TVGemist.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 99890FAE66A438BEC0D2D237F56C8947 /* Pods_TVGemistAbstract_TVGemist.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TVGemistAbstract_TVGemist.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9A6E48B0A930F9427D4154FFEFAD69AE /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9C3D8BA1A87483A72B39B965FDEFE60B /* XCGLogger.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = XCGLogger.modulemap; sourceTree = ""; }; - 9F89AB6F6B20F57DE08AEA307059AFA5 /* Pods-TVGemistAbstract-TVGemist.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-TVGemistAbstract-TVGemist.modulemap"; sourceTree = ""; }; - A02E2FC37C51D688A273F8E490F0F0D5 /* NPOKit+Generics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Generics.swift"; path = "Sources/NPOKit/NPOKit+Generics.swift"; sourceTree = ""; }; + 9ADF983CA0B8030C087F5B4077FAD768 /* NPOKit+Programs.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Programs.swift"; path = "Sources/NPOKit/NPOKit+Programs.swift"; sourceTree = ""; }; + 9B985BFC7CF4AD568CE8B0EDB64AB379 /* NPOKitLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOKitLogger.swift; path = Sources/NPOKit/Logging/NPOKitLogger.swift; sourceTree = ""; }; + 9C3D8BA1A87483A72B39B965FDEFE60B /* XCGLogger.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = XCGLogger.modulemap; sourceTree = ""; }; + 9F89AB6F6B20F57DE08AEA307059AFA5 /* Pods-TVGemistAbstract-TVGemist.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-TVGemistAbstract-TVGemist.modulemap"; sourceTree = ""; }; A2DCB7B3405EAE66872C4B27ADF66B79 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; A410A0B22790AC528F70C072215925F0 /* ObjcExceptionBridging-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ObjcExceptionBridging-umbrella.h"; sourceTree = ""; }; - A445EE336F73DD4D6FE3CB6199C2F12C /* Format.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Format.swift; path = "Sources/NPOKit/Model/Images/Image Formats/Format.swift"; sourceTree = ""; }; + A417DD1F7A9177E67E3AA67BC5963D69 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Sources/NPOKit/Miscelaneous/Result.swift; sourceTree = ""; }; A462F146DF629E2F4F5C808C6DA12F00 /* GHKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GHKit-dummy.m"; sourceTree = ""; }; - A6518B4E67F9DAC6670C9708DC9ACEA4 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/NPOKit/Model/Filters/Filter.swift; sourceTree = ""; }; - A72EF45626EEED83350376E3B188AACE /* Channel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Channel.swift; path = Sources/NPOKit/Model/Channels/Channel.swift; sourceTree = ""; }; - A88CFE40A21B6088F39CABC14C87DFC7 /* NPOKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NPOKit.xcconfig; sourceTree = ""; }; - A97903708EE53D4F4D3D1E730851A209 /* LiveContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveContainer.swift; path = Sources/NPOKit/Model/Live/LiveContainer.swift; sourceTree = ""; }; - ABE0FA10EB32C2FDEB8129A0087ACECB /* NPOKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NPOKit-umbrella.h"; sourceTree = ""; }; - AEDEF18DBAD0912C8D47219B027FA980 /* NPOKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NPOKit-dummy.m"; sourceTree = ""; }; - B07F4AF311ECA04EA4697360E2E33FBD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1192A095D7135D02E519A205ACC8C2F /* LiveComponent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveComponent.swift; path = Sources/NPOKit/Model/Live/LiveComponent.swift; sourceTree = ""; }; + A92E4EBD5497790023162A2CB2E87342 /* ImageContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageContainer.swift; path = Sources/NPOKit/Model/Images/ImageContainer.swift; sourceTree = ""; }; B12771015BABC23C4643C8E75CA200E8 /* DevFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DevFilter.swift; path = Sources/XCGLogger/Filters/DevFilter.swift; sourceTree = ""; }; - B2722B52F647A1850BAFCE37E517CE35 /* GHKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GHKit.framework; path = GHKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B69186AC418B109EB378EBFA3C9279E6 /* NPOError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOError.swift; path = Sources/NPOKit/Miscelaneous/NPOError.swift; sourceTree = ""; }; - B81BC0E4F42878B9A6E1B386BC128D12 /* LiveStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LiveStream.swift; path = Sources/NPOKit/Model/Live/LiveStream.swift; sourceTree = ""; }; - B8839361DE1D17AE1BDA7AE96CE427C4 /* NPOKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NPOKit.swift; path = Sources/NPOKit/NPOKit.swift; sourceTree = ""; }; + B2722B52F647A1850BAFCE37E517CE35 /* GHKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GHKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B83C1FD6EE1B2A94B73F8BF25A72DDBF /* LegacyStreamItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegacyStreamItem.swift; path = "Sources/NPOKit/Model/Legacy Stream/LegacyStreamItem.swift"; sourceTree = ""; }; BD6C5229DB85E2BEAD3AE0FA72C3280B /* GHKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GHKit.xcconfig; sourceTree = ""; }; - BDCA2EB5E89C7F535BAE058A03889B22 /* NPOKit+Episodes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Episodes.swift"; path = "Sources/NPOKit/NPOKit+Episodes.swift"; sourceTree = ""; }; - BFA581126195C86D973BCD05A4CC91F6 /* JSONTransformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONTransformable.swift; path = Sources/NPOKit/Miscelaneous/JSONTransformable.swift; sourceTree = ""; }; + BE2E6442F9D95B25FD6AC43310832293 /* Channel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Channel.swift; path = Sources/NPOKit/Model/Channels/Channel.swift; sourceTree = ""; }; + BE5A36A5025B34A024066354F5A18D12 /* NPOKit+Subtitles.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Subtitles.swift"; path = "Sources/NPOKit/NPOKit+Subtitles.swift"; sourceTree = ""; }; C105AF93A2A7145ECB194677B03EF129 /* XCGLogger-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCGLogger-prefix.pch"; sourceTree = ""; }; + C256A6DF8F6AFE52B9E60A581E3F6792 /* NPOKit+Live.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Live.swift"; path = "Sources/NPOKit/NPOKit+Live.swift"; sourceTree = ""; }; C416E21217E0C95166C95D5EC86E7027 /* ANSIColorLogFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ANSIColorLogFormatter.swift; path = Sources/XCGLogger/LogFormatters/ANSIColorLogFormatter.swift; sourceTree = ""; }; C4A56C7C8842FFA2552F64888AC086AD /* ObjcExceptionBridging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ObjcExceptionBridging.xcconfig; sourceTree = ""; }; - C785374F8AC314EFE851F01214EFD10C /* FilterLink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FilterLink.swift; path = Sources/NPOKit/Model/Filters/FilterLink.swift; sourceTree = ""; }; - C9BE32B74FC7014D6ADEAF7FE759D008 /* QualityOption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QualityOption.swift; path = Sources/NPOKit/Model/Live/QualityOption.swift; sourceTree = ""; }; + C8DB95C88FD95857AC20DAD16595C45D /* PagedItems.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PagedItems.swift; path = "Sources/NPOKit/Model/Paged Content/PagedItems.swift"; sourceTree = ""; }; CA26E85C40385445B54FF9A20FEC864E /* ObjcExceptionBridging-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ObjcExceptionBridging-prefix.pch"; sourceTree = ""; }; CB526C0DEB612E0F9DBE9B3C8C082F64 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CD7EF8F370112E7A8B320B0127A677A9 /* NPOKit+LegacyStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+LegacyStream.swift"; path = "Sources/NPOKit/NPOKit+LegacyStream.swift"; sourceTree = ""; }; + D0CAB59E6BBE489A1404E13699D24319 /* UXImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UXImage.swift; path = "Sources/NPOKit/Cross Platform/UXImage.swift"; sourceTree = ""; }; + D1204E88395BA0767ED0B1FF9F37B511 /* NPOKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NPOKit-prefix.pch"; sourceTree = ""; }; D39E4427E7CF5187FCCB42D97644A0E6 /* GHAuthor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GHAuthor.swift; path = Sources/GHKit/Model/GHAuthor.swift; sourceTree = ""; }; + D743609AD1EE27BF7BD4844633892263 /* Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Item.swift; path = Sources/NPOKit/Model/Items/Item.swift; sourceTree = ""; }; + D868548126C0A6C43A230691F825AC9E /* Token.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Token.swift; path = "Sources/NPOKit/Model/Legacy Stream/Token.swift"; sourceTree = ""; }; D89248BDA8B55784FE071E7588D974A5 /* HelperFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HelperFunctions.swift; path = Sources/XCGLogger/Misc/HelperFunctions.swift; sourceTree = ""; }; - DAC3AC0C167527004B9F9C1FD3581FDE /* LegacyStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegacyStream.swift; path = "Sources/NPOKit/Model/Legacy Stream/LegacyStream.swift"; sourceTree = ""; }; - DB9904D6B1D78C7CCA7382D235DFFCE7 /* FairPlayStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FairPlayStream.swift; path = Sources/NPOKit/Model/Stream/FairPlayStream.swift; sourceTree = ""; }; - DCA8288D4978EEE60D2F8525821D582C /* LegacyStreamItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegacyStreamItem.swift; path = "Sources/NPOKit/Model/Legacy Stream/LegacyStreamItem.swift"; sourceTree = ""; }; DCF98DAE83D849286F4991C102810034 /* AutoRotatingFileDestination.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutoRotatingFileDestination.swift; path = Sources/XCGLogger/Destinations/AutoRotatingFileDestination.swift; sourceTree = ""; }; DEAD56F01FF3CE0D09D56B425ED6B99D /* BaseDestination.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BaseDestination.swift; path = Sources/XCGLogger/Destinations/BaseDestination.swift; sourceTree = ""; }; DFAB1E03EBB0BF815441D9189B174DC9 /* DestinationProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DestinationProtocol.swift; path = Sources/XCGLogger/Destinations/DestinationProtocol.swift; sourceTree = ""; }; E1F13ED702B74504F5F642D976896E14 /* URL+XCGAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+XCGAdditions.swift"; path = "Sources/XCGLogger/Extensions/URL+XCGAdditions.swift"; sourceTree = ""; }; + E4114072E4E65452087EF39397B554D7 /* NPOKit+Generics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Generics.swift"; path = "Sources/NPOKit/NPOKit+Generics.swift"; sourceTree = ""; }; + E522D71D8A80C61F1432CA8093AC9B61 /* LegacyPlaylist.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LegacyPlaylist.swift; path = "Sources/NPOKit/Model/Legacy Stream/LegacyPlaylist.swift"; sourceTree = ""; }; E75D45BC3A1412AFFB64C90834267BB7 /* FileNameFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileNameFilter.swift; path = Sources/XCGLogger/Filters/FileNameFilter.swift; sourceTree = ""; }; - E7C4120390C30190BFCF28E5D05D86C1 /* Token.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Token.swift; path = "Sources/NPOKit/Model/Legacy Stream/Token.swift"; sourceTree = ""; }; - E8D1C544E21F81AB63AF384A74B6016C /* NPOKit+Live.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NPOKit+Live.swift"; path = "Sources/NPOKit/NPOKit+Live.swift"; sourceTree = ""; }; - E90B2C51817EF3D6DF4F069D29BF25CE /* ObjcExceptionBridging.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ObjcExceptionBridging.framework; path = ObjcExceptionBridging.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E90B2C51817EF3D6DF4F069D29BF25CE /* ObjcExceptionBridging.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ObjcExceptionBridging.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E95CF07E150D9E26213040223423C071 /* XCGLogger-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCGLogger-umbrella.h"; sourceTree = ""; }; ED362C36EA5A78DA827EE34037239B00 /* GHRelease.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GHRelease.swift; path = Sources/GHKit/Model/GHRelease.swift; sourceTree = ""; }; - F37F811DE7C9E49A7A1AD219C85390A9 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Sources/NPOKit/Miscelaneous/Result.swift; sourceTree = ""; }; - F387CA031B3AD7B629F2AC36D774A7F6 /* ProgramFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProgramFilter.swift; path = Sources/NPOKit/Model/Filters/ProgramFilter.swift; sourceTree = ""; }; + ED8B6F4CD1B9DBDDACA05CA16F214898 /* ProgramFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProgramFilter.swift; path = Sources/NPOKit/Model/Filters/ProgramFilter.swift; sourceTree = ""; }; + F2A9056037F2E065317450587251E867 /* QualityOption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QualityOption.swift; path = Sources/NPOKit/Model/Live/QualityOption.swift; sourceTree = ""; }; F45AD39BC04158007AA13CDB6E6360C3 /* Pods-TVGemistAbstract-TVGemist.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TVGemistAbstract-TVGemist.debug.xcconfig"; sourceTree = ""; }; F613332628E9B1F5F0C705B73273254C /* TagFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TagFilter.swift; path = Sources/XCGLogger/Filters/TagFilter.swift; sourceTree = ""; }; F839D0510ECD2C22285DEF7472728596 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F8EEB329322F9A2E0A366B3E314460FE /* Pods-TVGemistAbstract-TVGemist-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TVGemistAbstract-TVGemist-dummy.m"; sourceTree = ""; }; + F9EDD0247328E890004E073878069ABC /* FairPlayStream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FairPlayStream.swift; path = Sources/NPOKit/Model/Stream/FairPlayStream.swift; sourceTree = ""; }; + FA8AE1F12A2E23200F9538B1F83887FC /* ImageFetchable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFetchable.swift; path = Sources/NPOKit/Model/Images/ImageFetchable.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 24496686F5C76B078D3CFEA7AE05C5ED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 5A2081AF6F6A5D4F57DBEF2A6B6CD03E /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 34CC9B4754ABAAF13B56559AC5DA5BF6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -298,14 +312,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EB5245538AF7962051BB396193E0C49D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - BD79538DE83975ADDF3D7AB3C3A8D445 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -341,7 +347,6 @@ 8F3265B6BCEEF99714C7B3FF28E3FE7E /* Core */, 631F60BAC064C0BDBC81B4719B47C36E /* Support Files */, ); - name = GHKit; path = GHKit; sourceTree = ""; }; @@ -353,6 +358,60 @@ name = tvOS; sourceTree = ""; }; + 5B985FCA6F2DDEAEDD5701D6F54DBF62 /* Core */ = { + isa = PBXGroup; + children = ( + BE2E6442F9D95B25FD6AC43310832293 /* Channel.swift */, + 5652451119FF652E22022F382FCCB6E8 /* Component.swift */, + 3C4F32CF5FE8302D32BA6E81F80039F9 /* Data+JSONTransformable.swift */, + F9EDD0247328E890004E073878069ABC /* FairPlayStream.swift */, + 47E6953EBE2C8F867074E895A253FFE0 /* Filter.swift */, + 3EF4CF176D917A1229FBED4290006389 /* FilterLink.swift */, + 74207E8A66CC5BDD6610B1BA1EDB605B /* FilterOption.swift */, + 0C9A16BE6B90D85DD991DB4E42493165 /* Format.swift */, + 68DB81D0982FE8F2024A481467C9C100 /* FormatContainer.swift */, + 1D0D017EF20C1B438A40867BCD1105BA /* GenreItem.swift */, + A92E4EBD5497790023162A2CB2E87342 /* ImageContainer.swift */, + FA8AE1F12A2E23200F9538B1F83887FC /* ImageFetchable.swift */, + D743609AD1EE27BF7BD4844633892263 /* Item.swift */, + 8F9AB7C8EE2BD9A43074470B126EBE7C /* JSONTransformable.swift */, + E522D71D8A80C61F1432CA8093AC9B61 /* LegacyPlaylist.swift */, + 506C82E2581E4D21C5B2ABE1EABAEAE2 /* LegacyStream.swift */, + B83C1FD6EE1B2A94B73F8BF25A72DDBF /* LegacyStreamItem.swift */, + 8DE98382AB5EFDF9C51DF51777B24E58 /* LiveBroadcast.swift */, + 183DDFAECB8630F96EA98716D7D1659F /* LiveChannel.swift */, + 74219EF73C834C9BC14A4050080D8277 /* LiveComponent.swift */, + 05F66EF0F52A7EB4B44D26BE7976CD5E /* LiveContainer.swift */, + 13F80AEDA271FB8DA269D5EF5AB9FB19 /* LiveSchedule.swift */, + 67857D49B56B7CC2127377342FC911CC /* LiveStream.swift */, + 2A11AAC85843F7FD6F293F8F54751E7A /* Media.swift */, + 2C569B170CB93A021FCF2C504A1DF68D /* NPOError.swift */, + 4CD59039E7D513B291442C8B8F535510 /* NPOGenre.swift */, + 57D6373D824E6D7B2AD8895B550AD411 /* NPOImage.swift */, + 77ACAC10FE8624C71300F640938CD7D6 /* NPOKit.swift */, + 00EE6F27490377F4E0023960B6DBC1D3 /* NPOKit+Episodes.swift */, + 78BC46E7E4BCC33E90EBE3606A311BD5 /* NPOKit+FairPlayStream.swift */, + E4114072E4E65452087EF39397B554D7 /* NPOKit+Generics.swift */, + 16F0AA9E75BC407760D8C7F505995A1B /* NPOKit+Images.swift */, + CD7EF8F370112E7A8B320B0127A677A9 /* NPOKit+LegacyStream.swift */, + C256A6DF8F6AFE52B9E60A581E3F6792 /* NPOKit+Live.swift */, + 9ADF983CA0B8030C087F5B4077FAD768 /* NPOKit+Programs.swift */, + BE5A36A5025B34A024066354F5A18D12 /* NPOKit+Subtitles.swift */, + 9B985BFC7CF4AD568CE8B0EDB64AB379 /* NPOKitLogger.swift */, + 31C78B7C37D9A38870646A670996EBD1 /* Pageable.swift */, + C8DB95C88FD95857AC20DAD16595C45D /* PagedItems.swift */, + 28B34C565E184C31F7E2B1F14120F8C4 /* Paginator.swift */, + ED8B6F4CD1B9DBDDACA05CA16F214898 /* ProgramFilter.swift */, + F2A9056037F2E065317450587251E867 /* QualityOption.swift */, + A417DD1F7A9177E67E3AA67BC5963D69 /* Result.swift */, + 7D9EE43AD30810CDD1D85A01034E2177 /* String+Obfuscation.swift */, + 5E5CB2A57B176A753DE769905AB14D6D /* Subtitle.swift */, + D868548126C0A6C43A230691F825AC9E /* Token.swift */, + D0CAB59E6BBE489A1404E13699D24319 /* UXImage.swift */, + ); + name = Core; + sourceTree = ""; + }; 5C72E06C2824347EC3F119CD6400657F /* Support Files */ = { isa = PBXGroup; children = ( @@ -392,57 +451,6 @@ ); sourceTree = ""; }; - 8231E3A2F1B2D8C9486CF1728EF67F01 /* Core */ = { - isa = PBXGroup; - children = ( - A72EF45626EEED83350376E3B188AACE /* Channel.swift */, - 6E511D67E6AF53FF55B4847EAC024C1E /* Component.swift */, - 5C967A872F2098838B445B2A6C4A7EAF /* Data+JSONTransformable.swift */, - DB9904D6B1D78C7CCA7382D235DFFCE7 /* FairPlayStream.swift */, - A6518B4E67F9DAC6670C9708DC9ACEA4 /* Filter.swift */, - C785374F8AC314EFE851F01214EFD10C /* FilterLink.swift */, - 26F4F7457CF21AE6216E9F6DB7C318A7 /* FilterOption.swift */, - A445EE336F73DD4D6FE3CB6199C2F12C /* Format.swift */, - 3594C9442CE647CB8EC193D86E629B15 /* FormatContainer.swift */, - 9954FE4C04E51488D4E7FDA346E9108B /* GenreItem.swift */, - 78A62CCD3D6D646B5C3C27C884924C2A /* ImageContainer.swift */, - 42F4E2C6B7168660916BEBCEE04967E3 /* ImageFetchable.swift */, - 762350DB8A451770D5F541AC0EC41DD3 /* Item.swift */, - BFA581126195C86D973BCD05A4CC91F6 /* JSONTransformable.swift */, - 6D3FB027348B73A82FCBC5686578CBA9 /* LegacyPlaylist.swift */, - DAC3AC0C167527004B9F9C1FD3581FDE /* LegacyStream.swift */, - DCA8288D4978EEE60D2F8525821D582C /* LegacyStreamItem.swift */, - 1B1B0366E749140743D490AC21DE89C0 /* LiveChannel.swift */, - B1192A095D7135D02E519A205ACC8C2F /* LiveComponent.swift */, - A97903708EE53D4F4D3D1E730851A209 /* LiveContainer.swift */, - 81C15728E730CB1075EAC3D450C73014 /* LiveEPG.swift */, - 2E4CF494EEB3033949564788490289AF /* LiveSchedule.swift */, - B81BC0E4F42878B9A6E1B386BC128D12 /* LiveStream.swift */, - B69186AC418B109EB378EBFA3C9279E6 /* NPOError.swift */, - 61CC4B78E606D79AE10B67B79401ED99 /* NPOGenre.swift */, - 776FA69EE3F7A98FD07054C86EF4D5E2 /* NPOImage.swift */, - B8839361DE1D17AE1BDA7AE96CE427C4 /* NPOKit.swift */, - BDCA2EB5E89C7F535BAE058A03889B22 /* NPOKit+Episodes.swift */, - 1027DF5904917014F9B1F3B611122EEE /* NPOKit+FairPlayStream.swift */, - A02E2FC37C51D688A273F8E490F0F0D5 /* NPOKit+Generics.swift */, - 653CE03598B94A9315A725D3C8907A72 /* NPOKit+Images.swift */, - 90F6C39DC76A07D4D8D84847E4CFA4BE /* NPOKit+LegacyStream.swift */, - E8D1C544E21F81AB63AF384A74B6016C /* NPOKit+Live.swift */, - 32FAE6F8B7FECA7E3FAD1B5CF8AF026D /* NPOKit+Programs.swift */, - 6D1A38382CC8F0780B9234840C8736C7 /* NPOKitLogger.swift */, - 547906085FF1E56DDE9BC80969FC62FE /* Pageable.swift */, - 02F250AB19AC5EC8D4766A5E7DD41695 /* PagedItems.swift */, - 14AF51C221D36BE9C5886C541DA0920A /* Paginator.swift */, - F387CA031B3AD7B629F2AC36D774A7F6 /* ProgramFilter.swift */, - C9BE32B74FC7014D6ADEAF7FE759D008 /* QualityOption.swift */, - F37F811DE7C9E49A7A1AD219C85390A9 /* Result.swift */, - 577EB87CE5DEFD682AC464196876C279 /* String+Obfuscation.swift */, - E7C4120390C30190BFCF28E5D05D86C1 /* Token.swift */, - 35D5C2E3EDD90DCF735195AAAC8745ED /* UXImage.swift */, - ); - name = Core; - sourceTree = ""; - }; 8F3265B6BCEEF99714C7B3FF28E3FE7E /* Core */ = { isa = PBXGroup; children = ( @@ -464,7 +472,6 @@ D71C62FE1EB6E9E188FAA9968FDA64EC /* Core */, 5C72E06C2824347EC3F119CD6400657F /* Support Files */, ); - name = XCGLogger; path = XCGLogger; sourceTree = ""; }; @@ -474,7 +481,6 @@ AFC29E4D92D9D41B8FCFAD60D52FC6DA /* ObjcExceptionBridging */, BC2AC460EC26B6E55F1D5728DD08BED3 /* Support Files */, ); - name = ObjcExceptionBridging; path = ObjcExceptionBridging; sourceTree = ""; }; @@ -508,6 +514,15 @@ name = Frameworks; sourceTree = ""; }; + B923740CF511BC08426F9A6983D3FBDC /* NPOKit */ = { + isa = PBXGroup; + children = ( + 5B985FCA6F2DDEAEDD5701D6F54DBF62 /* Core */, + C3F8EBB882F6BDEFA6686E836546B854 /* Support Files */, + ); + path = NPOKit; + sourceTree = ""; + }; BC2AC460EC26B6E55F1D5728DD08BED3 /* Support Files */ = { isa = PBXGroup; children = ( @@ -522,6 +537,20 @@ path = "../Target Support Files/ObjcExceptionBridging"; sourceTree = ""; }; + C3F8EBB882F6BDEFA6686E836546B854 /* Support Files */ = { + isa = PBXGroup; + children = ( + 57F50C7D40629148BC781C44F296247E /* Info.plist */, + 70AD52A2C2AE80A81A7F44EA1D1D011C /* NPOKit.modulemap */, + 105870C2D1261D521E8C1D927A33B020 /* NPOKit.xcconfig */, + 91AECF96A28F8C7B48AECF17FA6388D4 /* NPOKit-dummy.m */, + D1204E88395BA0767ED0B1FF9F37B511 /* NPOKit-prefix.pch */, + 3D3AC0E09E88C3E300259830084FAF9D /* NPOKit-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/NPOKit"; + sourceTree = ""; + }; D71C62FE1EB6E9E188FAA9968FDA64EC /* Core */ = { isa = PBXGroup; children = ( @@ -553,20 +582,6 @@ name = Core; sourceTree = ""; }; - E8F93B664518BDC03A7B025CDE44144C /* Support Files */ = { - isa = PBXGroup; - children = ( - B07F4AF311ECA04EA4697360E2E33FBD /* Info.plist */, - 3D4CDF59A1A3A53A399A434FC394E922 /* NPOKit.modulemap */, - A88CFE40A21B6088F39CABC14C87DFC7 /* NPOKit.xcconfig */, - AEDEF18DBAD0912C8D47219B027FA980 /* NPOKit-dummy.m */, - 88D3FDD01C99727F578A4EE51AC023E3 /* NPOKit-prefix.pch */, - ABE0FA10EB32C2FDEB8129A0087ACECB /* NPOKit-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/NPOKit"; - sourceTree = ""; - }; EB099CA88E65DF1806429A22946AEDDC /* Targets Support Files */ = { isa = PBXGroup; children = ( @@ -579,7 +594,7 @@ isa = PBXGroup; children = ( 26F763F2ABDED21EE32B38EF966A58AE /* GHKit */, - F4C83749ADCF08650561C64011811D80 /* NPOKit */, + B923740CF511BC08426F9A6983D3FBDC /* NPOKit */, 964AA321C3F21AA5B4CAAA9AF9034470 /* ObjcExceptionBridging */, F1DC678CBE731641975B0559BC55CF7E /* SwiftLint */, 8FA72C2CC63C2E7CD65117D873C5287D /* XCGLogger */, @@ -591,20 +606,9 @@ isa = PBXGroup; children = ( ); - name = SwiftLint; path = SwiftLint; sourceTree = ""; }; - F4C83749ADCF08650561C64011811D80 /* NPOKit */ = { - isa = PBXGroup; - children = ( - 8231E3A2F1B2D8C9486CF1728EF67F01 /* Core */, - E8F93B664518BDC03A7B025CDE44144C /* Support Files */, - ); - name = NPOKit; - path = NPOKit; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -616,28 +620,28 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 600D5DA51332AC45DA002B338862B53F /* Headers */ = { + 6584F5F1F3D077CE06D1C872A89521BB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 7006FEA1A45A3C891FE41BE36A2192E8 /* NPOKit-umbrella.h in Headers */, + BB5C45A6BC472BF7AFF2982ED3816626 /* GHKit-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6584F5F1F3D077CE06D1C872A89521BB /* Headers */ = { + 8E4430AF6874BB9DA22735AC056BC031 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BB5C45A6BC472BF7AFF2982ED3816626 /* GHKit-umbrella.h in Headers */, + 0C54AC5F3FCCBE79348541775C3CBD8A /* ObjcExceptionBridging-umbrella.h in Headers */, + 5E632DDFA44C09C21110169843F23FBC /* ObjcExceptionBridging.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8E4430AF6874BB9DA22735AC056BC031 /* Headers */ = { + BAC4554C4DA5CB376BB9CD9427AB11F9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 0C54AC5F3FCCBE79348541775C3CBD8A /* ObjcExceptionBridging-umbrella.h in Headers */, - 5E632DDFA44C09C21110169843F23FBC /* ObjcExceptionBridging.h in Headers */, + AB9ADB02BE48D75B5F300A6119AD1131 /* NPOKit-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -652,38 +656,38 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 293D84C621F54B8D17A497E8F1CA1A72 /* NPOKit */ = { + 5B0B5B8A1476F8AA333AA7B53F47E96B /* ObjcExceptionBridging */ = { isa = PBXNativeTarget; - buildConfigurationList = 18C54ADBAD45A843F18C1C0B2420E76B /* Build configuration list for PBXNativeTarget "NPOKit" */; + buildConfigurationList = C4195B567D4F3F2206FEDC07DA2C6626 /* Build configuration list for PBXNativeTarget "ObjcExceptionBridging" */; buildPhases = ( - 4130702080D7F735034F4AFBB75BF510 /* Sources */, - EB5245538AF7962051BB396193E0C49D /* Frameworks */, - 600D5DA51332AC45DA002B338862B53F /* Headers */, + B138B23F6222B565BBE8F92315455124 /* Sources */, + 4AF8078BAD55CA9AB1F38E566F60CF75 /* Frameworks */, + 8E4430AF6874BB9DA22735AC056BC031 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = NPOKit; - productName = NPOKit; - productReference = 91C5B93A47D04540D4D3C6D6E7138701 /* NPOKit.framework */; + name = ObjcExceptionBridging; + productName = ObjcExceptionBridging; + productReference = E90B2C51817EF3D6DF4F069D29BF25CE /* ObjcExceptionBridging.framework */; productType = "com.apple.product-type.framework"; }; - 5B0B5B8A1476F8AA333AA7B53F47E96B /* ObjcExceptionBridging */ = { + 82C99BDE5CC95E651CDE74549FBA3C5F /* NPOKit */ = { isa = PBXNativeTarget; - buildConfigurationList = C4195B567D4F3F2206FEDC07DA2C6626 /* Build configuration list for PBXNativeTarget "ObjcExceptionBridging" */; + buildConfigurationList = B32254309F2AC40BC345A96D3A293B9C /* Build configuration list for PBXNativeTarget "NPOKit" */; buildPhases = ( - B138B23F6222B565BBE8F92315455124 /* Sources */, - 4AF8078BAD55CA9AB1F38E566F60CF75 /* Frameworks */, - 8E4430AF6874BB9DA22735AC056BC031 /* Headers */, + 1AD43EEB11D452BA26978B10B86BBE07 /* Sources */, + 24496686F5C76B078D3CFEA7AE05C5ED /* Frameworks */, + BAC4554C4DA5CB376BB9CD9427AB11F9 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = ObjcExceptionBridging; - productName = ObjcExceptionBridging; - productReference = E90B2C51817EF3D6DF4F069D29BF25CE /* ObjcExceptionBridging.framework */; + name = NPOKit; + productName = NPOKit; + productReference = 91C5B93A47D04540D4D3C6D6E7138701 /* NPOKit.framework */; productType = "com.apple.product-type.framework"; }; AE0460F6FF3614A790A8790FD1622608 /* XCGLogger */ = { @@ -750,7 +754,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0920; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -765,7 +769,7 @@ projectRoot = ""; targets = ( DB9867FD93011EFC7F25F05BC13FD2F6 /* GHKit */, - 293D84C621F54B8D17A497E8F1CA1A72 /* NPOKit */, + 82C99BDE5CC95E651CDE74549FBA3C5F /* NPOKit */, 5B0B5B8A1476F8AA333AA7B53F47E96B /* ObjcExceptionBridging */, C7A228A7D04C8989E15D7E8F79E0709F /* Pods-TVGemistAbstract-TVGemist */, AE0460F6FF3614A790A8790FD1622608 /* XCGLogger */, @@ -785,55 +789,58 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 4130702080D7F735034F4AFBB75BF510 /* Sources */ = { + 1AD43EEB11D452BA26978B10B86BBE07 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 66E9AFF771D71FC5B056CBF30AD2F423 /* Channel.swift in Sources */, - 59923F0428786F94E41E3CA65D675FDC /* Component.swift in Sources */, - E6363615F8C2C659BEACD6B88CC2747D /* Data+JSONTransformable.swift in Sources */, - B14E428281CBFCF943825D2B8B83588D /* FairPlayStream.swift in Sources */, - B914C1BFB9FCF8CFDC481D17F664AF2F /* Filter.swift in Sources */, - 17960C475E12CDE87914AAB40F6FA491 /* FilterLink.swift in Sources */, - 063CAFF47FF79696C38993BE55D0A323 /* FilterOption.swift in Sources */, - 11940047E2B7D448CF1977B04A0924FE /* Format.swift in Sources */, - 00DB73979F93F6CDBEFADD13BF329C0E /* FormatContainer.swift in Sources */, - D7EE049ADC645A2CD9F9ED936CFC46F0 /* GenreItem.swift in Sources */, - F6AE1695E771E407A67CD9D435188FF7 /* ImageContainer.swift in Sources */, - 2677873DC9C50D6F440BBC052BAFA084 /* ImageFetchable.swift in Sources */, - DB8EAF1AB77EE5767AC8CF404A9D4E32 /* Item.swift in Sources */, - 50C6A900F4F3235C8D63F80030FABD87 /* JSONTransformable.swift in Sources */, - E758C17E9079320B1036E39FBAF7A642 /* LegacyPlaylist.swift in Sources */, - 2BEA160235E2E6A79AB00091EE87240B /* LegacyStream.swift in Sources */, - 2586D6871177B0A632003CAD22EB3F82 /* LegacyStreamItem.swift in Sources */, - EBCE5B2BD872F60A7850B4514CAE31F7 /* LiveChannel.swift in Sources */, - 9D1255CFF893915DA49B48396133A797 /* LiveComponent.swift in Sources */, - 3AD67A3E491089DF79F36F0F375EBD8F /* LiveContainer.swift in Sources */, - D6FFD526EEBB878DB6F0D64A93FB4957 /* LiveEPG.swift in Sources */, - 005CA527C43087C3A5A3C8124790D0F9 /* LiveSchedule.swift in Sources */, - B1CB73F28924E945A42BF3CF5EA72FAC /* LiveStream.swift in Sources */, - 06E51384AF4523B52BA5BB99A828F459 /* NPOError.swift in Sources */, - 58C2821A38B405BEB7731F40E1E8A58D /* NPOGenre.swift in Sources */, - E2D0906870CB7A293957B27BEFE7B0F3 /* NPOImage.swift in Sources */, - F3D27E2D3327F2EAC7F86EAC2B7A0D36 /* NPOKit+Episodes.swift in Sources */, - 2F2CE53CA58A959519804DD8B48817A0 /* NPOKit+FairPlayStream.swift in Sources */, - E5EFD8312AFA474D6C3707102E9D2749 /* NPOKit+Generics.swift in Sources */, - 7162A8D6440B8168507A0D23AF52C734 /* NPOKit+Images.swift in Sources */, - 6DFA13B309660052803ADCE0EEDCBD34 /* NPOKit+LegacyStream.swift in Sources */, - 2976211866BAD8DF8A05ABB22B7E7556 /* NPOKit+Live.swift in Sources */, - 473D5CCDC7E68F031F231F71FBFD2003 /* NPOKit+Programs.swift in Sources */, - B536D8C46958FAACFD50F557CB4F1CBF /* NPOKit-dummy.m in Sources */, - 20AAA8247B06BF7418AF95308044721E /* NPOKit.swift in Sources */, - 218C982A717039D212C9E126E789FA22 /* NPOKitLogger.swift in Sources */, - 69BCA621005C3FF222DED31D52AF5419 /* Pageable.swift in Sources */, - EAC6A390374F54968F3B3B2684ABF4BD /* PagedItems.swift in Sources */, - 16A16E48797613B76D709E489037BF4A /* Paginator.swift in Sources */, - 24EE57016B6CFFA6801B4BE2D6116BA2 /* ProgramFilter.swift in Sources */, - EF2C5CB8BD9C01803ACE5FDD62BA2EE4 /* QualityOption.swift in Sources */, - 7F44687EC6DB52FB58684754272B40DB /* Result.swift in Sources */, - 87EEC90AA1E23ADD848BCEAA5615A98F /* String+Obfuscation.swift in Sources */, - 8BA7E084FD75B724D821EB8879A5368D /* Token.swift in Sources */, - D3A0F6809275BD655211FA79388C5C74 /* UXImage.swift in Sources */, + 7A6C7A378E59607A96CEF167B8C51703 /* Channel.swift in Sources */, + 7654205EAACFFA76A310AF471452BC23 /* Component.swift in Sources */, + D81FB3476D46983B19760290F9268D1A /* Data+JSONTransformable.swift in Sources */, + 17124DF5505796F4D140A172775DBB6D /* FairPlayStream.swift in Sources */, + 8356FE0D35DDD09487881FD5292909C6 /* Filter.swift in Sources */, + D4BC9E48F4AC568306C770DEEFB48729 /* FilterLink.swift in Sources */, + B59D07D8E181D7C78E5C038FD2C48018 /* FilterOption.swift in Sources */, + D04B0C659230A18A7386A947FD277469 /* Format.swift in Sources */, + 18657504794233A28E1E4D26FE25D3F7 /* FormatContainer.swift in Sources */, + F4A6AAB4139BDB939BD5F03DF6D1AA74 /* GenreItem.swift in Sources */, + 5259223F60437C2502FD7FFFBC76DB4B /* ImageContainer.swift in Sources */, + 9672D41941005B73B56DE85B895B3424 /* ImageFetchable.swift in Sources */, + 9110EF70066241F7FC782F16A577979F /* Item.swift in Sources */, + 3AED2066AF85C30E5E0101D817C52751 /* JSONTransformable.swift in Sources */, + 63EAF2D8CF2B5A37D22F1675FDE2CD19 /* LegacyPlaylist.swift in Sources */, + 9801E6E40A32D979B20386912A8FED59 /* LegacyStream.swift in Sources */, + DA1AB12D8689AAA52A4CA6419D952397 /* LegacyStreamItem.swift in Sources */, + E9C7EC8F1C35E76FCCAA62B00AE52A6A /* LiveBroadcast.swift in Sources */, + C4C6E025FFD600A4363C789A8E578CEB /* LiveChannel.swift in Sources */, + 8DFE570442174B071C78A4DCA9EB02DD /* LiveComponent.swift in Sources */, + E8A746B85AB508CB5071AE3D4329E3E0 /* LiveContainer.swift in Sources */, + FB0CEB339B4A33B969C8D820FB8E0463 /* LiveSchedule.swift in Sources */, + A20A3FD547AAC9FB286B330693FADCAA /* LiveStream.swift in Sources */, + 3A01D923E2CAFE7ED401065560A6BF95 /* Media.swift in Sources */, + 69143E2D56FA8C88D61BE4A46D1E609B /* NPOError.swift in Sources */, + ABAD096A04E2833D3C54545589BD49B8 /* NPOGenre.swift in Sources */, + F842CA93E4BE66EDFFD162A14BD51EF4 /* NPOImage.swift in Sources */, + 7EE29383D57CD48B0D03477D0FE6AC36 /* NPOKit+Episodes.swift in Sources */, + 7E0D29C6F0A4F0AB02A49A0D9F113593 /* NPOKit+FairPlayStream.swift in Sources */, + 5A9BC95D80A0B219C638D03B6BE88F32 /* NPOKit+Generics.swift in Sources */, + 7030D562910BA36A960660F9B7395919 /* NPOKit+Images.swift in Sources */, + 13421C7130EC4B7E06F61FACA6545735 /* NPOKit+LegacyStream.swift in Sources */, + 2F6444613B5ED6BC304FE97E5E5A1398 /* NPOKit+Live.swift in Sources */, + 64DFCF2FBFD18A17F84913367EEC03AE /* NPOKit+Programs.swift in Sources */, + FAB294D3B6B968C7F1171B1CBED66FF7 /* NPOKit+Subtitles.swift in Sources */, + F2AAF50FD3F544DA78CB3F5BA6D08568 /* NPOKit-dummy.m in Sources */, + 12D3E577C1DB70E49F3CDEB93E1DDF8E /* NPOKit.swift in Sources */, + 27A16199619ECB542B86135687AE2EB6 /* NPOKitLogger.swift in Sources */, + 9D33B8AD40192370E93F8AAED9FC03B0 /* Pageable.swift in Sources */, + 6833BF91A7A9457EF04FDF607A8B2398 /* PagedItems.swift in Sources */, + C3FF15F3EDA8D5E4E4694E0894D39E65 /* Paginator.swift in Sources */, + 95201848676253530ED078C27DAF393F /* ProgramFilter.swift in Sources */, + F3966B698511D72D510C44885E7BDA38 /* QualityOption.swift in Sources */, + AE2210E4BE44F1428F01D1C463351B69 /* Result.swift in Sources */, + D7B1252A6165DEBCB19B3AB7DC597875 /* String+Obfuscation.swift in Sources */, + 4575610F8D363E83536B8F9CB1329BF3 /* Subtitle.swift in Sources */, + 37475A3FE56C8A40012DB8C428E050E3 /* Token.swift in Sources */, + 216A4A74710B26B1D16469BCC2EA1F95 /* UXImage.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -913,7 +920,7 @@ 2AEB939EE14022B1839FEF17C9A39859 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = NPOKit; - target = 293D84C621F54B8D17A497E8F1CA1A72 /* NPOKit */; + target = 82C99BDE5CC95E651CDE74549FBA3C5F /* NPOKit */; targetProxy = C0D945EC42F61669EF6C6C47DA5D26B0 /* PBXContainerItemProxy */; }; 64D3AF5578B38C2055697C38E6B5FA75 /* PBXTargetDependency */ = { @@ -972,9 +979,9 @@ }; name = Debug; }; - 41E0727A8723EB09FFC451B407DBA5F8 /* Release */ = { + 1EC1D426D361A864D2BED62278A6A6DE /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6B90E958AE15F396A56A159B50F1B49A /* XCGLogger.xcconfig */; + baseConfigurationReference = 105870C2D1261D521E8C1D927A33B020 /* NPOKit.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -985,28 +992,28 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/XCGLogger/XCGLogger-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/XCGLogger/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/NPOKit/NPOKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/NPOKit/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/XCGLogger/XCGLogger.modulemap"; - PRODUCT_NAME = XCGLogger; + MODULEMAP_FILE = "Target Support Files/NPOKit/NPOKit.modulemap"; + PRODUCT_NAME = NPOKit; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 11.0; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - 465579B242B816CD83409086B65422C4 /* Release */ = { + 41E0727A8723EB09FFC451B407DBA5F8 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A88CFE40A21B6088F39CABC14C87DFC7 /* NPOKit.xcconfig */; + baseConfigurationReference = 6B90E958AE15F396A56A159B50F1B49A /* XCGLogger.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1017,19 +1024,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/NPOKit/NPOKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/NPOKit/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/XCGLogger/XCGLogger-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/XCGLogger/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/NPOKit/NPOKit.modulemap"; - PRODUCT_NAME = NPOKit; + MODULEMAP_FILE = "Target Support Files/XCGLogger/XCGLogger.modulemap"; + PRODUCT_NAME = XCGLogger; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 11.0; + TVOS_DEPLOYMENT_TARGET = 9.0; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1086,6 +1093,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; STRIP_INSTALLED_PRODUCT = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SYMROOT = "${SRCROOT}/../build"; TVOS_DEPLOYMENT_TARGET = 11.0; }; @@ -1279,9 +1287,9 @@ }; name = Debug; }; - DD2594C77AF60EEE0B56A759B7BD4B9D /* Debug */ = { + DC788B1AE1655A3C6CF008A2C5CD3826 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BD6C5229DB85E2BEAD3AE0FA72C3280B /* GHKit.xcconfig */; + baseConfigurationReference = 105870C2D1261D521E8C1D927A33B020 /* NPOKit.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1292,12 +1300,12 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/GHKit/GHKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/GHKit/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/NPOKit/NPOKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/NPOKit/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/GHKit/GHKit.modulemap"; - PRODUCT_NAME = GHKit; + MODULEMAP_FILE = "Target Support Files/NPOKit/NPOKit.modulemap"; + PRODUCT_NAME = NPOKit; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -1310,9 +1318,9 @@ }; name = Debug; }; - EE35057113FC46902A19E2578FACF34C /* Debug */ = { + DD2594C77AF60EEE0B56A759B7BD4B9D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6B90E958AE15F396A56A159B50F1B49A /* XCGLogger.xcconfig */; + baseConfigurationReference = BD6C5229DB85E2BEAD3AE0FA72C3280B /* GHKit.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1323,27 +1331,27 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/XCGLogger/XCGLogger-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/XCGLogger/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/GHKit/GHKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GHKit/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/XCGLogger/XCGLogger.modulemap"; - PRODUCT_NAME = XCGLogger; + MODULEMAP_FILE = "Target Support Files/GHKit/GHKit.modulemap"; + PRODUCT_NAME = GHKit; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 11.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - FF30FF68F6F82F630F033FE397604C98 /* Debug */ = { + EE35057113FC46902A19E2578FACF34C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A88CFE40A21B6088F39CABC14C87DFC7 /* NPOKit.xcconfig */; + baseConfigurationReference = 6B90E958AE15F396A56A159B50F1B49A /* XCGLogger.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1354,19 +1362,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/NPOKit/NPOKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/NPOKit/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/XCGLogger/XCGLogger-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/XCGLogger/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/NPOKit/NPOKit.modulemap"; - PRODUCT_NAME = NPOKit; + MODULEMAP_FILE = "Target Support Files/XCGLogger/XCGLogger.modulemap"; + PRODUCT_NAME = XCGLogger; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 11.0; + TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -1384,20 +1392,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 18C54ADBAD45A843F18C1C0B2420E76B /* Build configuration list for PBXNativeTarget "NPOKit" */ = { + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - FF30FF68F6F82F630F033FE397604C98 /* Debug */, - 465579B242B816CD83409086B65422C4 /* Release */, + C026B4AFE5FA09028EB245713D35E712 /* Debug */, + 49014A32523AAB2D77E42A34B60B2DC1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + B32254309F2AC40BC345A96D3A293B9C /* Build configuration list for PBXNativeTarget "NPOKit" */ = { isa = XCConfigurationList; buildConfigurations = ( - C026B4AFE5FA09028EB245713D35E712 /* Debug */, - 49014A32523AAB2D77E42A34B60B2DC1 /* Release */, + DC788B1AE1655A3C6CF008A2C5CD3826 /* Debug */, + 1EC1D426D361A864D2BED62278A6A6DE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/SwiftLint/swiftlint b/Pods/SwiftLint/swiftlint index 2812e83..e0d594b 100755 Binary files a/Pods/SwiftLint/swiftlint and b/Pods/SwiftLint/swiftlint differ diff --git a/Pods/Target Support Files/NPOKit/Info.plist b/Pods/Target Support Files/NPOKit/Info.plist index 43a5857..a42f96e 100644 --- a/Pods/Target Support Files/NPOKit/Info.plist +++ b/Pods/Target Support Files/NPOKit/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.0.4 + 0.0.5 CFBundleSignature ???? CFBundleVersion diff --git a/README.md b/README.md index ec3278f..ee0de82 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://travis-ci.org/4np/TVGemist.svg?branch=master)](https://travis-ci.org/4np/TVGemist) [![Release](https://img.shields.io/github/release/4np/TVGemist.svg)](https://github.com/4np/TVGemist/releases/latest) -[![Commits Since](https://img.shields.io/github/commits-since/4np/TVGemist/0.0.2.svg?maxAge=3600)](https://github.com/4np/TVGemist/commits/master) +[![Commits Since](https://img.shields.io/github/commits-since/4np/TVGemist/0.0.3.svg?maxAge=3600)](https://github.com/4np/TVGemist/commits/master) [![Platform](https://img.shields.io/badge/platform-tvOS%2011-green.svg?maxAge=3600)](https://developer.apple.com/tvos/) [![Swift](https://img.shields.io/badge/language-Swift-ed523f.svg?maxAge=3600)](https://swift.org) [![codebeat badge](https://codebeat.co/badges/bf954277-cb4b-40d9-8cc2-94aff9568634)](https://codebeat.co/projects/github-com-4np-tvgemist-master) @@ -13,18 +13,43 @@ _Note: this project is in active development, consider this alpha..._ +![App Icon](https://user-images.githubusercontent.com/1049693/36220523-34534838-11bb-11e8-8442-e3c664859ca7.gif) + # Getting started Please refer to the [installation guide](https://github.com/4np/TVGemist/blob/master/INSTALLATION.md) on how to get `TV Gemist` on your tv. # Screenshots -![Main TV](https://user-images.githubusercontent.com/1049693/35980552-4217fc5e-0ceb-11e8-99b7-8d648717db94.png) +## Programs ![Programs](https://user-images.githubusercontent.com/1049693/35980287-9ea51156-0cea-11e8-8c02-ffe4178bdd58.png) +## Episodes + ![Program overview](https://user-images.githubusercontent.com/1049693/35980288-9ec4b10a-0cea-11e8-9d35-cc17d59d9e83.png) +## Live TV and Themed Channels + +![Live](https://user-images.githubusercontent.com/1049693/36210185-11cbd7c0-119e-11e8-846b-4d61fad2159f.png) + +## Closed Captions + +Enabled or disable subtitles through the player settings by selecting either '_off_' or '_CC_'. Note that '_Auto_' doesn't do anything... + +![Closed Captioning](https://user-images.githubusercontent.com/1049693/36209932-6b99086e-119d-11e8-84a5-fd4db3b1e5d4.png) + +## Episode Details + +Episode or live program details are available in the player's meta information. + +![Meta information](https://user-images.githubusercontent.com/1049693/36210100-dda36486-119d-11e8-83ad-fe215fdd10dd.png) + + +## Main screen + +![Main TV](https://user-images.githubusercontent.com/1049693/35980552-4217fc5e-0ceb-11e8-99b7-8d648717db94.png) + # License See the accompanying [LICENSE](LICENSE) and [NOTICE](NOTICE) files for more information. diff --git a/TVGemist.xcodeproj/project.pbxproj b/TVGemist.xcodeproj/project.pbxproj index 76d267c..f17a99e 100644 --- a/TVGemist.xcodeproj/project.pbxproj +++ b/TVGemist.xcodeproj/project.pbxproj @@ -13,8 +13,8 @@ F3047DB42029F012000C48F9 /* TVGemistTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3047DB32029F012000C48F9 /* TVGemistTests.swift */; }; F3047DBF2029F012000C48F9 /* TVGemistUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3047DBE2029F012000C48F9 /* TVGemistUITests.swift */; }; F3069D71202F3FD2001D8970 /* PlayerViewController+FairPlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3069D70202F3FD2001D8970 /* PlayerViewController+FairPlay.swift */; }; - F30C5EC8202F475A001DDBEB /* LiveChannelCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F30C5EC7202F475A001DDBEB /* LiveChannelCollectionViewCell.swift */; }; - F30C5ECA202F4769001DDBEB /* LiveChannelCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F30C5EC9202F4769001DDBEB /* LiveChannelCollectionViewCell.xib */; }; + F30C5EC8202F475A001DDBEB /* LiveBroadcastCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F30C5EC7202F475A001DDBEB /* LiveBroadcastCollectionViewCell.swift */; }; + F30C5ECA202F4769001DDBEB /* LiveBroadcastCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F30C5EC9202F4769001DDBEB /* LiveBroadcastCollectionViewCell.xib */; }; F311085F2029F62E006539CA /* ProgramCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F311085D2029F62D006539CA /* ProgramCollectionViewCell.xib */; }; F31108602029F62E006539CA /* ProgramCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F311085E2029F62E006539CA /* ProgramCollectionViewCell.swift */; }; F32B5F7D202E02C700A6BE99 /* LiveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F32B5F7C202E02C700A6BE99 /* LiveViewController.swift */; }; @@ -75,8 +75,8 @@ F3047DBE2029F012000C48F9 /* TVGemistUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TVGemistUITests.swift; sourceTree = ""; }; F3047DC02029F012000C48F9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F3069D70202F3FD2001D8970 /* PlayerViewController+FairPlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PlayerViewController+FairPlay.swift"; sourceTree = ""; }; - F30C5EC7202F475A001DDBEB /* LiveChannelCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveChannelCollectionViewCell.swift; sourceTree = ""; }; - F30C5EC9202F4769001DDBEB /* LiveChannelCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LiveChannelCollectionViewCell.xib; sourceTree = ""; }; + F30C5EC7202F475A001DDBEB /* LiveBroadcastCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveBroadcastCollectionViewCell.swift; sourceTree = ""; }; + F30C5EC9202F4769001DDBEB /* LiveBroadcastCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LiveBroadcastCollectionViewCell.xib; sourceTree = ""; }; F311085D2029F62D006539CA /* ProgramCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ProgramCollectionViewCell.xib; sourceTree = ""; }; F311085E2029F62E006539CA /* ProgramCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgramCollectionViewCell.swift; sourceTree = ""; }; F32B5F7C202E02C700A6BE99 /* LiveViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveViewController.swift; sourceTree = ""; }; @@ -223,8 +223,8 @@ isa = PBXGroup; children = ( F32B5F7C202E02C700A6BE99 /* LiveViewController.swift */, - F30C5EC9202F4769001DDBEB /* LiveChannelCollectionViewCell.xib */, - F30C5EC7202F475A001DDBEB /* LiveChannelCollectionViewCell.swift */, + F30C5EC9202F4769001DDBEB /* LiveBroadcastCollectionViewCell.xib */, + F30C5EC7202F475A001DDBEB /* LiveBroadcastCollectionViewCell.swift */, ); path = Live; sourceTree = ""; @@ -428,7 +428,7 @@ F3FD1D802029F2E20099C247 /* ProgramCollectionReusableView.xib in Resources */, F3AB6CDE202CB862008A4F73 /* Localizable.strings in Resources */, F3FD1D902029F3260099C247 /* Assets.xcassets in Resources */, - F30C5ECA202F4769001DDBEB /* LiveChannelCollectionViewCell.xib in Resources */, + F30C5ECA202F4769001DDBEB /* LiveBroadcastCollectionViewCell.xib in Resources */, F311085F2029F62E006539CA /* ProgramCollectionViewCell.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -535,7 +535,7 @@ F3E2F613202EFC9600668E15 /* PlayerViewController.swift in Sources */, F3FD1D652029F2670099C247 /* UIImage+faceAwareScaling.swift in Sources */, F3FD1D732029F2CC0099C247 /* FilterTableViewCell.swift in Sources */, - F30C5EC8202F475A001DDBEB /* LiveChannelCollectionViewCell.swift in Sources */, + F30C5EC8202F475A001DDBEB /* LiveBroadcastCollectionViewCell.swift in Sources */, F3047DA42029F012000C48F9 /* TVGemist.xcdatamodeld in Sources */, F3FD1D622029F2670099C247 /* UIView+fromNib.swift in Sources */, F3FD1D592029F2450099C247 /* Utilities.swift in Sources */, @@ -719,7 +719,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 87543883403910034B7C1B7D /* Pods-TVGemistAbstract-TVGemist.debug.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_APPICON_NAME = "Brand Assets"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; @@ -736,7 +736,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 240FC968577850A907B1D347 /* Pods-TVGemistAbstract-TVGemist.release.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_APPICON_NAME = "Brand Assets"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; diff --git a/TVGemist/Info.plist b/TVGemist/Info.plist index 5a7da43..21f7659 100644 --- a/TVGemist/Info.plist +++ b/TVGemist/Info.plist @@ -15,9 +15,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.0.2 + 0.0.3 CFBundleVersion - 2 + 3 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/TVGemist/Live/LiveChannelCollectionViewCell.swift b/TVGemist/Live/LiveBroadcastCollectionViewCell.swift similarity index 85% rename from TVGemist/Live/LiveChannelCollectionViewCell.swift rename to TVGemist/Live/LiveBroadcastCollectionViewCell.swift index bcd2288..0ef2696 100644 --- a/TVGemist/Live/LiveChannelCollectionViewCell.swift +++ b/TVGemist/Live/LiveBroadcastCollectionViewCell.swift @@ -1,5 +1,5 @@ // -// LiveChannelCollectionViewCell.swift +// LiveBroadcastCollectionViewCell.swift // TVGemist // // Created by Jeroen Wesbeek on 10/02/2018. @@ -11,13 +11,13 @@ import UIKit import XCGLogger import NPOKit -class LiveChannelCollectionViewCell: UICollectionViewCell { +class LiveBroadcastCollectionViewCell: UICollectionViewCell { @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var logoImageView: UIImageView! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var nextLabel: UILabel! - static let nibName = "LiveChannelCollectionViewCell" - static let reuseIdentifier = "LiveChannelCollectionViewCellIdentifier" + static let nibName = "LiveBroadcastCollectionViewCell" + static let reuseIdentifier = "LiveBroadcastCollectionViewCellIdentifier" private var programTask: URLSessionDataTask? private var liveChannelTask: URLSessionDataTask? private var logoTask: URLSessionDataTask? @@ -69,21 +69,21 @@ class LiveChannelCollectionViewCell: UICollectionViewCell { // MARK: Configuration - func configure(withEPG epg: LiveEPG) { + func configure(with broadcast: LiveBroadcast) { // program title - nameLabel.text = epg.currentSchedule?.program.title.localizedCapitalized + nameLabel.text = broadcast.currentSchedule?.program.title.localizedCapitalized // next program - if let nextSchedule = epg.nextSchedule { + if let nextSchedule = broadcast.nextSchedule { let nextFormat = "Next: %@ - %@".localized(withComment: "Next: [time] - [program title]") nextLabel.text = String.localizedStringWithFormat(nextFormat, nextSchedule.startTime, nextSchedule.program.title) } // get the image for the current program - getImage(forEPG: epg, andSize: imageView.focusedFrameGuide.layoutFrame.size) + getImage(for: broadcast, andSize: imageView.focusedFrameGuide.layoutFrame.size) // get the channel logo for the current program - getLiveChannelLogoImage(forLiveChannel: epg.channel, andSize: logoImageView.focusedFrameGuide.layoutFrame.size) + getLiveChannelLogoImage(forLiveChannel: broadcast.channel, andSize: logoImageView.focusedFrameGuide.layoutFrame.size) } // MARK: Default image @@ -99,13 +99,13 @@ class LiveChannelCollectionViewCell: UICollectionViewCell { setNeedsLayout() } - private func getImage(forEPG epg: LiveEPG, andSize size: CGSize) { - guard let program = epg.currentSchedule?.program else { - getLiveChannelImage(forLiveChannel: epg.channel, andSize: size) + private func getImage(for broadcast: LiveBroadcast, andSize size: CGSize) { + guard let program = broadcast.currentSchedule?.program else { + getLiveChannelImage(forLiveChannel: broadcast.channel, andSize: size) return } - getProgramImage(forProgram: program, channel: epg.channel, andSize: size) + getProgramImage(forProgram: program, channel: broadcast.channel, andSize: size) } private func getProgramImage(forProgram program: Program, channel: LiveChannel, andSize size: CGSize) { diff --git a/TVGemist/Live/LiveChannelCollectionViewCell.xib b/TVGemist/Live/LiveBroadcastCollectionViewCell.xib similarity index 98% rename from TVGemist/Live/LiveChannelCollectionViewCell.xib rename to TVGemist/Live/LiveBroadcastCollectionViewCell.xib index f84216c..6fad96e 100644 --- a/TVGemist/Live/LiveChannelCollectionViewCell.xib +++ b/TVGemist/Live/LiveBroadcastCollectionViewCell.xib @@ -13,7 +13,7 @@ - + diff --git a/TVGemist/Live/LiveViewController.swift b/TVGemist/Live/LiveViewController.swift index cf9a45c..69ae5b1 100644 --- a/TVGemist/Live/LiveViewController.swift +++ b/TVGemist/Live/LiveViewController.swift @@ -30,13 +30,13 @@ class LiveViewController: UIViewController { return imageView }() - private var epgs = [LiveEPG]() + private var broadcasts = [LiveBroadcast]() override func viewDidLoad() { super.viewDidLoad() // register cells - collectionView.register(UINib(nibName: LiveChannelCollectionViewCell.nibName, bundle: nil), forCellWithReuseIdentifier: LiveChannelCollectionViewCell.reuseIdentifier) + collectionView.register(UINib(nibName: LiveBroadcastCollectionViewCell.nibName, bundle: nil), forCellWithReuseIdentifier: LiveBroadcastCollectionViewCell.reuseIdentifier) // set initial background image backgroundImageView.image = UIImage(named: "PlaceholderImage") @@ -50,16 +50,14 @@ class LiveViewController: UIViewController { // MARK: Networking private func fetchLiveChannels() { - NPOKit.shared.fetchLiveChannels { [weak self] (result) in + NPOKit.shared.fetchLiveBroadcasts { [weak self] (result) in switch result { - case .success(let components): - let epgs = components.flatMap({ $0.epg }).flatMap({ $0 }) - - if self?.epgs.count != epgs.count { - self?.epgs = epgs + case .success(let broadcasts): + if self?.broadcasts.count != broadcasts.count { + self?.broadcasts = broadcasts self?.collectionView.reloadData() } else { - self?.updateLiveChannels(with: epgs) + self?.updateBroadcasts(with: broadcasts) } case .failure(let error as NPOError): log.error("Could not fetch live channels (\(error.localizedDescription))") @@ -69,15 +67,15 @@ class LiveViewController: UIViewController { } } - private func updateLiveChannels(with epgs: [LiveEPG]) { - for epg in epgs { - guard let index = self.epgs.index(where: { $0 == epg }) else { continue } + private func updateBroadcasts(with broadcasts: [LiveBroadcast]) { + for broadcast in broadcasts { + guard let index = self.broadcasts.index(where: { $0 == broadcast }) else { continue } - self.epgs[index] = epg + self.broadcasts[index] = broadcast let indexPath = IndexPath(row: index, section: 0) - if let cell = collectionView.cellForItem(at: indexPath) as? LiveChannelCollectionViewCell { - cell.configure(withEPG: epg) + if let cell = collectionView.cellForItem(at: indexPath) as? LiveBroadcastCollectionViewCell { + cell.configure(with: broadcast) } } } @@ -90,13 +88,13 @@ extension LiveViewController: UICollectionViewDataSource { } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return epgs.count + return broadcasts.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { //swiftlint:disable:next force_cast - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: LiveChannelCollectionViewCell.reuseIdentifier, for: indexPath) as! LiveChannelCollectionViewCell - cell.configure(withEPG: epgs[indexPath.row]) + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: LiveBroadcastCollectionViewCell.reuseIdentifier, for: indexPath) as! LiveBroadcastCollectionViewCell + cell.configure(with: broadcasts[indexPath.row]) return cell } } @@ -104,15 +102,14 @@ extension LiveViewController: UICollectionViewDataSource { // MARK: UICollectionViewDelegate extension LiveViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - let liveStream = epgs[indexPath.row].channel.liveStream let playerViewController = PlayerViewController() present(playerViewController, animated: true) { - playerViewController.play(liveStream: liveStream) + playerViewController.play(broadcast: self.broadcasts[indexPath.row]) } } override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) { - guard let cell = collectionView.visibleCells.first(where: { $0.isFocused }) as? LiveChannelCollectionViewCell, let image = cell.liveChannelImage else { return } + guard let cell = collectionView.visibleCells.first(where: { $0.isFocused }) as? LiveBroadcastCollectionViewCell, let image = cell.liveChannelImage else { return } self.backgroundImageView.image = image } } diff --git a/TVGemist/Miscelaneous/Utilities.swift b/TVGemist/Miscelaneous/Utilities.swift index e5ce7c5..09f9785 100644 --- a/TVGemist/Miscelaneous/Utilities.swift +++ b/TVGemist/Miscelaneous/Utilities.swift @@ -12,6 +12,7 @@ class Utilities { static let shared = Utilities() static let isDebug = _isDebugAssertConfiguration() static let isFairPlayEnabled = false + static let areSubtitlesEnabled = false private init() { } diff --git a/TVGemist/Player/PlayerViewController.swift b/TVGemist/Player/PlayerViewController.swift index 549eff6..ee8625d 100644 --- a/TVGemist/Player/PlayerViewController.swift +++ b/TVGemist/Player/PlayerViewController.swift @@ -10,11 +10,65 @@ import Foundation import AVKit import NPOKit +// Apple says: Do not subclass AVPlayer​View​Controller. Overriding +// this class’s methods is unsupported and results in undefined behavior. +// However, this class does not override any methods, it only adds new +// behaviour but we need to keep this into mind. class PlayerViewController: AVPlayerViewController { public private(set) var fairPlayStream: FairPlayStream? + private var playbackItem: Any? + private var schedule: LiveSchedule? + private var imageTask: URLSessionDataTask? + private var shouldUpdateMetadata = true + private var secondsPlayed: Double = 0.0 + private var subtitles: [SubtitleLine]? + private var currentSubtitleLineNumber = -1 + + // display subtitles on top of player + lazy var subtitleLabel: UILabel = { + let bounds = self.view.bounds + let frame = CGRect(x: 0.0, y: 0.0, width: bounds.size.width, height: 400.0) + let label = UILabel()// UILabel(frame: frame) + + // label configuration + label.backgroundColor = UIColor.clear + label.textColor = UIColor.white + label.font = UIFont.boldSystemFont(ofSize: 45.0) + + // text positioning / wrapping + label.translatesAutoresizingMaskIntoConstraints = false + label.textAlignment = .center + label.numberOfLines = 0 + label.lineBreakMode = .byWordWrapping + + // shadow + label.layer.shadowColor = UIColor.black.cgColor + label.layer.shadowOffset = CGSize(width: 1.0, height: 1.0) + label.layer.shadowOpacity = 0.9 + label.layer.shadowRadius = 1.0 + label.layer.shouldRasterize = true + label.layer.rasterizationScale = UIScreen.main.scale + + if let overlayView = self.contentOverlayView { + // add label + overlayView.addSubview(label) + + // layout anchors + label.heightAnchor.constraint(greaterThanOrEqualToConstant: 100.0).isActive = true + label.leadingAnchor.constraint(equalTo: overlayView.leadingAnchor, constant: 200.0).isActive = true + label.trailingAnchor.constraint(equalTo: overlayView.trailingAnchor, constant: -200.0).isActive = true + label.bottomAnchor.constraint(equalTo: overlayView.bottomAnchor, constant: -50.0).isActive = true + } + + return label + }() +} - func play(liveStream: LiveStream) { - legacyPlay(liveStream: liveStream) +// MARK: Playback +extension PlayerViewController { + public func play(broadcast: LiveBroadcast) { + self.playbackItem = broadcast + legacyPlay(liveStream: broadcast.channel.liveStream) } private func legacyPlay(liveStream: LiveStream) { @@ -34,7 +88,12 @@ class PlayerViewController: AVPlayerViewController { } } - func play(episode: Episode) { + public func play(episode: Episode) { + self.playbackItem = episode + + // fetch subtitles in case we need them + fetchSubtitles(for: episode) + guard Utilities.isFairPlayEnabled else { legacyPlay(episode: episode) return @@ -44,7 +103,7 @@ class PlayerViewController: AVPlayerViewController { switch result { case .success(let fairPlayStream): self?.fairPlayStream = fairPlayStream - dump(fairPlayStream) + //dump(fairPlayStream) self?.play(url: fairPlayStream.url) case .failure(let error as NPOError): log.error("Could not fetch playlist for episode (\(error.localizedDescription))") @@ -70,13 +129,179 @@ class PlayerViewController: AVPlayerViewController { private func play(url: URL) { let asset = AVURLAsset(url: url, options: nil) + let queue = DispatchQueue(label: "eu.osx.tvos.NPO.assetqueue") asset.resourceLoader.setDelegate(self, queue: queue) + let playerItem = AVPlayerItem(asset: asset) + let player = AVPlayer(playerItem: playerItem) player.actionAtItemEnd = .pause player.automaticallyWaitsToMinimizeStalling = true + + // periodic observer + let interval = CMTimeMakeWithSeconds(0.5, 60) // half a second + player.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main) { [weak self] (time) in + self?.secondsPlayed = time.seconds + self?.displaySubtitle(at: time) + self?.updateAVMetadata() + } + self.player = player player.play() } } + +// MARK: Metadata +extension PlayerViewController { + private func updateAVMetadata() { + if let episode = playbackItem as? Episode { + updateAVMetadata(for: episode) + } else if let broadcast = playbackItem as? LiveBroadcast { + updateBroadcastIfNeeded(for: broadcast) + updateAVMetadata(for: broadcast) + } + } + + private func updateAVMetadata(for episode: Episode) { + guard shouldUpdateMetadata else { return } + + // we only need to set this one + shouldUpdateMetadata = false + + // construct metadata + let metadata: [AVMetadataKey: Any?] = [ + .commonKeyTitle: episode.title, + .commonKeyDescription: episode.description, + .commonKeyPublisher: episode.broadcasters.joined(separator: ", ") + ] + + // set initial metadata while fetching the image + player?.currentItem?.externalMetadata = avMetadata(from: metadata) + + // and update with artwork (if possible) + updateAVMetadata(for: episode, alternativeItem: nil, metadata: metadata) + } + + private func updateBroadcastIfNeeded(for broadcast: LiveBroadcast) { + guard let endDate = schedule?.ends, Date() > endDate else { return } + + shouldUpdateMetadata = true + } + + private func updateAVMetadata(for broadcast: LiveBroadcast) { + guard shouldUpdateMetadata, let currentSchedule = broadcast.currentSchedule else { return } + + shouldUpdateMetadata = false + schedule = currentSchedule + + let program = currentSchedule.program + + // construct metadata + var metadata: [AVMetadataKey: Any?] = [ + .commonKeyTitle: program.episodeTitle ?? program.title, + .commonKeyPublisher: program.broadcasters.joined(separator: ", ") + ] + + if let description = program.description { + metadata[.commonKeyDescription] = description + } + + // and update with artwork (if possible) + updateAVMetadata(for: program, alternativeItem: broadcast.channel, metadata: metadata) + } + + private func updateAVMetadata(for item: ImageFetchable, alternativeItem: ImageFetchable?, metadata: [AVMetadataKey: Any?]) { + // fetch image + imageTask = NPOKit.shared.fetchCollectionImage(for: item) { [weak self] (result) in + guard case let .success(image, task) = result, task == self?.imageTask, let strongSelf = self else { + if let item = alternativeItem { + self?.updateAVMetadata(for: item, alternativeItem: nil, metadata: metadata) + } + return + } + + var mutableMetadata = metadata + mutableMetadata[.commonKeyArtwork] = image + strongSelf.player?.currentItem?.externalMetadata = strongSelf.avMetadata(from: mutableMetadata) + } + } + + private func avMetadata(from dictionary: [AVMetadataKey: Any?]) -> [AVMetadataItem] { + var metadata = [AVMetadataItem]() + + for (key, value) in dictionary { + let metadataItem = AVMutableMetadataItem() + metadataItem.locale = NSLocale.current + metadataItem.key = key as (NSCopying & NSObjectProtocol)? + metadataItem.keySpace = .common + + switch key { + case .commonKeyArtwork: + guard let image = value as? UIImage else { continue } + metadataItem.dataType = kCMMetadataBaseDataType_JPEG as String + metadataItem.value = UIImageJPEGRepresentation(image, 1) as (NSCopying & NSObjectProtocol)? + default: + guard let text = value as? String else { continue } + metadataItem.value = text as (NSCopying & NSObjectProtocol)? + } + + metadata.append(metadataItem) + } + + return metadata + } +} + +// MARK: Subtitles +extension PlayerViewController { + var areSubtitlesEnabled: Bool { + guard let asset = player?.currentItem?.asset, let mediaSelection = player?.currentItem?.currentMediaSelection else { return false } + + for characteristic in asset.availableMediaCharacteristicsWithMediaSelectionOptions { + guard characteristic == .legible, let group = asset.mediaSelectionGroup(forMediaCharacteristic: characteristic) else { continue } + let option = mediaSelection.selectedMediaOption(in: group) + return option != nil + } + + return false + } + + private func fetchSubtitles(for episode: Episode) { + // fetch subtitles + NPOKit.shared.fetchSubtitle(for: episode) { [weak self] (result) in + switch result { + case .success(let subtitles): + self?.subtitles = subtitles + case .failure(let error as NPOError): + log.error("Could not fetch playlist for episode (\(error.localizedDescription))") + case.failure(let error): + log.error("Could not fetch playlist for episode (\(error.localizedDescription))") + } + } + } + + private func displaySubtitle(at time: CMTime) { + // check if we have subtitles + guard let subtitles = subtitles, areSubtitlesEnabled else { + if subtitleLabel.text != nil { + subtitleLabel.text = nil + } + return + } + + // check if we have a subtitle for this time + guard let line = subtitles.first(where: { $0.to >= time.seconds && $0.from <= time.seconds }) else { + subtitleLabel.text = nil + return + } + + // check if this line is already being displayed + guard line.number > currentSubtitleLineNumber else { return } + + log.verbose("subtitle line \(line.number): \(line.text)") + + currentSubtitleLineNumber = line.number + subtitleLabel.text = line.text + } +} diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json deleted file mode 100644 index 4d05459..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "layers" : [ - { - "filename" : "gemist.imagestacklayer" - }, - { - "filename" : "npo-logo-front.imagestacklayer" - }, - { - "filename" : "npo-logo-back.imagestacklayer" - }, - { - "filename" : "layer-3.imagestacklayer" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "canvasSize" : { - "width" : 1280, - "height" : 768 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gemist.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gemist.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 9bb75bb..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gemist.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "gemist.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gemist.imagestacklayer/Content.imageset/gemist.png b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gemist.imagestacklayer/Content.imageset/gemist.png deleted file mode 100644 index 7484ea1..0000000 Binary files a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gemist.imagestacklayer/Content.imageset/gemist.png and /dev/null differ diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gemist.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gemist.imagestacklayer/Contents.json deleted file mode 100644 index d6149b1..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/gemist.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 437, - "height" : 103 - }, - "frame-center" : { - "x" : 888.5, - "y" : 365.5 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/layer-3.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/layer-3.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index f904e28..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/layer-3.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "layer-3.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/layer-3.imagestacklayer/Content.imageset/layer-3.png b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/layer-3.imagestacklayer/Content.imageset/layer-3.png deleted file mode 100644 index 30c7c7c..0000000 Binary files a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/layer-3.imagestacklayer/Content.imageset/layer-3.png and /dev/null differ diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/layer-3.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/layer-3.imagestacklayer/Contents.json deleted file mode 100644 index 754bf03..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/layer-3.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 1280, - "height" : 768 - }, - "frame-center" : { - "x" : 640, - "y" : 384 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-back.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-back.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index a723412..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-back.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "npo-logo-back.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-back.imagestacklayer/Content.imageset/npo-logo-back.png b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-back.imagestacklayer/Content.imageset/npo-logo-back.png deleted file mode 100644 index dc75d12..0000000 Binary files a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-back.imagestacklayer/Content.imageset/npo-logo-back.png and /dev/null differ diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-back.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-back.imagestacklayer/Contents.json deleted file mode 100644 index de1c23a..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-back.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 665, - "height" : 665 - }, - "frame-center" : { - "x" : 640.5, - "y" : 384.5 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-front.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-front.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index f1b2d44..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-front.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "npo-logo-front.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-front.imagestacklayer/Content.imageset/npo-logo-front.png b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-front.imagestacklayer/Content.imageset/npo-logo-front.png deleted file mode 100644 index c01a8c9..0000000 Binary files a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-front.imagestacklayer/Content.imageset/npo-logo-front.png and /dev/null differ diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-front.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-front.imagestacklayer/Contents.json deleted file mode 100644 index 9430aae..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/npo-logo-front.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 344, - "height" : 357 - }, - "frame-center" : { - "x" : 537, - "y" : 285.5 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json deleted file mode 100644 index 91b5ba7..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "layers" : [ - { - "filename" : "gemist.imagestacklayer" - }, - { - "filename" : "npo-logo-front.imagestacklayer" - }, - { - "filename" : "npo-logo-back.imagestacklayer" - }, - { - "filename" : "layer-3.imagestacklayer" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "canvasSize" : { - "width" : 400, - "height" : 240 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gemist.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gemist.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 9bb75bb..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gemist.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "gemist.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gemist.imagestacklayer/Content.imageset/gemist.png b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gemist.imagestacklayer/Content.imageset/gemist.png deleted file mode 100644 index cecdf32..0000000 Binary files a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gemist.imagestacklayer/Content.imageset/gemist.png and /dev/null differ diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gemist.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gemist.imagestacklayer/Contents.json deleted file mode 100644 index e7f12a6..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/gemist.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 136, - "height" : 32 - }, - "frame-center" : { - "x" : 278, - "y" : 114 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/layer-3.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/layer-3.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index f904e28..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/layer-3.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "layer-3.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/layer-3.imagestacklayer/Content.imageset/layer-3.png b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/layer-3.imagestacklayer/Content.imageset/layer-3.png deleted file mode 100644 index c8e7101..0000000 Binary files a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/layer-3.imagestacklayer/Content.imageset/layer-3.png and /dev/null differ diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/layer-3.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/layer-3.imagestacklayer/Contents.json deleted file mode 100644 index 176551e..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/layer-3.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 400, - "height" : 240 - }, - "frame-center" : { - "x" : 200, - "y" : 120 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-back.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-back.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index a723412..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-back.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "npo-logo-back.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-back.imagestacklayer/Content.imageset/npo-logo-back.png b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-back.imagestacklayer/Content.imageset/npo-logo-back.png deleted file mode 100644 index a6c5a0f..0000000 Binary files a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-back.imagestacklayer/Content.imageset/npo-logo-back.png and /dev/null differ diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-back.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-back.imagestacklayer/Contents.json deleted file mode 100644 index d10a778..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-back.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 209, - "height" : 209 - }, - "frame-center" : { - "x" : 200.5, - "y" : 120.5 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-front.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-front.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index f1b2d44..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-front.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "npo-logo-front.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-front.imagestacklayer/Content.imageset/npo-logo-front.png b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-front.imagestacklayer/Content.imageset/npo-logo-front.png deleted file mode 100644 index 3ccd9fa..0000000 Binary files a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-front.imagestacklayer/Content.imageset/npo-logo-front.png and /dev/null differ diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-front.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-front.imagestacklayer/Contents.json deleted file mode 100644 index 38b34e1..0000000 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/npo-logo-front.imagestacklayer/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "frame-size" : { - "width" : 108, - "height" : 112 - }, - "frame-center" : { - "x" : 168, - "y" : 89 - } - } -} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..48ecb4f --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,11 @@ +{ + "images" : [ + { + "idiom" : "tv" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Contents.json new file mode 100644 index 0000000..d29f024 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..48ecb4f --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,11 @@ +{ + "images" : [ + { + "idiom" : "tv" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..48ecb4f --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,11 @@ +{ + "images" : [ + { + "idiom" : "tv" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..eb9f159 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "tv", + "filename" : "layer0@1x.png", + "scale" : "1x" + }, + { + "idiom" : "tv", + "filename" : "layer0@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/layer0@1x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/layer0@1x.png new file mode 100644 index 0000000..463e3ce Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/layer0@1x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/layer0@2x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/layer0@2x.png new file mode 100644 index 0000000..0641e64 Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/layer0@2x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Contents.json new file mode 100644 index 0000000..adc2193 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Contents.json @@ -0,0 +1,23 @@ +{ + "layers" : [ + { + "filename" : "Text front.imagestacklayer" + }, + { + "filename" : "Text back.imagestacklayer" + }, + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..d6f73ea --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "tv", + "filename" : "layer2@1x.png", + "scale" : "1x" + }, + { + "idiom" : "tv", + "filename" : "layer2@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/layer2@1x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/layer2@1x.png new file mode 100644 index 0000000..b8c4049 Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/layer2@1x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/layer2@2x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/layer2@2x.png new file mode 100644 index 0000000..b6aa661 Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/layer2@2x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..aad1950 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "tv", + "filename" : "layer1@1x.png", + "scale" : "1x" + }, + { + "idiom" : "tv", + "filename" : "layer1@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/layer1@1x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/layer1@1x.png new file mode 100644 index 0000000..bc30231 Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/layer1@1x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/layer1@2x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/layer1@2x.png new file mode 100644 index 0000000..6f17f88 Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/layer1@2x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..b6f798e --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "tv", + "filename" : "layer3@1x.png", + "scale" : "1x" + }, + { + "idiom" : "tv", + "filename" : "layer3@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Content.imageset/layer3@1x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Content.imageset/layer3@1x.png new file mode 100644 index 0000000..ce076cf Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Content.imageset/layer3@1x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Content.imageset/layer3@2x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Content.imageset/layer3@2x.png new file mode 100644 index 0000000..9397c7b Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Content.imageset/layer3@2x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Content.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..598848d --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "tv", + "filename" : "layer4@1x.png", + "scale" : "1x" + }, + { + "idiom" : "tv", + "filename" : "layer4@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Content.imageset/layer4@1x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Content.imageset/layer4@1x.png new file mode 100644 index 0000000..45236e1 Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Content.imageset/layer4@1x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Content.imageset/layer4@2x.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Content.imageset/layer4@2x.png new file mode 100644 index 0000000..ee6c056 Binary files /dev/null and b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Content.imageset/layer4@2x.png differ diff --git a/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Text front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/Contents.json similarity index 84% rename from TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json rename to TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/Contents.json index dea6e49..db288f3 100644 --- a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +++ b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/Contents.json @@ -3,13 +3,13 @@ { "size" : "1280x768", "idiom" : "tv", - "filename" : "App Icon - Large.imagestack", + "filename" : "App Icon - App Store.imagestack", "role" : "primary-app-icon" }, { "size" : "400x240", "idiom" : "tv", - "filename" : "App Icon - Small.imagestack", + "filename" : "App Icon.imagestack", "role" : "primary-app-icon" }, { diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image Wide.imageset/Contents.json similarity index 100% rename from TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json rename to TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image Wide.imageset/Contents.json diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/TVGemist-TopShelf-Wide-2320x720.png b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image Wide.imageset/TVGemist-TopShelf-Wide-2320x720.png similarity index 100% rename from TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/TVGemist-TopShelf-Wide-2320x720.png rename to TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image Wide.imageset/TVGemist-TopShelf-Wide-2320x720.png diff --git a/TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image.imageset/Contents.json similarity index 100% rename from TVGemist/Resourses/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json rename to TVGemist/Resourses/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image.imageset/Contents.json