#!/usr/bin/python # # Script to fix MP3 double zero offset Main Data Begin frame problem. # This causes problems for iTunes 6.0.2 when they appear in the middle # of an MP3 file. However, as any file may be joined with other MP3 # files, this script will remove all occurrances of this problem. # # This script does not actually do the edits. It creates the mpgedit # command line that you must execute to fix the file being checked. # # Copyright (C) 2006 Adam Bernstein # import sys import os if __name__ == "__main__": try: fname = sys.argv[1] except IndexError: sys.exit("usage: %s mp3_name" % sys.argv[0]) try: fp = open(fname, 'rb') except IOError: sys.exit("Unable to open mp3 file '%s'" % fname) fp.close() parts = fname.split('.') outfile = "%s_fixed.%s" %(parts[0], parts[1]) count = 0 prev_mdb = -1 cur_mdb = -1 prev_header = '' cur_header = '' edit_start = '' edit_end = '' first = 1 err_found = 0 edit = '\\\n -e' # Make sure mpgedit version is 0.72 or better # for line in os.popen("mpgedit -V"): if line.find(' version ') != -1: parts = line.split() print parts[2] ver_parts = parts[2].split('.') if int(ver_parts[0]) == 0 and int(ver_parts[1]) < 72: sys.exit("fixmdb.py requires mpgedit 0.72 beta or better") # Can't use -I here, because it is off by 1 frame. This is an mpgedit # bug that needs fixing. # # cmd = "mpgedit -I -vvv %s" % fname cmd = "mpgedit -vvv %s" % fname try: for line in os.popen(cmd): if line.startswith('MPEG header t='): if not prev_header: prev_header = line cur_header = line else: prev_header = cur_header cur_header = line if line.startswith('MainDataBegin:'): if line[14:].startswith(' 0'): print "%5d: %s" % (count, line), if cur_mdb == -1: cur_mdb = count else: prev_mdb = cur_mdb cur_mdb = count # print "cur_mdb=%d prev_mdb=%d" %(cur_mdb, prev_mdb) testval = prev_mdb + 1 if testval == count: err_found = 1 # print "Found offending MDB value!" # print prev_header # print cur_header prev_parts = prev_header.split('t=') prev_tparts = prev_parts[1].split('s') tprev = prev_tparts[0] cur_parts = cur_header.split('t=') cur_tparts = cur_parts[1].split('s') tcur = cur_tparts[0] if first: first = 0 edit = edit + tprev + '-' else: edit = edit + tprev + ' \\\n -e' + tcur + '-' print '' count += 1 except IOError: sys.exit("Unable to open mp3 file") # Print the edit command line. # if err_found: print("Copy/paste the following mpgedit command:\n") print "mpgedit -o %s %s %s" %(outfile, edit, fname) else: print("\nMP3 file '%s' is okay" % fname)