def calculateSilences(self, threshold=None, min_length=None): try: audio_segment = AudioSegment.from_file(self.path()) except PydubException as exc: print('Error processing:', self.path(), ':', exc) raise self._audioSha256sum = calculateSHA256_data(audio_segment.raw_data) thr = threshold or Song.silence_threshold minlen = min_length or Song.min_silence_length silences = detect_silence_at_beginning_and_end(audio_segment, min_silence_len=minlen, silence_thresh=thr) if silences: silence1, silence2 = silences self._silenceAtStart = (silence1[1] - silence1[0]) / 1000 self._silenceAtEnd = (silence2[1] - silence2[0]) / 1000
def calculateSilences(self, threshold=None, min_length=None): try: audio_segment = AudioSegment.from_file(self.path()) except: print('Error processing:',path) raise self._audioSha256sum = calculateSHA256_data(audio_segment.raw_data) thr = threshold or Song.silence_threshold minlen = min_length or Song.min_silence_length silences = detect_silence_at_beginning_and_end(audio_segment, min_silence_len=minlen, silence_thresh=thr) if silences: silence1, silence2 = silences self._silenceAtStart = (silence1[1] - silence1[0]) / 1000 self._silenceAtEnd = (silence2[1] - silence2[0]) / 1000
def remoteFileAudioSha256Sum(path, sftp): data = remoteFile(path, sftp) if not data: return None audio_segment = AudioSegment.from_file(data) return calculateSHA256_data(audio_segment.raw_data)
def loadFile(self, filething): fileinfo = filething if isinstance(filething, str) \ else 'file-like object' if hasattr(filething, 'seek'): filething.seek(0) try: # if path.lower().endswith('.ape') or # path.lower().endswith('.wma') or # path.lower().endswith('.m4a') or # path.lower().endswith('.mp3'): self.metadata = mutagen.File(filething) # else: # self.metadata = mutagen.File(filething, easy=True) except mutagen.mp3.HeaderNotFoundError as e: print( TerminalColors.Error + "Error" + TerminalColors.ENDC + " reading %s:" % filething, e) raise if not self.metadata: print("No metadata found for %s : " "This will probably cause problems" % filething) formattext = { mutagen.mp3.EasyMP3: 'mp3', mutagen.mp3.MP3: 'mp3', mutagen.easymp4.EasyMP4: 'mp4', mutagen.mp4.MP4: 'mp4', mutagen.asf.ASF: 'asf', mutagen.flac.FLAC: 'flac', mutagen.oggvorbis.OggVorbis: 'ogg', mutagen.oggopus.OggOpus: 'opus', mutagen.wavpack.WavPack: 'wv', mutagen.monkeysaudio.MonkeysAudio: 'ape', mutagen.musepack.Musepack: 'mpc', } self._format = formattext[type(self.metadata)] # try: # if hasattr(filething, 'seek'): # filething.seek(0) # # Workaround for pydub closing filething # #backup = filething.close # #filething.close = lambda: None # # audio_segment = AudioSegment.from_file(filething) # # #if hasattr(filething, 'seek'): # # filething.close = backup # except: # print('Error processing:', fileinfo) # raise # self._audioSha256sum = calculateSHA256_data(audio_segment.raw_data) # if hasattr(filething, 'seek'): # filething.seek(0) # try: # self._audioSha256sum, audiodata, properties = \ # calculateAudioTrackSHA256_pyav(filething) # except ValueError as exc: # print(f'Error processing {fileinfo}: {exc}') # raise audiodata, properties = decodeAudio(filething) self._audioSha256sum = calculateSHA256_data(audiodata) self._decode_properties = properties if properties.messages: print('\n'.join([str(x) for x in properties.messages])) if self.metadata: if not getattr(self.metadata.info, 'bits_per_sample', None): self.metadata.info.bits_per_sample = \ properties.decoded_bytes_per_sample * 8 if not getattr(self.metadata.info, 'bitrate', None): self.metadata.info.bitrate = (properties.stream_bitrate or properties.container_bitrate) if config['enable_internal_checks']: ffprobe_metadata = FFProbeMetadata(self.path()) try: tmp_bits = int( ffprobe_metadata['streams.stream.0.bits_per_raw_sample']) except ValueError: print("ffprobe doesn't provide bits per sample") else: if self.metadata.info.bits_per_sample != tmp_bits: msg = ('bits_per_sample different! ' 'ffprobe: %d != bard_audiofile: %d' % (tmp_bits, self.metadata.info.bits_per_sample)) raise Exception(msg) tmp_bitrate = int(ffprobe_metadata['format.bit_rate']) if (properties.stream_bitrate != tmp_bitrate and properties.container_bitrate != tmp_bitrate): msg = ( 'bit_rate different! ffprobe: %d != bard_audiofile: %d' % (tmp_bitrate or 0, properties.bitrate or 0)) raise Exception(msg) print('ffprobe check ' + TerminalColors.Ok + 'OK' + TerminalColors.ENDC) try: audio_segment = audioSegmentFromDataProperties( audiodata, properties) except ValueError as exc: print(f'Error processing {fileinfo}: {exc}') raise thr = Song.silence_threshold minlen = Song.min_silence_length silences = detect_silence_at_beginning_and_end(audio_segment, min_silence_len=minlen, silence_thresh=thr) if silences: silence1, silence2 = silences self._silenceAtStart = (silence1[1] - silence1[0]) / 1000 self._silenceAtEnd = (silence2[1] - silence2[0]) / 1000 if self.metadata: try: image = extractFrontCover(self.metadata) except OSError: print('Error extracting image from %s' % fileinfo) raise if image: (image, imagedata) = image self._coverWidth = image.width self._coverHeight = image.height self._coverMD5 = md5FromData(imagedata) try: self._mtime = os.path.getmtime(filething) except TypeError: self._mtime = None self._fileSha256sum = calculateFileSHA256(filething) self.fingerprint = self.getAcoustidFingerprint_data( audiodata, properties) if self.metadata and getattr(self.metadata, 'cuesheet', None): for track in self.metadata.cuesheet.tracks: if (track.track_number == 255 or track.start_offset == self.metadata.info.total_samples): # noqa continue timepos = (self.metadata.info.length * track.start_offset / self.metadata.info.total_samples) try: title = self.metadata['SUBTRACKTITLES'][track.track_number - 1] # noqa except (KeyError, IndexError): title = None ct = CueTrack(track.track_number, track.start_offset, timepos, title) self.cuesheet.append(ct) self.isValid = True
def loadFile(self, path): try: # if path.lower().endswith('.ape') or # path.lower().endswith('.wma') or # path.lower().endswith('.m4a') or # path.lower().endswith('.mp3'): self.metadata = mutagen.File(path) # else: # self.metadata = mutagen.File(path, easy=True) except mutagen.mp3.HeaderNotFoundError as e: print("Error reading %s:" % path, e) raise if not self.metadata: print("No metadata found for %s : " "This will probably cause problems" % path) formattext = { mutagen.mp3.EasyMP3: 'mp3', mutagen.mp3.MP3: 'mp3', mutagen.easymp4.EasyMP4: 'mp4', mutagen.mp4.MP4: 'mp4', mutagen.asf.ASF: 'asf', mutagen.flac.FLAC: 'flac', mutagen.oggvorbis.OggVorbis: 'ogg', mutagen.wavpack.WavPack: 'wv', mutagen.monkeysaudio.MonkeysAudio: 'ape', mutagen.musepack.Musepack: 'mpc', } self._format = formattext[type(self.metadata)] try: audio_segment = AudioSegment.from_file(path) except: print('Error processing:',path) raise self._audioSha256sum = calculateSHA256_data(audio_segment.raw_data) thr = Song.silence_threshold minlen = Song.min_silence_length silences = detect_silence_at_beginning_and_end(audio_segment, min_silence_len=minlen, silence_thresh=thr) if silences: silence1, silence2 = silences self._silenceAtStart = (silence1[1] - silence1[0]) / 1000 self._silenceAtEnd = (silence2[1] - silence2[0]) / 1000 # self.loadCoverImageData(path) try: image = extractFrontCover(self.metadata) except OSError: print('Error extracting image from %s' % path) raise if image: (image, data) = image self._coverWidth = image.width self._coverHeight = image.height self._coverMD5 = md5FromData(data) self._mtime = os.path.getmtime(path) self._fileSha256sum = calculateFileSHA256(path) self.fingerprint = self.getAcoustidFingerprint() self.isValid = True
def loadFile(self, path): try: # if path.lower().endswith('.ape') or # path.lower().endswith('.wma') or # path.lower().endswith('.m4a') or # path.lower().endswith('.mp3'): self.metadata = mutagen.File(path) # else: # self.metadata = mutagen.File(path, easy=True) except mutagen.mp3.HeaderNotFoundError as e: print("Error reading %s:" % path, e) raise if not self.metadata: print("No metadata found for %s : " "This will probably cause problems" % path) formattext = { mutagen.mp3.EasyMP3: 'mp3', mutagen.mp3.MP3: 'mp3', mutagen.easymp4.EasyMP4: 'mp4', mutagen.mp4.MP4: 'mp4', mutagen.asf.ASF: 'asf', mutagen.flac.FLAC: 'flac', mutagen.oggvorbis.OggVorbis: 'ogg', mutagen.wavpack.WavPack: 'wv', mutagen.monkeysaudio.MonkeysAudio: 'ape', mutagen.musepack.Musepack: 'mpc', } self._format = formattext[type(self.metadata)] try: audio_segment = AudioSegment.from_file(path) except: print('Error processing:', path) raise self._audioSha256sum = calculateSHA256_data(audio_segment.raw_data) thr = Song.silence_threshold minlen = Song.min_silence_length silences = detect_silence_at_beginning_and_end(audio_segment, min_silence_len=minlen, silence_thresh=thr) if silences: silence1, silence2 = silences self._silenceAtStart = (silence1[1] - silence1[0]) / 1000 self._silenceAtEnd = (silence2[1] - silence2[0]) / 1000 # self.loadCoverImageData(path) try: image = extractFrontCover(self.metadata) except OSError: print('Error extracting image from %s' % path) raise if image: (image, data) = image self._coverWidth = image.width self._coverHeight = image.height self._coverMD5 = md5FromData(data) self._mtime = os.path.getmtime(path) self._fileSha256sum = calculateFileSHA256(path) self.fingerprint = self.getAcoustidFingerprint() self.isValid = True