예제 #1
0
        // function should only be called inside a write lock
        bool checkVariables(BaseMetadata metadata)
        {
            if (metadata == null)
            {
                return(false);
            }

            if (metadata.Tags.Count > 0)
            {
                HasTags = true;
            }
            else
            {
                HasTags = false;
            }

            if (metadata.Longitude != null && metadata.Latitude != null)
            {
                HasGeoTag = true;
            }
            else
            {
                HasGeoTag = false;
            }

            return(true);
        }
        /// <inheritdoc />
        public IEnumerator <KeyValuePair <string, object> > GetRawEnumerator()
        {
            HashSet <string> keys = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

            if (Metadata != null)
            {
                foreach (KeyValuePair <string, object> item in Metadata.GetRawEnumerable())
                {
                    if (keys.Add(item.Key))
                    {
                        yield return(item);
                    }
                }
            }

            foreach (KeyValuePair <string, object> item in PropertyMetadata <TDocument> .For((TDocument)this).GetRawEnumerable())
            {
                if (keys.Add(item.Key))
                {
                    yield return(item);
                }
            }

            if (BaseMetadata != null)
            {
                foreach (KeyValuePair <string, object> item in BaseMetadata.GetRawEnumerable())
                {
                    if (keys.Add(item.Key))
                    {
                        yield return(item);
                    }
                }
            }
        }
 /// <inheritdoc />
 public bool TryGetRaw(string key, out object value)
 {
     value = default;
     return((!IDocument.Properties.Contains(key) && Metadata?.TryGetRaw(key, out value) == true) ||
            PropertyMetadata <TDocument> .For((TDocument)this).TryGetRaw(key, out value) ||
            (BaseMetadata?.TryGetRaw(key, out value) ?? false));
 }
