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