- def _control_similarity(self):
- """
- * Regex check of command line similarity
- * Controls artist presence in MPD library
- """
- usage = ('USAGE: "main artist,similar artist:<match score>,other' +
- 'similar artist:<match score>,..."')
- cli_sim = self.options.similarity
- pattern = '^([^,]+?),([^:,]+?:\d{1,2},?)+$'
- regexp = re.compile(pattern, re.U).match(cli_sim)
- if not regexp:
- mess = 'ERROR: similarity badly formated: "%s"' % cli_sim
- print(mess, file=stderr)
- print(usage, file=stderr)
- exit(1)
- if self.options.check_names:
- if not self._control_artist_names():
- mess = 'ERROR: some artist names not found in MPD library!'
- print(mess, file=stderr)
- exit(1)
-
- def _control_artist_names(self):
- """Controls artist names exist in MPD library"""
- mpd_cli = self._get_mpd_client()
- artists_list = mpd_cli.list('artist')
- sim_formated = self._parse_similarity()
- control = True
- if sim_formated[0] not in artists_list:
- mess = 'WARNING: Main artist not found in MPD: %s' % sim_formated[0]
- print(mess)
- control = False
- for sart in sim_formated[1]:
- art = sart.get('artist')
- if art not in artists_list:
- mess = str('WARNING: Similar artist not found in MPD: %s' % art)
- print(mess)
- control = False
- mpd_cli.disconnect()
- return control
-
- def _parse_similarity(self):
- """Parse command line option similarity"""
- cli_sim = self.options.similarity.strip(',').split(',')
- sim = list([])
- main = cli_sim[0]
- for art in cli_sim[1:]:
- artist = art.split(':')[0]
- score = int(art.split(':')[1])
- sim.append({'artist': artist, 'score': score})
- return (main, sim)
-
- def _print_main_art(self, art=None):
- """Print entries, art as main artist."""
- if not art:
- art = self.options.view
- db = simadb.SimaDB(db_path=self.dbfile)
- art_db = self._get_art_from_db(art)
- if not art_db: return
- sims = list([])
- [sims.append(a) for a in db._get_similar_artists_from_db(art_db[0])]
- if len(sims) == 0:
- return False
- print('"%s" similarities:' % art)
- for art in sims:
- mess = str(' - {score:0>2d} {artist}'.format(**art))
- print(mess)
- return True
-
- def _remove_sim(self, art1_db, art2_db):
- """Remove single similarity between two artists."""
- db = simadb.SimaDB(db_path=self.dbfile)
- similarity = db._get_artist_match(art1_db[0], art2_db[0])
- if similarity == 0:
- return False
- db._remove_relation_between_2_artist(art1_db[0], art2_db[0])
- mess = 'Remove: "{0}" "{1}:{2:0>2d}"'.format(art1_db[1], art2_db[1],
- similarity)
- print(mess)
- return True
-
- def _revert_similarity(self, sim_formated):
- """Revert similarity string (for reciprocal editing - add)."""
- main_art = sim_formated[0]
- similars = sim_formated[1]
- for similar in similars:
- yield (similar.get('artist'),
- [{'artist':main_art, 'score':similar.get('score')}])
-