예제 #1
0
        internal override void Run()
        {
            progress = 0;

            if (Video.AddToPlaylist && !string.IsNullOrWhiteSpace(Video.PlaylistId))
            {
                LOGGER.Info($"Adding video '{Video.Title}' to playlist with id '{Video.PlaylistId}'");

                var request = HttpWebRequestCreator.CreateWithAuthHeader("https://www.googleapis.com/youtube/v3/playlistItems?part=snippet", "POST", Account.GetActiveToken());
                request.ContentType = "application/json";

                YoutubePlaylistItem resource = new YoutubePlaylistItem(Video.PlaylistId, Video.Id);
                var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(resource));

                var response = WebService.Communicate(request, bytes);
                Status.QuotaReached = QuotaProblemHandler.IsQuotaLimitReached(response);

                if (!Status.QuotaReached)
                {
                    LOGGER.Info($"Video '{Video.Title}' was successfully added to playlist with id '{Video.PlaylistId}'");

                    FinishedSuccessful = true;
                    progress           = 100;
                }
            }
            else
            {
                LOGGER.Info($"Skipping playlist add since it is either not wanted or there is no playlist id");

                FinishedSuccessful = true;
                progress           = 100;
            }

            OnStepFinished();
        }
예제 #2
0
        public static YoutubeVideo Details(this YoutubePlaylistItem playlistItem)
        {
            switch (playlistItem.ItemKind)
            {
            case ResourceKind.Video: return(Video(playlistItem.ItemId));

            case ResourceKind.Playlist: return(null);

            case ResourceKind.Channel: return(null);

            default: throw new InvalidOperationException();
            }
        }
예제 #3
0
        public YoutubePlaylistItem[] Import(string playlistId)
        {
            var apiKey = _appSettingsProvider.Get("Youtube.ApiKey");

            if (string.IsNullOrEmpty(apiKey))
            {
                throw new ApplicationException("Unable to get Youtube API Key");
            }

            var result = new List <YoutubePlaylistItem>();

            var youtubeService = new YouTubeService(new BaseClientService.Initializer()
            {
                ApplicationName = this.GetType().ToString(),
                ApiKey          = apiKey
            });

            var playlistItemsListRequest = youtubeService.PlaylistItems.List("snippet");

            playlistItemsListRequest.PlaylistId = playlistId;
            playlistItemsListRequest.MaxResults = 20;

            var playlistItemsListResponse = playlistItemsListRequest.Execute();

            foreach (var playlistItem in playlistItemsListResponse.Items)
            {
                var youtubePlaylistItem = new YoutubePlaylistItem()
                {
                    Id           = playlistItem.Snippet.ResourceId.VideoId,
                    Title        = playlistItem.Snippet.Title,
                    Description  = playlistItem.Snippet.Description,
                    ThumbnailUrl = playlistItem.Snippet.Thumbnails.High.Url,
                };

                result.Add(youtubePlaylistItem);
            }

            return(result.ToArray());
        }
