def copy_files(self, objects): mimeData = QtCore.QMimeData() mimeData.setUrls([ QtCore.QUrl.fromLocalFile(f.filename) for f in iter_files_from_objects(objects) ]) self.clipboard().setMimeData(mimeData)
def extract_and_submit_acousticbrainz_features(self, objs): """Extract AcousticBrainz features and submit them.""" if not self.ab_extractor.available(): return for file in iter_files_from_objects(objs): # Skip unmatched files if not file.can_extract(): log.warning( "AcousticBrainz requires a MusicBrainz Recording ID, but file does not have it: %s" % file.filename) # And process matched ones else: file.set_pending() # Check if file was either already processed or sent to the AcousticBrainz server if file.acousticbrainz_features_file: results = (file.acousticbrainz_features_file, 0, "Writing results") ab_extractor_callback(self, file, results, False) elif file.acousticbrainz_is_duplicate: results = (None, 0, "Duplicate") ab_extractor_callback(self, file, results, False) else: file.acousticbrainz_error = False # Launch the acousticbrainz on a separate process log.debug("Extracting AcousticBrainz features from %s" % file.filename) ab_feature_extraction( self, file.metadata["musicbrainz_recordingid"], file.filename, partial(ab_extractor_callback, self, file))
def analyze(self, objs): """Analyze the file(s).""" if not self.use_acoustid: return for file in iter_files_from_objects(objs): if file.can_analyze(): file.set_pending() self._acoustid.analyze(file, partial(file._lookup_finished, File.LOOKUP_ACOUSTID))
def play(self): """Play selected tracks with an internal player""" self._player.stop() playlist = QtMultimedia.QMediaPlaylist(self) playlist.setPlaybackMode(QtMultimedia.QMediaPlaylist.Sequential) playlist.addMedia([QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file.filename)) for file in iter_files_from_objects(self._selected_objects)]) self._player.setPlaylist(playlist) self._player.play()
def test_iterate_only_unique(self): f1 = Mock() f2 = Mock() f3 = Mock() obj1 = Mock() obj1.iterfiles = Mock(return_value=[f1, f2]) obj2 = Mock() obj2.iterfiles = Mock(return_value=[f2, f3]) result = iter_files_from_objects([obj1, obj2]) self.assertTrue(isinstance(result, Iterator)) self.assertEqual([f1, f2, f3], list(result))
def generate_fingerprints(self, objs): """Generate the fingerprints without matching the files.""" if not self.use_acoustid: return def finished(file, result): file.clear_pending() for file in iter_files_from_objects(objs): file.set_pending() self._acoustid.fingerprint(file, partial(finished, file))
def cluster(self, objs, callback=None): """Group files with similar metadata to 'clusters'.""" log.debug("Clustering %r", objs) files = iter_files_from_objects(objs) try: file = next(files) except StopIteration: files = self.unclustered_files.files else: files = itertools.chain([file], files) thread.run_task(partial(self._do_clustering, list(files)), partial(self._clustering_finished, callback))
def save(self, objects): """Save the specified objects.""" for file in iter_files_from_objects(objects, save=True): file.save()
def get_files_from_objects(self, objects, save=False): """Return list of unique files from list of albums, clusters, tracks or files. Note: Consider using picard.util.iter_files_from_objects instead, which returns an iterator. """ return list(iter_files_from_objects(objects, save=save))