static async Task Work(CliEnvironment env) { var args = env.Args; var client = DiscogsApiClientProvider.CreateDiscogsApiClient(); var workingDirs = await GetWorkingDirectories(args); foreach (var dir in workingDirs.Filter(x => x.Tracks.Count < 2)) { env.WriteInfoLine($"Ignoring {dir.Path}"); } workingDirs = workingDirs.Filter(x => x.Tracks.Count >= 2).ToList(); var counter = 0; void Up() => env.UpdateProgress((double)counter++ / workingDirs.Count); foreach (var dir in workingDirs) { env.WriteInfoLine($"Processing {dir.Path}"); await ProcessDir(env, client, dir); Up(); } }
static async Task ProcessDir(CliEnvironment env, DiscogsApiClient discogsApiClient, TrackDirInfo trackDirInfo) { var dirPath = trackDirInfo.Path; var outputRootOpt = await Matcher.Match(discogsApiClient, trackDirInfo); if (outputRootOpt.IsNone) { return; } var outputRoot = outputRootOpt.ValueUnsafe(); foreach (var track in outputRoot.Tracks) { var trackNewFileName = $"{track.TrackNumber:00}. {track.Title}{Path.GetExtension(track.Path)}"; var trackOldPath = track.Path; var trackNewPath = Path.Combine(dirPath, trackNewFileName); if (trackOldPath != trackNewPath) { env.WriteInfoLine($"Rename '{Path.GetFileName(track.Path)}' -> '{trackNewFileName}'"); if (!env.Args.Dry) { File.Move(trackOldPath, trackNewPath); } } if (!env.Args.Dry) { var tagLibFile = TagLib.File.Create(trackNewPath); var tags = tagLibFile.Tag; tags.Performers = outputRoot.Performers.ToArray(); tags.Album = outputRoot.Album; tags.Title = track.Title; tags.Track = (uint)track.TrackNumber; tagLibFile.Save(); } } var newDirPath = Path.Combine(Path.GetDirectoryName(dirPath), outputRoot.Album); if (dirPath == newDirPath) { return; } env.WriteInfoLine($"Rename '{dirPath}' -> '{newDirPath}'"); if (!env.Args.Dry) { Directory.Move(dirPath, newDirPath); } }
public EditorController(CliEnvironment cliEnv) { _cliEnv = cliEnv; }