Browse Source

MediaCollectionViewCell: Add placeholder images

(fixes #482 fixes #477)
Carola Nitz 6 years ago
parent
commit
13abd78b45
41 changed files with 273 additions and 42 deletions
  1. 4 0
      Resources/en.lproj/Localizable.strings
  2. 16 0
      SharedSources/MediaLibraryModel/AlbumModel.swift
  3. 15 0
      SharedSources/MediaLibraryModel/ArtistModel.swift
  4. 13 0
      SharedSources/MediaLibraryModel/GenreModel.swift
  5. 14 0
      SharedSources/MediaLibraryModel/MediaModel.swift
  6. 15 0
      SharedSources/MediaLibraryModel/PlaylistModel.swift
  7. 2 1
      SharedSources/VLCMetadata.m
  8. 8 31
      Sources/MediaCategoryCells/MediaCollectionViewCell.swift
  9. 2 10
      Sources/MediaCategoryCells/MovieCollectionViewCell.swift
  10. BIN
      vlc-ios/Images.xcassets/MediaController/album-placeholder-dark.imageset/Albumplaceholderdark.png
  11. BIN
      vlc-ios/Images.xcassets/MediaController/album-placeholder-dark.imageset/Albumplaceholderdark@2x.png
  12. BIN
      vlc-ios/Images.xcassets/MediaController/album-placeholder-dark.imageset/Albumplaceholderdark@3x.png
  13. 23 0
      vlc-ios/Images.xcassets/MediaController/album-placeholder-dark.imageset/Contents.json
  14. BIN
      vlc-ios/Images.xcassets/MediaController/album-placeholder-white.imageset/Albumplaceholder.png
  15. BIN
      vlc-ios/Images.xcassets/MediaController/album-placeholder-white.imageset/Albumplaceholder@2x.png
  16. BIN
      vlc-ios/Images.xcassets/MediaController/album-placeholder-white.imageset/Albumplaceholder@3x.png
  17. 23 0
      vlc-ios/Images.xcassets/MediaController/album-placeholder-white.imageset/Contents.json
  18. 23 0
      vlc-ios/Images.xcassets/MediaController/artist-placeholder-dark.imageset/Contents.json
  19. BIN
      vlc-ios/Images.xcassets/MediaController/artist-placeholder-dark.imageset/artistdark.png
  20. BIN
      vlc-ios/Images.xcassets/MediaController/artist-placeholder-dark.imageset/artistdark@2x.png
  21. BIN
      vlc-ios/Images.xcassets/MediaController/artist-placeholder-dark.imageset/artistdark@3x.png
  22. BIN
      vlc-ios/Images.xcassets/MediaController/artist-placeholder-white.imageset/ArtistWhite.png
  23. BIN
      vlc-ios/Images.xcassets/MediaController/artist-placeholder-white.imageset/ArtistWhite@2x.png
  24. BIN
      vlc-ios/Images.xcassets/MediaController/artist-placeholder-white.imageset/ArtistWhite@3x.png
  25. 23 0
      vlc-ios/Images.xcassets/MediaController/artist-placeholder-white.imageset/Contents.json
  26. 23 0
      vlc-ios/Images.xcassets/MediaController/movie-placeholder-dark.imageset/Contents.json
  27. BIN
      vlc-ios/Images.xcassets/MediaController/movie-placeholder-dark.imageset/moviedark.png
  28. BIN
      vlc-ios/Images.xcassets/MediaController/movie-placeholder-dark.imageset/moviedark@2x.png
  29. BIN
      vlc-ios/Images.xcassets/MediaController/movie-placeholder-dark.imageset/moviedark@3x.png
  30. 23 0
      vlc-ios/Images.xcassets/MediaController/movie-placeholder-white.imageset/Contents.json
  31. BIN
      vlc-ios/Images.xcassets/MediaController/movie-placeholder-white.imageset/moviewhite.png
  32. BIN
      vlc-ios/Images.xcassets/MediaController/movie-placeholder-white.imageset/moviewhite@2x.png
  33. BIN
      vlc-ios/Images.xcassets/MediaController/movie-placeholder-white.imageset/moviewhite@3x.png
  34. 23 0
      vlc-ios/Images.xcassets/MediaController/song-placeholder-dark.imageset/Contents.json
  35. BIN
      vlc-ios/Images.xcassets/MediaController/song-placeholder-dark.imageset/songdark.png
  36. BIN
      vlc-ios/Images.xcassets/MediaController/song-placeholder-dark.imageset/songdark@2x.png
  37. BIN
      vlc-ios/Images.xcassets/MediaController/song-placeholder-dark.imageset/songdark@3x.png
  38. 23 0
      vlc-ios/Images.xcassets/MediaController/song-placeholder-white.imageset/Contents.json
  39. BIN
      vlc-ios/Images.xcassets/MediaController/song-placeholder-white.imageset/songwhite.png
  40. BIN
      vlc-ios/Images.xcassets/MediaController/song-placeholder-white.imageset/songwhite@2x.png
  41. BIN
      vlc-ios/Images.xcassets/MediaController/song-placeholder-white.imageset/songwhite@3x.png

+ 4 - 0
Resources/en.lproj/Localizable.strings

@@ -355,3 +355,7 @@
 // VLCNetworkLoginTVViewController
 
 "NO_SAVING_DATA" = "Nothing found";
+
+/* New strings */
+"UNKNOWN_ARTIST" = "Unknown Artist";
+"UNKNOWN_TITLE" = "Unknown Title";

+ 16 - 0
SharedSources/MediaLibraryModel/AlbumModel.swift

@@ -86,3 +86,19 @@ extension VLCMLAlbum: MediaCollectionModel {
         return title
     }
 }
