private void saveMetadata(string fullpath, YoutubeVideoItem item)
        {
            YoutubeItemMetadata metadata = item.Metadata as YoutubeItemMetadata;

            MediaFileItem fileItem = MediaFileItem.Factory.create(fullpath);

            fileItem.EnterWriteLock();
            try
            {
                YoutubeItemMetadata saveMetadata = metadata.Clone() as YoutubeItemMetadata;

                saveMetadata.Location = fullpath;
                ItemProgress          = 0;
                ItemInfo = "Saving metadata: " + item.Name;

                MetadataFactory.write(saveMetadata, MetadataFactory.WriteOptions.WRITE_TO_DISK, this);

                ItemProgress = 100;
                InfoMessages.Add("Finished saving metadata: " + fullpath);
            }
            finally
            {
                fileItem.ExitWriteLock();
            }

            /*fileItem.EnterUpgradeableReadLock();
             * fileItem.readMetadata_URLock(MetadataFactory.ReadOptions.READ_FROM_DISK, CancellationToken);
             * fileItem.ExitUpgradeableReadLock();*/
        }
        protected override String getKey(MediaItem item)
        {
            String key = "";

            if (item is YoutubeVideoItem)
            {
                YoutubeVideoItem videoItem = item as YoutubeVideoItem;

                YoutubeItemMetadata metadata = item.Metadata as YoutubeItemMetadata;

                if (metadata.Height >= 2160)
                {
                    key += "4";
                }
                else if (metadata.Height >= 1080)
                {
                    key += "0";
                }

                if (videoItem.IsEmbeddedOnly || !videoItem.HasPlayableStreams)
                {
                    key += "1";
                }
            }
            else if (item is YoutubeChannelItem)
            {
                key += "2";
            }
            else if (item is YoutubePlaylistItem)
            {
                key += "3";
            }

            return(key);
        }
        public void startDownload(String outputPath, List <MediaItem> items)
        {
            TotalProgress    = 0;
            TotalProgressMax = items.Count;

            try
            {
                foreach (YoutubeVideoItem item in items)
                {
                    CancellationToken.ThrowIfCancellationRequested();

                    YoutubeVideoStreamedItem videoStream, audioStream;
                    item.getStreams(out videoStream, out audioStream, (int)Properties.Settings.Default.MaxDownloadResolution);

                    if (videoStream == null)
                    {
                        InfoMessages.Add("Skipping: " + item.Name + " no streams found");
                        continue;
                    }

                    YoutubeItemMetadata metadata = item.Metadata as YoutubeItemMetadata;

                    String fullpath;
                    String ext      = "." + MediaFormatConvert.mimeTypeToExtension(metadata.MimeType);
                    String filename = FileUtils.removeIllegalCharsFromFileName(item.Name, " ") + ext;

                    try
                    {
                        fullpath = FileUtils.getUniqueFileName(outputPath + "\\" + filename);
                    }
                    catch (Exception)
                    {
                        fullpath = FileUtils.getUniqueFileName(outputPath + "\\" + "stream" + ext);
                    }

                    if (audioStream == null)
                    {
                        singleStreamDownload(fullpath, videoStream);
                    }
                    else
                    {
                        downloadAndMuxStreams(fullpath, videoStream, audioStream);
                    }

                    saveMetadata(fullpath, item);

                    InfoMessages.Add("Finished: " + videoStream.Name + " -> " + fullpath);

                    TotalProgress++;
                }
            }
            catch (Exception e)
            {
                InfoMessages.Add("Error: " + e.Message);
            }
        }
