Beispiel #1
0
        private async Task ProcessFilesInternal(IEnumerable <IStorageItem> filesToOpen)
        {
            StorageApplicationPermissions.FutureAccessList.Clear();

            var tracks = new List <PlayerTrack>(filesToOpen.Count());

            foreach (StorageFile item in filesToOpen)
            {
                var cachedData = new VKSaverAudioFile(item);
                var info       = await cachedData.GetMetadataAsync();

                var track = new PlayerTrack
                {
                    Title  = info.Track.Title,
                    Artist = info.Track.Artist,
                    VKInfo = info.VK
                };

                string token = StorageApplicationPermissions.FutureAccessList.Add(item);
                track.Source = $"vks-token:{token}";

                tracks.Add(track);
            }

            await _playerService.PlayNewTracks(tracks, 0);
        }
Beispiel #2
0
        /// <summary>
        /// Получить медиа источник.
        /// </summary>
        public async Task <MediaStreamSource> GetSource()
        {
            if (_mediaSource != null)
            {
                return(_mediaSource);
            }

            try
            {
                if (_file == null)
                {
                    string cacheFileName = $"{Track.VKInfo.OwnerID} {Track.VKInfo.ID}.vksm";
                    _fileData = await _musicCacheService.GetVKSaverFile(cacheFileName);

                    if (_fileData == null)
                    {
                        return(null);
                    }
                }
                else
                {
                    _fileData = new VKSaverAudioFile(_file);
                }

                _fileStream = await _fileData.GetContentStreamAsync();

                var metadata = await _fileData.GetMetadataAsync();

                _currentBitrate  = metadata.Track.EncodingBitrate;
                _currentChannels = metadata.Track.ChannelCount;

                _bufferSize = (int)(_currentBitrate / 8) * (BUFFERED_TIME_SECONDS + 3);
                _buffer     = new byte[_bufferSize];

                _sampleDuration = TimeSpan.FromMilliseconds(SAMPLE_SIZE / (_currentBitrate / 1000 / 8));

                var audioProperties = AudioEncodingProperties.CreateMp3(
                    metadata.Track.SampleRate, _currentChannels, _currentBitrate);

                var audioDescriptor = new AudioStreamDescriptor(audioProperties);
                _mediaSource = new MediaStreamSource(audioDescriptor);

                _mediaSource.CanSeek = true;
                _mediaSource.MusicProperties.Title  = Track.Title;
                _mediaSource.MusicProperties.Artist = Track.Artist;
                _mediaSource.MusicProperties.Album  = "ВКачай";
                _mediaSource.Duration   = TimeSpan.FromTicks(metadata.Track.Duration);
                _mediaSource.BufferTime = TimeSpan.FromSeconds(BUFFERED_TIME_SECONDS);

                _mediaSource.Starting        += MediaSource_Starting;
                _mediaSource.SampleRequested += MediaSource_SampleRequested;
                _mediaSource.Closed          += MediaSource_Closed;

                return(_mediaSource);
            }
            catch (Exception) { return(null); }
        }
        private async Task ProcessFileAsync(StorageFile file, StorageFolder folder)
        {
            if (file.FileType == TEMP_FILES_EXTENSION)
            {
                try
                {
                    await file.DeleteAsync(StorageDeleteOption.PermanentDelete);
                }
                catch (Exception ex)
                {
                    _logService.LogException(ex);
                }

                return;
            }
            else if (file.FileType != MusicCacheService.FILES_EXTENSION)
            {
                return;
            }

            StorageFile newFile = null;

            try
            {
                VKSaverAudio metadata = null;
                using (var audioFile = new VKSaverAudioFile(file))
                {
                    metadata = await audioFile.GetMetadataAsync();

                    using (var sourceStream = await audioFile.GetContentStreamAsync())
                    {
                        newFile = await folder.CreateFileAsync(
                            Path.GetFileNameWithoutExtension(file.Name) + TEMP_FILES_EXTENSION,
                            CreationCollisionOption.ReplaceExisting);

                        using (var fileStream = await newFile.OpenStreamForWriteAsync())
                        {
                            await CopyStreamAsync(sourceStream, fileStream);
                        }
                    }
                }

                await newFile.RenameAsync(GetSafeFileName(metadata.Track.Title) + MP3_FILES_EXTENSION,
                                          NameCollisionOption.GenerateUniqueName);

                await file.DeleteAsync(StorageDeleteOption.PermanentDelete);
            }
            catch (Exception ex)
            {
                _logService.LogException(ex);
                await newFile?.DeleteAsync(StorageDeleteOption.PermanentDelete);
            }
        }
        private async Task <VKSaverTrack> ProcessVKSaverAudioFile(StorageFile file)
        {
            using (var audioFile = new VKSaverAudioFile(file))
            {
                var metadata = await audioFile.GetMetadataAsync();

                var track = new VKSaverTrack
                {
                    Title = metadata.Track.Title.Trim()
                };

                ProcessArtist(track, metadata.Track.Artist.Trim());
                ProcessAlbum(track, UNKNOWN_ALBUM_NAME);
                ProcessGenre(track, metadata.VK.Genre == (AudioGenres)0 ? UNKNOWN_GENRE_NAME : metadata.VK.Genre.ToString());
                ProcessVKInfo(track, metadata.VK);

                track.Duration = TimeSpan.FromTicks(metadata.Track.Duration);
                return(track);
            }
        }