+extension VLCMLAlbum {
+    @objc func thumbnail() -> UIImage? {
+        var image = UIImage(contentsOfFile: artworkMrl.path)
+        if image == nil {
+            for track in files() ?? [] where track.isThumbnailGenerated() {
+                image = UIImage(contentsOfFile: track.thumbnail.path)
+                break
+            }
+        }
+        if image == nil {
+            let isDarktheme = PresentationTheme.current == PresentationTheme.darkTheme
+            image = isDarktheme ? UIImage(named: "album-placeholder-dark") : UIImage(named: "album-placeholder-white")
+        }
+        return image
+    }
+}

+ 15 - 0
SharedSources/MediaLibraryModel/ArtistModel.swift

@@ -93,4 +93,19 @@ extension VLCMLArtist {
         let tracksString = tracks()?.count == 1 ? NSLocalizedString("TRACK", comment: "") : NSLocalizedString("TRACKS", comment: "")
         return String(format: tracksString, tracks()?.count ?? 0)
     }
+
+    @objc func thumbnail() -> UIImage? {
+        var image = UIImage(contentsOfFile: artworkMrl.path)
+        if image == nil {
+            for track in files() ?? [] where track.isThumbnailGenerated() {
+                image = UIImage(contentsOfFile: track.thumbnail.path)
+                break
+            }
+        }
+        if image == nil {
+            let isDarktheme = PresentationTheme.current == PresentationTheme.darkTheme
+            image = isDarktheme ? UIImage(named: "artist-placeholder-dark") : UIImage(named: "artist-placeholder-white")
+        }
+        return image
+    }
 }

+ 13 - 0
SharedSources/MediaLibraryModel/GenreModel.swift

@@ -84,6 +84,19 @@ extension VLCMLGenre {
         }
         return String(format: NSLocalizedString("TRACK", comment: ""), numberOftracks)
     }
