Source code for tagrenamer.fs.musicfile
# -*- coding: utf-8 -*-
"""
Represent a file of a known music file format found on the file system.
"""
import hashlib
import taglib
from tagrenamer.app.safestring import SafeString
from tagrenamer.fs.file import File
music_extensions = ('mp3', 'MP3', 'ogg', 'OGG', 'flac', 'FLAC')
[docs]
class MusicFile(File):
"""
Represent a file of a known music file format found on the file system.
Hooks:
- sanitize (obj)
"""
def __init__(self, output, path, extension, hooks={}, parent=None, dl=1):
"""Initialize the music file object."""
self.relpath_new = ''
self.artist = ''
self.album = ''
self.title = ''
self.hash = None
self.artist_s = ''
self.album_s = ''
self.title_s = ''
self.hash_s = ''
File.__init__(
self,
output,
path=path,
extension=extension,
hooks=hooks,
parent=parent,
dl=dl)
# Set the extension if available.
self.extension = ''
if '.' in self.base:
self.extension = extension
self.extract()
[docs]
def sanitize(self):
"""Sanitize the extracted data ready for file system level usage."""
self.out.log(str(self), '%s.sanitize' % self.type, self.dl)
self.artist_s = str(SafeString(self.artist.strip()))
self.album_s = str(SafeString(self.album.strip()))
self.title_s = str(SafeString(self.title.strip()))
# Start validating the data, based on field length.
if not len(self.artist_s):
raise ValueError(self)
elif not len(self.album_s):
raise ValueError(self)
elif not len(self.title_s):
raise ValueError(self)
# Generate a hash from all the strings to provide a unique file identifier.
self.hash = hashlib.md5()
self.hash.update(self.artist_s.encode('utf-8'))
self.hash.update(self.album_s.encode('utf-8'))
self.hash.update(self.title_s.encode('utf-8'))
self.hash.update(self.extension.encode('utf-8'))
self.hash_s = str(self.hash.hexdigest())
# Print the sanitized metadata fields:
self.out.log("{artist}: '%s'" % self.artist_s,
'%s.sanitize' % self.type, self.dl + 1)
self.out.log("{album}: '%s'" % self.album_s,
'%s.sanitize' % self.type, self.dl + 1)
self.out.log("{title}: '%s'" % self.title_s,
'%s.sanitize' % self.type, self.dl + 1)
self.out.log("{hash}: '%s'" % self.hash_s,
'%s.sanitize' % self.type, self.dl + 1)
self.out.log("{ext}: '%s'" % self.extension,
'%s.sanitize' % self.type, self.dl + 1)
# Invoke the sanitize hook, see main class description.
self.invoke('sanitize', self)