Exemplo n.º 1
0
        private async Task <ChannelItemResult> GetPlayListTracks(int PlayListID, InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var offset = query.StartIndex.GetValueOrDefault();

            var play = Playlist.GetPlaylist(PlayListID);

            var tracks = play.Tracks.Select(i => new ChannelItemInfo
            {
                ContentType      = ChannelMediaContentType.Song,
                ImageUrl         = i.Artwork,
                IsInfiniteStream = false,
                MediaType        = ChannelMediaType.Audio,
                Name             = i.Title,
                Type             = ChannelItemType.Media,
                Id           = i.Id.ToString(),
                RunTimeTicks = TimeSpan.FromMilliseconds(i.Duration).Ticks,
                DateCreated  = i.CreationDate,

                MediaSources = new List <ChannelMediaInfo>
                {
                    new ChannelMediaInfo
                    {
                        Path = i.StreamUrl + "?client_id=78fd88dde7ebf8fdcad08106f6d56ab6"
                    }
                }
            });

            var channelItemInfos = tracks as IList <ChannelItemInfo> ?? tracks.ToList();

            return(new ChannelItemResult
            {
                Items = channelItemInfos.ToList(),
                TotalRecordCount = channelItemInfos.Count() + offset + 1
            });
        }
Exemplo n.º 2
0
        public async Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            if (query.FolderId == null)
            {
                return(await GetChannels(cancellationToken).ConfigureAwait(false));
            }

            var catSplit = query.FolderId.Split('_');


            if (catSplit[0] == "cat")
            {
                query.FolderId = catSplit[1];
                return(await GetTracks(query, cancellationToken).ConfigureAwait(false));
            }
            if (catSplit[0] == "myPlaylists")
            {
                return(await GetPlayLists(query, cancellationToken).ConfigureAwait(false));
            }
            if (catSplit[0] == "playlist")
            {
                query.FolderId = catSplit[1];
                return(await GetPlayListTracks(Convert.ToInt32(query.FolderId), query, cancellationToken).ConfigureAwait(false));
            }

            return(null);
        }
        public Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var folderId = FolderId.ParseFolderId(query.FolderId);

            switch (folderId.FolderIdType)
            {
            case FolderIdType.None:
                var limit  = query.Limit.GetValueOrDefault(MaxPageSize);
                var offset = query.StartIndex.GetValueOrDefault(0);
                return(_lolVideoProvider.FindEvents(limit, offset, cancellationToken));

            case FolderIdType.Event:
                return(_lolVideoProvider.FindDays(folderId.EventId, cancellationToken));

            case FolderIdType.Day:
                return(_lolVideoProvider.FindMatches(folderId.EventId, folderId.DayId, cancellationToken));

            case FolderIdType.Game:
                return(_lolVideoProvider.FindGames(folderId.EventId, folderId.DayId, folderId.GameId, cancellationToken));

            default:
                _logger.Error("Unknown FolderIdType" + folderId.FolderIdType);
                return(Task.FromResult(new ChannelItemResult()));
            }
        }
Exemplo n.º 4
0
        private async Task <ChannelItemResult> GetPlayLists(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var offset = query.StartIndex.GetValueOrDefault();

            var limit = query.Limit.HasValue ? query.Limit.Value : 50;

            var u         = global::SoundCloud.NET.User.Me();
            var playlists = u.GetPlaylists(u.Id);

            var tracks = playlists.Select(i => new ChannelItemInfo
            {
                ImageUrl    = i.ArtworkUrl,
                MediaType   = ChannelMediaType.Audio,
                Name        = i.Title,
                Type        = ChannelItemType.Folder,
                Id          = "playlist_" + i.Id.ToString(),
                DateCreated = i.CreationDate
            });

            var channelItemInfos = tracks as IList <ChannelItemInfo> ?? tracks.ToList();

            return(new ChannelItemResult
            {
                Items = channelItemInfos.ToList(),
                TotalRecordCount = channelItemInfos.Count() + offset + 1
            });
        }
