You are not logged in.

#1 2012-05-01 09:53:20

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Bullseye Media Manager

Hello,

I just finished a working version of a media manager I use for my personal account to handle my music and pictures collection. I decided to published it on AUR as I assume it might interest some people.
It's a python app with several modules.

Here's a little sum up of what it is about :

Music module

- Inspired by Amarok 1.4 and Exaile

- Library browser show rating sum, playcount sum and burn factor by node (artist, album, track, etc...). Burn factor is high if you've listened a lot to a few tracks of a node.

- Advanced queue managment with several flags to apply on queued tracks :

Stop flag : Once the player is done playing this track it will stop global playback
Temp jump : Once the player is done playing the current track, it will play this track and then go back where it left
Perm jump : Once the player is done playing the current track, it will play this track and then continue playback from here
Bridge source : Once the player is done playing this track, it will move to the bridge dest of this bridge source (if there is one)
Bride dest : Tells that this track is where the matching bridge source will lead when listened

- Passive filters : hide tracks you do not want to see by showing only those matching filters, useful if you have a large collection and at some point just listen to a few tracks. Can be seen as content view modes.

- Session saving/loading

- Last.fm scrobbling with offline cache support

- Function to sync playcounts with Last.fm account

- Function to import ratings from another Bullseye database (including BullseyeDroid)



Other modules (pictures, videos, and later custom)

- Manages files based on what there are and not just where they are on the disk

Basically, what you have to do with these modules is creating categories (~ based on subject form) and universes (~ based on subject content). Then after Bullseye has scanned indexed folders for new files, you load some of these files and drag and drop them in the matching categories / universes. You can create an arborescence of categories and universes. For example, I can create the root category "Characters" and a sub-category "Warriors" to it. I can also create a root universe "Dragon Ball" and a sub-universe "Piccolo" to it. Then if I have a picture of the warrior character Piccolo from Dragon Ball, I'll load it and drag and drop it in "Warriors" and "Piccolo". This picture will then matches the criteria "Characters", "Warriors", "Dragon Ball" and "Piccolo".



- Can move every indexed files to a proper structure. If you just download and copy files, search for them in Bullseye then add them in the proper category and universe, it will work. But it will be a real mess on disk. Bullseye can move every indexed files to a proper structure on disk, based on categories, universes or both.

- Function to check for doubloons

- Video & Music module support multiple backends : GStreamer, VLC, Phonon and MPlayer (not there right now)

Music module browser and flags demo : http://www.youtube.com/watch?v=UF5114mLWhQ
Categories & Universes management introduction with pictures module : http://www.youtube.com/watch?v=h3i1plNSpsg

Gtk2 package : https://aur.archlinux.org/packages.php?ID=58903
Qt4 package : https://aur.archlinux.org/packages.php?ID=58905

Theses versions are not really polished but should work quite properly (but they probably contain bugs since no one has used them except me).

Thanks for any feedback.

Last edited by Piccolo (2012-05-21 16:38:03)

Offline

#2 2012-05-01 14:29:38

jakobcreutzfeldt
Member
Registered: 2011-05-12
Posts: 1,033

Re: Bullseye Media Manager

Looks cool. Very importantly: do you honor the "Album Artist" (id3: TPE2, usually) tag?

Offline

#3 2012-05-01 15:34:00

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

jakobcreutzfeldt wrote:

Looks cool. Very importantly: do you honor the "Album Artist" (id3: TPE2, usually) tag?

Hum I was not aware of such tag, so not as of now. If I understood correctly, this tag contains the whole album "artist" (generic name like "Various artists" on compilation) whereas the artist tag contains the actual track artist.

The way the app use tags, I can't figure out how the "Album Artist" tag could be useful. But then I may not see something important about this tag.

Anyway thanks for the info.

Offline

#4 2012-05-01 20:09:41

jakobcreutzfeldt
Member
Registered: 2011-05-12
Posts: 1,033

Re: Bullseye Media Manager

No problem, most Linux don't support it but it's something I miss. Typically it's used in the case where the album as a whole is associated with some artist, but then the individual songs may have different artists. This will usually happen with some film soundtracks or DJ mixes. When you import one of these albums into one of the usual Linux media players, you end up with a ton of separate artists in the library with just a single song.

