<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MadSoft &#187; interface</title>
	<atom:link href="http://www.madsoft.org/tags/interface/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.madsoft.org</link>
	<description></description>
	<lastBuildDate>Sat, 12 Dec 2009 20:47:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Interfacing Banshee 1.0 with DBus and Python</title>
		<link>http://www.madsoft.org/2008/06/10/interfacing-banshee-10-with-dbus-and-python/</link>
		<comments>http://www.madsoft.org/2008/06/10/interfacing-banshee-10-with-dbus-and-python/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 03:35:28 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[banshee]]></category>
		<category><![CDATA[dbus]]></category>
		<category><![CDATA[interface]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/?p=30</guid>
		<description><![CDATA[Ever since the DBUS API change (more like overhaul) during the development of Banshee 1.0 and developers haven&#8217;t yet started supporting it in their plugins so I decided that I would play around with it. From what I have seen, it seems that the perception is that DBus is hard and complicated but its actually [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since the DBUS API change (more like overhaul) during the development of Banshee 1.0 and developers haven&#8217;t yet started supporting it in their plugins so I decided that I would play around with it. From what I have seen, it seems that the perception is that DBus is hard and complicated but its actually really easy and makes things very simple. Essentially you use a DBus debugger (because in most cases, documentation for an applications&#8217; DBus API is not available) like D-Feet to look up which interfaces, methods, properties, and signals are available to you. Then use them to do what you want.</p>
<p><span id="more-30"></span></p>
<p><a href="http://www.madsoft.org/wp-content/uploads/2008/06/dfeet_dbus_debugger.png"><img class="alignnone size-medium wp-image-32" title="dfeet_dbus_debugger" src="http://www.madsoft.org/wp-content/uploads/2008/06/dfeet_dbus_debugger-300x180.png" alt="Bansshe DBus API in D-Feet" width="300" height="180" /></a></p>
<p>Now all we have to do is make a connection to Banshee via DBus and start calling methods. For this we will just use an interactive python interpreter which can be accessed by simply typing &#8220;python&#8221; at any command line prompt. Firstly, we will import the DBuslibrary.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> dbus</pre></div></div>

</blockquote>
<p>Next, we will make a connection to the session bus.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Then we will get Banshee&#8217;s PlayerEngine object which will let us control the player itself (Play, Pause, Next, Previous, Current Track, etc).</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">banshee = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;org.bansheeproject.Banshee&quot;</span>, <span style="color: #483d8b;">&quot;/org/bansheeproject/Banshee/PlayerEngine&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>The first argument we pass, &#8220;org.bansheeproject.Banshee&#8221;, is the interface we want to connect to and &#8220;/org/bansheeproject/Banshee/PlayerEngine&#8221; is the path to the object that we want to use. Now we can start doing stuff with Banshee. You can pretty much take any of the methods listed in D-Feet and run them. For example:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">banshee.<span style="color: black;">Open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;file:///home/maddog39/Music/Eisbrecher - Antikörper.mp3&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>And to play the song&#8230;</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">banshee.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Once you have had enough&#8230;.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">banshee.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Although note that you dont have to using the Open() method to use the Play() and Pause() methods, but Open() lets you open an arbitrary media file otherwise those other methods use the currently playing track. Now, to access properties you generally just take the name of the property and prepend &#8216;Get&#8217; to it and make it a method. So for example:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">banshee.<span style="color: black;">GetCanPause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Returns:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">dbus.Boolean(False)</pre></div></div>

</blockquote>
<p>Or if we wanted to display all the information about the currently playing track we might do&#8230;</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> key <span style="color: #ff7700;font-weight:bold;">in</span> currentTrack.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> key + <span style="color: #483d8b;">&quot;: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>currentTrack<span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Which gives us:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">album: Issues
rating: 0
name: Falling Away From Me
artist: Korn
URI: file:///home/maddog39/Music/Korn%20-%20Beating%20Me%20Down.mp3
length: 271.211
disc: 0
track-count: 16
year: 1999
track-number: 2</pre></div></div>

</blockquote>
<p>Another cool thing you can do with DBus is receive signals. What this allows us to do is run code when a given signal is triggered or received. We do this by connecting a python method with a signal on our bus. So if we wanted to do something every time Banshee changes its state (playing, paused, loading, loaded, etc) this is what would happen. We would first have to setup a main loop as it is required for a signals to function.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> gobject
<span style="color: #ff7700;font-weight:bold;">from</span> dbus.<span style="color: black;">mainloop</span>.<span style="color: black;">glib</span> <span style="color: #ff7700;font-weight:bold;">import</span> DBusGMainLoop
dbus.<span style="color: black;">mainloop</span>.<span style="color: black;">glib</span>.<span style="color: black;">DBusGMainLoop</span><span style="color: black;">&#40;</span>set_as_default=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Then we would create a callback method which would be run every time the signal is triggered.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> stateChanged<span style="color: black;">&#40;</span>state<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;State Changed: %s&quot;</span> <span style="color: #66cc66;">%</span> state</pre></div></div>

</blockquote>
<p>Now we can add our signal receiver to our method.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">bus.<span style="color: black;">add_signal_receiver</span><span style="color: black;">&#40;</span>stateChanged,
dbus_interface=<span style="color: #483d8b;">&quot;org.bansheeproject.Banshee.PlayerEngine&quot;</span>,
                        signal_name=<span style="color: #483d8b;">&quot;StateChanged&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Finally, at the end of a script that uses signals we would want to run our main loop.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">gobject.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Well thats pretty much it! Just keep in mind that this was not intended to be a tutorial but merely a guideline on how to do interact and do things with Banshee over DBus. So feel free to sit down and write some of your own scripts based on what you have learned here and I hope this helps. I have already written my own program to integrate Banshee into another application which I will talk about in another article. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/06/10/interfacing-banshee-10-with-dbus-and-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
