コード例 #1
0
        public static async Task <HashSet <string> > GetMissingFiles(QuranAudioTrack request)
        {
            HashSet <string> missingFiles = new HashSet <string>();
            var reciter       = request.GetReciter();
            var baseDirectory = await request.GetReciter().GetStorageFolder();

            if (await ShouldDownloadBismillah(baseDirectory, request))
            {
                missingFiles.Add(BismillahFile);
            }

            var fileQuery = baseDirectory.CreateFileQueryWithOptions(new QueryOptions
            {
                UserSearchFilter = string.Format(CultureInfo.InvariantCulture,
                                                 "{0:000}*.mp3", request.Surah),
                FolderDepth = FolderDepth.Shallow
            });

            if ((uint)QuranUtils.GetSurahNumberOfAyah(request.Surah) != await fileQuery.GetItemCountAsync())
            {
                var existingFiles = new HashSet <string>((await fileQuery.GetFilesAsync()).Select(f => f.Name));
                for (int i = 1; i <= QuranUtils.GetSurahNumberOfAyah(request.Surah); i++)
                {
                    var fileName = GetFileName(new QuranAyah(request.Surah, i), reciter);
                    if (!existingFiles.Contains(fileName))
                    {
                        missingFiles.Add(fileName);
                    }
                }
            }

            return(missingFiles);
        }
コード例 #2
0
        /// <summary>
        /// Gets track index from playbackList if found. Otherwise -1.
        /// </summary>
        /// <param name="newTrack"></param>
        /// <returns></returns>
        private int FindTrack(QuranAudioTrack newTrack)
        {
            if (_playbackList != null)
            {
                return(_playbackList.Items.ToList().FindIndex(i =>
                                                              (int)i.Source.CustomProperties[AyahKey] == newTrack.Ayah &&
                                                              (int)i.Source.CustomProperties[SurahKey] == newTrack.Surah &&
                                                              (int)i.Source.CustomProperties[ReciterKey] == newTrack.ReciterId));
            }

            return(-1);
        }
コード例 #3
0
        public void SetTrack(QuranAudioTrack request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (MediaPlayerState.Closed == CurrentPlayer.CurrentState)
            {
                // Start task
                StartBackgroundAudioTask();
            }

            MessageService.SendMessageToBackground(new TrackChangedMessage(request));
        }
コード例 #4
0
        /// <summary>
        /// Raised when playlist changes to a new track
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        void PlaybackListCurrentItemChanged(MediaPlaybackList sender, CurrentMediaPlaybackItemChangedEventArgs args)
        {
            // Get the new item
            var item = args.NewItem;

            // Update the system view
            UpdateUVCOnNewTrack(item);

            // Get the current track
            if (item != null && item.Source.CustomProperties.ContainsKey(QuranTrackKey))
            {
                var json = item.Source.CustomProperties[QuranTrackKey] as string;
                MessageService.SendMessageToForeground(new TrackChangedMessage(QuranAudioTrack.FromString(json)));
            }
        }
コード例 #5
0
        public static async Task <bool> ShouldDownloadGaplessDatabase(QuranAudioTrack request)
        {
            if (!request.GetReciter().IsGapless)
            {
                return(false);
            }
            string dbPath = request.GetReciter().GaplessDatabasePath;

            if (string.IsNullOrEmpty(dbPath))
            {
                return(false);
            }

            return(!await FileUtils.FileExists(dbPath));
        }
コード例 #6
0
        private async Task ChangeTrack(QuranAudioTrack newTrack)
        {
            _originalTrackRequest = newTrack;
            int index = FindTrack(newTrack);

            // If playlist contains track - change track
            if (index >= 0)
            {
                await ChangeTrack((uint)index);
            }
            // Otherwise load new playlist and then change track
            else
            {
                await CreatePlaybackList(newTrack);
                await ChangeTrack(newTrack);
            }
        }
コード例 #7
0
        public async Task PlayFromAyah(QuranAyah ayah)
        {
            int currentQari = AudioUtils.GetReciterIdByName(SettingsUtils.Get <string>(Constants.PREF_ACTIVE_QARI));

            if (currentQari == -1)
            {
                return;
            }

            var request = new QuranAudioTrack(currentQari, ayah,
                                              FileUtils.ScreenInfo);

            // if necessary download aya position file
            await DownloadAyahPositionFile();

            QuranApp.NativeProvider.AudioProvider.SetTrack(request);
        }
