VLCMediaThumbnailerCache.swift 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*****************************************************************************
  2. * VLCMediaThumbnailerCache.swift
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2019 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Authors: Pierre Sagaspe <pierre.sagaspe # me.com>
  9. *
  10. * Refer to the COPYING file of the official project for license.
  11. *****************************************************************************/
  12. import UIKit
  13. @objc class VLCMediaThumbnailerCache: NSObject, VLCMediaThumbnailerDelegate {
  14. @objc func getVideoThumbnail(_ videoURL: NSString) {
  15. if getThumbnailURL(videoURL) != nil {
  16. return
  17. }
  18. let media = VLCMedia(url: URL(fileURLWithPath: videoURL.removingPercentEncoding!))
  19. let thumbnailer = VLCMediaThumbnailer(media: media, andDelegate: self)
  20. let thumbSize = CGSize(width: 800, height: 600)
  21. thumbnailer?.thumbnailWidth = thumbSize.width
  22. thumbnailer?.thumbnailHeight = thumbSize.height
  23. thumbnailer?.fetchThumbnail()
  24. }
  25. // MARK: - VLCMediaThumbnailer data source
  26. func mediaThumbnailer(_ mediaThumbnailer: VLCMediaThumbnailer!, didFinishThumbnail thumbnail: CGImage!) {
  27. if thumbnail != nil {
  28. let thumbnailImage: UIImage? = UIImage.init(cgImage: thumbnail)
  29. if thumbnailImage != nil {
  30. saveThumbnail(thumbnailImage!, mediaURL: mediaThumbnailer.media.url)
  31. NotificationCenter.default.post(name: Notification.Name("thumbnailIComplete"), object: nil)
  32. }
  33. }
  34. }
  35. func mediaThumbnailerDidTimeOut(_ mediaThumbnailer: VLCMediaThumbnailer!) {
  36. print("Time out : \(mediaThumbnailer.media.url)")
  37. }
  38. // MARK: -
  39. private func getThumbnailDirectory() -> NSString {
  40. let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0] as NSString
  41. let thumbnailDirectory = paths.appendingPathComponent("thumbnail")
  42. return thumbnailDirectory.removingPercentEncoding! as NSString
  43. }
  44. @objc func getThumbnailURL(_ mediaPath: NSString) -> URL? {
  45. let thumbnailDir = getThumbnailDirectory()
  46. let thumbnailPath = String(format: "%@/%@.%@", thumbnailDir, (mediaPath.lastPathComponent as NSString).deletingPathExtension.removingPercentEncoding!, "png")
  47. let fileManager = FileManager.default
  48. if fileManager.fileExists(atPath: thumbnailPath) {
  49. return URL.init(fileURLWithPath: thumbnailPath)
  50. }
  51. return nil
  52. }
  53. @objc func removeThumbnail(_ mediaPath: NSString? = nil) {
  54. var thumbnailPath = getThumbnailDirectory()
  55. if mediaPath != nil {
  56. thumbnailPath = NSString(format: "%@/%@.%@", thumbnailPath, (mediaPath!.lastPathComponent as NSString ).deletingPathExtension.removingPercentEncoding!, "png")
  57. }
  58. let fileManager = FileManager.default
  59. var isDir = ObjCBool(false)
  60. if fileManager.fileExists(atPath: thumbnailPath as String, isDirectory: &isDir) {
  61. do {
  62. try fileManager.removeItem(atPath: thumbnailPath as String)
  63. //print("removed : \(String(describing: thumbnailPath))")
  64. }
  65. catch let error as NSError {
  66. print("error remove : \(error)")
  67. }
  68. }
  69. }
  70. func saveThumbnail(_ thumbnail: UIImage, mediaURL: URL) {
  71. let imageData = thumbnail.pngData()
  72. let pngSize: Int = imageData?.count ?? 0
  73. if pngSize > getFreeDiskSpace() ?? 0 {
  74. return
  75. }
  76. let thumbnailDir = getThumbnailDirectory()
  77. let thumbnailPath = NSString(format: "%@/%@.%@", thumbnailDir, ((mediaURL.relativePath.removingPercentEncoding! as NSString).lastPathComponent as NSString).deletingPathExtension, "png")
  78. let fileManager = FileManager.default
  79. if !fileManager.fileExists(atPath: thumbnailDir as String) {
  80. do {
  81. try fileManager.createDirectory(atPath: thumbnailDir as String, withIntermediateDirectories: true, attributes: nil)
  82. }
  83. catch let error as NSError {
  84. print("error creating directory: \(error)")
  85. }
  86. }
  87. if !fileManager.fileExists(atPath: thumbnailPath as String) {
  88. do {
  89. try imageData?.write(to: URL(fileURLWithPath: thumbnailPath.standardizingPath, relativeTo: nil))
  90. } catch let error as NSError {
  91. print("error writing thumbnail : \(error)")
  92. }
  93. }
  94. }
  95. func getFreeDiskSpace() -> Int? {
  96. let fileURL = URL(fileURLWithPath:"/")
  97. do {
  98. let values = try fileURL.resourceValues(forKeys: [.volumeAvailableCapacityKey])
  99. if let capacity = values.volumeAvailableCapacity {
  100. //print("Available capacity for important usage: \(capacity)")
  101. return capacity
  102. } else {
  103. print("Capacity is unavailable")
  104. }
  105. } catch {
  106. print("Error retrieving capacity")
  107. }
  108. return nil
  109. }
  110. }