+
+    func thumbnail() -> UIImage? {
+        var image: UIImage? = nil
+        for track in tracks() ?? [] where track.isThumbnailGenerated() {
+            image = UIImage(contentsOfFile: track.thumbnail.path)
+            break
+        }
+        if image == nil {
+            let isDarktheme = PresentationTheme.current == PresentationTheme.darkTheme
+            image = isDarktheme ? UIImage(named: "song-placeholder-dark") : UIImage(named: "song-placeholder-white")
+        }
+        return image
+    }
 }
 
 extension VLCMLGenre: MediaCollectionModel {

+ 14 - 0
SharedSources/MediaLibraryModel/MediaModel.swift

@@ -50,6 +50,20 @@ extension VLCMLMedia {
         return ByteCountFormatter.string(fromByteCount: Int64(mainFile()?.size() ?? 0),
                                          countStyle: .file)
     }
+
+    @objc func thumbnailImage() -> UIImage? {
+        var image = UIImage(contentsOfFile: thumbnail.path)
+        if image == nil {
+            let isDarktheme = PresentationTheme.current == PresentationTheme.darkTheme
+            if subtype() == .albumTrack {
+                image = isDarktheme ? UIImage(named: "song-placeholder-dark") : UIImage(named: "song-placeholder-white")
+            } else {
+                image = isDarktheme ? UIImage(named: "movie-placeholder-dark") : UIImage(named: "movie-placeholder-white")
+            }
+        }
+        return image
+    }
+
 }
 
 // MARK: - CoreSpotlight

+ 15 - 0
SharedSources/MediaLibraryModel/PlaylistModel.swift

@@ -101,6 +101,21 @@ extension VLCMLPlaylist {
         let tracksString = mediaCount > 1 ? NSLocalizedString("TRACKS", comment: "") : NSLocalizedString("TRACK", comment: "")
         return String(format: tracksString, mediaCount)
     }
