1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
6 * subtitlehandler.c is free software.
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
17 #include "hb-backend.h"
19 #include "callbacks.h"
22 #include "audiohandler.h"
23 #include "subtitlehandler.h"
25 static void add_to_subtitle_list(signal_user_data_t *ud, GValue *settings);
26 static void add_to_srt_list(signal_user_data_t *ud, GValue *settings);
29 free_subtitle_index_list(gpointer data)
35 free_subtitle_key(gpointer data)
42 mustBurn(signal_user_data_t *ud, GValue *settings)
48 ghb_soft_in_subtitle_list(GValue *subtitle_list)
53 count = ghb_array_len(subtitle_list);
54 for (ii = 0; ii < count; ii++)
56 settings = ghb_array_get_nth(subtitle_list, ii);
57 if (!ghb_settings_get_boolean(settings, "SubtitleBurned"))
66 ghb_subtitle_exclusive_burn(signal_user_data_t *ud, gint index)
68 GValue *subtitle_list;
76 g_debug("ghb_subtitle_exclusive_burn");
77 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
78 count = ghb_array_len(subtitle_list);
79 for (ii = 0; ii < count; ii++)
81 settings = ghb_array_get_nth(subtitle_list, ii);
82 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
84 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
85 g_return_if_fail(tv != NULL);
86 tm = gtk_tree_view_get_model(tv);
87 gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
88 if (burned && ii != index && !mustBurn(ud, settings))
90 ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
91 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, FALSE, -1);
97 ghb_subtitle_exclusive_default(signal_user_data_t *ud, gint index)
99 GValue *subtitle_list;
107 g_debug("ghb_subtitle_exclusive_default");
108 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
109 count = ghb_array_len(subtitle_list);
110 for (ii = 0; ii < count; ii++)
112 settings = ghb_array_get_nth(subtitle_list, ii);
113 def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
115 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
116 g_return_if_fail(tv != NULL);
117 tm = gtk_tree_view_get_model(tv);
118 gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
119 if (def && ii != index)
122 ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", FALSE);
123 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, FALSE, -1);
129 ghb_add_srt(signal_user_data_t *ud, GValue *settings)
131 // Add the current subtitle settings to the list.
132 GValue *subtitle_list;
136 g_debug("ghb_add_srt ()");
138 ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
139 // Add the long track description so the queue can access it
140 // when a different title is selected.
141 lang = ghb_settings_combo_option(settings, "SrtLanguage");
142 ghb_settings_set_string(settings, "SubtitleTrackDescription", lang);
144 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
145 if (subtitle_list == NULL)
147 subtitle_list = ghb_array_value_new(8);
148 ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
150 count = ghb_array_len(subtitle_list);
152 // Don't allow more than 99
153 // This is a had limit imposed by libhb/sync.c:GetFifoForId()
156 ghb_value_free(settings);
160 ghb_array_append(subtitle_list, settings);
161 add_to_srt_list(ud, settings);
166 widget = GHB_WIDGET (ud->builder, "subtitle_add");
167 gtk_widget_set_sensitive(widget, FALSE);
168 widget = GHB_WIDGET (ud->builder, "srt_add");
169 gtk_widget_set_sensitive(widget, FALSE);
171 ghb_update_destination_extension(ud);
176 ghb_add_subtitle(signal_user_data_t *ud, GValue *settings)
178 // Add the current subtitle settings to the list.
179 GValue *subtitle_list;
185 g_debug("ghb_add_subtitle ()");
187 // Add the long track description so the queue can access it
188 // when a different title is selected.
189 track = ghb_settings_combo_option(settings, "SubtitleTrack");
190 ghb_settings_set_string(settings, "SubtitleTrackDescription", track);
192 lang = ghb_settings_combo_string(settings, "SubtitleTrack");
193 ghb_settings_set_string(settings, "SubtitleLanguage", lang);
195 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
196 if (subtitle_list == NULL)
198 subtitle_list = ghb_array_value_new(8);
199 ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
201 count = ghb_array_len(subtitle_list);
203 // Don't allow more than 99
204 // This is a had limit imposed by libhb/sync.c:GetFifoForId()
207 ghb_value_free(settings);
211 ghb_array_append(subtitle_list, settings);
212 add_to_subtitle_list(ud, settings);
214 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
216 ghb_subtitle_exclusive_burn(ud, count);
220 widget = GHB_WIDGET (ud->builder, "subtitle_add");
221 gtk_widget_set_sensitive(widget, FALSE);
222 widget = GHB_WIDGET (ud->builder, "srt_add");
223 gtk_widget_set_sensitive(widget, FALSE);
225 ghb_update_destination_extension(ud);
230 add_all_pref_subtitles(signal_user_data_t *ud)
232 const GValue *pref_subtitle;
234 gint count, ii, track;
237 pref_subtitle = ghb_settings_get_value(ud->settings, "SubtitleList");
238 count = ghb_array_len(pref_subtitle);
239 for (ii = 0; ii < count; ii++)
241 subtitle = ghb_value_dup(ghb_array_get_nth(pref_subtitle, ii));
242 lang = ghb_settings_get_string(subtitle, "SubtitleLanguage");
243 // If there are multiple subtitles using the same language, then
244 // select sequential tracks for each. The hash keeps track
245 // of the tracks used for each language.
246 track = ghb_find_pref_subtitle_track(lang);
252 // Add to subtitle list
253 ghb_settings_set_int(subtitle, "SubtitleTrack", track);
254 source = ghb_subtitle_track_source(ud, track);
255 ghb_settings_set_int(subtitle, "SubtitleSource", source);
256 ghb_add_subtitle(ud, subtitle);
262 ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
265 GHashTable *track_indices;
266 gchar *lang, *pref_lang = NULL;
268 gint foreign_lang_index = -1;
269 gboolean found_cc = FALSE;
271 const GValue *pref_subtitle;
275 g_debug("ghb_set_pref_subtitle %d", titleindex);
277 // Check to see if we need to add a subtitle track for foreign audio
278 // language films. A subtitle track will be added if:
280 // The first (default) audio track language does NOT match the users
281 // chosen Preferred Language AND the Preferred Language is NOT Any (und).
283 audio_lang = ghb_get_user_audio_lang(ud, titleindex, 0);
284 pref_lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
286 if (audio_lang != NULL && pref_lang != NULL &&
287 (strcmp(audio_lang, pref_lang) == 0 || strcmp("und", pref_lang) == 0))
293 track_indices = g_hash_table_new_full(g_str_hash, g_str_equal,
294 free_subtitle_key, free_subtitle_index_list);
296 ghb_ui_update(ud, "SubtitleTrack", ghb_int_value(0));
298 // Clear the subtitle list
299 ghb_clear_subtitle_list(ud);
302 add_all_pref_subtitles(ud);
306 // Find "best" subtitle based on subtitle preferences
307 pref_subtitle = ghb_settings_get_value(ud->settings, "SubtitleList");
309 count = ghb_array_len(pref_subtitle);
311 for (ii = 0; ii < count; ii++)
314 gboolean force, burn;
316 subtitle = ghb_array_get_nth(pref_subtitle, ii);
317 lang = ghb_settings_get_string(subtitle, "SubtitleLanguage");
318 source = ghb_settings_get_int(subtitle, "SubtitleSource");
319 burn = ghb_settings_get_boolean(subtitle, "SubtitleBurned");
320 force = ghb_settings_get_boolean(subtitle, "SubtitleForced");
321 // If there are multiple subtitles using the same language, then
322 // select sequential tracks for each. The hash keeps track
323 // of the tracks used for each language.
324 track = ghb_find_subtitle_track(titleindex, lang, burn,
325 force, source, track_indices);
329 GValue *dup = ghb_value_dup(subtitle);
330 lang = ghb_subtitle_track_lang(ud, track);
331 ghb_settings_set_int(dup, "SubtitleTrack", track);
332 if (foreign_lang_index < 0 && pref_lang != NULL &&
333 strcmp(lang, pref_lang) == 0)
335 foreign_lang_index = jj;
336 ghb_settings_take_value(dup, "SubtitleForced",
337 ghb_boolean_value_new(FALSE));
338 ghb_settings_take_value(dup, "SubtitleDefaultTrack",
339 ghb_boolean_value_new(TRUE));
341 source = ghb_subtitle_track_source(ud, track);
342 ghb_settings_set_int(dup, "SubtitleSource", source);
343 if (source == CC608SUB || source == CC708SUB)
345 ghb_add_subtitle(ud, dup);
350 if (foreign_lang_index < 0 && pref_lang != NULL)
352 // Subtitle for foreign language audio not added yet
356 track = ghb_find_subtitle_track(titleindex, pref_lang, FALSE, FALSE, VOBSUB, track_indices);
361 settings = ghb_dict_value_new();
362 ghb_settings_set_int(settings, "SubtitleTrack", track);
363 source = ghb_subtitle_track_source(ud, track);
364 ghb_settings_set_int(settings, "SubtitleSource", source);
365 burn = mustBurn(ud, settings);
366 ghb_settings_take_value(settings, "SubtitleForced",
367 ghb_boolean_value_new(FALSE));
368 ghb_settings_take_value(settings, "SubtitleBurned",
369 ghb_boolean_value_new(burn));
370 ghb_settings_take_value(settings, "SubtitleDefaultTrack",
371 ghb_boolean_value_new(TRUE));
373 ghb_add_subtitle(ud, settings);
374 foreign_lang_index = jj;
377 if (foreign_lang_index >= 0)
379 GValue *subtitle_list;
382 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
383 subtitle = ghb_array_get_nth(subtitle_list, foreign_lang_index);
385 burn = ghb_settings_get_boolean(subtitle, "SubtitleBurned");
386 def = ghb_settings_get_boolean(subtitle, "SubtitleDefaultTrack");
388 ghb_subtitle_exclusive_burn(ud, foreign_lang_index);
390 ghb_subtitle_exclusive_default(ud, foreign_lang_index);
391 ghb_log("adding subtitle for foreign language audio: %s", audio_lang);
393 if (ghb_settings_get_boolean(ud->settings, "AddCC") && !found_cc)
395 // Subtitle for foreign language audio not added yet
398 track = ghb_find_cc_track(titleindex);
403 settings = ghb_dict_value_new();
404 ghb_settings_set_int(settings, "SubtitleTrack", track);
405 source = ghb_subtitle_track_source(ud, track);
406 ghb_settings_set_int(settings, "SubtitleSource", source);
407 ghb_settings_take_value(settings, "SubtitleForced",
408 ghb_boolean_value_new(FALSE));
409 ghb_settings_take_value(settings, "SubtitleBurned",
410 ghb_boolean_value_new(FALSE));
411 ghb_settings_take_value(settings, "SubtitleDefaultTrack",
412 ghb_boolean_value_new(FALSE));
414 ghb_add_subtitle(ud, settings);
415 ghb_log("adding Closed Captions: %s", audio_lang);
418 if (pref_lang != NULL)
420 if (audio_lang != NULL)
422 g_hash_table_destroy(track_indices);
426 ghb_selected_subtitle_row(signal_user_data_t *ud)
428 GtkTreeView *treeview;
429 GtkTreePath *treepath;
430 GtkTreeSelection *selection;
436 g_debug("ghb_selected_subtitle_row ()");
437 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
438 selection = gtk_tree_view_get_selection (treeview);
439 if (gtk_tree_selection_get_selected(selection, &store, &iter))
441 // Get the row number
442 treepath = gtk_tree_model_get_path (store, &iter);
443 indices = gtk_tree_path_get_indices (treepath);
445 gtk_tree_path_free(treepath);
451 ghb_selected_subtitle_settings(signal_user_data_t *ud)
453 GtkTreeView *treeview;
454 GtkTreePath *treepath;
455 GtkTreeSelection *selection;
460 GValue *settings = NULL;
461 const GValue *subtitle_list;
463 g_debug("get_selected_settings ()");
464 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
465 selection = gtk_tree_view_get_selection (treeview);
466 if (gtk_tree_selection_get_selected(selection, &store, &iter))
468 // Get the row number
469 treepath = gtk_tree_model_get_path (store, &iter);
470 indices = gtk_tree_path_get_indices (treepath);
472 gtk_tree_path_free(treepath);
473 // find subtitle settings
474 if (row < 0) return NULL;
475 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
476 if (row >= ghb_array_len(subtitle_list))
478 settings = ghb_array_get_nth(subtitle_list, row);
484 subtitle_forced_toggled_cb(
485 GtkCellRendererToggle *cell,
487 signal_user_data_t *ud)
496 GValue *subtitle_list, *settings;
499 g_debug("forced toggled");
500 tp = gtk_tree_path_new_from_string (path);
501 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
502 g_return_if_fail(tv != NULL);
503 tm = gtk_tree_view_get_model(tv);
504 g_return_if_fail(tm != NULL);
505 gtk_tree_model_get_iter(tm, &ti, tp);
506 gtk_tree_model_get(tm, &ti, 1, &active, -1);
509 // Get the row number
510 indices = gtk_tree_path_get_indices (tp);
512 gtk_tree_path_free(tp);
514 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
516 if (row < 0 || row >= ghb_array_len(subtitle_list))
519 settings = ghb_array_get_nth(subtitle_list, row);
521 source = ghb_settings_get_int(settings, "SubtitleSource");
522 if (source != VOBSUB)
525 ghb_settings_set_boolean(settings, "SubtitleForced", active);
526 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 1, active, -1);
531 subtitle_burned_toggled_cb(
532 GtkCellRendererToggle *cell,
534 signal_user_data_t *ud)
543 GValue *subtitle_list;
548 g_debug("burned toggled");
549 tp = gtk_tree_path_new_from_string (path);
550 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
551 g_return_if_fail(tv != NULL);
552 tm = gtk_tree_view_get_model(tv);
553 g_return_if_fail(tm != NULL);
554 gtk_tree_model_get_iter(tm, &ti, tp);
555 gtk_tree_model_get(tm, &ti, 2, &active, -1);
558 // Get the row number
559 indices = gtk_tree_path_get_indices (tp);
561 gtk_tree_path_free(tp);
563 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
564 count = ghb_array_len(subtitle_list);
565 if (row < 0 || row >= count)
568 settings = ghb_array_get_nth(subtitle_list, row);
569 source = ghb_settings_get_int(settings, "SubtitleSource");
570 if (source != VOBSUB)
572 if (!active && mustBurn(ud, settings))
575 ghb_settings_set_boolean(settings, "SubtitleBurned", active);
576 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, active, -1);
580 ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", !active);
581 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, !active, -1);
586 ghb_subtitle_exclusive_burn(ud, row);
587 ghb_update_destination_extension(ud);
592 subtitle_default_toggled_cb(
593 GtkCellRendererToggle *cell,
595 signal_user_data_t *ud)
604 GValue *subtitle_list;
608 g_debug("default toggled");
609 tp = gtk_tree_path_new_from_string (path);
610 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
611 g_return_if_fail(tv != NULL);
612 tm = gtk_tree_view_get_model(tv);
613 g_return_if_fail(tm != NULL);
614 gtk_tree_model_get_iter(tm, &ti, tp);
615 gtk_tree_model_get(tm, &ti, 3, &active, -1);
618 // Get the row number
619 indices = gtk_tree_path_get_indices (tp);
621 gtk_tree_path_free(tp);
623 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
624 count = ghb_array_len(subtitle_list);
625 if (row < 0 || row >= count)
628 settings = ghb_array_get_nth(subtitle_list, row);
629 if (active && mustBurn(ud, settings))
632 ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", active);
633 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, active, -1);
637 ghb_settings_set_boolean(settings, "SubtitleBurned", !active);
638 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, !active, -1);
640 // allow only one default
641 ghb_subtitle_exclusive_default(ud, row);
646 subtitle_list_refresh_selected(signal_user_data_t *ud)
648 GtkTreeView *treeview;
649 GtkTreePath *treepath;
650 GtkTreeSelection *selection;
655 GValue *settings = NULL;
656 const GValue *subtitle_list;
657 gboolean allow_burn_force = FALSE;
659 g_debug("subtitle_list_refresh_selected ()");
660 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
661 selection = gtk_tree_view_get_selection (treeview);
662 if (gtk_tree_selection_get_selected(selection, &store, &iter))
664 gchar *track, *source;
665 gboolean forced, burned, def;
669 // Get the row number
670 treepath = gtk_tree_model_get_path (store, &iter);
671 indices = gtk_tree_path_get_indices (treepath);
673 gtk_tree_path_free(treepath);
675 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
676 if (row >= ghb_array_len(subtitle_list))
678 settings = ghb_array_get_nth(subtitle_list, row);
680 def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
683 i_source = ghb_settings_get_int(settings, "SubtitleSource");
684 if (i_source != VOBSUB)
686 // Force and burn only apply to VOBSUBS
689 ghb_settings_set_boolean(settings, "SubtitleForced", forced);
690 ghb_settings_set_boolean(settings, "SubtitleBurned", burned);
693 if (i_source == SRTSUB)
698 lang = ghb_settings_combo_option(settings, "SrtLanguage");
699 code = ghb_settings_get_string(settings, "SrtCodeset");
701 s_track = ghb_settings_get_string(settings, "SrtFile");
702 if (g_file_test(s_track, G_FILE_TEST_IS_REGULAR))
706 basename = g_path_get_basename(s_track);
707 track = g_strdup_printf("%s (%s)(SRT)(%s)", lang, code, basename);
708 source = g_strdup_printf("SRT (%s)", basename);
713 track = g_strdup_printf("%s (%s)(SRT)", lang, code);
714 source = g_strdup_printf("SRT (none)");
717 offset = ghb_settings_get_int(settings, "SrtOffset");
725 ghb_settings_combo_option(settings, "SubtitleTrack"));
726 source = g_strdup(ghb_subtitle_source_name(i_source));
727 s_track = ghb_settings_get_string(settings, "SubtitleTrack");
729 forced = ghb_settings_get_boolean(settings, "SubtitleForced");
730 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
733 if (i_source == VOBSUB)
734 allow_burn_force = TRUE;
737 gtk_list_store_set(GTK_LIST_STORE(store), &iter,
738 // These are displayed in list
744 // These are used to set combo box values when a list item is selected
754 ghb_subtitle_exclusive_burn(ud, row);
759 subtitle_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
763 g_debug("subtitle_track_changed_cb ()");
764 ghb_check_dependency(ud, widget, NULL);
765 ghb_widget_to_setting(ud->settings, widget);
766 settings = ghb_selected_subtitle_settings(ud);
767 if (settings != NULL)
769 const gchar *track, *lang;
772 ghb_widget_to_setting(settings, widget);
773 track = ghb_settings_combo_option(settings, "SubtitleTrack");
774 ghb_settings_set_string(settings, "SubtitleTrackDescription", track);
775 tt = ghb_settings_get_int(settings, "SubtitleTrack");
776 source = ghb_subtitle_track_source(ud, tt);
777 ghb_settings_set_int(settings, "SubtitleSource", source);
778 lang = ghb_settings_combo_string(settings, "SubtitleTrack");
779 ghb_settings_set_string(settings, "SubtitleLanguage", lang);
780 subtitle_list_refresh_selected(ud);
787 srt_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
791 g_debug("srt_changed_cb ()");
792 ghb_check_dependency(ud, widget, NULL);
793 ghb_widget_to_setting(ud->settings, widget);
794 settings = ghb_selected_subtitle_settings(ud);
795 if (settings != NULL)
797 ghb_widget_to_setting(settings, widget);
798 subtitle_list_refresh_selected(ud);
805 srt_file_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
809 g_debug("srt_file_changed_cb ()");
810 ghb_check_dependency(ud, widget, NULL);
811 ghb_widget_to_setting(ud->settings, widget);
812 settings = ghb_selected_subtitle_settings(ud);
813 if (settings != NULL)
815 gchar *filename, *dirname;
817 ghb_widget_to_setting(settings, widget);
818 subtitle_list_refresh_selected(ud);
822 filename = ghb_settings_get_string(settings, "SrtFile");
823 if (g_file_test(filename, G_FILE_TEST_IS_DIR))
825 ghb_settings_set_string(ud->settings, "SrtDir", filename);
829 dirname = g_path_get_dirname(filename);
830 ghb_settings_set_string(ud->settings, "SrtDir", dirname);
833 ghb_pref_save(ud->settings, "SrtDir");
839 srt_lang_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
843 g_debug("srt_lang_changed_cb ()");
844 ghb_check_dependency(ud, widget, NULL);
845 ghb_widget_to_setting(ud->settings, widget);
846 settings = ghb_selected_subtitle_settings(ud);
847 if (settings != NULL)
851 ghb_widget_to_setting(settings, widget);
852 subtitle_list_refresh_selected(ud);
856 lang = ghb_settings_combo_option(settings, "SrtLanguage");
857 ghb_settings_set_string(settings, "SubtitleTrackDescription", lang);
862 ghb_clear_subtitle_list(signal_user_data_t *ud)
864 GtkTreeView *treeview;
866 GValue *subtitle_list;
868 g_debug("clear_subtitle_list ()");
869 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
870 if (subtitle_list == NULL)
872 subtitle_list = ghb_array_value_new(8);
873 ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
876 ghb_array_value_reset(subtitle_list, 8);
877 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
878 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
879 gtk_list_store_clear (store);
883 add_to_subtitle_list(
884 signal_user_data_t *ud,
887 GtkTreeView *treeview;
890 GtkTreeSelection *selection;
891 const gchar *track, *source;
892 gboolean forced, burned, def;
895 gboolean allow_burn_force = FALSE;
897 g_debug("add_to_subtitle_list ()");
898 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
899 selection = gtk_tree_view_get_selection (treeview);
900 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
902 track = ghb_settings_combo_option(settings, "SubtitleTrack");
903 forced = ghb_settings_get_boolean(settings, "SubtitleForced");
904 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
905 def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
907 s_track = ghb_settings_get_string(settings, "SubtitleTrack");
908 i_source = ghb_settings_get_int(settings, "SubtitleSource");
909 source = ghb_subtitle_source_name(i_source);
911 if (i_source == VOBSUB)
912 allow_burn_force = TRUE;
914 gtk_list_store_append(store, &iter);
915 gtk_list_store_set(store, &iter,
916 // These are displayed in list
921 // These are used to set combo box values when a list item is selected
928 gtk_tree_selection_select_iter(selection, &iter);
934 signal_user_data_t *ud,
937 GtkTreeView *treeview;
940 GtkTreeSelection *selection;
942 gboolean forced, burned, def;
943 gchar *filename, *code, *track, *source;
944 gint i_source, offset;
946 g_debug("add_to_srt_list ()");
947 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
948 selection = gtk_tree_view_get_selection (treeview);
949 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
951 lang = ghb_settings_combo_option(settings, "SrtLanguage");
952 code = ghb_settings_get_string(settings, "SrtCodeset");
955 def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
957 filename = ghb_settings_get_string(settings, "SrtFile");
958 if (g_file_test(filename, G_FILE_TEST_IS_REGULAR))
962 basename = g_path_get_basename(filename);
963 track = g_strdup_printf("%s (%s)(SRT)(%s)", lang, code, basename);
964 source = g_strdup_printf("SRT (%s)", basename);
969 track = g_strdup_printf("%s (%s)(SRT)", lang, code);
970 source = g_strdup_printf("SRT (none)");
973 offset = ghb_settings_get_int(settings, "SrtOffset");
975 gtk_list_store_append(store, &iter);
976 gtk_list_store_set(store, &iter,
977 // These are displayed in list
983 // These are used to set combo box values when a list item is selected
990 gtk_tree_selection_select_iter(selection, &iter);
998 subtitle_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
1000 GtkTreeModel *store;
1004 g_debug("subtitle_list_selection_changed_cb ()");
1005 if (gtk_tree_selection_get_selected(selection, &store, &iter))
1008 GtkTreePath *treepath;
1010 GValue *subtitle_list, *settings;
1012 treepath = gtk_tree_model_get_path (store, &iter);
1013 indices = gtk_tree_path_get_indices (treepath);
1015 gtk_tree_path_free(treepath);
1017 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
1018 if (row >= ghb_array_len(subtitle_list))
1021 settings = ghb_array_get_nth(subtitle_list, row);
1023 source = ghb_settings_get_int(settings, "SubtitleSource");
1024 if (source == SRTSUB)
1029 str = ghb_settings_get_string(settings, "SrtLanguage");
1030 ghb_ui_update(ud, "SrtLanguage", ghb_string_value(str));
1033 str = ghb_settings_get_string(settings, "SrtCodeset");
1034 ghb_ui_update(ud, "SrtCodeset", ghb_string_value(str));
1037 str = ghb_settings_get_string(settings, "SrtFile");
1038 ghb_ui_update(ud, "SrtFile", ghb_string_value(str));
1041 offset = ghb_settings_get_int(settings, "SrtOffset");
1042 ghb_ui_update(ud, "SrtOffset", ghb_int_value(offset));
1044 widget = GHB_WIDGET(ud->builder, "subtitle_track_label");
1045 gtk_widget_hide(widget);
1046 widget = GHB_WIDGET(ud->builder, "SubtitleTrack");
1047 gtk_widget_hide(widget);
1048 widget = GHB_WIDGET(ud->builder, "srt_lang_label");
1049 gtk_widget_show(widget);
1050 widget = GHB_WIDGET(ud->builder, "srt_code_label");
1051 gtk_widget_show(widget);
1052 widget = GHB_WIDGET(ud->builder, "srt_file_label");
1053 gtk_widget_show(widget);
1054 widget = GHB_WIDGET(ud->builder, "srt_offset_label");
1055 gtk_widget_show(widget);
1056 widget = GHB_WIDGET(ud->builder, "SrtLanguage");
1057 gtk_widget_show(widget);
1058 widget = GHB_WIDGET(ud->builder, "SrtCodeset");
1059 gtk_widget_show(widget);
1060 widget = GHB_WIDGET(ud->builder, "SrtFile");
1061 gtk_widget_show(widget);
1062 widget = GHB_WIDGET(ud->builder, "SrtOffset");
1063 gtk_widget_show(widget);
1069 track = ghb_settings_get_string(settings, "SubtitleTrack");
1070 ghb_ui_update(ud, "SubtitleTrack", ghb_string_value(track));
1073 widget = GHB_WIDGET(ud->builder, "srt_lang_label");
1074 gtk_widget_hide(widget);
1075 widget = GHB_WIDGET(ud->builder, "srt_code_label");
1076 gtk_widget_hide(widget);
1077 widget = GHB_WIDGET(ud->builder, "srt_file_label");
1078 gtk_widget_hide(widget);
1079 widget = GHB_WIDGET(ud->builder, "srt_offset_label");
1080 gtk_widget_hide(widget);
1081 widget = GHB_WIDGET(ud->builder, "SrtLanguage");
1082 gtk_widget_hide(widget);
1083 widget = GHB_WIDGET(ud->builder, "SrtCodeset");
1084 gtk_widget_hide(widget);
1085 widget = GHB_WIDGET(ud->builder, "SrtFile");
1086 gtk_widget_hide(widget);
1087 widget = GHB_WIDGET(ud->builder, "SrtOffset");
1088 gtk_widget_hide(widget);
1089 widget = GHB_WIDGET(ud->builder, "subtitle_track_label");
1090 gtk_widget_show(widget);
1091 widget = GHB_WIDGET(ud->builder, "SubtitleTrack");
1092 gtk_widget_show(widget);
1094 widget = GHB_WIDGET (ud->builder, "subtitle_remove");
1095 gtk_widget_set_sensitive(widget, TRUE);
1099 widget = GHB_WIDGET(ud->builder, "srt_lang_label");
1100 gtk_widget_hide(widget);
1101 widget = GHB_WIDGET(ud->builder, "srt_code_label");
1102 gtk_widget_hide(widget);
1103 widget = GHB_WIDGET(ud->builder, "srt_file_label");
1104 gtk_widget_hide(widget);
1105 widget = GHB_WIDGET(ud->builder, "srt_offset_label");
1106 gtk_widget_hide(widget);
1107 widget = GHB_WIDGET(ud->builder, "SrtLanguage");
1108 gtk_widget_hide(widget);
1109 widget = GHB_WIDGET(ud->builder, "SrtCodeset");
1110 gtk_widget_hide(widget);
1111 widget = GHB_WIDGET(ud->builder, "SrtFile");
1112 gtk_widget_hide(widget);
1113 widget = GHB_WIDGET(ud->builder, "SrtOffset");
1114 gtk_widget_hide(widget);
1115 widget = GHB_WIDGET(ud->builder, "subtitle_track_label");
1116 gtk_widget_show(widget);
1117 widget = GHB_WIDGET(ud->builder, "SubtitleTrack");
1118 gtk_widget_show(widget);
1122 G_MODULE_EXPORT void
1123 srt_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
1125 // Add the current subtitle settings to the list.
1127 gchar *dir, *filename, *lang;
1129 g_debug("subtitle_add_clicked_cb ()");
1131 settings = ghb_dict_value_new();
1132 ghb_settings_set_int(settings, "SubtitleSource", SRTSUB);
1133 lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
1134 ghb_settings_set_string(settings, "SrtLanguage", lang);
1136 ghb_settings_set_string(settings, "SrtCodeset", "UTF-8");
1138 dir = ghb_settings_get_string(ud->settings, "SrtDir");
1139 filename = g_strdup_printf("%s/none", dir);
1140 ghb_settings_set_string(settings, "SrtFile", filename);
1144 ghb_settings_set_int(settings, "SrtOffset", 0);
1145 ghb_settings_take_value(settings, "SubtitleDefaultTrack",
1146 ghb_boolean_value_new(FALSE));
1148 ghb_add_srt(ud, settings);
1151 G_MODULE_EXPORT void
1152 subtitle_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
1154 // Add the current subtitle settings to the list.
1156 gboolean burned = FALSE;
1159 g_debug("subtitle_add_clicked_cb ()");
1161 track = ghb_settings_get_int(ud->settings, "SubtitleTrack");
1163 settings = ghb_dict_value_new();
1164 ghb_settings_set_int(settings, "SubtitleTrack", track);
1165 source = ghb_subtitle_track_source(ud, track);
1166 ghb_settings_set_int(settings, "SubtitleSource", source);
1167 if (mustBurn(ud, settings))
1171 ghb_settings_take_value(settings, "SubtitleForced",
1172 ghb_boolean_value_new(FALSE));
1173 ghb_settings_take_value(settings, "SubtitleBurned",
1174 ghb_boolean_value_new(burned));
1175 ghb_settings_take_value(settings, "SubtitleDefaultTrack",
1176 ghb_boolean_value_new(FALSE));
1178 ghb_add_subtitle(ud, settings);
1181 G_MODULE_EXPORT void
1182 subtitle_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
1184 GtkTreeView *treeview;
1185 GtkTreePath *treepath;
1186 GtkTreeSelection *selection;
1187 GtkTreeModel *store;
1188 GtkTreeIter iter, nextIter;
1191 GValue *subtitle_list;
1193 g_debug("subtitle_remove_clicked_cb ()");
1194 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
1195 selection = gtk_tree_view_get_selection (treeview);
1196 if (gtk_tree_selection_get_selected(selection, &store, &iter))
1199 if (!gtk_tree_model_iter_next(store, &nextIter))
1202 if (gtk_tree_model_get_iter_first(store, &nextIter))
1204 gtk_tree_selection_select_iter (selection, &nextIter);
1209 gtk_tree_selection_select_iter (selection, &nextIter);
1211 // Get the row number
1212 treepath = gtk_tree_model_get_path (store, &iter);
1213 indices = gtk_tree_path_get_indices (treepath);
1215 gtk_tree_path_free(treepath);
1216 // Remove the selected item
1217 gtk_list_store_remove (GTK_LIST_STORE(store), &iter);
1218 // remove from subtitle settings list
1219 if (row < 0) return;
1220 widget = GHB_WIDGET (ud->builder, "subtitle_add");
1221 gtk_widget_set_sensitive(widget, TRUE);
1222 widget = GHB_WIDGET (ud->builder, "srt_add");
1223 gtk_widget_set_sensitive(widget, TRUE);
1224 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
1225 if (row >= ghb_array_len(subtitle_list))
1227 GValue *old = ghb_array_get_nth(subtitle_list, row);
1228 ghb_value_free(old);
1229 ghb_array_remove(subtitle_list, row);
1235 ghb_subtitle_prune(signal_user_data_t *ud)
1240 GValue *subtitle_list;
1242 gint first_track = 0, one_burned = 0;
1244 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
1245 if (subtitle_list == NULL)
1247 count = ghb_array_len(subtitle_list);
1249 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
1250 g_return_if_fail(tv != NULL);
1251 tm = gtk_tree_view_get_model(tv);
1252 for (ii = count-1; ii >= 0; ii--)
1257 settings = ghb_array_get_nth(subtitle_list, ii);
1258 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
1259 if (!burned && mustBurn(ud, settings))
1261 gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
1262 gtk_list_store_remove (GTK_LIST_STORE(tm), &ti);
1263 ghb_array_remove(subtitle_list, ii);
1273 ghb_subtitle_exclusive_burn(ud, first_track);
1278 ghb_reset_subtitles(signal_user_data_t *ud, GValue *settings)
1285 g_debug("ghb_reset_subtitles");
1286 ghb_clear_subtitle_list(ud);
1287 titleindex = ghb_settings_combo_int(ud->settings, "title");
1291 slist = ghb_settings_get_value(settings, "subtitle_list");
1292 count = ghb_array_len(slist);
1293 for (ii = 0; ii < count; ii++)
1297 subtitle = ghb_value_dup(ghb_array_get_nth(slist, ii));
1298 source = ghb_settings_get_int(subtitle, "SubtitleSource");
1299 if (source == SRTSUB)
1300 ghb_add_srt(ud, subtitle);
1302 ghb_add_subtitle(ud, subtitle);