Exemplo n.º 5
0
        public static async Task <ChannelItemResult> GetSeasonInfoAsync(InternalChannelItemQuery query, ILogger logger, IMemoryCache memoryCache)
        {
            if (memoryCache.TryGetValue("nrk-categories-seasoninfo-" + query.FolderId, out ChannelItemResult cachedValue))
            {
                logger.LogInformation("Function={function} FolderId={folderId} Cache Hit", nameof(GetSeasonInfoAsync), "nrk-categories-seasoninfo-" + query.FolderId);
                return(cachedValue);
            }
            else
            {
                logger.LogInformation("Function={function} FolderId={folderId} web download", nameof(GetSeasonInfoAsync), "nrk-categories-seasoninfo-" + query.FolderId);
                HttpClient        httpClient = new HttpClient();
                string            json       = new StreamReader(await httpClient.GetStreamAsync(query.FolderId)).ReadToEnd();
                var               root       = Newtonsoft.Json.JsonConvert.DeserializeObject <SeasonInfo.root>(json);
                ChannelItemResult result     = new ChannelItemResult();

                foreach (var emb in root.Embedded.Seasons)
                {
                    ChannelItemInfo info = new ChannelItemInfo()
                    {
                        FolderType  = ChannelFolderType.Container,
                        SeriesName  = root.Sequential.Titles.Title,
                        Name        = emb.Titles.Title,
                        Overview    = root.Sequential.Titles.Subtitle,
                        HomePageUrl = "https://tv.nrk.no" + emb.Links.Series.Href,
                        Id          = "https://psapi.nrk.no" + emb.Links.Self.Href,
                        MediaType   = ChannelMediaType.Video,
                        Type        = ChannelItemType.Folder
                    };
                    result.Items.Add(info);
                    result.TotalRecordCount++;
                }
                memoryCache.Set("nrk-categories-seasoninfo-" + query.FolderId, result, DateTimeOffset.Now.AddDays(7));
                return(result);
            }
        }
Exemplo n.º 6
0
        public async Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            _logger.Debug("cat ID : " + query.FolderId);

            if (query.FolderId == null)
            {
                return(await GetMainMenu(cancellationToken).ConfigureAwait(false));
            }

            var folderID = query.FolderId.Split(new[] { "!_" }, StringSplitOptions.None);

            query.FolderId = folderID[1];

            if (folderID[0] == "shows")
            {
                return(await GetShowList(query, cancellationToken).ConfigureAwait(false));
            }
            if (folderID[0] == "category")
            {
                return(await GetCategoryList(query, cancellationToken).ConfigureAwait(false));
            }
            if (folderID[0] == "video")
            {
                return(await GetVideoList(query, cancellationToken).ConfigureAwait(false));
            }
            return(null);
        }
Exemplo n.º 7
0
        private async Task <ChannelItemResult> GetChannelItemsInternal(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var offset     = query.StartIndex.GetValueOrDefault();
            var downloader = new TwitchListingDownloader(_logger, _jsonSerializer, _httpClient);
            var videos     = await downloader.GetStreamList(query.FolderId, offset, cancellationToken)
                             .ConfigureAwait(false);

            var items = videos.streams.OrderByDescending(x => x.viewers)
                        .Select(i => new ChannelItemInfo
            {
                ContentType      = ChannelMediaContentType.Clip,
                ImageUrl         = i.preview.large,
                IsInfiniteStream = true,
                MediaType        = ChannelMediaType.Video,
                Name             = i.channel.name,
                Id              = i.channel.name,
                Type            = ChannelItemType.Media,
                CommunityRating = Convert.ToSingle(i.viewers),
                DateCreated     = !String.IsNullOrEmpty(i.channel.created_at) ?
                                  Convert.ToDateTime(i.channel.created_at) : (DateTime?)null,
                Overview = i.channel.status,
            });

            return(new ChannelItemResult
            {
                Items = items.ToList(),
                TotalRecordCount = videos._total
            });
        }
