Exemple #1
0
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
}