[rhythmbox] generic-player: transform URIs to the device filesystem conditionally
- From: Jonathan Matthew <jmatthew src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [rhythmbox] generic-player: transform URIs to the device filesystem conditionally
- Date: Sat, 30 Jan 2010 10:24:18 +0000 (UTC)
commit a3ea4460f3ee8e5e749347bec518f046691fd1bf
Author: Jonathan Matthew <jonathan d14n org>
Date: Sat Jan 30 20:19:43 2010 +1000
generic-player: transform URIs to the device filesystem conditionally
For most playlist formats, we actually want to leave playlist entry URIs
as-is, so totem-pl-parser can construct paths relative to the playlist
file. So, we add the playlist format as a parameter to
uri_to_playlist_uri so it can be used to select the required behaviour.
See bug #608397.
.../rb-generic-player-playlist-source.c | 35 ++++++++++---------
plugins/generic-player/rb-generic-player-source.c | 34 +++++++++++++------
plugins/generic-player/rb-generic-player-source.h | 5 ++-
3 files changed, 44 insertions(+), 30 deletions(-)
---
diff --git a/plugins/generic-player/rb-generic-player-playlist-source.c b/plugins/generic-player/rb-generic-player-playlist-source.c
index 2ef328b..c56a503 100644
--- a/plugins/generic-player/rb-generic-player-playlist-source.c
+++ b/plugins/generic-player/rb-generic-player-playlist-source.c
@@ -63,6 +63,14 @@ enum {
PROP_PLAYER_SOURCE
};
+typedef struct {
+ RBGenericPlayerPlaylistSource *source;
+#if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
+ TotemPlPlaylist *playlist;
+#endif
+ TotemPlParserType playlist_type;
+} SavePlaylistData;
+
static void
impl_save_to_xml (RBPlaylistSource *source, xmlNodePtr node)
@@ -72,11 +80,6 @@ impl_save_to_xml (RBPlaylistSource *source, xmlNodePtr node)
#if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
-typedef struct {
- RBGenericPlayerPlaylistSource *source;
- TotemPlPlaylist *playlist;
-} SavePlaylistData;
-
static void
set_field_from_property (TotemPlPlaylist *playlist,
TotemPlPlaylistIter *iter,
@@ -110,7 +113,7 @@ save_playlist_foreach (GtkTreeModel *model,
}
host_uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
- uri = rb_generic_player_source_uri_to_playlist_uri (priv->player_source, host_uri);
+ uri = rb_generic_player_source_uri_to_playlist_uri (priv->player_source, host_uri, data->format);
totem_pl_playlist_append (data->playlist, &pl_iter);
totem_pl_playlist_set (data->playlist, &pl_iter, TOTEM_PL_PARSER_FIELD_URI, uri, NULL);
@@ -129,9 +132,9 @@ static void
save_playlist_entry (GtkTreeModel *model, GtkTreeIter *iter,
char **uri, char **title,
gboolean *custom_title,
- RBGenericPlayerPlaylistSource *source)
+ SavePlaylistData *data)
{
- RBGenericPlayerPlaylistSourcePrivate *priv = GET_PRIVATE (source);
+ RBGenericPlayerPlaylistSourcePrivate *priv = GET_PRIVATE (data->source);
RhythmDBEntry *entry;
const char *host_uri;
@@ -142,7 +145,7 @@ save_playlist_entry (GtkTreeModel *model, GtkTreeIter *iter,
}
host_uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
- *uri = rb_generic_player_source_uri_to_playlist_uri (priv->player_source, host_uri);
+ *uri = rb_generic_player_source_uri_to_playlist_uri (priv->player_source, host_uri, data->playlist_type);
*title = rhythmdb_entry_dup_string (entry, RHYTHMDB_PROP_TITLE);
*custom_title = TRUE;
}
@@ -184,10 +187,7 @@ save_playlist (RBGenericPlayerPlaylistSource *source)
RBGenericPlayerPlaylistSourcePrivate *priv = GET_PRIVATE (source);
GFile *file;
gboolean result;
-#if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
- TotemPlPlaylist *playlist;
SavePlaylistData data;
-#endif
priv->save_playlist_id = 0;
playlist_type = rb_generic_player_source_get_playlist_format (priv->player_source);
@@ -240,10 +240,10 @@ save_playlist (RBGenericPlayerPlaylistSource *source)
file = g_file_new_for_path (temp_path);
parser = totem_pl_parser_new ();
-#if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
- playlist = totem_pl_playlist_new ();
data.source = source;
- data.playlist = playlist;
+ data.playlist_type = playlist_type;
+#if TOTEM_PL_PARSER_CHECK_VERSION(2,29,1)
+ data.playlist = totem_pl_playlist_new ();
gtk_tree_model_foreach (GTK_TREE_MODEL (query_model),
(GtkTreeModelForeachFunc) save_playlist_foreach,
@@ -253,7 +253,8 @@ save_playlist (RBGenericPlayerPlaylistSource *source)
}
result = totem_pl_parser_save (parser, playlist, file, name, playlist_type, &error);
- g_object_unref (playlist);
+ g_object_unref (data.playlist);
+ data.playlist = NULL;
#else
if (rb_debug_matches ("totem_pl_parser_write_with_title", "totem-pl-parser.c")) {
g_object_set (parser, "debug", TRUE, NULL);
@@ -265,7 +266,7 @@ save_playlist (RBGenericPlayerPlaylistSource *source)
temp_path,
name,
playlist_type,
- source,
+ &data,
&error);
#endif
if (result == FALSE) {
diff --git a/plugins/generic-player/rb-generic-player-source.c b/plugins/generic-player/rb-generic-player-source.c
index e829a3e..500453c 100644
--- a/plugins/generic-player/rb-generic-player-source.c
+++ b/plugins/generic-player/rb-generic-player-source.c
@@ -84,7 +84,8 @@ static void default_load_playlists (RBGenericPlayerSource *source);
static char * default_uri_from_playlist_uri (RBGenericPlayerSource *source,
const char *uri);
static char * default_uri_to_playlist_uri (RBGenericPlayerSource *source,
- const char *uri);
+ const char *uri,
+ TotemPlParserType playlist_type);
enum
{
@@ -607,19 +608,30 @@ default_uri_from_playlist_uri (RBGenericPlayerSource *source, const char *uri)
}
static char *
-default_uri_to_playlist_uri (RBGenericPlayerSource *source, const char *uri)
+default_uri_to_playlist_uri (RBGenericPlayerSource *source, const char *uri, TotemPlParserType playlist_type)
{
char *mount_uri;
char *playlist_uri;
- mount_uri = rb_generic_player_source_get_mount_path (source);
- if (g_str_has_prefix (uri, mount_uri) == FALSE) {
- rb_debug ("uri %s is not under device mount uri %s", uri, mount_uri);
- return NULL;
- }
+ switch (playlist_type) {
+ case TOTEM_PL_PARSER_IRIVER_PLA:
+ /* we need absolute paths within the device filesystem for this format */
+ mount_uri = rb_generic_player_source_get_mount_path (source);
+ if (g_str_has_prefix (uri, mount_uri) == FALSE) {
+ rb_debug ("uri %s is not under device mount uri %s", uri, mount_uri);
+ return NULL;
+ }
- playlist_uri = g_strdup_printf ("file://%s", uri + strlen (mount_uri));
- return playlist_uri;
+ playlist_uri = g_strdup_printf ("file://%s", uri + strlen (mount_uri));
+ return playlist_uri;
+
+ case TOTEM_PL_PARSER_M3U_DOS:
+ case TOTEM_PL_PARSER_M3U:
+ case TOTEM_PL_PARSER_PLS:
+ default:
+ /* leave the URI as-is, so we end up with relative paths in the playlist file */
+ return g_strdup (uri);
+ }
}
char *
@@ -631,11 +643,11 @@ rb_generic_player_source_uri_from_playlist_uri (RBGenericPlayerSource *source, c
}
char *
-rb_generic_player_source_uri_to_playlist_uri (RBGenericPlayerSource *source, const char *uri)
+rb_generic_player_source_uri_to_playlist_uri (RBGenericPlayerSource *source, const char *uri, TotemPlParserType playlist_type)
{
RBGenericPlayerSourceClass *klass = RB_GENERIC_PLAYER_SOURCE_GET_CLASS (source);
- return klass->impl_uri_to_playlist_uri (source, uri);
+ return klass->impl_uri_to_playlist_uri (source, uri, playlist_type);
}
static void
diff --git a/plugins/generic-player/rb-generic-player-source.h b/plugins/generic-player/rb-generic-player-source.h
index 032a0d7..19942ac 100644
--- a/plugins/generic-player/rb-generic-player-source.h
+++ b/plugins/generic-player/rb-generic-player-source.h
@@ -59,7 +59,7 @@ typedef struct
char ** (*impl_get_audio_folders) (RBGenericPlayerSource *source);
char * (*impl_uri_from_playlist_uri) (RBGenericPlayerSource *source, const char *uri);
- char * (*impl_uri_to_playlist_uri) (RBGenericPlayerSource *source, const char *uri);
+ char * (*impl_uri_to_playlist_uri) (RBGenericPlayerSource *source, const char *uri, TotemPlParserType playlist_type);
/* used for track transfer - returns the filename relative to the audio folder on the device */
char * (*impl_build_filename) (RBGenericPlayerSource *source, RhythmDBEntry *entry);
@@ -75,7 +75,8 @@ char * rb_generic_player_source_get_mount_path (RBGenericPlayerSource *source
char * rb_generic_player_source_uri_from_playlist_uri (RBGenericPlayerSource *source,
const char *uri);
char * rb_generic_player_source_uri_to_playlist_uri (RBGenericPlayerSource *source,
- const char *uri);
+ const char *uri,
+ TotemPlParserType playlist_type);
void rb_generic_player_source_set_supported_formats (RBGenericPlayerSource *source,
TotemPlParser *parser);
TotemPlParserType rb_generic_player_source_get_playlist_format (RBGenericPlayerSource *source);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]