Browse Source

ios 10.3

master
Marco Schmickler 9 years ago
parent
commit
e6dd076b42
  1. 412
      .idea/kplayer.iml
  2. 21
      Podfile
  3. 75
      kplayer.xcodeproj/project.pbxproj
  4. 34
      kplayer/AppDelegate.swift
  5. 38
      kplayer/Base.lproj/Main.storyboard
  6. 25
      kplayer/Images.xcassets/AppIcon.appiconset/Contents.json
  7. 2
      kplayer/core/ItemModel.swift
  8. 38
      kplayer/core/MediaItem.swift
  9. 113
      kplayer/core/NetworkManager.swift
  10. 102
      kplayer/detail/DetailViewController.swift
  11. 4
      kplayer/detail/HeaderCell.swift
  12. 8
      kplayer/detail/ItemCell.swift
  13. 92
      kplayer/detail/VideoPlayerController.swift
  14. 50
      kplayer/master/MasterViewController.swift
  15. 182
      kplayer/photo/MediaPhotoController.swift
  16. 22
      kplayer/util/DataLoadOperation.swift
  17. 10
      kplayer/util/HanekeFetchOperation.swift
  18. 28
      kplayer/util/ImageLoadOperation.swift
  19. 20
      kplayer/util/LayoutTools.swift
  20. 4
      kplayer/util/NetData.swift
  21. 94
      kplayer/util/NetworkHelper.swift
  22. 12
      kplayer/util/UIImageExtension.swift
  23. 49
      kplayer/util/UploadOperation.swift
  24. 10
      kplayer/util/ViewControllerExtensions.swift
  25. 32
      kplayer/util/stringutil.swift
  26. 2
      kplayerTests/kplayerTests.swift

412
.idea/kplayer.iml

@ -1,412 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module type="CIDR_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$USER_HOME$/Library/Caches/AppCode2016.2/DerivedData/kplayer-fxfvdfbishumcxanrvilyvrckkob/Build/Intermediates/Pods.build/Debug-iphoneos/ALMoviePlayerController.build/DerivedSources" />
<content url="file://$USER_HOME$/Library/Caches/AppCode2016.2/DerivedData/kplayer-fxfvdfbishumcxanrvilyvrckkob/Build/Intermediates/Pods.build/Debug-iphoneos/Alamofire.build/DerivedSources" />
<content url="file://$USER_HOME$/Library/Caches/AppCode2016.2/DerivedData/kplayer-fxfvdfbishumcxanrvilyvrckkob/Build/Intermediates/Pods.build/Debug-iphoneos/Cent.build/DerivedSources" />
<content url="file://$USER_HOME$/Library/Caches/AppCode2016.2/DerivedData/kplayer-fxfvdfbishumcxanrvilyvrckkob/Build/Intermediates/Pods.build/Debug-iphoneos/Dollar.build/DerivedSources" />
<content url="file://$USER_HOME$/Library/Caches/AppCode2016.2/DerivedData/kplayer-fxfvdfbishumcxanrvilyvrckkob/Build/Intermediates/Pods.build/Debug-iphoneos/HanekeSwift.build/DerivedSources" />
<content url="file://$USER_HOME$/Library/Caches/AppCode2016.2/DerivedData/kplayer-fxfvdfbishumcxanrvilyvrckkob/Build/Intermediates/Pods.build/Debug-iphoneos/Nimbus.build/DerivedSources" />
<content url="file://$USER_HOME$/Library/Caches/AppCode2016.2/DerivedData/kplayer-fxfvdfbishumcxanrvilyvrckkob/Build/Intermediates/Pods.build/Debug-iphoneos/Pods.build/DerivedSources" />
<content url="file://$USER_HOME$/Library/Caches/AppCode2016.2/DerivedData/kplayer-fxfvdfbishumcxanrvilyvrckkob/Build/Intermediates/kplayer.build/Debug-iphoneos/kplayer.build/DerivedSources" />
<content url="file://$USER_HOME$/Library/Caches/AppCode2016.2/DerivedData/kplayer-fxfvdfbishumcxanrvilyvrckkob/Build/Intermediates/kplayer.build/Debug-iphoneos/kplayerTests.build/DerivedSources" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/kplayerTests/kplayerTests.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayerTests/Info.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Podfile" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/detail/VideoPlayerController.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/detail/HeaderCell.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/detail/ItemCell.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/detail/DetailViewController.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/Info.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/AppDelegate.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/Images.xcassets" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/Kirschkeks-256x256.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/photo/MediaPhotoController.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/NetData.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/ImageLoadOperation.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/HanekeFetchOperation.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/UIImageExtension.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/ViewControllerExtensions.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/LayoutTools.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/UploadOperation.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/DataLoadOperation.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/NetworkHelper.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/util/stringutil.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/core/NetworkManager.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/core/MediaItem.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/core/ItemModel.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/kplayer.xcdatamodeld/kplayer.xcdatamodel" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/master/MasterViewController.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/scratch.txt" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/Base.lproj/LaunchScreen.xib" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/kplayer/Base.lproj/Main.storyboard" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/ServerTrustPolicy.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/ParameterEncoding.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/MultipartFormData.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/ResponseSerialization.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/Request.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/Download.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/Manager.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/Error.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/Alamofire.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/Stream.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/Upload.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/Validation.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Alamofire/Source/Result.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/NSFileManager+Haneke.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/Log.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/Fetch.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/UIImageView+Haneke.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/CryptoSwiftMD5.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/NetworkFetcher.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/Data.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/Format.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/UIButton+Haneke.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/Haneke.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/DiskCache.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/UIView+Haneke.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/UIImage+Haneke.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/String+Haneke.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/DiskFetcher.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/Fetcher.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/CGSize+Swift.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/NSHTTPURLResponse+Haneke.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/NSURLResponse+Haneke.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/HanekeSwift/Haneke/Cache.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Cent/Sources/Array.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Cent/Sources/Date.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Cent/Sources/Int.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Cent/Sources/Range.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Cent/Sources/Dictionary.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Cent/Sources/Cent.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Cent/Sources/Regex.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Cent/Sources/String.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Alamofire/Alamofire.modulemap" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Alamofire/Info.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Alamofire/Alamofire.xcconfig" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Alamofire/Alamofire-dummy.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/HanekeSwift/HanekeSwift-prefix.pch" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/HanekeSwift/HanekeSwift-dummy.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/HanekeSwift/HanekeSwift.xcconfig" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/HanekeSwift/HanekeSwift-umbrella.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/HanekeSwift/HanekeSwift.modulemap" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/HanekeSwift/Info.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Cent/Cent-umbrella.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Cent/Cent-dummy.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Cent/Info.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Cent/Cent.modulemap" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Cent/Cent-prefix.pch" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Cent/Cent.xcconfig" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Nimbus/Nimbus.xcconfig" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Nimbus/Nimbus-prefix.pch" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Nimbus/Nimbus-dummy.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Nimbus/Info.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Nimbus/Nimbus.modulemap" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Nimbus/Nimbus-umbrella.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/ALMoviePlayerController/ALMoviePlayerController-dummy.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/ALMoviePlayerController/ALMoviePlayerController-prefix.pch" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/ALMoviePlayerController/ALMoviePlayerController.modulemap" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/ALMoviePlayerController/Info.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/ALMoviePlayerController/ALMoviePlayerController.xcconfig" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/ALMoviePlayerController/ALMoviePlayerController-umbrella.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Dollar/Dollar-dummy.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Dollar/Dollar.modulemap" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Dollar/Dollar-prefix.pch" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Dollar/Info.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Dollar/Dollar.xcconfig" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Dollar/Dollar-umbrella.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Pods.modulemap" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Pods-frameworks.sh" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Pods-resources.sh" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Pods.release.xcconfig" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Info.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Pods-umbrella.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Pods-dummy.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Pods.debug.xcconfig" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Target Support Files/Pods/Pods-acknowledgements.plist" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIDebuggingTools.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NISDKAvailability.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NISnapshotRotation.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIButtonUtilities.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIFoundationMethods.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIDeviceOrientation.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NimbusCore.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIFoundationMethods.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIInMemoryCache.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIRuntimeClassModifications.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIInMemoryCache.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIRuntimeClassModifications.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIButtonUtilities.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NINonRetainingCollections.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NINonEmptyCollectionTesting.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIDebuggingTools.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIActions.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NINonEmptyCollectionTesting.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIState.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIActions.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NICommonMetrics.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIDeviceOrientation.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIState.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIError.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NICommonMetrics.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NINetworkActivity.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIPreprocessorMacros.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIError.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/UIResponder+NimbusCore.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIPaths.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIViewRecycler.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NISDKAvailability.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/UIResponder+NimbusCore.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIViewRecycler.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIImageUtilities.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIOperations+Subclassing.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NINonRetainingCollections.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIOperations.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NINetworkActivity.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIActions+Subclassing.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIOperations.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIPaths.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NimbusCore+Additions.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NIImageUtilities.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/core/src/NISnapshotRotation.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoAlbumScrollViewDelegate.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoAlbumScrollViewDataSource.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NimbusPhotos.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoScrubberView.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoAlbumScrollView.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoScrollView.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIToolbarPhotoViewController.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoAlbumScrollView.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoScrollViewPhotoSize.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoScrollView.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIToolbarPhotoViewController.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoScrollViewDelegate.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/photos/src/NIPhotoScrubberView.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/pagingscrollview/src/NIPagingScrollView.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/pagingscrollview/src/NIPagingScrollViewPage.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/pagingscrollview/src/NIPagingScrollView.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/pagingscrollview/src/NIPagingScrollView+Subclassing.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/pagingscrollview/src/NimbusPagingScrollView.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Nimbus/src/pagingscrollview/src/NIPagingScrollViewPage.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/ALMoviePlayerController.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/ALMoviePlayerControls.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/ALButton.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/ALAirplayView.m" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/ALMoviePlayerController.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/ALAirplayView.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/ALButton.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/moviePause.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieBackward.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieForward.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieBackward@2x.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieBackwardSelected@2x.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieForwardSelected.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieEndFullscreen.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/moviePause@2x.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieBackwardSelected.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieForward@2x.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieEndFullscreen@2x.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/moviePlay@2x.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/moviePlay.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieFullscreen@2x.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieFullscreen.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/Images/movieForwardSelected@2x.png" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/ALMoviePlayerController/ALMoviePlayerController/ALMoviePlayerControls.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Dollar/Sources/Dollar.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Dollar/Sources/Dollar.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Dollar/Sources/AutoBind.swift" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Pods/Dollar/Sources/AutoCurry.swift" isTestSource="false" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library name="Header Search Paths">
<CLASSES>
<root url="file:///Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Frameworks/InterfaceBuilderKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Frameworks/DTPerformanceSession.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/HealthKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/PassKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreAudioKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MultipeerConnectivity.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AssetsLibrary.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/WatchConnectivity.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreVideo.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/StoreKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SceneKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OpenGLES.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CFNetwork.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Accelerate.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AddressBookUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/EventKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/WatchKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GSS.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AudioUnit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreSpotlight.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/LocalAuthentication.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/HealthKitUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Metal.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/VideoToolbox.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MediaToolbox.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Contacts.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/QuickLook.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SafariServices.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GameplayKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/WebKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CloudKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreImage.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/EventKitUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Photos.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MediaPlayer.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AVFoundation.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/JavaScriptCore.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/PushKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreTelephony.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreText.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ReplayKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SpriteKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Twitter.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/NetworkExtension.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreAudio.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreData.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/UIKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MapKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ContactsUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreMedia.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MediaAccessibility.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ExternalAccessory.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Security.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ModelIO.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GLKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MetalKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/HomeKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GameController.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AVKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreBluetooth.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AdSupport.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Social.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SystemConfiguration.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Accounts.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OpenAL.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/NotificationCenter.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ImageIO.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/PhotosUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MobileCoreServices.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AddressBook.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/NewsstandKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MessageUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GameKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreLocation.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/QuartzCore.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/iAd.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreMotion.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/7.3.0/include" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1" />
</CLASSES>
<SOURCES>
<root url="file:///Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Frameworks/InterfaceBuilderKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Frameworks/DTPerformanceSession.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/HealthKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/PassKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreAudioKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MultipeerConnectivity.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AssetsLibrary.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/WatchConnectivity.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreVideo.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/StoreKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SceneKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OpenGLES.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CFNetwork.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Accelerate.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AddressBookUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/EventKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/WatchKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GSS.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AudioUnit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreSpotlight.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/LocalAuthentication.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/HealthKitUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Metal.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/VideoToolbox.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MediaToolbox.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Contacts.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/QuickLook.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SafariServices.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GameplayKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/WebKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CloudKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreImage.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/EventKitUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Photos.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MediaPlayer.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AVFoundation.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/JavaScriptCore.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/PushKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreTelephony.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreText.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ReplayKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SpriteKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Twitter.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/NetworkExtension.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreAudio.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreData.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/UIKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MapKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ContactsUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreMedia.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MediaAccessibility.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ExternalAccessory.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Security.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ModelIO.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GLKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MetalKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/HomeKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GameController.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AVKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreBluetooth.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AdSupport.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Social.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SystemConfiguration.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Accounts.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OpenAL.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/NotificationCenter.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/ImageIO.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/PhotosUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MobileCoreServices.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AddressBook.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/NewsstandKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/MessageUI.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/GameKit.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreLocation.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/QuartzCore.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/iAd.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreMotion.framework/Headers" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/7.3.0/include" />
<root url="file:///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1" />
</SOURCES>
</library>
</orderEntry>
</component>
</module>
<module classpath="AppCode" type="CIDR_MODULE" version="4" />

21
Podfile

@ -1,19 +1,30 @@
platform :ios, '8.3'
platform :ios, '10.2'
source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/CocoaPods/Specs.git'
use_frameworks! use_frameworks!
target 'kplayer' do
# pod 'Player' # pod 'Player'
#pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'swift-2.0' #pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'swift-2.0'
#pod 'Alamofire', '~> 1.2' #pod 'Alamofire', '~> 1.2'
pod 'Alamofire', '~> 2.0'
pod 'Alamofire', '~> 4.2'
pod 'ALMoviePlayerController', '~>0.3.0' pod 'ALMoviePlayerController', '~>0.3.0'
#pod 'DZVideoPlayerViewController' #pod 'DZVideoPlayerViewController'
#pod 'SwiftyJSON' #pod 'SwiftyJSON'
pod 'HanekeSwift'
#pod 'HanekeSwift'
pod 'HanekeSwift', :git => 'https://github.com/jasonnoahchoi/HanekeSwift', :branch => 'swift3'
pod 'Nimbus/Photos' pod 'Nimbus/Photos'
pod 'Nimbus/PagingScrollView' pod 'Nimbus/PagingScrollView'
#pod 'AFNetworking', '~>2.1' #pod 'AFNetworking', '~>2.1'
pod 'Dollar'
pod 'Cent'
#pod 'Dollar', '6.1.0'
#pod 'Cent', '6.0.3'
#, '1.2.0' #, '1.2.0'
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.0'
end
end
end
end

75
kplayer.xcodeproj/project.pbxproj