Exemplo n.º 8
0
        private async Task <ChannelItemResult> GetSubMenu(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var page  = new HtmlDocument();
            var items = new List <ChannelItemInfo>();

            using (
                var site = await _httpClient.Get(new HttpRequestOptions()
            {
                Url = "http://www.cnet.com/videos/",
                CancellationToken = CancellationToken.None
            }).ConfigureAwait(false))
            {
                page.Load(site, Encoding.UTF8);
                if (page.DocumentNode != null)
                {
                    foreach (var node in page.DocumentNode.SelectNodes(String.Format("//ul[@id=\"{0}\"]/li/a", query.FolderId)))
                    {
                        items.Add(new ChannelItemInfo
                        {
                            Name = node.InnerText,
                            Id   = "subvideo_" + node.Attributes["href"].Value,
                            Type = ChannelItemType.Folder,
                        });
                    }
                }
            }

            return(new ChannelItemResult
            {
                Items = items.ToList(),
                //TotalRecordCount = channels.total
            });
        }
        private async Task <ChannelItemResult> GetSubCategories(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var page  = new HtmlDocument();
            var items = new List <ChannelItemInfo>();

            using (var site = await _httpClient.Get(String.Format("http://www.ustream.tv/new/explore/{0}/all", query.FolderId), CancellationToken.None).ConfigureAwait(false))
            {
                page.Load(site, Encoding.UTF8);
                foreach (var node in page.DocumentNode.SelectNodes("//select[@id=\"FilterSubCategory\"]/option"))
                {
                    HtmlAttribute link = node.Attributes["value"];

                    if (link.Value == "")
                    {
                        continue;
                    }

                    _logger.Debug("PASSED");
                    items.Add(new ChannelItemInfo
                    {
                        Name = node.InnerText,
                        Id   = "streams_" + query.FolderId + "_" + link.Value,
                        Type = ChannelItemType.Folder,
                    });
                }
            }

            return(new ChannelItemResult
            {
                Items = items.ToList()
            });
        }
        private async Task <ChannelItemResult> GetStreams(string mainCategory, InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var page  = new HtmlDocument();
            var items = new List <ChannelItemInfo>();

            using (var json = await _httpClient.Get(String.Format("http://www.ustream.tv/ajax-alwayscache/new/explore/{0}/all.json?subCategory={1}&type=live&location=anywhere&page={2}", mainCategory, query.FolderId, 1), CancellationToken.None).ConfigureAwait(false))
            {
                var reg = _jsonSerializer.DeserializeFromStream <RootObject>(json);

                page.LoadHtml(reg.pageContent);

                foreach (var node in page.DocumentNode.SelectNodes("//div[contains(@class, \"media-item\")]"))
                {
                    var url   = node.SelectSingleNode(".//img/parent::a").Attributes["href"].Value;
                    var title = node.SelectSingleNode(".//h4/a/text()").InnerText;
                    var thumb = node.SelectSingleNode(".//img").Attributes["src"].Value;

                    items.Add(new ChannelItemInfo
                    {
                        Name             = title,
                        ImageUrl         = thumb,
                        Id               = "stream_" + url,
                        Type             = ChannelItemType.Media,
                        ContentType      = ChannelMediaContentType.Clip,
                        IsInfiniteStream = true,
                        MediaType        = ChannelMediaType.Video,
                    });
                }
            }

            return(new ChannelItemResult
            {
                Items = items.ToList()
            });
        }
Exemplo n.º 11
0
        private ChannelItemResult ParseChannelItemsInternal(InternalChannelItemQuery query)
        {
            _logger.Debug("In ParseChannelItemsInternal");
            var episodeItems = new List <ChannelItemInfo>();
            var folderId     = 0;

            if (!string.IsNullOrEmpty(query.FolderId))
            {
                var cacheFolderId = query.FolderId.Split('-');
                folderId = int.Parse(cacheFolderId[2]);
            }

            _logger.Debug("Looking for folder {0}", folderId);
            var showItem = _twitNetworkCache.GetCacheEntry(folderId);

            _logger.Debug("Building {0} items for {1} ", showItem.Episodes.Count, showItem.Show.shortCode);
            foreach (var episode in showItem.Episodes)
            {
                _logger.Debug("\t{0} episode {1} [{2}]", showItem.Show.shortCode, episode.episodeNumber, episode.label.Trim());
                episodeItems.Add(BuildChannelMediaInfo(episode));
            }

            return(new ChannelItemResult
            {
                Items = episodeItems,
                TotalRecordCount = episodeItems.Count
            });
        }
        private async Task <ChannelItemResult> GetChannelItemsInternal(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var offset     = query.StartIndex.GetValueOrDefault();
            var downloader = new HitboxUserDownloader(_logger, _jsonSerializer, _httpClient);

            _logger.Info("Folder ID: " + query.FolderId);
            var streams = await downloader.GetHitboxUserData(query.FolderId, offset, cancellationToken)
                          .ConfigureAwait(false);

            var livestream = streams.livestream[0];

            var items = new List <ChannelItemInfo>();

            items.Add(new ChannelItemInfo {
                ImageUrl         = String.Format(staticURL, livestream.media_thumbnail),
                IsInfiniteStream = true,
                MediaType        = ChannelMediaType.Video,
                Name             = livestream.media_user_name,
                Id              = livestream.media_user_name,
                Type            = ChannelItemType.Media,
                CommunityRating = Convert.ToSingle(livestream.channel.followers),
                DateCreated     = !String.IsNullOrEmpty(livestream.channel.media_live_since) ?
                                  Convert.ToDateTime(livestream.media_live_since) : (DateTime?)null,
            });
            _logger.Debug("GetInternalChannelItems items: " + items.OrderByDescending(x => x.Name));

            return(new ChannelItemResult
            {
                Items = items,
                TotalRecordCount = items.Count,
            });
        }
