def __init__(self, path): self.file = MP3(path, ID3=EasyID3) self.id3file = ID3(path) self.bitrateModeTable = { BitrateMode.UNKNOWN: "CBR", BitrateMode.CBR: "CBR", BitrateMode.VBR: "VBR", BitrateMode.ABR: "ABR" } EasyID3.RegisterTextKey("initialkey", "TKEY") EasyID3.RegisterTextKey("comment", "COMM") EasyID3.RegisterTextKey("modified", "TPE4") EasyID3.RegisterTXXXKey('tiktag', 'TikTag')
def __init__(self, stand_alone=False): self.data_dir = os.environ.get('KLANGBECKEN_DATA', '/var/lib/klangbecken') self.secret = os.environ['KLANGBECKEN_API_SECRET'] self.url_map = Map() # register the TXXX key so that we can access it later as # mutagenfile['rg_track_gain'] EasyID3.RegisterTXXXKey(key='track_gain', desc='REPLAYGAIN_TRACK_GAIN') EasyID3.RegisterTXXXKey(key='cue_in', desc='CUE_IN') EasyID3.RegisterTXXXKey(key='cue_out', desc='CUE_OUT') root_url = '/<any(' + ', '.join(PLAYLISTS) + '):category>/' mappings = [ ('/login/', ('GET', 'POST'), 'login'), ('/logout/', ('POST', ), 'logout'), (root_url, ('GET', ), 'list'), (root_url + '<filename>', ('GET', ), 'get'), (root_url, ('POST', ), 'upload'), (root_url + '<filename>', ('PUT', ), 'update'), (root_url + '<filename>', ('DELETE', ), 'delete'), ] if stand_alone: # Serve html and prefix calls to api mappings = [('/api' + path, methods, endpoint) for path, methods, endpoint in mappings] mappings.append(('/', ('GET', ), 'static')) mappings.append(('/<path:path>', ('GET', ), 'static')) cur_dir = os.path.dirname(os.path.realpath(__file__)) dist_dir = open(pjoin(cur_dir, '.dist_dir')).read().strip() self.static_dir = pjoin(cur_dir, dist_dir) for path, methods, endpoint in mappings: self.url_map.add(Rule(path, methods=methods, endpoint=endpoint))
from collections.abc import MutableMapping except ImportError: # Python 2 from UserDict import DictMixin as MutableMapping # Set up logging logFormatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s') logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) logger.handlers = [] logger.addHandler(logging.StreamHandler()) for handler in logger.handlers: handler.setFormatter(logFormatter) # Support checksums for MP3 and M4A/MP4 EasyID3.RegisterTXXXKey('transfercoder_src_checksum', 'TRANSFERCODER_SRC_CHECKSUM') EasyMP4Tags.RegisterFreeformKey('transfercoder_src_checksum', 'Transfercoder Source Checksum') def call_silent(cmd: Union[str, Sequence[str]], *args, **kwargs) -> int: """Like subprocess.call, but redirects stdin/out/err to null device.""" nullsrc = open(os.devnull, "r") nullsink = open(os.devnull, "w") kwargs['stdin'] = nullsrc kwargs['stdout'] = nullsink kwargs['stderr'] = nullsink logger.debug("Calling command: %s", repr(cmd)) return call(cmd, *args, **kwargs) def del_hidden(paths: List[str]) -> None: """Remove hidden paths from list of paths
'Album': 'work_name', 'Tags': 'ジャンル', 'Series': 'シリーズ名', 'Event': 'イベント', } for k in [ 'Content rating', 'Original format', 'Tags', 'Series', 'Year', 'Illustrator', 'Event', ]: EasyID3.RegisterTXXXKey(k, k) brackets = '()[]{}<>【】『』「」()' def opposite_of(bracket): index = brackets.find(bracket) if index % 2 == 0: return brackets[index + 1] return brackets[index - 1] def get_relative_path_of(rjcode, folder=None): if folder is not None: y, m = localtime(os.path.getmtime(folder))[:2] else:
# knowledge of the CeCILL license and that you accept its terms. # Author: Guillaume Pellerin <*****@*****.**> import os import string import datetime from mutagen.easyid3 import EasyID3 from mutagen.mp3 import MP3, MPEGInfo from mutagen import id3 from .utils import * EasyID3.valid_keys["comment"] = "COMM::'XXX'" EasyID3.valid_keys["copyright"] = "TCOP::'XXX'" EasyID3.valid_keys["country"] = "TXXX:COUNTRY:'XXX'" EasyID3.RegisterTXXXKey("country", "COUNTRY") class Mp3(MediaBase): """A MP3 file object""" def __init__(self, newmedia): MediaBase.__init__(self) self.description = "MPEG audio Layer III" self.mime_type = 'audio/mpeg' self.extension = 'mp3' self.format = 'MP3' self.media = newmedia self.source = self.media