def rebuild_database(self): from time import time as systime systime1 = systime() #Tempory Database connection for thread conn = sqlite3.connect(self.dblocation) cursor = conn.cursor() trackparser = TrackMetaData() #clear out current database cursor.execute("DELETE FROM Songs") for libraryfolder in self.libraryfolders: libraryfolder = libraryfolder.replace('file://', '').replace( '%20', ' ') #simple but is a bit slow if os.path.isdir(libraryfolder): for root, dirs, files in scandir.walk(libraryfolder): for name in files: metadata = trackparser.getTrackType( os.path.join(root, name)) if metadata != False: #escape single quotes for sql query metadata[2] = metadata[2].replace("'", "''") #Title metadata[3] = metadata[3].replace("'", "''") #Artist metadata[4] = metadata[4].replace("'", "''") #Album metadata[6] = metadata[6].replace("'", "''") #Genre metadata[7] = metadata[7].replace("'", "''") #Url #build query and encode to ascii for python 2 #query = "INSERT INTO Songs(TrackNum,Title,Artist,Album,Length,Genre,Url) VALUES ({},'{}','{}','{}','{}','{}','{}');".format(metadata[1],metadata[2].encode('ascii','ignore'),metadata[3].encode('ascii','ignore'),metadata[4].encode('ascii','ignore'),metadata[5].encode('ascii','ignore'),metadata[6].encode('ascii','ignore'),metadata[7]) #since we truncate anyway, checking for existing entrys is redundant for now """cursor.execute("SELECT * FROM Songs WHERE Url='{}'".format(metadata[7])) if cursor.fetchone() == None: query = "INSERT INTO Songs(TrackNum,Title,Artist,Album,Length,Genre,Url) VALUES ({},'{}','{}','{}','{}','{}','{}');".format(metadata[1],metadata[2],metadata[3],metadata[4],metadata[5],metadata[6],metadata[7]) cursor.execute(query) else: query = "UPDATE Songs SET TrackNum='{}',Title='{}',Artist='{}',Album='{}',Length='{}',Genre='{}' WHERE Url='{}';".format(metadata[1],metadata[2],metadata[3],metadata[4],metadata[5],metadata[6],metadata[7]) cursor.execute(query)""" query = "INSERT INTO Songs(TrackNum,Title,Artist,Album,Length,Genre,Url) VALUES ({},'{}','{}','{}','{}','{}','{}');".format( metadata[1], metadata[2], metadata[3], metadata[4], metadata[5], metadata[6], metadata[7]) cursor.execute(query) conn.commit() print("%s%f" % ("Operation took ", systime() - systime1))
def __init__(self): self.sw = Gtk.ScrolledWindow() self.trackparser = TrackMetaData() builder = Gtk.Builder() filename = os.path.join('data', 'treeview.ui') builder.add_from_file(filename) self.abox = builder.get_object('treeview1') self.abox.set_fixed_height_mode(False) self.abox.set_search_column(1) self.abox.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) trackCol = builder.get_object('trackCol') titleCol = builder.get_object('titleCol') artistCol = builder.get_object('artistCol') albumCol = builder.get_object('albumCol') lengthCol = builder.get_object('lengthCol') genreCol = builder.get_object('genreCol') pathCol = builder.get_object('pathCol') #need to figure a working sorting function #self.abox.get_model().set_sort_func(1, self.tracknumsortfunc, None) trackCol.set_sort_column_id(1) titleCol.set_sort_column_id(2) artistCol.set_sort_column_id(3) albumCol.set_sort_column_id(4) lengthCol.set_sort_column_id(5) genreCol.set_sort_column_id(6) #anEntry = Gtk.TargetEntry.new("abox",Gtk.TargetFlags.SAME_WIDGET, 10) self.abox.enable_model_drag_source( Gdk.ModifierType.BUTTON1_MASK, [ ('TREE_MODEL_ROW', Gtk.TargetFlags.SAME_WIDGET, 0), ], Gdk.DragAction.COPY | Gdk.DragAction.MOVE) #self.abox.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [anEntry], 0) self.abox.enable_model_drag_dest([], Gdk.DragAction.COPY | Gdk.DragAction.DEFAULT) #self.abox.drag_dest_set(0, [], 0) self.abox.connect('drag_motion', self.drag_motion_cb) self.abox.connect('drag_drop', self.drop_cb) self.abox.connect('drag_data_received', self.got_data_cb) self.abox.connect("drag_data_get", self.drag_data_get_data) self.abox.connect('button_press_event', self.on_button_press) self.abox.connect('button_release_event', self.on_button_release) self.defer_select = False self.sw.add(self.abox)
def __init__(self): #Global Variables (keep to a minimum) self.settings = settings.IconoSettings(sopranoGlobals.SETTINGS_DATA) self.taglookup = TrackMetaData() self.seekingnow = False #load settings self.currentview, self.winwidth, self.winheight, self.defaultexplorer, self.shuffle, self.repeat, self.showtrayicon, self.closetotray = self.settings.get_settings() libraryFolderlist = settings.IconoPrefs(sopranoGlobals.LIBRARY_DATA) self.SopranoDB = MusicDB(os.path.join(sopranoGlobals.CONFIGDIR, 'sopranoDB.db')) libraryFolderlist.add_radio(('/media/Media/Music','/media/Media/Music')) for key,value in libraryFolderlist.get_radioStations().items(): self.SopranoDB.add_folder(value) #turn on the dbus mainloop for sound menu from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) #Start Sound Menu Support self.sopranompris = SoundMenuControls("soprano-player") self.sopranompris.signal_next = self.play_next self.sopranompris.signal_prev = self.play_prev self.sopranompris.signal_play_pause = self.play_pause self.sopranompris.signal_raise = self.toggle_window #Enable Notifications Notify.init ("Soprano") self.notification = Notify.Notification.new("","","") #Window Creation self.builder = Gtk.Builder() filename = os.path.join('data', 'MainWindow.glade') self.builder.add_from_file(filename) self.builder.connect_signals(self) self.window = self.builder.get_object('win-main') self.window.set_default_size(self.winwidth,self.winheight) self.window.connect('delete-event', self.pre_exit) #radiowindow self.aRadio = IconoRadio() #Gstreamer sink self.player = MusicPlayer() self.player.on_eos(self.on_message) #media keys setup self.mediakeys = mediakeys(self.play_prev, self.play_pause, self.play_next) timer = GObject.timeout_add(500, self.update_time_items) #trayicon self.tray = IconoTray("soprano-player-tray") self.trayshowhide = self.tray.add_menu_item(self.toggle_window, "Hide/Show") self.tray.add_seperator() self.trayplaypause = self.tray.add_menu_item(self.play_pause, "Play/Pause") self.tray.add_menu_item(self.play_next, "Next") self.tray.add_menu_item(self.play_prev, "Previous") self.tray.add_seperator() self.tray.add_menu_item(self.on_exit, "Quit") self.update_tray_icon(self.showtrayicon) #View Menu# menuvfull = self.builder.get_object('menu-mode-full') menuvfull.connect('activate', self.to_full_mode) menuvmini = self.builder.get_object('menu-mode-mini') menuvmini.connect('activate', self.to_mini_mode) menuvplist = self.builder.get_object('menu-mode-playlist') menuvplist.connect('activate', self.to_playlist_mode) #Quit, About Menus menuaqt = self.builder.get_object('menu-quit') menuaqt.connect('activate',self.on_exit) menuabt = self.builder.get_object('menu-about') menuabt.connect('activate', aboutBoxShow, self.window) #Edit Menu# menuaddfolder = self.builder.get_object('menu-folderadd') #menuaddfolder.connect('activate', lambda x: self.addFolderExplorer(('Video','/media/Media/Videos'))) menuaddfolder.connect('activate', self.show_pref_win) menuaddradio = self.builder.get_object('menu-radioadd') #menuaddradio.connect('activate', lambda x: self.delFolderExplorer(('Video','/media/Media/Videos'))) menuaddradio.connect('activate', self.aRadio.addStationDialog) self.menuautopop = self.builder.get_object('menu-autopop') #playing Toolbar self.toolnext = self.builder.get_object('btn-next') self.toolnext.connect('clicked', self.play_next) self.toolprev = self.builder.get_object('btn-previous') self.toolprev.connect('clicked', self.play_prev) self.toolstop = self.builder.get_object('btn-stop') self.toolstop.connect('clicked', self.stop_play) self.toolplay = self.builder.get_object('btn-play') self.toolplay.connect('clicked', self.play_pause) self.toolSeekBar = self.builder.get_object('scl-position') self.toolSeekBar.connect('button-release-event', self.seek) self.toolSeekBar.connect('button-press-event', self.seekevent) self.toolVolume = self.builder.get_object('btn-volume') self.toolVolume.connect('value-changed', self.change_volume) #Text Displays self.titleText = self.builder.get_object('lbl-trkTitle') self.infoText = self.builder.get_object('lbl-trkMisc') self.lengthLabel = self.builder.get_object('lbl-length') self.elapsedLabel = self.builder.get_object('lbl-elapsed') #bottom toolbar barclr = self.builder.get_object('btn-tracklistClear') barclr.connect('clicked', self.clear_liststore) barshfl = self.builder.get_object('btn-tracklistShuffle') if self.shuffle == True: barshfl.set_active(True) barshfl.connect('clicked', self.shuffleliststore) barrpt = self.builder.get_object('btn-tracklistRepeat') if self.repeat == True: barrpt.set_active(True) barrpt.connect('toggled', self.setrepeat) #listview self.iconoListView = IconoListView() self.iconoListView.get_sw().get_child().connect('row-activated', self.on_activated) #self.iconoListView.get_sw().get_child().connect('button-press-event', self.on_right_click) vbox2 = self.builder.get_object('vbox2') vbox2.add(self.iconoListView.get_sw()) vbox2.reorder_child(self.iconoListView.get_sw(), 1) if os.path.exists(sopranoGlobals.TREE_DATA): GObject.idle_add(self.iconoListView.load_shelf, sopranoGlobals.TREE_DATA) #combobox self.hCombo = HeaderedComboBox() self.hCombo.connect("changed", self.on_name_combo_changed) self.builder.get_object('box-combo-explorer').add(self.hCombo) GObject.idle_add(self.setup_explorer) GObject.idle_add(self.cover_update) self.window.show_all() if self.currentview == 'playlist': menuvplist.set_active(True) self.to_playlist_mode() elif self.currentview == 'mini': menuvmini.set_active(True) self.to_mini_mode() #Notebook self.notebook = self.builder.get_object('notebook-explorer')