Exemplo n.º 13
0
        private async Task <ChannelItemResult> GetChannelItemsInternal(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var offset     = query.StartIndex.GetValueOrDefault();
            var downloader = new TwitChannelItemsDownloader(_logger, _xmlSerializer, _httpClient);

            var baseurl = "http://feeds.twit.tv/" + query.FolderId + "_video_hd.xml";

            var videos = await downloader.GetStreamList(baseurl, offset, cancellationToken)
                         .ConfigureAwait(false);

            var itemslist = videos.channel.item;

            var items = new List <ChannelItemInfo>();

            foreach (var i in itemslist)
            {
                var mediaInfo = new List <ChannelMediaInfo>
                {
                    new ChannelMediaInfo
                    {
                        Protocol = MediaProtocol.Http,
                        Path     = i.link,
                        Width    = 1280,
                        Height   = 720,
                    }
                };

                var runtimeArray = i.duration.Split(':');
                int hours;
                int minutes;
                int.TryParse(runtimeArray[0], out hours);
                int.TryParse(runtimeArray[1], out minutes);
                long runtime = (hours * 60) + minutes;
                runtime = TimeSpan.FromMinutes(runtime).Ticks;

                items.Add(new ChannelItemInfo
                {
                    ContentType      = ChannelMediaContentType.Podcast,
                    ImageUrl         = "http://feeds.twit.tv/coverart/" + query.FolderId + "600.jpg",
                    IsInfiniteStream = true,
                    MediaType        = ChannelMediaType.Video,
                    MediaSources     = mediaInfo,
                    RunTimeTicks     = runtime,
                    Name             = i.title,
                    Id          = i.link,
                    Type        = ChannelItemType.Media,
                    DateCreated = !String.IsNullOrEmpty(i.pubDate) ?
                                  Convert.ToDateTime(i.pubDate) : (DateTime?)null,
                    PremiereDate = !String.IsNullOrEmpty(i.pubDate) ?
                                   Convert.ToDateTime(i.pubDate) : (DateTime?)null,
                    Overview = i.summary,
                });
            }

            return(new ChannelItemResult
            {
                Items = items,
                TotalRecordCount = items.Count,
            });
        }
Exemplo n.º 14
0
        private async Task <List <ChannelItemInfo> > GetPresets(InternalChannelItemQuery query,
                                                                CancellationToken cancellationToken)
        {
            var page  = new HtmlDocument();
            var items = new List <ChannelItemInfo>();
            var url   = "http://opml.radiotime.com/Browse.ashx?c=presets&formats=mp3,aac&partnerid=" + partnerid + "&serial=" +
                        _appHost.SystemId;

            if (Plugin.Instance.Configuration.Username != null)
            {
                url = url + "&username="******"GET").ConfigureAwait(false))
            {
                using (var site = response.Content)
                {
                    page.Load(site, Encoding.UTF8);
                    if (page.DocumentNode != null)
                    {
                        var body = page.DocumentNode.SelectSingleNode("//body");

                        if (body.SelectNodes("//outline[@url and @type=\"audio\"]") != null)
                        {
                            foreach (var node in body.SelectNodes("//outline[@url and @type=\"audio\"]"))
                            {
                                items.Add(new ChannelItemInfo
                                {
                                    Name        = node.Attributes["text"].Value,
                                    Id          = "stream_" + node.Attributes["url"].Value,
                                    Type        = ChannelItemType.Media,
                                    ContentType = ChannelMediaContentType.Podcast,
                                    ImageUrl    = node.Attributes["image"] != null ? node.Attributes["image"].Value : null,
                                    MediaType   = ChannelMediaType.Audio
                                });
                            }
                        }
                        if (body.SelectNodes("//outline[@key=\"shows\"]") != null)
                        {
                            foreach (var node in body.SelectNodes("//outline[@key=\"shows\"]/outline[@url]"))
                            {
                                items.Add(new ChannelItemInfo
                                {
                                    Name     = node.Attributes["text"].Value,
                                    Id       = "subcat_" + node.Attributes["url"].Value,
                                    Type     = ChannelItemType.Folder,
                                    ImageUrl = node.Attributes["image"] != null ? node.Attributes["image"].Value : null
                                });
                            }
                        }
                    }
                }
            }

            return(items.ToList());
        }
        private async Task <ChannelItemResult> GetRecordingSeriesGroups(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var pluginPath = Plugin.Instance.ConfigurationFilePath.Remove(Plugin.Instance.ConfigurationFilePath.Length - 4);
            var service    = GetService();

            var allRecordings = await service.GetAllRecordingsAsync(cancellationToken).ConfigureAwait(false);

            var result = new ChannelItemResult()
            {
                Items = new List <ChannelItemInfo>(),
            };

            var series = allRecordings
                         .Where(i => i.IsSeries)
                         .ToLookup(i => i.Name, StringComparer.OrdinalIgnoreCase);

            result.Items.AddRange(series.OrderBy(i => i.Key).Select(i => new ChannelItemInfo
            {
                Name         = i.Key,
                SeriesName   = i.Key,
                Id           = "series_" + i.Key.GetMD5().ToString("N"),
                Type         = ChannelItemType.Folder,
                FolderType   = ChannelFolderType.Container,
                DateModified = allRecordings.Where(r => r.Name.Equals(i.Key)).OrderByDescending(d => d.StartDate).Select(d => d.StartDate).FirstOrDefault(),
                ImageUrl     = File.Exists(Path.Combine(pluginPath, "recordingposters", String.Join("", i.Key.Split(Path.GetInvalidFileNameChars())) + ".jpg")) ?
                               Path.Combine(pluginPath, "recordingposters", String.Join("", i.Key.Split(Path.GetInvalidFileNameChars())) + ".jpg") : String.Empty,
            }));

            return(result);
        }
Exemplo n.º 16
0
        private async Task <ChannelItemResult> GetSubCategories(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var downloader = new VimeoCategoryDownloader(_logger, _jsonSerializer, _httpClient);
            var channels   = await downloader.GetVimeoSubCategory(query.FolderId, cancellationToken);

            if (channels == null)
            {
                channels = new Category();
            }

            channels.subCategories.Add(new VimeoAPI.API.Channel
            {
                id   = "allVideos_" + query.FolderId,
                name = "All Videos"
            });

            channels.subCategories.Add(new VimeoAPI.API.Channel
            {
                id   = "allChannels_" + query.FolderId,
                name = "All Channels"
            });

            var items = channels.subCategories.Select(i => new ChannelItemInfo
            {
                Type = ChannelItemType.Folder,
                Name = i.name,
                Id   = "subcat_" + i.id,
            }).ToList();

            return(new ChannelItemResult
            {
                Items = items
            });
        }
Exemplo n.º 17
0
        public async Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            ChannelItemResult result;

            _logger.Debug("cat ID : " + query.FolderId);

            if (query.FolderId == null)
            {
                return(await GetCategories(cancellationToken).ConfigureAwait(false));
            }
            else
            {
                var folderID = query.FolderId.Split('_');
                query.FolderId = folderID[1];

                if (folderID[0] == "subcat")
                {
                    return(await GetSubCategories(query, cancellationToken).ConfigureAwait(false));
                }
                if (folderID[0] == "streams")
                {
                    query.FolderId = folderID[2];
                    return(await GetStreams(folderID[1], query, cancellationToken).ConfigureAwait(false));
                }
            }

            return(null);
        }
Exemplo n.º 18
0
        public async Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            //ChannelItemResult result;

            _logger.Debug("cat ID : " + query.FolderId);

            if (query.FolderId == null)
            {
                return(await GetMainMenu(cancellationToken).ConfigureAwait(false));
            }

            var catSplit = query.FolderId.Split('_');

            if (catSplit[0] == "subvideo")
            {
                query.FolderId = catSplit[1];
                return(await GetVideos(query, cancellationToken).ConfigureAwait(false));
            }

            if (catSplit[0] == "submenu")
            {
                query.FolderId = catSplit[1];
                return(await GetSubMenu(query, cancellationToken).ConfigureAwait(false));
            }

            if (catSplit[0] == "showmenu")
            {
                return(await GetShowMenu(cancellationToken).ConfigureAwait(false));
            }

            return(null);
        }
Exemplo n.º 19
0
        private async Task <ChannelItemResult> GetCategories(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var downloader = new VimeoCategoryDownloader(_logger, _jsonSerializer, _httpClient);
            var channels   = await downloader.GetVimeoCategoryList(query.StartIndex, query.Limit, cancellationToken);

            if (channels == null)
            {
                channels = new Categories();
            }

            if (Plugin.Instance.Configuration.Token != null && Plugin.Instance.Configuration.SecretToken != null)
            {
                channels.Add(new Category
                {
                    id   = "myChannels",
                    name = "My Channels"
                });
            }

            var items = channels.Select(i => new ChannelItemInfo
            {
                Type     = ChannelItemType.Folder,
                ImageUrl = i.image,
                Name     = i.name,
                Id       = "cat_" + i.id,
            }).ToList();

            return(new ChannelItemResult
            {
                Items = items,
                TotalRecordCount = channels.total
            });
        }
Exemplo n.º 20
0
        public async Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            _logger.Debug("cat ID : " + query.FolderId);

            if (query.FolderId == null)
            {
                return(await GetMainMenu(cancellationToken).ConfigureAwait(false));
            }

            var folderID = query.FolderId.Split('_');

            query.FolderId = folderID[1];

            if (folderID[0] == "programs")
            {
                return(await GetProgramList(query, cancellationToken).ConfigureAwait(false));
            }
            if (folderID[0] == "episodes")
            {
                query.SortDescending = true;
                query.SortBy         = ChannelItemSortField.PremiereDate;
                return(await GetEpisodeList(query, cancellationToken).ConfigureAwait(false));
            }
            if (folderID[0] == "genres")
            {
                return(await GetGenreList(query, cancellationToken).ConfigureAwait(false));
            }
            if (folderID[0] == "tvchannels")
            {
                return(await GetTVChannelList(query, cancellationToken).ConfigureAwait(false));
            }

            return(null);
        }
Exemplo n.º 21
0
        public async Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            if (string.IsNullOrEmpty(query.FolderId))
            {
                return(await Worker.GetChannelCategoriesAsync(logger, memoryCache));
            }
            else if (query.FolderId.StartsWith("https://psapi.nrk.no/tv/pages/"))
            {
                return(await Worker.GetCategoryItemsAsync(query, logger, memoryCache));
            }
            else if (query.FolderId.StartsWith("https://psapi.nrk.no/tv/catalog/series/") && !query.FolderId.Contains("seasons"))
            {
                return(await Worker.GetSeasonInfoAsync(query, logger, memoryCache));
            }
            else if (query.FolderId.StartsWith("https://psapi.nrk.no/tv/catalog/series/") && query.FolderId.Contains("seasons"))
            {
                return(await Worker.GetEpisodeInfoAsync(query, logger, memoryCache));
            }

            logger.LogInformation("ERROR ERROR ERROR INGEN FOLDERID DETECTA ");
            logger.LogInformation("ERROR ERROR ERROR INGEN FOLDERID DETECTA ");
            logger.LogInformation("ERROR ERROR ERROR INGEN FOLDERID DETECTA ");
            logger.LogInformation("ERROR ERROR ERROR INGEN FOLDERID DETECTA ");
            logger.LogInformation("ERROR ERROR ERROR INGEN FOLDERID DETECTA ");
            logger.LogInformation("ERROR ERROR ERROR INGEN FOLDERID DETECTA ");

            return(null);
        }
Exemplo n.º 22
0
        private async Task <ChannelItemResult> GetRecordingSeasonGroups(InternalChannelItemQuery query, Func <MyRecordingInfo, bool> filter, CancellationToken cancellationToken)
        {
            var service = GetService();

            var allRecordings = await service.GetAllRecordingsAsync(cancellationToken).ConfigureAwait(false);

            var result = new ChannelItemResult()
            {
                Items = new List <ChannelItemInfo>(),
            };

            var season = allRecordings.Where(filter)
                         .GroupBy(i => i.SeasonNumber, i => i.Name, (key, g) => new { SeasonNumber = key, Name = g.ToList() });

            result.Items.AddRange(season.OrderBy(i => i.SeasonNumber).Select(i => new ChannelItemInfo
            {
                Name              = "Season " + i.SeasonNumber,
                FolderType        = ChannelFolderType.Container,
                Id                = "season_" + i.SeasonNumber.ToString().GetMD5().ToString("N") + "_" + i.Name.First().ToString(),
                Type              = ChannelItemType.Folder,
                ParentIndexNumber = i.SeasonNumber,
            }));

            result.Items.OrderBy(i => i.Name);

            return(result);
        }
