Esempio n. 1
0
        public async Task <IList <Song> > GetAllSongs()
        {
            return(await Task.Run <IList <Song> >(() =>
            {
                IList <Song> songs = new ObservableCollection <Song>();

                MPMediaQuery mq = new MPMediaQuery();
                mq.GroupingType = MPMediaGrouping.Title;
                var value = NSNumber.FromInt32((int)MPMediaType.Music);
                var predicate = MPMediaPropertyPredicate.PredicateWithValue(value, MPMediaItem.MediaTypeProperty);
                mq.AddFilterPredicate(predicate);
                var items = mq.Items;

                foreach (var item in items)
                {
                    if (item != null && !item.IsCloudItem && item.AssetURL != null)
                    {
                        songs.Add(new Song
                        {
                            Id = item.PersistentID,
                            Title = item.Title,
                            Artist = item.Artist,
                            Album = item.AlbumTitle,
                            Genre = item.Genre,
                            Artwork = item.Artwork,
                            Duration = (ulong)item.PlaybackDuration,
                            Uri = item.AssetURL.AbsoluteString
                        });
                    }
                }

                return songs;
            }));
        }
        public void queryiTunesLibraryForMediaItems(List <LibraryItem> libraryItems)
        {
#if ENABLE_ITUNES_ITEMS
            try
            {
                var mq        = new MPMediaQuery();
                var value     = NSNumber.FromInt32((int)MPMediaType.TypeAnyVideo);
                var predicate = MPMediaPropertyPredicate.PredicateWithValue(value, MPMediaItem.MediaTypeProperty);
                mq.AddFilterPredicate(predicate);

                List <MPMediaItem> mediaItems = new List <MPMediaItem>(mq.Items);
                foreach (MPMediaItem mediaItem in mediaItems)
                {
                    AVAsset asset = AVAsset.FromUrl(mediaItem.AssetURL);
                    if ((asset != null) && isRecording(asset))
                    {
                        LibraryItem libraryItem = new LibraryItem();
                        libraryItem.Storage       = LibraryItemStorage.iTunes;
                        libraryItem.ID            = mediaItem.PersistentID.ToString();
                        libraryItem.LocalFilePath = mediaItem.AssetURL.ToString();
                        fetchMetadata(asset, ref libraryItem);

                        libraryItems.Add(libraryItem);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Log("ERROR: LocalLibrary.queryiTunesLibraryForMediaItems: " + ex);
            }
#endif
        }
Esempio n. 3
0
        public async Task <IList <Song> > GetPlaylistSongs(ulong playlistId)
        {
            return(await Task.Run <IList <Song> >(() =>
            {
                IList <Song> songs = new ObservableCollection <Song>();

                MPMediaQuery mq = MPMediaQuery.SongsQuery;
                var value = NSNumber.FromUInt64(playlistId);
                MPMediaPropertyPredicate predicate = MPMediaPropertyPredicate.PredicateWithValue(value, MPMediaPlaylistProperty.PersistentID);
                mq.AddFilterPredicate(predicate);
                var items = mq.Items;

                foreach (var item in items)
                {
                    if (item != null && item.AssetURL != null)
                    {
                        songs.Add(new Song
                        {
                            Id = item.PersistentID,
                            Title = item.Title,
                            Artist = item.Artist,
                            Album = item.AlbumTitle,
                            Genre = item.Genre,
                            Artwork = item.Artwork,
                            Duration = (ulong)item.PlaybackDuration,
                            Uri = item.AssetURL.AbsoluteString
                        });
                    }
                }

                return songs;
            }));
        }
Esempio n. 4
0
        public async Task AddToPlaylist(Playlist playlist, Song song)
        {
            await Task.Run(() =>
            {
                MPMediaQuery mq = MPMediaQuery.PlaylistsQuery;
                MPMediaItemCollection[] playlistArray = mq.Collections;

                foreach (MPMediaPlaylist pl in playlistArray)
                {
                    if (pl.PersistentID == playlist.Id)
                    {
                        MPMediaQuery m = MPMediaQuery.SongsQuery;
                        var p          = MPMediaPropertyPredicate.PredicateWithValue(NSNumber.FromUInt64(song.Id), MPMediaItem.PersistentIDProperty);
                        m.AddFilterPredicate(p);
                        if (m.Items.Length > 0)
                        {
                            pl.AddMediaItems(m.Items, (err) =>
                            {
                                if (err != null)
                                {
                                    err.ToString();
                                }
                            });
                        }
                    }
                }
            });
        }
        private static List <string> GetMemberIds(ulong playlistId)
        {
            var mediaQuery = MPMediaQuery.SongsQuery;
            var value      = NSNumber.FromUInt64(playlistId);
            var predicate  = MPMediaPropertyPredicate.PredicateWithValue(value, MPMediaPlaylistProperty.PersistentID);

            mediaQuery.AddFilterPredicate(predicate);

            return(mediaQuery.Items.Where(i => i != null && i.AssetURL != null).Select(i => i.PersistentID.ToString()).ToList());
        }
Esempio n. 6
0
        private static MPMediaQuery PrepareMediaQuery()
        {
            var mediaQuery = MPMediaQuery.SongsQuery;

            mediaQuery.GroupingType = MPMediaGrouping.Title;
            var value     = NSNumber.FromInt32((int)MPMediaType.Music);
            var predicate = MPMediaPropertyPredicate.PredicateWithValue(value, MPMediaItem.MediaTypeProperty);

            mediaQuery.AddFilterPredicate(predicate);
            return(mediaQuery);
        }
Esempio n. 7
0
        public static MPMediaItem GetItem(Track track)
        {
            var      query  = MPMediaQuery.SongsQuery;
            NSNumber songId = UInt64.Parse(track.Id);
            MPMediaPropertyPredicate predicate = MPMediaPropertyPredicate.PredicateWithValue(songId, MPMediaItem.PersistentIDProperty);

            query.AddFilterPredicate(predicate);
            var s = query.Items?.FirstOrDefault();

            return(s);
        }
Esempio n. 8
0
 public override Task <Uri> GetPlaybackUri(MusicPlayer.Models.Track track)
 {
     return(Task.Run(() => {
         var query = MPMediaQuery.SongsQuery;
         NSNumber songId = UInt64.Parse(track.Id);
         MPMediaPropertyPredicate predicate = MPMediaPropertyPredicate.PredicateWithValue(songId, MPMediaItem.PersistentIDProperty);
         query.AddFilterPredicate(predicate);
         var s = query.Items.FirstOrDefault();
         var url = s?.AssetURL?.AbsoluteString;
         return url == null ? null : new Uri(url);
     }));
 }
Esempio n. 9
0
        // Get a song with a particular id
        public MPMediaItem queryForSongWithId(ulong songPersistenceId)
        {
            MPMediaPropertyPredicate mediaItemPersistenceIdPredicate = MPMediaPropertyPredicate.PredicateWithValue(new NSNumber(songPersistenceId), MPMediaItem.PersistentIDProperty);

            MPMediaQuery songQuery = new MPMediaQuery();

            songQuery.AddFilterPredicate(mediaItemPersistenceIdPredicate);

            var items = songQuery.Items;

            return(items[items.Length - 1]);
        }
        private async void LoadMediaItemsForMediaTypeAsync(MPMediaType mediaType)
        {
            await Task.Run(() =>
            {
                var query           = new MPMediaQuery();
                var mediaTypeNumber = NSNumber.FromInt32((int)mediaType);
                var predicate       = MPMediaPropertyPredicate.PredicateWithValue(mediaTypeNumber, MPMediaItem.MediaTypeProperty);

                query.AddFilterPredicate(predicate);

                allMediaItems = query.Items.ToList();
            });

            TableView.ReloadData();
        }
Esempio n. 11
0
        public async Task <List <MediaItem> > GetItemsAsync()
        {
            return(await Task.Run(() =>
            {
                var query = new MPMediaQuery();
                var mediaTypeNumber = NSNumber.FromInt32((int)MPMediaType.Music);
                var predicate = MPMediaPropertyPredicate.PredicateWithValue(mediaTypeNumber, MPMediaItem.MediaTypeProperty);

                query.AddFilterPredicate(predicate);

                var unknownArtist = NSBundle.MainBundle.LocalizedString("unknownArtist", "Unknown Artist");

                return query.Items.Select(item => new MediaItem(item.Title, (item.Artist != null) ? item.Artist : unknownArtist, GetDisplayTime((int)item.PlaybackDuration))).ToList();
            }));
        }
Esempio n. 12
0
        public async Task <IEnumerable <Song> > GetSongsFromGenreAsync(string genreId, SongSortOrder sortOrder = SongSortOrder.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.ToSongs(sortOrder);
            }));
        }
Esempio n. 13
0
        public async Task <IEnumerable <Song> > GetSongsByIdAsync(IEnumerable <string> songIds, SongSortOrder sortOrder = SongSortOrder.Default)
        {
            if (!songIds.HasValue())
            {
                throw new ArgumentException(nameof(songIds));
            }

            return(await Task.Run(() =>
            {
                var mediaQuery = PrepareMediaQuery();
                var value = NSArray.FromNSObjects(songIds.Select(s => NSObject.FromObject(s)).ToArray());
                var arrayPredictor = MPMediaPropertyPredicate.PredicateWithValue(value, MPMediaItem.PersistentIDProperty, MPMediaPredicateComparison.Contains);
                mediaQuery.AddFilterPredicate(arrayPredictor);
                return mediaQuery.ToSongs(sortOrder);
            }));
        }
Esempio n. 14
0
        public async Task <IEnumerable <Song> > SearchSongsAsync(string searchTerm, SongSortOrder sortOrder = SongSortOrder.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.ToSongs(sortOrder);
            }));
        }
Esempio n. 15
0
        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
            }));
        }
Esempio n. 16
0
        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;
                }
            }));
        }
Esempio n. 17
0
        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);
             * }*/
        }
Esempio n. 18
0
        // 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);
        }