@ -29,7 +29,7 @@
1C736D24B49451141CD4B64D /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7369F53095B7A4D65679C2 /* DetailViewController.swift */; }; 1C736D24B49451141CD4B64D /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7369F53095B7A4D65679C2 /* DetailViewController.swift */; };
1C736F6A223D4ADB2E1BA733 /* ItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736069C214E9522BB1BD97 /* ItemCell.swift */; }; 1C736F6A223D4ADB2E1BA733 /* ItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736069C214E9522BB1BD97 /* ItemCell.swift */; };
1C736FB92B19FE17E4357C85 /* MediaItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73688DAB88F9360FB62A49 /* MediaItem.swift */; }; 1C736FB92B19FE17E4357C85 /* MediaItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73688DAB88F9360FB62A49 /* MediaItem.swift */; };
A5D637AE4588AAB5DC1CBC6B /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 127AC1F28342F9AAE3CEC5C2 /* Pods.framework */; };
AA74B07A01F0E99E6DEC7D1B /* Pods_kplayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B75159FFCD5A882E6F167FE /* Pods_kplayer.framework */; };
C98AF5D51B124D6A00D196CC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C98AF5D41B124D6A00D196CC /* AppDelegate.swift */; }; C98AF5D51B124D6A00D196CC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C98AF5D41B124D6A00D196CC /* AppDelegate.swift */; };
C98AF5D81B124D6A00D196CC /* kplayer.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = C98AF5D61B124D6A00D196CC /* kplayer.xcdatamodeld */; }; C98AF5D81B124D6A00D196CC /* kplayer.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = C98AF5D61B124D6A00D196CC /* kplayer.xcdatamodeld */; };
C98AF5DF1B124D6A00D196CC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C98AF5DD1B124D6A00D196CC /* Main.storyboard */; }; C98AF5DF1B124D6A00D196CC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C98AF5DD1B124D6A00D196CC /* Main.storyboard */; };
@ -49,7 +49,6 @@
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
127AC1F28342F9AAE3CEC5C2 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; };
1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Kirschkeks-256x256.png"; path = "kplayer/Kirschkeks-256x256.png"; sourceTree = "<group>"; }; 1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Kirschkeks-256x256.png"; path = "kplayer/Kirschkeks-256x256.png"; sourceTree = "<group>"; };
1C736069C214E9522BB1BD97 /* ItemCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemCell.swift; sourceTree = "<group>"; }; 1C736069C214E9522BB1BD97 /* ItemCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemCell.swift; sourceTree = "<group>"; };
1C7360744ABACC3557D05760 /* HanekeFetchOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HanekeFetchOperation.swift; sourceTree = "<group>"; }; 1C7360744ABACC3557D05760 /* HanekeFetchOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HanekeFetchOperation.swift; sourceTree = "<group>"; };
@ -72,8 +71,8 @@
1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = "<group>"; }; 1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = "<group>"; };
1C736E3BE8EC464D6F5DC8FA /* scratch.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scratch.txt; sourceTree = "<group>"; }; 1C736E3BE8EC464D6F5DC8FA /* scratch.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scratch.txt; sourceTree = "<group>"; };
1C736F9338CE36708244D42A /* DataLoadOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoadOperation.swift; sourceTree = "<group>"; }; 1C736F9338CE36708244D42A /* DataLoadOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoadOperation.swift; sourceTree = "<group>"; };
5C6CBA548F885BF342F594EA /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
A170BFB886D61D57F7009BFC /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
6D522F61736592330F481B4F /* Pods-kplayer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-kplayer.debug.xcconfig"; path = "Pods/Target Support Files/Pods-kplayer/Pods-kplayer.debug.xcconfig"; sourceTree = "<group>"; };
8B75159FFCD5A882E6F167FE /* Pods_kplayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_kplayer.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C98AF5CF1B124D6A00D196CC /* kplayer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = kplayer.app; sourceTree = BUILT_PRODUCTS_DIR; }; C98AF5CF1B124D6A00D196CC /* kplayer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = kplayer.app; sourceTree = BUILT_PRODUCTS_DIR; };
C98AF5D31B124D6A00D196CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; C98AF5D31B124D6A00D196CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C98AF5D41B124D6A00D196CC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; C98AF5D41B124D6A00D196CC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@ -84,6 +83,7 @@
C98AF5E91B124D6A00D196CC /* kplayerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = kplayerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; C98AF5E91B124D6A00D196CC /* kplayerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = kplayerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
C98AF5EE1B124D6A00D196CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; C98AF5EE1B124D6A00D196CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C98AF5EF1B124D6A00D196CC /* kplayerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = kplayerTests.swift; sourceTree = "<group>"; }; C98AF5EF1B124D6A00D196CC /* kplayerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = kplayerTests.swift; sourceTree = "<group>"; };
DF1DF76780D9CDC55209D1CE /* Pods-kplayer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-kplayer.release.xcconfig"; path = "Pods/Target Support Files/Pods-kplayer/Pods-kplayer.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -91,8 +91,8 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
A5D637AE4588AAB5DC1CBC6B /* Pods.framework in Frameworks */,
1C73635138BBD2BB480A308F /* MediaPlayer.framework in Frameworks */, 1C73635138BBD2BB480A308F /* MediaPlayer.framework in Frameworks */,
AA74B07A01F0E99E6DEC7D1B /* Pods_kplayer.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -160,22 +160,22 @@
path = core; path = core;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
8CB608B13A2BDFA9D708982B /* Frameworks */ = {
8052F5B3AAC2535E5C08A529 /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
127AC1F28342F9AAE3CEC5C2 /* Pods.framework */,
1C736777456388CA571DA17B /* MediaPlayer.framework */,
6D522F61736592330F481B4F /* Pods-kplayer.debug.xcconfig */,
DF1DF76780D9CDC55209D1CE /* Pods-kplayer.release.xcconfig */,
); );
name = Frameworks;
name = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
8EB26707CC8BD3E10F328A9E /* Pods */ = {
8CB608B13A2BDFA9D708982B /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5C6CBA548F885BF342F594EA /* Pods.debug.xcconfig */,
A170BFB886D61D57F7009BFC /* Pods.release.xcconfig */,
1C736777456388CA571DA17B /* MediaPlayer.framework */,
8B75159FFCD5A882E6F167FE /* Pods_kplayer.framework */,
); );
name = Pods;
name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
C98AF5C61B124D6A00D196CC = { C98AF5C61B124D6A00D196CC = {
@ -184,9 +184,9 @@
C98AF5D11B124D6A00D196CC /* kplayer */, C98AF5D11B124D6A00D196CC /* kplayer */,
C98AF5EC1B124D6A00D196CC /* kplayerTests */, C98AF5EC1B124D6A00D196CC /* kplayerTests */,
C98AF5D01B124D6A00D196CC /* Products */, C98AF5D01B124D6A00D196CC /* Products */,
8EB26707CC8BD3E10F328A9E /* Pods */,
8CB608B13A2BDFA9D708982B /* Frameworks */, 8CB608B13A2BDFA9D708982B /* Frameworks */,
1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */, 1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */,
8052F5B3AAC2535E5C08A529 /* Pods */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -250,12 +250,12 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = C98AF5F31B124D6A00D196CC /* Build configuration list for PBXNativeTarget "kplayer" */; buildConfigurationList = C98AF5F31B124D6A00D196CC /* Build configuration list for PBXNativeTarget "kplayer" */;
buildPhases = ( buildPhases = (
FA5E42A873B9445C28CCC025 /* Check Pods Manifest.lock */,
5BE7FB291B76EEE317F0B068 /* [CP] Check Pods Manifest.lock */,
C98AF5CB1B124D6A00D196CC /* Sources */, C98AF5CB1B124D6A00D196CC /* Sources */,
C98AF5CC1B124D6A00D196CC /* Frameworks */, C98AF5CC1B124D6A00D196CC /* Frameworks */,
C98AF5CD1B124D6A00D196CC /* Resources */, C98AF5CD1B124D6A00D196CC /* Resources */,
81E453B289EA9615E1980098 /* Embed Pods Frameworks */,
F554AE493C60519505E761A6 /* Copy Pods Resources */,
34FE5806529FEB6C56D30822 /* [CP] Embed Pods Frameworks */,
9901417B0A169BA87853DAAE /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@ -292,15 +292,17 @@
attributes = { attributes = {
LastSwiftMigration = 0700; LastSwiftMigration = 0700;
LastSwiftUpdateCheck = 0700; LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0720;
LastUpgradeCheck = 0820;
ORGANIZATIONNAME = "Marco Schmickler"; ORGANIZATIONNAME = "Marco Schmickler";
TargetAttributes = { TargetAttributes = {
C98AF5CE1B124D6A00D196CC = { C98AF5CE1B124D6A00D196CC = {
CreatedOnToolsVersion = 6.3.1; CreatedOnToolsVersion = 6.3.1;
DevelopmentTeam = G9J99WBBN9; DevelopmentTeam = G9J99WBBN9;
LastSwiftMigration = 0820;
}; };
C98AF5E81B124D6A00D196CC = { C98AF5E81B124D6A00D196CC = {
CreatedOnToolsVersion = 6.3.1; CreatedOnToolsVersion = 6.3.1;
LastSwiftMigration = 0820;
TestTargetID = C98AF5CE1B124D6A00D196CC; TestTargetID = C98AF5CE1B124D6A00D196CC;
}; };
}; };
@ -347,49 +349,49 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
81E453B289EA9615E1980098 /* Embed Pods Frameworks */ = {
34FE5806529FEB6C56D30822 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = ( inputPaths = (
); );
name = "Embed Pods Frameworks";
name = "[CP] Embed Pods Frameworks";
outputPaths = ( outputPaths = (
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-kplayer/Pods-kplayer-frameworks.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
F554AE493C60519505E761A6 /* Copy Pods Resources */ = {
5BE7FB291B76EEE317F0B068 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = ( inputPaths = (
); );
name = "Copy Pods Resources";
name = "[CP] Check Pods Manifest.lock";
outputPaths = ( outputPaths = (
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
FA5E42A873B9445C28CCC025 /* Check Pods Manifest.lock */ = {
9901417B0A169BA87853DAAE /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = ( inputPaths = (
); );
name = "Check Pods Manifest.lock";
name = "[CP] Copy Pods Resources";
outputPaths = ( outputPaths = (
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-kplayer/Pods-kplayer-resources.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
@ -474,8 +476,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@ -498,7 +502,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
IPHONEOS_DEPLOYMENT_TARGET = 10.2;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@ -520,8 +524,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@ -537,9 +543,10 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
IPHONEOS_DEPLOYMENT_TARGET = 10.2;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
}; };
@ -547,8 +554,9 @@
}; };
C98AF5F41B124D6A00D196CC /* Debug */ = { C98AF5F41B124D6A00D196CC /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 5C6CBA548F885BF342F594EA /* Pods.debug.xcconfig */;
baseConfigurationReference = 6D522F61736592330F481B4F /* Pods-kplayer.debug.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@ -557,13 +565,15 @@
PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE = "";
SWIFT_VERSION = 3.0;
}; };
name = Debug; name = Debug;
}; };
C98AF5F51B124D6A00D196CC /* Release */ = { C98AF5F51B124D6A00D196CC /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = A170BFB886D61D57F7009BFC /* Pods.release.xcconfig */;
baseConfigurationReference = DF1DF76780D9CDC55209D1CE /* Pods-kplayer.release.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@ -572,6 +582,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE = "";
SWIFT_VERSION = 3.0;
}; };
name = Release; name = Release;
}; };
@ -591,6 +602,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/kplayer.app/kplayer"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/kplayer.app/kplayer";
}; };
name = Debug; name = Debug;
@ -607,6 +619,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/kplayer.app/kplayer"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/kplayer.app/kplayer";
}; };
name = Release; name = Release;

34
kplayer/AppDelegate.swift

@ -15,11 +15,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
var window: UIWindow? var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch. // Override point for customization after application launch.
let splitViewController = self.window!.rootViewController as! UISplitViewController let splitViewController = self.window!.rootViewController as! UISplitViewController
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
splitViewController.delegate = self splitViewController.delegate = self
let masterNavigationController = splitViewController.viewControllers[0] as! UINavigationController let masterNavigationController = splitViewController.viewControllers[0] as! UINavigationController
@ -33,6 +33,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
MediaItem(name: "knk_archiv2", path:"", root: "/srv/samba/ren/knk_archiv2", type: ItemType.VIDEOROOT), MediaItem(name: "knk_archiv2", path:"", root: "/srv/samba/ren/knk_archiv2", type: ItemType.VIDEOROOT),
MediaItem(name: "knk_archiv3", path:"", root: "/srv/samba/ren/knk_archiv3", type: ItemType.VIDEOROOT), MediaItem(name: "knk_archiv3", path:"", root: "/srv/samba/ren/knk_archiv3", type: ItemType.VIDEOROOT),
MediaItem(name: "knk_archiv4", path:"", root: "/srv/samba/ren/knk_archiv4", type: ItemType.VIDEOROOT), MediaItem(name: "knk_archiv4", path:"", root: "/srv/samba/ren/knk_archiv4", type: ItemType.VIDEOROOT),
MediaItem(name: "fetish", path:"", root: "/srv/samba/ren/fetish", type: ItemType.VIDEOROOT),
MediaItem(name: "fjoy", path:"", root: "/srv/samba/ren/fjoy", type: ItemType.ROOT), MediaItem(name: "fjoy", path:"", root: "/srv/samba/ren/fjoy", type: ItemType.ROOT),
MediaItem(name: "heg", path:"", root: "/srv/samba/ren/heg", type: ItemType.ROOT), MediaItem(name: "heg", path:"", root: "/srv/samba/ren/heg", type: ItemType.ROOT),
MediaItem(name: "ten", path:"", root: "/srv/samba/ren/ten", type: ItemType.ROOT), MediaItem(name: "ten", path:"", root: "/srv/samba/ren/ten", type: ItemType.ROOT),
@ -41,31 +42,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
MediaItem(name: "series", path:"", root: "/srv/samba/ren/series", type: ItemType.ROOT), MediaItem(name: "series", path:"", root: "/srv/samba/ren/series", type: ItemType.ROOT),
MediaItem(name: "bm", path:"", root: "/srv/samba/ren/bm", type: ItemType.ROOT), MediaItem(name: "bm", path:"", root: "/srv/samba/ren/bm", type: ItemType.ROOT),
MediaItem(name: "medieval", path:"", root: "/srv/samba/ren/medieval", type: ItemType.ROOT), MediaItem(name: "medieval", path:"", root: "/srv/samba/ren/medieval", type: ItemType.ROOT),
] ]
return true return true
} }
func applicationWillResignActive(application: UIApplication) {
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
} }
func applicationDidEnterBackground(application: UIApplication) {
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
} }
func applicationWillEnterForeground(application: UIApplication) {
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
} }
func applicationDidBecomeActive(application: UIApplication) {
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
} }
func applicationWillTerminate(application: UIApplication) {
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
// Saves changes in the application's managed object context before the application terminates. // Saves changes in the application's managed object context before the application terminates.
self.saveContext() self.saveContext()
@ -73,7 +73,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
// MARK: - Split view // MARK: - Split view
func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController, ontoPrimaryViewController primaryViewController:UIViewController) -> Bool {
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool {
if let secondaryAsNavController = secondaryViewController as? UINavigationController { if let secondaryAsNavController = secondaryViewController as? UINavigationController {
if let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController { if let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController {
if topAsDetailController.detailItem == nil { if topAsDetailController.detailItem == nil {
@ -86,34 +86,34 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
} }
// MARK: - Core Data stack // MARK: - Core Data stack
lazy var applicationDocumentsDirectory: NSURL = {
lazy var applicationDocumentsDirectory: URL = {
// The directory the application uses to store the Core Data store file. This code uses a directory named "schmickler.kplayer" in the application's documents Application Support directory. // The directory the application uses to store the Core Data store file. This code uses a directory named "schmickler.kplayer" in the application's documents Application Support directory.
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return urls[urls.count-1] return urls[urls.count-1]
}() }()
lazy var managedObjectModel: NSManagedObjectModel = { lazy var managedObjectModel: NSManagedObjectModel = {
// The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model. // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
let modelURL = NSBundle.mainBundle().URLForResource("kplayer", withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
let modelURL = Bundle.main.url(forResource: "kplayer", withExtension: "momd")!
return NSManagedObjectModel(contentsOf: modelURL)!
}() }()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
// The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
// Create the coordinator and store // Create the coordinator and store
var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("kplayer.sqlite")
let url = self.applicationDocumentsDirectory.appendingPathComponent("kplayer.sqlite")
var error: NSError? = nil var error: NSError? = nil
var failureReason = "There was an error creating or loading the application's saved data." var failureReason = "There was an error creating or loading the application's saved data."
do { do {
try coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
try coordinator!.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
} catch var error1 as NSError { } catch var error1 as NSError {
error = error1 error = error1
coordinator = nil coordinator = nil
// Report any error we got. // Report any error we got.
var dict = [String: AnyObject]() var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
dict[NSUnderlyingErrorKey] = error dict[NSUnderlyingErrorKey] = error
error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
// Replace this with code to handle the error appropriately. // Replace this with code to handle the error appropriately.

38
kplayer/Base.lproj/Main.storyboard

@ -1,8 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="H1p-Uh-vWS">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11542" systemVersion="15G1108" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="H1p-Uh-vWS">
<device id="ipad9_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11524"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--Master--> <!--Master-->
@ -29,18 +33,18 @@
<viewControllerLayoutGuide type="bottom" id="GAO-Cl-Wes"/> <viewControllerLayoutGuide type="bottom" id="GAO-Cl-Wes"/>
</layoutGuides> </layoutGuides>
<view key="view" contentMode="scaleToFill" id="svH-Pt-448"> <view key="view" contentMode="scaleToFill" id="svH-Pt-448">
<rect key="frame" x="0.0" y="64" width="600" height="536"/>
<rect key="frame" x="0.0" y="64" width="768" height="960"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" misplaced="YES" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="0XM-y9-sOw"> <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" misplaced="YES" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="0XM-y9-sOw">
<rect key="frame" x="20" y="292" width="560" height="17"/> <rect key="frame" x="20" y="292" width="560" height="17"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<fontDescription key="fontDescription" type="system" size="system"/> <fontDescription key="fontDescription" type="system" size="system"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
</subviews> </subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints> <constraints>
<constraint firstItem="0XM-y9-sOw" firstAttribute="leading" secondItem="svH-Pt-448" secondAttribute="leading" constant="20" symbolic="YES" id="Tsc-yG-G1q"/> <constraint firstItem="0XM-y9-sOw" firstAttribute="leading" secondItem="svH-Pt-448" secondAttribute="leading" constant="20" symbolic="YES" id="Tsc-yG-G1q"/>
<constraint firstItem="0XM-y9-sOw" firstAttribute="centerY" secondItem="svH-Pt-448" secondAttribute="centerY" id="jWN-iV-94e"/> <constraint firstItem="0XM-y9-sOw" firstAttribute="centerY" secondItem="svH-Pt-448" secondAttribute="centerY" id="jWN-iV-94e"/>
@ -68,9 +72,9 @@
<viewControllerLayoutGuide type="bottom" id="xB2-3N-aYI"/> <viewControllerLayoutGuide type="bottom" id="xB2-3N-aYI"/>
</layoutGuides> </layoutGuides>
<view key="view" contentMode="scaleToFill" id="Hzn-H1-qwy"> <view key="view" contentMode="scaleToFill" id="Hzn-H1-qwy">
<rect key="frame" x="0.0" y="64" width="600" height="536"/>
<rect key="frame" x="0.0" y="64" width="768" height="960"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view> </view>
<extendedEdge key="edgesForExtendedLayout" top="YES"/> <extendedEdge key="edgesForExtendedLayout" top="YES"/>
<navigationItem key="navigationItem" id="gsi-1J-w6z"> <navigationItem key="navigationItem" id="gsi-1J-w6z">
@ -81,7 +85,7 @@
<rect key="frame" x="20" y="7" width="133" height="30"/> <rect key="frame" x="20" y="7" width="133" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="zurück"> <state key="normal" title="zurück">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state> </state>
<connections> <connections>
<action selector="back:" destination="yqJ-Uz-RRd" eventType="touchUpInside" id="a9M-Xh-Oid"/> <action selector="back:" destination="yqJ-Uz-RRd" eventType="touchUpInside" id="a9M-Xh-Oid"/>
@ -134,27 +138,27 @@
<objects> <objects>
<tableViewController storyboardIdentifier="mastertable" title="Master" clearsSelectionOnViewWillAppear="NO" id="7bK-jq-Zjz" customClass="MasterViewController" customModule="kplayer" customModuleProvider="target" sceneMemberID="viewController"> <tableViewController storyboardIdentifier="mastertable" title="Master" clearsSelectionOnViewWillAppear="NO" id="7bK-jq-Zjz" customClass="MasterViewController" customModule="kplayer" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="r7i-6Z-zg0"> <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="r7i-6Z-zg0">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="1024"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<prototypes> <prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="Arm-wq-HPj" style="IBUITableViewCellStyleDefault" id="WCw-Qf-5nD"> <tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="Arm-wq-HPj" style="IBUITableViewCellStyleDefault" id="WCw-Qf-5nD">
<rect key="frame" x="0.0" y="86" width="600" height="44"/>
<rect key="frame" x="0.0" y="22" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WCw-Qf-5nD" id="37f-cq-3Eg"> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WCw-Qf-5nD" id="37f-cq-3Eg">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Arm-wq-HPj"> <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Arm-wq-HPj">
<rect key="frame" x="15" y="0.0" width="570" height="43.5"/>
<rect key="frame" x="15" y="0.0" width="290" height="43.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="20"/> <fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</label> </label>
</subviews> </subviews>
</tableViewCellContentView> </tableViewCellContentView>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<connections> <connections>
<segue destination="vC3-pB-5Vb" kind="showDetail" identifier="showDetail" id="6S0-TO-JiA"/> <segue destination="vC3-pB-5Vb" kind="showDetail" identifier="showDetail" id="6S0-TO-JiA"/>
</connections> </connections>

25
kplayer/Images.xcassets/AppIcon.appiconset/Contents.json

@ -1,5 +1,15 @@
{ {
"images" : [ "images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{ {
"idiom" : "iphone", "idiom" : "iphone",
"size" : "29x29", "size" : "29x29",
@ -30,6 +40,16 @@
"size" : "60x60", "size" : "60x60",
"scale" : "3x" "scale" : "3x"
}, },
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{ {
"idiom" : "ipad", "idiom" : "ipad",
"size" : "29x29", "size" : "29x29",
@ -59,6 +79,11 @@
"idiom" : "ipad", "idiom" : "ipad",
"size" : "76x76", "size" : "76x76",
"scale" : "2x" "scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
} }
], ],
"info" : { "info" : {

2
kplayer/core/ItemModel.swift

@ -9,7 +9,7 @@ class ItemModel {
var items = [MediaItem]() var items = [MediaItem]()
var itemsMap = Dictionary<String, MediaItem>() var itemsMap = Dictionary<String, MediaItem>()
func addItem(item: MediaItem) {
func addItem(_ item: MediaItem) {
let path = item.encodedDir! let path = item.encodedDir!
var folder = itemsMap[path] var folder = itemsMap[path]

38
kplayer/core/MediaItem.swift

@ -79,14 +79,14 @@ class MediaItem: CustomDebugStringConvertible {
// Nutzinhalt // Nutzinhalt
var image: UIImage? var image: UIImage?
var time: NSTimeInterval?
var time: TimeInterval?
var thumbUrl: String? var thumbUrl: String?
init(name: String, path: String, root: String, type: ItemType) { init(name: String, path: String, root: String, type: ItemType) {
self.name = name self.name = name
let trim = NSCharacterSet(charactersInString: "/ ")
self.root = "/" + root.stringByTrimmingCharactersInSet(trim)
self.path = path.stringByTrimmingCharactersInSet(trim)
let trim = CharacterSet(charactersIn: "/ ")
self.root = "/" + root.trimmingCharacters(in: trim)
self.path = path.trimmingCharacters(in: trim)
self.type = type self.type = type
children = [MediaItem]() children = [MediaItem]()
@ -94,8 +94,8 @@ class MediaItem: CustomDebugStringConvertible {
sortName = computeSortName(name) sortName = computeSortName(name)
} }
private func computeSortName(sname: String) -> String {
var lsortName = sname.stringByReplacingOccurrencesOfString("full", withString: "")
fileprivate func computeSortName(_ sname: String) -> String {
var lsortName = sname.replacingOccurrences(of: "full", with: "")
var fullNameArr = lsortName.characters.split { var fullNameArr = lsortName.characters.split {
$0 == "_" $0 == "_"
}.map { }.map {
@ -119,9 +119,9 @@ class MediaItem: CustomDebugStringConvertible {
*/ */
var snapshotDirPathForVideo: String { var snapshotDirPathForVideo: String {
let len = "/srv/samba/ren".characters.count let len = "/srv/samba/ren".characters.count
let rootPostfix = (root as NSString).substringFromIndex(len)
let rootPostfix = (root as NSString).substring(from: len)
let tpath = "/srv/samba/ren/thumb\(rootPostfix)/\(path)/\(name)" let tpath = "/srv/samba/ren/thumb\(rootPostfix)/\(path)/\(name)"
let enc = tpath.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)!
let enc = tpath.addingPercentEscapes(using: String.Encoding.isoLatin1)!
return enc + "/" return enc + "/"
} }
@ -130,7 +130,7 @@ class MediaItem: CustomDebugStringConvertible {
Absolute URL, unter der das Thumbnail des Items abgerufen werden kann. Absolute URL, unter der das Thumbnail des Items abgerufen werden kann.
*/ */
var thumbUrlAbsolute: String { var thumbUrlAbsolute: String {
let enc = thumbUrl!.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)!
let enc = thumbUrl!.addingPercentEscapes(using: String.Encoding.isoLatin1)!
return NetworkManager.sharedInstance.baseurl + "/service/download" + enc return NetworkManager.sharedInstance.baseurl + "/service/download" + enc
} }
@ -138,22 +138,22 @@ class MediaItem: CustomDebugStringConvertible {
Absolute URL, unter der das Image des Items abgerufen werden kann. Absolute URL, unter der das Image des Items abgerufen werden kann.
*/ */
var imageUrlAbsolute: String { var imageUrlAbsolute: String {
var imageUrl = thumbUrl!.stringByReplacingOccurrencesOfString("_thumb.", withString: ".")
imageUrl = imageUrl.stringByReplacingOccurrencesOfString("?preview=true", withString: "")
imageUrl = imageUrl.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)!
var imageUrl = thumbUrl!.replacingOccurrences(of: "_thumb.", with: ".")
imageUrl = imageUrl.replacingOccurrences(of: "?preview=true", with: "")
imageUrl = imageUrl.addingPercentEscapes(using: String.Encoding.isoLatin1)!
return NetworkManager.sharedInstance.baseurl + "/service/download" + imageUrl return NetworkManager.sharedInstance.baseurl + "/service/download" + imageUrl
} }
var playerURL: NSURL? {
let enc = name.stringByReplacingOccurrencesOfString(" ", withString: "%20")
var playerURL: URL? {
let enc = name.replacingOccurrences(of: " ", with: "%20")
let s = NetworkManager.sharedInstance.baseurl + "/service/stream" + encodedDir! let s = NetworkManager.sharedInstance.baseurl + "/service/stream" + encodedDir!
if s.endsWith("/") { if s.endsWith("/") {
return NSURL(string: s + enc)
return URL(string: s + enc)
} }
else { else {
return NSURL(string: s + "/" + enc)
return URL(string: s + "/" + enc)
} }
} }
@ -162,7 +162,7 @@ class MediaItem: CustomDebugStringConvertible {
*/ */
var fullPath: String { var fullPath: String {
let fpath = "\(root)/\(path)/\(name)" let fpath = "\(root)/\(path)/\(name)"
let enc = fpath.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)
let enc = fpath.addingPercentEscapes(using: String.Encoding.isoLatin1)
return enc! return enc!
} }
@ -173,7 +173,7 @@ class MediaItem: CustomDebugStringConvertible {
var encodedDir: String? { var encodedDir: String? {
let dir = "\(root)/\(path)" let dir = "\(root)/\(path)"
return dir.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)
return dir.addingPercentEscapes(using: String.Encoding.isoLatin1)
} }
func superRoot() -> MediaItem { func superRoot() -> MediaItem {
@ -185,7 +185,7 @@ class MediaItem: CustomDebugStringConvertible {
} }
func sort() { func sort() {
children.sortInPlace({
children.sort(by: {
$0.sortName < $1.sortName $0.sortName < $1.sortName
}) })
} }

113
kplayer/core/NetworkManager.swift

@ -5,15 +5,15 @@
import Foundation import Foundation
import Alamofire import Alamofire
import Cent
//import Cent
class NetworkManager { class NetworkManager {
static let sharedInstance = NetworkManager() static let sharedInstance = NetworkManager()
let baseurl = "http://linkstation.local/tomcat/media" let baseurl = "http://linkstation.local/tomcat/media"
lazy var operationQueue: NSOperationQueue = {
var queue = NSOperationQueue()
lazy var operationQueue: OperationQueue = {
var queue = OperationQueue()
queue.name = "Backup queue" queue.name = "Backup queue"
queue.maxConcurrentOperationCount = 1 queue.maxConcurrentOperationCount = 1
return queue return queue
@ -22,33 +22,33 @@ class NetworkManager {
internal typealias Weiter = ([MediaItem]) -> Void internal typealias Weiter = ([MediaItem]) -> Void
func loadDirs(rootParam: String, completionHandler: Weiter) -> Void {
func loadDirs(_ rootParam: String, completionHandler: @escaping Weiter) -> Void {
var root = rootParam var root = rootParam
if root.containsString("*") {
root = rootParam[rootParam.startIndex..<rootParam.rangeOfString("*")!.startIndex]
if root.contains("*") {
root = rootParam[rootParam.startIndex..<rootParam.range(of: "*")!.lowerBound]
} }
if root.endsWith("/") { if root.endsWith("/") {
root = root[root.startIndex..<root.endIndex.predecessor()]
root = root[root.startIndex..<root.characters.index(before: root.endIndex)]
} }
let url1 = baseurl + "/service/listvideos" + rootParam let url1 = baseurl + "/service/listvideos" + rootParam
let len = root.characters.count let len = root.characters.count
var res = [MediaItem]() var res = [MediaItem]()
let url = (url1 as NSString).stringByReplacingOccurrencesOfString(" ", withString: "+")
let url = (url1 as NSString).replacingOccurrences(of: " ", with: "+")
print(url) print(url)
Alamofire.request(.GET, url).responseJSON {
(_, _, response) in
Alamofire.request(url).responseJSON {
(response) in
if let json = response.value as? [String] {
if let json = response.result.value as? [String] {
print("Empfange \(json.count) Ergebnisse") print("Empfange \(json.count) Ergebnisse")
for s in json { for s in json {
// print(s) // print(s)
if s.hasSuffix(".mp4") || s.hasSuffix(".m4v") { if s.hasSuffix(".mp4") || s.hasSuffix(".m4v") {
let l = s.length
let l = s.characters.count
let name = NSURL(fileURLWithPath: s).lastPathComponent! let name = NSURL(fileURLWithPath: s).lastPathComponent!
var pathlen = l - len - name.length
var pathlen = l - len - name.characters.count
// if (pathlen > 1000) { // if (pathlen > 1000) {
// print(pathlen) // print(pathlen)
@ -59,7 +59,7 @@ class NetworkManager {
pathlen = 2 pathlen = 2
} }
let path = (s as NSString).substringWithRange(NSMakeRange(len + 1, pathlen - 2))
let path = (s as NSString).substring(with: NSMakeRange(len + 1, pathlen - 2))
let i = MediaItem(name: name, path: path, root: root, type: ItemType.VIDEO) let i = MediaItem(name: name, path: path, root: root, type: ItemType.VIDEO)
if !name.hasPrefix(".") { if !name.hasPrefix(".") {
res.append(i) res.append(i)
@ -71,27 +71,27 @@ class NetworkManager {
} }
} }
func loadPicDirs(rootParam: String, completionHandler: Weiter) -> Void {
func loadPicDirs(_ rootParam: String, completionHandler: @escaping Weiter) -> Void {
var root = rootParam var root = rootParam
if root.containsString("*") {
root = rootParam[rootParam.startIndex..<rootParam.rangeOfString("*")!.startIndex]
if root.contains("*") {
root = rootParam[rootParam.startIndex..<rootParam.range(of: "*")!.lowerBound]
} }
if root.endsWith("/") { if root.endsWith("/") {
root = root[root.startIndex..<root.endIndex.predecessor()]
root = root[root.startIndex..<root.characters.index(before: root.endIndex)]
} }
let url1 = baseurl + "/service/listpicdirs" + rootParam let url1 = baseurl + "/service/listpicdirs" + rootParam
let len = root.characters.count let len = root.characters.count
var res = [MediaItem]() var res = [MediaItem]()
let url = (url1 as NSString).stringByReplacingOccurrencesOfString(" ", withString: "+")
let url = (url1 as NSString).replacingOccurrences(of: " ", with: "+")
print(url) print(url)
Alamofire.request(.GET, url).responseJSON {
(_, _, response) in
Alamofire.request(url).responseJSON {
(response) in
if let json = response.value {
if let json = response.result.value {
var items = Dictionary<String, MediaItem>() var items = Dictionary<String, MediaItem>()
let result = json as! [String] let result = json as! [String]
@ -99,10 +99,10 @@ class NetworkManager {
for s in result { for s in result {
// print(s) // print(s)
if s.lowercaseString.hasSuffix(".jpg") {
let l = s.length
if s.lowercased().hasSuffix(".jpg") {
let l = s.characters.count
let name = (s as NSString).lastPathComponent let name = (s as NSString).lastPathComponent
var pathlen = l - len - name.length
var pathlen = l - len - name.characters.count
// print(pathlen) // print(pathlen)
// print(name) // print(name)
@ -112,14 +112,14 @@ class NetworkManager {
pathlen = 2 pathlen = 2
} }
let path = (s as NSString).substringWithRange(NSMakeRange(len + 1, pathlen - 2))
let path = (s as NSString).substring(with: NSMakeRange(len + 1, pathlen - 2))
let folderName = NSURL(fileURLWithPath: path).lastPathComponent! let folderName = NSURL(fileURLWithPath: path).lastPathComponent!
let fl = path.length
let pfl = fl - folderName.length
let fl = path.characters.count
let pfl = fl - folderName.characters.count
// print("\(folderName) \(pfl)") // print("\(folderName) \(pfl)")
let fpath = (path as NSString).substringWithRange(NSMakeRange(0, pfl))
let fpath = (path as NSString).substring(with: NSMakeRange(0, pfl))
let i = MediaItem(name: folderName, path: fpath, root: root, type: ItemType.PICS) let i = MediaItem(name: folderName, path: fpath, root: root, type: ItemType.PICS)
i.thumbUrl = "\(s)?preview=true" i.thumbUrl = "\(s)?preview=true"
@ -143,16 +143,16 @@ class NetworkManager {
} }
} }
func listDirs(root: String, completionHandler: ([MediaItem], Bool) -> Void) -> Void {
func listDirs(_ root: String, completionHandler: @escaping ([MediaItem], Bool) -> Void) -> Void {
let len = root.characters.count let len = root.characters.count
let url = (root as NSString).stringByReplacingOccurrencesOfString(" ", withString: "+")
let url = (root as NSString).replacingOccurrences(of: " ", with: "+")
let ux = baseurl + "/service/listdirs" + url let ux = baseurl + "/service/listdirs" + url
print(ux) print(ux)
Alamofire.request(.GET, ux).responseJSON {
(_, _, response) in
Alamofire.request(ux).responseJSON {
(response) in
if let json = response.value {
if let json = response.result.value {
var res = [MediaItem]() var res = [MediaItem]()
var leaf = false var leaf = false
var hasPics = false var hasPics = false
@ -166,8 +166,7 @@ class NetworkManager {
if s == "!!LEAF!!" { if s == "!!LEAF!!" {
leaf = true leaf = true
} else { } else {
let index1 = s.startIndex.advancedBy(len)
let st = s.substringFromIndex(index1)
let st = s.substringStartingFrom(len)
// print(st) // print(st)
@ -175,14 +174,13 @@ class NetworkManager {
let i = MediaItem(name: st, path: st, root: root, type: ItemType.FOLDER) let i = MediaItem(name: st, path: st, root: root, type: ItemType.FOLDER)
res.append(i) res.append(i)
} else { } else {
if s.lowercaseString.hasSuffix(".jpg") {
if s.lowercased().hasSuffix(".jpg") {
if !hasPics { if !hasPics {
hasPics = true hasPics = true
let name = (root as NSString).lastPathComponent let name = (root as NSString).lastPathComponent
let namelen = name.characters.count let namelen = name.characters.count
let idx = root.endIndex.advancedBy(namelen * -1)
let rootstart = root.substringToIndex(idx)
let rootstart = root.substringRight(namelen)
let i = MediaItem(name: name, path: "", root: rootstart, type: ItemType.DETAILS) let i = MediaItem(name: name, path: "", root: rootstart, type: ItemType.DETAILS)
res.append(i) res.append(i)
} }
@ -199,7 +197,7 @@ class NetworkManager {
} }
} }
func loadItems(item: MediaItem) {
func loadItems(_ item: MediaItem) {
if (item.type != ItemType.FOLDER && item.type != ItemType.DETAILS) { if (item.type != ItemType.FOLDER && item.type != ItemType.DETAILS) {
return return
} }
@ -209,10 +207,10 @@ class NetworkManager {
loadItem(i, index: j) loadItem(i, index: j)
j+=1 j+=1
} }
NSNotificationCenter.defaultCenter().postNotificationName("loadedItems", object: nil)
NotificationCenter.default.post(name: Notification.Name(rawValue: "loadedItems"), object: nil)
} }
func loadItem(item: MediaItem, index: Int) {
func loadItem(_ item: MediaItem, index: Int) {
if (item.type != ItemType.VIDEO) { if (item.type != ItemType.VIDEO) {
var j = 0 var j = 0
for i in item.children { for i in item.children {
@ -234,23 +232,22 @@ class NetworkManager {
print(url) print(url)
Alamofire.request(.GET, url).responseJSON {
(_, _, response) in
Alamofire.request(url).responseJSON {
(response) in
if let json = response.value {
if let json = response.result.value {
var hashes = Dictionary<String, String>() var hashes = Dictionary<String, String>()
for b in json as! [String] { for b in json as! [String] {
let p = NSURL(fileURLWithPath: b).lastPathComponent! let p = NSURL(fileURLWithPath: b).lastPathComponent!
if p.containsString("_thumb.jpg") {
let ts = p[0 ..< p.length - 10]
if p.contains("_thumb.jpg") {
let ts = p.substringWithoutLast(10)
hashes[ts] = b hashes[ts] = b
} else { } else {
let ende = p.length - 4
let ts = p[0 ..< ende]
let ts = p.substringWithoutLast(4)
if hashes[ts] == nil { if hashes[ts] == nil {
hashes[ts] = b hashes[ts] = b
@ -258,7 +255,7 @@ class NetworkManager {
} }
} }
item.children.removeAll(keepCapacity: true)
item.children.removeAll(keepingCapacity: true)
for (ts, p) in hashes { for (ts, p) in hashes {
let t = (ts as NSString).doubleValue / 1000 let t = (ts as NSString).doubleValue / 1000
@ -276,19 +273,19 @@ class NetworkManager {
} }
item.loaded = true item.loaded = true
NSNotificationCenter.defaultCenter().postNotificationName("loadedItems", object: item)
NotificationCenter.default.post(name: Notification.Name(rawValue: "loadedItems"), object: item)
// println(error) // println(error)
} }
} }
} }
func favItem(item: MediaItem) {
func favItem(_ item: MediaItem) {
let url = baseurl + "/service/linkfav" + item.fullPath let url = baseurl + "/service/linkfav" + item.fullPath
Alamofire.request(.GET, url)
Alamofire.request(url)
} }
func saveItem(item: MediaItem) {
func saveItem(_ item: MediaItem) {
print(item.children) print(item.children)
@ -300,12 +297,12 @@ class NetworkManager {
print(url) print(url)
Alamofire.request(.GET, url).responseJSON {
(_, _, response) in
Alamofire.request(url).responseJSON {
(response) in
var hashes = Set<String>() var hashes = Set<String>()
if let json = response.value {
if let json = response.result.value {
for b in json as! [String] { for b in json as! [String] {
hashes.insert(b) hashes.insert(b)
print(b) print(b)
@ -321,7 +318,7 @@ class NetworkManager {
if hashes.contains(pt) { if hashes.contains(pt) {
print("contained") print("contained")
} else { } else {
if let id = c.image, imageData = UIImageJPEGRepresentation(id, 1.0) {
if let id = c.image, let imageData = UIImageJPEGRepresentation(id, 1.0) {
let op = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageData, path: p) let op = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageData, path: p)
self.operationQueue.addOperation(op) self.operationQueue.addOperation(op)

102
kplayer/detail/DetailViewController.swift

@ -32,11 +32,11 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
required init?(coder aDecoder: NSCoder) { required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder) super.init(coder: aDecoder)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(refreshItems(_:)), name: "loadedItems", object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(refreshItems(_:)), name: NSNotification.Name(rawValue: "loadedItems"), object: nil)
} }
deinit { deinit {
NSNotificationCenter.defaultCenter().removeObserver(self, name: "loadedItems", object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "loadedItems"), object: nil)
} }
override func viewDidLoad() { override func viewDidLoad() {
@ -53,13 +53,13 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
collectionView.dataSource = self collectionView.dataSource = self
collectionView.delegate = self collectionView.delegate = self
collectionView.registerClass(ItemCell.self, forCellWithReuseIdentifier: "Cell")
collectionView.backgroundColor = UIColor.lightGrayColor()
collectionView.registerClass(HeaderCell.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HeaderView");
collectionView.register(ItemCell.self, forCellWithReuseIdentifier: "Cell")
collectionView.backgroundColor = UIColor.lightGray
collectionView.register(HeaderCell.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HeaderView");
view.addSubview(collectionView) view.addSubview(collectionView)
view.autoresizesSubviews = true view.autoresizesSubviews = true
collectionView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
collectionView.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
// Do any additional setup after loading the view, typically from a nib. // Do any additional setup after loading the view, typically from a nib.
collectionView.reloadData() collectionView.reloadData()
@ -70,8 +70,8 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
lpgr.delaysTouchesBegan = true lpgr.delaysTouchesBegan = true
self.collectionView.addGestureRecognizer(lpgr); self.collectionView.addGestureRecognizer(lpgr);
let overviewButton = UIBarButtonItem(barButtonSystemItem: .Action, target: self, action: #selector(overview));
let favButton = UIBarButtonItem(barButtonSystemItem: .Bookmarks, target: self, action: #selector(favorites));
let overviewButton = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(overview));
let favButton = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: self, action: #selector(favorites));
navigationItem.rightBarButtonItems = [favButton, overviewButton] navigationItem.rightBarButtonItems = [favButton, overviewButton]
if detailItem != nil { if detailItem != nil {
print("Details \(detailItem!.children)") print("Details \(detailItem!.children)")
@ -99,15 +99,15 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
pc.items = i pc.items = i
pc.completionHandler = { pc.completionHandler = {
self.dismissViewControllerAnimated(true, completion: nil);
self.dismiss(animated: true, completion: nil);
} }
let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack. let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack.
presentViewController(navController, animated: false, completion: nil)
present(navController, animated: false, completion: nil)
} }
} }
func refreshItems(notification: NSNotification) {
func refreshItems(_ notification: Notification) {
if notification.object == nil { if notification.object == nil {
if self.collectionView != nil { if self.collectionView != nil {
@ -124,8 +124,8 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
if let detail: MediaItem = self.detailItem { if let detail: MediaItem = self.detailItem {
if i.type == ItemType.VIDEO { if i.type == ItemType.VIDEO {
if i.parent!.type != ItemType.DETAILS { if i.parent!.type != ItemType.DETAILS {
let path = NSIndexPath(forItem: index, inSection: i.parent!.index)
self.collectionView.reloadItemsAtIndexPaths([path])
let path = IndexPath(item: index, section: i.parent!.index)
self.collectionView.reloadItems(at: [path])
} }
} else { } else {
if i.parent! !== detail { if i.parent! !== detail {
@ -135,20 +135,20 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
print("Object: \(oid.hashValue) Index \(index) Item: \(i) Parent: \(i.parent) Detail: \(detailItem)") print("Object: \(oid.hashValue) Index \(index) Item: \(i) Parent: \(i.parent) Detail: \(detailItem)")
collectionView.performBatchUpdates({ collectionView.performBatchUpdates({
var newItems = [NSIndexPath]()
var newItems = [IndexPath]()
var j = 0 var j = 0
if detail.children.count > index { if detail.children.count > index {
let path = NSIndexPath(forItem: 0, inSection: index)
self.collectionView.reloadItemsAtIndexPaths([path])
let path = IndexPath(item: 0, section: index)
self.collectionView.reloadItems(at: [path])
for _ in detail.children[index].children { for _ in detail.children[index].children {
if j >= 1 { if j >= 1 {
newItems.append(NSIndexPath(forItem: j, inSection: index))
newItems.append(IndexPath(item: j, section: index))
} }
j += 1 j += 1
} }
self.collectionView.insertItemsAtIndexPaths(newItems)
self.collectionView.insertItems(at: newItems)
} }
return return
}, completion: nil) }, completion: nil)
@ -156,13 +156,13 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
} }
} }
func handleLongPress(gestureRecognizer: UILongPressGestureRecognizer) {
if (gestureRecognizer.state != UIGestureRecognizerState.Ended) {
func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
if (gestureRecognizer.state != UIGestureRecognizerState.ended) {
return; return;
} }
let p = gestureRecognizer.locationInView(self.collectionView);
let p = gestureRecognizer.location(in: self.collectionView);
let indexPath = self.collectionView.indexPathForItemAtPoint(p);
let indexPath = self.collectionView.indexPathForItem(at: p);
if (indexPath == nil) { if (indexPath == nil) {
print("couldn't find index path"); print("couldn't find index path");
} else { } else {
@ -173,13 +173,13 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
} else { } else {
if indexPath!.item >= items.children.count { if indexPath!.item >= items.children.count {
} else { } else {
let c = items.children.removeAtIndex(indexPath!.item)
let c = items.children.remove(at: indexPath!.item)
if let t = c.time { if let t = c.time {
let ms = Int(t * 1000) let ms = Int(t * 1000)
let p = c.snapshotDirPathForVideo + "\(ms).jpg" let p = c.snapshotDirPathForVideo + "\(ms).jpg"
let pt = c.snapshotDirPathForVideo + "\(ms)_thumb.jpg" let pt = c.snapshotDirPathForVideo + "\(ms)_thumb.jpg"
Alamofire.request(.GET, NetworkManager.sharedInstance.baseurl + "/service/deletethumb\(p)")
Alamofire.request(.GET, NetworkManager.sharedInstance.baseurl + "/service/deletethumb\(pt)")
Alamofire.request(NetworkManager.sharedInstance.baseurl + "/service/deletethumb\(p)")
Alamofire.request(NetworkManager.sharedInstance.baseurl + "/service/deletethumb\(pt)")
} }
self.collectionView.reloadData() self.collectionView.reloadData()
} }
@ -189,7 +189,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
} }
} }
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
func numberOfSections(in collectionView: UICollectionView) -> Int {
if let detail: MediaItem = self.detailItem { if let detail: MediaItem = self.detailItem {
let cnt = detail.children.count let cnt = detail.children.count
return cnt return cnt
@ -197,7 +197,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
return 0 return 0
} }
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if let detail: MediaItem = self.detailItem { if let detail: MediaItem = self.detailItem {
let n = detail.children[section].children.count let n = detail.children[section].children.count
@ -213,8 +213,8 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
return 0 return 0
} }
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! ItemCell
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! ItemCell
if let detail: MediaItem = self.detailItem { if let detail: MediaItem = self.detailItem {
let items = detail.children[indexPath.section] let items = detail.children[indexPath.section]
@ -232,15 +232,15 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
return cell return cell
} }
func collectionView(collectionView: UICollectionView,
func collectionView(_ collectionView: UICollectionView,
viewForSupplementaryElementOfKind kind: String, viewForSupplementaryElementOfKind kind: String,
atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
at indexPath: IndexPath) -> UICollectionReusableView {
switch kind { switch kind {
case UICollectionElementKindSectionHeader: case UICollectionElementKindSectionHeader:
let headerView = let headerView =
collectionView.dequeueReusableSupplementaryViewOfKind(kind,
collectionView.dequeueReusableSupplementaryView(ofKind: kind,
withReuseIdentifier: "HeaderView", withReuseIdentifier: "HeaderView",
forIndexPath: indexPath)
for: indexPath)
as! HeaderCell as! HeaderCell
let items = detailItem!.children[indexPath.section] let items = detailItem!.children[indexPath.section]
@ -251,7 +251,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
} }
} }
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let detail: MediaItem = self.detailItem { if let detail: MediaItem = self.detailItem {
var items = detail.children[indexPath.section] var items = detail.children[indexPath.section]
if (items.type == ItemType.VIDEO || items.loaded) { if (items.type == ItemType.VIDEO || items.loaded) {
@ -266,7 +266,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
} }
if items.type == ItemType.VIDEO || items.type == ItemType.SNAPSHOT { if items.type == ItemType.VIDEO || items.type == ItemType.SNAPSHOT {
performSegueWithIdentifier("showVideo", sender: self)
performSegue(withIdentifier: "showVideo", sender: self)
} }
else { else {
let len = items.root.characters.count let len = items.root.characters.count
@ -275,18 +275,18 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
print(items) print(items)
print(url) print(url)
Alamofire.request(.GET, url).responseJSON {
(_,_,response) in
Alamofire.request(url).responseJSON {
(response) in
if let json = response.value {
if let json = response.result.value {
var im = [MediaItem]() var im = [MediaItem]()
for s in json as! [String] { for s in json as! [String] {
if s.lowercaseString.hasSuffix(".jpg") {
let l = s.length
if s.lowercased().hasSuffix(".jpg") {
let l = s.characters.count
let name = NSURL(fileURLWithPath: s).lastPathComponent! let name = NSURL(fileURLWithPath: s).lastPathComponent!
var pathlen = l - len - name.length
var pathlen = l - len - name.characters.count
// if (pathlen > 1000) { // if (pathlen > 1000) {
print(pathlen) print(pathlen)
@ -297,14 +297,14 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
pathlen = 2 pathlen = 2
} }
let path = (s as NSString).substringWithRange(NSMakeRange(len + 1, pathlen - 2))
let path = (s as NSString).substring(with: NSMakeRange(len + 1, pathlen - 2))
let folderName = NSURL(fileURLWithPath: path).lastPathComponent! let folderName = NSURL(fileURLWithPath: path).lastPathComponent!
let fl = path.length
let pfl = fl - folderName.length
let fl = path.characters.count
let pfl = fl - folderName.characters.count
print("\(folderName) \(pfl)") print("\(folderName) \(pfl)")
let fpath = (s as NSString).substringWithRange(NSMakeRange(0, pfl))
let fpath = s.substringLeft(pfl)
let i = MediaItem(name: folderName, path: fpath, root: items.root, type: ItemType.PICS) let i = MediaItem(name: folderName, path: fpath, root: items.root, type: ItemType.PICS)
i.thumbUrl = "\(s)?preview=true" i.thumbUrl = "\(s)?preview=true"
@ -318,11 +318,11 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
pc.items = im pc.items = im
pc.completionHandler = { pc.completionHandler = {
self.dismissViewControllerAnimated(true, completion: nil);
self.dismiss(animated: true, completion: nil);
} }
let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack. let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack.
self.presentViewController(navController, animated: false, completion: nil)
self.present(navController, animated: false, completion: nil)
} }
} }
} }
@ -331,14 +331,14 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
// MARK: - Segues // MARK: - Segues
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showVideo" { if segue.identifier == "showVideo" {
let nc = segue.destinationViewController as! UINavigationController
let nc = segue.destination as! UINavigationController
let controller = nc.topViewController as! VideoPlayerController let controller = nc.topViewController as! VideoPlayerController
controller.currentItem = self.currentItem controller.currentItem = self.currentItem
// controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() // controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true controller.navigationItem.leftItemsSupplementBackButton = true
nc.navigationBar.barTintColor = UIColor.blackColor()
nc.navigationBar.barTintColor = UIColor.black
controller.completionHandler = { controller.completionHandler = {
() in () in
@ -353,7 +353,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
if let ci = self.currentItem { if let ci = self.currentItem {
NetworkManager.sharedInstance.saveItem(ci) NetworkManager.sharedInstance.saveItem(ci)
} }
self.dismissViewControllerAnimated(true, completion: nil);
self.dismiss(animated: true, completion: nil);
} }
} }
} }

4
kplayer/detail/HeaderCell.swift

@ -29,10 +29,10 @@ class HeaderCell: UICollectionViewCell {
"V:|-5-[label]-5-|" ) "V:|-5-[label]-5-|" )
} }
func setItem(item: MediaItem) {
func setItem(_ item: MediaItem) {
self.item = item self.item = item
label.text = item.name label.text = item.name
backgroundColor = UIColor.grayColor()
backgroundColor = UIColor.gray
} }
} }

8
kplayer/detail/ItemCell.swift

@ -23,7 +23,7 @@ class ItemCell: UICollectionViewCell {
super.init(frame: frame) super.init(frame: frame)
image = UIImageView(frame: frame) image = UIImageView(frame: frame)
image.contentMode = UIViewContentMode.ScaleAspectFit
image.contentMode = UIViewContentMode.scaleAspectFit
autolayout(["imag": image], autolayout(["imag": image],
constraints: constraints:
@ -31,16 +31,16 @@ class ItemCell: UICollectionViewCell {
"V:|[imag]|") "V:|[imag]|")
} }
func setItem(item: MediaItem) {
func setItem(_ item: MediaItem) {
self.item = item self.item = item
if let _ = item.thumbUrl, nsurl = NSURL(string: item.thumbUrlAbsolute) {
if let _ = item.thumbUrl, let nsurl = URL(string: item.thumbUrlAbsolute) {
image.hnk_setImageFromURL(nsurl, placeholder: defaultImage) image.hnk_setImageFromURL(nsurl, placeholder: defaultImage)
} else { } else {
if let i = item.image { if let i = item.image {
image.image = i.scaleToSize(15 * 16, height: 15 * 9) image.image = i.scaleToSize(15 * 16, height: 15 * 9)
} else if item.children.count > 0 { } else if item.children.count > 0 {
if let _ = item.children[0].thumbUrl, nsurl = NSURL(string: item.children[0].thumbUrlAbsolute) {
if let _ = item.children[0].thumbUrl, let nsurl = URL(string: item.children[0].thumbUrlAbsolute) {
image.hnk_setImageFromURL(nsurl, placeholder: defaultImage) image.hnk_setImageFromURL(nsurl, placeholder: defaultImage)
} }
} }

92
kplayer/detail/VideoPlayerController.swift

@ -26,7 +26,7 @@ class VideoPlayerController: UIViewController {
let speedOptions = [ 0.25, 0.5, 1.0, 2.0 ] let speedOptions = [ 0.25, 0.5, 1.0, 2.0 ]
var speedOption = 2 var speedOption = 2
var thumbnailTime: NSTimeInterval = 0.0
var thumbnailTime: TimeInterval = 0.0
var edit = true var edit = true
var allowEdit = true var allowEdit = true
@ -35,39 +35,39 @@ class VideoPlayerController: UIViewController {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
barbutton = UIBarButtonItem(barButtonSystemItem: .Action, target: self, action: #selector(VideoPlayerController.twoFingersTwoTaps));
barbutton = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(VideoPlayerController.twoFingersTwoTaps));
navigationItem.rightBarButtonItems = [barbutton!] navigationItem.rightBarButtonItems = [barbutton!]
backButton = UIBarButtonItem(barButtonSystemItem: .Cancel, target: self, action: #selector(VideoPlayerController.back(_:)))
speedButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItemStyle.Plain, target: self, action: #selector(VideoPlayerController.speed(_:)))
playButton = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: #selector(VideoPlayerController.startstop(_:)))
reviewButton = UIBarButtonItem(title:"Edit ", style:UIBarButtonItemStyle.Plain, target: self, action: #selector(VideoPlayerController.doEdit(_:)))
backButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(VideoPlayerController.back(_:)))
speedButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItemStyle.plain, target: self, action: #selector(VideoPlayerController.speed(_:)))
playButton = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(VideoPlayerController.startstop(_:)))
reviewButton = UIBarButtonItem(title:"Edit ", style:UIBarButtonItemStyle.plain, target: self, action: #selector(VideoPlayerController.doEdit(_:)))
navigationItem.leftBarButtonItems = [backButton!, playButton!, speedButton!, reviewButton!] navigationItem.leftBarButtonItems = [backButton!, playButton!, speedButton!, reviewButton!]
if let c = currentItem, url = c.playerURL {
if let c = currentItem, let url = c.playerURL {
print(url) print(url)
play(url)
play(url as URL)
} }
} }
func doEdit(sender: AnyObject) {
func doEdit(_ sender: AnyObject) {
if (!allowEdit) { if (!allowEdit) {
return return
} }
if (edit) { if (edit) {
edit = false edit = false
reviewButton!.tintColor = UIColor.blueColor()
reviewButton!.tintColor = UIColor.blue
} }
else { else {
edit = true edit = true
reviewButton!.tintColor = UIColor.yellowColor()
reviewButton!.tintColor = UIColor.yellow
} }
} }
func startstop(sender: AnyObject) {
if moviePlayer!.playbackState == MPMoviePlaybackState.Playing {
func startstop(_ sender: AnyObject) {
if moviePlayer!.playbackState == MPMoviePlaybackState.playing {
moviePlayer!.pause() moviePlayer!.pause()
} }
else { else {
@ -77,7 +77,7 @@ class VideoPlayerController: UIViewController {
print("play") print("play")
} }
func speed(sender: AnyObject) {
func speed(_ sender: AnyObject) {
speedOption += 1 speedOption += 1
if speedOption > 3 { if speedOption > 3 {
speedOption = 0 speedOption = 0
@ -89,32 +89,32 @@ print("play")
print("speed \(moviePlayer!.currentPlaybackRate)") print("speed \(moviePlayer!.currentPlaybackRate)")
} }
@IBAction func back(sender: AnyObject) {
@IBAction func back(_ sender: AnyObject) {
if let player = self.moviePlayer { if let player = self.moviePlayer {
player.stop() player.stop()
} }
completionHandler!() completionHandler!()
} }
func play(url: NSURL) {
self.moviePlayer = ALMoviePlayerController(frame: CGRectMake(0, 0, view.frame.width, view.frame.height))
func play(_ url: URL) {
self.moviePlayer = ALMoviePlayerController(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))
if let player = self.moviePlayer { if let player = self.moviePlayer {
let movieControls = ALMoviePlayerControls(moviePlayer: player, style: ALMoviePlayerControlsStyleDefault);
let movieControls = ALMoviePlayerControls(moviePlayer: player, style: ALMoviePlayerControlsStyleDefault)!;
movieControls.fadeDelay = 60 movieControls.fadeDelay = 60
player.controls = movieControls player.controls = movieControls
movieControls.style = ALMoviePlayerControlsStyleEmbedded movieControls.style = ALMoviePlayerControlsStyleEmbedded
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(VideoPlayerController.exitedFullscreen), name: MPMoviePlayerDidExitFullscreenNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(VideoPlayerController.enteredFullscreen), name: MPMoviePlayerDidEnterFullscreenNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(VideoPlayerController.showThumbnail(_:)), name: MPMoviePlayerThumbnailImageRequestDidFinishNotification, object: nil);
NotificationCenter.default.addObserver(self, selector: #selector(VideoPlayerController.exitedFullscreen), name: NSNotification.Name.MPMoviePlayerDidExitFullscreen, object: nil);
NotificationCenter.default.addObserver(self, selector: #selector(VideoPlayerController.enteredFullscreen), name: NSNotification.Name.MPMoviePlayerDidEnterFullscreen, object: nil);
NotificationCenter.default.addObserver(self, selector: #selector(VideoPlayerController.showThumbnail(_:)), name: NSNotification.Name.MPMoviePlayerThumbnailImageRequestDidFinish, object: nil);
player.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height) player.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)
player.view.sizeToFit() player.view.sizeToFit()
player.scalingMode = MPMovieScalingMode.AspectFit
player.scalingMode = MPMovieScalingMode.aspectFit
// player.controlStyle = MPMovieControlStyle.Embedded // player.controlStyle = MPMovieControlStyle.Embedded
player.movieSourceType = MPMovieSourceType.Streaming
player.repeatMode = MPMovieRepeatMode.One
player.movieSourceType = MPMovieSourceType.streaming
player.repeatMode = MPMovieRepeatMode.one
player.contentURL = url player.contentURL = url
self.view.addSubview(player.view) self.view.addSubview(player.view)
@ -123,10 +123,10 @@ print("play")
} }
} }
func showThumbnail(note: NSNotification) {
func showThumbnail(_ note: Notification) {
let userInfo = note.userInfo! as NSDictionary let userInfo = note.userInfo! as NSDictionary
let thumbnail = userInfo.objectForKey(MPMoviePlayerThumbnailImageKey) as! UIImage
let time = userInfo.objectForKey(MPMoviePlayerThumbnailTimeKey) as! NSTimeInterval
let thumbnail = userInfo.object(forKey: MPMoviePlayerThumbnailImageKey) as! UIImage
let time = userInfo.object(forKey: MPMoviePlayerThumbnailTimeKey) as! TimeInterval
let newItem = MediaItem(name: currentItem!.name, path: currentItem!.path, root: currentItem!.root, type: ItemType.SNAPSHOT) let newItem = MediaItem(name: currentItem!.name, path: currentItem!.path, root: currentItem!.root, type: ItemType.SNAPSHOT)
newItem.image = thumbnail newItem.image = thumbnail
@ -139,25 +139,25 @@ print("play")
addItemButton(newItem) addItemButton(newItem)
} }
func addItemButton(newItem: MediaItem) {
let frame = CGRectMake(0, 0, 66.0, 44.0);
func addItemButton(_ newItem: MediaItem) {
let frame = CGRect(x: 0, y: 0, width: 66.0, height: 44.0);
let button = UIButton(frame: frame) let button = UIButton(frame: frame)
button.showsTouchWhenHighlighted = true button.showsTouchWhenHighlighted = true
button.addTarget(self, action: #selector(thumbnailClicked(_:)), forControlEvents: .TouchDown)
button.addTarget(self, action: #selector(thumbnailClicked(_:)), for: .touchDown)
if newItem.image != nil { if newItem.image != nil {
let icon = newItem.image!.scaleToSize(66.0, height: 44.0) let icon = newItem.image!.scaleToSize(66.0, height: 44.0)
button.setBackgroundImage(icon, forState: UIControlState.Normal);
button.setBackgroundImage(icon, for: UIControlState());
} else { } else {
if newItem.thumbUrl != nil { if newItem.thumbUrl != nil {
let URL = NSURL(string: newItem.thumbUrlAbsolute)!
let URL = Foundation.URL(string: newItem.thumbUrlAbsolute)!
Shared.imageCache.fetch(URL: URL).onSuccess { Shared.imageCache.fetch(URL: URL).onSuccess {
i in i in
let icon = i.scaleToSize(66.0, height: 44.0) let icon = i.scaleToSize(66.0, height: 44.0)
button.setBackgroundImage(icon, forState: UIControlState.Normal);
button.setBackgroundImage(icon, for: UIControlState.normal);
} }
} }
} }
@ -172,7 +172,7 @@ print("play")
buttons[button] = newItem buttons[button] = newItem
} }
func thumbnailClicked(source: UIButton) {
func thumbnailClicked(_ source: UIButton) {
moviePlayer!.currentPlaybackTime = buttons[source]!.time! moviePlayer!.currentPlaybackTime = buttons[source]!.time!
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption]) moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
@ -185,7 +185,7 @@ print("play")
if !(player.duration > 0.0) { if !(player.duration > 0.0) {
print("again") print("again")
NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: #selector(update), userInfo: nil, repeats: false)
Timer.scheduledTimer(timeInterval: 0.3, target: self, selector: #selector(update), userInfo: nil, repeats: false)
return return
} }
@ -215,7 +215,7 @@ print("play")
} }
func enteredFullscreen() { func enteredFullscreen() {
let mp = UIApplication.sharedApplication().keyWindow;
let mp = UIApplication.shared.keyWindow;
if let moviePlayerContainer = mp!.recursiveSearchForViewWithName("MPVideoContainerView") { if let moviePlayerContainer = mp!.recursiveSearchForViewWithName("MPVideoContainerView") {
if (moviePlayerContainer.gestureRecognizers != nil) { if (moviePlayerContainer.gestureRecognizers != nil) {
return; return;
@ -227,33 +227,33 @@ print("play")
func exitedFullscreen() { func exitedFullscreen() {
moviePlayer!.view.removeFromSuperview(); moviePlayer!.view.removeFromSuperview();
moviePlayer = nil; moviePlayer = nil;
NSNotificationCenter.defaultCenter().removeObserver(self);
NotificationCenter.default.removeObserver(self);
} }
func installGestures(moviePlayer: UIView) {
func installGestures(_ moviePlayer: UIView) {
let twoFingersTwoTapsGesture = UITapGestureRecognizer(target: self, action: #selector(twoFingersTwoTaps)) let twoFingersTwoTapsGesture = UITapGestureRecognizer(target: self, action: #selector(twoFingersTwoTaps))
twoFingersTwoTapsGesture.numberOfTapsRequired = 2 twoFingersTwoTapsGesture.numberOfTapsRequired = 2
twoFingersTwoTapsGesture.numberOfTouchesRequired = 2 twoFingersTwoTapsGesture.numberOfTouchesRequired = 2
moviePlayer.addGestureRecognizer(twoFingersTwoTapsGesture) moviePlayer.addGestureRecognizer(twoFingersTwoTapsGesture)
let sR = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) let sR = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight))
sR.direction = UISwipeGestureRecognizerDirection.Right
sR.direction = UISwipeGestureRecognizerDirection.right
sR.numberOfTouchesRequired = 1 sR.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR) moviePlayer.addGestureRecognizer(sR)
let sL = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) let sL = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft))
sL.direction = UISwipeGestureRecognizerDirection.Left
sL.direction = UISwipeGestureRecognizerDirection.left
sL.numberOfTouchesRequired = 1 sL.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sL) moviePlayer.addGestureRecognizer(sL)
let sR2 = UISwipeGestureRecognizer(target: self, action: #selector(swipeDown)) let sR2 = UISwipeGestureRecognizer(target: self, action: #selector(swipeDown))
sR2.direction = UISwipeGestureRecognizerDirection.Down
sR2.direction = UISwipeGestureRecognizerDirection.down
sR2.numberOfTouchesRequired = 1 sR2.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR2) moviePlayer.addGestureRecognizer(sR2)
let sR3 = UISwipeGestureRecognizer(target: self, action: #selector(swipeUp)) let sR3 = UISwipeGestureRecognizer(target: self, action: #selector(swipeUp))
sR3.direction = UISwipeGestureRecognizerDirection.Up
sR3.direction = UISwipeGestureRecognizerDirection.up
sR3.numberOfTouchesRequired = 1 sR3.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR3) moviePlayer.addGestureRecognizer(sR3)
@ -279,7 +279,7 @@ print("play")
index = 0 index = 0
player.contentURL = currentItem!.playerURL player.contentURL = currentItem!.playerURL
player.play() player.play()
NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: #selector(update), userInfo: nil, repeats: false)
Timer.scheduledTimer(timeInterval: 1.2, target: self, selector: #selector(update), userInfo: nil, repeats: false)
return return
} }
@ -322,7 +322,7 @@ print("play")
player.contentURL = currentItem!.playerURL player.contentURL = currentItem!.playerURL
player.play() player.play()
NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: #selector(update), userInfo: nil, repeats: false)
Timer.scheduledTimer(timeInterval: 1.2, target: self, selector: #selector(update), userInfo: nil, repeats: false)
return return
} }
@ -343,8 +343,8 @@ print("play")
if edit { if edit {
thumbnailTime = moviePlayer!.currentPlaybackTime thumbnailTime = moviePlayer!.currentPlaybackTime
print("tap \(thumbnailTime)") print("tap \(thumbnailTime)")
moviePlayer!.requestThumbnailImagesAtTimes([thumbnailTime],
timeOption: MPMovieTimeOption.Exact);
moviePlayer!.requestThumbnailImages(atTimes: [thumbnailTime],
timeOption: MPMovieTimeOption.exact);
} }
else { else {
NetworkManager.sharedInstance.favItem(currentItem!) NetworkManager.sharedInstance.favItem(currentItem!)

50
kplayer/master/MasterViewController.swift

@ -15,7 +15,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
override func awakeFromNib() { override func awakeFromNib() {
super.awakeFromNib() super.awakeFromNib()
if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
if UIDevice.current.userInterfaceIdiom == .pad {
self.clearsSelectionOnViewWillAppear = false self.clearsSelectionOnViewWillAppear = false
self.preferredContentSize = CGSize(width: 320.0, height: 600.0) self.preferredContentSize = CGSize(width: 320.0, height: 600.0)
} }
@ -35,11 +35,11 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
// Dispose of any resources that can be recreated. // Dispose of any resources that can be recreated.
} }
func updateSearchResultsForSearchController(search: UISearchController) {
func updateSearchResults(for search: UISearchController) {
let str = search.searchBar.text! let str = search.searchBar.text!
if str.hasSuffix("*") { if str.hasSuffix("*") {
let txt = str[str.startIndex ..< str.endIndex.advancedBy(-1)]
let txt = str[str.startIndex ..< str.characters.index(str.endIndex, offsetBy: -1)]
let neu = MediaItem(name: txt, path: model.items[0].parent!.path + "*" + txt, root: model.items[0].parent!.root, type: ItemType.DETAILS) let neu = MediaItem(name: txt, path: model.items[0].parent!.path + "*" + txt, root: model.items[0].parent!.root, type: ItemType.DETAILS)
model.items.append(neu) model.items.append(neu)
neu.parent = model.items[0].parent neu.parent = model.items[0].parent
@ -47,14 +47,14 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
} }
} }
func selectLoadedItem(selectedItem: MediaItem) {
func selectLoadedItem(_ selectedItem: MediaItem) {
switch selectedItem.type { switch selectedItem.type {
case ItemType.DETAILS: case ItemType.DETAILS:
performSegueWithIdentifier("showDetail", sender: self)
performSegue(withIdentifier: "showDetail", sender: self)
case ItemType.FOLDER: case ItemType.FOLDER:
if selectedItem.children.first?.type == ItemType.VIDEO { if selectedItem.children.first?.type == ItemType.VIDEO {
performSegueWithIdentifier("showDetail", sender: self)
performSegue(withIdentifier: "showDetail", sender: self)
} else { } else {
gotoNextFolder(selectedItem) gotoNextFolder(selectedItem)
} }
@ -63,7 +63,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
} }
} }
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("\(indexPath.row)") print("\(indexPath.row)")
let selectedItem = model.items[indexPath.row] let selectedItem = model.items[indexPath.row]
@ -125,15 +125,15 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
} }
} }
private func gotoNextFolder(selectedItem: MediaItem) {
fileprivate func gotoNextFolder(_ selectedItem: MediaItem) {
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewControllerWithIdentifier("mastertable") as! MasterViewController
let vc = mainStoryboard.instantiateViewController(withIdentifier: "mastertable") as! MasterViewController
vc.navigationItem.title = selectedItem.name; vc.navigationItem.title = selectedItem.name;
vc.model.items = selectedItem.children vc.model.items = selectedItem.children
navigationController!.pushViewController(vc, animated: true) navigationController!.pushViewController(vc, animated: true)
} }
private func gotoDetails(selectedItem: MediaItem) {
fileprivate func gotoDetails(_ selectedItem: MediaItem) {
let weiter: NetworkManager.Weiter = { let weiter: NetworkManager.Weiter = {
(g) in (g) in
@ -145,7 +145,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
selectedItem.children = model.items selectedItem.children = model.items
selectedItem.loaded = false selectedItem.loaded = false
if selectedItem.path.containsString("*") {
if selectedItem.path.contains("*") {
selectedItem.loaded = true selectedItem.loaded = true
} else } else
{ {
@ -170,7 +170,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
} }
} }
} }
self.performSegueWithIdentifier("showDetail", sender: self)
self.performSegue(withIdentifier: "showDetail", sender: self)
return return
} }
@ -186,16 +186,16 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
} }
} }
override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool {
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
return false; return false;
} }
// MARK: - Segues // MARK: - Segues
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" { if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow { if let indexPath = self.tableView.indexPathForSelectedRow {
let item = model.items[indexPath.row] let item = model.items[indexPath.row]
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = item controller.detailItem = item
if item.isPic() { if item.isPic() {
@ -212,7 +212,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
} }
NetworkManager.sharedInstance.loadItems(item) NetworkManager.sharedInstance.loadItems(item)
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem
controller.navigationItem.leftItemsSupplementBackButton = true controller.navigationItem.leftItemsSupplementBackButton = true
} }
} }
@ -220,33 +220,33 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
// MARK: - Table View // MARK: - Table View
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
override func numberOfSections(in tableView: UITableView) -> Int {
return 1 return 1
} }
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return model.items.count return model.items.count
} }
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
self.configureCell(cell, atIndexPath: indexPath) self.configureCell(cell, atIndexPath: indexPath)
return cell return cell
} }
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the specified item to be editable. // Return false if you do not want the specified item to be editable.
return false return false
} }
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
} }
} }
func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) {
func configureCell(_ cell: UITableViewCell, atIndexPath indexPath: IndexPath) {
let object = model.items[indexPath.row] let object = model.items[indexPath.row]
if (object.path.characters.count == 0) { if (object.path.characters.count == 0) {
cell.textLabel!.text = "'" + object.name cell.textLabel!.text = "'" + object.name
@ -254,7 +254,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
cell.textLabel!.text = object.path cell.textLabel!.text = object.path
} }
cell.accessoryType = UITableViewCellAccessoryType.None
cell.accessoryType = UITableViewCellAccessoryType.none
} }
} }

182
kplayer/photo/MediaPhotoController.swift

@ -7,36 +7,36 @@ import Foundation
import Nimbus import Nimbus
import Alamofire import Alamofire
class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollViewDataSource, NIPhotoScrubberViewDataSource, NSURLSessionDelegate {
class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollViewDataSource, NIPhotoScrubberViewDataSource, URLSessionDelegate {
var items = [MediaItem]() var items = [MediaItem]()
var completionHandler: ((Void) -> Void)? var completionHandler: ((Void) -> Void)?
var requests = Array<ImageLoadOperation>() var requests = Array<ImageLoadOperation>()
var imageCache = NSCache()
var imageCache = NSCache<AnyObject, AnyObject>()
var total = 0 var total = 0
var slide = 0 var slide = 0
var timer: NSTimer?
var timer: Timer?
var currentIndex = 80 var currentIndex = 80
var urlSession: NSURLSession?
var urlSession: Foundation.URLSession?
var sessionOwner = false var sessionOwner = false
let dateFormatter = NSDateFormatter()
let dateFormatter = DateFormatter()
lazy var operationQueue: NSOperationQueue = {
var queue = NSOperationQueue()
lazy var operationQueue: OperationQueue = {
var queue = OperationQueue()
queue.name = "Photo queue" queue.name = "Photo queue"
queue.maxConcurrentOperationCount = 3 queue.maxConcurrentOperationCount = 3
return queue return queue
}() }()
override func viewDidDisappear(animated: Bool) {
override func viewDidDisappear(_ animated: Bool) {
operationQueue.cancelAllOperations() operationQueue.cancelAllOperations()
} }
@ -46,7 +46,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
title = "(\(idx + 1) / \(photoAlbumView.numberOfPages)) \(selected.path) \(selected.name)" title = "(\(idx + 1) / \(photoAlbumView.numberOfPages)) \(selected.path) \(selected.name)"
} }
public func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) {
open func URLSession(_ session: Foundation.URLSession, didBecomeInvalidWithError error: NSError?) {
print(error) print(error)
} }
@ -55,21 +55,21 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
if urlSession == nil { if urlSession == nil {
sessionOwner = true sessionOwner = true
let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration(); // backgroundSessionConfigurationWithIdentifier("imageLoad");
configuration.HTTPMaximumConnectionsPerHost = 10;
let configuration = URLSessionConfiguration.ephemeral; // backgroundSessionConfigurationWithIdentifier("imageLoad");
configuration.httpMaximumConnectionsPerHost = 10;
configuration.timeoutIntervalForRequest = 100; configuration.timeoutIntervalForRequest = 100;
configuration.timeoutIntervalForResource = 200; configuration.timeoutIntervalForResource = 200;
urlSession = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil);
urlSession = Foundation.URLSession(configuration: configuration, delegate: self, delegateQueue: nil);
} }
imageCache.totalCostLimit = 1024 * 1024 * 1024 imageCache.totalCostLimit = 1024 * 1024 * 1024
let backButton = UIBarButtonItem(barButtonSystemItem: .Cancel, target: self, action: #selector(MediaPhotoController.back))
let slideButton = UIBarButtonItem(barButtonSystemItem: .FastForward, target: self, action: #selector(MediaPhotoController.slideShow))
let backButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(MediaPhotoController.back))
let slideButton = UIBarButtonItem(barButtonSystemItem: .fastForward, target: self, action: #selector(MediaPhotoController.slideShow))
navigationItem.leftBarButtonItems = [backButton, slideButton] navigationItem.leftBarButtonItems = [backButton, slideButton]
let playButton = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: #selector(MediaPhotoController.play))
let shotButton = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: #selector(MediaPhotoController.shot))
let playButton = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(MediaPhotoController.play))
let shotButton = UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: #selector(MediaPhotoController.shot))
navigationItem.rightBarButtonItems = [playButton, shotButton] navigationItem.rightBarButtonItems = [playButton, shotButton]
setChromeVisibility(true, animated: true) setChromeVisibility(true, animated: true)
@ -82,17 +82,17 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
preload(60, count: 20) preload(60, count: 20)
} }
func loadData(d: NSData, start: Int, end: Int) {
let bytes = Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(d.bytes), count: d.length))
let string1 = NSString(data: d, encoding: NSUTF8StringEncoding)
func loadData(_ d: Data, start: Int, end: Int) {
let bytes = Array(UnsafeBufferPointer(start: (d as NSData).bytes.bindMemory(to: UInt8.self, capacity: d.count), count: d.count))
let string1 = NSString(data: d, encoding: String.Encoding.utf8.rawValue)
print(string1) print(string1)
var index = 0 var index = 0
let fHi = (Int(bytes[index]) << 24) + (Int(bytes[index+1]) << 16) let fHi = (Int(bytes[index]) << 24) + (Int(bytes[index+1]) << 16)
let f = fHi + (Int(bytes[index+2]) << 8) + Int(bytes[index+3]) let f = fHi + (Int(bytes[index+2]) << 8) + Int(bytes[index+3])
// let f = (bytes[index++] << 24)+(bytes[index++] << 16)+(bytes[index++] << 8) + bytes[index++] // let f = (bytes[index++] << 24)+(bytes[index++] << 16)+(bytes[index++] << 8) + bytes[index++]
index += 4 index += 4
let time = dateFormatter.stringFromDate(NSDate())
print("\(time) start \(start) count \(f) size \(d.length)")
let time = dateFormatter.string(from: Date())
print("\(time) start \(start) count \(f) size \(d.count)")
var rest = self.items.count - self.currentIndex var rest = self.items.count - self.currentIndex
@ -104,34 +104,34 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
self.preload(self.currentIndex, count: rest) self.preload(self.currentIndex, count: rest)
self.currentIndex += rest self.currentIndex += rest
} else { } else {
dispatch_async(dispatch_get_main_queue(), {
DispatchQueue.main.async(execute: {
() -> Void in () -> Void in
self.photoScrubberView.reloadData(); self.photoScrubberView.reloadData();
}) })
} }
for var bild = start; bild < end; bild++ {
for bild in start ..< end {
let sizeHi = (Int(bytes[index]) << 24) + (Int(bytes[index+1]) << 16) let sizeHi = (Int(bytes[index]) << 24) + (Int(bytes[index+1]) << 16)
let size = (Int(bytes[index+2]) << 8) + Int(bytes[index+3]) + sizeHi let size = (Int(bytes[index+2]) << 8) + Int(bytes[index+3]) + sizeHi
index += 4 index += 4
if size > 0 { if size > 0 {
// var buf = //UnsafeMutablePointer<UInt8>(&bytes[index]) // var buf = //UnsafeMutablePointer<UInt8>(&bytes[index])
let part = d.subdataWithRange(NSMakeRange(index, size))
let part = d.subdata(in: index ..< (index + size))
if let img = UIImage(data: part) { if let img = UIImage(data: part) {
let imageRef = img.CGImage;
self.total += d.length
let imageRef = img.cgImage;
self.total += d.count
let i = self.items[bild] let i = self.items[bild]
// print("\(time) preload combi image loaded \(i.name) cost \(cost) total\(self.total)") // print("\(time) preload combi image loaded \(i.name) cost \(cost) total\(self.total)")
self.imageCache.setObject(img, forKey: i.thumbUrlAbsolute, cost: size)
self.imageCache.setObject(img, forKey: i.thumbUrlAbsolute as AnyObject, cost: size)
} }
} }
index += size index += size
} }
} }
func preload(start: Int, count: Int) {
func preload(_ start: Int, count: Int) {
dateFormatter.dateFormat = "HH:mm:ss.SSSZ" dateFormatter.dateFormat = "HH:mm:ss.SSSZ"
@ -140,29 +140,34 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
if end > items.count { if end > items.count {
end = items.count end = items.count
} }
for var k = start; k < end; k++ {
let tu = items[k].thumbUrl!.stringByReplacingOccurrencesOfString("?preview=true", withString: "")
if end < start {
return
}
for k in start ..< end {
let tu = items[k].thumbUrl!.replacingOccurrences(of: "?preview=true", with: "")
preview += "\(tu);" preview += "\(tu);"
} }
preview = preview.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)!
preview = preview.addingPercentEscapes(using: String.Encoding.isoLatin1)!
let u2 = "\(NetworkManager.sharedInstance.baseurl)/service/preload?preview=\(preview)" let u2 = "\(NetworkManager.sharedInstance.baseurl)/service/preload?preview=\(preview)"
let u3 = NSURL(string: u2)
let u3 = URL(string: u2)
if let URL = u3 { if let URL = u3 {
let time = dateFormatter.stringFromDate(NSDate())
let time = dateFormatter.string(from: Date())
print("\(time) preload image \(u2)") print("\(time) preload image \(u2)")
urlSession!.dataTaskWithURL(URL) {
urlSession!.dataTask(with: URL, completionHandler: {
(da, response, error) in (da, response, error) in
if let d = da { if let d = da {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.high).async {
() -> Void in () -> Void in
self.loadData(d, start: start, end: end) self.loadData(d, start: start, end: end)
} }
} }
}.resume()
}) .resume()
// op1.qualityOfService = NSQualityOfService.Background // op1.qualityOfService = NSQualityOfService.Background
// backgroundOperationQueue.addOperation(op1) // backgroundOperationQueue.addOperation(op1)
} else { } else {
@ -179,13 +184,13 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
func shot() { func shot() {
let currentItem = items[photoAlbumView.centerPageIndex] let currentItem = items[photoAlbumView.centerPageIndex]
var imageUrl = currentItem.thumbUrl!.stringByReplacingOccurrencesOfString("_thumb.jpg", withString: ".jpg")
imageUrl = imageUrl.stringByReplacingOccurrencesOfString("?preview=true", withString: "")
var imageUrl = currentItem.thumbUrl!.replacingOccurrences(of: "_thumb.jpg", with: ".jpg")
imageUrl = imageUrl.replacingOccurrences(of: "?preview=true", with: "")
let url = NetworkManager.sharedInstance.baseurl + "/service/linkfavpic" + imageUrl let url = NetworkManager.sharedInstance.baseurl + "/service/linkfavpic" + imageUrl
print(url) print(url)
Alamofire.request(.GET, url).responseString {
(_, _, string) in
Alamofire.request(url).responseString {
(result) in
print("ok") print("ok")
} }
} }
@ -219,11 +224,11 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
nextItem = 0 nextItem = 0
} }
photoAlbumView.moveToPageAtIndex(nextItem, animated: false);
photoAlbumView.moveToPage(at: nextItem, animated: false);
photoScrubberView.setSelectedPhotoIndex(nextItem, animated: true) photoScrubberView.setSelectedPhotoIndex(nextItem, animated: true)
if (slide > 0) { if (slide > 0) {
timer = NSTimer.scheduledTimerWithTimeInterval(Double(slide) / 2.0, target: self, selector: #selector(showItem), userInfo: nil, repeats: false)
timer = Timer.scheduledTimer(timeInterval: Double(slide) / 2.0, target: self, selector: #selector(showItem), userInfo: nil, repeats: false)
} else { } else {
timer = nil timer = nil
} }
@ -241,18 +246,18 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
print(items) print(items)
print(url) print(url)
Alamofire.request(.GET, url).responseJSON {
(request, response, result) in
Alamofire.request(url).responseJSON {
(response) in
var im = [MediaItem]() var im = [MediaItem]()
if let json = result.value {
if let json = response.result.value {
for s in json as! [String] { for s in json as! [String] {
if s.hasSuffix(".jpg") { if s.hasSuffix(".jpg") {
let l = s.length
let l = s.characters.count
let name = NSURL(fileURLWithPath: s).lastPathComponent! let name = NSURL(fileURLWithPath: s).lastPathComponent!
var pathlen = l - len - name.length
var pathlen = l - len - name.characters.count
// if (pathlen > 1000) { // if (pathlen > 1000) {
print(pathlen) print(pathlen)
@ -263,14 +268,14 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
pathlen = 2 pathlen = 2
} }
let path = (s as NSString).substringWithRange(NSMakeRange(len + 1, pathlen - 2))
let path = (s as NSString).substring(with: NSMakeRange(len + 1, pathlen - 2))
let folderName = NSURL(fileURLWithPath: path).lastPathComponent! let folderName = NSURL(fileURLWithPath: path).lastPathComponent!
let fl = path.length
let pfl = fl - folderName.length
let fl = path.length()
let pfl = fl - folderName.length()
print("\(folderName) \(pfl)") print("\(folderName) \(pfl)")
let fpath = (s as NSString).substringWithRange(NSMakeRange(0, pfl))
let fpath = s.substringLeft(pfl)
let i = MediaItem(name: folderName, path: fpath, root: items.root, type: ItemType.PICS) let i = MediaItem(name: folderName, path: fpath, root: items.root, type: ItemType.PICS)
i.thumbUrl = "\(s)?preview=true" i.thumbUrl = "\(s)?preview=true"
@ -285,11 +290,11 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
pc.items = im pc.items = im
pc.completionHandler = { pc.completionHandler = {
self.dismissViewControllerAnimated(true, completion: nil);
self.dismiss(animated: true, completion: nil);
} }
let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack. let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack.
self.presentViewController(navController, animated: false, completion: nil)
self.present(navController, animated: false, completion: nil)
} }
} }
return return
@ -301,13 +306,13 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
controller.currentItem = currentItem controller.currentItem = currentItem
controller.navigationItem.leftItemsSupplementBackButton = true controller.navigationItem.leftItemsSupplementBackButton = true
navigationController!.navigationBar.barTintColor = UIColor.blackColor()
navigationController!.navigationBar.barTintColor = UIColor.black
navigationController!.pushViewController(controller, animated: true) navigationController!.pushViewController(controller, animated: true)
controller.completionHandler = { controller.completionHandler = {
() in () in
// NetworkManager.sharedInstance.saveItem(self.currentItem!) // NetworkManager.sharedInstance.saveItem(self.currentItem!)
self.dismissViewControllerAnimated(true, completion: nil);
self.dismiss(animated: true, completion: nil);
} }
} }
@ -316,18 +321,17 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
photoAlbumView.dataSource = self photoAlbumView.dataSource = self
photoScrubberView.dataSource = self photoScrubberView.dataSource = self
toolbarIsTranslucent = true
isToolbarTranslucent = true
hidesChromeWhenScrolling = true hidesChromeWhenScrolling = true
chromeCanBeHidden = true chromeCanBeHidden = true
scrubberIsEnabled = true
isScrubberEnabled = true
// Toolbar Setup // Toolbar Setup
let bounds = self.view.bounds; let bounds = self.view.bounds;
let toolbarHeight = CGFloat(120.0) let toolbarHeight = CGFloat(120.0)
toolbar.frame = CGRectMake(0, bounds.size.height - toolbarHeight, bounds.size.width, toolbarHeight);
photoAlbumView.zoomingAboveOriginalSizeIsEnabled = true;
toolbar.frame = CGRect(x: 0, y: bounds.size.height - toolbarHeight, width: bounds.size.width, height: toolbarHeight)
photoAlbumView.isZoomingAboveOriginalSizeEnabled = true;
// This title will be displayed until we get the results back for the album information. // This title will be displayed until we get the results back for the album information.
self.title = "loading" self.title = "loading"
@ -336,12 +340,12 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
print("\(items.count)") print("\(items.count)")
} }
func photoAlbumScrollView(photoAlbumScrollView: NIPhotoAlbumScrollView!, photoAtIndex: Int, photoSize: UnsafeMutablePointer<NIPhotoScrollViewPhotoSize>,
func photoAlbumScrollView(_ photoAlbumScrollView: NIPhotoAlbumScrollView!, photoAt photoAtIndex: Int, photoSize: UnsafeMutablePointer<NIPhotoScrollViewPhotoSize>,
isLoading: UnsafeMutablePointer<ObjCBool>, originalPhotoDimensions: UnsafeMutablePointer<CGSize>) -> UIImage! { isLoading: UnsafeMutablePointer<ObjCBool>, originalPhotoDimensions: UnsafeMutablePointer<CGSize>) -> UIImage! {
let newItem = items[photoAtIndex] let newItem = items[photoAtIndex]
let u1 = NSURL(string: newItem.imageUrlAbsolute)
let u2 = NSURL(string: newItem.thumbUrlAbsolute)
if let hqURL = u1, URL = u2 {
let u1 = URL(string: newItem.imageUrlAbsolute)
let u2 = URL(string: newItem.thumbUrlAbsolute)
if let hqURL = u1, let u5 = u2 {
var image: UIImage? = nil var image: UIImage? = nil
@ -350,8 +354,8 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
for r in requests { for r in requests {
let pages = self.photoAlbumView.visiblePages() as NSMutableSet! let pages = self.photoAlbumView.visiblePages() as NSMutableSet!
var ok = false var ok = false
for page in pages.allObjects {
if (page.pageIndex == r.index) {
for page in (pages?.allObjects)! {
if ((page as AnyObject).pageIndex == r.index) {
ok = true ok = true
break break
} }
@ -359,32 +363,32 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
if !ok { if !ok {
r.cancel() r.cancel()
requests.removeAtIndex(requests.indexOf(r)!)
requests.remove(at: requests.index(of: r)!)
} }
} }
image = imageCache.objectForKey(URL.absoluteString) as? UIImage
image = imageCache.object(forKey: u5.absoluteString as AnyObject) as? UIImage
if image != nil { if image != nil {
size = NIPhotoScrollViewPhotoSizeThumbnail size = NIPhotoScrollViewPhotoSizeThumbnail
isLoading[0] = false isLoading[0] = false
} else { } else {
let URL = NSURL(string: newItem.thumbUrlAbsolute)!
let ur = URL(string: newItem.thumbUrlAbsolute)!
let op3 = DataLoadOperation(imageURL: URL, succeeder: {
let op3 = DataLoadOperation(imageURL: ur, succeeder: {
d in d in
if d.length > 0 {
if d.count > 0 {
if let i = UIImage(data: d) { if let i = UIImage(data: d) {
// println("thumb preload image loaded \(newItem.imageUrlAbsolute)") // println("thumb preload image loaded \(newItem.imageUrlAbsolute)")
let imageRef = i.CGImage;
self.imageCache.setObject(d, forKey: newItem.thumbUrlAbsolute, cost: d.length)
let imageRef = i.cgImage;
self.imageCache.setObject(d as AnyObject, forKey: newItem.thumbUrlAbsolute as AnyObject, cost: d.count)
size = NIPhotoScrollViewPhotoSizeThumbnail size = NIPhotoScrollViewPhotoSizeThumbnail
self.photoAlbumView.didLoadPhoto(i, atIndex: photoAtIndex, photoSize: size)
self.photoScrubberView.didLoadThumbnail(i, atIndex: photoAtIndex);
self.photoAlbumView.didLoadPhoto(i, at: photoAtIndex, photoSize: size)
self.photoScrubberView.didLoadThumbnail(i, at: photoAtIndex);
} }
} }
}, index: photoAtIndex, session: urlSession!) }, index: photoAtIndex, session: urlSession!)
op3.qualityOfService = NSQualityOfService.UserInteractive
op3.qualityOfService = QualityOfService.userInteractive
operationQueue.addOperation(op3) operationQueue.addOperation(op3)
} }
@ -393,10 +397,10 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
i in i in
// println("image loaded \(newItem.imageUrlAbsolute) at \(photoAtIndex)") // println("image loaded \(newItem.imageUrlAbsolute) at \(photoAtIndex)")
size = NIPhotoScrollViewPhotoSizeOriginal size = NIPhotoScrollViewPhotoSizeOriginal
self.photoAlbumView.didLoadPhoto(i, atIndex: photoAtIndex, photoSize: size)
self.photoAlbumView.didLoadPhoto(i, at: photoAtIndex, photoSize: size)
photoSize[0] = size photoSize[0] = size
}, index: photoAtIndex) }, index: photoAtIndex)
op2.qualityOfService = NSQualityOfService.UserInitiated
op2.qualityOfService = QualityOfService.userInitiated
requests.append(op2) requests.append(op2)
operationQueue.addOperation(op2) operationQueue.addOperation(op2)
@ -414,7 +418,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
} }
} }
func numberOfPagesInPagingScrollView(pagingScrollView: NIPagingScrollView) -> Int {
func numberOfPages(in pagingScrollView: NIPagingScrollView) -> Int {
let c = items.count let c = items.count
return c return c
} }
@ -425,8 +429,8 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
* You should always try to reuse pages by calling dequeueReusablePageWithIdentifier: on the * You should always try to reuse pages by calling dequeueReusablePageWithIdentifier: on the
* paging scroll view before allocating a new page. * paging scroll view before allocating a new page.
*/ */
func pagingScrollView(pagingScrollView: NIPagingScrollView, pageViewForIndex: Int) -> UIView {
let view = photoAlbumView.pagingScrollView(pagingScrollView, pageViewForIndex: pageViewForIndex) as! NIPhotoScrollView
func pagingScrollView(_ pagingScrollView: NIPagingScrollView, pageViewFor pageViewForIndex: Int) -> UIView {
let view = photoAlbumView.pagingScrollView(pagingScrollView, pageViewFor: pageViewForIndex) as! NIPhotoScrollView
view.maximumScale = 3; view.maximumScale = 3;
@ -434,7 +438,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
return view; return view;
} }
func numberOfPhotosInScrubberView(photoScrubberView: NIPhotoScrubberView!) -> Int {
func numberOfPhotos(in photoScrubberView: NIPhotoScrubberView!) -> Int {
let c = items.count let c = items.count
return c return c
} }
@ -444,30 +448,30 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
* *
* Please read and understand the performance considerations for this data source. * Please read and understand the performance considerations for this data source.
*/ */
func photoScrubberView(photoScrubberView: NIPhotoScrubberView!, thumbnailAtIndex thumbnailIndex: Int) -> UIImage! {
func photoScrubberView(_ photoScrubberView: NIPhotoScrubberView!, thumbnailAt thumbnailIndex: Int) -> UIImage! {
if thumbnailIndex < 0 { if thumbnailIndex < 0 {
return nil return nil
} }
var image: UIImage? var image: UIImage?
let newItem = items[thumbnailIndex] let newItem = items[thumbnailIndex]
let u1 = NSURL(string: newItem.thumbUrlAbsolute)
let u1 = URL(string: newItem.thumbUrlAbsolute)
if let URL = u1 { if let URL = u1 {
image = imageCache.objectForKey(URL.absoluteString) as? UIImage
image = imageCache.object(forKey: URL.absoluteString as AnyObject) as? UIImage
if (image == nil) { if (image == nil) {
urlSession!.dataTaskWithURL(URL) {
urlSession!.dataTask(with: URL) {
(da, response, error) in (da, response, error) in
if let d = da { if let d = da {
if let i = UIImage(data: d) { if let i = UIImage(data: d) {
// println("thumb image loaded \(newItem.thumbUrlAbsolute)") // println("thumb image loaded \(newItem.thumbUrlAbsolute)")
let imageRef = i.CGImage;
self.imageCache.setObject(i, forKey: newItem.thumbUrlAbsolute, cost: d.length)
let imageRef = i.cgImage;
self.imageCache.setObject(i, forKey: newItem.thumbUrlAbsolute as AnyObject, cost: d.count)
self.photoScrubberView.didLoadThumbnail(i, atIndex: thumbnailIndex);
self.photoScrubberView.didLoadThumbnail(i, at: thumbnailIndex);
} }
} }
} }

22
kplayer/util/DataLoadOperation.swift

@ -8,19 +8,19 @@ import Alamofire
import Darwin import Darwin
class DataLoadOperation: NSOperation {
internal typealias Succeeder = (NSData) -> ()
class DataLoadOperation: Operation {
internal typealias Succeeder = (Data) -> ()
let imageURL: NSURL
let imageURL: URL
let succeeder: Succeeder let succeeder: Succeeder
let index: Int let index: Int
var ready1 = false var ready1 = false
let backgroundSession: NSURLSession
var downloadTask: NSURLSessionDataTask?
let backgroundSession: URLSession
var downloadTask: URLSessionDataTask?
init(imageURL: NSURL, succeeder: Succeeder, index: Int, session: NSURLSession) {
init(imageURL: URL, succeeder: @escaping Succeeder, index: Int, session: URLSession) {
self.imageURL = imageURL self.imageURL = imageURL
self.succeeder = succeeder self.succeeder = succeeder
self.index = index self.index = index
@ -28,17 +28,17 @@ class DataLoadOperation: NSOperation {
} }
override func main() { override func main() {
if self.cancelled {
if self.isCancelled {
return return
} }
let dateFormatter = NSDateFormatter()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm:ss.SSS" dateFormatter.dateFormat = "HH:mm:ss.SSS"
// var configuration = NSURLSessionConfiguration.defaultSessionConfiguration(); // backgroundSessionConfigurationWithIdentifier("imageLoad"); // var configuration = NSURLSessionConfiguration.defaultSessionConfiguration(); // backgroundSessionConfigurationWithIdentifier("imageLoad");
// configuration.HTTPMaximumConnectionsPerHost = 100; // configuration.HTTPMaximumConnectionsPerHost = 100;
// var backgroundSession = NSURLSession(configuration: configuration, delegate: nil, delegateQueue: nil); // var backgroundSession = NSURLSession(configuration: configuration, delegate: nil, delegateQueue: nil);
let url = NSURLRequest(URL: imageURL);
downloadTask = backgroundSession.dataTaskWithRequest(url, completionHandler: {
let url = URLRequest(url: imageURL);
downloadTask = backgroundSession.dataTask(with: url, completionHandler: {
data,response,error in data,response,error in
if error == nil { if error == nil {
@ -46,7 +46,7 @@ class DataLoadOperation: NSOperation {
// let time = dateFormatter.stringFromDate(NSDate()) // let time = dateFormatter.stringFromDate(NSDate())
// print("\(time) preloaded image \(self.imageURL)") // print("\(time) preloaded image \(self.imageURL)")
dispatch_async(dispatch_get_main_queue(), {
DispatchQueue.main.async(execute: {
() -> Void in () -> Void in
self.succeeder(d) self.succeeder(d)
}) })

10
kplayer/util/HanekeFetchOperation.swift

@ -6,25 +6,25 @@
import Foundation import Foundation
import Haneke import Haneke
class HanekeFetchOperation: NSOperation {
let baseUrl: NSURL
class HanekeFetchOperation: Operation {
let baseUrl: URL
let succeeder: Fetch<UIImage>.Succeeder let succeeder: Fetch<UIImage>.Succeeder
let index: Int let index: Int
init(baseUrl: NSURL, succeeder: Fetch<UIImage>.Succeeder, index: Int) {
init(baseUrl: URL, succeeder: @escaping Fetch<UIImage>.Succeeder, index: Int) {
self.baseUrl = baseUrl self.baseUrl = baseUrl
self.succeeder = succeeder self.succeeder = succeeder
self.index = index self.index = index
} }
override func main() { override func main() {
if self.cancelled {
if self.isCancelled {
return return
} }
Shared.imageCache.fetch(URL: baseUrl).onSuccess { i in Shared.imageCache.fetch(URL: baseUrl).onSuccess { i in
dispatch_async(dispatch_get_main_queue(), { self.succeeder(i) })
DispatchQueue.main.async(execute: { self.succeeder(i) })
} }
} }

28
kplayer/util/ImageLoadOperation.swift

@ -7,48 +7,48 @@ import Foundation
import Alamofire import Alamofire
import Darwin import Darwin
class ImageLoadOperation: NSOperation {
class ImageLoadOperation: Operation {
internal typealias Succeeder = (UIImage) -> () internal typealias Succeeder = (UIImage) -> ()
let imageURL: NSURL
let imageURL: URL
let succeeder: Succeeder let succeeder: Succeeder
let index: Int let index: Int
var request: Request?
var request: DataRequest?
var manager: Manager?
var manager: SessionManager?
var ready1 = false var ready1 = false
init(imageURL: NSURL, succeeder: Succeeder, index: Int) {
init(imageURL: URL, succeeder: @escaping Succeeder, index: Int) {
self.imageURL = imageURL self.imageURL = imageURL
self.succeeder = succeeder self.succeeder = succeeder
self.index = index self.index = index
} }
override func main() { override func main() {
if self.cancelled {
if self.isCancelled {
return return
} }
let r = NSMutableURLRequest(URL: imageURL)
r.HTTPBody = nil
r.addValue("0", forHTTPHeaderField: "Content-Length")
let r = URLRequest(url: imageURL)
// r.httpBody = nil
// r.addValue("0", forHTTPHeaderField: "Content-Length")
if let m = manager { if let m = manager {
request = m.request(.GET, r)
request = m.request(r)
} else { } else {
request = Alamofire.request(.GET, r)
request = Alamofire.request(r)
} }
request!.validate().response { (request, response, data, error) in
if let e = error as? NSError {
request!.response { (response) in
if let e = response.error as? NSError {
if (e.code != -999) { if (e.code != -999) {
print(e) print(e)
} }
} }
else if let d = data {
else if let d = response.data {
self.succeeder(UIImage(data: d, scale: 1)!) self.succeeder(UIImage(data: d, scale: 1)!)
} }
} }

20
kplayer/util/LayoutTools.swift

@ -8,15 +8,15 @@ import UIKit
public extension UIView { public extension UIView {
func autolayout(views: [String:UIView!], constraints: Any...) {
func autolayout(_ views: [String:UIView?], constraints: Any...) {
autolay(views, constraints:constraints) autolay(views, constraints:constraints)
} }
func autolay(views: [String:UIView!], constraints: [Any]) {
func autolay(_ views: [String:UIView?], constraints: [Any]) {
var index = 0; var index = 0;
for value in views.values { for value in views.values {
let vv: UIView = value
let vv: UIView = value!
addSubview(vv) addSubview(vv)
vv.translatesAutoresizingMaskIntoConstraints = false vv.translatesAutoresizingMaskIntoConstraints = false
} }
@ -25,15 +25,15 @@ public extension UIView {
let c = constraints[index] let c = constraints[index]
if c is String { if c is String {
if index + 1 < constraints.count && !(constraints[index + 1] is String) { if index + 1 < constraints.count && !(constraints[index + 1] is String) {
index++
let constr: NSArray = NSLayoutConstraint.constraintsWithVisualFormat(c as! String,
index += 1
let constr: NSArray = NSLayoutConstraint.constraints(withVisualFormat: c as! String,
options: constraints[index] as! NSLayoutFormatOptions, options: constraints[index] as! NSLayoutFormatOptions,
metrics: nil, metrics: nil,
views: views)
views: views) as NSArray
addConstraints(constr as! [NSLayoutConstraint]) addConstraints(constr as! [NSLayoutConstraint])
} else { } else {
let constr: NSArray = NSLayoutConstraint.constraintsWithVisualFormat(c as! String,
options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)
let constr: NSArray = NSLayoutConstraint.constraints(withVisualFormat: c as! String,
options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) as NSArray
addConstraints(constr as! [NSLayoutConstraint]) addConstraints(constr as! [NSLayoutConstraint])
} }
} }
@ -41,11 +41,11 @@ public extension UIView {
} }
} }
func recursiveSearchForViewWithName(classname: String) -> UIView? {
func recursiveSearchForViewWithName(_ classname: String) -> UIView? {
for v in subviews { for v in subviews {
let sv = v let sv = v
let result = sv.recursiveSearchForViewWithName(classname) let result = sv.recursiveSearchForViewWithName(classname)
let cn = String(v.dynamicType)
let cn = String(describing: type(of: v))
if cn == classname { if cn == classname {
return v return v

4
kplayer/util/NetData.swift

@ -33,10 +33,10 @@ enum MimeType: String {
class NetData class NetData
{ {
let data: NSData
let data: Data
let mimeType: MimeType let mimeType: MimeType
let filename: String let filename: String
init(data: NSData, mimeType: MimeType, filename: String) {
init(data: Data, mimeType: MimeType, filename: String) {
self.data = data self.data = data
self.mimeType = mimeType self.mimeType = mimeType
self.filename = filename self.filename = filename

94
kplayer/util/NetworkHelper.swift

@ -6,54 +6,56 @@
import Foundation import Foundation
import Alamofire import Alamofire
func urlRequestWithComponents(urlString: String, parameters: NSDictionary) -> (URLRequestConvertible, NSData) {
// create url request to send
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue
//let boundaryConstant = "myRandomBoundary12345"
let boundaryConstant = "NET-POST-boundary-\(arc4random())-\(arc4random())"
let contentType = "multipart/form-data;boundary=" + boundaryConstant
mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")
// create upload data to send
let uploadData = NSMutableData()
// add parameters
for (key, value) in parameters {
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
if value is NetData {
// add image
let postData = value as! NetData
//uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(postData.filename)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// append content disposition
let filenameClause = " filename=\"\(postData.filename)\""
let contentDispositionString = "Content-Disposition: form-data; name=\"\(key)\";\(filenameClause)\r\n"
let contentDispositionData = contentDispositionString.dataUsingEncoding(NSUTF8StringEncoding)
uploadData.appendData(contentDispositionData!)
// append content type
//uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // mark this.
let contentTypeString = "Content-Type: \(postData.mimeType.getString())\r\n\r\n"
let contentTypeData = contentTypeString.dataUsingEncoding(NSUTF8StringEncoding)
uploadData.appendData(contentTypeData!)
uploadData.appendData(postData.data)
} else {
uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
}
}
uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// return URLRequestConvertible and NSData
return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}
//func urlRequestWithComponents(_ urlString: String, parameters: NSDictionary) -> (URLRequestConvertible, NSData) {
//
// // create url request to send
// let mutableURLRequest = MutableURLRequest(url: URL(string: urlString)!)
// mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue
// //let boundaryConstant = "myRandomBoundary12345"
// let boundaryConstant = "NET-POST-boundary-\(arc4random())-\(arc4random())"
// let contentType = "multipart/form-data;boundary=" + boundaryConstant
// mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")
//
//
// // create upload data to send
// let uploadData = NSMutableData()
//
// // add parameters
// for (key, value) in parameters {
//
// uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!)
//
// if value is NetData {
// // add image
// let postData = value as! NetData
//
// //uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(postData.filename)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
//
// // append content disposition
// let filenameClause = " filename=\"\(postData.filename)\""
// let contentDispositionString = "Content-Disposition: form-data; name=\"\(key)\";\(filenameClause)\r\n"
// let contentDispositionData = contentDispositionString.data(using: String.Encoding.utf8)
// uploadData.append(contentDispositionData!)
//
//
// // append content type
// //uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // mark this.
// let contentTypeString = "Content-Type: \(postData.mimeType.getString())\r\n\r\n"
// let contentTypeData = contentTypeString.data(using: String.Encoding.utf8)
// uploadData.append(contentTypeData!)
// uploadData.append(postData.data)
//
// } else {
// uploadData.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".data(using: String.Encoding.utf8)!)
// }
// }
// uploadData.append("\r\n--\(boundaryConstant)--\r\n".data(using: String.Encoding.utf8)!)
//
// // return URLRequestConvertible and NSData
// return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
//}
class NetworkHelper { class NetworkHelper {
} }

12
kplayer/util/UIImageExtension.swift

@ -7,20 +7,20 @@ import Foundation
import UIKit import UIKit
extension UIImage { extension UIImage {
func scaleToSize(width: CGFloat, height: CGFloat) -> UIImage {
UIGraphicsBeginImageContext(CGSizeMake(width, height));
func scaleToSize(_ width: CGFloat, height: CGFloat) -> UIImage {
UIGraphicsBeginImageContext(CGSize(width: width, height: height));
let context = UIGraphicsGetCurrentContext(); let context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0.0, height);
CGContextScaleCTM(context, 1.0, -1.0);
context?.translateBy(x: 0.0, y: height);
context?.scaleBy(x: 1.0, y: -1.0);
CGContextDrawImage(context, CGRectMake(0.0, 0.0, width, height), self.CGImage);
context?.draw(self.cgImage!, in: CGRect(x: 0.0, y: 0.0, width: width, height: height));
let scaledImage = UIGraphicsGetImageFromCurrentImageContext(); let scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); UIGraphicsEndImageContext();
return scaledImage;
return scaledImage!;
} }

49
kplayer/util/UploadOperation.swift

@ -6,46 +6,51 @@
import Foundation import Foundation
import Alamofire import Alamofire
class UploadOperation: NSOperation {
class UploadOperation: Operation {
let baseUrl: String let baseUrl: String
let data: NSData
let data: Data
let path: String let path: String
init(baseUrl: String, data: NSData, path: String) {
init(baseUrl: String, data: Data, path: String) {
self.baseUrl = baseUrl self.baseUrl = baseUrl
self.data = data self.data = data
self.path = path self.path = path
} }
override func main() { override func main() {
if self.cancelled {
if self.isCancelled {
return return
} }
let parameters = [
"file": NetData(data: data, mimeType: MimeType.Json, filename: path),
"name": path
]
print("PATH: \(path)") print("PATH: \(path)")
let urlRequest = urlRequestWithComponents(baseUrl, parameters: parameters)
Alamofire.upload(urlRequest.0, data: urlRequest.1)
// success: todo set url to item
Alamofire.upload(multipartFormData: { multipartFormData in
multipartFormData.append(self.data, withName: "file", fileName: self.path, mimeType: MimeType.Json.rawValue)
multipartFormData.append(self.path.data(using: String.Encoding.utf8)!, withName: "name")
}, to: baseUrl,
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.responseJSON { response in
print(response.result.value)
}
case .failure(let error):
print(error)
}
})
// .progress { // .progress {
// (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in // (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
// print("progress : \(totalBytesWritten) / \(totalBytesExpectedToWrite)") // print("progress : \(totalBytesWritten) / \(totalBytesExpectedToWrite)")
// } // }
.response { (request, response, data, error) in
if let d = data {
let datastring = NSString(data: d, encoding:NSUTF8StringEncoding)
print("d \(datastring)")
}
if let e = error {
print("e \(e)")
}
}
// .response { (request, response, data, error) in
// if let d = data {
// let datastring = NSString(data: d, encoding:NSUTF8StringEncoding)
// print("d \(datastring)")
// }
// if let e = error {
// print("e \(e)")
// }
// }
} }
} }

10
kplayer/util/ViewControllerExtensions.swift

@ -16,9 +16,9 @@ public extension UIView {
public extension UIViewController { public extension UIViewController {
func findControllerInHierachy<T where T:UIViewController>(_: T.Type) -> T? {
func findControllerInHierachy<T>(_: T.Type) -> T? where T:UIViewController {
var currentVC = self var currentVC = self
while let parentVC = currentVC.parentViewController {
while let parentVC = currentVC.parent {
print("comparing \(parentVC) to \(T.description())") print("comparing \(parentVC) to \(T.description())")
if let result = parentVC as? T { if let result = parentVC as? T {
// (XXX) // (XXX)
@ -29,7 +29,7 @@ public extension UIViewController {
return nil return nil
} }
func findChildController<T>(my: T.Type) -> T? {
func findChildController<T>(_ my: T.Type) -> T? {
for child in childViewControllers { for child in childViewControllers {
if let result = child as? T { if let result = child as? T {
// (XXX) // (XXX)
@ -43,7 +43,7 @@ public extension UIViewController {
return nil return nil
} }
func removeAllConstraints(otherView: UIView) {
func removeAllConstraints(_ otherView: UIView) {
var cons = [NSLayoutConstraint]() var cons = [NSLayoutConstraint]()
for con:NSLayoutConstraint in self.view.constraints { for con:NSLayoutConstraint in self.view.constraints {
if (con.firstItem as? UIView == otherView || con.secondItem as? UIView == otherView) { if (con.firstItem as? UIView == otherView || con.secondItem as? UIView == otherView) {
@ -57,7 +57,7 @@ public extension UIViewController {
otherView.translatesAutoresizingMaskIntoConstraints = true; otherView.translatesAutoresizingMaskIntoConstraints = true;
} }
func embedChildViewController(vc: UIViewController, inView: UIView) {
func embedChildViewController(_ vc: UIViewController, inView: UIView) {
vc.view.frame = inView.bounds; vc.view.frame = inView.bounds;
addChildViewController(vc); addChildViewController(vc);
inView.removeAllSubViews(); inView.removeAllSubViews();

32
kplayer/util/stringutil.swift

@ -6,11 +6,39 @@
import Foundation import Foundation
public extension String { public extension String {
func beginsWith (str: String) -> Bool {
func beginsWith (_ str: String) -> Bool {
return hasPrefix(str) return hasPrefix(str)
} }
func endsWith (str: String) -> Bool {
func endsWith (_ str: String) -> Bool {
return hasSuffix(str) return hasSuffix(str)
} }
// die ersten X Zeichen
func substringLeft(_ idx: Int) -> String {
let ix = index(startIndex, offsetBy: idx)
return substring(to: ix)
}
// ohne die letzten X zeichen
func substringWithoutLast(_ idx: Int) -> String {
let ix = index(endIndex, offsetBy: idx * -1)
return substring(to: ix)
}
// ab X bis zum Ende
func substringStartingFrom(_ idx: Int) -> String {
let ix = index(startIndex, offsetBy: idx)
return substring(from: ix)
}
// die letzten X Zeichen
func substringRight (_ idx: Int) -> String {
let ix = index(endIndex, offsetBy: idx * -1)
return substring(from: ix)
}
func length() -> Int {
return characters.count
}
} }

2
kplayerTests/kplayerTests.swift

@ -33,7 +33,7 @@ class kplayerTests: XCTestCase {
func testPerformanceExample() { func testPerformanceExample() {
// This is an example of a performance test case. // This is an example of a performance test case.
self.measureBlock() {
self.measure() {
// Put the code you want to measure the time of here. // Put the code you want to measure the time of here.
} }
} }

Loading…
Cancel
Save