public async Task <Playlist> FetchProviderPlaylistAsync(PlaylistProvider provider)
        {
            Playlist playlist = null;

            for (int i = 0; i < applicationSettings.DaysToCheck; i++)
            {
                DateTime date = DateTime.Now.AddDays(-i);

                playlist = LoadPlaylistFromCache(provider, date);

                if (playlist is null)
                {
                    string playlistFile = await DownloadPlaylistFileAsync(provider, date);

                    playlist = playlistFileBuilder.TryParseFile(playlistFile);

                    if (!Playlist.IsNullOrEmpty(playlist) && !provider.DontCache)
                    {
                        cache.StorePlaylistFile(provider.Id, date, playlistFile);
                    }
                }

                if (!(playlist is null))
                {
                    break;
                }
            }

            if (Playlist.IsNullOrEmpty(playlist))
            {
                logger.Debug(
                    MyOperation.PlaylistFetching,
                    OperationStatus.Failure,
                    new LogInfo(MyLogInfoKey.Provider, provider.Name));

                return(null);
            }

            if (!string.IsNullOrWhiteSpace(provider.ChannelNameOverride))
            {
                foreach (Channel channel in playlist.Channels)
                {
                    channel.Name = provider.ChannelNameOverride;
                }
            }

            logger.Debug(
                MyOperation.PlaylistFetching,
                OperationStatus.Success,
                new LogInfo(MyLogInfoKey.Provider, provider.Name));

            return(playlist);
        }
        async Task <bool> IsPlaylistPlayableAsync(string url)
        {
            string fileContent = await fileDownloader.TryDownloadStringAsync(url);

            Playlist playlist = playlistFileBuilder.TryParseFile(fileContent);

            return(!Playlist.IsNullOrEmpty(playlist));
        }
Beispiel #3
0
        async Task <Playlist> GetPlaylistForTodayAsync(PlaylistProvider provider)
        {
            string playlistFile = await DownloadPlaylistFileAsync(provider, DateTime.UtcNow);

            Playlist playlist = LoadPlaylistFromCache(provider, DateTime.UtcNow);

            if (playlist is null)
            {
                playlist = playlistFileBuilder.TryParseFile(playlistFile);
            }

            if (!Playlist.IsNullOrEmpty(playlist) && !provider.DontCache)
            {
                cache.StorePlaylistFile(provider.Id, DateTime.UtcNow, playlistFile);
            }

            return(playlist);
        }
Beispiel #4
0
        async Task <StreamState> GetPlaylistStateAsync(string url)
        {
            StreamState streamState = await GetStreamStateAsync(url);

            if (streamState != StreamState.Alive)
            {
                return(streamState);
            }

            string fileContent = await fileDownloader.TryDownloadStringAsync(url);

            Playlist playlist = playlistFileBuilder.TryParseFile(fileContent);

            if (Playlist.IsNullOrEmpty(playlist))
            {
                return(StreamState.Dead);
            }
            else
            {
                return(StreamState.Alive);
            }
        }
Beispiel #5
0
        async Task <StreamState> GetPlaylistStateAsync(string url)
        {
            StreamState streamState = await GetStreamStateAsync(url);

            if (streamState != StreamState.Alive)
            {
                return(streamState);
            }

            string fileContent = await fileDownloader.TryDownloadStringAsync(url);

            Playlist playlist = playlistFileBuilder.TryParseFile(fileContent);

            if (Playlist.IsNullOrEmpty(playlist))
            {
                return(StreamState.Dead);
            }

            foreach (Channel channel in playlist.Channels)
            {
                string channelUrl = channel.Url;

                if (!channelUrl.StartsWith("http"))
                {
                    // TODO: Replace this with something proper
                    channelUrl = Path.GetDirectoryName(url).Replace(":/", "://") + "/" + channelUrl;
                }

                bool isPlayable = await IsSourcePlayableAsync(channelUrl);

                if (isPlayable)
                {
                    return(StreamState.Alive);
                }
            }

            return(StreamState.Dead);
        }