Alex Launi proposed lp:~alexlauni/do-plugins/bansheeplugin for merging into lp:do-plugins
The full version of the banshee plugin complete with collection indexing, and playback control. STD free and ready for action.
=== modified file 'Banshee/Resources/Banshee.addin.xml'
--- a/Banshee/Resources/Banshee.addin.xml 2009-03-02 19:58:39 +0000
+++ b/Banshee/Resources/Banshee.addin.xml 2009-03-13 21:55:50 +0000
@@ -1,16 +1,21 @@
>>>>>> MERGE-SOURCE
author="Alex Launi"
category="Official"
>
-
@@ -18,6 +23,10 @@
+
+
+
+
@@ -25,5 +34,7 @@
+
+
=== modified file 'Banshee/src/Banshee.cs'
--- a/Banshee/src/Banshee.cs 2009-01-23 07:32:12 +0000
+++ b/Banshee/src/Banshee.cs 2009-03-13 21:55:50 +0000
@@ -53,10 +53,11 @@
{
if (index_mutex.ThreadState == ThreadState.Running)
return;
- if (index_mutex.ThreadState == ThreadState.Unstarted)
+ else if (index_mutex.ThreadState == ThreadState.Unstarted)
index_mutex.Start ();
- else
+ else {
index_mutex = MakeIndexerThread ();
+ }
}
public static bool IsPlaying {
=== modified file 'Banshee/src/BansheeDBus.cs'
--- a/Banshee/src/BansheeDBus.cs 2009-01-22 04:17:45 +0000
+++ b/Banshee/src/BansheeDBus.cs 2009-03-13 21:55:50 +0000
@@ -20,6 +20,7 @@
using System;
using System.Linq;
+using System.Threading;
using System.Collections.Generic;
using NDesk.DBus;
@@ -45,6 +46,7 @@
[Interface ("org.bansheeproject.Banshee.PlaybackController")]
interface IBansheeController
{
+ void First ();
void Next (bool restart);
void Previous (bool restart);
int ShuffleMode { get; set; }
@@ -53,12 +55,14 @@
public class BansheeDBus
{
const string BusName = "org.bansheeproject.Banshee";
+ const string SessionBusName = "org.freedesktop.DBus";
const string ErrorMessage = "Banshee encountered an error in {0}; {1}";
# region static Banshee d-bus members
static Dictionary object_paths;
+ static IBus session_bus;
static IBansheePlayer player;
static IBansheePlayQueue play_queue;
static IBansheeController controller;
@@ -66,18 +70,39 @@
static BansheeDBus ()
{
BuildObjectPathsDict ();
- }
-
- static T GetIBansheeObject (string object_path)
- {
- if (!Bus.Session.NameHasOwner (BusName)) {
- Bus.Session.StartServiceByName (BusName);
- System.Threading.Thread.Sleep (5000);
- if (!Bus.Session.NameHasOwner (BusName))
- throw new Exception (string.Format("Name {0} has no owner.", BusName));
- }
+ session_bus = Bus.Session.GetObject (SessionBusName, new ObjectPath (object_paths[typeof (IBus)]));
+ session_bus.NameOwnerChanged += HandleNameOwnerChanged;
+ }
+
+ static void HandleNameOwnerChanged(string name, string old_owner, string new_owner)
+ {
+ // when the owner changes on this path, we release our dbus objects.
+ if (name == BusName) {
+ player = null;
+ controller = null;
+ play_queue = null;
+ }
+ }
+
+ static bool FullApplicationAvailable {
+ get { return Bus.Session.NameHasOwner (BusName); }
+ }
+
+ static void MaybeStartFullApplication ()
+ {
+ if (FullApplicationAvailable) return;
- return Bus.Session.GetObject (BusName, new ObjectPath (object_path));
+ Bus.Session.StartServiceByName (BusName);
+ Thread.Sleep (5000);
+
+ if (!FullApplicationAvailable)
+ throw new Exception (string.Format("Name {0} has no owner.", BusName));
+ }
+
+ static T GetIBansheeObject (string objectPath)
+ {
+ MaybeStartFullApplication ();
+ return Bus.Session.GetObject (BusName, new ObjectPath (objectPath));
}
static IBansheePlayer Player {
@@ -115,9 +140,9 @@
}
public bool IsPlaying ()
- {
+ {
try {
- return player != null && Player.CurrentState == "playing";
+ return (player != null || FullApplicationAvailable) && Player.CurrentState == "playing";
} catch (Exception e) {
LogError ("IsPlaying", e);
}
@@ -135,13 +160,13 @@
public void Play ()
{
- Player.Play ();
+ First ();
}
public void Play (IEnumerable media)
{
Enqueue (media, true);
- Next ();
+ First ();
}
public void Enqueue (IEnumerable media)
@@ -152,8 +177,11 @@
void Enqueue (IEnumerable media, bool prepend)
{
try {
+ MaybeStartFullApplication (); //if banshee isn't already started the enqueue seems to fail
+
// if we're prepending to the queue we need to queue in the uris in reverse order
- if (prepend) media = media.Reverse ();
+ if (prepend)
+ media = media.Reverse ();
media.ForEach (item => PlayQueue.EnqueueUri (item.Path, prepend));
@@ -161,7 +189,7 @@
LogError ("Enqueue", e);
}
}
-
+
public void Next ()
{
try {
@@ -180,9 +208,19 @@
}
}
+ void First ()
+ {
+ try {
+ Controller.First ();
+ } catch (Exception e) {
+ LogError ("First", e);
+ }
+ }
+
static void BuildObjectPathsDict ()
{
object_paths = new Dictionary ();
+ object_paths.Add (typeof (IBus), "/org/freedesktop/DBus");
object_paths.Add (typeof (IBansheePlayer), "/org/bansheeproject/Banshee/PlayerEngine");
object_paths.Add (typeof (IBansheeController), "/org/bansheeproject/Banshee/PlaybackController");
object_paths.Add (typeof (IBansheePlayQueue), "/org/bansheeproject/Banshee/SourceManager/PlayQueue");
=== modified file 'Banshee/src/PauseAction.cs'
--- a/Banshee/src/PauseAction.cs 2009-01-22 03:02:27 +0000
+++ b/Banshee/src/PauseAction.cs 2009-03-13 21:55:50 +0000
@@ -22,6 +22,7 @@
using Mono.Unix;
+using Do.Platform;
using Do.Universe;
namespace Banshee
=== modified file 'Banshee/src/PlayAction.cs'
--- a/Banshee/src/PlayAction.cs 2009-01-22 01:04:35 +0000
+++ b/Banshee/src/PlayAction.cs 2009-03-13 21:55:50 +0000
@@ -63,11 +63,16 @@
public override IEnumerable- Perform (IEnumerable
- items, IEnumerable
- modItems)
{
if (items.First () is MediaItem)
- Banshee.Play (items.Cast ().First ());
+ Banshee.Play (items.OfType ().First ());
else
Banshee.Play ();
yield break;
}
+
+ protected override bool IsAvailable ()
+ {
+ return !Banshee.IsPlaying;
+ }
}
}
\ No newline at end of file