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: m@ioalex.net
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
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_cue_file_from_the_configuration_directory(ui_state *ui)
133 {
134  gchar *configuration_directory = get_configuration_directory();
135 
136  gsize filename_size = strlen(configuration_directory) + 20;
137  gchar *splitpoints_cue_filename = g_malloc(filename_size * sizeof(gchar));
138  g_snprintf(splitpoints_cue_filename, filename_size, "%s%s%s", configuration_directory,
139  G_DIR_SEPARATOR_S, "splitpoints.cue");
140 
141  if (file_exists(splitpoints_cue_filename))
142  {
143  mp3splt_set_int_option(ui->mp3splt_state,
145  import_file(splitpoints_cue_filename, ui);
146  }
147 
148  g_free(configuration_directory);
149  g_free(splitpoints_cue_filename);
150 }
151 
152 void import_files_to_batch_and_free(GSList *files, ui_state *ui)
153 {
154  GSList *current_file = files;
155  while (current_file)
156  {
157  gchar *filename = current_file->data;
158 
159  int err = SPLT_OK;
160  int num_of_files_found = 0;
161 
162  char **splt_filenames =
163  mp3splt_find_filenames(ui->mp3splt_state, filename, &num_of_files_found, &err);
164 
165  if (splt_filenames)
166  {
167  gint i = 0;
168  for (i = 0;i < num_of_files_found;i++)
169  {
170  if (!splt_filenames[i])
171  {
172  continue;
173  }
174 
175  multiple_files_add_filename(splt_filenames[i], ui);
176 
177  free(splt_filenames[i]);
178  splt_filenames[i] = NULL;
179  }
180 
181  free(splt_filenames);
182  splt_filenames = NULL;
183  }
184 
185  g_free(filename);
186  filename = NULL;
187 
188  current_file = g_slist_next(current_file);
189  }
190 
191  g_slist_free(files);
192 
193  if (ui->infos->multiple_files_tree_number > 0)
194  {
195  gtk_widget_set_sensitive(ui->gui->multiple_files_remove_all_files_button, TRUE);
196  }
197 }
198 
200 static void set_import_filters(GtkFileChooser *chooser)
201 {
202  GtkFileFilter *all_filter = gtk_file_filter_new();
203  gtk_file_filter_set_name(GTK_FILE_FILTER(all_filter),
204  _("CDDB (*.cddb), CUE (*.cue), Audacity labels (*.txt)"));
205 
206  GList *filters = NULL;
207 
208  build_import_filter(chooser, _("CDDB files (*.cddb)"), "*.cddb", "*.CDDB",
209  &filters, all_filter);
210  build_import_filter(chooser, _("CUE files (*.cue)"), "*.cue", "*.CUE",
211  &filters, all_filter);
212  build_import_filter(chooser, _("Audacity labels files (*.txt)"), "*.txt", "*.TXT",
213  &filters, all_filter);
214  build_import_filter(chooser, _("All files"), "*", NULL, &filters, NULL);
215 
216  gtk_file_chooser_add_filter(chooser, all_filter);
217 
218  GList *iter = NULL;
219  for (iter = filters; iter != NULL; iter = g_list_next(iter))
220  {
221  gtk_file_chooser_add_filter(chooser, iter->data);
222  }
223 }
224 
225 static void build_import_filter(GtkFileChooser *chooser,
226  const gchar *filter_name, const gchar *filter_pattern,
227  const gchar *filter_pattern_upper,
228  GList **filters, GtkFileFilter *all_filter)
229 {
230  GtkFileFilter *filter = gtk_file_filter_new();
231  gtk_file_filter_set_name(GTK_FILE_FILTER(filter), filter_name);
232  gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), filter_pattern);
233 
234  if (filter_pattern_upper)
235  {
236  gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), filter_pattern_upper);
237  }
238 
239  if (all_filter)
240  {
241  gtk_file_filter_add_pattern(GTK_FILE_FILTER(all_filter), filter_pattern);
242  if (filter_pattern_upper)
243  {
244  gtk_file_filter_add_pattern(GTK_FILE_FILTER(all_filter), filter_pattern_upper);
245  }
246  }
247 
248  *filters = g_list_append(*filters, filter);
249 }
250 
251 static gboolean add_audacity_labels_splitpoints_end(ui_with_err *ui_err)
252 {
253  ui_state *ui = ui_err->ui;
254  gint err = ui_err->err;
255 
256  if (err >= 0)
257  {
259  }
260 
262 
263  set_process_in_progress_and_wait_safe(FALSE, ui_err->ui);
264 
265  g_free(ui_err);
266 
267  return FALSE;
268 }
269 
270 static gpointer add_audacity_labels_splitpoints(ui_with_fname *ui_fname)
271 {
272  ui_state *ui = ui_fname->ui;
273 
274  set_process_in_progress_and_wait_safe(TRUE, ui);
275 
276  gchar *filename = ui_fname->fname;
277  g_free(ui_fname);
278 
279  gint err = mp3splt_import(ui->mp3splt_state, AUDACITY_LABELS_IMPORT, filename);
280  g_free(filename);
281 
282  ui_with_err *ui_err = g_malloc0(sizeof(ui_with_err));
283  ui_err->ui = ui;
284  ui_err->err = err;
285 
286  gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)add_audacity_labels_splitpoints_end,
287  ui_err, NULL);
288 
289  return NULL;
290 }
291 
292 static gboolean add_cddb_splitpoints_end(ui_with_err *ui_err)
293 {
294  ui_state *ui = ui_err->ui;
295  gint err = ui_err->err;
296 
297  if (err >= 0)
298  {
300  }
301 
303 
304  set_process_in_progress_and_wait_safe(FALSE, ui);
305 
306  g_free(ui_err);
307 
308  return FALSE;
309 }
310 
312 static gpointer add_cddb_splitpoints(ui_with_fname *ui_fname)
313 {
314  ui_state *ui = ui_fname->ui;
315 
316  set_process_in_progress_and_wait_safe(TRUE, ui);
317 
318  gchar *filename = ui_fname->fname;
319  g_free(ui_fname);
320 
321  enter_threads();
323  exit_threads();
324 
325  gint err = mp3splt_import(ui->mp3splt_state, CDDB_IMPORT, filename);
326  g_free(filename);
327 
328  ui_with_err *ui_err = g_malloc0(sizeof(ui_with_err));
329  ui_err->ui = ui;
330  ui_err->err = err;
331 
332  gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)add_cddb_splitpoints_end,
333  ui_err, NULL);
334 
335  return NULL;
336 }
337 
338 static gboolean add_cue_splitpoints_end(ui_with_err *ui_err)
339 {
340  ui_state *ui = ui_err->ui;
341 
342  if (ui_err->err >= 0)
343  {
345  }
346  print_status_bar_confirmation(ui_err->err, ui);
347 
348  //The cue file has provided libmp3splt with a input filename.
349  //But since we use the filename from the gui instead we need to set
350  //the value the gui uses, too, which we do in the next line.
351  const gchar *filename_to_split = mp3splt_get_filename_to_split(ui->mp3splt_state);
352  if (file_exists(filename_to_split))
353  {
354  file_chooser_ok_event(filename_to_split, ui);
355  }
356 
357  set_process_in_progress_and_wait_safe(FALSE, ui_err->ui);
358 
359  mp3splt_set_int_option(ui->mp3splt_state,
361 
362  g_free(ui_err);
363 
364  return FALSE;
365 }
366 
368 static gpointer add_cue_splitpoints(ui_with_fname *ui_fname)
369 {
370  ui_state *ui = ui_fname->ui;
371 
372  set_process_in_progress_and_wait_safe(TRUE, ui);
373 
374  gchar *filename = ui_fname->fname;
375  g_free(ui_fname);
376 
377  enter_threads();
379  exit_threads();
380 
381  mp3splt_set_filename_to_split(ui->mp3splt_state, NULL);
382 
383  gint err = mp3splt_import(ui->mp3splt_state, CUE_IMPORT, filename);
384  g_free(filename);
385 
386  ui_with_err *ui_err = g_malloc0(sizeof(ui_with_err));
387  ui_err->ui = ui;
388  ui_err->err = err;
389 
390  gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)add_cue_splitpoints_end,
391  ui_err, NULL);
392 
393  return NULL;
394 }
395