123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /*****************************************************************************
- * VLC for iOS
- *****************************************************************************
- * Copyright (c) 2017-2018 VideoLAN. All rights reserved.
- * $Id$
- *
- * Authors: Carola Nitz <caro # videolan.org>
- *
- * Refer to the COPYING file of the official project for license.
- *****************************************************************************/
- #import "VLCMetadata.h"
- #import <MediaPlayer/MediaPlayer.h>
- #import "VLCPlaybackService.h"
- #if TARGET_OS_IOS
- #import "VLC-Swift.h"
- #import "VLCThumbnailsCache.h"
- #endif
- @implementation VLCMetaData
- - (instancetype)init
- {
- self = [super init];
- if (self) {
- self.trackNumber = nil;
- self.title = @"";
- self.artist = @"";
- self.albumName = @"";
- self.artworkImage = nil;
- self.isAudioOnly = NO;
- }
- return self;
- }
- #if TARGET_OS_TV
- - (void)updateMetadataFromMediaPlayer:(VLCMediaPlayer *)mediaPlayer;
- {
- [self updateMetadataFromMediaPlayerFortvOS:mediaPlayer];
- }
- #endif
- #if TARGET_OS_IOS
- - (void)updateMetadataFromMedia:(VLCMLMedia *)media mediaPlayer:(VLCMediaPlayer*)mediaPlayer
- {
- if (media) {
- self.title = media.title;
- self.artist = media.albumTrack.artist.name;
- self.trackNumber = @(media.albumTrack.trackNumber);
- self.albumName = media.albumTrack.album.title;
- self.artworkImage = [media thumbnailImage];
- self.isAudioOnly = [media subtype] == VLCMLMediaSubtypeAlbumTrack;
- } else { // We're streaming something
- BOOL isDarktheme = PresentationTheme.current == PresentationTheme.darkTheme;
- self.artworkImage = isDarktheme ? [UIImage imageNamed:@"song-placeholder-dark"]
- : [UIImage imageNamed:@"song-placeholder-white"];
- [self fillFromMetaDict:mediaPlayer];
- }
- [self checkIsAudioOnly:mediaPlayer];
- if (self.isAudioOnly) {
- if (self.artworkImage) {
- if (self.artist)
- self.title = [self.title stringByAppendingFormat:@" — %@", self.artist];
- if (self.albumName)
- self.title = [self.title stringByAppendingFormat:@" — %@", self.albumName];
- }
- if (self.title.length < 1)
- self.title = [[mediaPlayer.media url] lastPathComponent];
- }
- [self updatePlaybackRate:mediaPlayer];
- //Down here because we still need to populate the miniplayer
- if ([VLCKeychainCoordinator passcodeLockEnabled]) return;
- [self populateInfoCenterFromMetadata];
- }
- #else
- - (void)updateMetadataFromMediaPlayerFortvOS:(VLCMediaPlayer *)mediaPlayer
- {
- [self fillFromMetaDict:mediaPlayer];
- [self checkIsAudioOnly:mediaPlayer];
- if (self.isAudioOnly) {
- if (self.title.length < 1)
- self.title = [[mediaPlayer.media url] lastPathComponent];
- }
- [self updatePlaybackRate:mediaPlayer];
- [self populateInfoCenterFromMetadata];
- }
- #endif
- - (void)updatePlaybackRate:(VLCMediaPlayer *)mediaPlayer
- {
- self.playbackDuration = @(mediaPlayer.media.length.intValue / 1000.);
- self.playbackRate = @(mediaPlayer.rate);
- self.elapsedPlaybackTime = @(mediaPlayer.time.value.floatValue / 1000.);
- [[NSNotificationCenter defaultCenter] postNotificationName:VLCPlaybackServicePlaybackMetadataDidChange object:self];
- }
- - (void)checkIsAudioOnly:(VLCMediaPlayer *)mediaPlayer
- {
- _isAudioOnly = mediaPlayer.numberOfVideoTracks == 0;
- }
- - (void)fillFromMetaDict:(VLCMediaPlayer *)mediaPlayer
- {
- NSDictionary *metaDict = mediaPlayer.media.metaDictionary;
- if (metaDict) {
- self.title = metaDict[VLCMetaInformationNowPlaying] ?: metaDict[VLCMetaInformationTitle];
- self.artist = metaDict[VLCMetaInformationArtist];
- self.albumName = metaDict[VLCMetaInformationAlbum];
- self.trackNumber = metaDict[VLCMetaInformationTrackNumber];
- }
- }
- - (void)populateInfoCenterFromMetadata
- {
- NSMutableDictionary *currentlyPlayingTrackInfo = [NSMutableDictionary dictionary];
- currentlyPlayingTrackInfo[MPMediaItemPropertyPlaybackDuration] = self.playbackDuration;
- currentlyPlayingTrackInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = self.elapsedPlaybackTime;
- currentlyPlayingTrackInfo[MPNowPlayingInfoPropertyPlaybackRate] = self.playbackRate;
- currentlyPlayingTrackInfo[MPMediaItemPropertyTitle] = self.title;
- currentlyPlayingTrackInfo[MPMediaItemPropertyArtist] = self.artist;
- currentlyPlayingTrackInfo[MPMediaItemPropertyAlbumTitle] = self.albumName;
- if ([self.trackNumber intValue] > 0)
- currentlyPlayingTrackInfo[MPMediaItemPropertyAlbumTrackNumber] = self.trackNumber;
- #if TARGET_OS_IOS
- if (self.artworkImage) {
- MPMediaItemArtwork *mpartwork = [[MPMediaItemArtwork alloc] initWithImage:self.artworkImage];
- currentlyPlayingTrackInfo[MPMediaItemPropertyArtwork] = mpartwork;
- }
- #endif
- [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = currentlyPlayingTrackInfo;
- }
- @end
|