示例#4
0
        async Task showItem(YoutubeItem item)
        {
            YoutubeItemMetadata metaData = item.Metadata as YoutubeItemMetadata;

            if (metaData == null)
            {
                return;
            }

            Title        = metaData.Title;
            Rating       = metaData.Rating == null ? null : metaData.Rating / 5;
            Author       = metaData.Author;
            CreationDate = metaData.CreationDate;
            IsReadOnly   = item.IsReadOnly;

            Tags.Clear();
            foreach (Tag tag in metaData.Tags)
            {
                Tags.Add(tag);
            }

            if (!metaData.Description.EndsWith("..."))
            {
                Description = metaData.Description;
            }
            else if (item is YoutubeVideoItem)
            {
                Video info = await requestVideoInfo((item as YoutubeVideoItem).VideoId);

                if (info != null)
                {
                    Description = metaData.Description = info.Snippet.Description;
                }
                else
                {
                    Description = metaData.Description;
                }
            }
            else
            {
                Description = metaData.Description;
            }

            if (metaData.ViewCount != null)
            {
                DynamicProperties.Add(new Tuple <string, string>("Views", metaData.ViewCount.Value.ToString("#,##0", new CultureInfo("en-US"))));
            }

            if (metaData.MimeType != null)
            {
                DynamicProperties.Add(new Tuple <string, string>("Mime Type", metaData.MimeType));
            }

            if (metaData.Width != null && metaData.Height != null)
            {
                DynamicProperties.Add(new Tuple <string, string>("Resolution", metaData.Width + " x " + metaData.Height));
            }

            if (metaData.FramesPerSecond != null)
            {
                DynamicProperties.Add(new Tuple <string, string>("Frames Per Second", metaData.FramesPerSecond.Value.ToString()));
            }

            if (metaData.DurationSeconds != null)
            {
                DynamicProperties.Add(new Tuple <string, string>("Duration", MiscUtils.formatTimeSeconds(metaData.DurationSeconds.Value)));
            }
        }
        public YoutubeCollectionView(MediaState mediaState) :
            base(mediaState)
        {
            Filter = filterFunc;

            InfoIconsCache = InfoIconsCacheStatic;

            FilterModes = new System.Windows.Data.ListCollectionView(Enum.GetValues(typeof(FilterMode)));

            FilterModes.CurrentChanged += (s, e) =>
            {
                refresh();
            };

            SortItemCollection <SortItem, SortMode> sortItems = new SortItemCollection <SortItem, SortMode>();

            foreach (SortMode mode in Enum.GetValues(typeof(SortMode)))
            {
                sortItems.Add(new SortItem(mode));
            }

            sortItems.ItemSortDirectionChanged += sortItems_ItemSortDirectionChanged;

            SortModes = new System.Windows.Data.ListCollectionView(sortItems);

            SortModes.CurrentChanged += (s, e) =>
            {
                SortItem item = (SortItem)SortModes.CurrentItem;

                switch (item.SortMode)
                {
                case SortMode.Relevance:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        YoutubeItem itemA = (YoutubeItem)a.Item;
                        YoutubeItem itemB = (YoutubeItem)b.Item;

                        return(itemA.Relevance.CompareTo(itemB.Relevance));
                    });
                    break;

                case SortMode.Width:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        int result = hasMediaTest(a, b);
                        if (result != 0)
                        {
                            return(result);
                        }

                        YoutubeItemMetadata metaA = (YoutubeItemMetadata)a.Item.Metadata;
                        YoutubeItemMetadata metaB = (YoutubeItemMetadata)b.Item.Metadata;

                        return(Nullable.Compare <int>(metaA.Width, metaB.Width));
                    });
                    break;

                case SortMode.Height:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        int result = hasMediaTest(a, b);
                        if (result != 0)
                        {
                            return(result);
                        }

                        YoutubeItemMetadata metaA = (YoutubeItemMetadata)a.Item.Metadata;
                        YoutubeItemMetadata metaB = (YoutubeItemMetadata)b.Item.Metadata;

                        return(Nullable.Compare <int>(metaA.Height, metaB.Height));
                    });
                    break;

                case SortMode.Duration:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        int result = hasMediaTest(a, b);
                        if (result != 0)
                        {
                            return(result);
                        }

                        YoutubeItemMetadata metaA = (YoutubeItemMetadata)a.Item.Metadata;
                        YoutubeItemMetadata metaB = (YoutubeItemMetadata)b.Item.Metadata;

                        return(Nullable.Compare <long>(metaA.DurationSeconds, metaB.DurationSeconds));
                    });
                    break;

                case SortMode.MimeType:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        int result = hasMediaTest(a, b);
                        if (result != 0)
                        {
                            return(result);
                        }

                        YoutubeItemMetadata metaA = (YoutubeItemMetadata)a.Item.Metadata;
                        YoutubeItemMetadata metaB = (YoutubeItemMetadata)b.Item.Metadata;

                        return(String.Compare(metaA.MimeType, metaB.MimeType));
                    });
                    break;

                case SortMode.Author:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        int result = hasMediaTest(a, b);
                        if (result != 0)
                        {
                            return(result);
                        }

                        YoutubeItemMetadata metaA = (YoutubeItemMetadata)a.Item.Metadata;
                        YoutubeItemMetadata metaB = (YoutubeItemMetadata)b.Item.Metadata;

                        return(String.Compare(metaA.Author, metaB.Author));
                    });
                    break;

                case SortMode.PublishedAt:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        int result = hasMediaTest(a, b);
                        if (result != 0)
                        {
                            return(result);
                        }

                        YoutubeItemMetadata metaA = (YoutubeItemMetadata)a.Item.Metadata;
                        YoutubeItemMetadata metaB = (YoutubeItemMetadata)b.Item.Metadata;

                        return(Nullable.Compare <DateTime>(metaA.CreationDate, metaB.CreationDate));
                    });
                    break;

                case SortMode.ViewCount:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        int result = hasMediaTest(a, b);
                        if (result != 0)
                        {
                            return(result);
                        }

                        YoutubeItemMetadata metaA = (YoutubeItemMetadata)a.Item.Metadata;
                        YoutubeItemMetadata metaB = (YoutubeItemMetadata)b.Item.Metadata;

                        return(Nullable.Compare <long>(metaA.ViewCount, metaB.ViewCount));
                    });
                    break;

                case SortMode.Rating:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        int result = hasMediaTest(a, b);
                        if (result != 0)
                        {
                            return(result);
                        }

                        YoutubeItemMetadata metaA = (YoutubeItemMetadata)a.Item.Metadata;
                        YoutubeItemMetadata metaB = (YoutubeItemMetadata)b.Item.Metadata;

                        return(Nullable.Compare <double>(metaA.Rating, metaB.Rating));
                    });
                    break;

                case SortMode.FramesPerSecond:
                    SortFunc = new Func <SelectableMediaItem, SelectableMediaItem, int>((a, b) =>
                    {
                        int result = hasMediaTest(a, b);
                        if (result != 0)
                        {
                            return(result);
                        }

                        YoutubeItemMetadata metaA = (YoutubeItemMetadata)a.Item.Metadata;
                        YoutubeItemMetadata metaB = (YoutubeItemMetadata)b.Item.Metadata;

                        return(Nullable.Compare <double>(metaA.Rating, metaB.Rating));
                    });
                    break;

                default:
                    break;
                }

                SortDirection = item.SortDirection;

                refresh();
            };
        }
        public override object getExtraInfo(SelectableMediaItem selectableItem)
        {
            String info = null;
            //string dateFormat = "MMM d, yyyy";

            YoutubeItemMetadata metadata = (YoutubeItemMetadata)selectableItem.Item.Metadata;

            if (metadata == null)
            {
                return(info);
            }

            SortItem item = (SortItem)SortModes.CurrentItem;

            switch (item.SortMode)
            {
            case SortMode.Width:

            case SortMode.Height:
                if (metadata.Width.HasValue && metadata.Height.HasValue)
                {
                    info = metadata.Width + " x " + metadata.Height;
                }
                break;

            case SortMode.MimeType:
                info = metadata.MimeType;
                break;

            case SortMode.Duration:
                if (metadata.DurationSeconds != null)
                {
                    info = MiscUtils.formatTimeSeconds(metadata.DurationSeconds.Value);
                }
                break;

            case SortMode.Author:
                info = metadata.Author;
                break;

            case SortMode.PublishedAt:
                info = MiscUtils.formatTimeAgo(metadata.CreationDate.Value) + " ago";
                break;

            case SortMode.ViewCount:
                if (metadata.ViewCount != null)
                {
                    info = metadata.ViewCount.Value.ToString("#,##0", new CultureInfo("en-US"));
                }
                break;

            case SortMode.Rating:
                if (metadata.Rating != null)
                {
                    return(RatingCache.RatingBitmap[(int)(metadata.Rating.Value + 0.5)]);
                }
                break;

            case SortMode.FramesPerSecond:
                if (metadata.FramesPerSecond != null)
                {
                    return(metadata.FramesPerSecond.Value.ToString() + "fps");
                }
                break;

            default:
                break;
            }

            return(info);
        }