예제 #1
0
    def __init__(self):
        super(UserRatingsPlugin, self).__init__()

        self.config.add({
            # Should we automatically import any values we find?
            'auto': True,
            # Should we overwrite an existing entry?
            'overwrite': False,
            # Should we sync others player ratings when updating a rating
            'sync_ratings': True,
            # SHould we save ratings to a playlist file? (Android Poweramp)
            'ratings_file': "",
            'forward_slash': False
        })

        # Add importing ratings to the import process
        if self.config['auto']:
            self.import_stages = [self.imported]

        # Given the complexity of the storage style implementations, I
        # find it handy to allow them to do unified logging.
        userrating_field = mediafile.MediaField(
            AmarokRatingStorageStyle(_log=self._log, _is_external=False),
            MP3UserRatingStorageStyle(_log=self._log, _is_external=False),
            UserRatingStorageStyle(_log=self._log, _is_external=False),
            ASFRatingStorageStyle(_log=self._log, _is_external=False),
            DefaultValueStorageStyle(_log=self._log, _is_external=True),
            out_type=int)

        externalrating_field = mediafile.MediaField(
            AmarokRatingStorageStyle(_log=self._log, _is_external=True),
            MP3UserRatingStorageStyle(_log=self._log, _is_external=True),
            UserRatingStorageStyle(_log=self._log, _is_external=True),
            ASFRatingStorageStyle(_log=self._log, _is_external=True),
            DefaultValueStorageStyle(_log=self._log, _is_external=True),
            out_type=int)

        if 'userrating' not in mediafile.MediaFile.__dict__:
            self.add_media_field('userrating', userrating_field)

        # this is only to be able to import existing value to beet userrating
        # and export/sync updated values.
        if 'externalrating' not in mediafile.MediaFile.__dict__:
            self.add_media_field('externalrating', externalrating_field)

        if self.config['ratings_file'].get():
            self.register_listener(
                "database_change",
                lambda lib, model: self.register_write_listener())
    def __init__(self, *args, **kwargs):
        super(CanonicalPlugin, self).__init__(*args, **kwargs)
        self.config.add({
            'artist_credit': False,
            'albumartist_credit': False,
            'original_date': False,
            'album_disambig': False
        })
        self.register_listener('album_imported', self.album_imported)
        self.register_listener('write', self.write)

        for field in self.artists_fields:
            canonical = field + u'_canonical'
            canonical_desc = ' '.join(s.capitalize()
                                      for s in canonical.split(u'_'))
            media_field = mediafile.MediaField(
                mediafile.MP3DescStorageStyle(canonical_desc),
                mediafile.MP4StorageStyle(
                    u"----:com.apple.iTunes:{}".format(canonical_desc)),
                mediafile.StorageStyle(canonical.upper()),
                mediafile.ASFStorageStyle('beets/{}'.format(canonical_desc)),
            )
            self.add_media_field(canonical, media_field)
        date_canonical = mediafile.DateField(
            mediafile.MP3DescStorageStyle(u'Date Canonical'),
            mediafile.MP4StorageStyle('----:com.apple.iTunes:Date Canonical'),
            mediafile.StorageStyle('DATE_CANONICAL'),
            mediafile.ASFStorageStyle('WM/Date Canonical'))
        for df in ('year', 'month', 'day'):
            self.add_media_field(
                '{}_canonical'.format(df),
                getattr(date_canonical, '{}_field'.format(df))())
예제 #3
0
    def __init__(self, *args, **kwargs):
        album_sort_field = mediafile.MediaField(
            mediafile.MP3StorageStyle(u"TSOA"),
            mediafile.MP4StorageStyle(u"soal"),
            mediafile.StorageStyle(u"Album Sort")
        )
        self.add_media_field("album_sort", album_sort_field)

        self.register_listener("write", self.write)

        super().__init__(*args, **kwargs)
예제 #4
0
    def setUp(self):
        self.create_temp_dir()
        self.key = "READ_ONLY_TEST"
        self.field = mediafile.MediaField(
            mediafile.MP3StorageStyle(self.key, read_only=True),
            mediafile.MP4StorageStyle("----:com.apple.iTunes:" + self.key,
                                      read_only=True),
            mediafile.StorageStyle(self.key, read_only=True),
            mediafile.ASFStorageStyle(self.key, read_only=True),
        )

        if "read_only_test" not in mediafile.MediaFile.fields():
            mediafile.MediaFile.add_field("read_only_test", self.field)
