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); }
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))); }
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))); }
internal DacpRequest GetCueSongRequest(DacpQueryElement query, string sort, int index) { DacpRequest request = GetCueRequest(query, sort); request.QueryParameters["index"] = index.ToString(); return(request); }
public Task <List <AudiobookEpisode> > GetEpisodesAsync() { DacpRequest request = Container.GetItemsRequest(ItemQuery); request.QueryParameters.Remove("sort"); return(Client.GetListAsync(request, n => new AudiobookEpisode(Container, n))); }
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); }
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); }
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))); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); } }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }