示例#1
0
        private YtFile GetYtFileFromSearchResult(SearchResult result)
        {
            switch (result.Id.Kind)
            {
            case "youtube#video":
                Song videoInfo = new Song(System.Net.WebUtility.HtmlDecode(result.Snippet.Title), result.Snippet.ChannelTitle, result.Snippet.Thumbnails.High.Url, result.Id.VideoId, -1, -1, null, true, false)
                {
                    ChannelID = result.Snippet.ChannelId
                };
                if (result.Snippet.LiveBroadcastContent == "live")
                {
                    videoInfo.IsLiveStream = true;
                }

                return(new YtFile(videoInfo, YtKind.Video));

            case "youtube#playlist":
                PlaylistItem playlistInfo = new PlaylistItem(result.Snippet.Title, -1, result.Id.PlaylistId)
                {
                    HasWritePermission = false,
                    ImageURL           = result.Snippet.Thumbnails.High.Url,
                    Owner = result.Snippet.ChannelTitle
                };
                return(new YtFile(playlistInfo, YtKind.Playlist));

            case "youtube#channel":
                Channel channelInfo = new Channel(result.Snippet.Title, result.Id.ChannelId, result.Snippet.Thumbnails.High.Url);
                return(new YtFile(channelInfo, YtKind.Channel));

            default:
                Console.WriteLine("&Kind = " + result.Id.Kind);
                return(null);
            }
        }
示例#2
0
        public async Task Search(string search, string querryType, bool loadingBar)
        {
            if (search == null || search == "")
            {
                return;
            }

            searching = true;
            Query     = search;

            if (loadingBar)
            {
                adapter = null;
                ListView.SetAdapter(null);
                EmptyView.Visibility   = ViewStates.Gone;
                LoadingView.Visibility = ViewStates.Visible;
            }

            if (!await MainActivity.instance.WaitForYoutube())
            {
                ListView.SetAdapter(null);
                EmptyView.Text = MainActivity.instance.GetString(Resource.String.youtube_loading_error);
                EmptyView.SetTextColor(Color.Red);
                EmptyView.Visibility = ViewStates.Visible;
                return;
            }

            try
            {
                SearchResource.ListRequest searchResult = YoutubeManager.YoutubeService.Search.List("snippet");
                searchResult.Q       = search;
                searchResult.TopicId = "/m/04rlf";
                switch (querryType)
                {
                case "All":
                    searchResult.Type      = "video,channel,playlist";
                    searchResult.EventType = null;
                    break;

                case "Tracks":
                    searchResult.Type      = "video";
                    searchResult.EventType = null;
                    break;

                case "Playlists":
                    searchResult.Type      = "playlist";
                    searchResult.EventType = null;
                    break;

                case "Lives":
                    searchResult.Type      = "video";
                    searchResult.EventType = SearchResource.ListRequest.EventTypeEnum.Live;
                    break;

                case "Channels":
                    searchResult.Type      = "channel";
                    searchResult.EventType = null;
                    break;

                default:
                    searchResult.Type      = "video";
                    searchResult.EventType = null;
                    break;
                }
                searchResult.MaxResults = 50;

                var searchReponse = await searchResult.ExecuteAsync();

                nextPageToken = searchReponse.NextPageToken;
                result        = new List <YtFile>();

                foreach (var video in searchReponse.Items)
                {
                    result.Add(GetYtFileFromSearchResult(video));
                }

                LoadingView.Visibility = ViewStates.Gone;
                if (nextPageToken != null)
                {
                    result.Add(new YtFile(new Song(), YtKind.Loading));
                }

                if (result.Count > 0 && result[0].Kind == YtKind.Channel && result.Count(x => x.Kind == YtKind.Video && x.song.Artist == result[0].channel.Name) > 1)
                {
                    YtFile channelPreview = new YtFile(result[0].channel, YtKind.ChannelPreview);
                    result.Insert(0, channelPreview);
                }
                else if (result.Count > 0 && querryType == "All" || querryType == "Channels")
                {
                    IEnumerable <string> artist = result.GetRange(0, result.Count > 20 ? 20 : result.Count).GroupBy(x => x.song?.Artist).Where(x => x.Count() > 5).Select(x => x.Key);
                    if (artist.Count() == 1)
                    {
                        Channel channel = result.Find(x => x.Kind == YtKind.Channel && x.channel.Name == artist.First())?.channel;

                        if (channel != null)
                        {
                            YtFile channelPreview = new YtFile(channel, YtKind.ChannelPreview);
                            result.Insert(0, channelPreview);
                        }
                    }
                }

                adapter                = new YtAdapter(result);
                adapter.ItemClick     += ListView_ItemClick;
                adapter.ItemLongCLick += ListView_ItemLongClick;
                ListView.SetAdapter(adapter);
                searching = false;

                if (result.Count == 0)
                {
                    EmptyView.Visibility = ViewStates.Visible;
                    switch (querryType)
                    {
                    case "All":
                        EmptyView.Text = GetString(Resource.String.no_result) + " " + search;
                        break;

                    case "Tracks":
                        EmptyView.Text = GetString(Resource.String.no_track) + " " + search;
                        break;

                    case "Playlists":
                        EmptyView.Text = GetString(Resource.String.no_playlist) + " " + search;
                        break;

                    case "Lives":
                        EmptyView.Text = GetString(Resource.String.no_lives) + " " + search;
                        break;

                    case "Channels":
                        EmptyView.Text = GetString(Resource.String.no_channel) + " " + search;
                        break;

                    default:
                        break;
                    }
                }
                else
                {
                    EmptyView.Visibility = ViewStates.Gone;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("&Exception catched in the youtube search: " + ex.Source + " - " + ex.Message + " Inner: " + ex.InnerException.Message);
                EmptyView.Text         = GetString(Resource.String.timout);
                EmptyView.Visibility   = ViewStates.Visible;
                EmptyView.Visibility   = ViewStates.Visible;
                LoadingView.Visibility = ViewStates.Gone;
            }
        }