コード例 #1
0
        /// <summary>
        /// Gets a <see cref="ClassifiableFile"/> filled from <paramref name="fileName"/>.
        /// </summary>
        /// <returns>New <see cref="ClassifiableFile"/> filled from <paramref name="fileName"/>.</returns>
        /// <param name="fileName">The source file.</param>
        public virtual async Task<ClassifiableFile> GetClassifiableFromFileAsync(string fileName, params ClassificationType[] hierarchy)
        {
            if (fileName == null)
                throw new ArgumentNullException("fileName");
            if (!_file.Exists(fileName))
                throw new FileNotFoundException(string.Format("File '{0}' doesn't exists.", fileName));
                
            var mediaMetaData = await _fileSystemHelper.GetFileMediaMetaDataAsync(fileName);

            Location location = mediaMetaData.Location;
            var locationTypes = new [] { ClassificationType.Country, ClassificationType.State, ClassificationType.AdministrativeArea, ClassificationType.Locality, ClassificationType.Route };
            if (hierarchy.Join(locationTypes, ct => ct, ct => ct, (ct, ct1) => ct).Any())
            {
                Log.T("Location needed, try to find it.");
                if (mediaMetaData.Location != null && mediaMetaData.Location.Coordinate != null && 
                    mediaMetaData.Location.Coordinate.Latitude != 0 && mediaMetaData.Location.Coordinate.Longitude != 0)
                {
                    try
                    {
                        location = await _geolocationHelper.FindGeolocationAsync(mediaMetaData.Location.Coordinate);
                        Log.D("GPS coordinate found on file '{0}'. Location is {1}.", fileName, location);
                    }
                    catch (Exception ex)
                    {
                        Log.W(ex, "Fail to get location for coordinates '{0}' on file '{1}' because '{2}'.", mediaMetaData.Location.Coordinate, fileName, ex.Message);
                    }
                }
                else
                {
                    Log.D("GPS coordinate not found on file '{0}', so no location will be set.", fileName);
                }
            }
            else
            {
                Log.T("Location not needed, skip it.");
            }

            var classifiable = new ClassifiableFile()
            { 
                FileName = mediaMetaData.FileName,
                MediaType = mediaMetaData.MediaType,
                DateTaken = mediaMetaData.DateTaken,
                Location = location,
            };
            return classifiable;
        }
コード例 #2
0
        /// <summary>
        /// Gets the classification directory.
        /// </summary>
        /// <returns>The classification directory.</returns>
        /// <param name="classifiable">Classifiable.</param>
		/// <param name="hierarchy">Hierarchy of classification.</param>
		private string GetClassificationDirectory(string targetDirectory, ClassifiableFile classifiable, ClassificationType[] hierarchy)
		{
            string directory = targetDirectory;
            foreach (var currentOrder in hierarchy)
            {
                switch (currentOrder)
                {
                    case ClassificationType.Year:
                        directory = _path.Combine(directory, classifiable.DateTaken.Year.ToString());
                        break;
					case ClassificationType.Month:
						directory = _path.Combine(directory, classifiable.DateTaken.Month.ToString());
						break;
					case ClassificationType.Day:
						directory = _path.Combine(directory, classifiable.DateTaken.Day.ToString());
						break;
					case ClassificationType.Hour:
						directory = _path.Combine(directory, classifiable.DateTaken.Hour.ToString());
						break;
					case ClassificationType.Minute:
						directory = _path.Combine(directory, classifiable.DateTaken.Minute.ToString());
						break;
					case ClassificationType.Second:
						directory = _path.Combine(directory, classifiable.DateTaken.Second.ToString());
						break;
					case ClassificationType.Country:
						directory = _path.Combine(directory, 
							(classifiable.Location != null && !string.IsNullOrWhiteSpace(classifiable.Location.Country)) ? classifiable.Location.Country : "Unknown country".T());
						break;
					case ClassificationType.State:
						directory = _path.Combine(directory, 
							(classifiable.Location != null && !string.IsNullOrWhiteSpace(classifiable.Location.State)) ? classifiable.Location.State : "Unknown state".T());
						break;
					case ClassificationType.AdministrativeArea:
						directory = _path.Combine(directory, 
							(classifiable.Location != null && !string.IsNullOrWhiteSpace(classifiable.Location.AdministrativeArea)) ? classifiable.Location.AdministrativeArea : "Unknown administrative area".T());
						break;
					case ClassificationType.Locality:
						directory = _path.Combine(directory, 
							(classifiable.Location != null && !string.IsNullOrWhiteSpace(classifiable.Location.Locality)) ? classifiable.Location.Locality : "Unknown locality".T());
						break;
					case ClassificationType.Route:
						directory = _path.Combine(directory, 
							(classifiable.Location != null && !string.IsNullOrWhiteSpace(classifiable.Location.Route)) ? classifiable.Location.Route : "Unknown route".T());
						break;
					case ClassificationType.MediaType:
						directory = _path.Combine(directory, classifiable.MediaType.ToString());
						break;
                }
            }

            return directory;
        }