def handleFile(self, f): parse_version = self.args.tag_version super(ClassicPlugin, self).handleFile(f, tag_version=parse_version) if not self.audio_file: return try: self.printHeader(f) printMsg("-" * 79) new_tag = False if (not self.audio_file.tag or self.handleRemoves(self.audio_file.tag)): # No tag, but there might be edit options coming. self.audio_file.tag = id3.Tag() self.audio_file.tag.file_info = id3.FileInfo(f) self.audio_file.tag.version = parse_version new_tag = True save_tag = (self.handleEdits(self.audio_file.tag) or self.args.force_update or self.args.convert_version) self.printAudioInfo(self.audio_file.info) if not save_tag and new_tag: printError("No ID3 %s tag found!" % id3.versionToString(self.args.tag_version)) return self.printTag(self.audio_file.tag) if save_tag: # Use current tag version unless a convert was supplied version = (self.args.convert_version or self.audio_file.tag.version) printWarning("Writing ID3 version %s" % id3.versionToString(version)) self.audio_file.tag.save(version=version, encoding=self.args.text_encoding, backup=self.args.backup) if self.args.rename_pattern: # Handle file renaming. from eyed3.id3.tag import TagTemplate template = TagTemplate(self.args.rename_pattern) name = template.substitute(self.audio_file.tag, zeropad=True) orig = self.audio_file.path self.audio_file.rename(name) printWarning("Renamed '%s' to '%s'" % (orig, self.audio_file.path)) printMsg("-" * 79) except exceptions.Exception as ex: log.error(traceback.format_exc()) if self.args.debug_pdb: import pdb pdb.set_trace() raise StopIteration()
def printHeader(self, file_path): from stat import ST_SIZE file_size = os.stat(file_path)[ST_SIZE] size_str = utils.formatSize(file_size) printMsg("%s\t%s[ %s ]%s" % (boldText(os.path.basename(file_path), c=HEADER_COLOR), getColor(HEADER_COLOR), size_str, getColor(RESET)))
def handleFile(self, f): parse_version = self.args.tag_version super(ClassicPlugin, self).handleFile(f, tag_version=parse_version) if not self.audio_file: return try: self.printHeader(f) printMsg("-" * 79) new_tag = False if (not self.audio_file.tag or self.handleRemoves(self.audio_file.tag)): # No tag, but there might be edit options coming. self.audio_file.tag = id3.Tag() self.audio_file.tag.file_info = id3.FileInfo(f) self.audio_file.tag.version = parse_version new_tag = True save_tag = (self.handleEdits(self.audio_file.tag) or self.args.force_update or self.args.convert_version) self.printAudioInfo(self.audio_file.info) if not save_tag and new_tag: printError("No ID3 %s tag found!" % id3.versionToString(self.args.tag_version)) return self.printTag(self.audio_file.tag) if save_tag: # Use current tag version unless a convert was supplied version = (self.args.convert_version or self.audio_file.tag.version) printWarning("Writing ID3 version %s" % id3.versionToString(version)) self.audio_file.tag.save(version=version, encoding=self.args.text_encoding, backup=self.args.backup) if self.args.rename_pattern: # Handle file renaming. from eyed3.id3.tag import TagTemplate template = TagTemplate(self.args.rename_pattern) name = template.substitute(self.audio_file.tag, zeropad=True) orig = self.audio_file.path self.audio_file.rename(name) printWarning("Renamed '%s' to '%s'" % (orig, self.audio_file.path)) printMsg("-" * 79) except exceptions.Exception as ex: printError("Error: %s" % ex) log.error(traceback.format_exc()) if self.args.debug_pdb: import pdb; pdb.set_trace() raise StopIteration()
def printAudioInfo(self, info): if isinstance(info, mp3.Mp3AudioInfo): printMsg( boldText("Time: ") + "%s\tMPEG%d, Layer %s\t[ %s @ %s Hz - %s ]" % (utils.formatTime(info.time_secs), info.mp3_header.version, "I" * info.mp3_header.layer, info.bit_rate_str, info.mp3_header.sample_freq, info.mp3_header.mode)) printMsg("-" * 79)
def printAudioInfo(self, info): if isinstance(info, mp3.Mp3AudioInfo): printMsg(boldText("Time: ") + "%s\tMPEG%d, Layer %s\t[ %s @ %s Hz - %s ]" % (utils.formatTime(info.time_secs), info.mp3_header.version, "I" * info.mp3_header.layer, info.bit_rate_str, info.mp3_header.sample_freq, info.mp3_header.mode)) printMsg("-" * 79)
def handleDone(self): print("\nAnalyzed %d audio files (%d non-audio) (%d hidden)" % (self.count, self.non_audio_file_count, self.hidden_file_count)) if not self.count: return printMsg("\nMime-types:") types = list(self.mts.keys()) types.sort() for t in types: count = self.mts[t] percent = (float(count) / float(self.count)) * 100 printMsg("\t%s:%s (%%%.2f)" % (str(t).ljust(12), str(count).rjust(8), percent)) print("\nMP3 bitrates:") for key in ["cbr", "vbr"]: val = self.bitrates[key] print("\t%s : %d \t%.2f%%" % (key, val, (float(val) / float(self.count)) * 100)) for key in self.bitrate_keys: val = self.bitrates[key] key_op, key_br = key print("\t%s%03d : %d \t%.2f%%" % (_OP_STRINGS[key_op], key_br, val, (float(val) / float(self.count)) * 100)) print("\nID3 versions:") for v in ID3_VERSIONS: v_count = self.versions[v] v_percent = (float(v_count) / float(self.count)) * 100 print("\t%s : %d \t%.2f%%" % (id3.versionToString(v), v_count, v_percent))
def printTag(self, tag): if isinstance(tag, id3.Tag): if self.args.quiet: printMsg("ID3 %s: %d frames" % (id3.versionToString(tag.version), len(tag.frame_set))) return printMsg("ID3 %s:" % id3.versionToString(tag.version)) artist = tag.artist if tag.artist else u"" title = tag.title if tag.title else u"" album = tag.album if tag.album else u"" printMsg("%s: %s" % (boldText("title"), title)) printMsg("%s: %s" % (boldText("artist"), artist)) printMsg("%s: %s" % (boldText("album"), album)) for date, date_label in [ (tag.release_date, "release date"), (tag.original_release_date, "original release date"), (tag.recording_date, "recording date"), (tag.encoding_date, "encoding date"), (tag.tagging_date, "tagging date"), ]: if date: printMsg("%s: %s" % (boldText(date_label), str(date))) track_str = "" (track_num, track_total) = tag.track_num if track_num != None: track_str = str(track_num) if track_total: track_str += "/%d" % track_total genre = tag.genre genre_str = "%s: %s (id %s)" % (boldText("genre"), genre.name, str(genre.id)) if genre else u"" printMsg("%s: %s\t\t%s" % (boldText("track"), track_str, genre_str)) # PCNT play_count = tag.play_count if tag.play_count is not None: printMsg("%s %d" % (boldText("Play Count:"), play_count)) # POPM for popm in tag.popularities: printMsg("%s [email: %s] [rating: %d] [play count: %d]" % (boldText("Popularity:"), popm.email, popm.rating, popm.count)) # TBPM bpm = tag.bpm if bpm is not None: printMsg("%s %d" % (boldText("BPM:"), bpm)) # TPUB pub = tag.publisher if pub is not None: printMsg("%s %s" % (boldText("Publisher/label:"), pub)) # UFID for ufid in tag.unique_file_ids: printMsg("%s [%s] : %s" % \ (boldText("Unique File ID:"), ufid.owner_id, ufid.uniq_id.encode("string_escape"))) # COMM for c in tag.comments: printMsg("%s: [Description: %s] [Lang: %s]\n%s" % (boldText("Comment"), c.description or "", c.lang or "", c.text or "")) # USLT for l in tag.lyrics: printMsg("%s: [Description: %s] [Lang: %s]\n%s" % (boldText("Lyrics"), l.description or u"", l.lang or "", l.text)) # TXXX for f in tag.user_text_frames: printMsg("%s: [Description: %s]\n%s" % (boldText("UserTextFrame"), f.description, f.text)) # URL frames for desc, url in ( ("Artist URL", tag.artist_url), ("Audio source URL", tag.audio_source_url), ("Audio file URL", tag.audio_file_url), ("Internet radio URL", tag.internet_radio_url), ("Commercial URL", tag.commercial_url), ("Payment URL", tag.payment_url), ("Publisher URL", tag.publisher_url), ("Copyright URL", tag.copyright_url), ): if url: printMsg("%s: %s" % (boldText(desc), url)) # user url frames for u in tag.user_url_frames: printMsg("%s [Description: %s]: %s" % (u.id, u.description, u.url)) # APIC for img in tag.images: if img.mime_type != ImageFrame.URL_MIME_TYPE: printMsg("%s: [Size: %d bytes] [Type: %s]" % (boldText(img.picTypeToString(img.picture_type) + " Image"), len(img.image_data), img.mime_type)) printMsg("Description: %s" % img.description) printMsg("") if self.args.write_images_dir: img_path = "%s%s" % (self.args.write_images_dir, os.sep) if not os.path.isdir(img_path): raise IOError("Directory does not exist: %s" % img_path) img_file = self._getDefaultNameForImage(img) count = 1 while os.path.exists(os.path.join(img_path, img_file)): img_file = self._getDefaultNameForImage(img, str(count)) count += 1 printWarning("Writing %s..." % os.path.join(img_path, img_file)) with open(os.path.join(img_path, img_file), "wb") as fp: fp.write(img.image_data) else: printMsg("%s: [Type: %s] [URL: %s]" % (boldText(img.picTypeToString(img.picture_type) + " Image"), img.mime_type, img.image_url)) printMsg("Description: %s" % img.description) printMsg("") # GOBJ for obj in tag.objects: printMsg("%s: [Size: %d bytes] [Type: %s]" % (boldText("GEOB"), len(obj.object_data), obj.mime_type)) printMsg("Description: %s" % obj.description) printMsg("Filename: %s" % obj.filename) printMsg("\n") if self.args.write_objects_dir: obj_path = "%s%s" % (self.args.write_objects_dir, os.sep) if not os.path.isdir(obj_path): raise IOError("Directory does not exist: %s" % obj_path) obj_file = self._getDefaultNameForObject(obj) count = 1 while os.path.exists(os.path.join(obj_path, obj_file)): obj_file = self._getDefaultNameForObject(obj, str(count)) count += 1 printWarning("Writing %s..." % os.path.join(obj_path, obj_file)) with open(os.path.join(obj_path, obj_file), "wb") as fp: fp.write(obj.object_data) # PRIV for p in tag.privates: printMsg("%s: [Data: %d bytes]" % (boldText("PRIV"), len(p.data))) printMsg("Owner Id: %s" % p.owner_id) # MCDI if tag.cd_id: printMsg("\n%s: [Data: %d bytes]" % (boldText("MCDI"), len(tag.cd_id))) # USER if tag.terms_of_use: printMsg("\nTerms of Use (%s): %s" % (boldText("USER"), tag.terms_of_use)) if self.args.verbose: printMsg("-" * 79) printMsg("%d ID3 Frames:" % len(tag.frame_set)) for fid in tag.frame_set: num_frames = len(tag.frame_set[fid]) count = " x %d" % num_frames if num_frames > 1 else "" printMsg("%s%s" % (fid, count)) else: raise TypeError("Unknown tag type: " + str(type(tag)))
def handleDone(self): '''If no audio files were loaded this simply prints "Nothing to do".''' if self._num_loaded == 0: printMsg("Nothing to do")
def handleDone(self): if not self.albums: printMsg(u"No albums found.") return for album in self.albums: audio_files = self.albums[album] if not audio_files: continue audio_files.sort(key=lambda af: af.tag.track_num) max_title_len = 0 avg_bitrate = 0 encoder_info = '' for audio_file in audio_files: tag = audio_file.tag # Compute maximum title length title_len = len(tag.title) if title_len > max_title_len: max_title_len = title_len # Compute average bitrate avg_bitrate += audio_file.info.bit_rate[1] # Grab the last lame version in case not all files have one if "encoder_version" in audio_file.info.lame_tag: version = audio_file.info.lame_tag['encoder_version'] encoder_info = (version or encoder_info) avg_bitrate = avg_bitrate / len(audio_files) printMsg("") printMsg("Artist : %s" % audio_files[0].tag.artist) printMsg("Album : %s" % album) printMsg("Released : %s" % audio_files[0].tag.best_release_date) genre = audio_files[0].tag.genre if genre: genre = genre.name else: genre = "" printMsg("Genre : %s" % genre) printMsg("") printMsg("Source : ") printMsg("Encoder : %s" % encoder_info) printMsg("Codec : mp3") printMsg("Bitrate : ~%s K/s @ %s Hz, %s" % (avg_bitrate, audio_files[0].info.sample_freq, audio_files[0].info.mode)) printMsg("Tag : ID3 %s" % versionToString(audio_files[0].tag.version)) printMsg("") printMsg("Ripped By: ") printMsg("") printMsg("Track Listing") printMsg("-------------") count = 0 total_time = 0 total_size = 0 for audio_file in audio_files: tag = audio_file.tag count += 1 title = tag.title title_len = len(title) padding = " " * ((max_title_len - title_len) + 3) time_secs = audio_file.info.time_secs total_time += time_secs total_size += audio_file.info.size_bytes zero_pad = "0" * (len(str(len(audio_files))) - len(str(count))) printMsg( " %s%d. %s%s(%s)" % (zero_pad, count, title, padding, formatTime(time_secs))) printMsg("") printMsg("Total play time : %s" % formatTime(total_time)) printMsg("Total size : %s" % formatSize(total_size)) printMsg("") printMsg("=" * 78) printMsg(".NFO file created with eyeD3 %s on %s" % (VERSION, time.asctime())) printMsg("For more information about eyeD3 go to %s" % "http://eyeD3.nicfit.net/") printMsg("=" * 78)
def handleFile(self, f): super(Xep118Plugin, self).handleFile(f) if self.audio_file and self.audio_file.tag: xml = self.getXML(self.audio_file) printMsg(xml)
def handleDone(self): if not self.albums: printMsg(u"No albums found.") return for album in self.albums: audio_files = self.albums[album] if not audio_files: continue audio_files.sort(key=lambda af: af.tag.track_num) max_title_len = 0 avg_bitrate = 0 encoder_info = '' for audio_file in audio_files: tag = audio_file.tag # Compute maximum title length title_len = len(tag.title) if title_len > max_title_len: max_title_len = title_len # Compute average bitrate avg_bitrate += audio_file.info.bit_rate[1] # Grab the last lame version in case not all files have one if "encoder_version" in audio_file.info.lame_tag: version = audio_file.info.lame_tag['encoder_version'] encoder_info = (version or encoder_info) avg_bitrate = avg_bitrate / len(audio_files) printMsg("") printMsg("Artist : %s" % audio_files[0].tag.artist) printMsg("Album : %s" % album) printMsg("Released : %s" % audio_files[0].tag.best_release_date) genre = audio_files[0].tag.genre if genre: genre = genre.name else: genre = "" printMsg("Genre : %s" % genre) printMsg("") printMsg("Source : ") printMsg("Encoder : %s" % encoder_info) printMsg("Codec : mp3") printMsg("Bitrate : ~%s K/s @ %s Hz, %s" % (avg_bitrate, audio_files[0].info.sample_freq, audio_files[0].info.mode)) printMsg("Tag : ID3 %s" % versionToString(audio_files[0].tag.version)) printMsg("") printMsg("Ripped By: ") printMsg("") printMsg("Track Listing") printMsg("-------------") count = 0 total_time = 0 total_size = 0 for audio_file in audio_files: tag = audio_file.tag count += 1 title = tag.title title_len = len(title) padding = " " * ((max_title_len - title_len) + 3) time_secs = audio_file.info.time_secs total_time += time_secs total_size += audio_file.info.size_bytes zero_pad = "0" * (len(str(len(audio_files))) - len(str(count))) printMsg(" %s%d. %s%s(%s)" % (zero_pad, count, title, padding, formatTime(time_secs))) printMsg("") printMsg("Total play time : %s" % formatTime(total_time)) printMsg("Total size : %s" % formatSize(total_size)) printMsg("") printMsg("=" * 78) printMsg(".NFO file created with eyeD3 %s on %s" % (VERSION, time.asctime())) printMsg("For more information about eyeD3 go to %s" % "http://eyeD3.nicfit.net/") printMsg("=" * 78)
def handleDone(self): if self._num_loaded == 0: printMsg("Nothing to do")
def handleFile(self, f): super(LameInfoPlugin, self).handleFile(f) self.printHeader(f) if not self.audio_file or not self.audio_file.info.lame_tag: printMsg('No LAME Tag') return format = '%-20s: %s' lt = self.audio_file.info.lame_tag if not lt.has_key('infotag_crc'): try: printMsg('%s: %s' % ('Encoder Version', lt['encoder_version'])) except KeyError: pass return values = [] values.append(('Encoder Version', lt['encoder_version'])) values.append(('LAME Tag Revision', lt['tag_revision'])) values.append(('VBR Method', lt['vbr_method'])) values.append(('Lowpass Filter', lt['lowpass_filter'])) if lt.has_key('replaygain'): try: peak = lt['replaygain']['peak_amplitude'] db = 20 * math.log10(peak) val = '%.8f (%+.1f dB)' % (peak, db) values.append(('Peak Amplitude', val)) except KeyError: pass for type in ['radio', 'audiofile']: try: gain = lt['replaygain'][type] name = '%s Replay Gain' % gain['name'].capitalize() val = '%s dB (%s)' % (gain['adjustment'], gain['originator']) values.append((name, val)) except KeyError: pass values.append(('Encoding Flags', ' '.join((lt['encoding_flags'])))) if lt['nogap']: values.append(('No Gap', ' and '.join(lt['nogap']))) values.append(('ATH Type', lt['ath_type'])) values.append(('Bitrate (%s)' % lt['bitrate'][1], lt['bitrate'][0])) values.append(('Encoder Delay', '%s samples' % lt['encoder_delay'])) values.append( ('Encoder Padding', '%s samples' % lt['encoder_padding'])) values.append(('Noise Shaping', lt['noise_shaping'])) values.append(('Stereo Mode', lt['stereo_mode'])) values.append(('Unwise Settings', lt['unwise_settings'])) values.append(('Sample Frequency', lt['sample_freq'])) values.append( ('MP3 Gain', '%s (%+.1f dB)' % (lt['mp3_gain'], lt['mp3_gain'] * 1.5))) values.append(('Preset', lt['preset'])) values.append(('Surround Info', lt['surround_info'])) values.append(('Music Length', '%s' % formatSize(lt['music_length']))) values.append(('Music CRC-16', '%04X' % lt['music_crc'])) values.append(('LAME Tag CRC-16', '%04X' % lt['infotag_crc'])) for v in values: printMsg(format % (v))
def handleFile(self, f): super(LameInfoPlugin, self).handleFile(f) self.printHeader(f) if not self.audio_file or not self.audio_file.info.lame_tag: printMsg('No LAME Tag') return format = '%-20s: %s' lt = self.audio_file.info.lame_tag if not lt.has_key('infotag_crc'): try: printMsg('%s: %s' % ('Encoder Version', lt['encoder_version'])) except KeyError: pass return values = [] values.append(('Encoder Version', lt['encoder_version'])) values.append(('LAME Tag Revision', lt['tag_revision'])) values.append(('VBR Method', lt['vbr_method'])) values.append(('Lowpass Filter', lt['lowpass_filter'])) if lt.has_key('replaygain'): try: peak = lt['replaygain']['peak_amplitude'] db = 20 * math.log10(peak) val = '%.8f (%+.1f dB)' % (peak, db) values.append(('Peak Amplitude', val)) except KeyError: pass for type in ['radio', 'audiofile']: try: gain = lt['replaygain'][type] name = '%s Replay Gain' % gain['name'].capitalize() val = '%s dB (%s)' % (gain['adjustment'], gain['originator']) values.append((name, val)) except KeyError: pass values.append(('Encoding Flags', ' '.join((lt['encoding_flags'])))) if lt['nogap']: values.append(('No Gap', ' and '.join(lt['nogap']))) values.append(('ATH Type', lt['ath_type'])) values.append(('Bitrate (%s)' % lt['bitrate'][1], lt['bitrate'][0])) values.append(('Encoder Delay', '%s samples' % lt['encoder_delay'])) values.append(('Encoder Padding', '%s samples' % lt['encoder_padding'])) values.append(('Noise Shaping', lt['noise_shaping'])) values.append(('Stereo Mode', lt['stereo_mode'])) values.append(('Unwise Settings', lt['unwise_settings'])) values.append(('Sample Frequency', lt['sample_freq'])) values.append(('MP3 Gain', '%s (%+.1f dB)' % (lt['mp3_gain'], lt['mp3_gain'] * 1.5))) values.append(('Preset', lt['preset'])) values.append(('Surround Info', lt['surround_info'])) values.append(('Music Length', '%s' % formatSize(lt['music_length']))) values.append(('Music CRC-16', '%04X' % lt['music_crc'])) values.append(('LAME Tag CRC-16', '%04X' % lt['infotag_crc'])) for v in values: printMsg(format % (v))
def printTag(self, tag): if isinstance(tag, id3.Tag): if self.args.quiet: printMsg( "ID3 %s: %d frames" % (id3.versionToString(tag.version), len(tag.frame_set))) return printMsg("ID3 %s:" % id3.versionToString(tag.version)) artist = tag.artist if tag.artist else u"" title = tag.title if tag.title else u"" album = tag.album if tag.album else u"" printMsg("%s: %s" % (boldText("title"), title)) printMsg("%s: %s" % (boldText("artist"), artist)) printMsg("%s: %s" % (boldText("album"), album)) for date, date_label in [ (tag.release_date, "release date"), (tag.original_release_date, "original release date"), (tag.recording_date, "recording date"), (tag.encoding_date, "encoding date"), (tag.tagging_date, "tagging date"), ]: if date: printMsg("%s: %s" % (boldText(date_label), str(date))) track_str = "" (track_num, track_total) = tag.track_num if track_num != None: track_str = str(track_num) if track_total: track_str += "/%d" % track_total genre = tag.genre genre_str = "%s: %s (id %s)" % (boldText("genre"), genre.name, str(genre.id)) if genre else u"" printMsg("%s: %s\t\t%s" % (boldText("track"), track_str, genre_str)) # PCNT play_count = tag.play_count if tag.play_count is not None: printMsg("%s %d" % (boldText("Play Count:"), play_count)) # POPM for popm in tag.popularities: printMsg("%s [email: %s] [rating: %d] [play count: %d]" % (boldText("Popularity:"), popm.email, popm.rating, popm.count)) # TBPM bpm = tag.bpm if bpm is not None: printMsg("%s %d" % (boldText("BPM:"), bpm)) # TPUB pub = tag.publisher if pub is not None: printMsg("%s %s" % (boldText("Publisher/label:"), pub)) # UFID for ufid in tag.unique_file_ids: printMsg("%s [%s] : %s" % \ (boldText("Unique File ID:"), ufid.owner_id, ufid.uniq_id.encode("string_escape"))) # COMM for c in tag.comments: printMsg("%s: [Description: %s] [Lang: %s]\n%s" % (boldText("Comment"), c.description or "", c.lang or "", c.text or "")) # USLT for l in tag.lyrics: printMsg("%s: [Description: %s] [Lang: %s]\n%s" % (boldText("Lyrics"), l.description or u"", l.lang or "", l.text)) # TXXX for f in tag.user_text_frames: printMsg("%s: [Description: %s]\n%s" % (boldText("UserTextFrame"), f.description, f.text)) # URL frames for desc, url in ( ("Artist URL", tag.artist_url), ("Audio source URL", tag.audio_source_url), ("Audio file URL", tag.audio_file_url), ("Internet radio URL", tag.internet_radio_url), ("Commercial URL", tag.commercial_url), ("Payment URL", tag.payment_url), ("Publisher URL", tag.publisher_url), ("Copyright URL", tag.copyright_url), ): if url: printMsg("%s: %s" % (boldText(desc), url)) # user url frames for u in tag.user_url_frames: printMsg("%s [Description: %s]: %s" % (u.id, u.description, u.url)) # APIC for img in tag.images: if img.mime_type != ImageFrame.URL_MIME_TYPE: printMsg("%s: [Size: %d bytes] [Type: %s]" % (boldText( img.picTypeToString(img.picture_type) + " Image"), len(img.image_data), img.mime_type)) printMsg("Description: %s" % img.description) printMsg("") if self.args.write_images_dir: img_path = "%s%s" % (self.args.write_images_dir, os.sep) if not os.path.isdir(img_path): raise IOError("Directory does not exist: %s" % img_path) img_file = self._getDefaultNameForImage(img) count = 1 while os.path.exists(os.path.join(img_path, img_file)): img_file = self._getDefaultNameForImage( img, str(count)) count += 1 printWarning("Writing %s..." % os.path.join(img_path, img_file)) with open(os.path.join(img_path, img_file), "wb") as fp: fp.write(img.image_data) else: printMsg("%s: [Type: %s] [URL: %s]" % (boldText( img.picTypeToString(img.picture_type) + " Image"), img.mime_type, img.image_url)) printMsg("Description: %s" % img.description) printMsg("") # GOBJ for obj in tag.objects: printMsg( "%s: [Size: %d bytes] [Type: %s]" % (boldText("GEOB"), len(obj.object_data), obj.mime_type)) printMsg("Description: %s" % obj.description) printMsg("Filename: %s" % obj.filename) printMsg("\n") if self.args.write_objects_dir: obj_path = "%s%s" % (self.args.write_objects_dir, os.sep) if not os.path.isdir(obj_path): raise IOError("Directory does not exist: %s" % obj_path) obj_file = self._getDefaultNameForObject(obj) count = 1 while os.path.exists(os.path.join(obj_path, obj_file)): obj_file = self._getDefaultNameForObject( obj, str(count)) count += 1 printWarning("Writing %s..." % os.path.join(obj_path, obj_file)) with open(os.path.join(obj_path, obj_file), "wb") as fp: fp.write(obj.object_data) # PRIV for p in tag.privates: printMsg("%s: [Data: %d bytes]" % (boldText("PRIV"), len(p.data))) printMsg("Owner Id: %s" % p.owner_id) # MCDI if tag.cd_id: printMsg("\n%s: [Data: %d bytes]" % (boldText("MCDI"), len(tag.cd_id))) # USER if tag.terms_of_use: printMsg("\nTerms of Use (%s): %s" % (boldText("USER"), tag.terms_of_use)) if self.args.verbose: printMsg("-" * 79) printMsg("%d ID3 Frames:" % len(tag.frame_set)) for fid in tag.frame_set: num_frames = len(tag.frame_set[fid]) count = " x %d" % num_frames if num_frames > 1 else "" printMsg("%s%s" % (fid, count)) else: raise TypeError("Unknown tag type: " + str(type(tag)))