public Task <IDacpList> GetGenreSongsAsync(string genreName)
        {
            var         query   = DacpQueryCollection.And(DacpQueryPredicate.Is("daap.songgenre", genreName), MediaKindQuery);
            DacpRequest request = GetItemsRequest(query, "name", true);

            return(Client.GetAlphaGroupedListAsync(request, n => new Song(this, n)));
        }
        public async Task <List <Artist> > GetArtistsAsync()
        {
            if (_artists != null && _artistCacheRevision == Client.CurrentLibraryUpdateNumber)
            {
                return(_artists);
            }

            var         query   = DacpQueryCollection.And(DacpQueryPredicate.IsNotEmpty("daap.songartist"), MediaKindQuery);
            DacpRequest request = GetGroupsRequest(query, true, "artists");

            try
            {
                var response = await Client.SendRequestAsync(request).ConfigureAwait(false);

                _groupedArtists = DacpUtility.GetAlphaGroupedDacpList(response.Nodes, n => new Artist(this, n), out _artists);
                _artistsByID    = _artists.ToDictionary(a => a.ID);
            }
            catch
            {
                _artists        = new List <Artist>();
                _artistsByID    = new Dictionary <int, Artist>();
                _groupedArtists = new DacpList <Artist>(false);
            }

            _artistCacheRevision = Client.CurrentLibraryUpdateNumber;

            return(_artists);
        }
Exemple #3
0
        public Task <List <Album> > GetAlbumsAsync()
        {
            var         query   = DacpQueryCollection.And(GroupQuery, Container.GroupsQuery);
            DacpRequest request = Container.GetGroupsRequest(query);

            return(Client.GetListAsync(request, n => new Album(Container, n)));
        }
        public Task <IDacpList> GetGenreArtistsAsync(string genreName)
        {
            var         query   = DacpQueryCollection.And(DacpQueryPredicate.Is("daap.songgenre", genreName), DacpQueryPredicate.IsNotEmpty("daap.songartist"), MediaKindQuery);
            DacpRequest request = GetGroupsRequest(query, true, "artists");

            return(Client.GetAlphaGroupedListAsync(request, n => new Artist(this, n)));
        }
Exemple #5
0
        public Task <IDacpList> GetUnwatchedMoviesAsync()
        {
            var         query   = DacpQueryCollection.And(DacpQueryPredicate.Is("daap.songuserplaycount", 0), MediaKindQuery);
            DacpRequest request = GetItemsRequest(query, "name", true);

            return(Client.GetAlphaGroupedListAsync(request, n => new Movie(this, n)));
        }
Exemple #6
0
        internal DacpRequest GetCueSongRequest(DacpQueryElement query, string sort, int index)
        {
            DacpRequest request = GetCueRequest(query, sort);

            request.QueryParameters["index"] = index.ToString();
            return(request);
        }
Exemple #7
0
        public Task <List <AudiobookEpisode> > GetEpisodesAsync()
        {
            DacpRequest request = Container.GetItemsRequest(ItemQuery);

            request.QueryParameters.Remove("sort");
            return(Client.GetListAsync(request, n => new AudiobookEpisode(Container, n)));
        }
Exemple #8
0
        internal DacpRequest GetCueShuffleRequest(DacpQueryElement query, string sort)
        {
            DacpRequest request = GetCueRequest(query, sort);

            request.QueryParameters["dacp.shufflestate"] = "1";
            return(request);
        }
        public async Task <List <Album> > GetAlbumsAsync()
        {
            if (_albums != null && _albumCacheRevision == Client.CurrentLibraryUpdateNumber)
            {
                return(_albums);
            }

            DacpRequest request = GetGroupsRequest(GroupsQuery, true);

            try
            {
                var response = await Client.SendRequestAsync(request).ConfigureAwait(false);

                _groupedAlbums        = DacpUtility.GetAlphaGroupedDacpList(response.Nodes, n => new Album(this, n), out _albums);
                _albumsByID           = _albums.ToDictionary(a => a.ID);
                _albumsByPersistentID = _albums.ToDictionary(a => a.PersistentID);
            }
            catch
            {
                _albums               = new List <Album>();
                _albumsByID           = new Dictionary <int, Album>();
                _albumsByPersistentID = new Dictionary <ulong, Album>();
                _groupedAlbums        = new DacpList <Album>(false);
            }

            _albumCacheRevision = Client.CurrentLibraryUpdateNumber;

            return(_albums);
        }
