mp3splt-gtk
import.c
Go to the documentation of this file.
1 /**********************************************************
2  *
3  * mp3splt-gtk -- utility based on mp3splt,
4  * for mp3/ogg splitting without decoding
5  *
6  * Copyright: (C) 2005-2010 Alexandru Munteanu
7  * Contact: io_fx@yahoo.fr
8  *
9  * http://mp3splt.sourceforge.net/
10  *
11  *********************************************************/
12 
13 /**********************************************************
14  *
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License
17  * as published by the Free Software Foundation; either version 2
18  * of the License, or (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
28  * USA.
29  *
30  *********************************************************/
31 
32 /*!********************************************************
33  * \file
34  * The magic behind the splitpoint input
35  *
36  * All functions that are needed in order to read in
37  * cddb, cue or similar files.
38  *********************************************************/
39 
40 #include "import.h"
41 
42 static void set_import_filters(GtkFileChooser *chooser);
43 static void build_import_filter(GtkFileChooser *chooser,
44  const gchar *filter_name, const gchar *filter_pattern,
45  const gchar *filter_pattern_upper,
46  GList **filters, GtkFileFilter *all_filter);
47 static gpointer add_audacity_labels_splitpoints(ui_with_fname *ui_fname);
48 static gpointer add_cddb_splitpoints(ui_with_fname *ui_fname);
49 static gpointer add_cue_splitpoints(ui_with_fname *ui_fname);
50 
52 void import_event(GtkWidget *widget, ui_state *ui)
53 {
54  GtkWidget *file_chooser =
55  gtk_file_chooser_dialog_new(_("Choose file to import"),
56  NULL,
57  GTK_FILE_CHOOSER_ACTION_OPEN,
58  GTK_STOCK_CANCEL,
59  GTK_RESPONSE_CANCEL,
60  GTK_STOCK_OPEN,
61  GTK_RESPONSE_ACCEPT,
62  NULL);
63 
64  wh_set_browser_directory_handler(ui, file_chooser);
65  set_import_filters(GTK_FILE_CHOOSER(file_chooser));
66 
67  if (gtk_dialog_run(GTK_DIALOG(file_chooser)) == GTK_RESPONSE_ACCEPT)
68  {
69  gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser));
70 
71  import_file(filename, ui);
72 
73  g_free(filename);
74  filename = NULL;
75 
76  remove_status_message(ui->gui);
77  }
78 
79  gtk_widget_destroy(file_chooser);
80 }
81 
86 void import_file(gchar *filename, ui_state *ui)
87 {
88  if (filename == NULL)
89  {
90  return;
91  }
92 
93  gchar *ext = strrchr(filename, '.');
94  GString *ext_str = g_string_new(ext);
95 
96  g_string_ascii_up(ext_str);
97 
98  if ((strstr(ext_str->str, ".MP3") != NULL) ||
99  (strstr(ext_str->str, ".OGG") != NULL))
100  {
101  file_chooser_ok_event(filename, ui);
102  remove_status_message(ui->gui);
103  }
104  else if ((strstr(ext_str->str, ".CUE") != NULL))
105  {
106  ui_with_fname *ui_fname = g_malloc0(sizeof(ui_with_fname));
107  ui_fname->ui = ui;
108  ui_fname->fname = strdup(filename);
109  create_thread_with_fname((GThreadFunc)add_cue_splitpoints, ui_fname);
110  }
111  else if ((strstr(ext_str->str, ".CDDB") != NULL))
112  {
113  ui_with_fname *ui_fname = g_malloc0(sizeof(ui_with_fname));
114  ui_fname->ui = ui;
115  ui_fname->fname = strdup(filename);
116  create_thread_with_fname((GThreadFunc)add_cddb_splitpoints, ui_fname);
117  }
118  else if ((strstr(ext_str->str, ".TXT") != NULL))
119  {
120  ui_with_fname *ui_fname = g_malloc0(sizeof(ui_with_fname));
121  ui_fname->ui = ui;
122  ui_fname->fname = strdup(filename);
123  create_thread_with_fname((GThreadFunc)add_audacity_labels_splitpoints, ui_fname);
124  }
125 
126  if (ext_str)
127  {
128  g_string_free(ext_str, FALSE);
129  }
130 }
131 
132 void import_files_to_batch_and_free(GSList *files, ui_state *ui)
133 {
134  GSList *current_file = files;
135  while (current_file)
136  {
137  gchar *filename = current_file->data;
138 
139  int err = SPLT_OK;
140  int num_of_files_found = 0;
141 
142  char **splt_filenames =
143  mp3splt_find_filenames(ui->mp3splt_state, filename, &num_of_files_found, &err);
144 
145  if (splt_filenames)
146  {
147  gint i = 0;
148  for (i = 0;i < num_of_files_found;i++)
149  {
150  if (!splt_filenames[i])
151  {
152  continue;
153  }
154 
155  multiple_files_add_filename(splt_filenames[i], ui);
156 
157  free(splt_filenames[i]);
158  splt_filenames[i] = NULL;
159  }
160 
161  free(splt_filenames);
162  splt_filenames = NULL;
163  }
164 
165  g_free(filename);
166  filename = NULL;
167 
168  current_file = g_slist_next(current_file);
169  }
170 
171  g_slist_free(files);
172 
173  if (ui->infos->multiple_files_tree_number > 0)
174  {
175  gtk_widget_set_sensitive(ui->gui->multiple_files_remove_all_files_button, TRUE);
176  }
177 }
178 
180 static void set_import_filters(GtkFileChooser *chooser)
181 {
182  GtkFileFilter *all_filter = gtk_file_filter_new();
183  gtk_file_filter_set_name(GTK_FILE_FILTER(all_filter),
184  _("CDDB (*.cddb), CUE (*.cue), Audacity labels (*.txt)"));
185 
186  GList *filters = NULL;
187 
188  build_import_filter(chooser, _("CDDB files (*.cddb)"), "*.cddb", "*.CDDB",
189  &filters, all_filter);
190  build_import_filter(chooser, _("CUE files (*.cue)"), "*.cue", "*.CUE",
191  &filters, all_filter);
192  build_import_filter(chooser, _("Audacity labels files (*.txt)"), "*.txt", "*.TXT",
193  &filters, all_filter);
194  build_import_filter(chooser, _("All files"), "*", NULL, &filters, NULL);
195 
196  gtk_file_chooser_add_filter(chooser, all_filter);
197 
198  GList *iter = NULL;
199  for (iter = filters; iter != NULL; iter = g_list_next(iter))
200  {
201  gtk_file_chooser_add_filter(chooser, iter->data);
202  }
203 }
204 
205 static void build_import_filter(GtkFileChooser *chooser,
206  const gchar *filter_name, const gchar *filter_pattern,
207  const gchar *filter_pattern_upper,
208  GList **filters, GtkFileFilter *all_filter)
209 {
210  GtkFileFilter *filter = gtk_file_filter_new();
211  gtk_file_filter_set_name(GTK_FILE_FILTER(filter), filter_name);
212  gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), filter_pattern);
213 
214  if (filter_pattern_upper)
215  {
216  gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), filter_pattern_upper);
217  }
218 
219  if (all_filter)
220  {
221  gtk_file_filter_add_pattern(GTK_FILE_FILTER(all_filter), filter_pattern);
222  if (filter_pattern_upper)
223  {
224  gtk_file_filter_add_pattern(GTK_FILE_FILTER(all_filter), filter_pattern_upper);
225  }
226  }
227 
228  *filters = g_list_append(*filters, filter);
229 }
230 
231 static gboolean add_audacity_labels_splitpoints_end(ui_with_err *ui_err)
232 {
233  ui_state *ui = ui_err->ui;
234  gint err = ui_err->err;
235 
236  if (err >= 0)
237  {
239  }
240 
242 
243  set_process_in_progress_and_wait_safe(FALSE, ui_err->ui);
244 
245  g_free(ui_err);
246 
247  return FALSE;
248 }
249 
250 static gpointer add_audacity_labels_splitpoints(ui_with_fname *ui_fname)
251 {
252  ui_state *ui = ui_fname->ui;
253 
254  set_process_in_progress_and_wait_safe(TRUE, ui);
255 
256  gchar *filename = ui_fname->fname;
257  g_free(ui_fname);
258 
259  gint err = SPLT_OK;
260 
261  mp3splt_put_audacity_labels_splitpoints_from_file(ui->mp3splt_state, filename, &err);
262  g_free(filename);
263 
264  ui_with_err *ui_err = g_malloc0(sizeof(ui_with_err));
265  ui_err->ui = ui;
266  ui_err->err = err;
267 
268  gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)add_audacity_labels_splitpoints_end,
269  ui_err, NULL);
270 
271  return NULL;
272 }
273 
274 static gboolean add_cddb_splitpoints_end(ui_with_err *ui_err)
275 {
276  ui_state *ui = ui_err->ui;
277  gint err = ui_err->err;
278 
279  if (err >= 0)
280  {
282  }
283 
285 
286  set_process_in_progress_and_wait_safe(FALSE, ui);
287 
288  g_free(ui_err);
289 
290  return FALSE;
291 }
292 
294 static gpointer add_cddb_splitpoints(ui_with_fname *ui_fname)
295 {
296  ui_state *ui = ui_fname->ui;
297 
298  set_process_in_progress_and_wait_safe(TRUE, ui);
299 
300  gchar *filename = ui_fname->fname;
301  g_free(ui_fname);
302 
303  enter_threads();
305  exit_threads();
306 
307  gint err = SPLT_OK;
308  mp3splt_put_cddb_splitpoints_from_file(ui->mp3splt_state, filename, &err);
309  g_free(filename);
310 
311  ui_with_err *ui_err = g_malloc0(sizeof(ui_with_err));
312  ui_err->ui = ui;
313  ui_err->err = err;
314 
315  gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)add_cddb_splitpoints_end,
316  ui_err, NULL);
317 
318  return NULL;
319 }
320 
321 static gboolean add_cue_splitpoints_end(ui_with_err *ui_err)
322 {
323  ui_state *ui = ui_err->ui;
324 
325  if (ui_err->err >= 0)
326  {
328  }
329  print_status_bar_confirmation(ui_err->err, ui);
330 
331  //The cue file has provided libmp3splt with a input filename.
332  //But since we use the filename from the gui instead we need to set
333  //the value the gui uses, too, which we do in the next line.
334  char *filename_to_split = mp3splt_get_filename_to_split(ui->mp3splt_state);
335  if (file_exists(filename_to_split))
336  {
337  file_chooser_ok_event(filename_to_split, ui);
338  }
339 
340  set_process_in_progress_and_wait_safe(FALSE, ui_err->ui);
341 
342  g_free(ui_err);
343 
344  return FALSE;
345 }
346 
348 static gpointer add_cue_splitpoints(ui_with_fname *ui_fname)
349 {
350  ui_state *ui = ui_fname->ui;
351 
352  set_process_in_progress_and_wait_safe(TRUE, ui);
353 
354  gchar *filename = ui_fname->fname;
355  g_free(ui_fname);
356 
357  enter_threads();
359  exit_threads();
360 
361  mp3splt_set_filename_to_split(ui->mp3splt_state, NULL);
362 
363  gint err = SPLT_OK;
364  mp3splt_put_cue_splitpoints_from_file(ui->mp3splt_state, filename, &err);
365  g_free(filename);
366 
367  ui_with_err *ui_err = g_malloc0(sizeof(ui_with_err));
368  ui_err->ui = ui;
369  ui_err->err = err;
370 
371  gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)add_cue_splitpoints_end,
372  ui_err, NULL);
373 
374  return NULL;
375 }
376