VLCMediaSubcategory.swift 7.4 KB

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