Example #1
0
        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;
            }
        }
Example #3
0
        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;
            }
            
                        
        }
Example #6
0
        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);

            }
            
        }
Example #7
0
        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;
 }
Example #9
0
        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;
        }