append album to title if present
[riffle.git] / sync.py
blobba143c58d3b89ea519237a75ed8d119228cf65be
1 #!/usr/bin/env python
2 import gtk
3 import os, sys
5 try: import mutagen
6 except ImportError:
7 sys.path.append(os.path.expanduser("~/src/ql/trunk/mutagen"))
8 import mutagen
10 SUPPORTED_EXTENSIONS = '.mp3'
11 # list store columns
12 TITLE=0
13 BACKGROUND=1
14 FULLPATH=2
15 LOCATION=3
16 # locations
17 INCOMING = 0
18 DEVICE = 1
19 # actual paths
20 LOC = {}
21 LOC[INCOMING] = "media"
22 LOC[DEVICE] = "device"
25 def list_files(top, ext):
26 if isinstance(ext,list):
27 accept = lambda e: e in ext
28 else:
29 accept = lambda e: e == ext
30 for r,ds,fs in os.walk(top):
31 for f in fs:
32 if accept( os.path.splitext(f)[1] ):
33 yield os.path.join(r,f)
35 def get_device_tracks():
36 return list_files(LOC[DEVICE], SUPPORTED_EXTENSIONS)
38 def get_incoming_tracks():
39 return list_files(LOC[INCOMING], SUPPORTED_EXTENSIONS)
41 class Sync:
42 def __init__(self):
43 self.window = gtk.Window()
44 self.window.set_title('sync')
45 self.window.connect('destroy', gtk.main_quit)
47 vbox = gtk.VBox()
49 scroll = gtk.ScrolledWindow()
50 scroll.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
51 vbox.add(scroll)
53 self.main_list = gtk.TreeView()
54 self.main_list.set_headers_visible(False)
55 self.main_list.set_reorderable(True)
56 self.main_list.connect("key-press-event", self.on_key_press)
57 self.main_list.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
59 text_renderer = gtk.CellRendererText()
60 column = gtk.TreeViewColumn("track", text_renderer)
61 column.add_attribute(text_renderer, "text", TITLE)
62 column.add_attribute(text_renderer, "background", BACKGROUND)
64 self.main_list.append_column( column )
65 scroll.add(self.main_list)
67 go_button = gtk.Button('Go!')
68 go_button.connect("clicked", self.do_sync)
69 vbox.add_with_properties(go_button,'expand',False)
71 self.window.add(vbox)
73 self.window.resize(400,600)
74 self.window.show_all()
76 def add_entries(self, lst):
77 if self.main_list.get_model() is None:
78 self.main_list.set_model( gtk.ListStore(str,str,str,int) )
79 for i in lst:
80 self.main_list.get_model().append( i )
82 def do_sync(self,*argv):
83 for row in self.main_list.get_model():
84 if row[LOCATION] == INCOMING:
85 os.system( "mv %s %s" % (row[FULLPATH], LOC[DEVICE]) )
87 def on_key_press(self,widget,event,*argv):
88 if event.keyval in (gtk.keysyms.Delete , gtk.keysyms.KP_Delete):
89 self.delete_selected()
91 def want_file_gone(self, title):
92 print "Do you also want to delete track '%s' from incoming directory?" % title
93 return False
95 def delete_selected(self):
96 model,indexes = self.main_list.get_selection().get_selected_rows()
97 iters = [model.get_iter(i) for i in indexes]
98 for i in iters:
99 if (model[i][LOCATION] != INCOMING) or self.want_file_gone(model[i][TITLE]):
100 os.remove(model[i][FULLPATH])
101 model.remove( i )
104 def track_title(t):
105 try:
106 tags = mutagen.File(t).tags
107 if 'TALB' in tags:
108 return "%s (%s)" % (tags['TIT2'], tags['TALB'])
109 else:
110 return tags['TIT2']
111 except:
112 return os.path.basename(t)
114 try:
115 LOC[DEVICE] = sys.argv[1]
116 LOC[INCOMING] = sys.argv[2]
117 except IndexError:
118 pass
120 app = Sync()
121 for entry in [(track_title(t),'#d0d0f0',t,DEVICE) for t in get_device_tracks()]:
122 app.add_entries([entry])
123 for entry in [(track_title(t),'#90ff90',t,INCOMING) for t in get_incoming_tracks()]:
124 app.add_entries([entry])
125 gtk.main()