private void MetadataMerger_DragDrop(object sender, DragEventArgs e) { if (!e.Data.GetDataPresent(DataFormats.FileDrop)) { return; } string[] filenames = e.Data.GetData(DataFormats.FileDrop) as string[]; if (filenames.Length > 1 && Master == null) { MessageBox.Show("The first file must be dragged in by itself."); return; } foreach (string f in filenames) { FileInfo file = new FileInfo(f); if (file.Extension.ToLower() == ".lnk") { file = new FileInfo(WindowsShell.Shortcut.Resolve(f)); } if (!new List <string> { ".xml", ".synthesia" }.Contains(file.Extension.ToLower())) { Log($"SKIPPING file with unknown extension: {file.Name}"); continue; } RawMetadataFile metadata = new RawMetadataFile(file); if (Master == null) { Master = metadata; Log($"Setting \"{file.Name}\" as master ({metadata.Statistics})"); } else { Log($"Adding contents of \"{file.Name}\" to master ({metadata.Statistics})"); if (Master.AddRange(metadata, Log)) { Dirty = true; } } } }
/// <summary> /// Adds all the songs from the passed in metadata file to this one. Returns true if changes were made to this file. /// </summary> public bool AddRange(RawMetadataFile other, Action <string> log) { var theirSongs = other.Raw.XPathSelectElements("/SynthesiaMetadata/Songs/Song"); if (!theirSongs.Any()) { log("SKIPPING: No songs found."); return(false); } var ourSongs = Raw.Root.Element("Songs"); bool madeChanges = false; foreach (XElement s in theirSongs) { string id = s.AttributeOrDefault("UniqueId"); if (string.IsNullOrWhiteSpace(id)) { log("SKIPPING song without a UniqueId."); continue; } if (Raw.XPathSelectElement($"/SynthesiaMetadata/Songs/Song[@UniqueId='{id}']") != null) { log($"SKIPPING duplicate song \"{s.AttributeOrDefault("Title", "(No Title)")}\"!"); continue; } ourSongs.Add(s); madeChanges = true; } var groups = (from s in other.StatisticsList where s.Key == "Groups" select s.Value).SingleOrDefault(); if (groups > 0) { log($"SKIPPING {groups} groups. Groups must be migrated manually!"); } return(madeChanges); }