summaryrefslogtreecommitdiffstats
path: root/fix_sort_artist.py
blob: 405c88004f5ea9e3fb2442989e654ea354d65a8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#! /usr/bin/python

#
# Script to correct artist & artistsort tags in Ogg Vorbis &
# mp3 files where the artist tag is formatted as "Brown, James" or "Smiths, The"
#
# User needs to have python-eyed3 & python-vorbis installed.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# Copyright (C) 2010 Brian Pepple <bpepple@fedoraproject.org>

import os
import sys
import re
import ogg.vorbis
import eyeD3

def cleanup_tag(s):
	# Remove the ([u') & (']) from the vorbis tag
	pattobj1 = re.compile("\[u'")
	pattobj2 = re.compile("'\]")
	tag = re.sub(pattobj1, "", s)
	tag = re.sub(pattobj2, "", tag)
	return tag

def get_original_artist_tag(f):
	vf = ogg.vorbis.VorbisFile(f)
	tag = str(vf.comment().as_dict().get('ARTIST'))
	tag = cleanup_tag(tag)
	return tag

def write_tag(f, artist, sort):
	vf = ogg.vorbis.VorbisFile(f)
	vc = vf.comment()
	nc = ogg.vorbis.VorbisComment()
	for x in vc.items():
		# Don't save the original artist or artistsort
		# tag to prevent any duplicate values
		if x[0] is not ('ARTIST' or 'ARTISTSORT'):
			nc.add_tag(x[0], x[1].encode('utf-8'))
	nc.add_tag('ARTIST', artist)
	nc.add_tag('ARTISTSORT', sort)
	nc.write_to(f)
	
def process_dir(currdir):
	print '[' + currdir + ']'
	for f in os.listdir(currdir):
		path = os.path.join(currdir, f)
		if not os.path.isdir(path):
			if f.endswith('.ogg') or f.endswith('.oga'):
				# Have the original artist tag become the
				# sort tag since I've been consistent in
				# tagging the artist as 'Smiths, The'
				sort_tag = get_original_artist_tag(path)
				s = sort_tag
				line = s.split(', ')
				try:
					artist_tag = line[1] + " " + line[0]
					write_tag(path, artist_tag, sort_tag)
					print 'File: %s | Artist: %s | Sort: %s' % (f, artist_tag, sort_tag)
				except IndexError:
					print "File: %s does not need to be fixed. " % (f)
			if f.endswith('.mp3'):
				tag = eyeD3.Tag()
				tag.link(path)
				s = tag.getArtist()
				line = s.split(', ')
				try:
					new_artist = line[1] + " " + line[0]
					tag.setArtist(new_artist)
					tag.setTextFrame("TSOP", str(s))
					tag.update()
					print "File: %s | Artist: %s | Sort: %s" % (f, new_artist, s)
				except IndexError:
					print "File: %s does not need to be fixed. " % (f)
		else:
			process_dir(path)

if __name__=='__main__':
	if len(sys.argv) != 2:
		print 'Usage: sort_artist_fix.py directory'
		sys.exit(0)

	process_dir(sys.argv[1])