Offline

#5 2012-05-02 12:36:10

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Well then, I suppose I could at least provide an option telling if the browser should use "Album Artist" or "Artist" to show tracks.

EDIT : Ok I've updated the packages, now in settings -> music section there is a checkbox "Show performer instead of artist in library browser" to change the behavior of artist nodes.

Last edited by Piccolo (2012-05-02 18:00:53)

Offline

#6 2012-05-21 16:38:59

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Added links to demo videos in the main post.

Offline

#7 2012-05-21 20:51:56

Rasi
Member
From: Germany
Registered: 2007-08-14
Posts: 1,852
Website

Re: Bullseye Media Manager

Piccolo wrote:

Well then, I suppose I could at least provide an option telling if the browser should use "Album Artist" or "Artist" to show tracks.

EDIT : Ok I've updated the packages, now in settings -> music section there is a checkbox "Show performer instead of artist in library browser" to change the behavior of artist nodes.

To please all those foobar2000 lovers, can you make it a bit more clever? like "Show artist, if no albumartist is present". I like my tags clean, if no albumartist is needed, i dont use it.


He hoped and prayed that there wasn't an afterlife. Then he realized there was a contradiction involved here and merely hoped that there wasn't an afterlife.

Douglas Adams

Online

#8 2012-05-21 23:19:22

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Rasi wrote:
Piccolo wrote:

Well then, I suppose I could at least provide an option telling if the browser should use "Album Artist" or "Artist" to show tracks.

EDIT : Ok I've updated the packages, now in settings -> music section there is a checkbox "Show performer instead of artist in library browser" to change the behavior of artist nodes.

To please all those foobar2000 lovers, can you make it a bit more clever? like "Show artist, if no albumartist is present". I like my tags clean, if no albumartist is needed, i dont use it.

Well in fact when I said "Show performer instead of artist in library browser" it's exactly "Show artist, if no albumartist is present" because albumartist is often missing.

Offline

#9 2012-05-22 07:55:53

jakobcreutzfeldt
Member
Registered: 2011-05-12
Posts: 1,033

Re: Bullseye Media Manager

Damn, I forgot to check back on this; thanks for implementing the album artist tag! The videos look great, by the way. I'm downloading it now.

Offline

#10 2012-05-23 08:33:54

aspidites
Member
Registered: 2011-03-11
Posts: 30

Re: Bullseye Media Manager