예제 #4
0
        public YoutubeViewModel(IRegionManager regionManager, IEventAggregator eventAggregator)
        {
            TokenSource = new CancellationTokenSource();

            RegionManager   = regionManager;
            EventAggregator = eventAggregator;
            NrColumns       = 4;

            MediaState = new MediaState();
            MediaStateCollectionView = new YoutubeCollectionView(MediaState);
            MediaState.clearUIState("Empty", DateTime.Now, MediaStateType.SearchResult);

            MediaStateCollectionView.SelectionChanged += mediaStateCollectionView_SelectionChanged;

            ViewCommand = new Command <SelectableMediaItem>((selectableItem) =>
            {
                if (selectableItem.Item.Metadata == null)
                {
                    return;
                }

                if (selectableItem.Item is YoutubeVideoItem)
                {
                    YoutubeVideoItem item = selectableItem.Item as YoutubeVideoItem;

                    if (item.IsEmbeddedOnly)
                    {
                        Process.Start("https://www.youtube.com/watch?v=" + item.VideoId);
                    }
                    else
                    {
                        YoutubeVideoStreamedItem video, audio;
                        item.getStreams(out video, out audio, (int)Properties.Settings.Default.MaxPlaybackResolution);

                        Shell.ShellViewModel.navigateToVideoView(video, null, audio);
                    }
                }
            });

            ViewChannelCommand = new AsyncCommand <SelectableMediaItem>(async(selectableItem) =>
            {
                if (selectableItem.Item.Metadata == null)
                {
                    return;
                }

                YoutubeItem item = selectableItem.Item as YoutubeItem;

                SearchResource.ListRequest searchListRequest = Youtube.Search.List("snippet");
                searchListRequest.ChannelId  = item.ChannelId;
                searchListRequest.MaxResults = YoutubeSearchViewModel.maxResults;
                searchListRequest.Order      = Google.Apis.YouTube.v3.SearchResource.ListRequest.OrderEnum.Date;

                MediaStateCollectionView.FilterModes.MoveCurrentToFirst();

                await searchAsync(searchListRequest, item.ChannelTitle, false);
            });

            ViewPlaylistCommand = new AsyncCommand <SelectableMediaItem>(async(selectableItem) =>
            {
                if (selectableItem.Item.Metadata == null)
                {
                    return;
                }

                YoutubePlaylistItem item = selectableItem.Item as YoutubePlaylistItem;

                PlaylistItemsResource.ListRequest searchListRequest = Youtube.PlaylistItems.List("snippet");
                searchListRequest.PlaylistId = item.PlaylistId;
                searchListRequest.MaxResults = YoutubeSearchViewModel.maxResults;

                MediaStateCollectionView.FilterModes.MoveCurrentToFirst();

                await searchAsync(searchListRequest, item.Name, false);
            });

            SubscribeCommand = new Command <SelectableMediaItem>((selectableItem) =>
            {
                YoutubeChannelItem item = selectableItem.Item as YoutubeChannelItem;

                EventAggregator.GetEvent <AddFavoriteChannelEvent>().Publish(item);
            });

            DownloadCommand = new AsyncCommand <SelectableMediaItem>(async(selectableItem) => {
                List <MediaItem> items = MediaStateCollectionView.getSelectedItems();
                if (items.Count == 0)
                {
                    items.Add(selectableItem.Item);
                }

                String outputPath = null;

                switch (YoutubePlugin.Properties.Settings.Default.VideoSaveMode)
                {
                case MediaViewer.Infrastructure.Constants.SaveLocation.Current:
                    {
                        outputPath = MediaFileWatcher.Instance.Path;
                        break;
                    }

                case MediaViewer.Infrastructure.Constants.SaveLocation.Ask:
                    {
                        DirectoryPickerView directoryPicker = new DirectoryPickerView();
                        directoryPicker.DirectoryPickerViewModel.InfoString   = "Select Output Directory";
                        directoryPicker.DirectoryPickerViewModel.SelectedPath = MediaFileWatcher.Instance.Path;

                        if (directoryPicker.ShowDialog() == false)
                        {
                            return;
                        }

                        outputPath = directoryPicker.DirectoryPickerViewModel.SelectedPath;

                        break;
                    }

                case MediaViewer.Infrastructure.Constants.SaveLocation.Fixed:
                    {
                        outputPath = YoutubePlugin.Properties.Settings.Default.FixedDownloadPath;
                        break;
                    }

                default:
                    break;
                }

                CancellableOperationProgressView progressView = new CancellableOperationProgressView();
                DownloadProgressViewModel vm = new DownloadProgressViewModel();
                progressView.DataContext     = vm;

                progressView.Show();
                vm.OkCommand.IsExecutable     = false;
                vm.CancelCommand.IsExecutable = true;

                await Task.Factory.StartNew(() =>
                {
                    vm.startDownload(outputPath, items);
                });

                vm.OkCommand.IsExecutable     = true;
                vm.CancelCommand.IsExecutable = false;
            });

            LoadNextPageCommand = new AsyncCommand(async() =>
            {
                await searchAsync(CurrentQuery, "", true);
            });

            SelectAllCommand = new Command(() =>
            {
                MediaStateCollectionView.selectAll();
            }, false);

            DeselectAllCommand = new Command(() =>
            {
                MediaStateCollectionView.deselectAll();
            });

            ShutdownCommand = new Command(() =>
            {
                Properties.Settings.Default.Save();
            });

            MediaState.UIMediaCollection.IsLoadingChanged += UIMediaCollection_IsLoadingChanged;

            MediaViewer.Model.Global.Commands.GlobalCommands.ShutdownCommand.RegisterCommand(ShutdownCommand);

            setupViews();

            EventAggregator.GetEvent <SearchEvent>().Subscribe(searchEvent);

            SearchTask = null;
        }
