예제 #1
0
 def test_should_not_override_existing_values(self):
     reader = TagReader()
     title = reader.readfile(self.filename)['TITLE']
     writer = TagWriter()
     from time import time
     now = str(time() * 1000)
     tags = {
         'ALBUM': now
     }
     writer.write(tags, self.filename)
     self.assertEqual(title, reader.readfile(self.filename)['TITLE'])
예제 #2
0
 def test_should_write_tags(self):
     writer = TagWriter()
     from time import time
     now = str(time() * 1000)
     tags = {
         'ALBUM': now
     }
     writer.write(tags, self.filename)
     reader = TagReader()
     document = reader.readfile(self.filename)
     self.assertEqual(document['ALBUM'], now)
예제 #3
0
 def __init__(self, library_name):
     self.library_name = library_name
     self.client = MongoClient()
     self.collection = {}
     self.tag_reader = TagReader()
     self.tag_writer = TagWriter()
예제 #4
0
class Library:
    def __init__(self, library_name):
        self.library_name = library_name
        self.client = MongoClient()
        self.collection = {}
        self.tag_reader = TagReader()
        self.tag_writer = TagWriter()

    def restore(self):
        db = self.client[self.library_name]
        self.collection = db.tags
        return self

    def create(self, folder_name, listener=NullListener()):
        db = self.client[self.library_name]
        db.drop_collection('tags')
        self.collection = db.tags
        documents = self.tag_reader.readfolder(folder_name, listener).items()
        for key, tag in documents:
            self.collection.insert_one(tag)
        return self

    def track_details(self, track_id):
        return self.collection.find_one({'_id': track_id})

    def load_single_picture(self, track):
        return self.tag_reader.read_pictures(track['PATH'])[0]

    def replace_cover_art(self, raw_data, track):
        print("Saving cover art in {}".format(track['PATH']))
        self.tag_writer.replace_picture(raw_data, track['PATH'])

    def view(self):
        return LibraryView(self.collection)

    def aggregate(self, match, group_by):
        if group_by == 'TITLE':
            return [track['TITLE'] for track in self.find_tracks(match)]
        pipeline = [
            {"$match": match},
            {"$group": {"_id": "$" + group_by}}
        ]
        cur = self.collection.aggregate(pipeline)
        return sorted([item['_id'] for item in cur])

    def find_tracks(self, match):
        return list(self.collection.find(match).sort('TRACKNUMBER'))

    def store(self, track_id, tags):
        file_name = tags['PATH']
        self.collection.replace_one({'_id': track_id}, tags)
        self.tag_writer.write(tags, file_name)

    def rename(self, tracks, base_folder):
        for track in tracks:
            composer = track['COMPOSER']
            genre = track['GENRE']
            album = track['ALBUM']
            artist = track['ARTIST']
            year = track['DATE']
            track_number = track['TRACKNUMBER']
            new_folder = "{}\\{}\\{}\\{}\\{}, {}".format(base_folder, composer, genre, album, artist, year)
            import os
            os.makedirs(new_folder, exist_ok=True)
            new_path = "{}\\{}.flac".format(new_folder, track_number.zfill(2))
            # print(new_path)
            existing_path = track['PATH']
            print(existing_path)
            if new_path != existing_path:
            # from shutil import rename
                import shutil
                shutil.move(existing_path, new_path)

    def __str__(self, *args, **kwargs):
        return "Library {}".format(self.library_name)