2 * This example shows how to use interfaces and the tag subsystem.
3 * It takes an mp3 file as input, and makes an ogg file out of it. While doing
4 * this, it parses the filename and sets artist and title in the ogg file.
5 * It assumes the filename to be "<artist> - <title>.mp3"
7 * Run the program as "retag <mp3 file>"
9 * To run this program, you need to have the gst-plugins package (specifically
10 * the vorbis and mad plugins) installed.
15 /* and a header we need for the string manipulation */
19 main (int argc, char *argv[])
21 GstElement *bin, *filesrc, *tag_changer, *filesink;
22 gchar *artist, *title, *ext, *filename;
24 /* initialize GStreamer */
25 gst_init (&argc, &argv);
27 /* check that the argument is there */
29 g_print ("usage: %s <mp3 file>\n", argv[0]);
33 /* parse the mp3 name */
34 artist = strrchr (argv[1], '/');
37 artist = g_strdup (artist);
38 ext = strrchr (artist, '.');
41 title = strstr (artist, " - ");
43 g_print ("The format of the mp3 file is invalid.\n");
50 /* create a new bin to hold the elements */
51 bin = gst_pipeline_new ("pipeline");
54 /* create a file reader */
55 filesrc = gst_element_factory_make ("filesrc", "disk_source");
58 /* now it's time to get the tag_changer */
59 tag_changer = gst_element_factory_make ("id3tag", "tag_changer");
61 g_print ("could not find plugin \"mad\"");
65 /* and a file writer */
66 filesink = gst_element_factory_make ("filesink", "filesink");
69 /* set the filenames */
70 filename = g_strdup_printf ("%s.temp", argv[1]); /* easy solution */
71 g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
72 g_object_set (G_OBJECT (filesink), "location", filename, NULL);
74 /* make sure the tag setter uses our stuff
75 (though that should already be default) */
76 gst_tag_setter_set_merge_mode (GST_TAG_SETTER (tag_changer),
78 /* set the tagging information */
79 gst_tag_setter_add (GST_TAG_SETTER (tag_changer), GST_TAG_MERGE_REPLACE,
80 GST_TAG_ARTIST, artist, GST_TAG_TITLE, title, NULL);
82 /* add objects to the main pipeline */
83 gst_bin_add_many (GST_BIN (bin), filesrc, tag_changer, filesink, NULL);
85 /* link the elements */
86 if (!gst_element_link_many (filesrc, tag_changer, filesink, NULL))
87 g_assert_not_reached ();
90 gst_element_set_state (bin, GST_STATE_PLAYING);
92 while (gst_bin_iterate (GST_BIN (bin)));
95 gst_element_set_state (bin, GST_STATE_NULL);
97 /* rename the file to the correct name and remove the old one */
99 rename (filename, argv[1]);