예제 #4
0
        public void Remove(Guid code)
        {
            using (var transaction = Connection.BeginTransaction())
            {
                try
                {
                    var field = metadataFieldRepository.Get(code);

                    if (field.IsNull())
                    {
                        throw new ArgumentException("Nenhum campo encontrado com o código informado");
                    }

                    var metadata = BaseMetadata.CreateInstance(field, null);

                    var exists = metadataService.HasValueByJsonId(metadata);

                    if (exists)
                    {
                        throw new ArgumentException("Não é possível remover esse campo, pois já existem valores vinculados ao mesmo");
                    }

                    metadataFieldRepository.Delete(field);
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }
예제 #5
0
        public void SaveValue(FieldType type, Guid referenceCode, IEnumerable <DTO.MetadataField> metadatas)
        {
            using (var transaction = Connection.BeginTransaction())
            {
                try
                {
                    var _metadatas = metadatas.Select(field =>
                    {
                        var _field = new MetadataField(field);

                        var metadata   = BaseMetadata.CreateInstance(_field, null, referenceCode);
                        metadata.Value = field.Value.AsString();

                        return(metadata);
                    }).ToList();

                    metadataService.SaveValue(_metadatas);
                }
                catch
                {
                    transaction.Rollback();

                    throw;
                }
            }
        }
 /// <inheritdoc />
 public bool TryGetRaw(string key, out object value)
 {
     value = default;
     return((Metadata?.TryGetRaw(key, out value) ?? false) ||
            PropertyMetadata <TDocument> .For((TDocument)this).TryGetRaw(key, out value) ||
            (BaseMetadata?.TryGetRaw(key, out value) ?? false));
 }
예제 #7
0
        public virtual void writeMetadata(BaseMetadata media, CancellableOperationProgressBase progress = null)
        {
            Progress = progress;

            XMPLib.MetaData.ErrorCallbackDelegate errorCallbackDelegate = new XMPLib.MetaData.ErrorCallbackDelegate(errorCallback);
            // bug in xmplib, crashes on write when video is mpg and a progresscallback is active
            XMPLib.MetaData.ProgressCallbackDelegate progressCallbackDelegate = media.MimeType.Equals("video/mpeg") ? null : new XMPLib.MetaData.ProgressCallbackDelegate(progressCallback);

            XMPLib.MetaData xmpMetaDataWriter = new XMPLib.MetaData(errorCallbackDelegate, progressCallbackDelegate);

            try
            {
                if (media.SupportsXMPMetadata)
                {
                    xmpMetaDataWriter.open(media.Location, Consts.OpenOptions.XMPFiles_OpenForUpdate);

                    write(xmpMetaDataWriter, media);
                }
                else
                {
                    throw new Exception("Format does not support XMP metadata");
                }
            }
            finally
            {
                xmpMetaDataWriter.Dispose();
                xmpMetaDataWriter = null;
            }
        }
예제 #8
0
        public Constant Verify(int opPositin, BaseMetadata[] args)


        {
            if (args == null)
            {
                throw new ArgumentException("运算操作符参数为空");
            }
            if (args.Length != 2)
            {
                //抛异常
                throw new IllegalExpressionException("操作符\"" + THIS_OPERATOR.Token + "\"参数个数不匹配"
                                                     , THIS_OPERATOR.Token
                                                     , opPositin
                                                     );
            }

            BaseMetadata first  = args[1];
            BaseMetadata second = args[0];

            if (first == null || second == null)
            {
                throw new NullReferenceException("操作符\"" + THIS_OPERATOR.Token + "\"参数为空");
            }

            if (DataType.DATATYPE_DATE == first.GetDataType() &&
                DataType.DATATYPE_DATE == second.GetDataType())
            {
                //日期类型比较
                return(new Constant(DataType.DATATYPE_BOOLEAN, false));
            }
            else if (DataType.DATATYPE_STRING == first.GetDataType() &&
                     DataType.DATATYPE_STRING == second.GetDataType())
            {
                //字窜类型比较
                return(new Constant(DataType.DATATYPE_BOOLEAN, false));
            }
            else if ((DataType.DATATYPE_DOUBLE == first.GetDataType() ||
                      DataType.DATATYPE_FLOAT == first.GetDataType() ||
                      DataType.DATATYPE_LONG == first.GetDataType() ||
                      DataType.DATATYPE_INT == first.GetDataType())
                     &&
                     (DataType.DATATYPE_DOUBLE == second.GetDataType() ||
                      DataType.DATATYPE_FLOAT == second.GetDataType() ||
                      DataType.DATATYPE_LONG == second.GetDataType() ||
                      DataType.DATATYPE_INT == second.GetDataType())

                     )
            {
                //数值类型比较
                return(new Constant(DataType.DATATYPE_BOOLEAN, false));
            }
            else
            {
                //LT操作不支持其他类型,抛异常
                throw new IllegalExpressionException("操作符\"" + THIS_OPERATOR.Token + "\"参数类型错误");
            }
        }
        //执行函数校验
        private ExpressionToken VerifyFunction(ExpressionToken funtionToken, Stack <ExpressionToken> verifyStack)
        {
            if (!(verifyStack.Count == 0))
            {
                bool            doPop     = true;
                var             args      = new List <BaseMetadata>();
                ExpressionToken parameter = null;
                //弹出函数的参数,直到遇到"("时终止
                while (doPop && !(verifyStack.Count == 0))
                {
                    parameter = verifyStack.Pop();

                    if (ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT == parameter.TokenType)
                    {
                        //常量
                        args.Add(parameter.Constant);
                    }
                    else if (ExpressionToken.ETokenType.ETOKEN_TYPE_VARIABLE == parameter.TokenType)
                    {
                        args.Add(parameter.Variable);
                    }
                    else if ("(".Equals(parameter.GetSplitor()))
                    {
                        doPop = false;
                    }
                    else
                    {
                        //没有找到应该存在的右括号
                        throw new IllegalExpressionException("表达式不合法,函数\"" + funtionToken.TokenText + "\"遇到非法参数" + parameter.ToString() + ";位置:" + parameter.StartPosition
                                                             , funtionToken.ToString()
                                                             , funtionToken.StartPosition);
                    }
                }

                if (doPop && (verifyStack.Count == 0))
                {
                    //操作栈以空,没有找到函数的左括号(
                    throw new IllegalExpressionException("表达式不合法,函数\"" + funtionToken.TokenText + "\"缺少\"(\";位置:" + (funtionToken.StartPosition + funtionToken.ToString().Length)
                                                         , funtionToken.ToString()
                                                         , funtionToken.StartPosition);
                }

                //校验函数
                var arguments = new BaseMetadata[args.Count];
                arguments = args.ToArray();
                Constant result = FunctionExecution.Verify(funtionToken.TokenText, funtionToken.StartPosition, arguments);
                return(ExpressionToken.CreateConstantToken(result));
            }
            else
            {
                //没有找到应该存在的右括号
                throw new IllegalExpressionException("表达式不合法,函数\"" + funtionToken.TokenText + "\"不完整"
                                                     , funtionToken.ToString()
                                                     , funtionToken.StartPosition);
            }
        }
예제 #10
0
        private static BaseMetadata readMetadataFromDatabase(string location, ReadOptions options, CancellationToken token, int timeoutSeconds)
        {
            BaseMetadata metadata = null;

            using (MetadataDbCommands metadataCommands = new MetadataDbCommands())
            {
                metadata = metadataCommands.findMetadataByLocation(location);

                if (metadata != null)
                {
                    metadata.IsImported = true;

                    if (options.HasFlag(ReadOptions.LEAVE_STREAM_OPENED_AFTER_READ))
                    {
                        Stream data = FileUtils.waitForFileAccess(location, FileAccess.Read,
                                                                  FILE_OPEN_ASYNC_TIMEOUT_MS, token);

                        metadata.Data = data;
                    }

                    // check if metadata stored in the database is outdated
                    FileInfo info = new FileInfo(location);
                    info.Refresh();

                    if (info.Exists == false)
                    {
                        metadata.MetadataReadError = new FileNotFoundException("File not found", location);
                        return(metadata);
                    }

                    if ((info.LastWriteTime - metadata.LastModifiedDate) > TimeSpan.FromSeconds(10))
                    {
                        // metadata is outdated so update in database
                        Logger.Log.Info("Updated: " + location + " - Database timestamp: " + metadata.LastModifiedDate.ToString() + " Disk timestamp: " + info.LastWriteTime.ToString());
                        int id = metadata.Id;
                        metadata = MetadataFileFactory.read(location, options, token, timeoutSeconds);

                        if (metadata != null)
                        {
                            metadata.IsImported = true;
                            metadata.Id         = id;
                            write(metadata, WriteOptions.WRITE_TO_DATABASE, null);
                        }
                    }

                    if (info.Attributes.HasFlag(FileAttributes.ReadOnly))
                    {
                        metadata.IsReadOnly = true;
                    }
                }
            }

            return(metadata);
        }
예제 #11
0
            public static MediaFileItem create(string location, BaseMetadata metadata = null)
            {
                rwLock.EnterWriteLock();
                try
                {
                    WeakReference <MediaFileItem> reference = null;
                    MediaFileItem item = null;

                    bool success = dictionary.TryGetValue(location, out reference);

                    if (success == true)
                    {
                        bool exists = reference.TryGetTarget(out item);

                        if (exists == false)
                        {
                            // item has been garbage collected, recreate
                            item = new MediaFileItem(location);
                            if (metadata != null)
                            {
                                item.Metadata = metadata;
                                item.checkVariables(metadata);
                                item.ItemState = MediaItemState.LOADED;
                            }

                            reference = new WeakReference <MediaFileItem>(item);
                            dictionary.Remove(location);
                            dictionary.Add(location, reference);
                        }
                    }
                    else
                    {
                        // item did not exist yet
                        item = new MediaFileItem(location);
                        if (metadata != null)
                        {
                            item.Metadata = metadata;
                            item.checkVariables(metadata);
                            item.ItemState = MediaItemState.LOADED;
                        }

                        reference = new WeakReference <MediaFileItem>(item);
                        dictionary.Add(location, reference);
                    }

                    return(item);
                }
                finally
                {
                    rwLock.ExitWriteLock();
                }
            }
예제 #12
0
        public Constant Verify(int opPositin, BaseMetadata[] args)
        {
            if (args == null)
            {
                throw new ArgumentException("运算操作符参数为空");
            }
            if (args.Length != 1)
            {
                //抛异常
                throw new IllegalExpressionException("操作符\"" + THIS_OPERATOR.Token + "\"参数个数不匹配"
                                                     , THIS_OPERATOR.Token
                                                     , opPositin
                                                     );
            }

            BaseMetadata first = args[0];

            if (first == null)
            {
                throw new NullReferenceException("操作符\"" + THIS_OPERATOR.Token + "\"参数为空");
            }

            if (DataType.DATATYPE_DOUBLE == first.GetDataType())
            {
                return(new Constant(DataType.DATATYPE_DOUBLE, 0.0D));
            }
            else if (DataType.DATATYPE_FLOAT == first.GetDataType())
            {
                return(new Constant(DataType.DATATYPE_FLOAT, 0F));
            }
            else if (DataType.DATATYPE_LONG == first.GetDataType())
            {
                return(new Constant(DataType.DATATYPE_LONG, 0L));
            }
            else if (DataType.DATATYPE_INT == first.GetDataType())
            {
                return(new Constant(DataType.DATATYPE_INT, 0));
            }
            else
            {
                //抛异常
                throw new IllegalExpressionException("操作符\"" + THIS_OPERATOR.Token + "\"参数类型错误"
                                                     , THIS_OPERATOR.Token
                                                     , opPositin
                                                     );
            }
        }
예제 #13
0
        public static void write(BaseMetadata metadata, WriteOptions options, CancellableOperationProgressBase progress = null)
        {
            if (options.HasFlag(WriteOptions.AUTO) || options.HasFlag(WriteOptions.WRITE_TO_DISK))
            {
                MetadataFileFactory.write(metadata, progress);
            }

            if (metadata.IsImported && (options.HasFlag(WriteOptions.AUTO) || options.HasFlag(WriteOptions.WRITE_TO_DATABASE)))
            {
                using (MetadataDbCommands metadataCommands = new MetadataDbCommands())
                {
                    metadata = metadataCommands.update(metadata);
                }
            }

            metadata.IsModified = false;
        }
예제 #14
0
        /// <summary>
        /// 执行操作符校验
        /// </summary>
        /// <param name="opToken"></param>
        /// <param name="verifyStack"></param>
        /// <returns></returns>
        private ExpressionToken VerifyOperator(ExpressionToken opToken, Stack <ExpressionToken> verifyStack)
        {
            //判定几元操作符
            Operator op     = opToken.Op;
            int      opType = op.OpType;
            //取得相应的参数个数
            var             args     = new BaseMetadata[opType];
            ExpressionToken argToken = null;

            for (int i = 0; i < opType; i++)
            {
                if (!(verifyStack.Count == 0))
                {
                    argToken = verifyStack.Pop();

                    if (ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT == argToken.TokenType)
                    {
                        args[i] = argToken.Constant;
                    }
                    else if (ExpressionToken.ETokenType.ETOKEN_TYPE_VARIABLE == argToken.TokenType)
                    {
                        args[i] = argToken.Variable;
                    }
                    else
                    {
                        //如果取到的Token不是常量,也不是变量,则抛出错误
                        throw new IllegalExpressionException("表达式不合法,操作符\"" + op.Token + "\"参数错误;位置:" + argToken.StartPosition
                                                             , opToken.ToString()
                                                             , opToken.StartPosition);
                    }
                }
                else
                {
                    //栈已经弹空,没有取道操作符对应的操作数
                    throw new IllegalExpressionException("表达式不合法,操作符\"" + op.Token + "\"找不到相应的参数,或参数个数不足;"
                                                         , opToken.ToString()
                                                         , opToken.StartPosition);
                }
            }
            //执行操作符校验,并返回校验
            Constant result = op.Verify(opToken.StartPosition, args);

            return(ExpressionToken.CreateConstantToken(result));
        }
예제 #15
0
        /// <summary>
        /// Returns null when metadata does not exist
        /// UnknownMetadata when metadata is not recognized
        /// </summary>
        /// <param name="location"></param>
        /// <param name="options"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public static BaseMetadata read(string location, ReadOptions options, CancellationToken token, int timeoutSeconds = 60)
        {
            limitConcurrentReadsSemaphore.Wait(token);
            try
            {
                // initialize metadata with a dummy in case of exceptions
                BaseMetadata metadata = null;

                if (string.IsNullOrEmpty(location) || token.IsCancellationRequested == true)
                {
                    return(metadata);
                }
                else if (FileUtils.isUrl(location))
                {
                    metadata = readMetadataFromWeb(location, options, token, timeoutSeconds);
                }
                else
                {
                    if (options.HasFlag(ReadOptions.AUTO) || options.HasFlag(ReadOptions.READ_FROM_DATABASE))
                    {
                        metadata = readMetadataFromDatabase(location, options, token, timeoutSeconds);
                    }

                    if ((metadata == null && options.HasFlag(ReadOptions.AUTO)) ||
                        options.HasFlag(ReadOptions.READ_FROM_DISK))
                    {
                        metadata = MetadataFileFactory.read(location, options, token, timeoutSeconds);
                    }
                }

                metadata.IsModified = false;
                return(metadata);
            }
            catch (OperationCanceledException)
            {
                // convert operationcanceled to taskcanceled when the token aborts waiting for the semaphore
                throw new TaskCanceledException();
            }
            finally
            {
                limitConcurrentReadsSemaphore.Release();
            }
        }
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            BaseMetadata media = (BaseMetadata)value;

            if (media == null || media.Thumbnail == null)
            {
                if (media is AudioMetadata)
                {
                    return(audioIcon);
                }
                else
                {
                    return(parameter);
                }
            }
            else
            {
                return(media.Thumbnail.Image);
            }
        }
예제 #17
0
        string parseNewFilename(string newFilename, string replaceFilename, bool isRegexEnabled, string oldFilename,
                                BaseMetadata media)
        {
            string outputFilename = null;

            if (isRegexEnabled == false)
            {
                if (String.IsNullOrEmpty(newFilename) || String.IsNullOrWhiteSpace(newFilename))
                {
                    outputFilename = oldFilename;
                }
                else
                {
                    outputFilename = newFilename;
                }
            }
            else
            {
                Regex regex = new Regex(newFilename, RegexOptions.Singleline);

                replaceFilename = parseReplaceFilename(replaceFilename, media);

                if (replaceFilename.Equals("#upper"))
                {
                    outputFilename = regex.Replace(oldFilename, m => m.Value.ToUpperInvariant());
                }
                else if (replaceFilename.Equals("#lower"))
                {
                    outputFilename = regex.Replace(oldFilename, m => m.Value.ToLowerInvariant());
                }
                else
                {
                    outputFilename = regex.Replace(oldFilename, replaceFilename);
                }
            }

            outputFilename = FileUtils.removeIllegalCharsFromFileName(outputFilename, "-");

            return(outputFilename);
        }
예제 #18
0
        public ICollection <BaseMetadata> GetFieldAndFill(FieldType type, IEnumerable <BaseMetadata> metadatas)
        {
            var _metadatas = new List <BaseMetadata>();

            var fields = metadataFieldRepository.GetByType(type);

            fields.ForEach(field =>
            {
                var metadataDb = !metadatas.IsNull() ? metadatas.FirstOrDefault(m => m.Field.JsonId == field.JsonId) : null;

                if (metadataDb.IsNull())
                {
                    _metadatas.Add(BaseMetadata.CreateInstance(field, metadataDb));
                }
                else
                {
                    _metadatas.Add(metadataDb);
                }
            });

            return(_metadatas);
        }
예제 #19
0
        public Constant Verify(int opPositin, BaseMetadata[] args)


        {
            if (args == null)
            {
                throw new ArgumentException("运算操作符参数为空");
            }
            if (args.Length != 2)
            {
                //抛异常
                throw new IllegalExpressionException("操作符\"" + THIS_OPERATOR.Token + "\"参数个数不匹配"
                                                     , THIS_OPERATOR.Token
                                                     , opPositin
                                                     );
            }

            BaseMetadata first  = args[1];
            BaseMetadata second = args[0];

            if (first == null || second == null)
            {
                throw new NullReferenceException("操作符\"" + THIS_OPERATOR.Token + "\"参数为空");
            }

            if (DataType.DATATYPE_BOOLEAN == first.GetDataType() &&
                DataType.DATATYPE_BOOLEAN == second.GetDataType())
            {
                return(new Constant(DataType.DATATYPE_BOOLEAN, false));
            }
            else
            {
                //抛异常
                throw new IllegalExpressionException("操作符\"" + THIS_OPERATOR.Token + "\"参数类型错误"
                                                     , THIS_OPERATOR.Token
                                                     , opPositin
                                                     );
            }
        }
예제 #20
0
 public static void write(BaseMetadata metadata, CancellableOperationProgressBase progress = null)
 {
     if (metadata is ImageMetadata)
     {
         ImageFileMetadataWriter imageMetadataWriter = new ImageFileMetadataWriter();
         imageMetadataWriter.writeMetadata(metadata, progress);
     }
     else if (metadata is VideoMetadata)
     {
         VideoFileMetadataWriter videoMetadataWriter = new VideoFileMetadataWriter();
         videoMetadataWriter.writeMetadata(metadata, progress);
     }
     else if (metadata is AudioMetadata)
     {
         AudioFileMetadataWriter audioMetadataWriter = new AudioFileMetadataWriter();
         audioMetadataWriter.writeMetadata(metadata, progress);
     }
     else
     {
         MetadataFileWriter metadataFileWriter = new MetadataFileWriter();
         metadataFileWriter.writeMetadata(metadata, progress);
     }
 }
예제 #21
0
        /* (non-Javadoc)
         * @see org.wltea.expression.op.IOperatorExecution#verify(int, org.wltea.expression.ExpressionToken[])
         */
        public Constant Verify(int opPositin, BaseMetadata[] args)
        {
            if (args == null)
            {
                throw new ArgumentException("运算操作符参数为空");
            }
            if (args.Length != 2)
            {
                //抛异常
                throw new IllegalExpressionException("操作符\"" + THIS_OPERATOR.Token + "\"参数个数不匹配"
                                                     , THIS_OPERATOR.Token
                                                     , opPositin
                                                     );
            }
            BaseMetadata first  = args[1];
            BaseMetadata second = args[0];

            if (first == null || second == null)
            {
                throw new NullReferenceException("操作符\"" + THIS_OPERATOR.Token + "\"参数为空");
            }
            //APPEND接受任何类型的参数,总是返回Collection类型的常量
            return(new Constant(DataType.DATATYPE_LIST, null));
        }
예제 #22
0
        private string parseReplaceFilename(string replaceFilename, BaseMetadata media)
        {
            Regex counterRegEx = new Regex("#counter([0-9]+)");

            replaceFilename = counterRegEx.Replace(replaceFilename, m =>
            {
                if (!counter.HasValue)
                {
                    int initialCount = int.Parse(m.Groups[1].Value);
                    counter          = initialCount;
                }
                else
                {
                    counter++;
                }

                return(counter.ToString());
            });

            Regex parentDirRegEx = new Regex(parentDirMarker);

            replaceFilename = parentDirRegEx.Replace(replaceFilename, m =>
            {
                String directoryName = Path.GetDirectoryName(media.Location);
                string parentDir     = "";

                int index = directoryName.LastIndexOf('\\');
                if (index != -1 && index < directoryName.Length)
                {
                    parentDir = directoryName.Substring(index + 1);
                }

                return(parentDir);
            });

            Regex widthRegEx = new Regex(widthMarker);

            replaceFilename = widthRegEx.Replace(replaceFilename, m =>
            {
                String width = media is VideoMetadata ? (media as VideoMetadata).Width.ToString() : "";
                width        = media is ImageMetadata ? (media as ImageMetadata).Width.ToString() : "";

                return(width);
            });

            Regex heightRegEx = new Regex(heightMarker);

            replaceFilename = heightRegEx.Replace(replaceFilename, m =>
            {
                String height = media is VideoMetadata ? (media as VideoMetadata).Height.ToString() : "";
                height        = media is ImageMetadata ? (media as ImageMetadata).Height.ToString() : "";

                return(height);
            });

            Regex bitrateRegEx = new Regex(bitrateMarker);

            replaceFilename = bitrateRegEx.Replace(replaceFilename, m =>
            {
                String bitrateKB = "";

                if (media is VideoMetadata)
                {
                    VideoMetadata video = media as VideoMetadata;

                    long totalBitrate = 0;

                    if (video.VideoBitRate.HasValue)
                    {
                        totalBitrate += video.VideoBitRate.Value;
                    }

                    if (video.AudioBitRate.HasValue)
                    {
                        totalBitrate += video.AudioBitRate.Value;
                    }

                    if (totalBitrate > 0)
                    {
                        bitrateKB = (totalBitrate / (8 * 1024)).ToString();
                    }
                }
                else if (media is AudioMetadata)
                {
                    AudioMetadata audio = media as AudioMetadata;

                    if (audio.BitRate.HasValue)
                    {
                        bitrateKB = (audio.BitRate.Value / (8 * 1024)).ToString();
                    }
                }

                return(bitrateKB);
            });

            Regex dateRegex = new Regex(dateMarker);

            replaceFilename = bitrateRegEx.Replace(replaceFilename, m =>
            {
                String creationDate = "";

                if (media.CreationDate.HasValue)
                {
                    creationDate = media.CreationDate.Value.ToString("dd/M/yyyy");
                }

                return(creationDate);
            });

            return(replaceFilename);
        }
예제 #23
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);
            }
        }
        // IMetadata

        /// <inheritdoc />
        public bool ContainsKey(string key) =>
        (Metadata?.ContainsKey(key) ?? false) ||
        PropertyMetadata <TDocument> .For((TDocument)this).ContainsKey(key) ||
        (BaseMetadata?.ContainsKey(key) ?? false);
