def cluster(self, objs): """Group files with similar metadata to 'clusters'.""" log.debug("Clustering %r", objs) if len(objs) <= 1 or self.unclustered_files in objs: files = list(self.unclustered_files.files) else: files = self.get_files_from_objects(objs) for name, artist, files in Cluster.cluster(files, 1.0): QtCore.QCoreApplication.processEvents() cluster = self.load_cluster(name, artist) for file in sorted(files, key=attrgetter('discnumber', 'tracknumber', 'base_filename')): file.move(cluster)
def cluster(self, objs): """Group files with similar metadata to 'clusters'.""" log.debug("Clustering %r", objs) if len(objs) <= 1 or self.unclustered_files in objs: files = list(self.unclustered_files.files) else: files = self.get_files_from_objects(objs) for name, artist, files in Cluster.cluster(files, 1.0): QtCore.QCoreApplication.processEvents() cluster = self.load_cluster(name, artist) for file in sorted(files, key=attrgetter('discnumber', 'tracknumber', 'base_filename')): file.move(cluster)
def cluster(self, objs): """Group files with similar metadata to 'clusters'.""" self.log.debug("Clustering %r", objs) if len(objs) <= 1 or self.unmatched_files in objs: files = list(self.unmatched_files.files) else: files = self.get_files_from_objects(objs) fcmp = lambda a, b: (cmp(a.discnumber, b.discnumber) or cmp( a.tracknumber, b.tracknumber) or cmp(a.base_filename, b. base_filename)) for name, artist, files in Cluster.cluster(files, 1.0): QtCore.QCoreApplication.processEvents() cluster = self.load_cluster(name, artist) for file in sorted(files, fcmp): file.move(cluster)
def cluster(self, objs): """Group files with similar metadata to 'clusters'.""" log.debug("Clustering %r", objs) if len(objs) <= 1 or self.unmatched_files in objs: files = list(self.unmatched_files.files) else: files = self.get_files_from_objects(objs) fcmp = lambda a, b: ( cmp(a.discnumber, b.discnumber) or cmp(a.tracknumber, b.tracknumber) or cmp(a.base_filename, b.base_filename)) for name, artist, files in Cluster.cluster(files, 1.0): QtCore.QCoreApplication.processEvents() cluster = self.load_cluster(name, artist) for file in sorted(files, fcmp): file.move(cluster)
def cluster(self, objs): """Group files with similar metadata to 'clusters'.""" log.debug("Clustering %r", objs) if len(objs) <= 1 or self.unclustered_files in objs: files = list(self.unclustered_files.files) else: files = self.get_files_from_objects(objs) self.window.set_sorting(False) cluster_files = defaultdict(list) for name, artist, files in Cluster.cluster(files, 1.0, self): cluster = self.load_cluster(name, artist) cluster_files[cluster].extend(files) for cluster, files in process_events_iter(cluster_files.items()): cluster.add_files(files) self.window.set_sorting(True)
def test_cluster_multi(self): files = [ self._create_file('album cluster1', 'artist bar'), self._create_file('album cluster2', 'artist foo'), self._create_file('album cluster1', 'artist foo'), self._create_file('albumcluster2', 'artist bar'), self._create_file('album single', 'artist bar'), ] clusters = list(Cluster.cluster(files)) self.assertEqual(3, len(clusters)) self.assertClusterEqual('album cluster1', 'artist bar', {files[0], files[2]}, clusters[0]) self.assertClusterEqual('album cluster2', 'artist foo', {files[1], files[3]}, clusters[1]) self.assertClusterEqual('album single', 'artist bar', {files[4]}, clusters[2])
def test_cluster_by_path(self): files = [ self._create_file(None, None, 'artist1/album1/foo1.ogg'), self._create_file(None, None, 'album2/foo1.ogg'), self._create_file(None, None, 'artist1/album1/foo2.ogg'), self._create_file(None, None, 'album2/foo2.ogg'), self._create_file(None, None, 'single/foo.ogg'), self._create_file(None, None, 'album1/foo3.ogg'), ] clusters = list(Cluster.cluster(files)) self.assertEqual(3, len(clusters)) self.assertClusterEqual('album1', 'artist1', {files[0], files[2], files[5]}, clusters[0]) self.assertClusterEqual('album2', 'Diverse Interpreten', {files[1], files[3]}, clusters[1]) self.assertClusterEqual('single', 'Diverse Interpreten', {files[4]}, clusters[2])
def cluster(self, objs): """Group files with similar metadata to 'clusters'.""" log.debug("Clustering %r", objs) if len(objs) <= 1 or self.unclustered_files in objs: files = list(self.unclustered_files.files) else: files = self.get_files_from_objects(objs) self.window.set_sorting(False) cluster_files = defaultdict(list) for name, artist, files in Cluster.cluster(files, 1.0, self): cluster = self.load_cluster(name, artist) cluster_files[cluster].extend( sorted(files, key=attrgetter('discnumber', 'tracknumber', 'base_filename'))) for cluster, files in cluster_files.items(): cluster.add_files(files) QtCore.QCoreApplication.processEvents() self.window.set_sorting(True)
def _do_clustering(self, files): # The clustering algorithm should completely run in the thread, # hence do not return the iterator. return list(Cluster.cluster(files))
def test_cluster_single_file(self): files = [ self._create_file('album foo', 'artist foo'), ] clusters = list(Cluster.cluster(files)) self.assertEqual(1, len(clusters))
def test_cluster_none(self): clusters = list(Cluster.cluster([])) # No cluster is being created self.assertEqual(0, len(clusters))