CollectionModel.swift 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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([.alpha, .duration, .insertionDate, .releaseDate, .fileSize])
  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. self.sortModel = mediaCollection.sortModel() ?? self.sortModel
  28. var sortingCriteria: VLCMLSortingCriteria = .default
  29. if mediaCollection is VLCMLArtist
  30. || mediaCollection is VLCMLGenre
  31. || mediaCollection is VLCMLAlbum {
  32. sortingCriteria = .album
  33. }
  34. self.sortModel.currentSort = sortingCriteria
  35. files = mediaCollection.files() ?? []
  36. medialibrary.addObserver(self)
  37. }
  38. func append(_ item: VLCMLMedia) {
  39. files.append(item)
  40. }
  41. func delete(_ items: [VLCMLObject]) {
  42. if let playlist = mediaCollection as? VLCMLPlaylist {
  43. for case let media as VLCMLMedia in items {
  44. if let index = files.firstIndex(of: media) {
  45. playlist.removeMedia(fromPosition: UInt32(index))
  46. }
  47. }
  48. } else {
  49. do {
  50. for case let media as VLCMLMedia in items {
  51. if let mainFile = media.mainFile() {
  52. try FileManager.default.removeItem(atPath: mainFile.mrl.path)
  53. }
  54. }
  55. medialibrary.reload()
  56. }
  57. catch let error as NSError {
  58. assertionFailure("CollectionModel: Delete failed: \(error.localizedDescription)")
  59. }
  60. filterFilesFromDeletion(of: items)
  61. }
  62. }
  63. func sort(by criteria: VLCMLSortingCriteria, desc: Bool) {
  64. files = mediaCollection.files(with: criteria, desc: desc) ?? []
  65. sortModel.currentSort = criteria
  66. sortModel.desc = desc
  67. updateView?()
  68. }
  69. }
  70. // MARK: - MediaLibraryObserver
  71. extension CollectionModel: MediaLibraryObserver {
  72. func medialibrary(_ medialibrary: MediaLibraryService,
  73. didModifyPlaylistsWithIds playlistsIds: [NSNumber]) {
  74. if mediaCollection is VLCMLPlaylist {
  75. files = mediaCollection.files() ?? []
  76. updateView?()
  77. }
  78. }
  79. func medialibrary(_ medialibrary: MediaLibraryService, didModifyTracks tracks: [VLCMLMedia]) {
  80. files = mediaCollection.files() ?? []
  81. updateView?()
  82. }
  83. func medialibrary(_ medialibrary: MediaLibraryService, didDeleteMediaWithIds ids: [NSNumber]) {
  84. files = mediaCollection.files() ?? []
  85. updateView?()
  86. }
  87. func medialibraryDidStartRescan() {
  88. files.removeAll()
  89. }
  90. }