private void HandleSourcePlaylistsTopic(ByteQueue data)
        {
            Dictionary <Guid, ISourcePlaylistBase> addPlaylists = data
                                                                  .DequeueSourcePlaylists(Service.CreateSourcePlaylist)
                                                                  .ToDictionary(p => p.ID);

            Guid[] order = data.DequeueGuids();
            ISourcePlaylistBase[] newPlaylists = new ISourcePlaylistBase[order.Length];

            for (int i = 0; i < order.Length; i++)
            {
                ISourcePlaylistBase playlist;
                Guid id = order[i];
                if (addPlaylists.TryGetValue(id, out playlist))
                {
                    playlists[id] = newPlaylists[i] = playlist;
                }
                else
                {
                    newPlaylists[i] = (ISourcePlaylistBase)playlists[id];
                }
            }

            Service.SourcePlaylists = newPlaylists;
        }
        protected Task PublishMediaSources(ISourcePlaylistBase source)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(source.FileMediaSources);

            return(SendAsync(source, nameof(source.FileMediaSources), data, false));
        }
예제 #3
0
        protected async Task PublishMediaSources(ISourcePlaylistBase source)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(source.FileMediaSources);

            await PublishPlaylistAsync(source, nameof(source.FileMediaSources), data);
        }
예제 #4
0
        public ISourcePlaylistBase DequeueSourcePlaylist(Func <Guid, ISourcePlaylistBase> createFunc)
        {
            ISourcePlaylistBase playlist = createFunc(DequeueGuid());

            DequeuePlaylist(playlist);
            playlist.FileMediaSources = DequeueStrings();

            return(playlist);
        }
        private void Unsubscribe(ISourcePlaylistBase playlist)
        {
            if (playlist == null)
            {
                return;
            }

            Unsubscribe((IPlaylistBase)playlist);
            playlist.FileMediaSourcesChanged -= Save;
        }
예제 #6
0
        private async Task <bool> HandlePlaylistMessage(Guid id, string topic, ByteQueue data, string playlistType)
        {
            IPlaylistBase playlist = await GetPlaylist(id, playlistType);

            ISourcePlaylistBase source = playlist as ISourcePlaylistBase;

            switch (topic)
            {
            case nameof(playlist.CurrentSong):
                playlist.CurrentSong = data.DequeueNullableSong();
                break;

            case nameof(playlist.Duration):
                playlist.Duration = data.DequeueTimeSpan();
                break;

            case nameof(playlist.Shuffle):
                playlist.Shuffle = (OrderType)data.DequeueInt();
                break;

            case nameof(playlist.Loop):
                playlist.Loop = (LoopType)data.DequeueInt();
                break;

            case nameof(playlist.Name):
                playlist.Name = data.DequeueString();
                break;

            case nameof(playlist.Position):
                playlist.Position = data.DequeueTimeSpan();
                break;

            case nameof(playlist.WannaSong):
                playlist.WannaSong = data.DequeueNullableRequestSong();
                return(false);

            case nameof(playlist.Songs):
                playlist.Songs = data.DequeueSongs();
                break;

            case nameof(source.FileMediaSources):
                source.FileMediaSources = data.DequeueStrings();
                break;

            default:
                return(false);
            }

            return(true);
        }
 private static void MergePlaylist(ISourcePlaylistBase playlist, SourcePlaylistData data)
 {
     playlist.FileMediaSources = data.Sources;
     MergePlaylist((IPlaylistBase)playlist, data);
 }
        private void Load()
        {
            AudioServiceData data;

            if (!File.Exists(path))
            {
                return;
            }

            try
            {
                data = StdUtils.XmlDeserializeFile <AudioServiceData>(path);
            }
            catch
            {
                return;
            }

            Service.Volume = data.Volume;

            IDictionary <string, Song> allSongs = new Dictionary <string, Song>();

            Service.SourcePlaylists = data.SourcePlaylists.Select(playlistData =>
            {
                Guid id = Guid.Parse(playlistData.ID);
                ISourcePlaylistBase playlist = Service.SourcePlaylists
                                               .FirstOrDefault(s => s.ID == id) ?? Service.CreateSourcePlaylist(id);

                MergePlaylist(playlist, playlistData);

                foreach (Song song in playlist.Songs)
                {
                    allSongs[song.FullPath] = song;
                }

                return(playlist);
            }).ToArray();

            Service.Playlists = data.Playlists.Select(playlistData =>
            {
                Guid id = Guid.Parse(playlistData.ID);
                IPlaylistBase playlist = Service.Playlists
                                         .FirstOrDefault(s => s.ID == id) ?? Service.CreatePlaylist(id);

                playlistData.Songs = playlistData.Songs.Where(s => allSongs.ContainsKey(s.FullPath)).ToArray();

                MergePlaylist(playlist, playlistData);

                return(playlist);
            }).ToArray();

            if (string.IsNullOrWhiteSpace(data.CurrentPlaylistID))
            {
                Service.CurrentPlaylist = null;
            }
            else
            {
                Guid currentPlaylistID = Guid.Parse(data.CurrentPlaylistID);
                Service.CurrentPlaylist = Service.GetAllPlaylists().FirstOrDefault(p => p.ID == currentPlaylistID);
            }
        }
예제 #9
0
 public void Enqueue(ISourcePlaylistBase playlist)
 {
     Enqueue((IPlaylistBase)playlist);
     Enqueue(playlist.FileMediaSources);
 }
 public SourcePlaylistData(ISourcePlaylistBase playlist) : base(playlist)
 {
     Sources = playlist.FileMediaSources.ToArray();
 }