CollectionModel.swift 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //
  2. // CollectionModel.swift
  3. // VLC-iOS
  4. //
  5. // Created by Carola Nitz on 08.03.19.
  6. // Copyright © 2019 VideoLAN. All rights reserved.
  7. //
  8. import Foundation
  9. class CollectionModel: MLBaseModel {
  10. var sortModel: SortModel
  11. var mediaCollection: MediaCollectionModel
  12. typealias MLType = VLCMLMedia // could be anything
  13. required init(medialibrary: MediaLibraryService) {
  14. preconditionFailure("")
  15. }
  16. required init(mediaService: MediaLibraryService, mediaCollection: MediaCollectionModel) {
  17. self.medialibrary = mediaService
  18. self.mediaCollection = mediaCollection
  19. files = mediaCollection.files() ?? []
  20. sortModel = mediaCollection.sortModel() ?? SortModel([.default])
  21. medialibrary.addObserver(self)
  22. }
  23. func append(_ item: VLCMLMedia) {
  24. files.append(item)
  25. }
  26. var medialibrary: MediaLibraryService
  27. var updateView: (() -> Void)?
  28. var files = [VLCMLMedia]()
  29. var cellType: BaseCollectionViewCell.Type { return MediaCollectionViewCell.self }
  30. // No indicator for this model so no localization needed.
  31. var indicatorName: String = "Collections"
  32. func delete(_ items: [VLCMLObject]) {
  33. if let playlist = mediaCollection as? VLCMLPlaylist {
  34. for case let media as VLCMLMedia in items {
  35. if let index = files.firstIndex(of: media) {
  36. playlist.removeMedia(fromPosition: UInt32(index))
  37. }
  38. }
  39. } else {
  40. do {
  41. for case let media as VLCMLMedia in items {
  42. if let mainFile = media.mainFile() {
  43. try FileManager.default.removeItem(atPath: mainFile.mrl.path)
  44. }
  45. }
  46. medialibrary.reload()
  47. }
  48. catch let error as NSError {
  49. assertionFailure("CollectionModel: Delete failed: \(error.localizedDescription)")
  50. }
  51. }
  52. }
  53. }
  54. // MARK: - Edit
  55. extension CollectionModel: EditableMLModel {
  56. func editCellType() -> BaseCollectionViewCell.Type {
  57. return MediaEditCell.self
  58. }
  59. }
  60. // MARK: - MediaLibraryObserver
  61. extension CollectionModel: MediaLibraryObserver {
  62. func medialibrary(_ medialibrary: MediaLibraryService, didModifyPlaylists playlists: [VLCMLPlaylist]) {
  63. if mediaCollection is VLCMLPlaylist {
  64. files = mediaCollection.files() ?? []
  65. updateView?()
  66. }
  67. }
  68. func medialibrary(_ medialibrary: MediaLibraryService, didDeleteMediaWithIds ids: [NSNumber]) {
  69. files = mediaCollection.files() ?? []
  70. updateView?()
  71. }
  72. }