def split_audio_file(self, file=""):
file_root, file_ext = os.path.splitext(file)
file_format = file_ext.replace(".", "").lower()
if file_format not in ["mp3", "m4a", "mp4"]:
raise FileNotSupportedError(file_format)
file_size = os.path.getsize(file)
if file_size > self.MAX_CONVERT_FILE_SIZE:
raise FileTooLargeError(file_size)
file_parts = []
if file_size <= self.MAX_TG_FILE_SIZE:
if file_format == "mp3":
file_parts.append(file)
else:
logger.info("Converting: %s", file)
try:
sound = AudioSegment.from_file(file, file_format)
file_converted = file.replace(file_ext, ".mp3")
sound.export(file_converted, format="mp3")
del sound
gc.collect()
file_parts.append(file_converted)
except (OSError, MemoryError) as exc:
gc.collect()
raise FileNotConvertedError
else:
logger.info("Splitting: %s", file)
try:
id3 = mutagen.id3.ID3(file, translate=False)
except:
id3 = None
parts_number = file_size // self.MAX_TG_FILE_SIZE + 1
try:
sound = AudioSegment.from_file(file, file_format)
part_size = len(sound) / parts_number
for i in range(parts_number):
file_part = file.replace(file_ext, ".part{}{}".format(str(i + 1), file_ext))
part = sound[part_size * i:part_size * (i + 1)]
part.export(file_part, format="mp3")
del part
gc.collect()
if id3:
try:
id3.save(file_part, v1=2, v2_version=4)
except:
pass
file_parts.append(file_part)
# https://github.com/jiaaro/pydub/issues/135
# https://github.com/jiaaro/pydub/issues/89#issuecomment-75245610
del sound
gc.collect()
except (OSError, MemoryError) as exc:
gc.collect()
raise FileConvertedPartiallyError(file_parts)
return file_parts
评论列表
文章目录