Exemplo n.º 1
0
    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))
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
	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')