public async Task <Playlist> CrawlAsync(PlaylistRequest request)
        {
            var playlistBuilder = new PlaylistBuilder()
                                  .SetStart(request.Start)
                                  .SetEnd(request.End);

            PlaylistItem lastItem = null;
            DateTime     end      = request.End;

            do
            {
                System.Diagnostics.Debug.WriteLine($"Start request for time: {end.ToString()}");
                var html = await httpCrawler.GetHtmlAsync(end);

                var items = parser.ParseHtmlPlaylist(html);

                foreach (var item in items)
                {
                    System.Diagnostics.Debug.WriteLine($"Handle item at ${item.Time.ToString()}");
                    if (item.Time >= request.Start &&
                        item.Time < request.End &&
                        !playlistBuilder.HasItem(item.Time, item.Title, item.Artist))
                    {
                        playlistBuilder.AddItem(item);
                        lastItem = item;
                    }

                    end = item.Time;
                }
            } while (lastItem != null && end >= request.Start);

            return(playlistBuilder.GetPlaylist());
        }
예제 #2
0
        private void AddPlayItem(MediaItem mediaItem, PlayScheduleMode scheduleMode, DateTime?startTime)
        {
            PlaylistBuilder builder  = CreateBuilder();
            PlaybillItem    billItem = null;


            try
            {
                switch (scheduleMode)
                {
                case PlayScheduleMode.Timing:
                    billItem = PlaybillItem.Timing(mediaItem, startTime.Value);
                    builder.AddTimingItem((TimingPlaybillItem)billItem);
                    break;

                case PlayScheduleMode.Auto:
                    billItem = PlaybillItem.Auto(mediaItem);
                    builder.AddAutoItem(new AutoPlayItem(billItem),
                                        this.SelectedPlayItem != null ? this.SelectedPlayItem.PlayItem : null);
                    break;

                case PlayScheduleMode.TimingBreak:
                    billItem = PlaybillItem.TimingBreak(mediaItem, startTime.Value);
                    builder.AddTimingBreakItem((TimingPlaybillItem)billItem);
                    break;
                }

                Rebuild(builder);
            }
            catch (Exception ex)
            {
                //editor.Rollback();
                OnError(ex);
            }
        }
예제 #3
0
        public async Task GetPlaylistDetails_ForPlaylistContainingAnAudio_DetailsContainsASingleAudio()
        {
            var playlist = new PlaylistBuilder()
                           .WithId(GuidFactory.MakeFromInt(42))
                           .Build();

            var playlistRepo = Substitute.For <IPlaylistEntriesRepository>();

            playlistRepo
            .GetByIdAsync(Arg.Any <Guid>(), CancellationToken.None)
            .Returns(x => playlist);

            var audioRepo = Substitute.For <IAudioEntriesRepository>();

            audioRepo
            .GetAudioEntriesByPlaylistAsync(playlist.PlaylistId, CancellationToken.None)
            .Returns(x => new[] { new AudioBuilder().Build() });

            var sut = new PlaylistServiceBuilder()
                      .WithPlaylistRepository(playlistRepo)
                      .WithAudioRepository(audioRepo)
                      .WithMapper(new MapperBuilder().WithDefaultProfile().Build())
                      .Build();

            var playlistDetails = await sut.GetPlaylistDetails(playlist.PlaylistId, CancellationToken.None);

            var actual = playlistDetails.AudioEntries;

            actual.Should().ContainSingle();
        }
        public void GetPlaylist_SongAddedDuringFirstPeriod_NotAddedDuringSecondPeriod()
        {
            var requests = new List <SongRequest>();

            requests.Add(new SongRequest()
            {
                Band      = "Nirvana",
                SongTitle = "Come as you are",
                Length    = new TimeSpan(0, 29, 3),
                Requester = "Lisa"
            });
            requests.Add(new SongRequest()
            {
                Band      = "Nirvana",
                SongTitle = "The man who sold the world",
                Length    = new TimeSpan(0, 29, 3),
                Requester = "Lisa"
            });
            var availability = new List <PersonAvailability>();

            availability.Add(new PersonAvailability()
            {
                Name      = "Lisa",
                Available = new bool[2] {
                    true, true
                }
            });
            var sut = new PlaylistBuilder(requests, availability);

            var playlistOne = sut.GetPlaylist(1);
            var playlistTwo = sut.GetPlaylist(2);

            Assert.AreEqual("Come as you are - Nirvana", playlistOne.First().TrackTitle);
            Assert.AreEqual("The man who sold the world - Nirvana", playlistTwo.First().TrackTitle);
        }
