func (tagger *Tagger) processFile(src, dst string) error { utils.Log(utils.INFO, "Start processing file '%v'", src) tagEditor := makeEditor(src) tag, err := tagEditor.ReadTag(src) if err != nil { tagger.counter.addFail() utils.Log(utils.ERROR, "Failed to read tags from file '%v': %v", src, err) return err } if !tagger.filterByTag(tag) { utils.Log(utils.INFO, "Update tag is not required for file '%v'", src) return nil } tagger.counter.addFiltered() if tagger.stop.Load().(bool) { utils.Log(utils.WARNING, "Processing file '%v' interrupted by application stop", src) return fmt.Errorf("Processing file '%v' interrupted by application stop", src) } var newTag editor.Tag if tagger.useExistingTag { newTag, err = recognizer.Recognize(src, tag) } else { newTag, err = recognizer.Recognize(src) } if err != nil { tagger.counter.addFail() utils.Log(utils.ERROR, "Failed to recognize composition from file '%v': %v", src, err) return err } if newTag.Empty() { tagger.counter.addFail() utils.Log(utils.WARNING, "Composition from file '%v' is not recognized", src) return nil } // if we need only cover and there is no cover, return here if tagger.filter == NoCover && newTag.Cover.Empty() { tagger.counter.addFail() utils.Log(utils.WARNING, "Cover for file '%v' is not found", src) return nil } // if we need only cover and already has smth else, take only cover if tagger.filter == NoCover && !tag.Empty() { tag.Cover = newTag.Cover newTag = tag } else { newTag.MergeWith(tag) } err = tagger.preparePath(dst) if err != nil { tagger.counter.addFail() utils.Log(utils.ERROR, "Failed to prepare path '%v': %v", dst, err) return err } err = tagEditor.WriteTag(src, dst, newTag) if err != nil { tagger.counter.addFail() utils.Log(utils.ERROR, "Failed to write tag and save file '%v': %v", dst, err) return err } tagger.counter.addSuccess(!newTag.Cover.Empty()) utils.Log(utils.INFO, "File '%v' successfully processed, cover found: %v", src, newTag.Cover.Empty()) return nil }