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



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]