Exemple #10
0
        internal DacpRequest GetPlayQueueEditRequest(string command, DacpQueryElement query, PlayQueueMode mode, string sort = null)
        {
            DacpRequest request = new DacpRequest("/ctrl-int/1/playqueue-edit");

            request.QueryParameters["command"] = command;
            if (query != null)
            {
                request.QueryParameters["query"] = query.ToString();
            }
            request.QueryParameters["mode"] = ((int)mode).ToString();
            if (sort != null)
            {
                request.QueryParameters["sort"] = sort;
            }

            if (this != Client.MainDatabase)
            {
                request.QueryParameters["srcdatabase"] = "0x" + PersistentID.ToString("x16");
            }

            // TODO: Handle this separately
            if (mode == PlayQueueMode.Replace)
            {
                request.QueryParameters["clear-previous"] = "1";
            }

            return(request);
        }
Exemple #11
0
        public Task <List <PodcastEpisode> > GetUnplayedEpisodesAsync()
        {
            DacpRequest request = Container.GetItemsRequest(UnplayedItemQuery);

            request.QueryParameters["sort"] = "releasedate";
            request.QueryParameters["invert-sort-order"] = "1";
            return(Client.GetListAsync(request, n => new PodcastEpisode(Container, n)));
        }
Exemple #12
0
        public async Task <bool> SendPlayQueueCommandAsync(PlayQueueMode mode = PlayQueueMode.Replace)
        {
            var         query   = DacpQueryPredicate.Is("dmap.itemid", ID);
            DacpRequest request = Database.GetPlayQueueEditRequest("add", query, mode);

            try { await Client.SendRequestAsync(request).ConfigureAwait(false); }
            catch { return(false); }
            return(true);
        }
Exemple #13
0
        internal DacpRequest GetContainerItemsRequest()
        {
            DacpRequest request = new DacpRequest("/databases/{0}/containers/{1}/items", Database.ID, ID);

            request.QueryParameters["meta"] = ItemsMeta;
            request.QueryParameters["type"] = "music";

            return(request);
        }
Exemple #14
0
        private DacpRequest GetPlaySpecRequest()
        {
            DacpRequest request = new DacpRequest("/ctrl-int/1/playspec");

            request.QueryParameters["database-spec"]  = DacpQueryPredicate.Is("dmap.persistentid", "0x" + Database.PersistentID.ToString("x16")).ToString();
            request.QueryParameters["container-spec"] = DacpQueryPredicate.Is("dmap.persistentid", "0x" + PersistentID.ToString("x16")).ToString();

            return(request);
        }
Exemple #15
0
        public async Task <bool> RequestStationsAsync()
        {
            DacpRequest request = new DacpRequest("/databases/{0}/containers", ID);

            request.QueryParameters["meta"] = "dmap.itemname,dmap.itemid,com.apple.itunes.cloud-id,dmap.downloadstatus,dmap.persistentid,daap.baseplaylist,com.apple.itunes.special-playlist,com.apple.itunes.smart-playlist,com.apple.itunes.saved-genius,dmap.parentcontainerid,dmap.editcommandssupported,com.apple.itunes.jukebox-current,daap.songcontentdescription,dmap.haschildcontainers";

            try
            {
                var response = await Client.SendRequestAsync(request).ConfigureAwait(false);

                var containers = DacpUtility.GetItemsFromNodes(response.Nodes, n => DacpContainer.GetContainer(this, n));

                List <iTunesRadioStation> newStations         = new List <iTunesRadioStation>();
                List <iTunesRadioStation> newFeaturedStations = new List <iTunesRadioStation>();

                // There is a property (aeRf) that indicates whether a station is a "featured" station, but in some cases
                // featured stations may not have this property set to "true".
                // For now, checking the index of the last "featured" station as a workaround.

                int lastFeaturedStationIndex = 0;
                var stations = containers.Where(c => c.Type == ContainerType.iTunesRadio).Select(c => (iTunesRadioStation)c).ToArray();

                for (int i = 0; i < stations.Length; i++)
                {
                    if (stations[i].IsFeaturedStation)
                    {
                        lastFeaturedStationIndex = i;
                    }
                }

                for (int i = 0; i < stations.Length; i++)
                {
                    if (i <= lastFeaturedStationIndex)
                    {
                        newFeaturedStations.Add(stations[i]);
                    }
                    else
                    {
                        newStations.Add(stations[i]);
                    }
                }

                Stations         = newStations;
                FeaturedStations = newFeaturedStations;
            }
            catch// (Exception e)
            {
                Stations         = new List <iTunesRadioStation>();
                FeaturedStations = new List <iTunesRadioStation>();

                //Client.HandleHTTPException(request, e);
                return(false);
            }

            return(true);
        }
        public async Task <bool> SendPlayCommandAsync()
        {
            DacpRequest request = new DacpRequest("/ctrl-int/1/playspec");

            request.QueryParameters["database-spec"]  = DacpQueryPredicate.Is("dmap.itemid", "0x" + Database.ID.ToString("x")).ToString();
            request.QueryParameters["container-spec"] = DacpQueryPredicate.Is("dmap.itemid", "0x" + ID.ToString("x")).ToString();

            try { await Client.SendRequestAsync(request).ConfigureAwait(false); }
            catch { return(false); }
            return(true);
        }
