public static TagLib.Image.File Parse(Uri uri) { // Detect mime-type string mime = MimeTypesMap.GetMimeType(Path.GetFileName(uri.AbsolutePath)); if (mime.StartsWith("application/x-extension-")) { // Works around broken metadata detection - https://bugzilla.gnome.org/show_bug.cgi?id=624781 mime = $"taglib/{mime.Substring (24)}"; } // Parse file var res = new TagLibFileAbstraction { Uri = uri }; var sidecar_uri = GetSidecarUri(uri); var sidecar_res = new TagLibFileAbstraction { Uri = sidecar_uri }; TagLibFile file = null; try { file = TagLib.File.Create(res, mime, ReadStyle.Average) as TagLibFile; } catch (Exception) { //Log.Debug ($"Loading of metadata failed for file: {uri}, trying extension fallback"); try { file = TagLib.File.Create(res, ReadStyle.Average) as TagLibFile; } catch (Exception e) { //Log.Debug ($"Loading of metadata failed for file: {uri}"); // Log.DebugException (e); return(null); } } // Load XMP sidecar if (System.IO.File.Exists(sidecar_uri.AbsolutePath)) { file.ParseXmpSidecar(sidecar_res); } return(file); }
public static void SaveSafely(this TagLib.Image.File metadata, Uri photoUri, bool alwaysSidecar) { if (alwaysSidecar || !metadata.Writeable || metadata.PossiblyCorrupt) { if (!alwaysSidecar && metadata.PossiblyCorrupt) { Log.Warning($"Metadata of file {photoUri} may be corrupt, refusing to write to it, falling back to XMP sidecar."); } var sidecar_res = new TagLibFileAbstraction() { Uri = GetSidecarUri(photoUri) }; metadata.SaveXmpSidecar(sidecar_res); } else { metadata.Save(); } }