コード例 #1
0
ファイル: TrackViewer.xaml.cs プロジェクト: quynb90/Audiotica
        private void TrackChanged()
        {
            var player = App.Current.Kernel.Resolve <IPlayerService>();

            if (Track == null)
            {
                IsPlaying = false;
            }
            else
            {
                if (IsQueue && QueueId != null)
                {
                    IsPlaying = player.CurrentQueueId == QueueId;
                }
                else if (!IsQueue && player.CurrentQueueTrack?.Track != null)
                {
                    IsPlaying = (Track.Id > 0 && player.CurrentQueueTrack.Track.Id == Track.Id) ||
                                TrackComparer.AreEqual(player.CurrentQueueTrack.Track, Track);
                }
                else
                {
                    IsPlaying = false;
                }
            }

            player.TrackChanged -= PlayerOnTrackChanged;
            player.TrackChanged += PlayerOnTrackChanged;
        }
コード例 #2
0
        public PlaylistViewModel(Playlist playlistItem)
        {
            Instance  = this;
            _comparer = new TrackComparer();
            _playlist = playlistItem;
            Id        = (ulong)_playlist?.Id;
            Title     = playlistItem.Title;
            if (_playlist.Tracks == null || _playlist.Tracks.Count == 0)
            {
                Task.Run(async() =>
                {
                    TracksLoading = true;
                    OnPropertyChanged(nameof(TracksLoading));
                    Tracks        = await DependencyService.Get <IPlaylistManager>().GetPlaylistTracks(playlistItem.Id);
                    TracksLoading = false;
                    OnPropertyChanged(nameof(TracksLoading));
                });
            }
            else
            {
                Tracks = _playlist.Tracks;
            }

            PlayCommand = new Command((item) =>
            {
                DependencyService.Get <IMusicManager>().StartQueue(new ObservableCollection <Track>(Tracks), Tracks.IndexOf(item as Track));
            });
        }
コード例 #3
0
 public Track Find(Track track)
 {
     if (!IsLoaded)
     {
         throw new NotLoadedException();
     }
     return(Tracks.FirstOrDefault(p => TrackComparer.AreEqual(p, track)));
 }
コード例 #4
0
 public override void OnCreate()
 {
     base.OnCreate();
     _queue        = new ObservableCollection <Track>();
     _pos          = 0;
     _audioManager = (AudioManager)GetSystemService(AudioService);
     _random       = new Random();
     _comparer     = new TrackComparer();
     InitializePlayer();
 }
コード例 #5
0
ファイル: Shell.xaml.cs プロジェクト: quynb90/Audiotica
        private async void LyricsFlyout_OnOpened(object sender, object e)
        {
            _flyoutOpened = true;
            var track   = ViewModel.CurrentQueueTrack.Track;
            var newSlug = TrackComparer.GetSlug(track);

            if (_currentSongSlug == newSlug)
            {
                return;
            }
            _currentSongSlug = newSlug;

            _cancellationTokenSource?.Cancel();
            _cancellationTokenSource = new CancellationTokenSource();
            IsLyricsLoading          = true;
            LyricsText = "Loading lyrics...";

            if (!string.IsNullOrEmpty(track.Lyrics))
            {
                LyricsText      = track.Lyrics;
                IsLyricsLoading = false;
                return;
            }

            var providers = App.Current.Kernel.Resolve <IMetadataProvider[]>().FilterAndSort <ILyricsMetadataProvider>();

            try
            {
                foreach (var lyricsMetadataProvider in providers)
                {
                    var lyrics = await lyricsMetadataProvider.GetLyricAsync(track.Title, track.AlbumArtist);

                    _cancellationTokenSource.Token.ThrowIfCancellationRequested();
                    if (string.IsNullOrEmpty(lyrics))
                    {
                        lyrics = await lyricsMetadataProvider.GetLyricAsync(track.Title, track.DisplayArtist);
                    }
                    _cancellationTokenSource.Token.ThrowIfCancellationRequested();

                    if (string.IsNullOrEmpty(lyrics))
                    {
                        continue;
                    }

                    LyricsText = lyrics;
                    break;
                }

                if (LyricsText == "Loading lyrics...")
                {
                    LyricsText = "No lyrics found.";
                }
            }
            catch (OperationCanceledException)
            {
            }
            catch
            {
                LyricsText = "Something happened :/";
            }
            finally
            {
                IsLyricsLoading = false;
            }
        }
コード例 #6
0
        private void AddTextColumn(StringPropertySelector selector, string columnName, TrackComparer comparer,
                                   TrackProperty property, TrackProperty? priorColumnProperty)
        {
            if (comparer == null)
            {
                comparer = (track1, track2) => string.Compare(selector(track1), selector(track2),
                                                              StringComparison.CurrentCulture);
            }
            int fixedWidth;
            if (!_settings.ColumnWidths.TryGetValue(property, out fixedWidth))
                fixedWidth = 200;
            TrackListViewColumn genericColumn = new TrackListViewColumn(columnName) {FixedWidth = fixedWidth};
            PropertiesToColumns.Add(property, genericColumn);
            ColumnsToProperties.Add(genericColumn, property);

            TrackCellRenderer pathCellTextRenderer = new TrackCellRenderer();
            genericColumn.PackStart(pathCellTextRenderer, true);
            genericColumn.SetCellDataFunc(pathCellTextRenderer,
                                          (TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter) =>
                                              {
                                                  Track track = (Track) model.GetValue(iter, 0);
                                                  Track playingTrack = ((ITrackListModel) model).CurrentTrack;
                                                  bool playing = playingTrack != null && track.Equals(playingTrack);
                                                  ((CellRendererText) cell).Text = selector(track);
                                                  ((CellRendererText) cell).Weight = playing ? 800 : 400;
                                              });

            genericColumn.SortColumnId = (int) property;
            ((ITrackListModel) TrackListView.Model).SetSortFunc((int) property, (model, iter1, iter2) =>
                {
                    Track track1 = (Track) model.GetValue(iter1, 0);
                    Track track2 = (Track) model.GetValue(iter2, 0);
                    int result = comparer(track1, track2);
                    if (result == 0)
                        result = DefaultSortFunc(model, iter1, iter2);
                    return result;
                });

            int position = 0;
            foreach (var column in TrackListView.Columns)
            {
                position++;
                TrackProperty columnProperty;
                if (ColumnsToProperties.TryGetValue((TrackListViewColumn) column, out columnProperty))
                {
                    if (columnProperty == priorColumnProperty)
                        break;
                }
            }

            TrackListView.InsertColumn(genericColumn, position);
            genericColumn.AddNotification("width", TrackListViewColumnNotifyHandler);
            var label = new Label(columnName);
            genericColumn.Widget = label;
            var widget = genericColumn.Widget;
            widget.GetAncestor(Button.GType);

            var columnHeader = widget.GetAncestor(Button.GType);
            columnHeader.ButtonPressEvent += ColumnHeaderOnButtonPressEvent;
            label.Show();
        }