예제 #5
0
파일: Program.cs 프로젝트: radtek/QuickCopy
        private void Process()
        {
            using (new ProgramProcessExecutionTimer(this.logger))
            {
                try
                {
                    Int32             cores = Environment.ProcessorCount;
                    CancellationToken token = this.cancellation.Token;

                    PlaylistBuilder builder = new PlaylistBuilder(this.logger, token);

                    ParallelOptions options = new ParallelOptions
                    {
                        CancellationToken      = token,
                        MaxDegreeOfParallelism = cores
                    };

                    List <PlaylistEntryHandler> playlist = builder.Build(this.arguments);

                    this.logger.Verbose(
                        MethodBase.GetCurrentMethod(),
                        $"Playlist contains {playlist.Count} entries to process.");

                    List <PlaylistEntryHandler> handlers = new List <PlaylistEntryHandler>();

                    while (playlist.Count > 0)
                    {
                        handlers.Clear();

                        while (handlers.Count < cores && playlist.Count > 0)
                        {
                            handlers.Add(playlist[0]);
                            playlist.RemoveAt(0);
                        }

                        Parallel.ForEach(handlers, options, (handler) =>
                        {
                            handler.Execute();
                        });
                    }
                }
                catch (OperationCanceledException)
                {
                    this.logger.Warning(
                        MethodBase.GetCurrentMethod(),
                        "Operation of file processing canceled.");
                }
                catch (Exception exception)
                {
                    this.logger.Critical(
                        MethodBase.GetCurrentMethod(),
                        exception);
                }
            }
        }
예제 #6
0
        private void Rebuild(PlaylistBuilder builder)
        {
            var items = builder.Build(maxStopTime);

            _listAdapter.Clear();
            foreach (var item in items)
            {
                _listAdapter.Add(item);
            }

            OnCommitted();
        }
예제 #7
0
        public void Delete(IPlayItem playItem)
        {
            BeforeDelete(playItem);

            var builder = new PlaylistBuilder(_playItems);

            builder.RemoveItem(playItem);
            var items = builder.Build(maxStopTime);

            _playItems.Clear();
            foreach (var item in items)
            {
                _playItems.Add(item);
            }

            //OnCommitted();
        }
        public void GetPlaylist_RoomAtEndOfPlaylistToPlayRepeatSong_AddRepeatSong()
        {
            var requests = new List <SongRequest>();

            requests.Add(new SongRequest()
            {
                Band      = "Nirvana",
                SongTitle = "Come as you are",
                Length    = new TimeSpan(0, 28, 3),
                Requester = "Lisa"
            });
            requests.Add(new SongRequest()
            {
                Band      = "Nirvana",
                SongTitle = "The man who sold the world",
                Length    = new TimeSpan(0, 28, 3),
                Requester = "Lisa"
            });
            requests.Add(new SongRequest()
            {
                Band      = "Deftones",
                SongTitle = "Change",
                Length    = new TimeSpan(0, 1, 3),
                Requester = "Lisa"
            });
            var availability = new List <PersonAvailability>();

            availability.Add(new PersonAvailability()
            {
                Name      = "Lisa",
                Available = new bool[2] {
                    true, true
                }
            });
            var sut = new PlaylistBuilder(requests, availability);

            var playlistOne = sut.GetPlaylist(1);
            var playlistTwo = sut.GetPlaylist(2);

            Assert.AreEqual("Change - Deftones", playlistOne[1].TrackTitle);
            Assert.AreEqual("Change - Deftones", playlistTwo[1].TrackTitle);
        }
예제 #9
0
        private void ChangeStartTime(IPlayItem playItem, DateTime time)
        {
            var builder = new PlaylistBuilder(_listAdapter);

            try
            {
                builder.ChangeStartTime(playItem, time);

                var items = builder.Build(maxStopTime);
                _listAdapter.Clear();
                foreach (var item in items)
                {
                    _listAdapter.Add(item);
                }

                OnCommitted();
            }
            catch (Exception ex)
            {
                //editor.Rollback();
                OnError(ex);
            }
        }
예제 #10
0
        private void DeletePlayItem(IPlayItem playItem)
        {
            var builder = new PlaylistBuilder(_listAdapter);

            try
            {
                builder.RemoveItem(playItem);

                var items = builder.Build(maxStopTime);
                _listAdapter.Clear();
                foreach (var item in items)
                {
                    _listAdapter.Add(item);
                }

                OnCommitted();
            }
            catch (Exception ex)
            {
                //editor.Rollback();
                OnError(ex);
            }
        }
        private static List <SongRequest> GetReturnPlaylise(List <SongRequest> requests, List <PersonAvailability> availability)
        {
            var sut = new PlaylistBuilder(requests, availability);

            return(sut.GetPlaylist(1));
        }