+
+    @objc func thumbnail() -> UIImage? {
+        var image = UIImage(contentsOfFile: artworkMrl())
+        if image == nil {
+            for track in files() ?? [] where track.isThumbnailGenerated() {
+                image = UIImage(contentsOfFile: track.thumbnail.path)
+                break
+            }
+        }
+        if image == nil {
+            let isDarktheme = PresentationTheme.current == PresentationTheme.darkTheme
+            image = isDarktheme ? UIImage(named: "movie-placeholder-dark") : UIImage(named: "movie-placeholder-white")
+        }
+        return image
+    }
 }
 
 extension VLCMLPlaylist: MediaCollectionModel {

+ 2 - 1
SharedSources/VLCMetadata.m

@@ -49,7 +49,8 @@
         self.artist = media.albumTrack.artist.name;
         self.trackNumber = @(media.albumTrack.trackNumber);
         self.albumName = media.albumTrack.album.title;
-        self.artworkImage = [[UIImage alloc] initWithContentsOfFile:media.thumbnail.path];
+        self.artworkImage = [media thumbnailImage];
+        self.isAudioOnly = [media subtype] == VLCMLMediaSubtypeAlbumTrack;
     } else { // We're streaming something
         self.artworkImage = nil;
         self.trackNumber = nil;

+ 8 - 31
Sources/MediaCategoryCells/MediaCollectionViewCell.swift

@@ -57,23 +57,15 @@ class MediaCollectionViewCell: BaseCollectionViewCell {
         thumbnailView.layer.masksToBounds = true
         thumbnailView.layer.cornerRadius = thumbnailView.frame.size.width / 2.0
         titleLabel.text = audiotrack.title
-        descriptionLabel.text = audiotrack.albumTrack?.artist?.name ?? ""
-        if audiotrack.isThumbnailGenerated() {
-            thumbnailView.image = UIImage(contentsOfFile: audiotrack.thumbnail.path)
-        }
+        descriptionLabel.text = audiotrack.albumTrack?.artist?.name ?? NSLocalizedString("UNKNOWN_ARTIST", comment: "")
         newLabel.isHidden = !audiotrack.isNew
+        thumbnailView.image = audiotrack.thumbnailImage()
     }
 
     func update(album: VLCMLAlbum) {
-        titleLabel.text = album.title
-        descriptionLabel.text = album.albumArtist?.name ?? ""
-        thumbnailView.image = UIImage(contentsOfFile: album.artworkMrl.path)
-        if thumbnailView.image == nil {
-            for track in album.files() ?? [] where track.isThumbnailGenerated() {
-                thumbnailView.image = UIImage(contentsOfFile: track.thumbnail.path)
-                break
-            }
-        }
+        titleLabel.text = album.title != "" ? album.title : NSLocalizedString("UNKNOWN_TITLE", comment: "")
+        descriptionLabel.text = album.albumArtist?.name != "" ? album.albumArtist?.name : NSLocalizedString("UNKNOWN_ARTIST", comment: "")
+        thumbnailView.image = album.thumbnail()
     }
 
     func update(artist: VLCMLArtist) {
@@ -81,13 +73,7 @@ class MediaCollectionViewCell: BaseCollectionViewCell {
         thumbnailView.layer.cornerRadius = thumbnailView.frame.size.width / 2.0
         titleLabel.text = artist.name
         descriptionLabel.text = artist.numberOfTracksString()
-        thumbnailView.image = UIImage(contentsOfFile: artist.artworkMrl.path)
-        if thumbnailView.image == nil {
-            for track in artist.files() ?? [] where track.isThumbnailGenerated() {
-                thumbnailView.image = UIImage(contentsOfFile: track.thumbnail.path)
-                break
-            }
-        }
+        thumbnailView.image = artist.thumbnail()
     }
 
     func update(movie: VLCMLMedia) {
@@ -103,23 +89,14 @@ class MediaCollectionViewCell: BaseCollectionViewCell {
         newLabel.isHidden = true
         titleLabel.text = playlist.name
         descriptionLabel.text = playlist.numberOfTracksString()
-        thumbnailView.image = UIImage(contentsOfFile: playlist.artworkMrl())
-        if thumbnailView.image == nil {
-            for track in playlist.files() ?? [] where track.isThumbnailGenerated() {
-                thumbnailView.image = UIImage(contentsOfFile: track.thumbnail.path)
-                break
-            }
-        }
+        thumbnailView.image = playlist.thumbnail()
     }
 
     func update(genre: VLCMLGenre) {
         newLabel.isHidden = true
         titleLabel.text = genre.name
 
-        for track in genre.tracks() ?? [] where track.isThumbnailGenerated() {
-            thumbnailView.image = UIImage(contentsOfFile: track.thumbnail.path)
-            break
-        }
+        thumbnailView.image = genre.thumbnail()
         descriptionLabel.text = genre.numberOfTracksString()
     }
 

+ 2 - 10
Sources/MediaCategoryCells/MovieCollectionViewCell.swift

@@ -57,9 +57,7 @@ class MovieCollectionViewCell: BaseCollectionViewCell {
     func update(movie: VLCMLMedia) {
         titleLabel.text = movie.title
         descriptionLabel.text = movie.mediaDuration()
-        if movie.isThumbnailGenerated() {
-            thumbnailView.image = UIImage(contentsOfFile: movie.thumbnail.path)
-        }
+        thumbnailView.image = movie.thumbnailImage()
         let progress = movie.progress
         progressView.isHidden = progress == 0
         progressView.progress = progress
@@ -71,13 +69,7 @@ class MovieCollectionViewCell: BaseCollectionViewCell {
         numberOfTracks.text = String(playlist.media?.count ?? 0)
         titleLabel.text = playlist.name
         descriptionLabel.text = playlist.numberOfTracksString()
-        thumbnailView.image = UIImage(contentsOfFile: playlist.artworkMrl())
-        if thumbnailView.image == nil {
-            for track in playlist.files() ?? [] where track.isThumbnailGenerated() {
-                thumbnailView.image = UIImage(contentsOfFile: track.thumbnail.path)
-                break
-            }
-        }
+        thumbnailView.image = playlist.thumbnail()
     }
 
     override class func cellSizeForWidth(_ width: CGFloat) -> CGSize {

BIN
vlc-ios/Images.xcassets/MediaController/album-placeholder-dark.imageset/Albumplaceholderdark.png


BIN
vlc-ios/Images.xcassets/MediaController/album-placeholder-dark.imageset/Albumplaceholderdark@2x.png


BIN
vlc-ios/Images.xcassets/MediaController/album-placeholder-dark.imageset/Albumplaceholderdark@3x.png


+ 23 - 0
vlc-ios/Images.xcassets/MediaController/album-placeholder-dark.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "Albumplaceholderdark.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "Albumplaceholderdark@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "Albumplaceholderdark@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
vlc-ios/Images.xcassets/MediaController/album-placeholder-white.imageset/Albumplaceholder.png


BIN
vlc-ios/Images.xcassets/MediaController/album-placeholder-white.imageset/Albumplaceholder@2x.png


BIN
vlc-ios/Images.xcassets/MediaController/album-placeholder-white.imageset/Albumplaceholder@3x.png


+ 23 - 0
vlc-ios/Images.xcassets/MediaController/album-placeholder-white.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "Albumplaceholder.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "Albumplaceholder@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "Albumplaceholder@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 23 - 0
vlc-ios/Images.xcassets/MediaController/artist-placeholder-dark.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "artistdark.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "artistdark@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "artistdark@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
vlc-ios/Images.xcassets/MediaController/artist-placeholder-dark.imageset/artistdark.png


BIN
vlc-ios/Images.xcassets/MediaController/artist-placeholder-dark.imageset/artistdark@2x.png


BIN
vlc-ios/Images.xcassets/MediaController/artist-placeholder-dark.imageset/artistdark@3x.png


BIN
vlc-ios/Images.xcassets/MediaController/artist-placeholder-white.imageset/ArtistWhite.png


BIN
vlc-ios/Images.xcassets/MediaController/artist-placeholder-white.imageset/ArtistWhite@2x.png


BIN
vlc-ios/Images.xcassets/MediaController/artist-placeholder-white.imageset/ArtistWhite@3x.png


+ 23 - 0
vlc-ios/Images.xcassets/MediaController/artist-placeholder-white.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "ArtistWhite.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "ArtistWhite@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "ArtistWhite@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 23 - 0
vlc-ios/Images.xcassets/MediaController/movie-placeholder-dark.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "moviedark.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "moviedark@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "moviedark@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
vlc-ios/Images.xcassets/MediaController/movie-placeholder-dark.imageset/moviedark.png


BIN
vlc-ios/Images.xcassets/MediaController/movie-placeholder-dark.imageset/moviedark@2x.png


BIN
vlc-ios/Images.xcassets/MediaController/movie-placeholder-dark.imageset/moviedark@3x.png


+ 23 - 0
vlc-ios/Images.xcassets/MediaController/movie-placeholder-white.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "moviewhite.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "moviewhite@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "moviewhite@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
vlc-ios/Images.xcassets/MediaController/movie-placeholder-white.imageset/moviewhite.png


BIN
vlc-ios/Images.xcassets/MediaController/movie-placeholder-white.imageset/moviewhite@2x.png


BIN
vlc-ios/Images.xcassets/MediaController/movie-placeholder-white.imageset/moviewhite@3x.png


+ 23 - 0
vlc-ios/Images.xcassets/MediaController/song-placeholder-dark.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "songdark.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "songdark@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "songdark@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
vlc-ios/Images.xcassets/MediaController/song-placeholder-dark.imageset/songdark.png


BIN
vlc-ios/Images.xcassets/MediaController/song-placeholder-dark.imageset/songdark@2x.png


BIN
vlc-ios/Images.xcassets/MediaController/song-placeholder-dark.imageset/songdark@3x.png


+ 23 - 0
vlc-ios/Images.xcassets/MediaController/song-placeholder-white.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "songwhite.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "songwhite@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "songwhite@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
vlc-ios/Images.xcassets/MediaController/song-placeholder-white.imageset/songwhite.png


BIN
vlc-ios/Images.xcassets/MediaController/song-placeholder-white.imageset/songwhite@2x.png


BIN
vlc-ios/Images.xcassets/MediaController/song-placeholder-white.imageset/songwhite@3x.png