banshee r4156 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.Collection.Database src/Core/Banshee.Services/Banshee.Sources src/Core/Banshee.Services/Banshee.Streaming src/Extensions/Banshee.InternetRadio src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio
- From: abock svn gnome org
- To: svn-commits-list gnome org
- Subject: banshee r4156 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.Collection.Database src/Core/Banshee.Services/Banshee.Sources src/Core/Banshee.Services/Banshee.Streaming src/Extensions/Banshee.InternetRadio src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio
- Date: Tue, 17 Jun 2008 04:17:31 +0000 (UTC)
Author: abock
Date: Tue Jun 17 04:17:31 2008
New Revision: 4156
URL: http://svn.gnome.org/viewvc/banshee?rev=4156&view=rev
Log:
2008-06-17 Aaron Bockover <abock gnome org>
Ok, so I'm calling internet radio support 85% complete. Needs more polish,
but it's working pretty well. Am almost liking it.
* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs:
If the track's PrimarySource and its TrackEqualHandler is set, proxy
the comparison through that handler; split out the ID comparison into
a reusable static method
* src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs: Added
a TrackEqualHandler delegate/property that allows a primary source to
override the default TrackEqual comparison on its child tracks
* src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs: Support
holding a reference to a parent track
* src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:
Run the XspfMigrator on startup; provide a TrackEqualHandler that ensures
any RadioTrackInfo object bound to the player engine is associated
with its parent station track in the controller/view
* src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/XspfMigrator.cs:
Added the first pass at migrating old XSPF stored playlists, so we don't
piss users off by forgetting about their old stations :)
* src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/RadioColumnController.cs:
Added an 'Artist' column (the station creator/owner)
* src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationTrackInfo.cs:
* src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs:
Reverted to not using a StationTrackInfo since we don't need it
Added:
trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/XspfMigrator.cs
Removed:
trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationTrackInfo.cs
Modified:
trunk/banshee/ChangeLog
trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
trunk/banshee/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs
trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio.mdp
trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs
trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/RadioColumnController.cs
trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs
trunk/banshee/src/Extensions/Banshee.InternetRadio/Makefile.am
Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs (original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs Tue Jun 17 04:17:31 2008
@@ -43,7 +43,6 @@
using Banshee.ServiceStack;
using Banshee.Streaming;
- using System.Diagnostics;
// Disabling "is never used" warnings here because there are a lot
// of properties/fields that are set via reflection at the database
// layer - that is, they really are used, but the compiler doesn't
@@ -99,13 +98,24 @@
public override bool TrackEqual (TrackInfo track)
{
+ if (PrimarySource != null && PrimarySource.TrackEqualHandler != null) {
+ return PrimarySource.TrackEqualHandler (this, track);
+ }
+
DatabaseTrackInfo db_track = track as DatabaseTrackInfo;
if (db_track == null) {
return base.TrackEqual (track);
}
- return db_track.TrackId == TrackId && db_track.CacheModelId == CacheModelId &&
- db_track.CacheEntryId == CacheEntryId;
+ return TrackEqual (this, db_track);
+ }
+
+ public static bool TrackEqual (DatabaseTrackInfo a, DatabaseTrackInfo b)
+ {
+ return a != null && b != null &&
+ a.TrackId == b.TrackId &&
+ a.CacheModelId == b.CacheModelId &&
+ a.CacheEntryId == b.CacheEntryId;
}
public DatabaseArtistInfo Artist {
Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs (original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs Tue Jun 17 04:17:31 2008
@@ -71,8 +71,16 @@
}
}
+ public delegate bool TrackEqualHandler (DatabaseTrackInfo a, TrackInfo b);
+
public abstract class PrimarySource : DatabaseSource, IDisposable
{
+ private TrackEqualHandler track_equal_handler;
+ public TrackEqualHandler TrackEqualHandler {
+ get { return track_equal_handler; }
+ protected set { track_equal_handler = value; }
+ }
+
protected ErrorSource error_source;
protected bool error_source_visible = false;
Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs (original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs Tue Jun 17 04:17:31 2008
@@ -49,6 +49,12 @@
private bool loaded = false;
private bool parsing_playlist = false;
+ private TrackInfo parent_track;
+ public TrackInfo ParentTrack {
+ get { return parent_track; }
+ set { parent_track = value; }
+ }
+
public event EventHandler ParsingPlaylistEvent;
protected RadioTrackInfo()
@@ -68,6 +74,11 @@
this.single_location = uri;
}
+ public RadioTrackInfo (TrackInfo parentTrack) : this (parentTrack.Uri)
+ {
+ ParentTrack = parentTrack;
+ }
+
public void Play()
{
if(!loaded) {
Modified: trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio.mdp (original)
+++ trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio.mdp Tue Jun 17 04:17:31 2008
@@ -14,7 +14,7 @@
<File name="Banshee.InternetRadio/InternetRadioSource.cs" subtype="Code" buildaction="Compile" />
<File name="Banshee.InternetRadio/StationEditor.cs" subtype="Code" buildaction="Compile" />
<File name="Banshee.InternetRadio/RadioColumnController.cs" subtype="Code" buildaction="Compile" />
- <File name="Banshee.InternetRadio/StationTrackInfo.cs" subtype="Code" buildaction="Compile" />
+ <File name="Banshee.InternetRadio/XspfMigrator.cs" subtype="Code" buildaction="Compile" />
</Contents>
<References>
<ProjectReference type="Project" localcopy="True" refto="Banshee.Core" />
@@ -22,6 +22,7 @@
<ProjectReference type="Project" localcopy="True" refto="Banshee.ThickClient" />
<ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.10.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
<ProjectReference type="Project" localcopy="True" refto="Hyena" />
+ <ProjectReference type="Project" localcopy="True" refto="Mono.Media" />
</References>
<MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="True" RelativeMakefileName="./Makefile.am">
<BuildFilesVar Sync="True" Name="SOURCES" />
Modified: trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs (original)
+++ trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs Tue Jun 17 04:17:31 2008
@@ -81,7 +81,7 @@
}
foreach (TrackInfo track in TrackModel.SelectedItems) {
- StationTrackInfo station_track = track as StationTrackInfo;
+ DatabaseTrackInfo station_track = track as DatabaseTrackInfo;
if (station_track != null) {
EditStation (station_track);
return;
@@ -90,6 +90,16 @@
});
ServiceManager.PlayerEngine.TrackIntercept += OnPlayerEngineTrackIntercept;
+
+ TrackEqualHandler = delegate (DatabaseTrackInfo a, TrackInfo b) {
+ RadioTrackInfo radio_track = b as RadioTrackInfo;
+ return radio_track != null && DatabaseTrackInfo.TrackEqual (
+ radio_track.ParentTrack as DatabaseTrackInfo, a);
+ };
+
+ if (new XspfMigrator (this).Migrate ()) {
+ Reload ();
+ }
}
public override void Dispose ()
@@ -117,7 +127,7 @@
return false;
}
- new RadioTrackInfo (station.Uri).Play ();
+ new RadioTrackInfo (station).Play ();
return true;
}
@@ -127,7 +137,7 @@
EditStation (null);
}
- private void EditStation (StationTrackInfo track)
+ private void EditStation (DatabaseTrackInfo track)
{
StationEditor editor = new StationEditor (track);
editor.Response += OnStationEditorResponse;
@@ -141,7 +151,7 @@
try {
if (args.ResponseId == ResponseType.Ok) {
- StationTrackInfo track = editor.Track ?? new StationTrackInfo ();
+ DatabaseTrackInfo track = editor.Track ?? new DatabaseTrackInfo ();
track.PrimarySource = this;
track.IsLive = true;
Modified: trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/RadioColumnController.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/RadioColumnController.cs (original)
+++ trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/RadioColumnController.cs Tue Jun 17 04:17:31 2008
@@ -41,6 +41,7 @@
IndicatorColumn,
TitleColumn,
GenreColumn,
+ ArtistColumn,
CommentColumn,
RatingColumn,
PlayCountColumn,
@@ -53,9 +54,13 @@
IndicatorColumn.Visible = true;
TitleColumn.Visible = true;
GenreColumn.Visible = true;
+ RatingColumn.Visible = true;
+
CommentColumn.Visible = true;
CommentColumn.Title = Catalog.GetString ("Description");
- RatingColumn.Visible = true;
+
+ ArtistColumn.Visible = true;
+ ArtistColumn.Title = Catalog.GetString ("Creator");
}
}
}
Modified: trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs (original)
+++ trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs Tue Jun 17 04:17:31 2008
@@ -31,6 +31,7 @@
using Mono.Unix;
using Banshee.ServiceStack;
+using Banshee.Collection.Database;
using Hyena.Widgets;
@@ -46,9 +47,9 @@
private RatingEntry rating_entry;
private Alignment error_container;
private Label error;
- private StationTrackInfo track;
+ private DatabaseTrackInfo track;
- public StationEditor (StationTrackInfo track) : base()
+ public StationEditor (DatabaseTrackInfo track) : base()
{
AccelGroup accel_group = new AccelGroup ();
AddAccelGroup (accel_group);
@@ -245,7 +246,7 @@
stream_entry.SelectRegion (0, stream_entry.Text.Length);
}
- public StationTrackInfo Track {
+ public DatabaseTrackInfo Track {
get { return track; }
}
Added: trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/XspfMigrator.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/XspfMigrator.cs Tue Jun 17 04:17:31 2008
@@ -0,0 +1,140 @@
+//
+// XspfMigrator.cs
+//
+// Author:
+// Aaron Bockover <abockover novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.IO;
+
+using Hyena;
+
+using Banshee.Base;
+using Banshee.ServiceStack;
+using Banshee.Configuration;
+using Banshee.Collection.Database;
+
+using Media.Playlists.Xspf;
+
+namespace Banshee.InternetRadio
+{
+ public class XspfMigrator
+ {
+ private InternetRadioSource source;
+
+ public XspfMigrator (InternetRadioSource source)
+ {
+ this.source = source;
+ }
+
+ public bool Migrate ()
+ {
+ if (DatabaseConfigurationClient.Client.Get<bool> ("InternetRadio.LegacyXspfMigrated", false)) {
+ return false;
+ }
+
+ DatabaseConfigurationClient.Client.Set<bool> ("InternetRadio.LegacyXspfMigrated", true);
+
+ string xspf_path = Paths.Combine (Paths.LegacyApplicationData, "plugins", "stations");
+
+ foreach (string file in Directory.GetFiles (Paths.Combine (xspf_path, "user"), "*.xspf")) {
+ MigrateXspf (file);
+ }
+
+ foreach (string file in Directory.GetFiles (xspf_path, "*.xspf")) {
+ MigrateXspf (file);
+ }
+
+ return true;
+ }
+
+ private void MigrateXspf (string path)
+ {
+ try {
+ Media.Playlists.Xspf.Playlist playlist = new Media.Playlists.Xspf.Playlist ();
+ playlist.Load (path);
+
+ foreach (Track track in playlist.Tracks) {
+ try {
+ MigrateXspfTrack (playlist, track);
+ } catch (Exception e) {
+ Log.Exception ("Could not migrate XSPF track", e);
+ }
+ }
+ } catch (Exception e) {
+ Log.Exception ("Could not migrat XSPF playlist", e);
+ }
+ }
+
+ private void MigrateXspfTrack (Media.Playlists.Xspf.Playlist playlist, Track track)
+ {
+ if (track.LocationCount <= 0) {
+ return;
+ }
+
+ DatabaseTrackInfo station = new DatabaseTrackInfo ();
+ station.PrimarySource = source;
+ station.IsLive = true;
+
+ station.Uri = GetSafeUri (track.Locations[0]);
+
+ if (!String.IsNullOrEmpty (track.Title)) {
+ station.TrackTitle = track.Title;
+ }
+
+ if (!String.IsNullOrEmpty (track.Creator)) {
+ station.ArtistName = track.Creator;
+ }
+
+ if (!String.IsNullOrEmpty (track.Annotation)) {
+ station.Comment = track.Annotation;
+ }
+
+ if (!String.IsNullOrEmpty (playlist.Title)) {
+ station.Genre = playlist.Title;
+ }
+
+ if (track.Info != null) {
+ station.MoreInfoUri = GetSafeUri (track.Info);
+ }
+
+ station.Save ();
+ }
+
+ private SafeUri GetSafeUri (Uri uri)
+ {
+ try {
+ if (uri == null) {
+ return null;
+ }
+
+ string absolute = uri.AbsoluteUri;
+ return String.IsNullOrEmpty (absolute) ? null : new SafeUri (absolute);
+ } catch {
+ return null;
+ }
+ }
+ }
+}
Modified: trunk/banshee/src/Extensions/Banshee.InternetRadio/Makefile.am
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.InternetRadio/Makefile.am (original)
+++ trunk/banshee/src/Extensions/Banshee.InternetRadio/Makefile.am Tue Jun 17 04:17:31 2008
@@ -7,7 +7,7 @@
Banshee.InternetRadio/InternetRadioSource.cs \
Banshee.InternetRadio/RadioColumnController.cs \
Banshee.InternetRadio/StationEditor.cs \
- Banshee.InternetRadio/StationTrackInfo.cs
+ Banshee.InternetRadio/XspfMigrator.cs
RESOURCES = \
Banshee.InternetRadio.addin.xml \
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]