private void RefreshPlaylists(string revquery)
{
byte[] playlistsData;
try {
playlistsData = client.Fetcher.Fetch(String.Format("/databases/{0}/containers", id), revquery);
} catch (WebException) {
return;
}
ContentNode playlistsNode = ContentParser.Parse(client.Bag, playlistsData);
if (IsUpdateResponse(playlistsNode))
{
return;
}
// handle playlist additions/changes
List <int> plids = new List <int> ();
foreach (ContentNode playlistNode in (ContentNode[])playlistsNode.GetChild("dmap.listing").Value)
{
Playlist pl = Playlist.FromNode(playlistNode);
if (pl != null)
{
plids.Add(pl.Id);
Playlist existing = LookupPlaylistById(pl.Id);
if (existing == null)
{
AddPlaylist(pl);
}
else
{
existing.Update(pl);
}
}
}
// delete playlists that no longer exist
foreach (Playlist pl in new List <Playlist> (playlists))
{
if (!plids.Contains(pl.Id))
{
RemovePlaylist(pl);
}
}
plids = null;
// add/remove tracks in the playlists
foreach (Playlist pl in playlists)
{
byte [] playlistTracksData = client.Fetcher.Fetch(String.Format(
"/databases/{0}/containers/{1}/items", id, pl.Id), String.Format("meta=dmap.itemid,dmap.containeritemid&{0}", revquery)
);
ContentNode playlistTracksNode = ContentParser.Parse(client.Bag, playlistTracksData);
if (IsUpdateResponse(playlistTracksNode))
{
return;
}
if ((byte)playlistTracksNode.GetChild("dmap.updatetype").Value == 1)
{
// handle playlist track deletions
ContentNode deleteList = playlistTracksNode.GetChild("dmap.deletedidlisting");
if (deleteList != null)
{
foreach (ContentNode deleted in (ContentNode[])deleteList.Value)
{
int index = pl.LookupIndexByContainerId((int)deleted.Value);
if (index < 0)
{
continue;
}
pl.RemoveAt(index);
}
}
}
// add new tracks, or reorder existing ones
int plindex = 0;
foreach (ContentNode plTrackNode in (ContentNode[])playlistTracksNode.GetChild("dmap.listing").Value)
{
Track pltrack = null;
int containerId = 0;
Track.FromPlaylistNode(this, plTrackNode, out pltrack, out containerId);
if (pl[plindex] != null && pl.GetContainerId(plindex) != containerId)
{
pl.RemoveAt(plindex);
pl.InsertTrack(plindex, pltrack, containerId);
}
else if (pl[plindex] == null)
{
pl.InsertTrack(plindex, pltrack, containerId);
}
plindex++;
}
}
}