예제 #25
0
 public bool HasValueByJsonId(BaseMetadata metadata)
 {
     return(metadataRepository.HasValueByJsonId(metadata));
 }
예제 #26
0
 public bool HasValueByJsonId(BaseMetadata metadata)
 {
     return(Collection.Any(c => c.Field.JsonId == metadata.Field.JsonId));
 }
예제 #27
0
        private void getExifProperties(ObservableCollection <Tuple <string, string> > p, BaseMetadata media)
        {
            p.Add(new Tuple <string, string>("Size", MediaViewer.Model.Utils.MiscUtils.formatSizeBytes(media.SizeBytes)));

            if (media.FileDate != null)
            {
                p.Add(new Tuple <string, string>("File Date", media.FileDate.ToString()));
            }

            if (media.LastModifiedDate != null)
            {
                p.Add(new Tuple <string, string>("File Modified", media.LastModifiedDate.ToString()));
            }

            int nrProps = p.Count;

            if (media.Software != null)
            {
                p.Add(new Tuple <string, string>("Software", media.Software));
            }
            if (media.MetadataDate != null)
            {
                p.Add(new Tuple <string, string>("Metadata Date", media.MetadataDate.ToString()));
            }
            if (media.MetadataModifiedDate != null)
            {
                p.Add(new Tuple <string, string>("Metadata Modified", media.MetadataModifiedDate.ToString()));
            }

            if (media is ImageMetadata)
            {
                foreach (Tuple <string, string> item in FormatMetaData.formatProperties(media as ImageMetadata))
                {
                    p.Add(item);
                }
            }
            else if (media is AudioMetadata)
            {
                AudioMetadata audio = media as AudioMetadata;

                if (audio.Genre != null)
                {
                    p.Add(new Tuple <string, string>("Genre", audio.Genre));
                }

                if (audio.Album != null)
                {
                    p.Add(new Tuple <string, string>("Album", audio.Album));
                }

                if (audio.TrackNr != null)
                {
                    String value = audio.TrackNr.ToString();

                    if (audio.TotalTracks != null)
                    {
                        value += " / " + audio.TotalTracks;
                    }

                    p.Add(new Tuple <string, string>("Track", value));
                }

                if (audio.DiscNr != null)
                {
                    String value = audio.DiscNr.ToString();

                    if (audio.TotalDiscs != null)
                    {
                        value += " / " + audio.TotalDiscs;
                    }

                    p.Add(new Tuple <string, string>("Disc", value));
                }
            }


            if (media.Latitude != null)
            {
                p.Add(new Tuple <string, string>("GPS Latitude", media.Latitude.Value.ToString("0.00000")));
            }

            if (media.Longitude != null)
            {
                p.Add(new Tuple <string, string>("GPS Longitude", media.Longitude.Value.ToString("0.00000")));
            }

            if (p.Count > nrProps)
            {
                p.Insert(nrProps, new Tuple <string, string>("", "EXIF"));
            }
        }
