static void default_load_playlists (RBGenericPlayerSource *source) { RBGenericPlayerSourcePrivate *priv = GET_PRIVATE (source); char *mount_path; char *playlist_path; char *full_playlist_path; char **playlist_formats; mount_path = rb_generic_player_source_get_mount_path (source); playlist_path = rb_generic_player_source_get_playlist_path (RB_GENERIC_PLAYER_SOURCE (source)); if (playlist_path) { /* If the device only supports a single playlist, just load that */ if (g_str_has_suffix (playlist_path, ".m3u") || g_str_has_suffix (playlist_path, ".pls")) { full_playlist_path = rb_uri_append_path (mount_path, playlist_path); if (rb_uri_exists (full_playlist_path)) { load_playlist_file (source, full_playlist_path, playlist_path); } g_free (full_playlist_path); g_free (playlist_path); return; } /* Otherwise, limit the search to the device's playlist folder */ full_playlist_path = rb_uri_append_path (mount_path, playlist_path); rb_debug ("constructed playlist search path %s", full_playlist_path); } else { g_free (playlist_path); return; } /* only try to load playlists if the device has at least one playlist format */ g_object_get (priv->device_info, "playlist-formats", &playlist_formats, NULL); if (playlist_formats != NULL && g_strv_length (playlist_formats) > 0) { rb_debug ("searching for playlists in %s", playlist_path); rb_uri_handle_recursively (full_playlist_path, NULL, (RBUriRecurseFunc) visit_playlist_dirs, source); } g_strfreev (playlist_formats); g_free (playlist_path); g_free (full_playlist_path); g_free (mount_path); }
static gboolean visit_playlist_dirs (GFile *file, gboolean dir, RBGenericPlayerSource *source) { char *basename; char *uri; RhythmDBEntry *entry; RhythmDBEntryType entry_type; RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source); if (dir) { return TRUE; } /* check if we've already got an entry * for this file, just to save some i/o. */ uri = g_file_get_uri (file); entry = rhythmdb_entry_lookup_by_location (priv->db, uri); g_free (uri); if (entry != NULL) { gboolean is_song; is_song = FALSE; g_object_get (source, "entry-type", &entry_type, NULL); is_song = (rhythmdb_entry_get_entry_type (entry) == entry_type); g_boxed_free (RHYTHMDB_TYPE_ENTRY_TYPE, entry_type); if (is_song) { rb_debug ("%s was loaded as a song", rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION)); return TRUE; } } basename = g_file_get_basename (file); if (strcmp (basename, ".is_audio_player") != 0) { char *playlist_path; playlist_path = g_file_get_path (file); load_playlist_file (source, playlist_path, basename); g_free (playlist_path); } g_free (basename); return TRUE; }
static void default_load_playlists (RBGenericPlayerSource *source) { RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source); char *mount_path; char *playlist_path = NULL; mount_path = rb_generic_player_source_get_mount_path (source); if (priv->playlist_path) { /* If the device only supports a single playlist, just load that */ if (g_str_has_suffix (priv->playlist_path, ".m3u") || g_str_has_suffix (priv->playlist_path, ".pls")) { char *playlist_path = rb_uri_append_path (mount_path, priv->playlist_path); if (rb_uri_exists (playlist_path)) { load_playlist_file (source, playlist_path, priv->playlist_path); } return; } /* Otherwise, limit the search to the device's playlist folder. * The optional trailing '/%File' is stripped in set_playlist_path */ playlist_path = rb_uri_append_path (mount_path, priv->playlist_path); rb_debug ("constructed playlist search path %s", playlist_path); } rb_uri_handle_recursively (playlist_path ? playlist_path : mount_path, NULL, (RBUriRecurseFunc) visit_playlist_dirs, source); g_free (playlist_path); g_free (mount_path); }