コード例 #8
0
        /// <summary>
        /// Create a playback list from the list of songs received from the foreground app.
        /// </summary>
        /// <param name="songs"></param>
        private async Task CreatePlaybackList(QuranAudioTrack newTrack)
        {
            BackgroundMediaPlayer.Current.Pause();

            // Make a new list
            if (_playbackList != null)
            {
                _playbackList.CurrentItemChanged -= PlaybackListCurrentItemChanged;
                _playbackList.Items.Clear();
            }
            else
            {
                _playbackList = new MediaPlaybackList();
            }

            // Initialize FileUtils
            await FileUtils.Initialize(newTrack.ScreenInfo);

            var missingFiles = await AudioUtils.GetMissingFiles(newTrack);

            // Add playback items to the list
            QuranAudioTrack nextTrack = newTrack.GetFirstAyah();
            var             reciter   = nextTrack.GetReciter();

            while (nextTrack != null)
            {
                string      fileName = AudioUtils.GetFileName(nextTrack.GetQuranAyah(), reciter);
                MediaSource source;
                if (missingFiles.Contains(fileName))
                {
                    source = MediaSource.CreateFromUri(new Uri(Path.Combine(reciter.ServerUrl, fileName)));
                }
                else
                {
                    var file = await FileUtils.GetFile(await reciter.GetStorageFolder(), fileName);

                    if (file != null)
                    {
                        source = MediaSource.CreateFromStorageFile(file);
                        //source = MediaSource.CreateFromUri(new Uri(file.Path));
                    }
                    else
                    {
                        source = MediaSource.CreateFromUri(new Uri(Path.Combine(reciter.ServerUrl, fileName)));
                    }
                }
                source.CustomProperties[SurahKey]      = nextTrack.Surah;
                source.CustomProperties[AyahKey]       = nextTrack.Ayah;
                source.CustomProperties[ReciterKey]    = nextTrack.ReciterId;
                source.CustomProperties[QuranTrackKey] = nextTrack.ToString();
                source.CustomProperties[TitleKey]      = QuranUtils.GetSurahAyahString(nextTrack.Surah, nextTrack.Ayah);
                _playbackList.Items.Add(new MediaPlaybackItem(source));
                nextTrack = nextTrack.GetNextInSurah();
            }

            // Don't auto start
            BackgroundMediaPlayer.Current.AutoPlay = false;

            // Assign the list to the player
            BackgroundMediaPlayer.Current.Source = _playbackList;

            // Add handler for future playlist item changes
            _playbackList.CurrentItemChanged += PlaybackListCurrentItemChanged;
        }
コード例 #9
0
 public static bool DoesRequireBismillah(QuranAudioTrack request)
 {
     return(QuranUtils.HasBismillah(request.Surah));
 }
コード例 #10
0
        public static async Task <bool> ShouldDownloadBismillah(StorageFolder baseDirectory, QuranAudioTrack request)
        {
            if (request.GetReciter().IsGapless || !DoesRequireBismillah(request))
            {
                return(false);
            }

            return(await FileUtils.FileExists(baseDirectory, BismillahFile));
        }
コード例 #11
0
 public void SetTrack(QuranAudioTrack request)
 {
     //BackgroundAudioPlayer.Instance.Track = new AudioTrack(source, title, artist, album, albumArt, tag,
     //    EnabledPlayerControls.All);
     throw new NotImplementedException();
 }
コード例 #12
0
 public TrackChangedMessage(QuranAudioTrack audioRequest)
 {
     this.AudioTrack = audioRequest;
 }
コード例 #13
0
 private async void AudioProvider_TrackChanged(IAudioProvider sender, QuranAudioTrack request)
 {
     await UpdateAudioState();
 }
コード例 #14
0
 private void PlayStreaming(QuranAudioTrack request)
 {
     QuranApp.NativeProvider.AudioProvider.SetTrack(request);
 }