CollectionModel.swift 2.8 KB

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