From ce1eb35c627db2f85c46a6b60ab997c3d82e2548 Mon Sep 17 00:00:00 2001 From: Igor Palaguta Date: Wed, 15 Apr 2020 12:20:43 +0300 Subject: [PATCH 1/7] Refine folder structure --- Cartfile | 1 + Cartfile.private | 3 + Cartfile.resolved | 4 + Example/AppDelegate.swift | 12 + .../Base.lproj/LaunchScreen.xib | 0 .../Base.lproj/Main.storyboard | 0 .../Cells/ChannelCell.swift | 1 + .../Cells/PlaylistCell.swift | 1 + .../Cells/PlaylistItemCell.swift | 1 + .../{YoutubeEngine => }/Cells/VideoCell.swift | 0 Example/DisplayItem.swift | 22 + .../AppIcon.appiconset/Contents.json | 0 Example/Info.plist | 39 + Example/ItemsProvider.swift | 53 + Example/ItemsViewController.swift | 129 ++ Example/ItemsViewModel.swift | 24 + Example/Podfile | 18 - Example/Podfile.lock | 55 - .../YoutubeEngine.xcodeproj/project.pbxproj | 679 -------- .../contents.xcworkspacedata | 10 - Example/YoutubeViewController.swift | 65 + Source/YoutubeEngine/Data/Image.swift | 1 + Tests/Info.plist | 24 + YoutubeEngine.xcodeproj/project.pbxproj | 1388 +++++++++++++++++ .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/YoutubeEngine.xcscheme | 50 +- YoutubeEngine/Info.plist | 22 + YoutubeEngine/YoutubeEngine.h | 19 + 29 files changed, 1825 insertions(+), 804 deletions(-) create mode 100644 Cartfile create mode 100644 Cartfile.private create mode 100644 Cartfile.resolved create mode 100644 Example/AppDelegate.swift rename Example/{YoutubeEngine => }/Base.lproj/LaunchScreen.xib (100%) rename Example/{YoutubeEngine => }/Base.lproj/Main.storyboard (100%) rename Example/{YoutubeEngine => }/Cells/ChannelCell.swift (99%) rename Example/{YoutubeEngine => }/Cells/PlaylistCell.swift (98%) rename Example/{YoutubeEngine => }/Cells/PlaylistItemCell.swift (97%) rename Example/{YoutubeEngine => }/Cells/VideoCell.swift (100%) create mode 100644 Example/DisplayItem.swift rename Example/{YoutubeEngine => }/Images.xcassets/AppIcon.appiconset/Contents.json (100%) create mode 100644 Example/Info.plist create mode 100644 Example/ItemsProvider.swift create mode 100644 Example/ItemsViewController.swift create mode 100644 Example/ItemsViewModel.swift delete mode 100644 Example/Podfile delete mode 100644 Example/Podfile.lock delete mode 100644 Example/YoutubeEngine.xcodeproj/project.pbxproj delete mode 100644 Example/YoutubeEngine.xcworkspace/contents.xcworkspacedata create mode 100644 Example/YoutubeViewController.swift create mode 100644 Tests/Info.plist create mode 100644 YoutubeEngine.xcodeproj/project.pbxproj rename {Example/YoutubeEngine.xcodeproj => YoutubeEngine.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (100%) create mode 100644 YoutubeEngine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename Example/YoutubeEngine.xcodeproj/xcshareddata/xcschemes/YoutubeEngine-Example.xcscheme => YoutubeEngine.xcodeproj/xcshareddata/xcschemes/YoutubeEngine.xcscheme (57%) create mode 100644 YoutubeEngine/Info.plist create mode 100644 YoutubeEngine/YoutubeEngine.h diff --git a/Cartfile b/Cartfile new file mode 100644 index 0000000..a0fb0df --- /dev/null +++ b/Cartfile @@ -0,0 +1 @@ +github "ReactiveCocoa/ReactiveSwift" ~> 6.0 diff --git a/Cartfile.private b/Cartfile.private new file mode 100644 index 0000000..573df08 --- /dev/null +++ b/Cartfile.private @@ -0,0 +1,3 @@ +github "Quick/Nimble" ~> 8.0 +github "AliSoftware/OHHTTPStubs" ~> 9.0 +github "onevcat/Kingfisher" ~> 5.0 diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100644 index 0000000..bf0dee5 --- /dev/null +++ b/Cartfile.resolved @@ -0,0 +1,4 @@ +github "AliSoftware/OHHTTPStubs" "9.0.0" +github "Quick/Nimble" "v8.0.7" +github "ReactiveCocoa/ReactiveSwift" "6.2.1" +github "onevcat/Kingfisher" "5.13.4" diff --git a/Example/AppDelegate.swift b/Example/AppDelegate.swift new file mode 100644 index 0000000..1cda0d9 --- /dev/null +++ b/Example/AppDelegate.swift @@ -0,0 +1,12 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + return true + } +} diff --git a/Example/YoutubeEngine/Base.lproj/LaunchScreen.xib b/Example/Base.lproj/LaunchScreen.xib similarity index 100% rename from Example/YoutubeEngine/Base.lproj/LaunchScreen.xib rename to Example/Base.lproj/LaunchScreen.xib diff --git a/Example/YoutubeEngine/Base.lproj/Main.storyboard b/Example/Base.lproj/Main.storyboard similarity index 100% rename from Example/YoutubeEngine/Base.lproj/Main.storyboard rename to Example/Base.lproj/Main.storyboard diff --git a/Example/YoutubeEngine/Cells/ChannelCell.swift b/Example/Cells/ChannelCell.swift similarity index 99% rename from Example/YoutubeEngine/Cells/ChannelCell.swift rename to Example/Cells/ChannelCell.swift index d5506b6..be781f9 100644 --- a/Example/YoutubeEngine/Cells/ChannelCell.swift +++ b/Example/Cells/ChannelCell.swift @@ -1,5 +1,6 @@ import Foundation import Kingfisher +import UIKit import YoutubeEngine final class ChannelCell: UITableViewCell { diff --git a/Example/YoutubeEngine/Cells/PlaylistCell.swift b/Example/Cells/PlaylistCell.swift similarity index 98% rename from Example/YoutubeEngine/Cells/PlaylistCell.swift rename to Example/Cells/PlaylistCell.swift index 6755a9c..c049c74 100644 --- a/Example/YoutubeEngine/Cells/PlaylistCell.swift +++ b/Example/Cells/PlaylistCell.swift @@ -1,5 +1,6 @@ import Foundation import Kingfisher +import UIKit import YoutubeEngine final class PlaylistCell: UITableViewCell { diff --git a/Example/YoutubeEngine/Cells/PlaylistItemCell.swift b/Example/Cells/PlaylistItemCell.swift similarity index 97% rename from Example/YoutubeEngine/Cells/PlaylistItemCell.swift rename to Example/Cells/PlaylistItemCell.swift index 564e26c..d471eff 100644 --- a/Example/YoutubeEngine/Cells/PlaylistItemCell.swift +++ b/Example/Cells/PlaylistItemCell.swift @@ -1,5 +1,6 @@ import Foundation import Kingfisher +import UIKit import YoutubeEngine final class PlaylistItemCell: UITableViewCell { diff --git a/Example/YoutubeEngine/Cells/VideoCell.swift b/Example/Cells/VideoCell.swift similarity index 100% rename from Example/YoutubeEngine/Cells/VideoCell.swift rename to Example/Cells/VideoCell.swift diff --git a/Example/DisplayItem.swift b/Example/DisplayItem.swift new file mode 100644 index 0000000..36a97c6 --- /dev/null +++ b/Example/DisplayItem.swift @@ -0,0 +1,22 @@ +import Foundation +import YoutubeEngine + +enum DisplayItem { + case channel(Channel) + case video(Video) + case playlistItem(PlaylistItem) + case playlist(Playlist) +} + +extension SearchItem { + var displayItem: DisplayItem { + switch self { + case .channel(let channel): + return .channel(channel) + case .video(let video): + return .video(video) + case .playlist(let playlist): + return .playlist(playlist) + } + } +} diff --git a/Example/YoutubeEngine/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Example/YoutubeEngine/Images.xcassets/AppIcon.appiconset/Contents.json rename to Example/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/Example/Info.plist b/Example/Info.plist new file mode 100644 index 0000000..eb18faa --- /dev/null +++ b/Example/Info.plist @@ -0,0 +1,39 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + + + diff --git a/Example/ItemsProvider.swift b/Example/ItemsProvider.swift new file mode 100644 index 0000000..9f0ae45 --- /dev/null +++ b/Example/ItemsProvider.swift @@ -0,0 +1,53 @@ +import Foundation +import ReactiveSwift +import YoutubeEngine + +protocol ItemsProviders { + associatedtype Item + + var items: Property<[Item]> { get } + var isLoadingPage: Bool { get } + var pageLoader: SignalProducer? { get } +} + +final class AnyItemsProvider: ItemsProviders { + typealias PageLoader = (_ pageToken: String?, _ limit: Int) -> SignalProducer<([Item], String?), NSError> + + let items: Property<[Item]> + private(set) var isLoadingPage = false + + private let _pageLoader: PageLoader + private var nextPageToken: String? + private let mutableItems = MutableProperty<[Item]?>(nil) + + init(pageLoader: @escaping PageLoader) { + self._pageLoader = pageLoader + self.items = mutableItems.map { $0 ?? [] } + } + + var pageLoader: SignalProducer? { + if isLoadingPage { + return nil + } + + // Nothing for this keyword + if mutableItems.value != nil && nextPageToken == nil { + return nil + } + + return _pageLoader(nextPageToken, 20) + .on(value: { items, token in + self.nextPageToken = token + self.mutableItems.value = self.items.value + items + }) + .map { _ in () } + .on( + started: { + self.isLoadingPage = true + }, + terminated: { + self.isLoadingPage = false + } + ) + } +} diff --git a/Example/ItemsViewController.swift b/Example/ItemsViewController.swift new file mode 100644 index 0000000..f148c7b --- /dev/null +++ b/Example/ItemsViewController.swift @@ -0,0 +1,129 @@ +import ReactiveSwift +import UIKit +import YoutubeEngine + +final class ItemsViewController: UITableViewController { + + @IBOutlet private var searchBar: UISearchBar! + + let model = MutableItemsViewModel() + + override func viewDidLoad() { + super.viewDidLoad() + + tableView.keyboardDismissMode = .onDrag + + model + .provider + .producer + .flatMap(.latest) { provider -> SignalProducer in + if let pageLoader = provider?.pageLoader { + return pageLoader + .on(failed: { [weak self] error in + self?.presentError(error) + }) + .flatMapError { _ in .empty } + } + return .empty + } + .startWithCompleted {} + + model + .provider + .producer.flatMap(.latest) { provider -> SignalProducer<[DisplayItem], Never> in + guard let provider = provider else { + return SignalProducer(value: []) + } + + return provider.items.producer + } + .startWithValues { [weak self] _ in + self?.tableView.reloadData() + } + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return model.items.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let item = model.items[indexPath.row] + switch item { + case .channel(let channel): + // swiftlint:disable:next force_cast + let cell = tableView.dequeueReusableCell(withIdentifier: "ChannelCell", for: indexPath) as! ChannelCell + cell.channel = channel + return cell + case .video(let video): + // swiftlint:disable:next force_cast + let cell = tableView.dequeueReusableCell(withIdentifier: "VideoCell", for: indexPath) as! VideoCell + cell.video = video + return cell + case .playlist(let playlist): + // swiftlint:disable:next force_cast + let cell = tableView.dequeueReusableCell(withIdentifier: "PlaylistCell", for: indexPath) as! PlaylistCell + cell.playlist = playlist + return cell + case .playlistItem(let playlistItem): + // swiftlint:disable:next force_cast + let cell = tableView.dequeueReusableCell(withIdentifier: "PlaylistItemCell", for: indexPath) as! PlaylistItemCell + cell.playlistItem = playlistItem + return cell + } + } + + override func scrollViewDidScroll(_ scrollView: UIScrollView) { + guard let provider = model.provider.value, !provider.items.value.isEmpty && !provider.isLoadingPage else { + return + } + + let lastCellIndexPath = IndexPath(row: provider.items.value.count - 1, section: 0) + if tableView.cellForRow(at: lastCellIndexPath) == nil { + return + } + + provider.pageLoader?.startWithFailed { [weak self] error in + self?.presentError(error) + } + } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + guard let destinationController = segue.destination as? ItemsViewController else { + return + } + + if let cell = sender as? ChannelCell, let channel = cell.channel { + // swiftlint:disable:next force_unwrapping + destinationController.title = channel.snippet!.title + destinationController.model.mutableProvider.value = AnyItemsProvider { token, limit in + let request: SearchRequest = .videosFromChannel(withID: channel.id, + requiredParts: [.statistics, .contentDetails], + limit: limit, + pageToken: token) + return Engine.defaultEngine + .search(request) + .map { page in (page.items.map { $0.displayItem }, page.nextPageToken) } + } + } else if let cell = sender as? PlaylistCell, let playlist = cell.playlist { + // swiftlint:disable:next force_unwrapping + destinationController.title = playlist.snippet!.title + destinationController.model.mutableProvider.value = AnyItemsProvider { token, limit in + let request: PlaylistItemRequest = .itemsFromPlaylist(withID: playlist.id, + requiredParts: [.snippet], + limit: limit, + pageToken: token) + return Engine.defaultEngine + .playlistItems(request) + .map { page in (page.items.map { .playlistItem($0) }, page.nextPageToken) } + } + } + } + + private func presentError(_ error: NSError) { + let alert = UIAlertController(title: "Request failed", + message: error.localizedDescription, + preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil)) + present(alert, animated: true, completion: nil) + } +} diff --git a/Example/ItemsViewModel.swift b/Example/ItemsViewModel.swift new file mode 100644 index 0000000..736d258 --- /dev/null +++ b/Example/ItemsViewModel.swift @@ -0,0 +1,24 @@ +import Foundation +import ReactiveSwift + +protocol ItemsViewModel { + associatedtype Item + + var provider: Property?> { get } +} + +extension ItemsViewModel { + var items: [Item] { + return provider.value?.items.value ?? [] + } +} + +final class MutableItemsViewModel: ItemsViewModel { + let provider: Property?> + let mutableProvider: MutableProperty?> + + init() { + self.mutableProvider = MutableProperty(nil) + self.provider = Property(mutableProvider) + } +} diff --git a/Example/Podfile b/Example/Podfile deleted file mode 100644 index cb8aa69..0000000 --- a/Example/Podfile +++ /dev/null @@ -1,18 +0,0 @@ -use_frameworks! - -platform :ios, '10.0' - -target 'YoutubeEngine_Example' do - pod 'YoutubeEngine', :path => '../' - pod 'Kingfisher', '~> 5.0' - pod 'ReactiveSwift' - pod 'SwiftLint' - -target 'YoutubeEngine_Tests' do - inherit! :search_paths - - pod 'Nimble', '~> 8.0' - pod 'OHHTTPStubs/NSURLSession', '~> 9.0' - pod 'OHHTTPStubs/Swift', '~> 9.0' - end -end diff --git a/Example/Podfile.lock b/Example/Podfile.lock deleted file mode 100644 index ae1d38a..0000000 --- a/Example/Podfile.lock +++ /dev/null @@ -1,55 +0,0 @@ -PODS: - - Kingfisher (5.13.4): - - Kingfisher/Core (= 5.13.4) - - Kingfisher/Core (5.13.4) - - Nimble (8.0.7) - - OHHTTPStubs/Core (9.0.0) - - OHHTTPStubs/Default (9.0.0): - - OHHTTPStubs/Core - - OHHTTPStubs/JSON - - OHHTTPStubs/NSURLSession - - OHHTTPStubs/OHPathHelpers - - OHHTTPStubs/JSON (9.0.0): - - OHHTTPStubs/Core - - OHHTTPStubs/NSURLSession (9.0.0): - - OHHTTPStubs/Core - - OHHTTPStubs/OHPathHelpers (9.0.0) - - OHHTTPStubs/Swift (9.0.0): - - OHHTTPStubs/Default - - ReactiveSwift (6.2.1) - - SwiftLint (0.39.2) - - YoutubeEngine (0.5.0): - - ReactiveSwift (~> 6.0) - -DEPENDENCIES: - - Kingfisher (~> 5.0) - - Nimble (~> 8.0) - - OHHTTPStubs/NSURLSession (~> 9.0) - - OHHTTPStubs/Swift (~> 9.0) - - ReactiveSwift - - SwiftLint - - YoutubeEngine (from `../`) - -SPEC REPOS: - trunk: - - Kingfisher - - Nimble - - OHHTTPStubs - - ReactiveSwift - - SwiftLint - -EXTERNAL SOURCES: - YoutubeEngine: - :path: "../" - -SPEC CHECKSUMS: - Kingfisher: d2279a7abece3c7f25a80cd2b7f363ca5cf3f44c - Nimble: a73af6ecd4c9106f434f3d55fc54570be3739e0b - OHHTTPStubs: cb29d2a9d09a828ecb93349a2b0c64f99e0db89f - ReactiveSwift: 07ddf579f4eb3ee3bd656214f0461aaf2c0fd639 - SwiftLint: 22ccbbe3b8008684be5955693bab135e0ed6a447 - YoutubeEngine: eb2e424f00d65394c5745239360c85ee9ae859b8 - -PODFILE CHECKSUM: deadada36ec0e8e1ea52cbb6a4e03e681ae34039 - -COCOAPODS: 1.9.1 diff --git a/Example/YoutubeEngine.xcodeproj/project.pbxproj b/Example/YoutubeEngine.xcodeproj/project.pbxproj deleted file mode 100644 index 319ea61..0000000 --- a/Example/YoutubeEngine.xcodeproj/project.pbxproj +++ /dev/null @@ -1,679 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 4CBFCAE78E94B07A4DB3738C /* Pods_YoutubeEngine_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EE5F90365E539B389A381FD /* Pods_YoutubeEngine_Tests.framework */; }; - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; - 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; - 6AD72904AE22167FE0C08F72 /* Pods_YoutubeEngine_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73F4BD16F020572BB41C1439 /* Pods_YoutubeEngine_Example.framework */; }; - 781422EC1D87EA8600EDC04F /* VideoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 781422EB1D87EA8600EDC04F /* VideoCell.swift */; }; - 7860487E1D87F36400677773 /* ItemsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7860487D1D87F36400677773 /* ItemsViewController.swift */; }; - 786048821D87F80A00677773 /* ItemsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 786048811D87F80A00677773 /* ItemsProvider.swift */; }; - 78715C3C1D901E7000830ECC /* ItemsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78715C3B1D901E7000830ECC /* ItemsViewModel.swift */; }; - 78715C3E1D90409500830ECC /* YoutubeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78715C3D1D90409500830ECC /* YoutubeViewController.swift */; }; - 789000711D8800EA00F794B2 /* ChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789000701D8800EA00F794B2 /* ChannelCell.swift */; }; - 78C35B3D1E23C08B009AC4D3 /* EngineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78C35B2E1E23C04B009AC4D3 /* EngineTests.swift */; }; - 78C35B3E1E23C08B009AC4D3 /* ISO8601DurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78C35B2F1E23C04B009AC4D3 /* ISO8601DurationTests.swift */; }; - 78C35B3F1E23C08F009AC4D3 /* channels_search.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B311E23C04B009AC4D3 /* channels_search.json */; }; - 78C35B401E23C08F009AC4D3 /* channels_VEVO.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B321E23C04B009AC4D3 /* channels_VEVO.json */; }; - 78C35B411E23C08F009AC4D3 /* error.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B331E23C04B009AC4D3 /* error.json */; }; - 78C35B421E23C08F009AC4D3 /* search_VEVO.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B341E23C04B009AC4D3 /* search_VEVO.json */; }; - 78C35B431E23C08F009AC4D3 /* videos_VEVO.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B351E23C04B009AC4D3 /* videos_VEVO.json */; }; - 8246B76B2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B76A2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift */; }; - 8246B7702445A16E00AEAEC6 /* PlaylistCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B76F2445A16D00AEAEC6 /* PlaylistCell.swift */; }; - 8246B77A2445ADAF00AEAEC6 /* DisplayItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B7792445ADAF00AEAEC6 /* DisplayItem.swift */; }; - 8246B77D2445B43500AEAEC6 /* PlaylistItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B77C2445B43500AEAEC6 /* PlaylistItemCell.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 2063A3FE0061518315DC9DB2 /* Pods-YoutubeEngine_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-YoutubeEngine_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-YoutubeEngine_Tests/Pods-YoutubeEngine_Tests.release.xcconfig"; sourceTree = ""; }; - 3EE5F90365E539B389A381FD /* Pods_YoutubeEngine_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_YoutubeEngine_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 471C4D010C7676E74238A93F /* Pods-YoutubeEngine_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-YoutubeEngine_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-YoutubeEngine_Example/Pods-YoutubeEngine_Example.debug.xcconfig"; sourceTree = ""; }; - 549BC97E4CF785F948069942 /* Pods-YoutubeEngine_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-YoutubeEngine_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-YoutubeEngine_Tests/Pods-YoutubeEngine_Tests.debug.xcconfig"; sourceTree = ""; }; - 58112E5178EA437FAE073E43 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; - 607FACD01AFB9204008FA782 /* YoutubeEngine_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = YoutubeEngine_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 607FACE51AFB9204008FA782 /* YoutubeEngine_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = YoutubeEngine_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 73F4BD16F020572BB41C1439 /* Pods_YoutubeEngine_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_YoutubeEngine_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 76C9D9FADA805D499DA15B12 /* Pods-YoutubeEngine_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-YoutubeEngine_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-YoutubeEngine_Example/Pods-YoutubeEngine_Example.release.xcconfig"; sourceTree = ""; }; - 781422EB1D87EA8600EDC04F /* VideoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoCell.swift; sourceTree = ""; }; - 7860487D1D87F36400677773 /* ItemsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemsViewController.swift; sourceTree = ""; }; - 786048811D87F80A00677773 /* ItemsProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemsProvider.swift; sourceTree = ""; }; - 78715C3B1D901E7000830ECC /* ItemsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemsViewModel.swift; sourceTree = ""; }; - 78715C3D1D90409500830ECC /* YoutubeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YoutubeViewController.swift; sourceTree = ""; }; - 789000701D8800EA00F794B2 /* ChannelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelCell.swift; sourceTree = ""; }; - 78C35B2E1E23C04B009AC4D3 /* EngineTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EngineTests.swift; sourceTree = ""; }; - 78C35B2F1E23C04B009AC4D3 /* ISO8601DurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ISO8601DurationTests.swift; sourceTree = ""; }; - 78C35B311E23C04B009AC4D3 /* channels_search.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = channels_search.json; sourceTree = ""; }; - 78C35B321E23C04B009AC4D3 /* channels_VEVO.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = channels_VEVO.json; sourceTree = ""; }; - 78C35B331E23C04B009AC4D3 /* error.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = error.json; sourceTree = ""; }; - 78C35B341E23C04B009AC4D3 /* search_VEVO.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = search_VEVO.json; sourceTree = ""; }; - 78C35B351E23C04B009AC4D3 /* videos_VEVO.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = videos_VEVO.json; sourceTree = ""; }; - 78E6F68D1D548C46006C531D /* YoutubeEngine.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = YoutubeEngine.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/YoutubeEngine-bfqcavlgyvroawgpejupfjlwtcso/Build/Products/Debug-iphonesimulator/YoutubeEngine/YoutubeEngine.framework"; sourceTree = ""; }; - 8246B76A2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DateComponents+EasyConstruction.swift"; sourceTree = ""; }; - 8246B76F2445A16D00AEAEC6 /* PlaylistCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaylistCell.swift; sourceTree = ""; }; - 8246B7792445ADAF00AEAEC6 /* DisplayItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayItem.swift; sourceTree = ""; }; - 8246B77C2445B43500AEAEC6 /* PlaylistItemCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaylistItemCell.swift; sourceTree = ""; }; - 93B2B1D10540D62174BDC807 /* YoutubeEngine.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = YoutubeEngine.podspec; path = ../YoutubeEngine.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 989EA293CFCE94962D55842F /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 607FACCD1AFB9204008FA782 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6AD72904AE22167FE0C08F72 /* Pods_YoutubeEngine_Example.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE21AFB9204008FA782 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4CBFCAE78E94B07A4DB3738C /* Pods_YoutubeEngine_Tests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 607FACC71AFB9204008FA782 = { - isa = PBXGroup; - children = ( - 607FACF51AFB993E008FA782 /* Podspec Metadata */, - 607FACD21AFB9204008FA782 /* Example for YoutubeEngine */, - 607FACE81AFB9204008FA782 /* Tests */, - 607FACD11AFB9204008FA782 /* Products */, - B110C2FB8259E843CC53411D /* Pods */, - D31503BD1A92E7E7B19C187C /* Frameworks */, - ); - indentWidth = 4; - sourceTree = ""; - tabWidth = 4; - }; - 607FACD11AFB9204008FA782 /* Products */ = { - isa = PBXGroup; - children = ( - 607FACD01AFB9204008FA782 /* YoutubeEngine_Example.app */, - 607FACE51AFB9204008FA782 /* YoutubeEngine_Tests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 607FACD21AFB9204008FA782 /* Example for YoutubeEngine */ = { - isa = PBXGroup; - children = ( - 8246B77B2445ADEA00AEAEC6 /* Cells */, - 607FACD51AFB9204008FA782 /* AppDelegate.swift */, - 8246B7792445ADAF00AEAEC6 /* DisplayItem.swift */, - 786048811D87F80A00677773 /* ItemsProvider.swift */, - 7860487D1D87F36400677773 /* ItemsViewController.swift */, - 78715C3B1D901E7000830ECC /* ItemsViewModel.swift */, - 78715C3D1D90409500830ECC /* YoutubeViewController.swift */, - 607FACDC1AFB9204008FA782 /* Images.xcassets */, - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, - 607FACD91AFB9204008FA782 /* Main.storyboard */, - 607FACD31AFB9204008FA782 /* Supporting Files */, - ); - name = "Example for YoutubeEngine"; - path = YoutubeEngine; - sourceTree = ""; - }; - 607FACD31AFB9204008FA782 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 607FACD41AFB9204008FA782 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 607FACE81AFB9204008FA782 /* Tests */ = { - isa = PBXGroup; - children = ( - 78C35B2D1E23C04B009AC4D3 /* YoutubeEngineTests */, - 607FACE91AFB9204008FA782 /* Supporting Files */, - ); - path = Tests; - sourceTree = ""; - }; - 607FACE91AFB9204008FA782 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 607FACEA1AFB9204008FA782 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { - isa = PBXGroup; - children = ( - 93B2B1D10540D62174BDC807 /* YoutubeEngine.podspec */, - 58112E5178EA437FAE073E43 /* README.md */, - 989EA293CFCE94962D55842F /* LICENSE */, - ); - name = "Podspec Metadata"; - sourceTree = ""; - }; - 78C35B2D1E23C04B009AC4D3 /* YoutubeEngineTests */ = { - isa = PBXGroup; - children = ( - 8246B76A2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift */, - 78C35B2E1E23C04B009AC4D3 /* EngineTests.swift */, - 78C35B2F1E23C04B009AC4D3 /* ISO8601DurationTests.swift */, - 78C35B301E23C04B009AC4D3 /* Responses */, - ); - name = YoutubeEngineTests; - path = ../../Tests/YoutubeEngineTests; - sourceTree = ""; - }; - 78C35B301E23C04B009AC4D3 /* Responses */ = { - isa = PBXGroup; - children = ( - 78C35B311E23C04B009AC4D3 /* channels_search.json */, - 78C35B321E23C04B009AC4D3 /* channels_VEVO.json */, - 78C35B331E23C04B009AC4D3 /* error.json */, - 78C35B341E23C04B009AC4D3 /* search_VEVO.json */, - 78C35B351E23C04B009AC4D3 /* videos_VEVO.json */, - ); - path = Responses; - sourceTree = ""; - }; - 8246B77B2445ADEA00AEAEC6 /* Cells */ = { - isa = PBXGroup; - children = ( - 8246B77C2445B43500AEAEC6 /* PlaylistItemCell.swift */, - 789000701D8800EA00F794B2 /* ChannelCell.swift */, - 8246B76F2445A16D00AEAEC6 /* PlaylistCell.swift */, - 781422EB1D87EA8600EDC04F /* VideoCell.swift */, - ); - path = Cells; - sourceTree = ""; - }; - B110C2FB8259E843CC53411D /* Pods */ = { - isa = PBXGroup; - children = ( - 471C4D010C7676E74238A93F /* Pods-YoutubeEngine_Example.debug.xcconfig */, - 76C9D9FADA805D499DA15B12 /* Pods-YoutubeEngine_Example.release.xcconfig */, - 549BC97E4CF785F948069942 /* Pods-YoutubeEngine_Tests.debug.xcconfig */, - 2063A3FE0061518315DC9DB2 /* Pods-YoutubeEngine_Tests.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - D31503BD1A92E7E7B19C187C /* Frameworks */ = { - isa = PBXGroup; - children = ( - 78E6F68D1D548C46006C531D /* YoutubeEngine.framework */, - 73F4BD16F020572BB41C1439 /* Pods_YoutubeEngine_Example.framework */, - 3EE5F90365E539B389A381FD /* Pods_YoutubeEngine_Tests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 607FACCF1AFB9204008FA782 /* YoutubeEngine_Example */ = { - isa = PBXNativeTarget; - buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "YoutubeEngine_Example" */; - buildPhases = ( - DF6E13CE0B22490B5338AD77 /* [CP] Check Pods Manifest.lock */, - 8246B7692444F2F900AEAEC6 /* SwiftLint */, - 607FACCC1AFB9204008FA782 /* Sources */, - 607FACCD1AFB9204008FA782 /* Frameworks */, - 607FACCE1AFB9204008FA782 /* Resources */, - 5DBA15E74CFB4C3B63CC7376 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = YoutubeEngine_Example; - productName = YoutubeEngine; - productReference = 607FACD01AFB9204008FA782 /* YoutubeEngine_Example.app */; - productType = "com.apple.product-type.application"; - }; - 607FACE41AFB9204008FA782 /* YoutubeEngine_Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "YoutubeEngine_Tests" */; - buildPhases = ( - 6C59919D9B8385E153AF5ACD /* [CP] Check Pods Manifest.lock */, - 607FACE11AFB9204008FA782 /* Sources */, - 607FACE21AFB9204008FA782 /* Frameworks */, - 607FACE31AFB9204008FA782 /* Resources */, - 7A25AB5D7F8BC5992B071E84 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = YoutubeEngine_Tests; - productName = Tests; - productReference = 607FACE51AFB9204008FA782 /* YoutubeEngine_Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 607FACC81AFB9204008FA782 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 1140; - ORGANIZATIONNAME = CocoaPods; - TargetAttributes = { - 607FACCF1AFB9204008FA782 = { - CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0900; - }; - 607FACE41AFB9204008FA782 = { - CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0900; - }; - }; - }; - buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "YoutubeEngine" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 607FACC71AFB9204008FA782; - productRefGroup = 607FACD11AFB9204008FA782 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 607FACCF1AFB9204008FA782 /* YoutubeEngine_Example */, - 607FACE41AFB9204008FA782 /* YoutubeEngine_Tests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 607FACCE1AFB9204008FA782 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, - 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE31AFB9204008FA782 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 78C35B411E23C08F009AC4D3 /* error.json in Resources */, - 78C35B431E23C08F009AC4D3 /* videos_VEVO.json in Resources */, - 78C35B421E23C08F009AC4D3 /* search_VEVO.json in Resources */, - 78C35B3F1E23C08F009AC4D3 /* channels_search.json in Resources */, - 78C35B401E23C08F009AC4D3 /* channels_VEVO.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 5DBA15E74CFB4C3B63CC7376 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-YoutubeEngine_Example/Pods-YoutubeEngine_Example-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework", - "${BUILT_PRODUCTS_DIR}/ReactiveSwift/ReactiveSwift.framework", - "${BUILT_PRODUCTS_DIR}/YoutubeEngine/YoutubeEngine.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactiveSwift.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/YoutubeEngine.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-YoutubeEngine_Example/Pods-YoutubeEngine_Example-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 6C59919D9B8385E153AF5ACD /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-YoutubeEngine_Tests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 7A25AB5D7F8BC5992B071E84 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-YoutubeEngine_Tests/Pods-YoutubeEngine_Tests-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework", - "${BUILT_PRODUCTS_DIR}/OHHTTPStubs/OHHTTPStubs.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nimble.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OHHTTPStubs.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-YoutubeEngine_Tests/Pods-YoutubeEngine_Tests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 8246B7692444F2F900AEAEC6 /* SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = SwiftLint; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "cd ..\n${PODS_ROOT}/SwiftLint/swiftlint\n"; - }; - DF6E13CE0B22490B5338AD77 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-YoutubeEngine_Example-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 607FACCC1AFB9204008FA782 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, - 786048821D87F80A00677773 /* ItemsProvider.swift in Sources */, - 8246B77D2445B43500AEAEC6 /* PlaylistItemCell.swift in Sources */, - 8246B77A2445ADAF00AEAEC6 /* DisplayItem.swift in Sources */, - 78715C3E1D90409500830ECC /* YoutubeViewController.swift in Sources */, - 7860487E1D87F36400677773 /* ItemsViewController.swift in Sources */, - 789000711D8800EA00F794B2 /* ChannelCell.swift in Sources */, - 781422EC1D87EA8600EDC04F /* VideoCell.swift in Sources */, - 78715C3C1D901E7000830ECC /* ItemsViewModel.swift in Sources */, - 8246B7702445A16E00AEAEC6 /* PlaylistCell.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE11AFB9204008FA782 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8246B76B2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift in Sources */, - 78C35B3E1E23C08B009AC4D3 /* ISO8601DurationTests.swift in Sources */, - 78C35B3D1E23C08B009AC4D3 /* EngineTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 607FACD91AFB9204008FA782 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 607FACDA1AFB9204008FA782 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 607FACDF1AFB9204008FA782 /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 607FACED1AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = On; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 607FACEE1AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_SWIFT3_OBJC_INFERENCE = On; - SWIFT_VERSION = 5.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 607FACF01AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 471C4D010C7676E74238A93F /* Pods-YoutubeEngine_Example.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = YoutubeEngine/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - }; - name = Debug; - }; - 607FACF11AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 76C9D9FADA805D499DA15B12 /* Pods-YoutubeEngine_Example.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = YoutubeEngine/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - }; - name = Release; - }; - 607FACF31AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 549BC97E4CF785F948069942 /* Pods-YoutubeEngine_Tests.debug.xcconfig */; - buildSettings = { - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/YoutubeEngine_Example.app/YoutubeEngine_Example"; - }; - name = Debug; - }; - 607FACF41AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2063A3FE0061518315DC9DB2 /* Pods-YoutubeEngine_Tests.release.xcconfig */; - buildSettings = { - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/YoutubeEngine_Example.app/YoutubeEngine_Example"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "YoutubeEngine" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACED1AFB9204008FA782 /* Debug */, - 607FACEE1AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "YoutubeEngine_Example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACF01AFB9204008FA782 /* Debug */, - 607FACF11AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "YoutubeEngine_Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACF31AFB9204008FA782 /* Debug */, - 607FACF41AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 607FACC81AFB9204008FA782 /* Project object */; -} diff --git a/Example/YoutubeEngine.xcworkspace/contents.xcworkspacedata b/Example/YoutubeEngine.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 3c662a8..0000000 --- a/Example/YoutubeEngine.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Example/YoutubeViewController.swift b/Example/YoutubeViewController.swift new file mode 100644 index 0000000..4b20c5e --- /dev/null +++ b/Example/YoutubeViewController.swift @@ -0,0 +1,65 @@ +import ReactiveSwift +import UIKit +import YoutubeEngine + +extension Engine { + #warning("Generate yout own api key https://developers.google.com/youtube/v3/getting-started") + static let defaultEngine = Engine( + authorization: .key("AIzaSyBjLH-61v1oTcb_wQUcGAYIHmWSCj19Ss4"), + isLogEnabled: true + ) +} + +final class YoutubeViewModel { + let keyword = MutableProperty("") +} + +final class YoutubeViewController: UIViewController { + + @IBOutlet private var searchBar: UISearchBar! + + private let model = YoutubeViewModel() + + override func viewDidLoad() { + super.viewDidLoad() + + navigationItem.titleView = searchBar + automaticallyAdjustsScrollViewInsets = false + } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + guard let contentController = segue.destination as? ItemsViewController else { + return + } + contentController.model.mutableProvider <~ model.keyword.signal + .debounce(0.5, on: QueueScheduler.main) + .map { keyword -> AnyItemsProvider? in + if keyword.isEmpty { + return nil + } + return AnyItemsProvider { token, limit in + let request: SearchRequest = .search( + withTerm: keyword, + requiredVideoParts: [.statistics, .contentDetails], + requiredChannelParts: [.statistics], + requiredPlaylistParts: [.snippet], + limit: limit, + pageToken: token + ) + return Engine.defaultEngine + .search(request) + .map { page in (page.items.map { $0.displayItem }, page.nextPageToken) } + } + } + } +} + +extension YoutubeViewController: UISearchBarDelegate { + func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { + model.keyword.value = searchText + } + + func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { + searchBar.resignFirstResponder() + } +} diff --git a/Source/YoutubeEngine/Data/Image.swift b/Source/YoutubeEngine/Data/Image.swift index 1b38b19..892301c 100644 --- a/Source/YoutubeEngine/Data/Image.swift +++ b/Source/YoutubeEngine/Data/Image.swift @@ -1,4 +1,5 @@ import Foundation +import CoreGraphics public struct Image: Equatable { public let url: URL diff --git a/Tests/Info.plist b/Tests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/YoutubeEngine.xcodeproj/project.pbxproj b/YoutubeEngine.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5331474 --- /dev/null +++ b/YoutubeEngine.xcodeproj/project.pbxproj @@ -0,0 +1,1388 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; + 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; + 781422EC1D87EA8600EDC04F /* VideoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 781422EB1D87EA8600EDC04F /* VideoCell.swift */; }; + 7860487E1D87F36400677773 /* ItemsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7860487D1D87F36400677773 /* ItemsViewController.swift */; }; + 786048821D87F80A00677773 /* ItemsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 786048811D87F80A00677773 /* ItemsProvider.swift */; }; + 78715C3C1D901E7000830ECC /* ItemsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78715C3B1D901E7000830ECC /* ItemsViewModel.swift */; }; + 78715C3E1D90409500830ECC /* YoutubeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78715C3D1D90409500830ECC /* YoutubeViewController.swift */; }; + 789000711D8800EA00F794B2 /* ChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789000701D8800EA00F794B2 /* ChannelCell.swift */; }; + 78C35B3D1E23C08B009AC4D3 /* EngineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78C35B2E1E23C04B009AC4D3 /* EngineTests.swift */; }; + 78C35B3E1E23C08B009AC4D3 /* ISO8601DurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78C35B2F1E23C04B009AC4D3 /* ISO8601DurationTests.swift */; }; + 78C35B3F1E23C08F009AC4D3 /* channels_search.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B311E23C04B009AC4D3 /* channels_search.json */; }; + 78C35B401E23C08F009AC4D3 /* channels_VEVO.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B321E23C04B009AC4D3 /* channels_VEVO.json */; }; + 78C35B411E23C08F009AC4D3 /* error.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B331E23C04B009AC4D3 /* error.json */; }; + 78C35B421E23C08F009AC4D3 /* search_VEVO.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B341E23C04B009AC4D3 /* search_VEVO.json */; }; + 78C35B431E23C08F009AC4D3 /* videos_VEVO.json in Resources */ = {isa = PBXBuildFile; fileRef = 78C35B351E23C04B009AC4D3 /* videos_VEVO.json */; }; + 823530DA244704E500304F9F /* YoutubeEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 823530D8244704E500304F9F /* YoutubeEngine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 823530DD244704E500304F9F /* YoutubeEngine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 823530D6244704E500304F9F /* YoutubeEngine.framework */; }; + 823530DE244704E500304F9F /* YoutubeEngine.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 823530D6244704E500304F9F /* YoutubeEngine.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 823531062447053D00304F9F /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530E52447053D00304F9F /* Error.swift */; }; + 823531072447053D00304F9F /* Engine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530E62447053D00304F9F /* Engine.swift */; }; + 823531082447053D00304F9F /* NSDateComponents+ISO8601.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530E82447053D00304F9F /* NSDateComponents+ISO8601.swift */; }; + 823531092447053D00304F9F /* NSDateFormatter+ISO8601.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530E92447053D00304F9F /* NSDateFormatter+ISO8601.swift */; }; + 8235310A2447053D00304F9F /* PlaylistItemRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530EB2447053D00304F9F /* PlaylistItemRequest.swift */; }; + 8235310B2447053D00304F9F /* PartibleObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530EC2447053D00304F9F /* PartibleObject.swift */; }; + 8235310C2447053D00304F9F /* ChannelRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530ED2447053D00304F9F /* ChannelRequest.swift */; }; + 8235310D2447053D00304F9F /* SearchRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530EE2447053D00304F9F /* SearchRequest.swift */; }; + 8235310E2447053D00304F9F /* RequestParameterRepresenting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530EF2447053D00304F9F /* RequestParameterRepresenting.swift */; }; + 8235310F2447053D00304F9F /* Video+Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530F02447053D00304F9F /* Video+Request.swift */; }; + 823531102447053D00304F9F /* Channel+Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530F12447053D00304F9F /* Channel+Request.swift */; }; + 823531112447053D00304F9F /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530F22447053D00304F9F /* Request.swift */; }; + 823531122447053D00304F9F /* VideoRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530F32447053D00304F9F /* VideoRequest.swift */; }; + 823531132447053D00304F9F /* PlaylistItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530F52447053D00304F9F /* PlaylistItem.swift */; }; + 823531142447053D00304F9F /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530F62447053D00304F9F /* Channel.swift */; }; + 823531152447053D00304F9F /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530F72447053D00304F9F /* Image.swift */; }; + 823531162447053D00304F9F /* SearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530F82447053D00304F9F /* SearchItem.swift */; }; + 823531172447053D00304F9F /* StatisticsNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530F92447053D00304F9F /* StatisticsNumber.swift */; }; + 823531182447053D00304F9F /* Playlist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530FA2447053D00304F9F /* Playlist.swift */; }; + 823531192447053D00304F9F /* Part.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530FB2447053D00304F9F /* Part.swift */; }; + 8235311A2447053D00304F9F /* Video.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530FC2447053D00304F9F /* Video.swift */; }; + 8235311B2447053D00304F9F /* Page.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530FD2447053D00304F9F /* Page.swift */; }; + 8235311C2447053D00304F9F /* NSURLSession+RAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 823530FF2447053D00304F9F /* NSURLSession+RAC.swift */; }; + 82353120244705AF00304F9F /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 823530C62447035300304F9F /* ReactiveSwift.framework */; }; + 8246B76B2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B76A2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift */; }; + 8246B7702445A16E00AEAEC6 /* PlaylistCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B76F2445A16D00AEAEC6 /* PlaylistCell.swift */; }; + 8246B77A2445ADAF00AEAEC6 /* DisplayItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B7792445ADAF00AEAEC6 /* DisplayItem.swift */; }; + 8246B77D2445B43500AEAEC6 /* PlaylistItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B77C2445B43500AEAEC6 /* PlaylistItemCell.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 823530C12447035300304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D04725EA19E49ED7006002AA; + remoteInfo = "ReactiveSwift-macOS"; + }; + 823530C32447035300304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D04725F519E49ED7006002AA; + remoteInfo = "ReactiveSwift-macOSTests"; + }; + 823530C52447035300304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D047260C19E49F82006002AA; + remoteInfo = "ReactiveSwift-iOS"; + }; + 823530C72447035300304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D047261619E49F82006002AA; + remoteInfo = "ReactiveSwift-iOSTests"; + }; + 823530C92447035300304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = A9B315541B3940610001CB9C; + remoteInfo = "ReactiveSwift-watchOS"; + }; + 823530CB2447035300304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 57A4D2411BA13D7A00F7D4B1; + remoteInfo = "ReactiveSwift-tvOS"; + }; + 823530CD2447035300304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 7DFBED031CDB8C9500EE435B; + remoteInfo = "ReactiveSwift-tvOSTests"; + }; + 823530CF2447036000304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = D047260B19E49F82006002AA; + remoteInfo = "ReactiveSwift-iOS"; + }; + 823530DB244704E500304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 607FACC81AFB9204008FA782 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 823530D5244704E500304F9F; + remoteInfo = YoutubeEngine; + }; + 8235311D244705A400304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = D047260B19E49F82006002AA; + remoteInfo = "ReactiveSwift-iOS"; + }; + 8235312B244705F700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82353121244705F700304F9F /* Nimble.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 1F925EAD195C0D6300ED456B; + remoteInfo = "Nimble-macOS"; + }; + 8235312D244705F700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82353121244705F700304F9F /* Nimble.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 1F925EB7195C0D6300ED456B; + remoteInfo = "Nimble-macOSTests"; + }; + 8235312F244705F700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82353121244705F700304F9F /* Nimble.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 1F1A74291940169200FFFC47; + remoteInfo = "Nimble-iOS"; + }; + 82353131244705F700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82353121244705F700304F9F /* Nimble.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 1F1A74341940169200FFFC47; + remoteInfo = "Nimble-iOSTests"; + }; + 82353133244705F700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82353121244705F700304F9F /* Nimble.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 1F5DF1551BDCA0CE00C3A531; + remoteInfo = "Nimble-tvOS"; + }; + 82353135244705F700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82353121244705F700304F9F /* Nimble.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 1F5DF15E1BDCA0CE00C3A531; + remoteInfo = "Nimble-tvOSTests"; + }; + 823531372447060600304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 607FACC81AFB9204008FA782 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 823530D5244704E500304F9F; + remoteInfo = YoutubeEngine; + }; + 823531392447060600304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82353121244705F700304F9F /* Nimble.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 1F1A74281940169200FFFC47; + remoteInfo = "Nimble-iOS"; + }; + 8235313B2447060600304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = D047260B19E49F82006002AA; + remoteInfo = "ReactiveSwift-iOS"; + }; + 82353143244706E700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235313D244706E700304F9F /* Kingfisher.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D1ED2D351AD2D09F00CFC3EB; + remoteInfo = Kingfisher; + }; + 82353145244706E700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235313D244706E700304F9F /* Kingfisher.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D1F76072230974DE000C5269; + remoteInfo = KingfisherSwiftUI; + }; + 82353147244706E700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235313D244706E700304F9F /* Kingfisher.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D1ED2D3F1AD2D09F00CFC3EB; + remoteInfo = KingfisherTests; + }; + 82353149244706F900304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235313D244706E700304F9F /* Kingfisher.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = D1ED2D341AD2D09F00CFC3EB; + remoteInfo = Kingfisher; + }; + 82353156244707C000304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 09110A4119805F4800D175E4; + remoteInfo = "OHHTTPStubs iOS StaticLib"; + }; + 82353158244707C000304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 09110A5119805F4800D175E4; + remoteInfo = "OHHTTPStubs iOS Lib Tests"; + }; + 8235315A244707C000304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 725CD99B1A9EB65100F84C8B; + remoteInfo = "OHHTTPStubs iOS Framework"; + }; + 8235315C244707C000304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 093442F91B80EC4A00A91535; + remoteInfo = "OHHTTPStubs iOS Fmk Tests"; + }; + 8235315E244707C000304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 095981C219806A7900807DBE; + remoteInfo = "OHHTTPStubs Mac Framework"; + }; + 82353160244707C000304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 095981D219806A7900807DBE; + remoteInfo = "OHHTTPStubs Mac Tests"; + }; + 82353162244707C000304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EAA436A51BE1598D000E9E99; + remoteInfo = "OHHTTPStubs tvOS Framework"; + }; + 82353164244707C000304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EA100AB71BE15BE400129352; + remoteInfo = "OHHTTPStubs tvOS Fmk Tests"; + }; + 82353166244707CF00304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 82353121244705F700304F9F /* Nimble.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 1F1A74281940169200FFFC47; + remoteInfo = "Nimble-iOS"; + }; + 82353168244707D700304F9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 725CD99A1A9EB65100F84C8B; + remoteInfo = "OHHTTPStubs iOS Framework"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 823530E2244704E500304F9F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 823530DE244704E500304F9F /* YoutubeEngine.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 607FACD01AFB9204008FA782 /* YoutubeEngine_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = YoutubeEngine_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 607FACE51AFB9204008FA782 /* YoutubeEngine_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = YoutubeEngine_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 781422EB1D87EA8600EDC04F /* VideoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoCell.swift; sourceTree = ""; }; + 7860487D1D87F36400677773 /* ItemsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemsViewController.swift; sourceTree = ""; }; + 786048811D87F80A00677773 /* ItemsProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemsProvider.swift; sourceTree = ""; }; + 78715C3B1D901E7000830ECC /* ItemsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemsViewModel.swift; sourceTree = ""; }; + 78715C3D1D90409500830ECC /* YoutubeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YoutubeViewController.swift; sourceTree = ""; }; + 789000701D8800EA00F794B2 /* ChannelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelCell.swift; sourceTree = ""; }; + 78C35B2E1E23C04B009AC4D3 /* EngineTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EngineTests.swift; sourceTree = ""; }; + 78C35B2F1E23C04B009AC4D3 /* ISO8601DurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ISO8601DurationTests.swift; sourceTree = ""; }; + 78C35B311E23C04B009AC4D3 /* channels_search.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = channels_search.json; sourceTree = ""; }; + 78C35B321E23C04B009AC4D3 /* channels_VEVO.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = channels_VEVO.json; sourceTree = ""; }; + 78C35B331E23C04B009AC4D3 /* error.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = error.json; sourceTree = ""; }; + 78C35B341E23C04B009AC4D3 /* search_VEVO.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = search_VEVO.json; sourceTree = ""; }; + 78C35B351E23C04B009AC4D3 /* videos_VEVO.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = videos_VEVO.json; sourceTree = ""; }; + 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactiveSwift.xcodeproj; path = Carthage/Checkouts/ReactiveSwift/ReactiveSwift.xcodeproj; sourceTree = ""; }; + 823530D6244704E500304F9F /* YoutubeEngine.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YoutubeEngine.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 823530D8244704E500304F9F /* YoutubeEngine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YoutubeEngine.h; sourceTree = ""; }; + 823530D9244704E500304F9F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 823530E52447053D00304F9F /* Error.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; + 823530E62447053D00304F9F /* Engine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Engine.swift; sourceTree = ""; }; + 823530E82447053D00304F9F /* NSDateComponents+ISO8601.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSDateComponents+ISO8601.swift"; sourceTree = ""; }; + 823530E92447053D00304F9F /* NSDateFormatter+ISO8601.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSDateFormatter+ISO8601.swift"; sourceTree = ""; }; + 823530EB2447053D00304F9F /* PlaylistItemRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaylistItemRequest.swift; sourceTree = ""; }; + 823530EC2447053D00304F9F /* PartibleObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PartibleObject.swift; sourceTree = ""; }; + 823530ED2447053D00304F9F /* ChannelRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelRequest.swift; sourceTree = ""; }; + 823530EE2447053D00304F9F /* SearchRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchRequest.swift; sourceTree = ""; }; + 823530EF2447053D00304F9F /* RequestParameterRepresenting.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestParameterRepresenting.swift; sourceTree = ""; }; + 823530F02447053D00304F9F /* Video+Request.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Video+Request.swift"; sourceTree = ""; }; + 823530F12447053D00304F9F /* Channel+Request.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Channel+Request.swift"; sourceTree = ""; }; + 823530F22447053D00304F9F /* Request.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = ""; }; + 823530F32447053D00304F9F /* VideoRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoRequest.swift; sourceTree = ""; }; + 823530F52447053D00304F9F /* PlaylistItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaylistItem.swift; sourceTree = ""; }; + 823530F62447053D00304F9F /* Channel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Channel.swift; sourceTree = ""; }; + 823530F72447053D00304F9F /* Image.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; + 823530F82447053D00304F9F /* SearchItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchItem.swift; sourceTree = ""; }; + 823530F92447053D00304F9F /* StatisticsNumber.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatisticsNumber.swift; sourceTree = ""; }; + 823530FA2447053D00304F9F /* Playlist.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Playlist.swift; sourceTree = ""; }; + 823530FB2447053D00304F9F /* Part.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Part.swift; sourceTree = ""; }; + 823530FC2447053D00304F9F /* Video.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Video.swift; sourceTree = ""; }; + 823530FD2447053D00304F9F /* Page.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Page.swift; sourceTree = ""; }; + 823530FF2447053D00304F9F /* NSURLSession+RAC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSURLSession+RAC.swift"; sourceTree = ""; }; + 82353121244705F700304F9F /* Nimble.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Nimble.xcodeproj; path = Carthage/Checkouts/Nimble/Nimble.xcodeproj; sourceTree = ""; }; + 8235313D244706E700304F9F /* Kingfisher.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Kingfisher.xcodeproj; path = Carthage/Checkouts/Kingfisher/Kingfisher.xcodeproj; sourceTree = ""; }; + 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OHHTTPStubs.xcodeproj; path = Carthage/Checkouts/OHHTTPStubs/OHHTTPStubs.xcodeproj; sourceTree = ""; }; + 8246B76A2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DateComponents+EasyConstruction.swift"; sourceTree = ""; }; + 8246B76F2445A16D00AEAEC6 /* PlaylistCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaylistCell.swift; sourceTree = ""; }; + 8246B7792445ADAF00AEAEC6 /* DisplayItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayItem.swift; sourceTree = ""; }; + 8246B77C2445B43500AEAEC6 /* PlaylistItemCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaylistItemCell.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 607FACCD1AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 823530DD244704E500304F9F /* YoutubeEngine.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE21AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 823530D3244704E500304F9F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 82353120244705AF00304F9F /* ReactiveSwift.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 607FACC71AFB9204008FA782 = { + isa = PBXGroup; + children = ( + 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */, + 8235313D244706E700304F9F /* Kingfisher.xcodeproj */, + 82353121244705F700304F9F /* Nimble.xcodeproj */, + 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */, + 607FACD21AFB9204008FA782 /* Example */, + 607FACE81AFB9204008FA782 /* Tests */, + 823530D7244704E500304F9F /* YoutubeEngine */, + 607FACD11AFB9204008FA782 /* Products */, + 8235311F244705AF00304F9F /* Frameworks */, + ); + indentWidth = 4; + sourceTree = ""; + tabWidth = 4; + }; + 607FACD11AFB9204008FA782 /* Products */ = { + isa = PBXGroup; + children = ( + 607FACD01AFB9204008FA782 /* YoutubeEngine_Example.app */, + 607FACE51AFB9204008FA782 /* YoutubeEngine_Tests.xctest */, + 823530D6244704E500304F9F /* YoutubeEngine.framework */, + ); + name = Products; + sourceTree = ""; + }; + 607FACD21AFB9204008FA782 /* Example */ = { + isa = PBXGroup; + children = ( + 8246B77B2445ADEA00AEAEC6 /* Cells */, + 607FACD51AFB9204008FA782 /* AppDelegate.swift */, + 8246B7792445ADAF00AEAEC6 /* DisplayItem.swift */, + 786048811D87F80A00677773 /* ItemsProvider.swift */, + 7860487D1D87F36400677773 /* ItemsViewController.swift */, + 78715C3B1D901E7000830ECC /* ItemsViewModel.swift */, + 78715C3D1D90409500830ECC /* YoutubeViewController.swift */, + 607FACDC1AFB9204008FA782 /* Images.xcassets */, + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, + 607FACD91AFB9204008FA782 /* Main.storyboard */, + 607FACD31AFB9204008FA782 /* Supporting Files */, + ); + path = Example; + sourceTree = ""; + }; + 607FACD31AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACD41AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACE81AFB9204008FA782 /* Tests */ = { + isa = PBXGroup; + children = ( + 78C35B2D1E23C04B009AC4D3 /* YoutubeEngineTests */, + 607FACE91AFB9204008FA782 /* Supporting Files */, + ); + path = Tests; + sourceTree = ""; + }; + 607FACE91AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACEA1AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 78C35B2D1E23C04B009AC4D3 /* YoutubeEngineTests */ = { + isa = PBXGroup; + children = ( + 8246B76A2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift */, + 78C35B2E1E23C04B009AC4D3 /* EngineTests.swift */, + 78C35B2F1E23C04B009AC4D3 /* ISO8601DurationTests.swift */, + 78C35B301E23C04B009AC4D3 /* Responses */, + ); + path = YoutubeEngineTests; + sourceTree = ""; + }; + 78C35B301E23C04B009AC4D3 /* Responses */ = { + isa = PBXGroup; + children = ( + 78C35B311E23C04B009AC4D3 /* channels_search.json */, + 78C35B321E23C04B009AC4D3 /* channels_VEVO.json */, + 78C35B331E23C04B009AC4D3 /* error.json */, + 78C35B341E23C04B009AC4D3 /* search_VEVO.json */, + 78C35B351E23C04B009AC4D3 /* videos_VEVO.json */, + ); + path = Responses; + sourceTree = ""; + }; + 823530B82447035300304F9F /* Products */ = { + isa = PBXGroup; + children = ( + 823530C22447035300304F9F /* ReactiveSwift.framework */, + 823530C42447035300304F9F /* ReactiveSwiftTests.xctest */, + 823530C62447035300304F9F /* ReactiveSwift.framework */, + 823530C82447035300304F9F /* ReactiveSwiftTests.xctest */, + 823530CA2447035300304F9F /* ReactiveSwift.framework */, + 823530CC2447035300304F9F /* ReactiveSwift.framework */, + 823530CE2447035300304F9F /* ReactiveSwiftTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 823530D7244704E500304F9F /* YoutubeEngine */ = { + isa = PBXGroup; + children = ( + 823530E42447053D00304F9F /* YoutubeEngine */, + 823530D8244704E500304F9F /* YoutubeEngine.h */, + 823530D9244704E500304F9F /* Info.plist */, + ); + path = YoutubeEngine; + sourceTree = ""; + }; + 823530E42447053D00304F9F /* YoutubeEngine */ = { + isa = PBXGroup; + children = ( + 823530E52447053D00304F9F /* Error.swift */, + 823530E62447053D00304F9F /* Engine.swift */, + 823530E72447053D00304F9F /* Parser */, + 823530EA2447053D00304F9F /* Requests */, + 823530F42447053D00304F9F /* Data */, + 823530FE2447053D00304F9F /* Helpers */, + ); + name = YoutubeEngine; + path = Source/YoutubeEngine; + sourceTree = SOURCE_ROOT; + }; + 823530E72447053D00304F9F /* Parser */ = { + isa = PBXGroup; + children = ( + 823530E82447053D00304F9F /* NSDateComponents+ISO8601.swift */, + 823530E92447053D00304F9F /* NSDateFormatter+ISO8601.swift */, + ); + path = Parser; + sourceTree = ""; + }; + 823530EA2447053D00304F9F /* Requests */ = { + isa = PBXGroup; + children = ( + 823530EB2447053D00304F9F /* PlaylistItemRequest.swift */, + 823530EC2447053D00304F9F /* PartibleObject.swift */, + 823530ED2447053D00304F9F /* ChannelRequest.swift */, + 823530EE2447053D00304F9F /* SearchRequest.swift */, + 823530EF2447053D00304F9F /* RequestParameterRepresenting.swift */, + 823530F02447053D00304F9F /* Video+Request.swift */, + 823530F12447053D00304F9F /* Channel+Request.swift */, + 823530F22447053D00304F9F /* Request.swift */, + 823530F32447053D00304F9F /* VideoRequest.swift */, + ); + path = Requests; + sourceTree = ""; + }; + 823530F42447053D00304F9F /* Data */ = { + isa = PBXGroup; + children = ( + 823530F52447053D00304F9F /* PlaylistItem.swift */, + 823530F62447053D00304F9F /* Channel.swift */, + 823530F72447053D00304F9F /* Image.swift */, + 823530F82447053D00304F9F /* SearchItem.swift */, + 823530F92447053D00304F9F /* StatisticsNumber.swift */, + 823530FA2447053D00304F9F /* Playlist.swift */, + 823530FB2447053D00304F9F /* Part.swift */, + 823530FC2447053D00304F9F /* Video.swift */, + 823530FD2447053D00304F9F /* Page.swift */, + ); + path = Data; + sourceTree = ""; + }; + 823530FE2447053D00304F9F /* Helpers */ = { + isa = PBXGroup; + children = ( + 823530FF2447053D00304F9F /* NSURLSession+RAC.swift */, + ); + path = Helpers; + sourceTree = ""; + }; + 8235311F244705AF00304F9F /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 82353122244705F700304F9F /* Products */ = { + isa = PBXGroup; + children = ( + 8235312C244705F700304F9F /* Nimble.framework */, + 8235312E244705F700304F9F /* NimbleTests.xctest */, + 82353130244705F700304F9F /* Nimble.framework */, + 82353132244705F700304F9F /* NimbleTests.xctest */, + 82353134244705F700304F9F /* Nimble.framework */, + 82353136244705F700304F9F /* NimbleTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 8235313E244706E700304F9F /* Products */ = { + isa = PBXGroup; + children = ( + 82353144244706E700304F9F /* Kingfisher.framework */, + 82353146244706E700304F9F /* KingfisherSwiftUI.framework */, + 82353148244706E700304F9F /* KingfisherTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 8235314C244707BF00304F9F /* Products */ = { + isa = PBXGroup; + children = ( + 82353157244707C000304F9F /* libOHHTTPStubs.a */, + 82353159244707C000304F9F /* OHHTTPStubs iOS Lib Tests.xctest */, + 8235315B244707C000304F9F /* OHHTTPStubs.framework */, + 8235315D244707C000304F9F /* OHHTTPStubs iOS Fmk Tests.xctest */, + 8235315F244707C000304F9F /* OHHTTPStubs.framework */, + 82353161244707C000304F9F /* OHHTTPStubs Mac Tests.xctest */, + 82353163244707C000304F9F /* OHHTTPStubs.framework */, + 82353165244707C000304F9F /* OHHTTPStubs tvOS Fmk Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 8246B77B2445ADEA00AEAEC6 /* Cells */ = { + isa = PBXGroup; + children = ( + 8246B77C2445B43500AEAEC6 /* PlaylistItemCell.swift */, + 789000701D8800EA00F794B2 /* ChannelCell.swift */, + 8246B76F2445A16D00AEAEC6 /* PlaylistCell.swift */, + 781422EB1D87EA8600EDC04F /* VideoCell.swift */, + ); + path = Cells; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 823530D1244704E500304F9F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 823530DA244704E500304F9F /* YoutubeEngine.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 607FACCF1AFB9204008FA782 /* YoutubeEngine_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "YoutubeEngine_Example" */; + buildPhases = ( + 607FACCC1AFB9204008FA782 /* Sources */, + 607FACCD1AFB9204008FA782 /* Frameworks */, + 607FACCE1AFB9204008FA782 /* Resources */, + 823530E2244704E500304F9F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 8235314A244706F900304F9F /* PBXTargetDependency */, + 823530D02447036000304F9F /* PBXTargetDependency */, + 823530DC244704E500304F9F /* PBXTargetDependency */, + ); + name = YoutubeEngine_Example; + productName = YoutubeEngine; + productReference = 607FACD01AFB9204008FA782 /* YoutubeEngine_Example.app */; + productType = "com.apple.product-type.application"; + }; + 607FACE41AFB9204008FA782 /* YoutubeEngine_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "YoutubeEngine_Tests" */; + buildPhases = ( + 607FACE11AFB9204008FA782 /* Sources */, + 607FACE21AFB9204008FA782 /* Frameworks */, + 607FACE31AFB9204008FA782 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 823531382447060600304F9F /* PBXTargetDependency */, + 8235313A2447060600304F9F /* PBXTargetDependency */, + 8235313C2447060600304F9F /* PBXTargetDependency */, + ); + name = YoutubeEngine_Tests; + productName = Tests; + productReference = 607FACE51AFB9204008FA782 /* YoutubeEngine_Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 823530D5244704E500304F9F /* YoutubeEngine */ = { + isa = PBXNativeTarget; + buildConfigurationList = 823530DF244704E500304F9F /* Build configuration list for PBXNativeTarget "YoutubeEngine" */; + buildPhases = ( + 823530D1244704E500304F9F /* Headers */, + 823530D2244704E500304F9F /* Sources */, + 823530D3244704E500304F9F /* Frameworks */, + 823530D4244704E500304F9F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 82353169244707D700304F9F /* PBXTargetDependency */, + 82353167244707CF00304F9F /* PBXTargetDependency */, + 8235311E244705A400304F9F /* PBXTargetDependency */, + ); + name = YoutubeEngine; + productName = YoutubeEngine; + productReference = 823530D6244704E500304F9F /* YoutubeEngine.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 607FACC81AFB9204008FA782 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 1140; + ORGANIZATIONNAME = CocoaPods; + TargetAttributes = { + 607FACCF1AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + ProvisioningStyle = Manual; + }; + 607FACE41AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + ProvisioningStyle = Manual; + }; + 823530D5244704E500304F9F = { + CreatedOnToolsVersion = 11.4; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "YoutubeEngine" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 607FACC71AFB9204008FA782; + productRefGroup = 607FACD11AFB9204008FA782 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 8235313E244706E700304F9F /* Products */; + ProjectRef = 8235313D244706E700304F9F /* Kingfisher.xcodeproj */; + }, + { + ProductGroup = 82353122244705F700304F9F /* Products */; + ProjectRef = 82353121244705F700304F9F /* Nimble.xcodeproj */; + }, + { + ProductGroup = 8235314C244707BF00304F9F /* Products */; + ProjectRef = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; + }, + { + ProductGroup = 823530B82447035300304F9F /* Products */; + ProjectRef = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 607FACCF1AFB9204008FA782 /* YoutubeEngine_Example */, + 607FACE41AFB9204008FA782 /* YoutubeEngine_Tests */, + 823530D5244704E500304F9F /* YoutubeEngine */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 823530C22447035300304F9F /* ReactiveSwift.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = ReactiveSwift.framework; + remoteRef = 823530C12447035300304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 823530C42447035300304F9F /* ReactiveSwiftTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = ReactiveSwiftTests.xctest; + remoteRef = 823530C32447035300304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 823530C62447035300304F9F /* ReactiveSwift.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = ReactiveSwift.framework; + remoteRef = 823530C52447035300304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 823530C82447035300304F9F /* ReactiveSwiftTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = ReactiveSwiftTests.xctest; + remoteRef = 823530C72447035300304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 823530CA2447035300304F9F /* ReactiveSwift.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = ReactiveSwift.framework; + remoteRef = 823530C92447035300304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 823530CC2447035300304F9F /* ReactiveSwift.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = ReactiveSwift.framework; + remoteRef = 823530CB2447035300304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 823530CE2447035300304F9F /* ReactiveSwiftTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = ReactiveSwiftTests.xctest; + remoteRef = 823530CD2447035300304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8235312C244705F700304F9F /* Nimble.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Nimble.framework; + remoteRef = 8235312B244705F700304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8235312E244705F700304F9F /* NimbleTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = NimbleTests.xctest; + remoteRef = 8235312D244705F700304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353130244705F700304F9F /* Nimble.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Nimble.framework; + remoteRef = 8235312F244705F700304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353132244705F700304F9F /* NimbleTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = NimbleTests.xctest; + remoteRef = 82353131244705F700304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353134244705F700304F9F /* Nimble.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Nimble.framework; + remoteRef = 82353133244705F700304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353136244705F700304F9F /* NimbleTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = NimbleTests.xctest; + remoteRef = 82353135244705F700304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353144244706E700304F9F /* Kingfisher.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Kingfisher.framework; + remoteRef = 82353143244706E700304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353146244706E700304F9F /* KingfisherSwiftUI.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = KingfisherSwiftUI.framework; + remoteRef = 82353145244706E700304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353148244706E700304F9F /* KingfisherTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = KingfisherTests.xctest; + remoteRef = 82353147244706E700304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353157244707C000304F9F /* libOHHTTPStubs.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libOHHTTPStubs.a; + remoteRef = 82353156244707C000304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353159244707C000304F9F /* OHHTTPStubs iOS Lib Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "OHHTTPStubs iOS Lib Tests.xctest"; + remoteRef = 82353158244707C000304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8235315B244707C000304F9F /* OHHTTPStubs.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OHHTTPStubs.framework; + remoteRef = 8235315A244707C000304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8235315D244707C000304F9F /* OHHTTPStubs iOS Fmk Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "OHHTTPStubs iOS Fmk Tests.xctest"; + remoteRef = 8235315C244707C000304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8235315F244707C000304F9F /* OHHTTPStubs.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OHHTTPStubs.framework; + remoteRef = 8235315E244707C000304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353161244707C000304F9F /* OHHTTPStubs Mac Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "OHHTTPStubs Mac Tests.xctest"; + remoteRef = 82353160244707C000304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353163244707C000304F9F /* OHHTTPStubs.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = OHHTTPStubs.framework; + remoteRef = 82353162244707C000304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 82353165244707C000304F9F /* OHHTTPStubs tvOS Fmk Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "OHHTTPStubs tvOS Fmk Tests.xctest"; + remoteRef = 82353164244707C000304F9F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 607FACCE1AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE31AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 78C35B411E23C08F009AC4D3 /* error.json in Resources */, + 78C35B431E23C08F009AC4D3 /* videos_VEVO.json in Resources */, + 78C35B421E23C08F009AC4D3 /* search_VEVO.json in Resources */, + 78C35B3F1E23C08F009AC4D3 /* channels_search.json in Resources */, + 78C35B401E23C08F009AC4D3 /* channels_VEVO.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 823530D4244704E500304F9F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 607FACCC1AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, + 786048821D87F80A00677773 /* ItemsProvider.swift in Sources */, + 8246B77D2445B43500AEAEC6 /* PlaylistItemCell.swift in Sources */, + 8246B77A2445ADAF00AEAEC6 /* DisplayItem.swift in Sources */, + 78715C3E1D90409500830ECC /* YoutubeViewController.swift in Sources */, + 7860487E1D87F36400677773 /* ItemsViewController.swift in Sources */, + 789000711D8800EA00F794B2 /* ChannelCell.swift in Sources */, + 781422EC1D87EA8600EDC04F /* VideoCell.swift in Sources */, + 78715C3C1D901E7000830ECC /* ItemsViewModel.swift in Sources */, + 8246B7702445A16E00AEAEC6 /* PlaylistCell.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE11AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8246B76B2444F88100AEAEC6 /* DateComponents+EasyConstruction.swift in Sources */, + 78C35B3E1E23C08B009AC4D3 /* ISO8601DurationTests.swift in Sources */, + 78C35B3D1E23C08B009AC4D3 /* EngineTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 823530D2244704E500304F9F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 823531122447053D00304F9F /* VideoRequest.swift in Sources */, + 823531142447053D00304F9F /* Channel.swift in Sources */, + 8235310C2447053D00304F9F /* ChannelRequest.swift in Sources */, + 823531112447053D00304F9F /* Request.swift in Sources */, + 823531182447053D00304F9F /* Playlist.swift in Sources */, + 823531092447053D00304F9F /* NSDateFormatter+ISO8601.swift in Sources */, + 8235311B2447053D00304F9F /* Page.swift in Sources */, + 8235310B2447053D00304F9F /* PartibleObject.swift in Sources */, + 8235310A2447053D00304F9F /* PlaylistItemRequest.swift in Sources */, + 823531192447053D00304F9F /* Part.swift in Sources */, + 823531082447053D00304F9F /* NSDateComponents+ISO8601.swift in Sources */, + 8235310D2447053D00304F9F /* SearchRequest.swift in Sources */, + 823531152447053D00304F9F /* Image.swift in Sources */, + 823531132447053D00304F9F /* PlaylistItem.swift in Sources */, + 823531172447053D00304F9F /* StatisticsNumber.swift in Sources */, + 8235311C2447053D00304F9F /* NSURLSession+RAC.swift in Sources */, + 823531062447053D00304F9F /* Error.swift in Sources */, + 823531102447053D00304F9F /* Channel+Request.swift in Sources */, + 823531072447053D00304F9F /* Engine.swift in Sources */, + 823531162447053D00304F9F /* SearchItem.swift in Sources */, + 8235310E2447053D00304F9F /* RequestParameterRepresenting.swift in Sources */, + 8235311A2447053D00304F9F /* Video.swift in Sources */, + 8235310F2447053D00304F9F /* Video+Request.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 823530D02447036000304F9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "ReactiveSwift-iOS"; + targetProxy = 823530CF2447036000304F9F /* PBXContainerItemProxy */; + }; + 823530DC244704E500304F9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 823530D5244704E500304F9F /* YoutubeEngine */; + targetProxy = 823530DB244704E500304F9F /* PBXContainerItemProxy */; + }; + 8235311E244705A400304F9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "ReactiveSwift-iOS"; + targetProxy = 8235311D244705A400304F9F /* PBXContainerItemProxy */; + }; + 823531382447060600304F9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 823530D5244704E500304F9F /* YoutubeEngine */; + targetProxy = 823531372447060600304F9F /* PBXContainerItemProxy */; + }; + 8235313A2447060600304F9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Nimble-iOS"; + targetProxy = 823531392447060600304F9F /* PBXContainerItemProxy */; + }; + 8235313C2447060600304F9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "ReactiveSwift-iOS"; + targetProxy = 8235313B2447060600304F9F /* PBXContainerItemProxy */; + }; + 8235314A244706F900304F9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Kingfisher; + targetProxy = 82353149244706F900304F9F /* PBXContainerItemProxy */; + }; + 82353167244707CF00304F9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Nimble-iOS"; + targetProxy = 82353166244707CF00304F9F /* PBXContainerItemProxy */; + }; + 82353169244707D700304F9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "OHHTTPStubs iOS Framework"; + targetProxy = 82353168244707D700304F9F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 607FACD91AFB9204008FA782 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 607FACDA1AFB9204008FA782 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 607FACDF1AFB9204008FA782 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 607FACED1AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 10.0; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Debug; + }; + 607FACEE1AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 10.0; + VALIDATE_PRODUCT = YES; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Release; + }; + 607FACF01AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "$(SRCROOT)/Example/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.YoutubeEngine-Example"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + }; + name = Debug; + }; + 607FACF11AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "$(SRCROOT)/Example/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.YoutubeEngine-Example"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + }; + name = Release; + }; + 607FACF31AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/YoutubeEngine_Example.app/YoutubeEngine_Example"; + }; + name = Debug; + }; + 607FACF41AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/YoutubeEngine_Example.app/YoutubeEngine_Example"; + }; + name = Release; + }; + 823530E0244704E500304F9F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = YoutubeEngine/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.github.YoutubeEngine; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 823530E1244704E500304F9F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = YoutubeEngine/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.github.YoutubeEngine; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "YoutubeEngine" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACED1AFB9204008FA782 /* Debug */, + 607FACEE1AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "YoutubeEngine_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF01AFB9204008FA782 /* Debug */, + 607FACF11AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "YoutubeEngine_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF31AFB9204008FA782 /* Debug */, + 607FACF41AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 823530DF244704E500304F9F /* Build configuration list for PBXNativeTarget "YoutubeEngine" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 823530E0244704E500304F9F /* Debug */, + 823530E1244704E500304F9F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 607FACC81AFB9204008FA782 /* Project object */; +} diff --git a/Example/YoutubeEngine.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/YoutubeEngine.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Example/YoutubeEngine.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to YoutubeEngine.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/YoutubeEngine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/YoutubeEngine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/YoutubeEngine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/YoutubeEngine.xcodeproj/xcshareddata/xcschemes/YoutubeEngine-Example.xcscheme b/YoutubeEngine.xcodeproj/xcshareddata/xcschemes/YoutubeEngine.xcscheme similarity index 57% rename from Example/YoutubeEngine.xcodeproj/xcshareddata/xcschemes/YoutubeEngine-Example.xcscheme rename to YoutubeEngine.xcodeproj/xcshareddata/xcschemes/YoutubeEngine.xcscheme index 0c75db1..d2777a8 100644 --- a/Example/YoutubeEngine.xcodeproj/xcshareddata/xcschemes/YoutubeEngine-Example.xcscheme +++ b/YoutubeEngine.xcodeproj/xcshareddata/xcschemes/YoutubeEngine.xcscheme @@ -14,23 +14,9 @@ buildForAnalyzing = "YES"> - - - - @@ -41,15 +27,6 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - @@ -73,16 +50,6 @@ debugDocumentVersioning = "YES" debugServiceExtension = "internal" allowLocationSimulation = "YES"> - - - - - + - + diff --git a/YoutubeEngine/Info.plist b/YoutubeEngine/Info.plist new file mode 100644 index 0000000..9bcb244 --- /dev/null +++ b/YoutubeEngine/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/YoutubeEngine/YoutubeEngine.h b/YoutubeEngine/YoutubeEngine.h new file mode 100644 index 0000000..cb1696a --- /dev/null +++ b/YoutubeEngine/YoutubeEngine.h @@ -0,0 +1,19 @@ +// +// YoutubeEngine.h +// YoutubeEngine +// +// Created by Igor Palaguta on 15.04.20. +// Copyright © 2020 CocoaPods. All rights reserved. +// + +#import + +//! Project version number for YoutubeEngine. +FOUNDATION_EXPORT double YoutubeEngineVersionNumber; + +//! Project version string for YoutubeEngine. +FOUNDATION_EXPORT const unsigned char YoutubeEngineVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + From 7be5f1fa5e59ad0d983700d9d4889c9d6b4cf7ac Mon Sep 17 00:00:00 2001 From: Igor Palaguta Date: Wed, 15 Apr 2020 12:21:17 +0300 Subject: [PATCH 2/7] Remove old structure --- .gitignore | 6 +- Example/Tests/Info.plist | 24 ---- Example/YoutubeEngine/AppDelegate.swift | 12 -- Example/YoutubeEngine/DisplayItem.swift | 22 --- Example/YoutubeEngine/Info.plist | 39 ------ Example/YoutubeEngine/ItemsProvider.swift | 53 ------- .../YoutubeEngine/ItemsViewController.swift | 129 ------------------ Example/YoutubeEngine/ItemsViewModel.swift | 24 ---- .../YoutubeEngine/YoutubeViewController.swift | 65 --------- 9 files changed, 4 insertions(+), 370 deletions(-) delete mode 100644 Example/Tests/Info.plist delete mode 100644 Example/YoutubeEngine/AppDelegate.swift delete mode 100644 Example/YoutubeEngine/DisplayItem.swift delete mode 100644 Example/YoutubeEngine/Info.plist delete mode 100644 Example/YoutubeEngine/ItemsProvider.swift delete mode 100644 Example/YoutubeEngine/ItemsViewController.swift delete mode 100644 Example/YoutubeEngine/ItemsViewModel.swift delete mode 100644 Example/YoutubeEngine/YoutubeViewController.swift diff --git a/.gitignore b/.gitignore index 005b026..ead5f2c 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,8 @@ Packages # Bundler .bundle +# Carthage +Carthage + # Cocoapods -Pods/ -Example/YoutubeEngine.xcworkspace +Pods diff --git a/Example/Tests/Info.plist b/Example/Tests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Example/Tests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Example/YoutubeEngine/AppDelegate.swift b/Example/YoutubeEngine/AppDelegate.swift deleted file mode 100644 index 1cda0d9..0000000 --- a/Example/YoutubeEngine/AppDelegate.swift +++ /dev/null @@ -1,12 +0,0 @@ -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application(_ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - return true - } -} diff --git a/Example/YoutubeEngine/DisplayItem.swift b/Example/YoutubeEngine/DisplayItem.swift deleted file mode 100644 index 36a97c6..0000000 --- a/Example/YoutubeEngine/DisplayItem.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation -import YoutubeEngine - -enum DisplayItem { - case channel(Channel) - case video(Video) - case playlistItem(PlaylistItem) - case playlist(Playlist) -} - -extension SearchItem { - var displayItem: DisplayItem { - switch self { - case .channel(let channel): - return .channel(channel) - case .video(let video): - return .video(video) - case .playlist(let playlist): - return .playlist(playlist) - } - } -} diff --git a/Example/YoutubeEngine/Info.plist b/Example/YoutubeEngine/Info.plist deleted file mode 100644 index eb18faa..0000000 --- a/Example/YoutubeEngine/Info.plist +++ /dev/null @@ -1,39 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - - - diff --git a/Example/YoutubeEngine/ItemsProvider.swift b/Example/YoutubeEngine/ItemsProvider.swift deleted file mode 100644 index 9f0ae45..0000000 --- a/Example/YoutubeEngine/ItemsProvider.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation -import ReactiveSwift -import YoutubeEngine - -protocol ItemsProviders { - associatedtype Item - - var items: Property<[Item]> { get } - var isLoadingPage: Bool { get } - var pageLoader: SignalProducer? { get } -} - -final class AnyItemsProvider: ItemsProviders { - typealias PageLoader = (_ pageToken: String?, _ limit: Int) -> SignalProducer<([Item], String?), NSError> - - let items: Property<[Item]> - private(set) var isLoadingPage = false - - private let _pageLoader: PageLoader - private var nextPageToken: String? - private let mutableItems = MutableProperty<[Item]?>(nil) - - init(pageLoader: @escaping PageLoader) { - self._pageLoader = pageLoader - self.items = mutableItems.map { $0 ?? [] } - } - - var pageLoader: SignalProducer? { - if isLoadingPage { - return nil - } - - // Nothing for this keyword - if mutableItems.value != nil && nextPageToken == nil { - return nil - } - - return _pageLoader(nextPageToken, 20) - .on(value: { items, token in - self.nextPageToken = token - self.mutableItems.value = self.items.value + items - }) - .map { _ in () } - .on( - started: { - self.isLoadingPage = true - }, - terminated: { - self.isLoadingPage = false - } - ) - } -} diff --git a/Example/YoutubeEngine/ItemsViewController.swift b/Example/YoutubeEngine/ItemsViewController.swift deleted file mode 100644 index f148c7b..0000000 --- a/Example/YoutubeEngine/ItemsViewController.swift +++ /dev/null @@ -1,129 +0,0 @@ -import ReactiveSwift -import UIKit -import YoutubeEngine - -final class ItemsViewController: UITableViewController { - - @IBOutlet private var searchBar: UISearchBar! - - let model = MutableItemsViewModel() - - override func viewDidLoad() { - super.viewDidLoad() - - tableView.keyboardDismissMode = .onDrag - - model - .provider - .producer - .flatMap(.latest) { provider -> SignalProducer in - if let pageLoader = provider?.pageLoader { - return pageLoader - .on(failed: { [weak self] error in - self?.presentError(error) - }) - .flatMapError { _ in .empty } - } - return .empty - } - .startWithCompleted {} - - model - .provider - .producer.flatMap(.latest) { provider -> SignalProducer<[DisplayItem], Never> in - guard let provider = provider else { - return SignalProducer(value: []) - } - - return provider.items.producer - } - .startWithValues { [weak self] _ in - self?.tableView.reloadData() - } - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return model.items.count - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let item = model.items[indexPath.row] - switch item { - case .channel(let channel): - // swiftlint:disable:next force_cast - let cell = tableView.dequeueReusableCell(withIdentifier: "ChannelCell", for: indexPath) as! ChannelCell - cell.channel = channel - return cell - case .video(let video): - // swiftlint:disable:next force_cast - let cell = tableView.dequeueReusableCell(withIdentifier: "VideoCell", for: indexPath) as! VideoCell - cell.video = video - return cell - case .playlist(let playlist): - // swiftlint:disable:next force_cast - let cell = tableView.dequeueReusableCell(withIdentifier: "PlaylistCell", for: indexPath) as! PlaylistCell - cell.playlist = playlist - return cell - case .playlistItem(let playlistItem): - // swiftlint:disable:next force_cast - let cell = tableView.dequeueReusableCell(withIdentifier: "PlaylistItemCell", for: indexPath) as! PlaylistItemCell - cell.playlistItem = playlistItem - return cell - } - } - - override func scrollViewDidScroll(_ scrollView: UIScrollView) { - guard let provider = model.provider.value, !provider.items.value.isEmpty && !provider.isLoadingPage else { - return - } - - let lastCellIndexPath = IndexPath(row: provider.items.value.count - 1, section: 0) - if tableView.cellForRow(at: lastCellIndexPath) == nil { - return - } - - provider.pageLoader?.startWithFailed { [weak self] error in - self?.presentError(error) - } - } - - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - guard let destinationController = segue.destination as? ItemsViewController else { - return - } - - if let cell = sender as? ChannelCell, let channel = cell.channel { - // swiftlint:disable:next force_unwrapping - destinationController.title = channel.snippet!.title - destinationController.model.mutableProvider.value = AnyItemsProvider { token, limit in - let request: SearchRequest = .videosFromChannel(withID: channel.id, - requiredParts: [.statistics, .contentDetails], - limit: limit, - pageToken: token) - return Engine.defaultEngine - .search(request) - .map { page in (page.items.map { $0.displayItem }, page.nextPageToken) } - } - } else if let cell = sender as? PlaylistCell, let playlist = cell.playlist { - // swiftlint:disable:next force_unwrapping - destinationController.title = playlist.snippet!.title - destinationController.model.mutableProvider.value = AnyItemsProvider { token, limit in - let request: PlaylistItemRequest = .itemsFromPlaylist(withID: playlist.id, - requiredParts: [.snippet], - limit: limit, - pageToken: token) - return Engine.defaultEngine - .playlistItems(request) - .map { page in (page.items.map { .playlistItem($0) }, page.nextPageToken) } - } - } - } - - private func presentError(_ error: NSError) { - let alert = UIAlertController(title: "Request failed", - message: error.localizedDescription, - preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil)) - present(alert, animated: true, completion: nil) - } -} diff --git a/Example/YoutubeEngine/ItemsViewModel.swift b/Example/YoutubeEngine/ItemsViewModel.swift deleted file mode 100644 index 736d258..0000000 --- a/Example/YoutubeEngine/ItemsViewModel.swift +++ /dev/null @@ -1,24 +0,0 @@ -import Foundation -import ReactiveSwift - -protocol ItemsViewModel { - associatedtype Item - - var provider: Property?> { get } -} - -extension ItemsViewModel { - var items: [Item] { - return provider.value?.items.value ?? [] - } -} - -final class MutableItemsViewModel: ItemsViewModel { - let provider: Property?> - let mutableProvider: MutableProperty?> - - init() { - self.mutableProvider = MutableProperty(nil) - self.provider = Property(mutableProvider) - } -} diff --git a/Example/YoutubeEngine/YoutubeViewController.swift b/Example/YoutubeEngine/YoutubeViewController.swift deleted file mode 100644 index 4b20c5e..0000000 --- a/Example/YoutubeEngine/YoutubeViewController.swift +++ /dev/null @@ -1,65 +0,0 @@ -import ReactiveSwift -import UIKit -import YoutubeEngine - -extension Engine { - #warning("Generate yout own api key https://developers.google.com/youtube/v3/getting-started") - static let defaultEngine = Engine( - authorization: .key("AIzaSyBjLH-61v1oTcb_wQUcGAYIHmWSCj19Ss4"), - isLogEnabled: true - ) -} - -final class YoutubeViewModel { - let keyword = MutableProperty("") -} - -final class YoutubeViewController: UIViewController { - - @IBOutlet private var searchBar: UISearchBar! - - private let model = YoutubeViewModel() - - override func viewDidLoad() { - super.viewDidLoad() - - navigationItem.titleView = searchBar - automaticallyAdjustsScrollViewInsets = false - } - - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - guard let contentController = segue.destination as? ItemsViewController else { - return - } - contentController.model.mutableProvider <~ model.keyword.signal - .debounce(0.5, on: QueueScheduler.main) - .map { keyword -> AnyItemsProvider? in - if keyword.isEmpty { - return nil - } - return AnyItemsProvider { token, limit in - let request: SearchRequest = .search( - withTerm: keyword, - requiredVideoParts: [.statistics, .contentDetails], - requiredChannelParts: [.statistics], - requiredPlaylistParts: [.snippet], - limit: limit, - pageToken: token - ) - return Engine.defaultEngine - .search(request) - .map { page in (page.items.map { $0.displayItem }, page.nextPageToken) } - } - } - } -} - -extension YoutubeViewController: UISearchBarDelegate { - func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { - model.keyword.value = searchText - } - - func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { - searchBar.resignFirstResponder() - } -} From e349bbfd7d418d40fda0df177905222b35c554d9 Mon Sep 17 00:00:00 2001 From: Igor Palaguta Date: Wed, 15 Apr 2020 12:27:03 +0300 Subject: [PATCH 3/7] Fix swiftlint --- .swiftformat | 2 +- .swiftlint.yml | 3 ++- YoutubeEngine.xcodeproj/project.pbxproj | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.swiftformat b/.swiftformat index 6f5cfb0..7e4dcc1 100644 --- a/.swiftformat +++ b/.swiftformat @@ -1,5 +1,5 @@ # file options ---exclude Example/Pods,.build,.swiftpm,.git,.swiftpm +--exclude Carthage,.build,.swiftpm,.git,.swiftpm # format options --indent 4 diff --git a/.swiftlint.yml b/.swiftlint.yml index f0aef5e..b4416ce 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -98,7 +98,8 @@ excluded: - .git - .build - .swiftpm - - Example/Pods + - Pods + - Carthage custom_rules: tabs: diff --git a/YoutubeEngine.xcodeproj/project.pbxproj b/YoutubeEngine.xcodeproj/project.pbxproj index 5331474..f381656 100644 --- a/YoutubeEngine.xcodeproj/project.pbxproj +++ b/YoutubeEngine.xcodeproj/project.pbxproj @@ -644,6 +644,7 @@ isa = PBXNativeTarget; buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "YoutubeEngine_Example" */; buildPhases = ( + 8235316A24470AA500304F9F /* SwiftLint */, 607FACCC1AFB9204008FA782 /* Sources */, 607FACCD1AFB9204008FA782 /* Frameworks */, 607FACCE1AFB9204008FA782 /* Resources */, @@ -969,6 +970,27 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 8235316A24470AA500304F9F /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 607FACCC1AFB9204008FA782 /* Sources */ = { isa = PBXSourcesBuildPhase; From 8403076a79adc56bd5eef0f5366a3b3f3ade4b87 Mon Sep 17 00:00:00 2001 From: Igor Palaguta Date: Wed, 15 Apr 2020 12:27:59 +0300 Subject: [PATCH 4/7] fix formatting --- Example/Cells/VideoCell.swift | 2 +- Example/ItemsViewController.swift | 6 +++--- Source/YoutubeEngine/Data/Image.swift | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Example/Cells/VideoCell.swift b/Example/Cells/VideoCell.swift index 87f65a1..31d6377 100644 --- a/Example/Cells/VideoCell.swift +++ b/Example/Cells/VideoCell.swift @@ -15,7 +15,7 @@ final class VideoCell: UITableViewCell { didSet { // swiftlint:disable:next force_unwrapping let snippet = video.snippet! - + thumbnailView.kf.setImage(with: ImageResource(downloadURL: snippet.defaultImage.url), options: [.transition(.fade(0.3))]) diff --git a/Example/ItemsViewController.swift b/Example/ItemsViewController.swift index f148c7b..af97182 100644 --- a/Example/ItemsViewController.swift +++ b/Example/ItemsViewController.swift @@ -109,9 +109,9 @@ final class ItemsViewController: UITableViewController { destinationController.title = playlist.snippet!.title destinationController.model.mutableProvider.value = AnyItemsProvider { token, limit in let request: PlaylistItemRequest = .itemsFromPlaylist(withID: playlist.id, - requiredParts: [.snippet], - limit: limit, - pageToken: token) + requiredParts: [.snippet], + limit: limit, + pageToken: token) return Engine.defaultEngine .playlistItems(request) .map { page in (page.items.map { .playlistItem($0) }, page.nextPageToken) } diff --git a/Source/YoutubeEngine/Data/Image.swift b/Source/YoutubeEngine/Data/Image.swift index 892301c..2cbfa35 100644 --- a/Source/YoutubeEngine/Data/Image.swift +++ b/Source/YoutubeEngine/Data/Image.swift @@ -1,5 +1,5 @@ -import Foundation import CoreGraphics +import Foundation public struct Image: Equatable { public let url: URL From 19d33e6379d0938ae94c36d9de4ece612f82f7a3 Mon Sep 17 00:00:00 2001 From: Igor Palaguta Date: Wed, 15 Apr 2020 12:29:30 +0300 Subject: [PATCH 5/7] fix typo --- Example/YoutubeViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example/YoutubeViewController.swift b/Example/YoutubeViewController.swift index 4b20c5e..6bb70c1 100644 --- a/Example/YoutubeViewController.swift +++ b/Example/YoutubeViewController.swift @@ -3,7 +3,7 @@ import UIKit import YoutubeEngine extension Engine { - #warning("Generate yout own api key https://developers.google.com/youtube/v3/getting-started") + #warning("Generate your own API key https://developers.google.com/youtube/v3/getting-started") static let defaultEngine = Engine( authorization: .key("AIzaSyBjLH-61v1oTcb_wQUcGAYIHmWSCj19Ss4"), isLogEnabled: true From 711b289950f892256eb5950821645b8948f825e9 Mon Sep 17 00:00:00 2001 From: Igor Palaguta Date: Wed, 15 Apr 2020 12:43:17 +0300 Subject: [PATCH 6/7] Remove _Pods project Fix build settings --- YoutubeEngine.xcodeproj/project.pbxproj | 46 ++++++------------- .../xcshareddata/WorkspaceSettings.xcsettings | 8 ++++ _Pods.xcodeproj | 1 - 3 files changed, 22 insertions(+), 33 deletions(-) create mode 100644 YoutubeEngine.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 120000 _Pods.xcodeproj diff --git a/YoutubeEngine.xcodeproj/project.pbxproj b/YoutubeEngine.xcodeproj/project.pbxproj index f381656..fbbe50a 100644 --- a/YoutubeEngine.xcodeproj/project.pbxproj +++ b/YoutubeEngine.xcodeproj/project.pbxproj @@ -55,6 +55,11 @@ 8246B7702445A16E00AEAEC6 /* PlaylistCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B76F2445A16D00AEAEC6 /* PlaylistCell.swift */; }; 8246B77A2445ADAF00AEAEC6 /* DisplayItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B7792445ADAF00AEAEC6 /* DisplayItem.swift */; }; 8246B77D2445B43500AEAEC6 /* PlaylistItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8246B77C2445B43500AEAEC6 /* PlaylistItemCell.swift */; }; + 82BE057F24470DCD00658D07 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82353144244706E700304F9F /* Kingfisher.framework */; }; + 82BE058024470DCD00658D07 /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 823530C62447035300304F9F /* ReactiveSwift.framework */; }; + 82BE058124470DF900658D07 /* YoutubeEngine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 823530D6244704E500304F9F /* YoutubeEngine.framework */; }; + 82BE058224470DF900658D07 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82353130244705F700304F9F /* Nimble.framework */; }; + 82BE058324470DF900658D07 /* OHHTTPStubs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8235315B244707C000304F9F /* OHHTTPStubs.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -184,13 +189,6 @@ remoteGlobalIDString = 1F1A74281940169200FFFC47; remoteInfo = "Nimble-iOS"; }; - 8235313B2447060600304F9F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 823530B72447035300304F9F /* ReactiveSwift.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = D047260B19E49F82006002AA; - remoteInfo = "ReactiveSwift-iOS"; - }; 82353143244706E700304F9F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 8235313D244706E700304F9F /* Kingfisher.xcodeproj */; @@ -275,14 +273,7 @@ remoteGlobalIDString = EA100AB71BE15BE400129352; remoteInfo = "OHHTTPStubs tvOS Fmk Tests"; }; - 82353166244707CF00304F9F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 82353121244705F700304F9F /* Nimble.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 1F1A74281940169200FFFC47; - remoteInfo = "Nimble-iOS"; - }; - 82353168244707D700304F9F /* PBXContainerItemProxy */ = { + 82BE056824470DB100658D07 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 8235314B244707BF00304F9F /* OHHTTPStubs.xcodeproj */; proxyType = 1; @@ -368,6 +359,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 82BE057F24470DCD00658D07 /* Kingfisher.framework in Frameworks */, + 82BE058024470DCD00658D07 /* ReactiveSwift.framework in Frameworks */, 823530DD244704E500304F9F /* YoutubeEngine.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -376,6 +369,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 82BE058124470DF900658D07 /* YoutubeEngine.framework in Frameworks */, + 82BE058224470DF900658D07 /* Nimble.framework in Frameworks */, + 82BE058324470DF900658D07 /* OHHTTPStubs.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -673,9 +669,9 @@ buildRules = ( ); dependencies = ( + 82BE056924470DB100658D07 /* PBXTargetDependency */, 823531382447060600304F9F /* PBXTargetDependency */, 8235313A2447060600304F9F /* PBXTargetDependency */, - 8235313C2447060600304F9F /* PBXTargetDependency */, ); name = YoutubeEngine_Tests; productName = Tests; @@ -694,8 +690,6 @@ buildRules = ( ); dependencies = ( - 82353169244707D700304F9F /* PBXTargetDependency */, - 82353167244707CF00304F9F /* PBXTargetDependency */, 8235311E244705A400304F9F /* PBXTargetDependency */, ); name = YoutubeEngine; @@ -1077,25 +1071,15 @@ name = "Nimble-iOS"; targetProxy = 823531392447060600304F9F /* PBXContainerItemProxy */; }; - 8235313C2447060600304F9F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "ReactiveSwift-iOS"; - targetProxy = 8235313B2447060600304F9F /* PBXContainerItemProxy */; - }; 8235314A244706F900304F9F /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Kingfisher; targetProxy = 82353149244706F900304F9F /* PBXContainerItemProxy */; }; - 82353167244707CF00304F9F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Nimble-iOS"; - targetProxy = 82353166244707CF00304F9F /* PBXContainerItemProxy */; - }; - 82353169244707D700304F9F /* PBXTargetDependency */ = { + 82BE056924470DB100658D07 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "OHHTTPStubs iOS Framework"; - targetProxy = 82353168244707D700304F9F /* PBXContainerItemProxy */; + targetProxy = 82BE056824470DB100658D07 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -1280,7 +1264,6 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/YoutubeEngine_Example.app/YoutubeEngine_Example"; }; name = Debug; }; @@ -1296,7 +1279,6 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/YoutubeEngine_Example.app/YoutubeEngine_Example"; }; name = Release; }; diff --git a/YoutubeEngine.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/YoutubeEngine.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..08de0be --- /dev/null +++ b/YoutubeEngine.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/_Pods.xcodeproj b/_Pods.xcodeproj deleted file mode 120000 index 3c5a8e7..0000000 --- a/_Pods.xcodeproj +++ /dev/null @@ -1 +0,0 @@ -Example/Pods/Pods.xcodeproj \ No newline at end of file From 0c01e41a6cbf88a73566cff3b7fa9c40662972d3 Mon Sep 17 00:00:00 2001 From: Igor Palaguta Date: Wed, 15 Apr 2020 12:48:49 +0300 Subject: [PATCH 7/7] Bump version --- README.md | 6 +++--- YoutubeEngine.podspec | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1e9118c..ed1ffaa 100644 --- a/README.md +++ b/README.md @@ -36,17 +36,17 @@ Supports Swift 5 Cocoapods ```ruby -pod "YoutubeEngine", :git => 'https://github.com/Igor-Palaguta/YoutubeEngine', :tag => '0.6.0' +pod "YoutubeEngine", :git => 'https://github.com/Igor-Palaguta/YoutubeEngine', :tag => '0.7.0' ``` Carthage ```ruby -github "Igor-Palaguta/YoutubeEngine" ~> 0.6.0 +github "Igor-Palaguta/YoutubeEngine" ~> 0.7.0 ``` SPM ```swift -.package(url: "https://github.com/Igor-Palaguta/YoutubeEngine", .upToNextMinor(from: "0.6.0")) +.package(url: "https://github.com/Igor-Palaguta/YoutubeEngine", .upToNextMinor(from: "0.7.0")) ``` ## Implemented API diff --git a/YoutubeEngine.podspec b/YoutubeEngine.podspec index 223f57a..271329e 100644 --- a/YoutubeEngine.podspec +++ b/YoutubeEngine.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'YoutubeEngine' - s.version = '0.5.0' + s.version = '0.7.0' s.summary = 'Swift ReactiveCocoa lib for Youtube api.' s.description = <<-DESC