예제 #5
0
        private async Task search(IClientServiceRequest request, String searchInfo, bool isNextPage, CancellationToken token)
        {
            SearchListResponse       searchResponse       = null;
            PlaylistItemListResponse playlistItemResponse = null;
            PlaylistListResponse     playlistResponse     = null;

            SearchResource.ListRequest        searchRequest        = request as SearchResource.ListRequest;
            PlaylistItemsResource.ListRequest playlistItemsRequest = request as PlaylistItemsResource.ListRequest;
            PlaylistsResource.ListRequest     playlistRequest      = request as PlaylistsResource.ListRequest;

            List <YoutubeItem> items = new List <YoutubeItem>();
            int relevance;

            if (isNextPage)
            {
                if (NextPageToken == null)
                {
                    // Final page
                    return;
                }

                if (searchRequest != null)
                {
                    searchRequest.PageToken = NextPageToken;
                }
                else if (playlistItemsRequest != null)
                {
                    playlistItemsRequest.PageToken = NextPageToken;
                }
                else if (playlistRequest != null)
                {
                    playlistRequest.PageToken = NextPageToken;
                }

                relevance = MediaState.UIMediaCollection.Count;
            }
            else
            {
                MediaState.clearUIState(searchInfo, DateTime.Now, MediaStateType.SearchResult);

                CurrentQuery = request;
                relevance    = 0;
            }

            // Call the search.list method to retrieve results matching the specified query term.
            if (searchRequest != null)
            {
                searchResponse = await searchRequest.ExecuteAsync(token);

                NextPageToken = searchResponse.NextPageToken;

                foreach (SearchResult searchResult in searchResponse.Items)
                {
                    YoutubeItem newItem = null;

                    switch (searchResult.Id.Kind)
                    {
                    case "youtube#video":
                        newItem = new YoutubeVideoItem(searchResult, relevance);
                        break;

                    case "youtube#channel":
                        newItem = new YoutubeChannelItem(searchResult, relevance);
                        break;

                    case "youtube#playlist":
                        newItem = new YoutubePlaylistItem(searchResult, relevance);
                        break;

                    default:
                        break;
                    }

                    if (newItem == null || MediaState.UIMediaCollection.Contains(newItem))
                    {
                        continue;
                    }

                    items.Add(newItem);

                    relevance++;
                }
            }

            if (playlistItemsRequest != null)
            {
                playlistItemResponse = await playlistItemsRequest.ExecuteAsync(token);

                NextPageToken = playlistItemResponse.NextPageToken;

                foreach (PlaylistItem playlistItem in playlistItemResponse.Items)
                {
                    YoutubeVideoItem newItem = new YoutubeVideoItem(playlistItem, relevance);

                    items.Add(newItem);

                    relevance++;
                }
            }

            if (playlistRequest != null)
            {
                playlistResponse = await playlistRequest.ExecuteAsync(token);

                NextPageToken = playlistResponse.NextPageToken;

                foreach (Playlist playlist in playlistResponse.Items)
                {
                    YoutubePlaylistItem newItem = new YoutubePlaylistItem(playlist, relevance);

                    if (!items.Contains(newItem))
                    {
                        items.Add(newItem);
                    }

                    relevance++;
                }
            }

            // Add each result to the appropriate list, and then display the lists of
            // matching videos, channels, and playlists.
            MediaState.addUIState(items);
        }