Exemplo n.º 23
0
        private async Task <ChannelItemResult> GetProgramList(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var page  = new HtmlDocument();
            var items = new List <ChannelItemInfo>();

            using (var site = await _httpClient.Get(new HttpRequestOptions()
            {
                Url = query.FolderId,
                CancellationToken = CancellationToken.None
            }).ConfigureAwait(false))
            {
                page.Load(site, Encoding.UTF8);

                foreach (var node in page.DocumentNode.SelectNodes("//div[@id='categories-content']/div[@class='item-list']/ul/li"))
                {
                    var thumb = node.SelectSingleNode(".//div[@class='min-container']//img");
                    var title = node.SelectSingleNode(".//div[@class='programme-title cell-title']/a").InnerText.Replace("&#039;", "'");
                    var url   = "http://www.itv.com" + node.SelectSingleNode(".//div[@class='programme-title cell-title']/a").Attributes["href"].Value;

                    items.Add(new ChannelItemInfo
                    {
                        Name     = title,
                        ImageUrl = thumb != null ? thumb.Attributes["src"].Value.Replace("player_image_thumb_standard", "posterframe") : "",
                        Id       = "episodes_" + url,
                        Type     = ChannelItemType.Folder
                    });
                }
            }

            return(new ChannelItemResult
            {
                Items = items.ToList()
            });
        }
Exemplo n.º 24
0
        private async Task <ChannelItemResult> GetRecordingNameGroups(InternalChannelItemQuery query, Func <MyRecordingInfo, bool> filter, CancellationToken cancellationToken)
        {
            var pluginPath = Plugin.Instance.ConfigurationFilePath.Remove(Plugin.Instance.ConfigurationFilePath.Length - 4);
            var service    = GetService();

            var allRecordings = await service.GetAllRecordingsAsync(cancellationToken).ConfigureAwait(false);

            var result = new ChannelItemResult()
            {
                Items = new List <ChannelItemInfo>(),
            };

            var doublenames = allRecordings.Where(filter)
                              .GroupBy(i => i.Name).Where(i => i.Count() > 1).Select(i => i.Key)
                              .ToLookup(i => i, StringComparer.OrdinalIgnoreCase);

            result.Items.AddRange(doublenames.OrderBy(i => i.Key).Select(i => new ChannelItemInfo
            {
                Name       = i.Key,
                FolderType = ChannelFolderType.Container,
                Id         = "name_" + i.Key.GetMD5().ToString("N"),
                Type       = ChannelItemType.Folder,
                ImageUrl   = File.Exists(Path.Combine(pluginPath, "recordingposters", String.Join("", i.Key.Split(Path.GetInvalidFileNameChars())) + ".jpg")) ?
                             Path.Combine(pluginPath, "recordingposters", String.Join("", i.Key.Split(Path.GetInvalidFileNameChars())) + ".jpg") : String.Empty,
            }));

            var singlenames = allRecordings.Where(filter)
                              .GroupBy(i => i.Name).Where(c => c.Count() == 1).Select(g => g.First());

            result.Items.AddRange(singlenames.Select(ConvertToChannelItem));

            result.Items.OrderBy(i => i.Name);

            return(result);
        }
        private async Task <ChannelItemResult> GetEpisodes(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var offset     = query.StartIndex.GetValueOrDefault();
            var downloader = new Revision3ListingDownloader(_logger, _jsonSerializer, _httpClient);
            var videos     = await downloader.GetEpisodeList(offset, query, cancellationToken)
                             .ConfigureAwait(false);

            var episodes = videos.episodes.Select(i => new ChannelItemInfo
            {
                ContentType  = ChannelMediaContentType.Clip,
                ImageUrl     = !String.IsNullOrEmpty(i.images.medium) ? i.images.medium : "",
                MediaType    = ChannelMediaType.Video,
                Name         = i.name,
                Type         = ChannelItemType.Media,
                Id           = i.slug,
                RunTimeTicks = TimeSpan.FromSeconds(i.duration).Ticks,
                DateCreated  = !String.IsNullOrEmpty(i.published) ?
                               Convert.ToDateTime(i.published) : DateTime.MinValue,
                Overview = !String.IsNullOrEmpty(i.summary) ? i.summary : "",
            });

            //var orderedEpisodes = OrderItems(episodes.ToList(), query, cancellationToken);

            return(new ChannelItemResult
            {
                Items = episodes.ToList(),
                TotalRecordCount = videos.total
            });
        }
