public IEnumerable <ITrack> GetTracks() { MPMediaQuery mq = new MPMediaQuery(); var value = NSObject.FromObject(PersistentID); var type = MPMediaItem.AlbumPersistentIDProperty; var predicate = MPMediaPropertyPredicate.PredicateWithValue(value, type); mq.AddFilterPredicate(predicate); return(mq.Items.Select(source => new Track() { Title = source.Title, AlbumTrackNumber = source.AlbumTrackNumber, ContentUrl = source.AssetURL.AbsoluteString, Duration = (int)source.PlaybackDuration })); }
public async Task <IEnumerable <Artist> > SearchArtistsAsync(string searchTerm, ArtistSortOrder sortOrder = ArtistSortOrder.Default) { if (string.IsNullOrWhiteSpace(searchTerm)) { throw new ArgumentNullException(nameof(searchTerm)); } return(await Task.Run(() => { var mediaQuery = PrepareMediaQuery(); var value = NSObject.FromObject(searchTerm); var searchTermPredicate = MPMediaPropertyPredicate.PredicateWithValue(value, MPMediaItem.TitleProperty, MPMediaPredicateComparison.Contains); mediaQuery.AddFilterPredicate(searchTermPredicate); return mediaQuery.ToArtists(sortOrder); })); }
public async Task <IEnumerable <Artist> > GetArtistsByIdAsync(IEnumerable <string> artistIds, ArtistSortOrder sortOrder = ArtistSortOrder.Default) { if (!artistIds.HasValue()) { throw new ArgumentException(nameof(artistIds)); } return(await Task.Run(() => { var mediaQuery = PrepareMediaQuery(); var value = NSArray.FromNSObjects(artistIds.Select(s => NSObject.FromObject(s)).ToArray()); var arrayPredictor = MPMediaPropertyPredicate.PredicateWithValue(value, MPMediaItem.PersistentIDProperty, MPMediaPredicateComparison.Contains); mediaQuery.AddFilterPredicate(arrayPredictor); return mediaQuery.ToArtists(sortOrder); })); }
public async Task <IEnumerable <Artist> > GetArtistsByGenre(string genreId, ArtistSortOrder sortOrder = ArtistSortOrder.Default) { if (string.IsNullOrWhiteSpace(genreId)) { throw new ArgumentNullException(nameof(genreId)); } return(await Task.Run(() => { var mediaQuery = PrepareMediaQuery(); var value = NSObject.FromObject(genreId); var genreIdPredicate = MPMediaPropertyPredicate.PredicateWithValue(value, MPMediaItem.GenrePersistentIDProperty); mediaQuery.AddFilterPredicate(genreIdPredicate); return mediaQuery.ToArtists(sortOrder); })); }
protected override async System.Threading.Tasks.Task <bool> Sync() { if (Disabled) { return(true); } return(await Task.Run(async() => { try{ await Database.Main.ExecuteAsync("update Track set Deleted = 1 where ServiceId = ?", Id); var mediaQuery = MPMediaQuery.SongsQuery; var predicate = MPMediaPropertyPredicate.PredicateWithValue(NSNumber.FromBoolean(false), MPMediaItem.IsCloudItemProperty); mediaQuery.AddFilterPredicate(predicate); if (mediaQuery.Items == null) { return true; } var items = mediaQuery.Items.Where(x => x.AssetURL != null && !string.IsNullOrEmpty(x.AssetURL.AbsoluteString)).Select(x => new FullTrackData(x.Title, x.Artist, x.AlbumArtist, x.AlbumTitle, x.Genre) { Id = x.PersistentID.ToString(), AlbumServerId = x.AlbumPersistentID.ToString(), Disc = x.DiscNumber, Duration = x.PlaybackDuration, FileExtension = "mp3", MediaType = MediaType.Audio, Priority = 1, ServiceId = Id, ServiceType = ServiceType, Track = x.AlbumTrackNumber, // Year = x.ReleaseDate }); await items.BatchForeach(100, (batch) => MusicProvider.ProcessTracks(batch.ToList())); await FinalizeProcessing(Id); return true; } catch (Exception ex) { LogManager.Shared.Report(ex); return false; } })); }
private void PlatformLoad(Action <int> progressCallback) { MPMediaQuery mediaQuery = new MPMediaQuery(); var value = NSObject.FromObject(MPMediaType.Music); var type = MPMediaItem.MediaTypeProperty; var predicate = MPMediaPropertyPredicate.PredicateWithValue(value, type); mediaQuery.AddFilterPredicate(predicate); mediaQuery.GroupingType = MPMediaGrouping.Album; List <Song> songList = new List <Song>(); List <Album> albumList = new List <Album>(); for (int i = 0; i < mediaQuery.Collections.Length; i++) { MPMediaItemCollection itemCollection = mediaQuery.Collections[i]; List <Song> albumSongs = new List <Song>(itemCollection.Count); var nsAlbumArtist = itemCollection.RepresentativeItem.ValueForProperty(MPMediaItem.AlbumArtistProperty); var nsAlbumName = itemCollection.RepresentativeItem.ValueForProperty(MPMediaItem.AlbumTitleProperty); var nsAlbumGenre = itemCollection.RepresentativeItem.ValueForProperty(MPMediaItem.GenreProperty); string albumArtist = nsAlbumArtist == null ? "Unknown Artist" : nsAlbumArtist.ToString(); string albumName = nsAlbumName == null ? "Unknown Album" : nsAlbumName.ToString(); string albumGenre = nsAlbumGenre == null ? "Unknown Genre" : nsAlbumGenre.ToString(); MPMediaItemArtwork thumbnail = itemCollection.RepresentativeItem.ValueForProperty(MPMediaItem.ArtworkProperty) as MPMediaItemArtwork; var album = new Album(new SongCollection(albumSongs), albumName, new Artist(albumArtist), new Genre(albumGenre), thumbnail); albumList.Add(album); for (int j = 0; j < itemCollection.Count; j++) { var nsArtist = itemCollection.Items[j].ValueForProperty(MPMediaItem.ArtistProperty); var nsTitle = itemCollection.Items[j].ValueForProperty(MPMediaItem.TitleProperty); var nsGenre = itemCollection.Items[j].ValueForProperty(MPMediaItem.GenreProperty); var assetUrl = itemCollection.Items[j].ValueForProperty(MPMediaItem.AssetURLProperty) as NSUrl; if (nsTitle == null || assetUrl == null) // The Asset URL check will exclude iTunes match items from the Media Library that are not downloaded, but show up in the music app { continue; } string artist = nsArtist == null ? "Unknown Artist" : nsArtist.ToString(); string title = nsTitle.ToString(); string genre = nsGenre == null ? "Unknown Genre" : nsGenre.ToString(); TimeSpan duration = TimeSpan.FromSeconds(((NSNumber)itemCollection.Items[j].ValueForProperty(MPMediaItem.PlaybackDurationProperty)).FloatValue); var song = new Song(album, new Artist(artist), new Genre(genre), title, duration, itemCollection.Items[j], assetUrl); albumSongs.Add(song); songList.Add(song); } } albumCollection = new AlbumCollection(albumList); songCollection = new SongCollection(songList); /*_playLists = new PlaylistCollection(); * * MPMediaQuery playlists = new MPMediaQuery(); * playlists.GroupingType = MPMediaGrouping.Playlist; * for (int i = 0; i < playlists.Collections.Length; i++) * { * MPMediaItemCollection item = playlists.Collections[i]; * Playlist list = new Playlist(); * list.Name = playlists.Items[i].ValueForProperty(MPMediaPlaylistPropertyName).ToString(); * for (int k = 0; k < item.Items.Length; k++) * { * TimeSpan time = TimeSpan.Parse(item.Items[k].ValueForProperty(MPMediaItem.PlaybackDurationProperty).ToString()); * list.Duration += time; * } * _playLists.Add(list); * }*/ }
// Get the songs on the device public Dictionary <string, List <Song> > queryForSongs() { MPMediaQuery query = MPMediaQuery.ArtistsQuery; /* * TigerMending album (12 missing on 5s) Picked up in app on 4 (and iPad Air 2!!) but not on 5s… not filtered out, just not picked up by app???? * Casey James (“Let’s do…"Missing on 4) <<<<<<<<<<<< filtered out as they should be as they ARE icloud items (not on computer or device) * Israel K (2 extra versions on 5s) <<<<<<<<<<<<<<<<< * Muse (2 extra “Hysteria” and “Time is running out” on 5s) <<<<<<<<<<<< * Owsley (“Undone" missing on 4) <<<<<<<<<<<<<<<<<<< * Radiohead (6 “Nude” single and stems missing on 4) <<<<<<<<<<<<<<< * U2 (1 “Vertigo” extra on 5s) <<<<<<<<<<<<<<<<<<< */ MPMediaPropertyPredicate filter = MPMediaPropertyPredicate.PredicateWithValue(NSNumber.FromBoolean(false), MPMediaItem.IsCloudItemProperty); query.AddFilterPredicate(filter); MPMediaItemCollection[] songsByArtist = query.Collections; Dictionary <string, List <Song> > artistSongs = new Dictionary <string, List <Song> >(); List <Song> songs; foreach (MPMediaItemCollection album in songsByArtist) { MPMediaItem[] albumSongs = album.Items; string artistName = ""; songs = new List <Song>(); foreach (MPMediaItem songMediumItem in albumSongs) { // Create a new song type and add the info from this song to it Song song = new Song(); song.album = songMediumItem.AlbumTitle.ToString(); song.artist = songMediumItem.Artist.ToString(); if (artistName == "") { artistName = song.artist; } song.song = songMediumItem.Title.ToString(); song.songID = songMediumItem.PersistentID; song.artwork = songMediumItem.Artwork; song.duration = songMediumItem.PlaybackDuration; // Add the song to the list songs.Add(song); } /* The reason Tigermending was not getting picked up is that it was deleivered * by the iPhone 5s MediaQuery separately from the rest of the Carina ROund albums * So without the below else clause, It was not added to the existing Carina Round song list * This is good to do anyway, so be it. */ if (!artistSongs.ContainsKey(artistName)) { artistSongs.Add(artistName, songs); } else { List <Song> temp = null; artistSongs.TryGetValue(artistName, out temp); if (temp != null) { temp.AddRange(songs); } } } return(artistSongs); }