public override void readMetadata_URLock(MetadataFactory.ReadOptions options, System.Threading.CancellationToken token) { String mimeType; try { ItemState = MediaItemState.LOADING; YoutubeItemMetadata metaData = new YoutubeItemMetadata(); SearchResult searchInfo = Info as SearchResult; metaData.Thumbnail = new MediaViewer.MediaDatabase.Thumbnail(loadThumbnail(out mimeType, token)); metaData.CreationDate = PublishedAt; metaData.Title = Name; metaData.Description = String.IsNullOrEmpty(Description) ? Name : Description; Metadata = metaData; ItemState = MediaItemState.LOADED; } catch (Exception e) { if (e is System.Net.WebException && ((System.Net.WebException)e).Status == WebExceptionStatus.Timeout) { ItemState = MediaItemState.TIMED_OUT; } else { ItemState = MediaItemState.ERROR; } } }
public virtual void readMetadata(MediaProbe mediaProbe, Stream data, MetadataFactory.ReadOptions options, BaseMetadata media, CancellationToken token, int timeoutSeconds) { XMPLib.MetaData.ErrorCallbackDelegate errorCallbackDelegate = new XMPLib.MetaData.ErrorCallbackDelegate(errorCallback); //XMPLib.MetaData xmpMetaDataReader = new XMPLib.MetaData(errorCallbackDelegate, null); XMPLib.MetaData xmpMetaDataReader = new XMPLib.MetaData(null, null); try { FileInfo info = new FileInfo(media.Location); info.Refresh(); media.LastModifiedDate = info.LastWriteTime < sqlMinDate ? sqlMinDate : info.LastWriteTime; media.FileDate = info.CreationTime < sqlMinDate ? sqlMinDate : info.CreationTime; media.MimeType = MediaFormatConvert.fileNameToMimeType(media.Name); if (media.SupportsXMPMetadata == false) return; xmpMetaDataReader.open(media.Location, Consts.OpenOptions.XMPFiles_OpenForRead); readXMPMetadata(xmpMetaDataReader, media); } catch (Exception e) { Logger.Log.Error("Cannot read XMP metadata for: " + media.Location, e); media.MetadataReadError = e; } finally { xmpMetaDataReader.Dispose(); xmpMetaDataReader = null; } }
public override void readMetadata_URLock(MetadataFactory.ReadOptions options, System.Threading.CancellationToken token) { MemoryStream data = new MemoryStream(); String mimeType; try { ItemState = MediaItemState.LOADING; StreamUtils.readHttpRequest(new Uri(ImageInfo.Thumbnail.MediaUrl), data, out mimeType, token); BitmapDecoder decoder = BitmapDecoder.Create(data, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad); BitmapSource bitmapSource = decoder.Frames[0]; bitmapSource.Freeze(); ImageMetadata metaData = new ImageMetadata(ImageInfo.MediaUrl, null); metaData.Thumbnail = new Thumbnail(bitmapSource); metaData.Title = ImageInfo.Title; metaData.Location = ImageInfo.MediaUrl; metaData.Width = ImageInfo.Width.HasValue ? ImageInfo.Width.Value : 0; metaData.Height = ImageInfo.Height.HasValue ? ImageInfo.Height.Value : 0; metaData.SizeBytes = ImageInfo.FileSize.HasValue ? ImageInfo.FileSize.Value : 0; metaData.MimeType = ImageInfo.ContentType; Metadata = metaData; ItemState = MediaItemState.LOADED; } catch (Exception e) { if (e is System.Net.WebException && ((System.Net.WebException)e).Status == WebExceptionStatus.Timeout) { ItemState = MediaItemState.TIMED_OUT; } else { ItemState = MediaItemState.ERROR; } } }
public override void readMetadata(MediaProbe mediaProbe, Stream data, MetadataFactory.ReadOptions options, BaseMetadata media, CancellationToken token, int timeoutSeconds) { AudioMetadata audio = media as AudioMetadata; audio.DurationSeconds = mediaProbe.DurationSeconds; audio.SizeBytes = mediaProbe.SizeBytes; audio.AudioContainer = mediaProbe.Container; audio.AudioCodec = mediaProbe.AudioCodecName; audio.SamplesPerSecond = mediaProbe.SamplesPerSecond; audio.BitsPerSample = (short)(mediaProbe.BytesPerSample * 8); audio.NrChannels = (short)mediaProbe.NrChannels; audio.BitRate = mediaProbe.AudioBitRate == 0 ? (long?)null : mediaProbe.AudioBitRate; List<string> fsMetaData = mediaProbe.MetaData; try { if (options.HasFlag(MetadataFactory.ReadOptions.GENERATE_THUMBNAIL)) { generateThumbnail(mediaProbe, audio, token, timeoutSeconds, 1); } } catch (Exception e) { Logger.Log.Error("Cannot read audio thumbnail: " + audio.Location, e); media.MetadataReadError = e; } if(audio.AudioCodec.ToLower().Equals("mp3") || audio.AudioCodec.ToLower().StartsWith("pcm")) { audio.SupportsXMPMetadata = true; } else { audio.SupportsXMPMetadata = false; } base.readMetadata(mediaProbe, data, options, media, token, timeoutSeconds); parseFFMpegMetaData(fsMetaData, audio); }
public override void readMetadata(MediaProbe mediaProbe, Stream data, MetadataFactory.ReadOptions options, BaseMetadata media, CancellationToken token, int timeoutSeconds) { ImageMetadata image = media as ImageMetadata; image.SizeBytes = data.Length; if (FileUtils.isUrl(image.Location)) { image.SupportsXMPMetadata = false; } else { image.SupportsXMPMetadata = true; base.readMetadata(mediaProbe, data, options, media, token, timeoutSeconds); } image.ImageContainer = mediaProbe.Container; image.Width = mediaProbe.Width; image.Height = mediaProbe.Height; image.PixelFormat = mediaProbe.PixelFormat; image.BitsPerPixel = (short)mediaProbe.BitsPerPixel; List<String> fsMetaData = mediaProbe.MetaData; try { if (options.HasFlag(MetadataFactory.ReadOptions.GENERATE_THUMBNAIL)) { generateThumbnail(mediaProbe, image, token, timeoutSeconds, 1); } } catch (Exception e) { Logger.Log.Error("Cannot create image thumbnail: " + image.Location, e); media.MetadataReadError = e; } }
public override void readMetadata_URLock(MetadataFactory.ReadOptions options, CancellationToken token) { if (ItemState == MediaItemState.RELOAD) { reloadFromDisk_URLock(token); return; } EnterWriteLock(); ItemState = MediaItemState.LOADING; ExitWriteLock(false); MediaItemState itemState = MediaItemState.ERROR; BaseMetadata metadata = null; try { metadata = MetadataFactory.read(Location, options, token); if (metadata == null || metadata is UnknownMetadata) { itemState = MediaItemState.ERROR; } else { if (metadata.MetadataReadError != null) { if (metadata.MetadataReadError is FileNotFoundException) { itemState = MediaItemState.FILE_NOT_FOUND; } else { itemState = MediaItemState.ERROR; } } else { itemState = MediaItemState.LOADED; } } } catch (TimeoutException) { itemState = MediaItemState.TIMED_OUT; } catch (Exception e) { itemState = MediaItemState.ERROR; Logger.Log.Info("Error loading Metadata:" + Location, e); } finally { EnterWriteLock(); Metadata = metadata; ItemState = itemState; if (Metadata != null) { IsReadOnly = Metadata.IsReadOnly; checkVariables(Metadata); } ExitWriteLock(false); } }
public void writeMetadata_URLock(MetadataFactory.WriteOptions options, CancellableOperationProgressBase progress = null) { if (Metadata != null) { MetadataFactory.write(Metadata, options, progress); QueueOnPropertyChangedEvent("Metadata"); EnterWriteLock(); try { checkVariables(Metadata); } finally { ExitWriteLock(false); } } }
public override void readMetadata_URLock(MetadataFactory.ReadOptions options, System.Threading.CancellationToken token) { ItemState = MediaItemState.LOADED; }
public override void readMetadata_URLock(MetadataFactory.ReadOptions options, System.Threading.CancellationToken token) { String thumbnailMimeType; try { ItemState = MediaItemState.LOADING; YoutubeItemMetadata metaData = new YoutubeItemMetadata(); metaData.Thumbnail = new MediaViewer.MediaDatabase.Thumbnail(loadThumbnail(out thumbnailMimeType, token)); metaData.CreationDate = PublishedAt; metaData.Title = Title; metaData.Description = String.IsNullOrEmpty(Description) ? Title : Description; metaData.SupportsXMPMetadata = true; NameValueCollection videoInfo; IsEmbeddedOnly = !getVideoInfo(VideoId, out videoInfo, token); if (!IsEmbeddedOnly) { YoutubeVideoStreamedItem video, audio; getStreams(out video, out audio); VideoMetadata videoMetadata = video == null ? null : video.Metadata as VideoMetadata; VideoMetadata audioMetadata = audio == null ? null : audio.Metadata as VideoMetadata; if (videoMetadata != null) { metaData.Width = videoMetadata.Width; metaData.Height = videoMetadata.Height; metaData.MimeType = videoMetadata.MimeType; metaData.FramesPerSecond = videoMetadata.FramesPerSecond == 0 ? null : new Nullable<double>(videoMetadata.FramesPerSecond); metaData.SizeBytes = videoMetadata.SizeBytes; } if (audioMetadata != null) { metaData.SizeBytes += audioMetadata.SizeBytes; } if (videoMetadata == null && audioMetadata == null) { HasPlayableStreams = false; } else { HasPlayableStreams = true; } } long durationSeconds; if (long.TryParse(videoInfo["length_seconds"], out durationSeconds)) { metaData.DurationSeconds = durationSeconds; } long viewCount; if (long.TryParse(videoInfo["view_count"], out viewCount)) { metaData.ViewCount = viewCount; } double rating; if (double.TryParse(videoInfo["avg_rating"], NumberStyles.Float, new CultureInfo("en-US"), out rating)) { metaData.Rating = rating; } metaData.Author = videoInfo["author"]; String tags = videoInfo["keywords"]; if (tags != null) { string[] tagNames = tags.Split(new char[] { ',' }); foreach (string tagName in tagNames) { if (String.IsNullOrEmpty(tagName) || String.IsNullOrWhiteSpace(tagName)) continue; Tag newTag = new Tag(); newTag.Name = tagName; metaData.Tags.Add(newTag); } } Metadata = metaData; ItemState = MediaItemState.LOADED; } catch (Exception e) { if (e is System.Net.WebException && ((System.Net.WebException)e).Status == WebExceptionStatus.Timeout) { ItemState = MediaItemState.TIMED_OUT; } else { ItemState = MediaItemState.ERROR; } } }
public override void readMetadata(MediaProbe mediaProbe, Stream data, MetadataFactory.ReadOptions options, BaseMetadata media, CancellationToken token, int timeoutSeconds) { VideoMetadata video = media as VideoMetadata; video.DurationSeconds = mediaProbe.DurationSeconds; video.SizeBytes = mediaProbe.SizeBytes; video.Width = mediaProbe.Width; video.Height = mediaProbe.Height; video.VideoContainer = mediaProbe.Container; video.VideoCodec = mediaProbe.VideoCodecName; video.PixelFormat = mediaProbe.PixelFormat; video.BitsPerPixel = (short)mediaProbe.BitsPerPixel; video.FramesPerSecond = mediaProbe.FrameRate; video.VideoBitRate = mediaProbe.VideoBitRate == 0 ? (long?)null : mediaProbe.VideoBitRate; video.AudioBitRate = mediaProbe.AudioBitRate == 0 ? (long?)null : mediaProbe.AudioBitRate; if (!String.IsNullOrEmpty(mediaProbe.AudioCodecName)) { video.AudioCodec = mediaProbe.AudioCodecName; video.SamplesPerSecond = mediaProbe.SamplesPerSecond; video.BitsPerSample = (short)(mediaProbe.BytesPerSample * 8); video.NrChannels = (short)mediaProbe.NrChannels; } else { video.AudioCodec = null; video.SamplesPerSecond = null; video.BitsPerSample = null; video.NrChannels = null; } List<String> fsMetaData = mediaProbe.MetaData; try { if (options.HasFlag(MetadataFactory.ReadOptions.GENERATE_THUMBNAIL)) { generateThumbnail(mediaProbe, video, token, timeoutSeconds, 1); } } catch (Exception e) { Logger.Log.Error("Cannot create video thumbnail: " + video.Location, e); media.MetadataReadError = e; } if (fsMetaData != null) { video.SupportsXMPMetadata = supportsXMPMetadata(video, fsMetaData); } else { video.SupportsXMPMetadata = false; } base.readMetadata(mediaProbe, data, options, media, token, timeoutSeconds); parseFFMpegMetaData(fsMetaData, video); }
public static BaseMetadata read(String location, MetadataFactory.ReadOptions options, CancellationToken token, int timeoutSeconds) { BaseMetadata metadata = new UnknownMetadata(FileUtils.getPathWithoutFileName(location)); metadata.Name = Path.GetFileName(location); Logger.Log.Info("Reading metadata for: " + location); int timeoutMs = timeoutSeconds * 1000; Stream data = FileUtils.waitForFileAccess(location, FileAccess.Read, timeoutMs, token); MediaProbe mediaProbe = new MediaProbe(); try { mediaProbe.open(location, token); switch (mediaProbe.MediaType) { case MediaType.AUDIO_MEDIA: { metadata = new AudioMetadata(location, data); AudioFileMetadataReader reader = new AudioFileMetadataReader(); reader.readMetadata(mediaProbe, data, options, metadata, token, timeoutSeconds); break; } case MediaType.IMAGE_MEDIA: { metadata = new ImageMetadata(location, data); ImageFileMetadataReader reader = new ImageFileMetadataReader(); reader.readMetadata(mediaProbe, data, options, metadata, token, timeoutSeconds); break; } case MediaType.VIDEO_MEDIA: { metadata = new VideoMetadata(location, data); VideoFileMetadataReader reader = new VideoFileMetadataReader(); reader.readMetadata(mediaProbe, data, options, metadata, token, timeoutSeconds); break; } default: break; } FileInfo info = new FileInfo(location); info.Refresh(); if (info.Attributes.HasFlag(FileAttributes.ReadOnly)) { metadata.IsReadOnly = true; } if (!options.HasFlag(MetadataFactory.ReadOptions.LEAVE_STREAM_OPENED_AFTER_READ)) { metadata.close(); } } catch (Exception e) { metadata.MetadataReadError = e; } finally { mediaProbe.close(); mediaProbe.Dispose(); } return metadata; }