gboolean gstreamer_read_metadata_from_file (GFile *file, GFileInfo *info, GError **error) { char *uri; MetadataExtractor *extractor; if (! gstreamer_init ()) return FALSE; uri = g_file_get_uri (file); g_return_val_if_fail (uri != NULL, FALSE); extractor = g_slice_new0 (MetadataExtractor); reset_extractor_data (extractor); extractor->playbin = gst_element_factory_make ("playbin", "playbin"); g_object_set (G_OBJECT (extractor->playbin), "uri", uri, "audio-sink", gst_element_factory_make ("fakesink", "fakesink-audio"), "video-sink", gst_element_factory_make ("fakesink", "fakesink-video"), NULL); gst_element_set_state (extractor->playbin, GST_STATE_PAUSED); message_loop_to_state_change (extractor, GST_STATE_PAUSED); extract_metadata (extractor, info); metadata_extractor_free (extractor); g_free (uri); return TRUE; }
static void gth_media_viewer_page_real_view (GthViewerPage *base, GthFileData *file_data) { GthMediaViewerPage *self; char *uri; self = (GthMediaViewerPage*) base; g_return_if_fail (file_data != NULL); if (! gstreamer_init ()) return; gth_viewer_page_focus (GTH_VIEWER_PAGE (self)); if ((self->priv->file_data != NULL) && g_file_equal (file_data->file, self->priv->file_data->file) && (gth_file_data_get_mtime (file_data) == gth_file_data_get_mtime (self->priv->file_data))) { return; } /**/ _g_object_unref (self->priv->file_data); self->priv->file_data = gth_file_data_dup (file_data); self->priv->duration = 0; _g_object_unref (self->priv->icon); self->priv->icon = NULL; _gth_media_viewer_page_update_caption (self); /**/ gth_viewer_page_file_loaded (GTH_VIEWER_PAGE (self), TRUE); g_signal_handlers_block_by_func(GET_WIDGET ("adjustment_position"), position_value_changed_cb, self); gtk_adjustment_set_value (GTK_ADJUSTMENT (GET_WIDGET ("adjustment_position")), 0.0); g_signal_handlers_unblock_by_func(GET_WIDGET ("adjustment_position"), position_value_changed_cb, self); reset_player_state (self); if (self->priv->playbin == NULL) return; gst_element_set_state (self->priv->playbin, GST_STATE_NULL); uri = g_file_get_uri (self->priv->file_data->file); g_object_set (G_OBJECT (self->priv->playbin), "uri", uri, NULL); gdk_threads_add_idle (set_to_paused, self); g_free (uri); }
static void gth_media_viewer_page_real_view (GthViewerPage *base, GthFileData *file_data) { GthMediaViewerPage *self; char *uri; self = (GthMediaViewerPage*) base; g_return_if_fail (file_data != NULL); if (! gstreamer_init ()) return; gth_viewer_page_focus (GTH_VIEWER_PAGE (self)); if ((self->priv->file_data != NULL) && g_file_equal (file_data->file, self->priv->file_data->file) && (gth_file_data_get_mtime (file_data) == gth_file_data_get_mtime (self->priv->file_data))) { return; } /**/ _g_object_unref (self->priv->file_data); self->priv->file_data = gth_file_data_dup (file_data); self->priv->duration = 0; self->priv->has_audio = FALSE; self->priv->has_video = FALSE; _g_object_unref (self->priv->icon); self->priv->icon = NULL; _gth_media_viewer_page_update_caption (self); /**/ g_signal_handlers_block_by_func(GET_WIDGET ("position_adjustment"), position_value_changed_cb, self); gtk_adjustment_set_value (GTK_ADJUSTMENT (GET_WIDGET ("position_adjustment")), 0.0); g_signal_handlers_unblock_by_func(GET_WIDGET ("position_adjustment"), position_value_changed_cb, self); reset_player_state (self); create_playbin (self); if (self->priv->playbin == NULL) return; uri = g_file_get_uri (self->priv->file_data->file); _gth_media_viewer_page_set_uri (self, uri, self->priv->visible ? GST_STATE_PLAYING : GST_STATE_PAUSED); g_free (uri); }
static void gth_media_viewer_page_real_activate (GthViewerPage *base, GthBrowser *browser) { GthMediaViewerPage *self; if (! gstreamer_init ()) return; self = (GthMediaViewerPage*) base; self->priv->browser = browser; self->priv->actions = gtk_action_group_new ("Video Viewer Actions"); gtk_action_group_set_translation_domain (self->priv->actions, NULL); gtk_action_group_add_actions (self->priv->actions, media_viewer_action_entries, G_N_ELEMENTS (media_viewer_action_entries), self); gtk_ui_manager_insert_action_group (gth_browser_get_ui_manager (browser), self->priv->actions, 0); self->priv->area_box = gtk_vbox_new (FALSE, 0); /* video area */ self->priv->area = gtk_drawing_area_new (); gtk_widget_set_double_buffered (self->priv->area, FALSE); gtk_widget_add_events (self->priv->area, (gtk_widget_get_events (self->priv->area) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK)); GTK_WIDGET_SET_FLAGS (self->priv->area, GTK_CAN_FOCUS); gtk_widget_show (self->priv->area); gtk_box_pack_start (GTK_BOX (self->priv->area_box), self->priv->area, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (self->priv->area), "realize", G_CALLBACK (video_area_realize_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "unrealize", G_CALLBACK (video_area_unrealize_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "expose_event", G_CALLBACK (video_area_expose_event_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "button_press_event", G_CALLBACK (video_area_button_press_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "scroll_event", G_CALLBACK (video_area_scroll_event_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "key_press_event", G_CALLBACK (video_area_key_press_cb), self); /* mediabar */ self->priv->builder = _gtk_builder_new_from_file ("mediabar.ui", "gstreamer_tools"); self->priv->mediabar = GET_WIDGET ("mediabar"); gtk_widget_show (self->priv->mediabar); gtk_box_pack_start (GTK_BOX (self->priv->area_box), self->priv->mediabar, FALSE, FALSE, 0); g_signal_connect (GET_WIDGET ("adjustment_volume"), "value-changed", G_CALLBACK (volume_value_changed_cb), self); g_signal_connect (GET_WIDGET ("adjustment_position"), "value-changed", G_CALLBACK (position_value_changed_cb), self); g_signal_connect (GET_WIDGET ("hscale_volume"), "format-value", G_CALLBACK (hscale_volume_format_value_cb), self); g_signal_connect (GET_WIDGET ("hscale_position"), "change-value", G_CALLBACK (hscale_position_change_value_cb), self); g_signal_connect (GET_WIDGET ("hscale_position"), "button-release-event", G_CALLBACK (hscale_position_button_release_event_cb), self); g_signal_connect (GET_WIDGET ("button_play"), "clicked", G_CALLBACK (button_play_clicked_cb), self); g_signal_connect (GET_WIDGET ("togglebutton_volume"), "toggled", G_CALLBACK (togglebutton_volume_toggled_cb), self); g_signal_connect (GET_WIDGET ("button_play_slower"), "clicked", G_CALLBACK (button_play_slower_clicked_cb), self); g_signal_connect (GET_WIDGET ("button_play_faster"), "clicked", G_CALLBACK (button_play_faster_clicked_cb), self); gtk_widget_show (self->priv->area_box); gth_browser_set_viewer_widget (browser, self->priv->area_box); gtk_widget_realize (self->priv->area); gdk_window_ensure_native (gtk_widget_get_window (self->priv->area)); gth_viewer_page_focus (GTH_VIEWER_PAGE (self)); }
static void gth_media_viewer_page_real_activate (GthViewerPage *base, GthBrowser *browser) { GthMediaViewerPage *self; gboolean rtl; if (! gstreamer_init ()) return; self = (GthMediaViewerPage*) base; self->priv->browser = browser; g_action_map_add_action_entries (G_ACTION_MAP (browser), actions, G_N_ELEMENTS (actions), browser); self->priv->screenshot_button = gth_browser_add_header_bar_button (browser, GTH_BROWSER_HEADER_SECTION_VIEWER_VIEW, "camera-photo-symbolic", _("Take a screenshot"), "win.video-screenshot", NULL); rtl = gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL; /* video area */ self->priv->area = gtk_drawing_area_new (); /* do not use the rgba visual on the drawing area */ { GdkVisual *visual; visual = gdk_screen_get_system_visual (gtk_widget_get_screen (GTK_WIDGET (self->priv->area))); if (visual != NULL) gtk_widget_set_visual (GTK_WIDGET (self->priv->area), visual); } gtk_widget_set_double_buffered (self->priv->area, FALSE); gtk_widget_add_events (self->priv->area, (gtk_widget_get_events (self->priv->area) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_SCROLL_MASK)); gtk_widget_set_can_focus (self->priv->area, TRUE); gtk_widget_show (self->priv->area); g_signal_connect (G_OBJECT (self->priv->area), "realize", G_CALLBACK (video_area_realize_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "unrealize", G_CALLBACK (video_area_unrealize_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "draw", G_CALLBACK (video_area_draw_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "button_press_event", G_CALLBACK (video_area_button_press_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "popup-menu", G_CALLBACK (video_area_popup_menu_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "scroll_event", G_CALLBACK (video_area_scroll_event_cb), self); g_signal_connect (G_OBJECT (self->priv->area), "key_press_event", G_CALLBACK (video_area_key_press_cb), self); /* mediabar */ self->priv->builder = _gtk_builder_new_from_file ("mediabar.ui", "gstreamer_tools"); self->priv->mediabar = GET_WIDGET ("mediabar"); gtk_widget_set_halign (self->priv->mediabar, GTK_ALIGN_FILL); gtk_widget_set_valign (self->priv->mediabar, GTK_ALIGN_END); gtk_image_set_from_icon_name (GTK_IMAGE (GET_WIDGET ("play_slower_image")), rtl ? "media-seek-backward-rtl-symbolic" : "media-seek-backward-symbolic", GTK_ICON_SIZE_MENU); gtk_image_set_from_icon_name (GTK_IMAGE (GET_WIDGET ("play_faster_image")), rtl ? "media-seek-forward-rtl-symbolic" : "media-seek-forward-symbolic", GTK_ICON_SIZE_MENU); g_signal_connect (GET_WIDGET ("volume_adjustment"), "value-changed", G_CALLBACK (volume_value_changed_cb), self); g_signal_connect (GET_WIDGET ("position_adjustment"), "value-changed", G_CALLBACK (position_value_changed_cb), self); g_signal_connect (GET_WIDGET ("play_button"), "clicked", G_CALLBACK (play_button_clicked_cb), self); g_signal_connect (GET_WIDGET ("play_slower_button"), "clicked", G_CALLBACK (play_slower_button_clicked_cb), self); g_signal_connect (GET_WIDGET ("play_faster_button"), "clicked", G_CALLBACK (play_faster_button_clicked_cb), self); self->priv->mediabar_revealer = gtk_revealer_new (); gtk_revealer_set_transition_type (GTK_REVEALER (self->priv->mediabar_revealer), GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP); gtk_widget_set_halign (self->priv->mediabar_revealer, GTK_ALIGN_FILL); gtk_widget_set_valign (self->priv->mediabar_revealer, GTK_ALIGN_END); gtk_widget_show (self->priv->mediabar_revealer); gtk_container_add (GTK_CONTAINER (self->priv->mediabar_revealer), self->priv->mediabar); self->priv->area_box = gtk_overlay_new (); gtk_container_add (GTK_CONTAINER (self->priv->area_box), self->priv->area); gtk_overlay_add_overlay (GTK_OVERLAY (self->priv->area_box), self->priv->mediabar_revealer); gtk_widget_show (self->priv->area_box); gth_browser_set_viewer_widget (browser, self->priv->area_box); gtk_widget_realize (self->priv->area); gth_browser_register_viewer_control (self->priv->browser, self->priv->mediabar); gth_viewer_page_focus (GTH_VIEWER_PAGE (self)); }
gboolean applet_main (MyPanelApplet *applet_widget, const gchar *iid, gpointer data) { streamer_applet *applet; char *zErrMsg; int res, i; char ui[24576]; if (strcmp (iid, APPLET_ID) != 0) return FALSE; // i18n setlocale (LC_ALL, ""); bindtextdomain (PACKAGE_NAME, LOCALEDIR); bind_textdomain_codeset(PACKAGE_NAME, "utf-8"); textdomain (PACKAGE_NAME); // Init applet = g_malloc0(sizeof(streamer_applet)); applet->applet = applet_widget; memset(&applet->xml_listen_url[0], '\0', 1024); memset(&applet->xml_bitrate[0], '\0', 1024); memset(&applet->xml_server_name[0], '\0', 1024); memset(&applet->xml_genre[0], '\0', 1024); memset(&applet->url[0], '\0', 1024); memset(&applet->ui_fav[0], '\0', 10240); memset(&applet->ui_recent[0], '\0', 10240); applet->timestamp = time(NULL); applet->xml_curr_entries = 0; applet->icecast_total_entries = 0; applet->status = 0; for (i=0; i<10; i++) { memset(&applet->hash_fav[i].hash[0], '\0', 64); memset(&applet->hash_recent[i].hash[0], '\0', 64); } applet->settings.show_notifications = 0; applet->settings.duration_notifications = 5; #ifdef HAVE_GNOME_2 applet->bonobo_counter = 0; #endif // Check home dir, copy skel database char applet_home_dir[1024], skel_file[1024], local_file[1024]; struct stat stat_buf; struct passwd *pw = getpwuid(getuid()); sprintf(&applet_home_dir[0], "%s/%s", pw->pw_dir, APPLET_HOME_DIR); int stat_res = stat(&applet_home_dir[0], &stat_buf); int errsv = errno; if ((stat_res == 0) && (!S_ISDIR(stat_buf.st_mode))){ push_notification(_("Streamer Applet Error"), _("Cannot access configuration directory. Exiting."), NULL, DEFAULT_NOTIFICATION_DURATION); return FALSE; } else if (stat_res == -1) { if (errsv == ENOENT) { int mkdir_res = mkdir(&applet_home_dir[0], 0755); if (mkdir_res == 1) { push_notification(_("Streamer Applet Error"), _("Cannot create configuration directory. Exiting."), NULL, DEFAULT_NOTIFICATION_DURATION); return FALSE; } } else { push_notification(_("Streamer Applet Error"), _("Cannot verify configuration directory. Exiting."), NULL, DEFAULT_NOTIFICATION_DURATION); return FALSE; } } sprintf(&skel_file[0], "%s/%s", APPLET_SKEL_PATH, APPLET_SQLITE_DB_FILENAME); sprintf(&local_file[0], "%s/%s/%s", pw->pw_dir, APPLET_HOME_DIR, APPLET_SQLITE_DB_FILENAME); stat_res = stat(&local_file[0], &stat_buf); errsv = errno; if ((stat_res == 0) && (!S_ISREG(stat_buf.st_mode))){ push_notification(_("Streamer Applet Error"), _("Database file is not a regular file. Exiting."), NULL, DEFAULT_NOTIFICATION_DURATION); } else if (stat_res == -1) { if (errsv == ENOENT) { if (!cp(&local_file[0], &skel_file[0])) { push_notification(_("Streamer Applet Error"), _("Cannot copy database file to configuration directory. Exiting."), NULL, DEFAULT_NOTIFICATION_DURATION); return FALSE; } } else { push_notification(_("Streamer Applet Error"), _("Cannot verify database file. Exiting."), NULL, DEFAULT_NOTIFICATION_DURATION); return FALSE; } } // Test DB connection, upgrade DB if necessary if (!sqlite_connect(applet)) { push_notification(_("Streamer Applet Error"), _("Unable to connect to DB. Exiting."), NULL, DEFAULT_NOTIFICATION_DURATION); return FALSE; } zErrMsg = 0; res = sqlite3_exec(applet->sqlite, "SELECT version FROM version", cb_sql_version, (void*) applet, &zErrMsg); if (res != SQLITE_OK) { push_notification(_("Streamer Applet Error"), zErrMsg, NULL, DEFAULT_NOTIFICATION_DURATION); sqlite3_free(zErrMsg); return FALSE; } if (applet->db_version == 1) { // Upgrade DB to version 2 sqlite_insert(applet, "CREATE TABLE custom_stations (server_name VARCHAR(255), listen_url VARCHAR(255), bitrate VARCHAR(255), genre VARCHAR(255))"); sqlite_insert(applet, "ALTER TABLE stations RENAME TO icecast_stations"); sqlite_insert(applet, "UPDATE version SET version=2"); } else if (applet->db_version == 2) { // Upgrade DB to version 3 sqlite_insert(applet, "CREATE TABLE rbrowser_stations (server_name VARCHAR(255), listen_url VARCHAR(255), bitrate VARCHAR(255), genre VARCHAR(255))"); sqlite_insert(applet, "UPDATE version SET version=3"); } sqlite3_close(applet->sqlite); // Init GStreamer gstreamer_init(applet); // Get an image char image_file[1024]; sprintf(&image_file[0], "%s/%s", APPLET_ICON_PATH, APPLET_ICON_PAUSE); applet->image = gtk_image_new_from_file (&image_file[0]); // Put the image into a container (it needs to receive actions) applet->event_box = gtk_event_box_new(); gtk_container_add (GTK_CONTAINER (applet->event_box), applet->image); // Put the container into the applet gtk_container_add (GTK_CONTAINER (applet->applet), applet->event_box); // Define menu action group #ifdef HAVE_MATE applet->action_group = gtk_action_group_new ("Streamer_Applet_Actions"); gtk_action_group_set_translation_domain(applet->action_group, PACKAGE_NAME); gtk_action_group_add_actions (applet->action_group, applet_menu_actions_mate, G_N_ELEMENTS (applet_menu_actions_mate), applet); #endif // Get last 10 entried from Recent & Fav, then fetch last URL if (!sqlite_connect(applet)) return FALSE; zErrMsg = 0; memset(&applet->ui_recent[0], '\0', 1); res = sqlite3_exec(applet->sqlite, "SELECT server_name, listen_url FROM recent GROUP BY listen_url ORDER BY unix_timestamp DESC LIMIT 10", cb_sql_recent_10, (void*) applet, &zErrMsg); if (res != SQLITE_OK) { push_notification(_("Streamer Applet Error"), zErrMsg, NULL, DEFAULT_NOTIFICATION_DURATION); sqlite3_free(zErrMsg); return FALSE; } memset(&applet->ui_fav[0], '\0', 1); res = sqlite3_exec(applet->sqlite, "SELECT server_name, listen_url FROM favourites LIMIT 10", cb_sql_fav_10, (void*) applet, &zErrMsg); if (res != SQLITE_OK) { push_notification(_("Streamer Applet Error"), zErrMsg, NULL, DEFAULT_NOTIFICATION_DURATION); sqlite3_free(zErrMsg); return FALSE; } res = sqlite3_exec(applet->sqlite, "SELECT * FROM recent ORDER BY unix_timestamp DESC LIMIT 1", cb_sql_recent, (void*) applet, &zErrMsg); if (res != SQLITE_OK) { push_notification(_("Streamer Applet Error"), zErrMsg, NULL, DEFAULT_NOTIFICATION_DURATION); sqlite3_free(zErrMsg); return FALSE; } sqlite3_free(zErrMsg); sqlite3_close(applet->sqlite); // Build menu sprintf(&ui[0], "%s %s %s %s %s", ui1, &applet->ui_recent[0], ui2, &applet->ui_fav[0], ui3); #ifdef HAVE_MATE mate_panel_applet_setup_menu(applet->applet, &ui[0], applet->action_group); #elif HAVE_GNOME_2 BonoboUIVerb bnb1 = BONOBO_UI_UNSAFE_VERB ("All", G_CALLBACK (menu_cb_all)); applet->applet_menu_actions_gnome[applet->bonobo_counter] = bnb1; applet->bonobo_counter++; BonoboUIVerb bnb1a = BONOBO_UI_UNSAFE_VERB ("Settings", G_CALLBACK (menu_cb_settings)); applet->applet_menu_actions_gnome[applet->bonobo_counter] = bnb1a; applet->bonobo_counter++; BonoboUIVerb bnb2 = BONOBO_UI_UNSAFE_VERB ("About", G_CALLBACK (menu_cb_about)); applet->applet_menu_actions_gnome[applet->bonobo_counter] = bnb2; applet->bonobo_counter++; BonoboUIVerb bnb3 = BONOBO_UI_VERB_END; applet->applet_menu_actions_gnome[applet->bonobo_counter] = bnb3; applet->bonobo_counter++; panel_applet_setup_menu(applet->applet, &ui[0], applet->applet_menu_actions_gnome, applet); #endif // Merge menu //GError **error; //char ui[10240]; //sprintf(&ui[0], "<menu action='SubMenu1'>\n<menuitem action='All'/>\n<menuitem action='All'/></menu>"); //guint merge_id = gtk_ui_manager_add_ui_from_string (applet->applet->priv->ui_manager, &ui[0], -1, error); // Settings: Prepare DConf - GNOME2 only #ifdef HAVE_GNOME_2 if (!panel_applet_gconf_get_bool(PANEL_APPLET(applet->applet), "have_settings", NULL)) { panel_applet_gconf_set_bool(PANEL_APPLET(applet->applet), "have_settings", TRUE, NULL); panel_applet_gconf_set_int(PANEL_APPLET(applet->applet), APPLET_KEY_OPTION_1, 0, NULL); panel_applet_gconf_set_int(PANEL_APPLET(applet->applet), APPLET_KEY_OPTION_2, 5, NULL); } #endif // Load settings #ifdef HAVE_MATE applet->gsettings = g_settings_new_with_path(APPLET_GSETTINGS_SCHEMA, APPLET_GSETTINGS_PATH); applet->settings.show_notifications = g_settings_get_int(applet->gsettings, APPLET_KEY_OPTION_1); applet->settings.duration_notifications = g_settings_get_int(applet->gsettings, APPLET_KEY_OPTION_2); #elif HAVE_GNOME_2 applet->settings.show_notifications = panel_applet_gconf_get_int(PANEL_APPLET(applet->applet), APPLET_KEY_OPTION_1, NULL); applet->settings.duration_notifications = panel_applet_gconf_get_int(PANEL_APPLET(applet->applet), APPLET_KEY_OPTION_2, NULL); #endif // Signals g_signal_connect(G_OBJECT(applet->event_box), "button_press_event", G_CALLBACK (on_left_click), (gpointer)applet); g_signal_connect(G_OBJECT(applet->applet), "change_background", G_CALLBACK (applet_back_change), (gpointer)applet); g_signal_connect(G_OBJECT(applet->applet), "destroy", G_CALLBACK(applet_destroy), (gpointer)applet); // Tooltip gtk_widget_set_tooltip_text (GTK_WIDGET (applet->applet), _("No stream selected. Right-click to load one.")); // Show applet gtk_widget_show_all (GTK_WIDGET (applet->applet)); // Run applet->loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (applet->loop); return TRUE; }