Nice. I haven't tested the app itself as I'm currently rebuliding pyside, but what I saw in the video and what you wrote looks nice. I started poking around in the code (couldn't help myself), and noticed that you went from using glib to hard-coding paths (data_home, etc). I've written a patch that retrieves the info from a user's environment variables, defaulting to the old behavior if they aren't set.

=== modified file 'common/xdg.py'
--- common/xdg.py	2012-04-27 15:01:06 +0000
+++ common/xdg.py	2012-05-23 08:21:50 +0000
@@ -13,17 +13,18 @@
 #data_dir = '~/workspace/bullseye/trunk/'
 #data_dir = os.path.dirname(os.path.dirname(__file__)) + os.sep
 
-config_home = data_home = os.path.expanduser("~")
+home = os.environ.get("XDG_HOME", os.path.expanduser("~"))
 if sys.platform == "linux2": # for Linux using the X Server
-	config_home = os.path.join(config_home, ".config/bullseye")
-	data_home = os.path.join(data_home, '.local/share/bullseye')
+	config_home = os.path.join(os.environ.get("XDG_CONFIG_HOME", os.path.join(home, ".config")), "buillseye")
+	data_home = os.path.join(os.environ.get("XDG_DATA_HOME", os.path.join(home, ".local", "share")), "bullseye")
 elif sys.platform == "win32": # for Windows
-	config_home = os.path.join(config_home, '.bullseye')
-	data_home = os.path.join(data_home, '.bullseye')
-	#config_home = os.path.join(config_home, 'Local Settings\Application Data\\bullseye')
-	#data_home = os.path.join(data_home, 'Application Data\\bullseye')
+	home = os.environ.get("USERPROFILE", os.path.expanduser("~"))
+	config_home = os.path.join(home, ".bullseye")
+	data_home = os.path.join(home, ".bullseye")
+	#config_home = os.path.join(home, "bullseye")
+	#data_home = os.path.join(os.environ.get("APPDATA", "Application Data"), "bullseye")
 elif sys.platform == "darwin": # for MacOS
-	config_home = os.path.join(config_home, "bullseye")
+	config_home = os.path.join(home, "bullseye")
 
 
 data_thumbnails = os.path.join(data_home, 'thumbnails')
@@ -35,18 +36,18 @@
 
 def get_data_dir():
 	return data_dir
-	
+
 def get_data_home():
 	return data_home
-	
+
 def get_config_dir():
 	return config_home
-	
+
 def get_thumbnail_dir(subdir):
 	dir = os.path.join(data_thumbnails, subdir)
 	return dir
-	
-	
+
+
 def make_missing_dirs():
 	"""
 		Called in MainBDD. Not elsewhere.
@@ -55,6 +56,6 @@
 	for dir in dirs:
 		if not os.path.exists(dir):
 			os.makedirs(dir)
-			
-			
-make_missing_dirs()
\ No newline at end of file
+
+
+make_missing_dirs()

You'll also notice I patched some of the commented windows-specific lines. They should work in theory, but I kept them commented as to not change expected behavior. Hope you don't mind.

Regards,
aspidites

PS- in python, getter/setter methods are rather odd, so it seems redundant to have functions such as get_data_home, when the data_home variable is available on import:

from common import xdg
xdg.get_data_home()
# yields same result as
print xdg.data_home

edit
Bullseye hangs if it can't find a translation (or if locale is not set). Patch here:

=== modified file 'bullseye_qt.py'
--- bullseye_qt.py	2012-05-20 21:46:32 +0000
+++ bullseye_qt.py	2012-05-23 10:41:39 +0000
@@ -10,13 +10,14 @@
 import gettext
 locale.setlocale(locale.LC_ALL, '') # use user's preferred locale
 # take first two characters of country code
-loc = locale.getlocale()
-filename = "locale/bullseye_%s.mo" % locale.getlocale()[0][0:2]
+if locale.getlocale()[0]:
+	filename = "locale/bullseye_%s.mo" % locale.getlocale()[0][0:2]
 
-
-try:
+	try:
 	trans = gettext.GNUTranslations(open( filename, "rb" ) )
-except IOError:
+	except IOError:
+		trans = gettext.NullTranslations()
+else:
 	trans = gettext.NullTranslations()
 
 # Param True : unicode

Last edited by aspidites (2012-05-23 10:46:32)


coder formally known as EnvoyRising

Offline

#11 2012-05-23 14:00:19

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Thanks for the reports aspidites!

Yes I was using glib for setting paths, but decided not to continue with it after starting a Qt version. Therefore I quickly replaced glib calls without much polish, so your patch is welcome, especially the Windows commented lines.

As for the getters setters, I rarely use them; It's mainly when I'm not sure if the underlying variable name will change or not.

And thanks for the translation exception, didn't test this that much.

EDIT: packages updated.

Last edited by Piccolo (2012-05-23 14:31:30)

Offline

#12 2012-05-23 18:20:37

aspidites
Member
Registered: 2011-03-11
Posts: 30

Re: Bullseye Media Manager

No problem. Do you mind if I mirror this on github?


coder formally known as EnvoyRising

Offline

#13 2012-05-23 19:58:33

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Nope, do as you please.

Offline

#14 2012-05-23 21:38:24

aspidites
Member
Registered: 2011-03-11
Posts: 30

Re: Bullseye Media Manager

Sweet. I've created the github repo here: https://github.com/aspidites/bullseye

If you feel anything is misrepresented or missing, please let me know.

Last edited by aspidites (2012-05-23 21:38:37)


coder formally known as EnvoyRising

Offline

#15 2012-05-23 22:14:55

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Looks ok to me.

Some old parts of the code (especially gtk) are quite messy and contains bits of french. However Qt code should be fine. But still, I need to clean and standardize everything some day.

Offline

#16 2012-05-23 22:55:19

aspidites
Member
Registered: 2011-03-11
Posts: 30

Re: Bullseye Media Manager

Glad you said that, i was beginning to worry. I'll just focus on bug fixes for now then. Once you've figured out which parts are not needed and purged them, i could write a setup.py script so that the Makefiles are unnecessary. For python packages, setup.py is more standard, which is why I mention it.


coder formally known as EnvoyRising

Offline

#17 2012-05-23 23:26:39

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Yup I'm aware of setup.py, I just didn't take time to investigate on this yet. So if you have knowledge on this, I'll appreciate it.

I'll start cleaning and documenting the code this week end. And maybe I'll start implementing custom modules integration on the way; uc_sections code is nearly ready for that.

Last edited by Piccolo (2012-05-23 23:27:11)

Offline

#18 2012-05-25 20:39:45

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Rev 35 is up on Launchpad, I deleted old functions, removed french bits and reorganized some classes that needed it.

And btw here's some basic information about the structure :

abstract : when Gtk and Qt classes for the same widget share a lot of code, an abstract base class is created here
common : common stuff not related to data (~ settings and folders definition)
data : data related stuff : db module contains database utility classes and elements module contains classes representing single objects (track, picture, pictures container, etc)
gui : modales contains big dialog windows classes and menus contains menus big enough to deserve their own class
media : library playback (GStreamer, VLC, Phonon) interfaces
music : stuff related to music module
uc_sections : stuff related to modules that work with categories/universes organization. Specific modules classes should be in subfolder.

qt - a copy of the above structure (except abstract) containing matching Qt classes

Last edited by Piccolo (2012-05-25 21:07:11)

Offline

#19 2012-05-26 07:16:30

aspidites
Member
Registered: 2011-03-11
Posts: 30

Re: Bullseye Media Manager

Do you just prefer to make ui's by hand, or is there a reason you don't use designer + pyside-uic?

Last edited by aspidites (2012-05-26 07:23:58)


coder formally known as EnvoyRising

Offline

#20 2012-05-26 10:54:25

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Yes I started using Glade to build the main layout, but find myself more confortable, productive and precise building it directly through the code. I just think Gtk & Qt layout managment is simple enough to spare ui/code splitting.

Not to mention I'm not sure if custom widgets integration is made easy with these ui-tools.

Last edited by Piccolo (2012-05-28 08:50:15)

Offline

#21 2012-06-07 00:45:19

aspidites
Member
Registered: 2011-03-11
Posts: 30

Re: Bullseye Media Manager

Qt Version was broken, and wasn't loading the database (thus no music was showing).

My vim setup trims extra whitespace from files, so I created a diff that ignores white space to allow a cleaner application of the patch:

diff --git a/qt/gui/menubar.py b/qt/gui/menubar.py
index 495b484..0d1189f 100644
--- a/qt/gui/menubar.py
+++ b/qt/gui/menubar.py
@@ -22,7 +22,7 @@ class MenuBar(QtGui.QMenuBar):
 
 	def checkForNewFiles(self):
 		progressNotifier = self.core.statusBar.addProgressNotifier()
-		self.core.BDD.checkForNewFiles(progressNotifier)
+		self.core.db.checkForNewFiles(progressNotifier)
 
 
 	def loadModuleMenus(self, module):

As a side note, there seems to be a lot of differences between the gtk and qt versions. Aside from potentially not having qt installed, is there a reason to maintain two versions? Alternatively, i wonder if it would make since to separate the project into a library and the gui's which implement the library (kind of like xmms and mpd do)? These are just ramblings, so feel free to ignore this part of my reply. the important part is the patch. :-)

edit:
If the above didn't apply cleanly, try this instead:

diff --git a/qt/gui/menubar.py b/qt/gui/menubar.py
index 495b484..0d1189f 100644
--- a/qt/gui/menubar.py
+++ b/qt/gui/menubar.py
@@ -9,22 +9,22 @@ class MenuBar(QtGui.QMenuBar):
 		self.core = parent
 		QtGui.QMenuBar.__init__(self, parent)
 		toolsMenu = QtGui.QMenu(_('&Tools'))
-		
+
 		toolsMenu.addAction(_('Check for new files'), self.checkForNewFiles)
 		toolsMenu.addAction(_('Settings'), self.openSettings)
 		self.addMenu(toolsMenu)
-		
+
 		parent.moduleLoaded.connect(self.loadModuleMenus)
-		
+
 		for module in self.core.loadedModules:
 			self.loadModuleMenus(module)
-			
-			
+
+
 	def checkForNewFiles(self):
 		progressNotifier = self.core.statusBar.addProgressNotifier()
-		self.core.BDD.checkForNewFiles(progressNotifier)
-		
-		
+		self.core.db.checkForNewFiles(progressNotifier)
+
+
 	def loadModuleMenus(self, module):
 		if(module == 'pictures' or module == 'videos'):
 			pictures = QtGui.QMenu(_(module[0].capitalize() + module[1:]))
@@ -32,9 +32,9 @@ class MenuBar(QtGui.QMenuBar):
 			pictures.addAction(_('Check for doubloons'), self.core.managers[module].containerBrowser.checkForDoubloons)
 			pictures.addAction(_("Move to UC structure"), lambda: self.moveToUCStructure(module))
 			pictures.addSeparator()
-			
+
 			panelGroup = QtGui.QActionGroup(self)
-			
+
 			browserMode = settings.get_option(module + '/browser_mode', 'panel')
 
 			panes = pictures.addAction( _('Multi-panes'), lambda: self.core.managers[module].setBrowserMode('panes'))
@@ -42,7 +42,7 @@ class MenuBar(QtGui.QMenuBar):
 			if(browserMode == 'panes'):
 				panes.setChecked(True)
 			panes.setActionGroup(panelGroup)
-			
+
 			panel = pictures.addAction(_('All in one panel'), lambda: self.core.managers[module].setBrowserMode('panel'))
 			panel.setCheckable(True)
 			if(browserMode == 'panel'):
@@ -56,61 +56,61 @@ class MenuBar(QtGui.QMenuBar):
 				self.core.BDD.reloadCovers(progressNotifier)
 			music = QtGui.QMenu(_('Music'))
 			music.addAction(_('Reload covers'), reloadCovers)
-			
-			
+
+
 			self.addMenu(music)
-		
+
 
 	def moveToUCStructure(self, module):
 		dialog = modales.UCStructureHelper(module)
 		folder = dialog.exec_()
 		if folder != None:
 			self.core.managers[module].containerBrowser.moveToUCStructure(folder)
-		
+
 	def openSettings(self):
 		dialog = modales.SettingsEditor()
 		dialog.exec_()
-		
+
 class StatusBar(QtGui.QStatusBar):
 	def __init__(self):
 		QtGui.QStatusBar.__init__(self)
-		
+
 	def addProgressNotifier(self):
 		notifier = ProgressNotifier(self)
 		notifier.done.connect(self.removeNotifier)
 		self.addWidget(notifier)
 		return notifier
-		
+
 	def removeNotifier(self):
 		notifier = self.sender()
 		self.removeWidget(notifier)
 
 class ProgressNotifier(QtGui.QProgressBar):
-	
+
 	valueRequested = QtCore.Signal(int)
 	pulseRequested = QtCore.Signal()
 	done = QtCore.Signal()
-	
+
 	def __init__(self, statusBar):
 		QtGui.QProgressBar.__init__(self)
 		self.statusBar = statusBar
 		self.valueRequested.connect(self.setValue)
 		self.pulseRequested.connect(self.doPulse)
-		
+
 	def doPulse(self):
 		self.setRange(0, 0)
-		
+
 	def emitDone(self):
 		self.done.emit()
-		
+
 	def pulse(self):
 		self.pulseRequested.emit()
-		
-		
+
+
 	def setFraction(self, val):
 		val *= 100
 		if(self.maximum != 100):
 			self.setMaximum(100)
 		self.valueRequested.emit(val)
 
-			
+

The difference is that whitespace edits aren't ignored

Last edited by aspidites (2012-06-07 01:45:21)


coder formally known as EnvoyRising

Offline

#22 2012-06-07 13:52:24

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Oh thanks I forgot to rename BDD to db in that module.

Differences between Gtk and Qt versions should only be due to how each framework handle underlying functions (for example Gtk view/model is not object oriented). As of now it's not the case everywhere but this is the purpose of classes in abstract fodler. It's not exactly a library but it sure is a wrapper between Bullseye logic and specific GUI logic. For example, abstract panel (which display containers; artist, album, etc in music module and universes, categories, etc in other modules) call append(self, model, data, parentNode) to fill its model from db. This method is part of the GUI panel subclass, not the abstract one. I try to isolate core logic as much as possible but at the end of the day you still have to write a lot of stuff if you support two differents frameworks.

There is no reason to maintain two versions aside that it doesn't require that much effort if done properly. Because it's just translation. I also think Gtk 2 version fits better lightweight systems using Xfce, LXDE, etc...

Offline

#23 2012-06-07 18:18:13

aspidites
Member
Registered: 2011-03-11
Posts: 30

Re: Bullseye Media Manager

Ah. Well on my system, at least, the application looks different when using gtk vs qt.

As for light weight, the current qt is nearly twice the size of gtk2, but I think this will change in qt 5, as it's modularized (similar to the fashion that qt is modularized already on debian, for example). I mention this as a bit of commentary, not to try and convince you to drop the gtk version. In fact, most people running light weight desktops (I'm thinking openbox here), would probably rather not have to install Qt, so I definitely understand.

When I said different, I meant the application itself. Upon looking at the console output, it was simply a fact of me not having gstreamer python installed, so my mistake (I didn't install from aur, simply cloned repo).

edit: another patch
This one adds a file menu to the qt version (to match the interface of gtk version).

diff --git a/qt/gui/menubar.py b/qt/gui/menubar.py
index 495b484..015e137 100644
--- a/qt/gui/menubar.py
+++ b/qt/gui/menubar.py
@@ -9,22 +9,26 @@ class MenuBar(QtGui.QMenuBar):
 		self.core = parent
 		QtGui.QMenuBar.__init__(self, parent)
 		toolsMenu = QtGui.QMenu(_('&Tools'))
-		
+		fileMenu = QtGui.QMenu(_('&File'))
+
+		fileMenu.addAction(_('&Quit'), self.core.close)
+		self.addMenu(fileMenu)
+
 		toolsMenu.addAction(_('Check for new files'), self.checkForNewFiles)
 		toolsMenu.addAction(_('Settings'), self.openSettings)
 		self.addMenu(toolsMenu)
-		
+
 		parent.moduleLoaded.connect(self.loadModuleMenus)
-		
+
 		for module in self.core.loadedModules:
 			self.loadModuleMenus(module)
-			
-			
+
+
 	def checkForNewFiles(self):
 		progressNotifier = self.core.statusBar.addProgressNotifier()
-		self.core.BDD.checkForNewFiles(progressNotifier)
-		
-		
+		self.core.db.checkForNewFiles(progressNotifier)
+
+
 	def loadModuleMenus(self, module):
 		if(module == 'pictures' or module == 'videos'):
 			pictures = QtGui.QMenu(_(module[0].capitalize() + module[1:]))
@@ -32,9 +36,9 @@ class MenuBar(QtGui.QMenuBar):
 			pictures.addAction(_('Check for doubloons'), self.core.managers[module].containerBrowser.checkForDoubloons)
 			pictures.addAction(_("Move to UC structure"), lambda: self.moveToUCStructure(module))
 			pictures.addSeparator()
-			
+
 			panelGroup = QtGui.QActionGroup(self)
-			
+
 			browserMode = settings.get_option(module + '/browser_mode', 'panel')
 
 			panes = pictures.addAction( _('Multi-panes'), lambda: self.core.managers[module].setBrowserMode('panes'))
@@ -42,7 +46,7 @@ class MenuBar(QtGui.QMenuBar):
 			if(browserMode == 'panes'):
 				panes.setChecked(True)
 			panes.setActionGroup(panelGroup)
-			
+
 			panel = pictures.addAction(_('All in one panel'), lambda: self.core.managers[module].setBrowserMode('panel'))
 			panel.setCheckable(True)
 			if(browserMode == 'panel'):
@@ -53,64 +57,64 @@ class MenuBar(QtGui.QMenuBar):
 		elif(module == 'music'):
 			def reloadCovers():
 				progressNotifier = self.core.statusBar.addProgressNotifier()
-				self.core.BDD.reloadCovers(progressNotifier)
+				self.core.db.reloadCovers(progressNotifier)
 			music = QtGui.QMenu(_('Music'))
 			music.addAction(_('Reload covers'), reloadCovers)
-			
-			
+
+
 			self.addMenu(music)
-		
+
 
 	def moveToUCStructure(self, module):
 		dialog = modales.UCStructureHelper(module)
 		folder = dialog.exec_()
 		if folder != None:
 			self.core.managers[module].containerBrowser.moveToUCStructure(folder)
-		
+
 	def openSettings(self):
 		dialog = modales.SettingsEditor()
 		dialog.exec_()
-		
+
 class StatusBar(QtGui.QStatusBar):
 	def __init__(self):
 		QtGui.QStatusBar.__init__(self)
-		
+
 	def addProgressNotifier(self):
 		notifier = ProgressNotifier(self)
 		notifier.done.connect(self.removeNotifier)
 		self.addWidget(notifier)
 		return notifier
-		
+
 	def removeNotifier(self):
 		notifier = self.sender()
 		self.removeWidget(notifier)
 
 class ProgressNotifier(QtGui.QProgressBar):
-	
+
 	valueRequested = QtCore.Signal(int)
 	pulseRequested = QtCore.Signal()
 	done = QtCore.Signal()
-	
+
 	def __init__(self, statusBar):
 		QtGui.QProgressBar.__init__(self)
 		self.statusBar = statusBar
 		self.valueRequested.connect(self.setValue)
 		self.pulseRequested.connect(self.doPulse)
-		
+
 	def doPulse(self):
 		self.setRange(0, 0)
-		
+
 	def emitDone(self):
 		self.done.emit()
-		
+
 	def pulse(self):
 		self.pulseRequested.emit()
-		
-		
+
+
 	def setFraction(self, val):
 		val *= 100
 		if(self.maximum != 100):
 			self.setMaximum(100)
 		self.valueRequested.emit(val)
 
-			
+

Last edited by aspidites (2012-06-07 18:29:30)


coder formally known as EnvoyRising

Offline

#24 2012-06-07 22:58:02

Piccolo
Member
Registered: 2012-05-01
Posts: 13

Re: Bullseye Media Manager

Well except minor details, they look nearly the same on my system : Gtk music module screenshot and Qt music module screenshot. It looks like this when Gtk and Qt share the same theme.

The main advantage of Qt over Gtk atm is a far better and smoother other OS support. Because Qt4 is more evolved than Gtk2 it takes up more RAM and is a bit slower to load. But coding is generally way cleaner with Qt because of the important object orientation.

And thanks for the patch, now only the "? -> About" menu is lacking big_smile

Last edited by Piccolo (2012-06-07 23:08:04)

Offline

#25 2012-12-28 00:37:58

kozaki
Member
From: London >. < Paris
Registered: 2005-06-13
Posts: 644
Website

Re: Bullseye Media Manager

The Bullseye Media Manager capabilities in her, managing files seems very appealing.
As a matter of fact I can't install/test it as dependency 'python2-pylast' from aur does not compile (missing setup.py).

/me looking for a "simple" Media manager on Arch to somehow organize, fetch and tag a rather big collection of podcasts and documentaries of all kind.


Seeded week #28: Arch 25 gig (stock 12, Talking 1, Anywhere 11, Apricity 1)
Desktop @3.30GHz 8 gig RAM, Arch linux-ck
laptop1 Atom 2 gig RAM, Arch linux stock i686 (5+H battery smile) & 2: ARM Tegra K1 4 gig RAM, ChrOS
Atom Z520 2 gig RAM, OMV (Debian 7) kernel 3.16 bpo on SDHC | PGP Key: 0xFF0157D9

Offline

Board footer

Powered by FluxBB