12 import variables as var
13 from media.item import BaseItem
27 class FileItem(BaseItem):
28 def __init__(self, bot, path, from_dict=None):
36 self.id = hashlib.md5(path.encode()).hexdigest()
37 if os.path.exists(self.uri()):
38 self._get_info_from_tag()
41 super().__init__(bot, from_dict)
42 self.path = from_dict['path']
43 self.title = from_dict['title']
44 self.artist = from_dict['artist']
45 self.thumbnail = from_dict['thumbnail']
46 if not self.validate():
52 return var.music_folder + self.path
58 if not os.path.exists(self.uri()):
60 "file: music file missed for %s" % self.format_debug_string())
61 self.send_client_message(constants.strings('file_missed', file=self.path))
67 def _get_info_from_tag(self):
68 match = re.search("(.+)\.(.+)", self.uri())
69 assert match is not None
71 file_no_ext = match[1]
76 path_thumbnail = file_no_ext + ".jpg"
77 if os.path.isfile(path_thumbnail):
78 im = Image.open(path_thumbnail)
84 # cover artwork: APIC:
85 tags = mutagen.File(self.uri())
87 self.title = tags['TIT2'].text[0]
88 if 'TPE1' in tags: # artist
89 self.artist = tags['TPE1'].text[0]
93 im = Image.open(BytesIO(tags["APIC:"].data))
95 elif ext == "m4a" or ext == "m4b" or ext == "mp4" or ext == "m4p":
96 # title: ©nam (\xa9nam)
100 tags = mutagen.File(self.uri())
102 self.title = tags['©nam'][0]
103 if '©ART' in tags: # artist
104 self.artist = tags['©ART'][0]
108 im = Image.open(BytesIO(tags["covr"][0]))
111 self.thumbnail = self._prepare_thumbnail(im)
116 self.title = os.path.basename(file_no_ext)
118 def _prepare_thumbnail(self, im):
119 im.thumbnail((100, 100), Image.ANTIALIAS)
121 im = im.convert('RGB')
122 im.save(buffer, format="JPEG")
123 return base64.b64encode(buffer.getvalue()).decode('utf-8')
126 dict = super().to_dict()
127 dict['type'] = 'file'
128 dict['path'] = self.path
129 dict['title'] = self.title
130 dict['artist'] = self.artist
131 dict['thumbnail'] = self.thumbnail
134 def format_debug_string(self):
135 return "[file] {artist} - {title} ({path})".format(
141 def format_song_string(self, user):
142 return constants.strings("file_item",
148 def format_current_playing(self, user):
149 display = constants.strings("now_playing", item=self.format_song_string(user))
151 thumbnail_html = '<img width="80" src="data:image/jpge;base64,' + \
152 self.thumbnail + '"/>'
153 display += "<br />" + thumbnail_html
157 def display_type(self):
158 return constants.strings("file")