Ejemplo n.º 1
0
 public PlaylistWithAudio(AudioPlaylist playlist, IReadOnlyList <Audio> audio)
 {
     Playlist = playlist;
     Audio    = audio
                .OrderBy(a => a.Date)
                .ToList();
 }
Ejemplo n.º 2
0
 public PageGetter <Audio> AudiosInPlaylist(AudioPlaylist playlist) => async(count, offset) => await vkApi.Audio.GetAsync(new AudioGetParams()
 {
     OwnerId = playlist.OwnerId.Value,
     AlbumId = playlist.Id.Value,
     Count   = (long)count,
     Offset  = (long)offset
 });
Ejemplo n.º 3
0
        public async Task <PlaylistWithAudio> ExpandPlaylist(AudioPlaylist playlist, CancellationToken token, ILog log)
        {
            var audios = await GetAllPagesAsync(AudiosInPlaylist(playlist), long.MaxValue, token, log, true);

            log.Debug($"Expanded playlist {playlist.Title}: {audios.Count} audios");
            return(new PlaylistWithAudio(playlist, audios));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Play audio with playlist
        /// </summary>
        public void PlayAudio(IAudio audio, IList <IAudio> sourcePlaylist)
        {
            //check if it's a new playlist
            if (!_currentPlaylist.Items.AreSame(sourcePlaylist))
            {
                _currentPlaylist.OnCurrentItemChanged -= CurrentPlaylistOnCurrentItemChanged;

                var shuffle = Shuffle;
                var repeat  = Repeat;

                _currentPlaylist         = new AudioPlaylist(sourcePlaylist);
                _currentPlaylist.Repeat  = repeat;
                _currentPlaylist.Shuffle = shuffle;

                _currentPlaylist.CurrentItem = audio;

                _currentPlaylist.OnCurrentItemChanged += CurrentPlaylistOnCurrentItemChanged;
                CurrentPlaylistOnCurrentItemChanged(this, audio);
            }
            else
            {
                if (_currentPlaylist.CurrentItem == audio)
                {
                    PlayFrom(_currentPlaylist.CurrentItem.Source);
                }
                else
                {
                    _currentPlaylist.CurrentItem = audio;
                }
            }
        }
Ejemplo n.º 5
0
        private void CreateAndAddAudio(PlayCatDbContext context, Guid playlistId, int count)
        {
            if (count < -0)
            {
                return;
            }

            for (int i = 0; i < count; i++)
            {
                DataModels.Audio audio = context.CreateAudio(DateTime.Now.AddMinutes(i), "access" + i, "artist" + i, "song" + i, BaseAudioExtension, i.ToString(), i.ToString(), null);

                AudioPlaylist audioPlaylist = context.CreateAudioPlaylist(DateTime.Now.AddMinutes(i), audio.Id, playlistId, i);
            }
        }
Ejemplo n.º 6
0
        public AudioPlaylistTests()
        {
            _musicLibrary = A.Fake <IMusicLibrary>();
            _mediaPlayer  = A.Fake <IMediaPlayer>();

            A.CallTo(() => _mediaPlayer.LoadFile(A <string> .Ignored, A <MediaPlayerMetadata> .Ignored)).Invokes((o) => _mediaPlayer.Playing = true);

            _audioPlaylist = new AudioPlaylist(_musicLibrary, _mediaPlayer);
            _track         = A.Fake <ITrack>();

            A.CallTo(() => _track.Song).Returns(new Song {
                FileName = TrackFileName
            });

            _audioPlaylist.Tracks.Add(_track);
        }
Ejemplo n.º 7
0
        public static AudioPlaylist ToAudioPlaylist(this PlaylistFile source, AudioFile fileNow)
        {
            var audioPlaylist = new AudioPlaylist()
            {
                Shuffle     = false,
                Cover       = source.Cover,
                CurrentItem = fileNow,
                Id          = source.Id,
                Items       = source.TracksFiles.Count != 0 ? source.TracksFiles : new List <AudioFile>(),
                Repeat      = Enums.RepeatMode.None,
                Artist      = source.Artist,
                Name        = source.Name
            };

            return(audioPlaylist);
        }
Ejemplo n.º 8
0
        public static AudioPlaylist ToAudioPlaylist(this PlaylistFile source)
        {
            var audioPlaylist = new AudioPlaylist()
            {
                Shuffle     = StaticContent.Shuffle,
                Cover       = source.Cover,
                CurrentItem = source.TracksFiles.Count != 0? source.TracksFiles[0]: null,
                Id          = source.Id,
                Items       = source.TracksFiles.Count != 0 ? source.TracksFiles: new List <AudioFile>(),
                Repeat      = StaticContent.Repeat,
                Artist      = source.Artist,
                Name        = source.Name
            };

            return(audioPlaylist);
        }
Ejemplo n.º 9
0
 // Constructor
 public NAudioComponent()
 {
     CurrentVolume = 0.5f;
     Playlist      = new AudioPlaylist();
     Playlist.InitPlaylist(_filePath);
     if (AudioFile == null)
     {
         AudioFile = new AudioFileReader(Playlist.Songs[Playlist.Index])
         {
             Volume = CurrentVolume
         };
     }
     if (OutputDevice == null)
     {
         OutputDevice = new WaveOutEvent();
         OutputDevice.PlaybackStopped += OnPlaybackStopped;
         OutputDevice.Init(AudioFile);
     }
 }
Ejemplo n.º 10
0
        /// <summary>
        /// Sets current playlist. Used to update UI on the first data load.
        /// </summary>
        public void SetCurrentPlaylist(AudioPlaylist playlist)
        {
            if (_currentPlaylist != null)
            {
                _currentPlaylist.OnCurrentItemChanged -= CurrentPlaylistOnCurrentItemChanged;
            }

            _currentPlaylist = playlist;

            if (_currentPlaylist != null)
            {
                _currentPlaylist.Repeat  = Repeat;
                _currentPlaylist.Shuffle = Shuffle;

                _currentPlaylist.OnCurrentItemChanged += CurrentPlaylistOnCurrentItemChanged;

                CurrentAudioChanged?.Invoke(this, EventArgs.Empty);
            }
        }
Ejemplo n.º 11
0
        public BaseResult AddToPlaylist(Guid userId, AddRemovePlaylistRequest request)
        {
            return(BaseInvokeWithTransaction(() =>
            {
                //Is need check audioId??? - perfomance issue
                var playlistInfo =
                    (from p in _dbContext.Playlists.Include(x => x.AudioPlaylists)
                     where p.Id == request.PlaylistId && p.OwnerId == userId
                     select new
                {
                    Playlist = p,
                    IsAlreadyAdded = p.AudioPlaylists.Any(x => x.AudioId == request.AudioId)
                })
                    .FirstOrDefault();

                if (playlistInfo == null)
                {
                    return ResponseBuilder <BaseResult> .Fail().SetInfoAndBuild("Playlist not found");
                }

                if (playlistInfo.IsAlreadyAdded)
                {
                    return ResponseBuilder <BaseResult> .Fail().SetInfoAndBuild("Audio is already added");
                }

                var audioPlaylist = new AudioPlaylist
                {
                    AudioId = request.AudioId,
                    DateCreated = DateTime.Now,
                    Order = playlistInfo.Playlist.OrderValue,
                    PlaylistId = request.PlaylistId
                };

                playlistInfo.Playlist.OrderValue++;
                _dbContext.Entry(playlistInfo.Playlist).State = EntityState.Modified;

                _dbContext.AudioPlaylists.Add(audioPlaylist);
                _dbContext.SaveChanges();

                return ResponseBuilder <BaseResult> .SuccessBuild();
            }));
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Поулчить треки из плейлиста
        /// </summary>
        /// <param name="pl"></param>
        /// <param name="api"></param>
        /// <returns></returns>
        public static Track[] GetPlaylist(AudioPlaylist pl, VkApi api)
        {
            TextConsole.PrintConsole.Header($"Получение треков из плейлиста: {pl.Title}");
            try
            {
                var audios = api.Audio.Get(new AudioGetParams()
                {
                    OwnerId    = pl.Original.OwnerId,
                    PlaylistId = pl.Original.PlaylistId,
                    AccessKey  = pl.AccessKey
                });

                return(ToList(audios));
            }
            catch (Exception ex)
            {
                if (ex.GetType() == typeof(VkNet.Exception.CannotBlacklistYourselfException))
                {
                    TextConsole.PrintConsole.Print($"Не удаётся получить доступ к плейлисту: [{pl.Title}]", TextConsole.MenuType.Warning);
                }

                return(null);
            }
        }
Ejemplo n.º 13
0
        public void Play(PlaylistFile playlist = null, AudioFile audio = null)
        {
            //EndsWith(".mp3")
            if (audio.SourceString.Split("//")[1].Split("/")[0].EndsWith(".mp3"))
            {
                Toast.MakeText(Application.Context, "URI трека пришел с ошибкой. Невозможно воспроизвести.", ToastLength.Long).Show();
                return;
            }

            if (playlist == null)
            {
                if (currentPlaylist == null && currentTrack == null)
                {
                    return;
                }
                player.Play();
            }
            else
            {
                if (playlist.Id != currentPlaylistId)
                {
                    var audioPlaylist = new AudioPlaylist(playlist, audio, StaticContentService.RepeatPlaylist, StaticContentService.RepeatTrack);
                    currentPlaylist = audioPlaylist;
                    currentTrack    = audio;
                    currentPlaylist.OnCurrentItemChanged += CurrentPlaylistOnOnCurrentItemChanged;
                    CurrentAudioChanged?.Invoke(this, audio);
                }
                else
                {
                    currentPlaylist.SetCurrentTrack(audio);
                    currentTrack = audio;
                    CurrentAudioChanged?.Invoke(this, audio);
                }
                //var playerNotificationManager = (CrossMediaManager.Android.NotificationManager as MediaManager.Platforms.Android.Notifications.NotificationManager).PlayerNotificationManager;


                TaskService.RunOnUI(async() =>
                {
                    Toast.MakeText(Application.Context, "[Отладка] Начинаем воспроизводить...", ToastLength.Long).Show();
                    Toast.MakeText(Application.Context, $"[Отладка] URI: {currentTrack.SourceString}", ToastLength.Long).Show();
                    var media         = await player.Play(currentTrack.SourceString);
                    media.Title       = currentTrack.Title;
                    media.AlbumArtUri = ""; //Без этого треки с битыми ссылками будут выкидывать плеер в фатал
                    media.Artist      = currentTrack.Artist;
                    media.AlbumArtist = currentTrack.Artist;
                    media.ArtUri      = null;
                    if (currentTrack.Cover != "placeholder")
                    {
                        media.ArtUri = currentTrack.Cover;
                    }
                    CrossMediaManager.Android.NotificationManager.UpdateNotification();
                });


                //player.MediaQueue.Current.Title = audio.Title;
                //player.MediaQueue.Current.Artist = audio.Title;
                //player.MediaQueue.Current.AlbumArtUri = audio.Cover;
                //CrossMediaManager.Android.
                //player.NotificationManager = null;
            }
        }
Ejemplo n.º 14
0
        public async Task <UploadResult> UploadAudioAsync(Guid userId, UploadAudioRequest request)
        {
            return(await BaseInvokeCheckModelAsync(request, async() =>
            {
                User user = _dbContext.Users.FirstOrDefault(x => x.Id == userId);
                if (user == null)
                {
                    throw new Exception("User not found, but token does");
                }

                var responseBuilder =
                    ResponseBuilder <UploadResult>
                    .Fail();

                if (user.IsUploadingAudio)
                {
                    return responseBuilder.SetInfoAndBuild("User already uploading audio");
                }

                user.IsUploadingAudio = true;
                _dbContext.SaveChanges();

                using (var transaction = _dbContext.Database.BeginTransaction())
                {
                    try
                    {
                        GetInfoResult result = await GetInfoAsync(new UrlRequest {
                            Url = request.Url
                        });

                        if (!result.Ok)
                        {
                            return responseBuilder
                            .SetErrors(result.Errors)
                            .SetInfoAndBuild(result.Info);
                        }

                        string videoId = UrlFormatter.GetYoutubeVideoIdentifier(request.Url);

                        IFile videoFile = await _saveVideo.SaveAsync(request.Url);
                        IFile audioFile = await _extractAudio.ExtractAsync(videoFile);

                        //TODO: create upload for FileSystem, Blob, etc...
                        string accessUrl = _uploadAudio.Upload(audioFile, StorageType.FileSystem);

                        var generalPlayList = _dbContext.Playlists.FirstOrDefault(x => x.OwnerId == userId && x.IsGeneral);

                        if (generalPlayList == null)
                        {
                            throw new Exception("Playlist not found");
                        }

                        var audio = new Audio
                        {
                            Id = Guid.NewGuid(),
                            AccessUrl = accessUrl,
                            DateCreated = DateTime.Now,
                            Artist = request.Artist,
                            Song = request.Song,
                            Duration = audioFile.Duration,
                            Extension = audioFile.Extension,
                            FileName = audioFile.Filename,
                            UniqueIdentifier = videoId,
                            UploaderId = userId
                        };

                        var audioPlaylist = new AudioPlaylist
                        {
                            AudioId = audio.Id,
                            DateCreated = DateTime.Now,
                            PlaylistId = generalPlayList.Id,
                            Order = generalPlayList.OrderValue
                        };


                        //update max index in playlist
                        generalPlayList.OrderValue++;

                        //add entities
                        _dbContext.AudioPlaylists.Add(audioPlaylist);
                        Audio audioEntity = _dbContext.Audios.Add(audio).Entity;

                        _dbContext.SaveChanges();

                        transaction.Commit();
                        return ResponseBuilder <UploadResult> .SuccessBuild(new UploadResult
                        {
                            Audio = AudioMapper.ToApi.FromData(audioEntity)
                        });
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw ex;
                    }
                    finally
                    {
                        //skip upload process
                        user.IsUploadingAudio = false;

                        _dbContext.SaveChanges();
                    }
                }
            }));
        }
Ejemplo n.º 15
0
        public static IPlaylistFile ToIPlaylistFile(this AudioPlaylist playlist, IList <IAudioFile> tracks)
        {
            bool   isAlbum = playlist.Type == 1;
            string cover;
            string artist      = "";
            string genre       = "";
            string year        = "";
            string description = "";

            try
            {
                artist = playlist.MainArtists.First().Name;
            }
            catch
            {
                artist = "Неизвестный исполнитель";
            }
            try
            {
                cover = playlist.Cover.Photo300;
            }
            catch
            {
                cover = "no";
            }

            if (isAlbum)
            {
                try
                {
                    genre = playlist.Genres.First().Name;
                }
                catch
                {
                    genre = "no";
                }

                try
                {
                    year = playlist.Year.Value.ToString();
                }
                catch
                {
                    year = "no";
                }
            }
            else
            {
                if (playlist.Description != null)
                {
                    description = playlist.Description;
                }
                genre = "no";
                year  = "no";
            }


            IPlaylistFile playlistFile = new PlaylistFileAnyPlatform()
            {
                Artist      = artist,
                Cover       = cover,
                Id          = playlist.Id.Value,
                IsLocal     = false,
                Tracks      = tracks,
                Name        = playlist.Title,
                AccessKey   = playlist.AccessKey,
                IsAlbum     = isAlbum,
                OnRequest   = tracks.Count == 0,
                Plays       = playlist.Plays,
                OwnerId     = playlist.OwnerId.Value,
                Genre       = genre,
                Year        = year,
                Description = description
            };

            return(playlistFile);
        }