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); } }
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); }