예제 #28
0
        void grabData()
        {
            if (items.Count == 1 && Items.ElementAt(0).Metadata != null)
            {
                MediaFileItem media    = Items.ElementAt(0);
                BaseMetadata  metadata = media.Metadata;

                if (metadata.SupportsXMPMetadata == false)
                {
                    clear();
                }

                Filename = Path.GetFileNameWithoutExtension(metadata.Name);
                Location = metadata.Path;

                DynamicProperties.Clear();

                if (metadata is ImageMetadata)
                {
                    getImageProperties(DynamicProperties, metadata as ImageMetadata);
                }
                if (metadata is VideoMetadata)
                {
                    getVideoProperties(DynamicProperties, metadata as VideoMetadata);
                }
                else if (metadata is AudioMetadata)
                {
                    getAudioProperties(DynamicProperties, metadata as AudioMetadata);
                }

                Rating      = metadata.Rating == null ? null : new Nullable <double>(metadata.Rating.Value / 5);
                Title       = metadata.Title;
                Description = metadata.Description;
                Author      = metadata.Author;
                Copyright   = metadata.Copyright;
                Creation    = metadata.CreationDate;
                IsImported  = metadata.IsImported;
                IsReadOnly  = media.IsReadOnly || !metadata.SupportsXMPMetadata || metadata is UnknownMetadata;

                Geotag = new GeoTagCoordinatePair(metadata.Latitude, metadata.Longitude);

                lock (tagsLock)
                {
                    Tags.Clear();

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

                getExifProperties(DynamicProperties, metadata);

                SelectedMetaDataPreset = noPresetMetaData;
                IsEnabled = true;
                BatchMode = false;
            }
            else if (items.Count > 1 && BatchMode == true)
            {
            }
            else
            {
                if (items.Count > 1)
                {
                    IsEnabled  = true;
                    BatchMode  = true;
                    IsReadOnly = false;
                    clear();
                }
                else if (items.Count == 0)
                {
                    BatchMode      = false;
                    IsEnabled      = false;
                    IsReadOnly     = true;
                    IsRegexEnabled = false;
                    clear();
                }
            }
        }
예제 #29
0
        public MetadataField(DO.MetadataField field, BaseMetadata metadata)
            : this(field)
        {
            switch (field.Format)
            {
            case FormatType.Integer:

                if (metadata.Value.IsNullOrWhiteSpace())
                {
                    Value = null;
                }
                else
                {
                    Value = metadata.Value.AsLong();
                }

                break;

            case FormatType.Decimal:

                if (metadata.Value.IsNullOrWhiteSpace())
                {
                    Value = null;
                }
                else
                {
                    decimal _value;

                    decimal.TryParse(metadata.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out _value);

                    Value = _value;
                }

                break;

            case FormatType.Date:
                var value = metadata.Value.AsDateTime();

                if (metadata.Value.IsNullOrWhiteSpace() || value == DateTime.MinValue)
                {
                    Value = null;
                }
                else
                {
                    Value = value;
                }

                break;

            case FormatType.Boolean:

                if (metadata.Value.IsNullOrWhiteSpace())
                {
                    Value = null;
                }
                else
                {
                    Value = metadata.Value.AsBool();
                }

                break;

            default:
                Value = metadata.Value;
                break;
            }
        }
예제 #30
0
        bool updateMetadata(MediaFileItem item, MetaDataUpdateViewModelAsyncState state)
        {
            bool isModified = false;

            if (item.Metadata == null || item.Metadata is UnknownMetadata)
            {
                throw new Exception("Missing or invalid metadata in media");
            }

            isModified = item.Metadata.IsModified;

            BaseMetadata media = item.Metadata;

            if (state.RatingEnabled)
            {
                Nullable <double> oldValue = media.Rating;

                media.Rating = state.Rating.HasValue == false ? null : state.Rating * 5;

                if (media.Rating != oldValue)
                {
                    isModified = true;
                }
            }

            if (state.TitleEnabled && !EqualityComparer <String> .Default.Equals(media.Title, state.Title))
            {
                media.Title = state.Title;
                isModified  = true;
            }

            if (state.DescriptionEnabled && !EqualityComparer <String> .Default.Equals(media.Description, state.Description))
            {
                media.Description = state.Description;
                isModified        = true;
            }

            if (state.AuthorEnabled && !EqualityComparer <String> .Default.Equals(media.Author, state.Author))
            {
                media.Author = state.Author;
                isModified   = true;
            }

            if (state.CopyrightEnabled && !EqualityComparer <String> .Default.Equals(media.Copyright, state.Copyright))
            {
                media.Copyright = state.Copyright;
                isModified      = true;
            }

            if (state.CreationEnabled && !(Nullable.Compare <DateTime>(media.CreationDate, state.Creation) == 0))
            {
                media.CreationDate = state.Creation;
                isModified         = true;
            }

            if (state.IsGeoTagEnabled && !(Nullable.Compare <double>(media.Latitude, state.Latitude) == 0))
            {
                media.Latitude = state.Latitude;
                isModified     = true;
            }

            if (state.IsGeoTagEnabled && !(Nullable.Compare <double>(media.Longitude, state.Longitude) == 0))
            {
                media.Longitude = state.Longitude;
                isModified      = true;
            }

            if (state.BatchMode == false && !state.Tags.SequenceEqual(media.Tags))
            {
                media.Tags.Clear();
                foreach (Tag tag in state.Tags)
                {
                    media.Tags.Add(tag);
                }
                isModified = true;
            }
            else if (state.BatchMode == true)
            {
                bool addedTag   = false;
                bool removedTag = false;

                foreach (Tag tag in state.AddTags)
                {
                    // Hashset compares items using their gethashcode function
                    // which can be different for the same database entities created at different times
                    if (!media.Tags.Contains(tag, EqualityComparer <Tag> .Default))
                    {
                        media.Tags.Add(tag);
                        addedTag = true;
                    }
                }

                foreach (Tag tag in state.RemoveTags)
                {
                    Tag removeTag = media.Tags.FirstOrDefault((t) => t.Name.Equals(tag.Name));

                    if (removeTag != null)
                    {
                        media.Tags.Remove(removeTag);
                        removedTag = true;
                    }
                }

                if (removedTag || addedTag)
                {
                    isModified = true;
                }
            }

            return(isModified);
        }