7 sys
.path
.append(os
.path
.expanduser("~/src/ql/trunk/mutagen"))
10 SUPPORTED_EXTENSIONS
= '.mp3'
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
29 accept
= lambda e
: e
== ext
30 for r
,ds
,fs
in os
.walk(top
):
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
)
43 self
.window
= gtk
.Window()
44 self
.window
.set_title('sync')
45 self
.window
.connect('destroy', gtk
.main_quit
)
49 scroll
= gtk
.ScrolledWindow()
50 scroll
.set_policy(gtk
.POLICY_AUTOMATIC
,gtk
.POLICY_AUTOMATIC
)
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)
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) )
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
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
]
99 if (model
[i
][LOCATION
] != INCOMING
) or self
.want_file_gone(model
[i
][TITLE
]):
100 os
.remove(model
[i
][FULLPATH
])
106 tags
= mutagen
.File(t
).tags
108 return "%s (%s)" % (tags
['TIT2'], tags
['TALB'])
112 return os
.path
.basename(t
)
115 LOC
[DEVICE
] = sys
.argv
[1]
116 LOC
[INCOMING
] = sys
.argv
[2]
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
])