VLCMediaSubcategory.swift 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*****************************************************************************
  2. * VLCMediaSubcategory.swift
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2017 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Authors: Carola Nitz <caro # videolan.org>
  9. *
  10. * Refer to the COPYING file of the official project for license.
  11. *****************************************************************************/
  12. import Foundation
  13. extension Notification.Name {
  14. static let VLCMoviesDidChangeNotification = Notification.Name("MoviesDidChangeNotfication")
  15. static let VLCEpisodesDidChangeNotification = Notification.Name("EpisodesDidChangeNotfication")
  16. static let VLCArtistsDidChangeNotification = Notification.Name("ArtistsDidChangeNotfication")
  17. static let VLCAlbumsDidChangeNotification = Notification.Name("AlbumsDidChangeNotfication")
  18. static let VLCTracksDidChangeNotification = Notification.Name("TracksDidChangeNotfication")
  19. static let VLCGenresDidChangeNotification = Notification.Name("GenresDidChangeNotfication")
  20. static let VLCAudioPlaylistsDidChangeNotification = Notification.Name("AudioPlaylistsDidChangeNotfication")
  21. static let VLCVideoPlaylistsDidChangeNotification = Notification.Name("VideoPlaylistsDidChangeNotfication")
  22. static let VLCVideosDidChangeNotification = Notification.Name("VideosDidChangeNotfication")
  23. }
  24. enum VLCDataUnit {
  25. case file(MLFile)
  26. case episode(MLShowEpisode)
  27. case album(MLAlbum)
  28. case label(MLLabel)
  29. }
  30. class VLCMediaSubcategory<T>: NSObject {
  31. var files: [T]
  32. var indicatorInfoName: String
  33. var notificationName: Notification.Name
  34. var includesFunc: (VLCDataUnit) -> Bool
  35. var appendFunc: (VLCDataUnit) -> Void
  36. var indicatorInfo: IndicatorInfo {
  37. return IndicatorInfo(title: indicatorInfoName)
  38. }
  39. init(files: [T],
  40. indicatorInfoName: String,
  41. notificationName: Notification.Name,
  42. includesFunc: @escaping (VLCDataUnit) -> Bool,
  43. appendFunc: @escaping (VLCDataUnit) -> Void) {
  44. self.files = files
  45. self.indicatorInfoName = indicatorInfoName
  46. self.notificationName = notificationName
  47. self.includesFunc = includesFunc
  48. self.appendFunc = appendFunc
  49. }
  50. }
  51. struct VLCMediaSubcategories {
  52. static var movies = VLCMediaSubcategory<MLFile>(
  53. files: {
  54. (MLFile.allFiles() as! [MLFile]).filter {
  55. ($0 as MLFile).isKind(ofType: kMLFileTypeMovie) ||
  56. ($0 as MLFile).isKind(ofType: kMLFileTypeTVShowEpisode) ||
  57. ($0 as MLFile).isKind(ofType: kMLFileTypeClip)
  58. }
  59. }(),
  60. indicatorInfoName: NSLocalizedString("MOVIES", comment: ""),
  61. notificationName: .VLCMoviesDidChangeNotification,
  62. includesFunc: { (dataUnit: VLCDataUnit) in
  63. if case .file(let f) = dataUnit {
  64. return f.isMovie()
  65. }
  66. return false
  67. },
  68. appendFunc: { (dataUnit: VLCDataUnit) in
  69. })
  70. static var episodes = VLCMediaSubcategory<MLShowEpisode>(
  71. files: MLShowEpisode.allEpisodes() as! [MLShowEpisode],
  72. indicatorInfoName: NSLocalizedString("EPISODES", comment: ""),
  73. notificationName: .VLCEpisodesDidChangeNotification,
  74. includesFunc: { (dataUnit: VLCDataUnit) in
  75. if case .episode(let f) = dataUnit {
  76. return true
  77. }
  78. return false
  79. },
  80. appendFunc: { (dataUnit: VLCDataUnit) in
  81. })
  82. static var artists = VLCMediaSubcategory<String>(
  83. files: {
  84. let tracksWithArtist = (MLAlbumTrack.allTracks() as! [MLAlbumTrack]).filter { $0.artist != nil && $0.artist != "" }
  85. return tracksWithArtist.map { $0.artist } as! [String]
  86. }(),
  87. indicatorInfoName: NSLocalizedString("ARTISTS", comment: ""),
  88. notificationName: .VLCArtistsDidChangeNotification,
  89. includesFunc: { (dataUnit: VLCDataUnit) in
  90. if case .file(let f) = dataUnit {
  91. return f.artist != nil
  92. }
  93. return false
  94. },
  95. appendFunc: { (dataUnit: VLCDataUnit) in
  96. })
  97. static var albums = VLCMediaSubcategory<MLAlbum>(
  98. files: MLAlbum.allAlbums() as! [MLAlbum],
  99. indicatorInfoName: NSLocalizedString("ALBUMS", comment: ""),
  100. notificationName: .VLCAlbumsDidChangeNotification,
  101. includesFunc: { (dataUnit: VLCDataUnit) in
  102. if case .album(let f) = dataUnit {
  103. return true
  104. }
  105. return false
  106. },
  107. appendFunc: { (dataUnit: VLCDataUnit) in
  108. })
  109. static var tracks = VLCMediaSubcategory<MLFile>(
  110. files: (MLFile.allFiles() as! [MLFile]).filter { $0.isSupportedAudioFile()},
  111. indicatorInfoName: NSLocalizedString("SONGS", comment: ""),
  112. notificationName: .VLCTracksDidChangeNotification,
  113. includesFunc: { (dataUnit: VLCDataUnit) in
  114. if case .file(let f) = dataUnit {
  115. return f.isSupportedAudioFile()
  116. }
  117. return false
  118. },
  119. appendFunc: { (dataUnit: VLCDataUnit) in
  120. })
  121. static var genres = VLCMediaSubcategory<String>(
  122. files: {
  123. let albumtracks = MLAlbumTrack.allTracks() as! [MLAlbumTrack]
  124. let tracksWithArtist = albumtracks.filter { $0.genre != nil && $0.genre != "" }
  125. return tracksWithArtist.map { $0.genre }
  126. }(),
  127. indicatorInfoName: NSLocalizedString("GENRES", comment: ""),
  128. notificationName: .VLCGenresDidChangeNotification ,
  129. includesFunc: { (dataUnit: VLCDataUnit) in
  130. if case .file(let f) = dataUnit {
  131. return f.genre != nil
  132. }
  133. return false
  134. },
  135. appendFunc: { (dataUnit: VLCDataUnit) in
  136. })
  137. static var audioPlaylists = VLCMediaSubcategory<MLLabel>(
  138. files: {
  139. let labels = MLLabel.allLabels() as! [MLLabel]
  140. let audioPlaylist = labels.filter {
  141. let audioFiles = $0.files.filter {
  142. if let file = $0 as? MLFile {
  143. return file.isSupportedAudioFile()
  144. }
  145. return false
  146. }
  147. return !audioFiles.isEmpty
  148. }
  149. return audioPlaylist
  150. }(),
  151. indicatorInfoName: NSLocalizedString("AUDIO_PLAYLISTS", comment: ""),
  152. notificationName: .VLCAudioPlaylistsDidChangeNotification ,
  153. includesFunc: { (dataUnit: VLCDataUnit) in
  154. if case .label(let l) = dataUnit {
  155. let audioFiles = l.files.filter {
  156. if let file = $0 as? MLFile {
  157. return file.isSupportedAudioFile()
  158. } else {
  159. return false
  160. }
  161. }
  162. return !audioFiles.isEmpty
  163. }
  164. return false
  165. },
  166. appendFunc: { (dataUnit: VLCDataUnit) in
  167. })
  168. static var videoPlaylists = VLCMediaSubcategory<MLLabel>(
  169. files: {
  170. let labels = MLLabel.allLabels() as! [MLLabel]
  171. let audioPlaylist = labels.filter {
  172. let audioFiles = $0.files.filter {
  173. if let file = $0 as? MLFile {
  174. return file.isShowEpisode() || file.isMovie() || file.isClip()
  175. }
  176. return false
  177. }
  178. return !audioFiles.isEmpty
  179. }
  180. return audioPlaylist
  181. }(),
  182. indicatorInfoName: NSLocalizedString("VIDEO_PLAYLISTS", comment: ""),
  183. notificationName: .VLCVideoPlaylistsDidChangeNotification ,
  184. includesFunc: { (dataUnit: VLCDataUnit) in
  185. if case .label(let l) = dataUnit {
  186. let videoFiles = l.files.filter {
  187. if let file = $0 as? MLFile {
  188. return file.isShowEpisode() || file.isMovie() || file.isClip()
  189. } else {
  190. return false
  191. }
  192. }
  193. return !videoFiles.isEmpty
  194. }
  195. return false
  196. },
  197. appendFunc: { (dataUnit: VLCDataUnit) in
  198. })
  199. }