static void impl_activate (PeasActivatable *plugin) { RBGriloPlugin *pi = RB_GRILO_PLUGIN (plugin); GError *error = NULL; RBShell *shell; pi->sources = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, g_object_unref); grl_init (0, NULL); pi->registry = grl_plugin_registry_get_default (); g_signal_connect (pi->registry, "source-added", G_CALLBACK (grilo_source_added_cb), pi); if (grl_plugin_registry_load_all (pi->registry, &error) == FALSE) { g_warning ("Failed to load Grilo plugins: %s", error->message); g_clear_error (&error); } g_object_get (plugin, "object", &shell, NULL); g_object_get (shell, "shell-player", &pi->shell_player, NULL); g_object_unref (shell); g_signal_connect (pi->shell_player, "playing-song-changed", G_CALLBACK (playing_song_changed_cb), pi); pi->art_store = rb_ext_db_new ("album-art"); }
static void mex_search_plugin_search (MexSearchPlugin *self, const gchar *search) { GList *s, *sources; MexSearchPluginPrivate *priv = self->priv; /* Kill the last search */ if (priv->search_model) { g_object_unref (priv->search_model); priv->search_model = NULL; } /* Create search model */ priv->search_model = mex_aggregate_model_new (); g_object_set (G_OBJECT (priv->search_model), "title", "Search results", NULL); /* Iterate over searchable Grilo sources */ sources = grl_plugin_registry_get_sources (grl_plugin_registry_get_default (), FALSE); /* find the local files source and place it first */ for (s = sources; s; s = s->next) { GrlMetadataSource *meta_src = s->data; const gchar *name = grl_metadata_source_get_name (meta_src); if (!GRL_IS_METADATA_SOURCE (meta_src)) continue; if (name && !strcmp (name, "Local files")) { sources = g_list_remove_link (sources, s); sources = g_list_concat (sources, s); break; } } for (s = sources; s; s = s->next) { const gchar *source_id; GrlSupportedOps supported; GrlMetadataSource *meta_src = s->data; if (!GRL_IS_METADATA_SOURCE (meta_src)) continue; /* only search upnp and tracker sources */ source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src)); supported = grl_metadata_source_supported_operations (meta_src); if ((supported & GRL_OP_SEARCH) || (supported & GRL_OP_QUERY)) { MexFeed *feed; if (g_str_equal (source_id, "grl-tracker")) feed = mex_grilo_tracker_feed_new (GRL_MEDIA_SOURCE (meta_src), NULL, NULL, NULL, NULL); else feed = mex_grilo_feed_new (GRL_MEDIA_SOURCE (meta_src), NULL, NULL, NULL); g_object_set (G_OBJECT (feed), "placeholder-text", _("No videos found"), NULL); GController *controller = mex_model_get_controller (MEX_MODEL (feed)); /* Attach to the changed signal so that we can alter the * mime-type of content if necessary. */ g_signal_connect (controller, "changed", G_CALLBACK (mex_search_plugin_model_changed_cb), feed); mex_aggregate_model_add_model ( MEX_AGGREGATE_MODEL (priv->search_model), MEX_MODEL (feed)); /* FIXME: Arbitrary 50 item limit... */ mex_grilo_feed_search (MEX_GRILO_FEED (feed), search, 0, 50); } } g_list_free (sources); }
static void mex_library_plugin_init (MexLibraryPlugin *self) { GrlMediaPlugin *plugin; GrlPluginRegistry *registry; MexLibraryPluginPrivate *priv = self->priv = LIBRARY_PLUGIN_PRIVATE (self); registry = grl_plugin_registry_get_default (); plugin = grl_plugin_registry_lookup_source (registry, "grl-filesystem"); if (plugin) { GList *query_keys; MexFeed *feed; GrlMedia *box; const gchar *path; MexModelInfo *video_info, *photo_info, *music_info; query_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_TITLE, GRL_METADATA_KEY_MIME, GRL_METADATA_KEY_URL, GRL_METADATA_KEY_DATE, NULL); /* Add the videos model */ path = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS); box = mex_library_plugin_get_box_for_path (GRL_MEDIA_SOURCE (plugin), query_keys, path); if (box) { GList *metadata_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_DESCRIPTION, GRL_METADATA_KEY_DURATION, GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_WIDTH, GRL_METADATA_KEY_HEIGHT, NULL); feed = mex_grilo_feed_new (GRL_MEDIA_SOURCE (plugin), query_keys, metadata_keys, box); g_object_set (feed, "icon-name", "icon-library", "placeholder-text", "No videos found", NULL); mex_grilo_feed_browse (MEX_GRILO_FEED (feed), 0, G_MAXINT); video_info = mex_model_info_new_with_sort_funcs (MEX_MODEL (feed), "videos", 0); priv->models = g_list_append (priv->models, video_info); g_object_unref (feed); g_list_free (metadata_keys); } /* Add the photos model */ path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES); box = mex_library_plugin_get_box_for_path (GRL_MEDIA_SOURCE (plugin), query_keys, path); if (box) { GList *metadata_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_DESCRIPTION, GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_WIDTH, GRL_METADATA_KEY_HEIGHT, NULL); feed = mex_grilo_feed_new (GRL_MEDIA_SOURCE (plugin), query_keys, metadata_keys, box); g_object_set (feed, "icon-name", "icon-library", "placeholder-text", "No pictures found", NULL); mex_grilo_feed_browse (MEX_GRILO_FEED (feed), 0, G_MAXINT); photo_info = mex_model_info_new_with_sort_funcs (MEX_MODEL (feed), "pictures", 0); priv->models = g_list_append (priv->models, photo_info); g_object_unref (feed); g_list_free (metadata_keys); } /* Add the music model */ path = g_get_user_special_dir (G_USER_DIRECTORY_MUSIC); box = mex_library_plugin_get_box_for_path (GRL_MEDIA_SOURCE (plugin), query_keys, path); if (box) { GList *metadata_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_DESCRIPTION, GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_WIDTH, GRL_METADATA_KEY_HEIGHT, GRL_METADATA_KEY_ARTIST, GRL_METADATA_KEY_ALBUM, NULL); feed = mex_grilo_feed_new (GRL_MEDIA_SOURCE (plugin), query_keys, metadata_keys, box); g_object_set (feed, "icon-name", "icon-library", "placeholder-text", "No music found", NULL); mex_grilo_feed_browse (MEX_GRILO_FEED (feed), 0, G_MAXINT); music_info = mex_model_info_new_with_sort_funcs (MEX_MODEL (feed), "music", 0); priv->models = g_list_append (priv->models, music_info); g_object_unref (feed); g_list_free (metadata_keys); } g_list_free (query_keys); } else g_warning ("Filesystem plugin not found"); }
static void mex_tracker_plugin_init (MexTrackerPlugin *self) { MexTrackerPluginPrivate *priv; GrlPluginRegistry *registry; GList *plugins, *iter; priv = self->priv = GET_PRIVATE (self); priv->image_models = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); priv->video_models = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); priv->music_models = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); priv->query_video_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_TITLE, GRL_METADATA_KEY_MIME, GRL_METADATA_KEY_URL, GRL_METADATA_KEY_DATE, GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_PLAY_COUNT, NULL); priv->query_image_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_TITLE, GRL_METADATA_KEY_MIME, GRL_METADATA_KEY_URL, GRL_METADATA_KEY_DATE, GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_PLAY_COUNT, NULL); priv->query_music_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_TITLE, GRL_METADATA_KEY_MIME, GRL_METADATA_KEY_URL, GRL_METADATA_KEY_DATE, GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_PLAY_COUNT, GRL_METADATA_KEY_ALBUM, GRL_METADATA_KEY_ARTIST, NULL); priv->image_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_DESCRIPTION, GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_WIDTH, GRL_METADATA_KEY_HEIGHT, GRL_METADATA_KEY_LAST_PLAYED, GRL_METADATA_KEY_CAMERA_MODEL, GRL_METADATA_KEY_EXPOSURE_TIME, GRL_METADATA_KEY_ISO_SPEED, GRL_METADATA_KEY_FLASH_USED, GRL_METADATA_KEY_ORIENTATION, GRL_METADATA_KEY_CREATION_DATE, NULL); priv->video_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_DESCRIPTION, GRL_METADATA_KEY_DURATION, GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_WIDTH, GRL_METADATA_KEY_HEIGHT, GRL_METADATA_KEY_LAST_POSITION, GRL_METADATA_KEY_LAST_PLAYED, NULL); priv->music_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID, GRL_METADATA_KEY_DURATION, GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_LAST_POSITION, GRL_METADATA_KEY_LAST_PLAYED, NULL); priv->manager = mex_model_manager_get_default (); /* log domain */ MEX_LOG_DOMAIN_INIT (tracker_log_domain, "tracker"); registry = grl_plugin_registry_get_default (); plugins = grl_plugin_registry_get_sources (registry, FALSE); for (iter = plugins; iter != NULL; iter = iter->next) handle_new_source_plugin (self, GRL_MEDIA_PLUGIN (iter->data)); g_list_free (plugins); g_signal_connect (registry, "source-added", G_CALLBACK (registry_source_added_cb), self); g_signal_connect (registry, "source-removed", G_CALLBACK (registry_source_removed_cb), self); }
static void mex_search_plugin_search (MexSearchPlugin *self, const gchar *search) { GList *l, *list; MexSearchPluginPrivate *priv = self->priv; MexModelManager *manager = mex_model_manager_get_default (); gboolean have_tracker = FALSE; if (!priv->search_model) { /* Create search model */ priv->search_model = mex_aggregate_model_new (); g_object_set (G_OBJECT (priv->search_model), "title", _("Search results"), NULL); } /* Kill the last search */ list = (GList *) mex_aggregate_model_get_models ( MEX_AGGREGATE_MODEL (priv->search_model)); for (l = list; l; l = l->next) mex_model_manager_remove_model (manager, l->data); mex_aggregate_model_clear (MEX_AGGREGATE_MODEL (priv->search_model)); /* Iterate over searchable Grilo sources */ list = grl_plugin_registry_get_sources (grl_plugin_registry_get_default (), FALSE); /* find the local files source and place it first */ for (l = list; l; l = l->next) { GrlMetadataSource *meta_src = l->data; const gchar *name = grl_metadata_source_get_name (meta_src); const gchar *source_id; if (!GRL_IS_METADATA_SOURCE (meta_src)) continue; source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src)); if (source_id && g_str_equal (source_id, "grl-tracker")) have_tracker = TRUE; if (name && !strcmp (name, "Local files")) { list = g_list_remove_link (list, l); list = g_list_concat (list, l); break; } } /* prefer tracker over the filesystem plugin by removing it from the list if * tracker is available */ if (have_tracker) { for (l = list; l; l = l->next) { GrlMetadataSource *meta_src = l->data; const gchar *source_id; if (!GRL_IS_METADATA_SOURCE (meta_src)) continue; source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src)); if (source_id && g_str_equal (source_id, "grl-filesystem")) { list = g_list_delete_link (list, l); break; } } } for (l = list; l; l = l->next) { const gchar *source_id; GrlSupportedOps supported; GrlMetadataSource *meta_src = l->data; if (!GRL_IS_METADATA_SOURCE (meta_src)) continue; /* only search upnp and tracker sources */ source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src)); supported = grl_metadata_source_supported_operations (meta_src); if ((supported & GRL_OP_SEARCH) || (supported & GRL_OP_QUERY)) { MexFeed *feed; GController *controller; if (g_str_equal (source_id, "grl-tracker")) feed = mex_grilo_tracker_feed_new (GRL_MEDIA_SOURCE (meta_src), NULL, NULL, NULL, NULL); else feed = mex_grilo_feed_new (GRL_MEDIA_SOURCE (meta_src), NULL, NULL, NULL); mex_model_set_sort_func (MEX_MODEL (feed), mex_model_sort_time_cb, GINT_TO_POINTER (TRUE)); g_object_set (G_OBJECT (feed), "category", "search-results", "placeholder-text", _("No videos found"), NULL); mex_model_manager_add_model (manager, MEX_MODEL (feed)); controller = mex_model_get_controller (MEX_MODEL (feed)); /* Attach to the changed signal so that we can alter the * mime-type of content if necessary. */ g_signal_connect (controller, "changed", G_CALLBACK (mex_search_plugin_model_changed_cb), feed); mex_aggregate_model_add_model ( MEX_AGGREGATE_MODEL (priv->search_model), MEX_MODEL (feed)); /* FIXME: Arbitrary 50 item limit... */ mex_grilo_feed_search (MEX_GRILO_FEED (feed), search, 0, 50); g_object_unref (G_OBJECT (feed)); } } g_list_free (list); }
/** * mex_init_load_plugins: * * Load the Grilo plugins. */ static void mex_init_load_grilo_plugins (void) { GrlPluginRegistry *registry; GError *error = NULL; gchar *settings; registry = grl_plugin_registry_get_default (); settings = mex_settings_find_config_file (mex_settings_get_default (), "grilo-system.conf"); if (settings) grl_plugin_registry_add_config_from_file (registry, settings, NULL); g_free (settings); settings = mex_settings_find_config_file (mex_settings_get_default (), "mex.conf"); /* Load plugins */ if (settings) { GKeyFile *mex_conf; gchar **enabled_plugins; mex_conf = g_key_file_new (); g_key_file_load_from_file (mex_conf, settings, G_KEY_FILE_NONE, NULL); enabled_plugins = g_key_file_get_string_list (mex_conf, "grilo-plugins", "enabled", NULL, NULL); g_key_file_free (mex_conf); if (enabled_plugins) { gint i; for (i=0; enabled_plugins[i]; i++) { if (!grl_plugin_registry_load_by_id (registry, enabled_plugins[i], &error)) { g_warning ("Tried to load specified grilo plugin: %s but failed: %s", enabled_plugins[i], (error) ? error->message : ""); if (error) g_clear_error (&error); } else { MEX_DEBUG ("Loaded grilo plugin: %s plugin", enabled_plugins[i]); } } g_strfreev (enabled_plugins); } else { MEX_DEBUG ("No enabled plugins in mex.conf, loading default plugins"); grilo_load_default_plugins (registry); } g_free (settings); } else { MEX_DEBUG ("No mex.conf found, loading default plugins"); grilo_load_default_plugins (registry); } }