Exemplo n.º 26
0
        public async Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            _logger.Debug("cat ID : " + query.FolderId);

            if (query.FolderId == null)
            {
                return(await GetMainMenu(cancellationToken).ConfigureAwait(false));
            }

            var catSplit = query.FolderId.Split('_');

            if (catSplit[0] == "categories")
            {
                return(await GetCategories(cancellationToken).ConfigureAwait(false));
            }

            query.FolderId = catSplit[1];

            if (catSplit[0] == "videos")
            {
                return(await GetVideos(query, cancellationToken).ConfigureAwait(false));
            }

            if (catSplit[0] == "tags")
            {
                return(await GetTags(cancellationToken).ConfigureAwait(false));
            }

            return(null);
        }
Exemplo n.º 27
0
        // Add when more menus needed

        /*private async Task<ChannelItemResult> GetMainMenu(CancellationToken cancellationToken)
         * {
         *  var items = new List<ChannelItemInfo>
         *  {
         *      new ChannelItemInfo
         *      {
         *          Name = "Featured Channels",
         *          Id = "channels_" + "https://api.vineapp.com/channels/featured",
         *          Type = ChannelItemType.Folder
         *      }
         *  };
         *
         *  return new ChannelItemResult
         *  {
         *      Items = items.ToList()
         *  };
         * }*/

        private async Task <ChannelItemResult> GetChannels(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            var items = new List <ChannelItemInfo>();

            using (var site = await _httpClient.Get("https://api.vineapp.com/channels/featured", CancellationToken.None).ConfigureAwait(false))
            {
                var channelList = _jsonSerializer.DeserializeFromStream <ChannelList>(site);

                foreach (var c in channelList.data.records)
                {
                    items.Add(new ChannelItemInfo
                    {
                        Name     = c.channel,
                        Id       = "videos_" + c.channelId,
                        ImageUrl = c.exploreIconFullUrl,
                        Type     = ChannelItemType.Folder
                    });
                }
            }

            return(new ChannelItemResult
            {
                Items = items.ToList()
            });
        }
Exemplo n.º 28
0
        public async Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            _logger.Debug("cat ID : " + query.FolderId);

            if (query.FolderId == null)
            {
                return(await GetChannels(query, cancellationToken).ConfigureAwait(false));
            }

            var catSplit = query.FolderId.Split('_');

            query.FolderId = catSplit[1];

            /*if (catSplit[0] == "channels")
             * {
             *  return await GetChannels(query, cancellationToken).ConfigureAwait(false);
             * }*/

            if (catSplit[0] == "videos")
            {
                return(await GetVideos(query, cancellationToken).ConfigureAwait(false));
            }

            return(null);
        }
        public Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            _logger.Debug($"[GetChannelItems] Searching ID: {query.FolderId}");


            /*
             *    id: {sport}_{date}_{gameId}_{network}_{quality}
             */

            /*
             *    Structure:
             *         Sport
             *             Date - Past 7 days?
             *                 Game Id
             *                     Home vs Away
             *                         Network - (Home/Away/3-Camera)
             *                             Quality
             */

            // At root, return Sports
            if (string.IsNullOrEmpty(query.FolderId))
            {
                return(GetSportFolders());
            }

            _logger.Debug("[GetChannelItems] Current Search Key: {0}", query.FolderId);

            // Split parts to see how deep we are
            var querySplit = query.FolderId.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries);

            switch (querySplit.Length)
            {
            case 0:
                // List sports
                return(GetSportFolders());

            case 1:
                // List dates
                return(GetDateFolders(querySplit[0]));

            case 2:
                // List games
                return(GetGameFolders(querySplit[0], querySplit[1]));

            case 3:
                // List feeds
                return(GetFeedFolders(querySplit[0], querySplit[1], querySplit[2]));

            case 4:
                // List qualities
                return(GetQualityItems(querySplit[0], querySplit[1], querySplit[2], querySplit[3]));

            default:
                // Unknown, return empty result
                return(Task.FromResult(new ChannelItemResult()));
            }
        }
Exemplo n.º 30
0
        public async Task <ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
        {
            if (string.IsNullOrEmpty(query.FolderId))
            {
                return(await GetCategories());
            }

            return(await GetVideos(query.FolderId));
        }