Exemple #17
0
        internal DacpRequest GetGenresRequest(bool requestSortHeaders = false)
        {
            DacpRequest      request = new DacpRequest("/databases/{0}/browse/genres", Database.ID);
            DacpQueryElement query   = DacpQueryCollection.And(DacpQueryPredicate.IsNotEmpty("daap.songgenre"), MediaKindQuery);

            request.QueryParameters["filter"] = query.ToString();
            if (requestSortHeaders)
            {
                request.QueryParameters["include-sort-headers"] = "1";
            }
            return(request);
        }
Exemple #18
0
        public async Task <IDacpList> GetGroupedGenresAsync()
        {
            if (_groupedGenres != null)
            {
                return(_groupedGenres);
            }

            DacpRequest request = GetGenresRequest(true);

            _groupedGenres = await Client.GetAlphaGroupedListAsync(request, d => new DacpGenre(this, d), "abgn").ConfigureAwait(false);

            return(_groupedGenres);
        }
Exemple #19
0
        public async Task <List <Song> > GetSongsAsync()
        {
            if (_songs != null)
            {
                return(_songs);
            }

            DacpRequest request = Container.GetItemsRequest(ItemQuery);

            _songs = await Client.GetListAsync(request, n => new Song(Container, n)).ConfigureAwait(false);

            return(_songs);
        }
Exemple #20
0
        public async Task <List <Audiobook> > SearchAudiobooksAsync(string searchString, CancellationToken cancellationToken)
        {
            DacpQueryElement query   = DacpQueryCollection.And(DacpQueryPredicate.Is("daap.songalbum", searchString), MediaKindQuery);
            DacpRequest      request = GetGroupsRequest(query, false, "albums");

            request.CancellationToken = cancellationToken;
            try
            {
                var response = await Client.SendRequestAsync(request).ConfigureAwait(false);

                return(DacpUtility.GetItemsFromNodes(response.Nodes, n => new Audiobook(this, n)).ToList());
            }
            catch { return(null); }
        }
Exemple #21
0
        public async Task <List <Song> > SearchSongsAsync(string searchString, CancellationToken cancellationToken)
        {
            DacpQueryElement query   = DacpQueryCollection.And(DacpQueryPredicate.Is("dmap.itemname", searchString), MediaKindQuery);
            DacpRequest      request = GetItemsRequest(query, "name", false);

            request.CancellationToken = cancellationToken;
            try
            {
                var response = await Client.SendRequestAsync(request).ConfigureAwait(false);

                return(DacpUtility.GetItemsFromNodes(response.Nodes, n => new Song(this, n)).ToList());
            }
            catch { return(null); }
        }
        public async Task <bool> SendPlaySongCommandAsync(Song song)
        {
            try
            {
                int index = IndexOf(song);

                DacpQueryElement query   = DacpQueryCollection.And(DacpQueryPredicate.Is("dmap.itemname", _searchString), Database.MusicContainer.MediaKindQuery);
                DacpRequest      request = Database.GetCueSongRequest(query, "name", index);

                await Database.Client.SendRequestAsync(request).ConfigureAwait(false);
            }
            catch { return(false); }
            return(true);
        }
Exemple #23
0
        public async Task <bool> SendShuffleCommandAsync()
        {
            if (Client.ServerSupportsPlayQueue)
            {
                return(await SendPlayCommandAsync(PlayQueueMode.Shuffle).ConfigureAwait(false));
            }

            DacpRequest request = GetPlaySpecRequest();

            request.QueryParameters["dacp.shufflestate"] = "1";

            try { await Client.SendRequestAsync(request).ConfigureAwait(false); }
            catch { return(false); }
            return(true);
        }
