1 /* $Id$ */
2 /*-
3  * Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
4  *                    Jannis Pohlmann <jannis@xfce.org>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
19  * MA 02111-1307 USA.
20  */
21 
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 
26 #include <taglib/tag_c.h>
27 
28 #include <media-tags-provider.h>
29 #include <tag-renamer.h>
30 #include <audio-tags-page.h>
31 
32 
33 
34 static void   media_tags_provider_tag_renamer_provider_init     (ThunarxRenamerProviderIface      *iface);
35 static GList *media_tags_provider_get_renamers                  (ThunarxRenamerProvider           *renamer_provider);
36 static void   media_tags_provider_audio_tags_page_provider_init (ThunarxPropertyPageProviderIface *iface);
37 static GList *media_tags_provider_get_pages                     (ThunarxPropertyPageProvider      *renamer_provider,
38                                                                  GList                            *files);
39 
40 
41 
42 struct _MediaTagsProviderClass
43 {
44   GObjectClass __parent__;
45 };
46 
47 struct _MediaTagsProvider
48 {
49   GObject __parent__;
50 };
51 
52 
53 
54 THUNARX_DEFINE_TYPE_WITH_CODE (MediaTagsProvider,
55                                media_tags_provider,
56                                G_TYPE_OBJECT,
57                                THUNARX_IMPLEMENT_INTERFACE (THUNARX_TYPE_RENAMER_PROVIDER,
58                                                             media_tags_provider_tag_renamer_provider_init)
59                                THUNARX_IMPLEMENT_INTERFACE (THUNARX_TYPE_PROPERTY_PAGE_PROVIDER,
60                                                             media_tags_provider_audio_tags_page_provider_init));
61 
62 
63 
64 static void
media_tags_provider_class_init(MediaTagsProviderClass * klass)65 media_tags_provider_class_init (MediaTagsProviderClass *klass)
66 {
67 }
68 
69 
70 
71 static void
media_tags_provider_tag_renamer_provider_init(ThunarxRenamerProviderIface * iface)72 media_tags_provider_tag_renamer_provider_init (ThunarxRenamerProviderIface *iface)
73 {
74   iface->get_renamers = media_tags_provider_get_renamers;
75 }
76 
77 
78 
79 static void
media_tags_provider_init(MediaTagsProvider * sbr_provider)80 media_tags_provider_init (MediaTagsProvider *sbr_provider)
81 {
82 }
83 
84 
85 
86 static GList*
media_tags_provider_get_renamers(ThunarxRenamerProvider * renamer_provider)87 media_tags_provider_get_renamers (ThunarxRenamerProvider *renamer_provider)
88 {
89   GList *renamers = NULL;
90 
91   renamers = g_list_prepend (renamers, tag_renamer_new ());
92 
93   return renamers;
94 }
95 
96 
97 
98 static void
media_tags_provider_audio_tags_page_provider_init(ThunarxPropertyPageProviderIface * iface)99 media_tags_provider_audio_tags_page_provider_init (ThunarxPropertyPageProviderIface *iface)
100 {
101   iface->get_pages = media_tags_provider_get_pages;
102 }
103 
104 
105 
106 static GList*
media_tags_provider_get_pages(ThunarxPropertyPageProvider * page_provider,GList * files)107 media_tags_provider_get_pages (ThunarxPropertyPageProvider *page_provider, GList *files)
108 {
109   GList           *pages = NULL;
110   GList           *file;
111   ThunarxFileInfo *info;
112 
113   if (g_list_length (files) != 1)
114     return NULL;
115 
116   file = g_list_first (files);
117 
118   if (G_UNLIKELY (file == NULL))
119     return NULL;
120 
121   info = THUNARX_FILE_INFO (file->data);
122 
123   if (G_LIKELY (media_tags_get_audio_file_supported (info)))
124     {
125       AudioTagsPage *page;
126 
127       /* Create the tag editor page */
128       page = audio_tags_page_new_with_save_button ();
129 
130       /* Assign supported file info to the page */
131       audio_tags_page_set_file (page, info);
132 
133       /* Add the tag editor page to the pages provided by this plugin */
134       pages = g_list_prepend (pages, page);
135     }
136 
137   return pages;
138 }
139 
140 
141 
142 gboolean
media_tags_get_audio_file_supported(ThunarxFileInfo * info)143 media_tags_get_audio_file_supported (ThunarxFileInfo *info)
144 {
145   gchar       *uri;
146   gchar       *filename;
147   TagLib_File *taglib_file;
148   gboolean     supported = FALSE;
149 
150   g_return_val_if_fail (info != NULL || THUNARX_IS_FILE_INFO (info), FALSE);
151 
152   uri = thunarx_file_info_get_uri (info);
153   filename = g_filename_from_uri (uri, NULL, NULL);
154   g_free (uri);
155 
156   if (G_UNLIKELY (filename == NULL))
157     return FALSE;
158 
159   /* Try loading the tag information */
160   taglib_file = taglib_file_new (filename);
161 
162   if (G_LIKELY (taglib_file != NULL))
163     {
164       /* Check that the file contains valid audio info */
165       supported = taglib_file_is_valid (taglib_file);
166 
167       /* Free the taglib file */
168       taglib_file_free (taglib_file);
169     }
170 
171   g_free (filename);
172 
173   return supported;
174 }
175