I have been playing around with Banshee on Ubuntu after just coming over from Windows. I used MediaMonkey on WinXP and liked a couple of the features:
Being a newbie I have a few questions:
Thanks Tim |
Index: src/Extensions/Banshee.PlayQueue/Resources/ActiveSourceUI.xml =================================================================== --- src/Extensions/Banshee.PlayQueue/Resources/ActiveSourceUI.xml (revision 4875) +++ src/Extensions/Banshee.PlayQueue/Resources/ActiveSourceUI.xml (working copy) @@ -1,6 +1,7 @@ <ui> <toolbar name="HeaderToolbar"> <placeholder name="SourceActions"> + <toolitem action="RandomTracksAction" /> <toolitem action="ClearPlayQueueAction" /> </placeholder> </toolbar> Index: src/Extensions/Banshee.PlayQueue/Resources/GlobalUI.xml =================================================================== --- src/Extensions/Banshee.PlayQueue/Resources/GlobalUI.xml (revision 4875) +++ src/Extensions/Banshee.PlayQueue/Resources/GlobalUI.xml (working copy) @@ -2,10 +2,17 @@ <popup name="PlayQueueContextMenu"> <menuitem action="ClearPlayQueueAction"></menuitem> <menuitem action="ClearPlayQueueOnQuitAction"></menuitem> + <menuitem action="RandomTracksAction"></menuitem> + <menuitem action="PartyModeAction"></menuitem> + <menu name="PlayQueueOptions" action="PlayQueueOptionsAction"> + <menuitem action="AutoDJAction"></menuitem> + <menuitem action="PlayQueueModeAction"></menuitem> + </menu> </popup> <popup name="TrackContextMenu" action="TrackContextMenuAction"> <placeholder name="AboveAddToPlaylist"> <menuitem name="AddToPlayQueue" action="AddToPlayQueueAction"></menuitem> + <menuitem name="AddAllToPlayQueue" action="AddAllToPlayQueueAction"></menuitem> </placeholder> </popup> -</ui> \ No newline at end of file +</ui> Index: src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs =================================================================== --- src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs (revision 4875) +++ src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs (working copy) @@ -50,6 +50,13 @@ Catalog.GetString ("Append selected songs to the play queue"), OnAddToPlayQueue) }); + + Add (new ActionEntry [] { + new ActionEntry ("AddAllToPlayQueueAction", Stock.Add, + Catalog.GetString ("Add all to Play Queue"), "q", + Catalog.GetString ("Append all songs to play queue"), + OnAddAllToPlayQueue) + }); AddImportant ( new ActionEntry ("ClearPlayQueueAction", Stock.Clear, @@ -64,6 +71,38 @@ Catalog.GetString ("Clear the play queue when quitting"), OnClearPlayQueueOnQuit, PlayQueueSource.ClearOnQuitSchema.Get ()) }); + + Add (new ToggleActionEntry [] { + new ToggleActionEntry ("PartyModeAction", null, + Catalog.GetString ("Party Mode"), null, + Catalog.GetString ("Tracks can be added not reordered or removed."), + OnPartyMode, false) + }); + + Add (new ActionEntry [] { + new ActionEntry ("RandomTracksAction", Stock.Add, + Catalog.GetString ("Random Tracks"), null, + Catalog.GetString ("Append random songs to the play queue"), + OnRandomTracks) + }); + + Add (new ActionEntry [] { + new ActionEntry ("PlayQueueOptionsAction", null, Catalog.GetString ("Options"), null, null, null) + }); + + Add (new ToggleActionEntry [] { + new ToggleActionEntry ("AutoDJAction", null, + Catalog.GetString ("Auto DJ"), null, + Catalog.GetString ("Add extra tracks when queue is empty"), + OnAutoDJ, PlayQueueSource.AutoDJSchema.Get ()) + }); + + Add (new ToggleActionEntry [] { + new ToggleActionEntry ("PlayQueueModeAction", null, + Catalog.GetString ("Play Queue Mode"), null, + Catalog.GetString ("All tracks are played through the queue"), + OnPlayQueueMode, PlayQueueSource.PlayQueueModeSchema.Get ()) + }); AddUiFromFile ("GlobalUI.xml"); @@ -88,7 +127,12 @@ { playqueue.AddSelectedTracks (ServiceManager.SourceManager.ActiveSource); } - + + private void OnAddAllToPlayQueue (object o, EventArgs args) + { + playqueue.AddAllTracks (ServiceManager.SourceManager.ActiveSource); + } + private void OnClearPlayQueue (object o, EventArgs args) { playqueue.Clear (); @@ -100,6 +144,30 @@ PlayQueueSource.ClearOnQuitSchema.Set (action.Active); } + private void OnRandomTracks (object o, EventArgs args) + { + playqueue.AddRandomTracks(5); + } + + private void OnAutoDJ (object o, EventArgs args) + { + ToggleAction action = this["AutoDJAction"] as Gtk.ToggleAction; + PlayQueueSource.AutoDJSchema.Set (action.Active); + } + + private void OnPlayQueueMode (object o, EventArgs args) + { + ToggleAction action = this["PlayQueueModeAction"] as Gtk.ToggleAction; + PlayQueueSource.PlayQueueModeSchema.Set (action.Active); + } + + private void OnPartyMode (object o, EventArgs args) + { + ToggleAction action = this["PartyModeAction"] as Gtk.ToggleAction; + playqueue.IsPartyMode = action.Active; + UpdateActions (); + } + #endregion private void OnSourceUpdated (SourceEventArgs args) @@ -117,8 +185,13 @@ Source source = ServiceManager.SourceManager.ActiveSource; if (source != null) { DatabaseSource db_source = source as DatabaseSource ?? source.Parent as DatabaseSource; - UpdateAction ("ClearPlayQueueAction", true, playqueue.Count > 0); + UpdateAction ("ClearPlayQueueAction", !playqueue.IsPartyMode, playqueue.Count > 0); + UpdateAction ("AutoDJAction", !playqueue.IsPartyMode); + UpdateAction ("PlayQueueModeAction", !playqueue.IsPartyMode); + UpdateAction ("RandomTracksAction", !playqueue.IsPartyMode); + UpdateAction ("ClearPlayQueueOnQuitAction", !playqueue.IsPartyMode); UpdateAction ("AddToPlayQueueAction", db_source != null && db_source != playqueue, true); + UpdateAction ("AddAllToPlayQueueAction", db_source != null && db_source != playqueue, true); } } } Index: src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs =================================================================== --- src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs (revision 4875) +++ src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs (working copy) @@ -27,6 +27,7 @@ // using System; +using System.Collections.Generic; using Mono.Unix; @@ -55,6 +56,9 @@ private TrackInfo prior_playback_track; private PlayQueueActions actions; private bool was_playing = false; + private bool is_party_mode = false; + private InterfaceActionService uia_service; + private bool track_intercept = false; protected override bool HasArtistAlbum { get { return false; } @@ -62,6 +66,7 @@ public PlayQueueSource () : base (Catalog.GetString ("Play Queue"), null) { + BindToDatabase (); TypeUniqueId = DbId.ToString (); Initialize (); @@ -102,6 +107,13 @@ Reload (); SetAsPlaybackSourceUnlessPlaying (); + + uia_service = ServiceManager.Get<InterfaceActionService> (); + uia_service.TrackActions.PreActivate += TrackActionPreActivate; + + // Intercept tracks starting to play + ServiceManager.PlayerEngine.TrackIntercept += TrackIntercept; + } #region IPlayQueue, IDBusExportable @@ -155,6 +167,43 @@ #endregion + private bool TrackIntercept (TrackInfo track) + { + + // Only intercept when in Play Queue Mode + if(PlayQueueSource.PlayQueueModeSchema.Get () == false) + return false; + + // Do nothing if the play queue is the active source and not in party mode + if (ServiceManager.SourceManager.ActiveSource == this) + return false; + + // Only intercept the track once + if (track_intercept) + return false; + + track_intercept = true; + + // Add the track when it has come from a different source + if (ServiceManager.SourceManager.ActiveSource != this) { + // Add the track to the play queue + if(ServiceManager.SourceManager.ActiveSource != this) + this.EnqueueTrack(track, false); + + // keep the source as the play queue + ServiceManager.PlaybackController.Source = this; + //ServiceManager.SourceManager.SetActiveSource(this); + } + + if (ServiceManager.PlayerEngine.IsPlaying() == false && Count > 0) + ServiceManager.PlayerEngine.Play(); + + track_intercept = false; + + return true; + + } + private void SetAsPlaybackSourceUnlessPlaying () { if (Count > 0 && ServiceManager.PlaybackController.Source != this) { @@ -165,9 +214,12 @@ public void Clear () { - playing_track = null; - RemoveTrackRange (DatabaseTrackModel, new Hyena.Collections.RangeCollection.Range (0, Count)); - Reload (); + if(!is_party_mode) + { + playing_track = null; + RemoveTrackRange (DatabaseTrackModel, new Hyena.Collections.RangeCollection.Range (0, Count)); + Reload (); + } } public void Dispose () @@ -216,13 +268,7 @@ private void OnPlayerEvent (PlayerEventArgs args) { if (args.Event == PlayerEvent.EndOfStream) { - if (RemovePlayingTrack () && Count == 0) { - if (was_playing) { - ServiceManager.PlaybackController.PriorTrack = prior_playback_track; - } else { - ServiceManager.PlaybackController.StopWhenFinished = true; - } - } + ServiceManager.PlaybackController.Next (true); } else if (args.Event == PlayerEvent.StartOfStream) { if (this == ServiceManager.PlaybackController.Source) { playing_track = ServiceManager.PlayerEngine.CurrentTrack as DatabaseTrackInfo; @@ -232,7 +278,106 @@ } } } + + public void AddRandomTracks(int count) + { + + // Get 5 random tracks + // Attributes restricted tracks to music only + IEnumerable<int> tracks = ServiceManager.DbConnection.QueryEnumerable<int> ("SELECT TrackId FROM CoreTracks WHERE Attributes & 4 == 4 AND Attributes & 2 == 0 ORDER BY Random() LIMIT ?", count); + // Add to queue + foreach(int trackId in tracks) { + EnqueueId(trackId, false); + } + } + + public bool IsPartyMode + { + get {return is_party_mode;} + set + { + + GtkElementsService service = ServiceManager.Get<GtkElementsService> (); + if (service == null) { + return; + } + + is_party_mode = value; + + // Full screen mode + Gtk.Window window = service.PrimaryWindow; + if (window != null) { + if (is_party_mode) + window.Fullscreen (); + else + window.Unfullscreen (); + } + + // retrieve and hide the gtk menu + Gtk.MenuShell menu = (Gtk.MenuShell) uia_service.UIManager.GetWidget ("/MainMenu"); + if(menu != null) { + if(is_party_mode) + menu.Hide (); + else + menu.Show (); + } + + // retrieve and hide the gtk toolbar + Gtk.Toolbar toolbar = (Gtk.Toolbar) uia_service.UIManager.GetWidget ("/HeaderToolbar"); + if (toolbar != null) { + if(is_party_mode) + toolbar.Hide (); + else + toolbar.Show (); + } + + Reload (); + + } + } + + + private void TrackActionPreActivate(object sender, Gtk.PreActivateArgs args) + { + + Gtk.Action action = args.Action.ActionGroup.GetAction("RemoveTracksAction"); + if(action != null) + action.Visible = !is_party_mode; + + action = args.Action.ActionGroup.GetAction("TrackEditorAction"); + if(action != null) + action.Visible = !is_party_mode; + + action = args.Action.ActionGroup.GetAction("RemoveTracksFromLibraryAction"); + if(action != null && action.Visible) + action.Visible = !is_party_mode; + + action = args.Action.ActionGroup.GetAction("DeleteTracksFromDriveAction"); + if(action != null && action.Visible) + action.Visible = !is_party_mode; + + action = args.Action.ActionGroup.GetAction("AddToPlaylistAction"); + if(action != null && action.Visible) + action.Visible = !is_party_mode; + + action = args.Action.ActionGroup.GetAction("BurnDiscAction"); + if(action != null && action.Visible) + action.Visible = !is_party_mode; + + } + + public override void ReorderSelectedTracks (int drop_row) + { + if (!(is_party_mode)) + base.ReorderSelectedTracks (drop_row); + } + + public override bool AcceptsInputFromSource (Source source) + { + return base.AcceptsInputFromSource (source); + } + bool IBasicPlaybackController.First () { return ((IBasicPlaybackController)this).Next (false); @@ -243,20 +388,26 @@ RemovePlayingTrack (); if (Count == 0) { - ServiceManager.PlaybackController.Source = PriorSource; - if (was_playing) { - ServiceManager.PlaybackController.PriorTrack = prior_playback_track; - ServiceManager.PlaybackController.Next (restart); - } else { - ServiceManager.PlayerEngine.Close (); + if (is_party_mode || AutoDJSchema.Get()) { + AddRandomTracks(1); + ServiceManager.PlaybackController.Next (false); } - return true; + else { + ServiceManager.PlaybackController.Source = PriorSource; + if (was_playing) { + ServiceManager.PlaybackController.PriorTrack = prior_playback_track; + ServiceManager.PlaybackController.Next (restart); + } else { + ServiceManager.PlayerEngine.Close (); + } + return true; + } } ServiceManager.PlayerEngine.OpenPlay ((DatabaseTrackInfo)TrackModel[0]); return true; } - + bool IBasicPlaybackController.Previous (bool restart) { return true; @@ -304,11 +455,34 @@ get { return false; } } + public override bool CanRemoveTracks { + get { return !is_party_mode; } + } + + public override bool CanSearch { + get { return false; } + } + public static readonly SchemaEntry<bool> ClearOnQuitSchema = new SchemaEntry<bool> ( "plugins.play_queue", "clear_on_quit", false, "Clear on Quit", "Clear the play queue when quitting" ); + + public static readonly SchemaEntry<bool> AutoDJSchema = new SchemaEntry<bool> ( + "plugins.play_queue", "auto_dj", + false, + "Auto DJ", + "Add extra tracks when queue is empty" + ); + + public static readonly SchemaEntry<bool> PlayQueueModeSchema = new SchemaEntry<bool> ( + "plugins.play_queue", "play_queue_mode", + false, + "Play Queue Mode", + "Play all tracks through the play queue" + ); + } } Index: src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs =================================================================== --- src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs (revision 4875) +++ src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs (working copy) @@ -255,7 +255,7 @@ return false; } - public void ReorderSelectedTracks (int drop_row) + public virtual void ReorderSelectedTracks (int drop_row) { if (TrackModel.Selection.Count == 0 || TrackModel.Selection.AllSelected) { return;
Attachment:
Banshee.PlayQueue.tar.gz
Description: GNU Zip compressed data