Exemple #24
0
        private DacpRequest GetCueRequest(DacpQueryElement query, string sort)
        {
            DacpRequest request = new DacpRequest("/ctrl-int/1/cue");

            request.QueryParameters["command"] = "play";
            if (query != null)
            {
                request.QueryParameters["query"] = query.ToString();
            }
            request.QueryParameters["sort"]        = sort;
            request.QueryParameters["srcdatabase"] = "0x" + PersistentID.ToString("x16");
            request.QueryParameters["clear-first"] = "1";

            return(request);
        }
Exemple #25
0
        public async Task <List <DacpItem> > GetItemsAsync()
        {
            if (_items != null && _itemCacheRevision == Client.CurrentLibraryUpdateNumber)
            {
                return(_items);
            }

            DacpRequest request = GetContainerItemsRequest();

            _items = await Client.GetListAsync(request, n => (DacpItem) new Song(this, n)).ConfigureAwait(false);

            _itemCacheRevision = Client.CurrentLibraryUpdateNumber;

            return(_items);
        }
Exemple #26
0
        public async Task <IDacpList> GetMoviesAsync()
        {
            if (_movies != null && _movieCacheRevision == Client.CurrentLibraryUpdateNumber)
            {
                return(_movies);
            }

            DacpRequest request = GetItemsRequest(MediaKindQuery, "name", true);

            _movies = await Client.GetAlphaGroupedListAsync(request, n => new Movie(this, n));

            _movieCacheRevision = Client.CurrentLibraryUpdateNumber;

            return(_movies);
        }
Exemple #27
0
        internal DacpRequest GetItemsRequest(DacpQueryElement query, string sort = "album", bool requestSortHeaders = false)
        {
            // Apple's Remote uses the Base Playlist ID here rather than the actual container ID.
            DacpRequest request = new DacpRequest("/databases/{0}/containers/{1}/items", Database.ID, Database.BasePlaylist.ID);

            request.QueryParameters["meta"] = ItemsMeta;
            request.QueryParameters["type"] = "music";
            request.QueryParameters["sort"] = sort;
            if (requestSortHeaders)
            {
                request.QueryParameters["include-sort-headers"] = "1";
            }
            if (query != null)
            {
                request.QueryParameters["query"] = query.ToString();
            }

            return(request);
        }
Exemple #28
0
        internal DacpRequest GetGroupsRequest(DacpQueryElement query, bool includeSortHeaders = false, string groupType = "albums")
        {
            DacpRequest request = new DacpRequest("/databases/{0}/groups", Database.ID);

            request.QueryParameters["meta"]       = GroupsMeta;
            request.QueryParameters["type"]       = "music";
            request.QueryParameters["group-type"] = groupType;
            if (includeSortHeaders)
            {
                request.QueryParameters["include-sort-headers"] = "1";
            }
            request.QueryParameters["sort"] = "album";
            if (query != null)
            {
                request.QueryParameters["query"] = query.ToString();
            }

            return(request);
        }
Exemple #29
0
        public async Task <bool> SendPlayCommandAsync(PlayQueueMode mode = PlayQueueMode.Replace)
        {
            if (!Client.ServerSupportsPlayQueue)
            {
                // Send a play request for the first item in this playlist
                var items = await GetItemsAsync();

                if (items == null || items.Count == 0)
                {
                    return(false);
                }
                return(await SendPlayItemCommandAsync(items[0], mode).ConfigureAwait(false));
            }

            var         query   = DacpQueryPredicate.Is("dmap.itemid", ID);
            DacpRequest request = Database.GetPlayQueueEditRequest("add", query, mode);

            request.QueryParameters["query-modifier"] = "containers";

            try { await Client.SendRequestAsync(request).ConfigureAwait(false); }
            catch { return(false); }
            return(true);
        }
Exemple #30
0
        public async Task <IDacpList> GetGroupedItemsAsync()
        {
            if (_groupedItems != null)
            {
                return(_groupedItems);
            }

            var         query   = DacpQueryCollection.And(DacpQueryPredicate.Is("daap.songgenre", Name), Container.MediaKindQuery);
            DacpRequest request = Container.GetItemsRequest(query, "name", true);

            try
            {
                var response = await Client.SendRequestAsync(request).ConfigureAwait(false);

                _groupedItems = DacpUtility.GetAlphaGroupedDacpList(response.Nodes, n => new DacpItem(Container, n), out _items);
            }
            catch
            {
                _items        = new List <DacpItem>();
                _groupedItems = new DacpList <DacpItem>(false);
            }

            return(_groupedItems);
        }