예제 #5
0
    def __init__(self):
        super(iTunesAdvisoryPlugin, self).__init__()

        self.config.add({
            'auto': True,
        })

        field = mediafile.MediaField(
            mediafile.MP3DescStorageStyle(u'ITUNESADVISORY'),
            mediafile.MP4StorageStyle(u'rtng'),
            mediafile.StorageStyle(u'ITUNESADVISORY'),
            mediafile.ASFStorageStyle(u'ITUNESADVISORY'),
            out_type=int,
        )
        mediafile.MediaFile.add_field('itunesadvisory', field)

        if self.config['auto'].get():
            self.import_stages = [self.imported]
예제 #6
0
    def __init__(self):
        super(GoingRunningPlugin, self).__init__()

        # Read default configuration
        config_file_path = os.path.join(os.path.dirname(__file__),
                                        self._default_plugin_config_file_name_)
        source = ConfigSource(load_yaml(config_file_path) or {},
                              config_file_path)
        self.config.add(source)

        # Add `play_count` field support
        fld_name = u'play_count'
        if fld_name not in mediafile.MediaFile.fields():
            field = mediafile.MediaField(
                mediafile.MP3DescStorageStyle(fld_name),
                mediafile.StorageStyle(fld_name),
                out_type=int
            )
            self.add_media_field(fld_name, field)
예제 #7
0
    def __init__(self):
        super(OldestDatePlugin, self).__init__()
        self.import_stages = [self._on_import]
        self.config.add({
            'auto': True,  # Run during import phase
            'ignore_track_id': False,  # During import, ignore existing track_id
            'filter_on_import': True,  # During import, weight down candidates with no work_id
            'prompt_missing_work_id': True,  # During import, prompt to fix work_id if missing
            'force': False,  # Run even if already processed
            'overwrite_year': False,  # Overwrite year field in tags
            'filter_recordings': True,  # Skip recordings with attributes before fetching them
            'approach': 'releases',  # recordings, releases, hybrid, both
            'release_types': None,  # Filter by release type, e.g. ['Official']
            'use_file_date': False  # Also use file's embedded date when looking for oldest date
        })

        if self.config['ignore_track_id']:
            self.register_listener('import_task_created', self._import_task_created)
        if self.config['prompt_missing_work_id']:
            self.register_listener('import_task_choice', self._import_task_choice)
        if self.config['filter_on_import']:
            self.register_listener('trackinfo_received', self._import_trackinfo)
            # Add heavy weight for missing work_id from a track
            config['match']['distance_weights'].add({'work_id': 4})

        # Get global MusicBrainz host setting
        musicbrainzngs.set_hostname(config['musicbrainz']['host'].get())
        musicbrainzngs.set_rate_limit(1, config['musicbrainz']['ratelimit'].get())

        for recording_field in (
                'recording_year',
                'recording_month',
                'recording_day',
                'recording_disambiguation'):
            field = mediafile.MediaField(
                mediafile.MP3DescStorageStyle(recording_field),
                mediafile.MP4StorageStyle('----:com.apple.iTunes:{}'.format(
                    recording_field)),
                mediafile.StorageStyle(recording_field))
            self.add_media_field(recording_field, field)
예제 #8
0
 def test_overwrite_property(self):
     with self.assertRaises(ValueError) as cm:
         mediafile.MediaFile.add_field('artist', mediafile.MediaField())
     self.assertIn(u'property "artist" already exists',
                   six.text_type(cm.exception))
예제 #9
0
from __future__ import division, absolute_import, print_function

import os
import six
import shutil
import unittest

from test import _common
from beets.library import Item
import mediafile
from beets.plugins import BeetsPlugin
from beets.util import bytestring_path

field_extension = mediafile.MediaField(
    mediafile.MP3DescStorageStyle(u'customtag'),
    mediafile.MP4StorageStyle('----:com.apple.iTunes:customtag'),
    mediafile.StorageStyle('customtag'),
    mediafile.ASFStorageStyle('customtag'),
)


class ExtendedFieldTestMixin(_common.TestCase):
    def _mediafile_fixture(self, name, extension='mp3'):
        name = bytestring_path(name + '.' + extension)
        src = os.path.join(_common.RSRC, name)
        target = os.path.join(self.temp_dir, name)
        shutil.copy(src, target)
        return mediafile.MediaFile(target)

    def test_extended_field_write(self):
        plugin = BeetsPlugin()
        plugin.add_media_field('customtag', field_extension)