VideoModel.swift 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*****************************************************************************
  2. * VideoModel.swift
  3. *
  4. * Copyright © 2018 VLC authors and VideoLAN
  5. * Copyright © 2018 Videolabs
  6. *
  7. * Authors: Soomin Lee <bubu@mikan.io>
  8. *
  9. * Refer to the COPYING file of the official project for license.
  10. *****************************************************************************/
  11. class VideoModel: MLBaseModel {
  12. typealias MLType = VLCMLMedia
  13. var updateView: (() -> Void)?
  14. var files = [VLCMLMedia]()
  15. var medialibrary: VLCMediaLibraryManager
  16. var indicatorName: String = NSLocalizedString("MOVIES", comment: "")
  17. required init(medialibrary: VLCMediaLibraryManager) {
  18. self.medialibrary = medialibrary
  19. medialibrary.addObserver(self)
  20. files = medialibrary.media(ofType: .video)
  21. medialibrary.requestThumbnail(for: files)
  22. }
  23. func append(_ item: VLCMLMedia) {
  24. if !files.contains { $0 == item } {
  25. files.append(item)
  26. }
  27. }
  28. func delete(_ items: [VLCMLObject]) {
  29. do {
  30. for case let media as VLCMLMedia in items {
  31. try FileManager.default.removeItem(atPath: media.mainFile().mrl.path)
  32. }
  33. medialibrary.reload()
  34. }
  35. catch let error as NSError {
  36. assertionFailure("VideoModel: Delete failed: \(error.localizedDescription)")
  37. }
  38. }
  39. }
  40. // MARK: - Sort
  41. extension VideoModel {
  42. func sort(by criteria: VLCMLSortingCriteria) {
  43. files = medialibrary.media(ofType: .video, sortingCriteria: criteria, desc: false)
  44. updateView?()
  45. }
  46. }
  47. // MARK: - MediaLibraryObserver
  48. extension VideoModel: MediaLibraryObserver {
  49. func medialibrary(_ medialibrary: VLCMediaLibraryManager, didAddVideos videos: [VLCMLMedia]) {
  50. videos.forEach({ append($0) })
  51. updateView?()
  52. }
  53. func medialibrary(_ medialibrary: VLCMediaLibraryManager, didDeleteMediaWithIds ids: [NSNumber]) {
  54. files = files.filter() {
  55. for id in ids where $0.identifier() == id.int64Value {
  56. return false
  57. }
  58. return true
  59. }
  60. updateView?()
  61. }
  62. }
  63. // MARK: MediaLibraryObserver - Thumbnail
  64. extension VideoModel {
  65. func medialibrary(_ medialibrary: VLCMediaLibraryManager, thumbnailReady media: VLCMLMedia) {
  66. for (index, file) in files.enumerated() {
  67. if file == media {
  68. files[index] = media
  69. break
  70. }
  71. }
  72. updateView?()
  73. }
  74. }
  75. extension VLCMLMedia {
  76. static func == (lhs: VLCMLMedia, rhs: VLCMLMedia) -> Bool {
  77. return lhs.identifier() == rhs.identifier()
  78. }
  79. }
  80. extension VLCMLMedia {
  81. @objc func formatDuration() -> String {
  82. return String(format: "%@", VLCTime(int: Int32(duration())))
  83. }
  84. @objc func formatSize() -> String {
  85. return ByteCountFormatter.string(fromByteCount: Int64(mainFile().size()),
  86. countStyle: .file)
  87. }
  88. }