1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) John Stebbins 2008-2011 <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)
50 return (source == VOBSUB || source == SSASUB);
56 return (source == VOBSUB);
60 ghb_soft_in_subtitle_list(GValue *subtitle_list)
65 count = ghb_array_len(subtitle_list);
66 for (ii = 0; ii < count; ii++)
68 settings = ghb_array_get_nth(subtitle_list, ii);
69 if (!ghb_settings_get_boolean(settings, "SubtitleBurned"))
78 ghb_subtitle_exclusive_burn(signal_user_data_t *ud, gint index)
80 GValue *subtitle_list;
88 g_debug("ghb_subtitle_exclusive_burn");
89 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
90 count = ghb_array_len(subtitle_list);
91 for (ii = 0; ii < count; ii++)
93 settings = ghb_array_get_nth(subtitle_list, ii);
94 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
96 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
97 g_return_if_fail(tv != NULL);
98 tm = gtk_tree_view_get_model(tv);
99 gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
100 if (burned && ii != index && !mustBurn(ud, settings))
102 ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
103 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, FALSE, -1);
109 ghb_subtitle_exclusive_default(signal_user_data_t *ud, gint index)
111 GValue *subtitle_list;
119 g_debug("ghb_subtitle_exclusive_default");
120 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
121 count = ghb_array_len(subtitle_list);
122 for (ii = 0; ii < count; ii++)
124 settings = ghb_array_get_nth(subtitle_list, ii);
125 def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
127 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
128 g_return_if_fail(tv != NULL);
129 tm = gtk_tree_view_get_model(tv);
130 gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
131 if (def && ii != index)
134 ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", FALSE);
135 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, FALSE, -1);
141 ghb_add_srt(signal_user_data_t *ud, GValue *settings)
143 // Add the current subtitle settings to the list.
144 GValue *subtitle_list;
148 g_debug("ghb_add_srt ()");
150 ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
151 // Add the long track description so the queue can access it
152 // when a different title is selected.
153 lang = ghb_settings_combo_option(settings, "SrtLanguage");
154 ghb_settings_set_string(settings, "SubtitleTrackDescription", lang);
156 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
157 if (subtitle_list == NULL)
159 subtitle_list = ghb_array_value_new(8);
160 ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
162 count = ghb_array_len(subtitle_list);
164 // Don't allow more than 99
165 // This is a had limit imposed by libhb/sync.c:GetFifoForId()
168 ghb_value_free(settings);
172 ghb_array_append(subtitle_list, settings);
173 add_to_srt_list(ud, settings);
178 widget = GHB_WIDGET (ud->builder, "subtitle_add");
179 gtk_widget_set_sensitive(widget, FALSE);
180 widget = GHB_WIDGET (ud->builder, "srt_add");
181 gtk_widget_set_sensitive(widget, FALSE);
183 ghb_update_destination_extension(ud);
188 ghb_add_subtitle(signal_user_data_t *ud, GValue *settings)
190 // Add the current subtitle settings to the list.
191 GValue *subtitle_list;
197 g_debug("ghb_add_subtitle ()");
199 // Add the long track description so the queue can access it
200 // when a different title is selected.
201 track = ghb_settings_combo_option(settings, "SubtitleTrack");
202 ghb_settings_set_string(settings, "SubtitleTrackDescription", track);
204 lang = ghb_settings_combo_string(settings, "SubtitleTrack");
205 ghb_settings_set_string(settings, "SubtitleLanguage", lang);
207 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
208 if (subtitle_list == NULL)
210 subtitle_list = ghb_array_value_new(8);
211 ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
213 count = ghb_array_len(subtitle_list);
215 // Don't allow more than 99
216 // This is a had limit imposed by libhb/sync.c:GetFifoForId()
219 ghb_value_free(settings);
223 ghb_array_append(subtitle_list, settings);
224 add_to_subtitle_list(ud, settings);
226 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
228 ghb_subtitle_exclusive_burn(ud, count);
232 widget = GHB_WIDGET (ud->builder, "subtitle_add");
233 gtk_widget_set_sensitive(widget, FALSE);
234 widget = GHB_WIDGET (ud->builder, "srt_add");
235 gtk_widget_set_sensitive(widget, FALSE);
237 ghb_update_destination_extension(ud);
242 add_all_pref_subtitles(signal_user_data_t *ud)
244 const GValue *pref_subtitle;
246 gint count, ii, track;
249 pref_subtitle = ghb_settings_get_value(ud->settings, "SubtitleList");
250 count = ghb_array_len(pref_subtitle);
251 for (ii = 0; ii < count; ii++)
253 subtitle = ghb_value_dup(ghb_array_get_nth(pref_subtitle, ii));
254 lang = ghb_settings_get_string(subtitle, "SubtitleLanguage");
255 // If there are multiple subtitles using the same language, then
256 // select sequential tracks for each. The hash keeps track
257 // of the tracks used for each language.
258 track = ghb_find_pref_subtitle_track(lang);
264 // Add to subtitle list
265 ghb_settings_set_int(subtitle, "SubtitleTrack", track);
266 source = ghb_subtitle_track_source(ud, track);
267 ghb_settings_set_int(subtitle, "SubtitleSource", source);
268 ghb_add_subtitle(ud, subtitle);
274 ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
277 GHashTable *track_indices;
278 gchar *lang, *pref_lang = NULL;
280 gint foreign_lang_index = -1;
281 gboolean found_cc = FALSE;
283 const GValue *pref_subtitle;
287 g_debug("ghb_set_pref_subtitle %d", titleindex);
289 // Check to see if we need to add a subtitle track for foreign audio
290 // language films. A subtitle track will be added if:
292 // The first (default) audio track language does NOT match the users
293 // chosen Preferred Language AND the Preferred Language is NOT Any (und).
295 audio_lang = ghb_get_user_audio_lang(ud, titleindex, 0);
296 pref_lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
298 if (audio_lang != NULL && pref_lang != NULL &&
299 (strcmp(audio_lang, pref_lang) == 0 || strcmp("und", pref_lang) == 0))
305 track_indices = g_hash_table_new_full(g_str_hash, g_str_equal,
306 free_subtitle_key, free_subtitle_index_list);
308 ghb_ui_update(ud, "SubtitleTrack", ghb_int_value(0));
310 // Clear the subtitle list
311 ghb_clear_subtitle_list(ud);
314 add_all_pref_subtitles(ud);
318 // Find "best" subtitle based on subtitle preferences
319 pref_subtitle = ghb_settings_get_value(ud->settings, "SubtitleList");
321 count = ghb_array_len(pref_subtitle);
323 for (ii = 0; ii < count; ii++)
326 gboolean force, burn;
328 subtitle = ghb_array_get_nth(pref_subtitle, ii);
329 lang = ghb_settings_get_string(subtitle, "SubtitleLanguage");
330 source = ghb_settings_get_int(subtitle, "SubtitleSource");
331 burn = ghb_settings_get_boolean(subtitle, "SubtitleBurned");
332 force = ghb_settings_get_boolean(subtitle, "SubtitleForced");
333 // If there are multiple subtitles using the same language, then
334 // select sequential tracks for each. The hash keeps track
335 // of the tracks used for each language.
336 track = ghb_find_subtitle_track(titleindex, lang, burn,
337 force, source, track_indices);
341 GValue *dup = ghb_value_dup(subtitle);
342 lang = ghb_subtitle_track_lang(ud, track);
343 ghb_settings_set_int(dup, "SubtitleTrack", track);
344 if (foreign_lang_index < 0 && pref_lang != NULL &&
345 strcmp(lang, pref_lang) == 0)
347 foreign_lang_index = jj;
348 ghb_settings_take_value(dup, "SubtitleForced",
349 ghb_boolean_value_new(FALSE));
350 ghb_settings_take_value(dup, "SubtitleDefaultTrack",
351 ghb_boolean_value_new(TRUE));
353 source = ghb_subtitle_track_source(ud, track);
354 ghb_settings_set_int(dup, "SubtitleSource", source);
355 if (source == CC608SUB || source == CC708SUB)
357 ghb_add_subtitle(ud, dup);
362 if (foreign_lang_index < 0 && pref_lang != NULL)
364 // Subtitle for foreign language audio not added yet
368 track = ghb_find_subtitle_track(titleindex, pref_lang, FALSE, FALSE, VOBSUB, track_indices);
373 settings = ghb_dict_value_new();
374 ghb_settings_set_int(settings, "SubtitleTrack", track);
375 source = ghb_subtitle_track_source(ud, track);
376 ghb_settings_set_int(settings, "SubtitleSource", source);
377 burn = mustBurn(ud, settings);
378 ghb_settings_take_value(settings, "SubtitleForced",
379 ghb_boolean_value_new(FALSE));
380 ghb_settings_take_value(settings, "SubtitleBurned",
381 ghb_boolean_value_new(burn));
382 ghb_settings_take_value(settings, "SubtitleDefaultTrack",
383 ghb_boolean_value_new(TRUE));
385 ghb_add_subtitle(ud, settings);
386 foreign_lang_index = jj;
389 if (foreign_lang_index >= 0)
391 GValue *subtitle_list;
394 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
395 subtitle = ghb_array_get_nth(subtitle_list, foreign_lang_index);
397 burn = ghb_settings_get_boolean(subtitle, "SubtitleBurned");
398 def = ghb_settings_get_boolean(subtitle, "SubtitleDefaultTrack");
400 ghb_subtitle_exclusive_burn(ud, foreign_lang_index);
402 ghb_subtitle_exclusive_default(ud, foreign_lang_index);
403 ghb_log("adding subtitle for foreign language audio: %s", audio_lang);
405 if (ghb_settings_get_boolean(ud->settings, "AddCC") && !found_cc)
407 // Subtitle for foreign language audio not added yet
410 track = ghb_find_cc_track(titleindex);
415 settings = ghb_dict_value_new();
416 ghb_settings_set_int(settings, "SubtitleTrack", track);
417 source = ghb_subtitle_track_source(ud, track);
418 ghb_settings_set_int(settings, "SubtitleSource", source);
419 ghb_settings_take_value(settings, "SubtitleForced",
420 ghb_boolean_value_new(FALSE));
421 ghb_settings_take_value(settings, "SubtitleBurned",
422 ghb_boolean_value_new(FALSE));
423 ghb_settings_take_value(settings, "SubtitleDefaultTrack",
424 ghb_boolean_value_new(FALSE));
426 ghb_add_subtitle(ud, settings);
427 ghb_log("adding Closed Captions: %s", audio_lang);
430 if (pref_lang != NULL)
432 if (audio_lang != NULL)
434 g_hash_table_destroy(track_indices);
438 ghb_selected_subtitle_row(signal_user_data_t *ud)
440 GtkTreeView *treeview;
441 GtkTreePath *treepath;
442 GtkTreeSelection *selection;
448 g_debug("ghb_selected_subtitle_row ()");
449 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
450 selection = gtk_tree_view_get_selection (treeview);
451 if (gtk_tree_selection_get_selected(selection, &store, &iter))
453 // Get the row number
454 treepath = gtk_tree_model_get_path (store, &iter);
455 indices = gtk_tree_path_get_indices (treepath);
457 gtk_tree_path_free(treepath);
463 ghb_selected_subtitle_settings(signal_user_data_t *ud)
465 GtkTreeView *treeview;
466 GtkTreePath *treepath;
467 GtkTreeSelection *selection;
472 GValue *settings = NULL;
473 const GValue *subtitle_list;
475 g_debug("get_selected_settings ()");
476 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
477 selection = gtk_tree_view_get_selection (treeview);
478 if (gtk_tree_selection_get_selected(selection, &store, &iter))
480 // Get the row number
481 treepath = gtk_tree_model_get_path (store, &iter);
482 indices = gtk_tree_path_get_indices (treepath);
484 gtk_tree_path_free(treepath);
485 // find subtitle settings
486 if (row < 0) return NULL;
487 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
488 if (row >= ghb_array_len(subtitle_list))
490 settings = ghb_array_get_nth(subtitle_list, row);
496 subtitle_forced_toggled_cb(
497 GtkCellRendererToggle *cell,
499 signal_user_data_t *ud)
508 GValue *subtitle_list, *settings;
511 g_debug("forced toggled");
512 tp = gtk_tree_path_new_from_string (path);
513 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
514 g_return_if_fail(tv != NULL);
515 tm = gtk_tree_view_get_model(tv);
516 g_return_if_fail(tm != NULL);
517 gtk_tree_model_get_iter(tm, &ti, tp);
518 gtk_tree_model_get(tm, &ti, 1, &active, -1);
521 // Get the row number
522 indices = gtk_tree_path_get_indices (tp);
524 gtk_tree_path_free(tp);
526 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
528 if (row < 0 || row >= ghb_array_len(subtitle_list))
531 settings = ghb_array_get_nth(subtitle_list, row);
533 source = ghb_settings_get_int(settings, "SubtitleSource");
534 if (!canForce(source))
537 ghb_settings_set_boolean(settings, "SubtitleForced", active);
538 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 1, active, -1);
543 subtitle_burned_toggled_cb(
544 GtkCellRendererToggle *cell,
546 signal_user_data_t *ud)
555 GValue *subtitle_list;
560 g_debug("burned toggled");
561 tp = gtk_tree_path_new_from_string (path);
562 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
563 g_return_if_fail(tv != NULL);
564 tm = gtk_tree_view_get_model(tv);
565 g_return_if_fail(tm != NULL);
566 gtk_tree_model_get_iter(tm, &ti, tp);
567 gtk_tree_model_get(tm, &ti, 2, &active, -1);
570 // Get the row number
571 indices = gtk_tree_path_get_indices (tp);
573 gtk_tree_path_free(tp);
575 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
576 count = ghb_array_len(subtitle_list);
577 if (row < 0 || row >= count)
580 settings = ghb_array_get_nth(subtitle_list, row);
581 source = ghb_settings_get_int(settings, "SubtitleSource");
582 if (!canBurn(source))
584 if (!active && mustBurn(ud, settings))
587 ghb_settings_set_boolean(settings, "SubtitleBurned", active);
588 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, active, -1);
592 ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", !active);
593 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, !active, -1);
598 ghb_subtitle_exclusive_burn(ud, row);
599 ghb_update_destination_extension(ud);
604 subtitle_default_toggled_cb(
605 GtkCellRendererToggle *cell,
607 signal_user_data_t *ud)
616 GValue *subtitle_list;
620 g_debug("default toggled");
621 tp = gtk_tree_path_new_from_string (path);
622 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
623 g_return_if_fail(tv != NULL);
624 tm = gtk_tree_view_get_model(tv);
625 g_return_if_fail(tm != NULL);
626 gtk_tree_model_get_iter(tm, &ti, tp);
627 gtk_tree_model_get(tm, &ti, 3, &active, -1);
630 // Get the row number
631 indices = gtk_tree_path_get_indices (tp);
633 gtk_tree_path_free(tp);
635 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
636 count = ghb_array_len(subtitle_list);
637 if (row < 0 || row >= count)
640 settings = ghb_array_get_nth(subtitle_list, row);
641 if (active && mustBurn(ud, settings))
644 ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", active);
645 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, active, -1);
649 ghb_settings_set_boolean(settings, "SubtitleBurned", !active);
650 gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, !active, -1);
652 // allow only one default
653 ghb_subtitle_exclusive_default(ud, row);
658 subtitle_list_refresh_selected(signal_user_data_t *ud)
660 GtkTreeView *treeview;
661 GtkTreePath *treepath;
662 GtkTreeSelection *selection;
667 GValue *settings = NULL;
668 const GValue *subtitle_list;
669 gboolean allow_force = FALSE;
670 gboolean allow_burn = FALSE;
672 g_debug("subtitle_list_refresh_selected ()");
673 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
674 selection = gtk_tree_view_get_selection (treeview);
675 if (gtk_tree_selection_get_selected(selection, &store, &iter))
677 gchar *track, *source;
678 gboolean forced, burned, def;
682 // Get the row number
683 treepath = gtk_tree_model_get_path (store, &iter);
684 indices = gtk_tree_path_get_indices (treepath);
686 gtk_tree_path_free(treepath);
688 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
689 if (row >= ghb_array_len(subtitle_list))
691 settings = ghb_array_get_nth(subtitle_list, row);
693 def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
696 i_source = ghb_settings_get_int(settings, "SubtitleSource");
697 if (!canBurn(i_source))
700 ghb_settings_set_boolean(settings, "SubtitleBurned", burned);
702 if (!canForce(i_source))
704 // Force only apply to VOBSUBS
706 ghb_settings_set_boolean(settings, "SubtitleForced", forced);
709 if (i_source == SRTSUB)
714 lang = ghb_settings_combo_option(settings, "SrtLanguage");
715 code = ghb_settings_get_string(settings, "SrtCodeset");
717 s_track = ghb_settings_get_string(settings, "SrtFile");
718 if (g_file_test(s_track, G_FILE_TEST_IS_REGULAR))
722 basename = g_path_get_basename(s_track);
723 track = g_strdup_printf("%s (%s)(SRT)(%s)", lang, code, basename);
724 source = g_strdup_printf("SRT (%s)", basename);
729 track = g_strdup_printf("%s (%s)(SRT)", lang, code);
730 source = g_strdup_printf("SRT (none)");
733 offset = ghb_settings_get_int(settings, "SrtOffset");
741 ghb_settings_combo_option(settings, "SubtitleTrack"));
742 source = g_strdup(ghb_subtitle_source_name(i_source));
743 s_track = ghb_settings_get_string(settings, "SubtitleTrack");
745 forced = ghb_settings_get_boolean(settings, "SubtitleForced");
746 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
749 if (canBurn(i_source))
751 if (canForce(i_source))
754 gtk_list_store_set(GTK_LIST_STORE(store), &iter,
755 // These are displayed in list
761 // These are used to set combo box values when a list item is selected
771 ghb_subtitle_exclusive_burn(ud, row);
776 subtitle_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
780 g_debug("subtitle_track_changed_cb ()");
781 ghb_check_dependency(ud, widget, NULL);
782 ghb_widget_to_setting(ud->settings, widget);
783 settings = ghb_selected_subtitle_settings(ud);
784 if (settings != NULL)
786 const gchar *track, *lang;
789 ghb_widget_to_setting(settings, widget);
790 track = ghb_settings_combo_option(settings, "SubtitleTrack");
791 ghb_settings_set_string(settings, "SubtitleTrackDescription", track);
792 tt = ghb_settings_get_int(settings, "SubtitleTrack");
793 source = ghb_subtitle_track_source(ud, tt);
794 ghb_settings_set_int(settings, "SubtitleSource", source);
795 lang = ghb_settings_combo_string(settings, "SubtitleTrack");
796 ghb_settings_set_string(settings, "SubtitleLanguage", lang);
797 subtitle_list_refresh_selected(ud);
804 srt_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
808 g_debug("srt_changed_cb ()");
809 ghb_check_dependency(ud, widget, NULL);
810 ghb_widget_to_setting(ud->settings, widget);
811 settings = ghb_selected_subtitle_settings(ud);
812 if (settings != NULL)
814 ghb_widget_to_setting(settings, widget);
815 subtitle_list_refresh_selected(ud);
822 srt_file_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
826 g_debug("srt_file_changed_cb ()");
827 ghb_check_dependency(ud, widget, NULL);
828 ghb_widget_to_setting(ud->settings, widget);
829 settings = ghb_selected_subtitle_settings(ud);
830 if (settings != NULL)
832 gchar *filename, *dirname;
834 ghb_widget_to_setting(settings, widget);
835 subtitle_list_refresh_selected(ud);
839 filename = ghb_settings_get_string(settings, "SrtFile");
840 if (g_file_test(filename, G_FILE_TEST_IS_DIR))
842 ghb_settings_set_string(ud->settings, "SrtDir", filename);
846 dirname = g_path_get_dirname(filename);
847 ghb_settings_set_string(ud->settings, "SrtDir", dirname);
850 ghb_pref_save(ud->settings, "SrtDir");
856 srt_lang_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
860 g_debug("srt_lang_changed_cb ()");
861 ghb_check_dependency(ud, widget, NULL);
862 ghb_widget_to_setting(ud->settings, widget);
863 settings = ghb_selected_subtitle_settings(ud);
864 if (settings != NULL)
868 ghb_widget_to_setting(settings, widget);
869 subtitle_list_refresh_selected(ud);
873 lang = ghb_settings_combo_option(settings, "SrtLanguage");
874 ghb_settings_set_string(settings, "SubtitleTrackDescription", lang);
879 ghb_clear_subtitle_list(signal_user_data_t *ud)
881 GtkTreeView *treeview;
883 GValue *subtitle_list;
885 g_debug("clear_subtitle_list ()");
886 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
887 if (subtitle_list == NULL)
889 subtitle_list = ghb_array_value_new(8);
890 ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
893 ghb_array_value_reset(subtitle_list, 8);
894 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
895 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
896 gtk_list_store_clear (store);
900 add_to_subtitle_list(
901 signal_user_data_t *ud,
904 GtkTreeView *treeview;
907 GtkTreeSelection *selection;
908 const gchar *track, *source;
909 gboolean forced, burned, def;
912 gboolean allow_force = FALSE;
913 gboolean allow_burn = FALSE;
915 g_debug("add_to_subtitle_list ()");
916 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
917 selection = gtk_tree_view_get_selection (treeview);
918 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
920 track = ghb_settings_combo_option(settings, "SubtitleTrack");
921 forced = ghb_settings_get_boolean(settings, "SubtitleForced");
922 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
923 def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
925 s_track = ghb_settings_get_string(settings, "SubtitleTrack");
926 i_source = ghb_settings_get_int(settings, "SubtitleSource");
927 source = ghb_subtitle_source_name(i_source);
929 if (canBurn(i_source))
931 if (canForce(i_source))
934 gtk_list_store_append(store, &iter);
935 gtk_list_store_set(store, &iter,
936 // These are displayed in list
941 // These are used to set combo box values when a list item is selected
948 gtk_tree_selection_select_iter(selection, &iter);
954 signal_user_data_t *ud,
957 GtkTreeView *treeview;
960 GtkTreeSelection *selection;
962 gboolean forced, burned, def;
963 gchar *filename, *code, *track, *source;
964 gint i_source, offset;
966 g_debug("add_to_srt_list ()");
967 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
968 selection = gtk_tree_view_get_selection (treeview);
969 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
971 lang = ghb_settings_combo_option(settings, "SrtLanguage");
972 code = ghb_settings_get_string(settings, "SrtCodeset");
975 def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
977 filename = ghb_settings_get_string(settings, "SrtFile");
978 if (g_file_test(filename, G_FILE_TEST_IS_REGULAR))
982 basename = g_path_get_basename(filename);
983 track = g_strdup_printf("%s (%s)(SRT)(%s)", lang, code, basename);
984 source = g_strdup_printf("SRT (%s)", basename);
989 track = g_strdup_printf("%s (%s)(SRT)", lang, code);
990 source = g_strdup_printf("SRT (none)");
993 offset = ghb_settings_get_int(settings, "SrtOffset");
995 gtk_list_store_append(store, &iter);
996 gtk_list_store_set(store, &iter,
997 // These are displayed in list
1003 // These are used to set combo box values when a list item is selected
1010 gtk_tree_selection_select_iter(selection, &iter);
1017 G_MODULE_EXPORT void
1018 subtitle_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
1020 GtkTreeModel *store;
1024 g_debug("subtitle_list_selection_changed_cb ()");
1025 if (gtk_tree_selection_get_selected(selection, &store, &iter))
1028 GtkTreePath *treepath;
1030 GValue *subtitle_list, *settings;
1032 treepath = gtk_tree_model_get_path (store, &iter);
1033 indices = gtk_tree_path_get_indices (treepath);
1035 gtk_tree_path_free(treepath);
1037 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
1038 if (row >= ghb_array_len(subtitle_list))
1041 settings = ghb_array_get_nth(subtitle_list, row);
1043 source = ghb_settings_get_int(settings, "SubtitleSource");
1044 if (source == SRTSUB)
1049 str = ghb_settings_get_string(settings, "SrtLanguage");
1050 ghb_ui_update(ud, "SrtLanguage", ghb_string_value(str));
1053 str = ghb_settings_get_string(settings, "SrtCodeset");
1054 ghb_ui_update(ud, "SrtCodeset", ghb_string_value(str));
1057 str = ghb_settings_get_string(settings, "SrtFile");
1058 ghb_ui_update(ud, "SrtFile", ghb_string_value(str));
1061 offset = ghb_settings_get_int(settings, "SrtOffset");
1062 ghb_ui_update(ud, "SrtOffset", ghb_int_value(offset));
1064 widget = GHB_WIDGET(ud->builder, "subtitle_track_label");
1065 gtk_widget_hide(widget);
1066 widget = GHB_WIDGET(ud->builder, "SubtitleTrack");
1067 gtk_widget_hide(widget);
1068 widget = GHB_WIDGET(ud->builder, "srt_lang_label");
1069 gtk_widget_show(widget);
1070 widget = GHB_WIDGET(ud->builder, "srt_code_label");
1071 gtk_widget_show(widget);
1072 widget = GHB_WIDGET(ud->builder, "srt_file_label");
1073 gtk_widget_show(widget);
1074 widget = GHB_WIDGET(ud->builder, "srt_offset_label");
1075 gtk_widget_show(widget);
1076 widget = GHB_WIDGET(ud->builder, "SrtLanguage");
1077 gtk_widget_show(widget);
1078 widget = GHB_WIDGET(ud->builder, "SrtCodeset");
1079 gtk_widget_show(widget);
1080 widget = GHB_WIDGET(ud->builder, "SrtFile");
1081 gtk_widget_show(widget);
1082 widget = GHB_WIDGET(ud->builder, "SrtOffset");
1083 gtk_widget_show(widget);
1089 track = ghb_settings_get_string(settings, "SubtitleTrack");
1090 ghb_ui_update(ud, "SubtitleTrack", ghb_string_value(track));
1093 widget = GHB_WIDGET(ud->builder, "srt_lang_label");
1094 gtk_widget_hide(widget);
1095 widget = GHB_WIDGET(ud->builder, "srt_code_label");
1096 gtk_widget_hide(widget);
1097 widget = GHB_WIDGET(ud->builder, "srt_file_label");
1098 gtk_widget_hide(widget);
1099 widget = GHB_WIDGET(ud->builder, "srt_offset_label");
1100 gtk_widget_hide(widget);
1101 widget = GHB_WIDGET(ud->builder, "SrtLanguage");
1102 gtk_widget_hide(widget);
1103 widget = GHB_WIDGET(ud->builder, "SrtCodeset");
1104 gtk_widget_hide(widget);
1105 widget = GHB_WIDGET(ud->builder, "SrtFile");
1106 gtk_widget_hide(widget);
1107 widget = GHB_WIDGET(ud->builder, "SrtOffset");
1108 gtk_widget_hide(widget);
1109 widget = GHB_WIDGET(ud->builder, "subtitle_track_label");
1110 gtk_widget_show(widget);
1111 widget = GHB_WIDGET(ud->builder, "SubtitleTrack");
1112 gtk_widget_show(widget);
1114 widget = GHB_WIDGET (ud->builder, "subtitle_remove");
1115 gtk_widget_set_sensitive(widget, TRUE);
1119 widget = GHB_WIDGET(ud->builder, "srt_lang_label");
1120 gtk_widget_hide(widget);
1121 widget = GHB_WIDGET(ud->builder, "srt_code_label");
1122 gtk_widget_hide(widget);
1123 widget = GHB_WIDGET(ud->builder, "srt_file_label");
1124 gtk_widget_hide(widget);
1125 widget = GHB_WIDGET(ud->builder, "srt_offset_label");
1126 gtk_widget_hide(widget);
1127 widget = GHB_WIDGET(ud->builder, "SrtLanguage");
1128 gtk_widget_hide(widget);
1129 widget = GHB_WIDGET(ud->builder, "SrtCodeset");
1130 gtk_widget_hide(widget);
1131 widget = GHB_WIDGET(ud->builder, "SrtFile");
1132 gtk_widget_hide(widget);
1133 widget = GHB_WIDGET(ud->builder, "SrtOffset");
1134 gtk_widget_hide(widget);
1135 widget = GHB_WIDGET(ud->builder, "subtitle_track_label");
1136 gtk_widget_show(widget);
1137 widget = GHB_WIDGET(ud->builder, "SubtitleTrack");
1138 gtk_widget_show(widget);
1142 G_MODULE_EXPORT void
1143 srt_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
1145 // Add the current subtitle settings to the list.
1147 gchar *dir, *filename, *lang;
1149 g_debug("subtitle_add_clicked_cb ()");
1151 settings = ghb_dict_value_new();
1152 ghb_settings_set_int(settings, "SubtitleSource", SRTSUB);
1153 lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
1154 ghb_settings_set_string(settings, "SrtLanguage", lang);
1156 ghb_settings_set_string(settings, "SrtCodeset", "UTF-8");
1158 dir = ghb_settings_get_string(ud->settings, "SrtDir");
1159 filename = g_strdup_printf("%s/none", dir);
1160 ghb_settings_set_string(settings, "SrtFile", filename);
1164 ghb_settings_set_int(settings, "SrtOffset", 0);
1165 ghb_settings_take_value(settings, "SubtitleDefaultTrack",
1166 ghb_boolean_value_new(FALSE));
1168 ghb_add_srt(ud, settings);
1171 G_MODULE_EXPORT void
1172 subtitle_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
1174 // Add the current subtitle settings to the list.
1176 gboolean burned = FALSE;
1179 g_debug("subtitle_add_clicked_cb ()");
1181 track = ghb_settings_get_int(ud->settings, "SubtitleTrack");
1183 settings = ghb_dict_value_new();
1184 ghb_settings_set_int(settings, "SubtitleTrack", track);
1185 source = ghb_subtitle_track_source(ud, track);
1186 ghb_settings_set_int(settings, "SubtitleSource", source);
1187 if (mustBurn(ud, settings))
1191 ghb_settings_take_value(settings, "SubtitleForced",
1192 ghb_boolean_value_new(FALSE));
1193 ghb_settings_take_value(settings, "SubtitleBurned",
1194 ghb_boolean_value_new(burned));
1195 ghb_settings_take_value(settings, "SubtitleDefaultTrack",
1196 ghb_boolean_value_new(FALSE));
1198 ghb_add_subtitle(ud, settings);
1201 G_MODULE_EXPORT void
1202 subtitle_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
1204 GtkTreeView *treeview;
1205 GtkTreePath *treepath;
1206 GtkTreeSelection *selection;
1207 GtkTreeModel *store;
1208 GtkTreeIter iter, nextIter;
1211 GValue *subtitle_list;
1213 g_debug("subtitle_remove_clicked_cb ()");
1214 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
1215 selection = gtk_tree_view_get_selection (treeview);
1216 if (gtk_tree_selection_get_selected(selection, &store, &iter))
1219 if (!gtk_tree_model_iter_next(store, &nextIter))
1222 if (gtk_tree_model_get_iter_first(store, &nextIter))
1224 gtk_tree_selection_select_iter (selection, &nextIter);
1229 gtk_tree_selection_select_iter (selection, &nextIter);
1231 // Get the row number
1232 treepath = gtk_tree_model_get_path (store, &iter);
1233 indices = gtk_tree_path_get_indices (treepath);
1235 gtk_tree_path_free(treepath);
1236 // Remove the selected item
1237 gtk_list_store_remove (GTK_LIST_STORE(store), &iter);
1238 // remove from subtitle settings list
1239 if (row < 0) return;
1240 widget = GHB_WIDGET (ud->builder, "subtitle_add");
1241 gtk_widget_set_sensitive(widget, TRUE);
1242 widget = GHB_WIDGET (ud->builder, "srt_add");
1243 gtk_widget_set_sensitive(widget, TRUE);
1244 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
1245 if (row >= ghb_array_len(subtitle_list))
1247 GValue *old = ghb_array_get_nth(subtitle_list, row);
1248 ghb_value_free(old);
1249 ghb_array_remove(subtitle_list, row);
1255 ghb_subtitle_prune(signal_user_data_t *ud)
1260 GValue *subtitle_list;
1262 gint first_track = 0, one_burned = 0;
1264 subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
1265 if (subtitle_list == NULL)
1267 count = ghb_array_len(subtitle_list);
1269 tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
1270 g_return_if_fail(tv != NULL);
1271 tm = gtk_tree_view_get_model(tv);
1272 for (ii = count-1; ii >= 0; ii--)
1277 settings = ghb_array_get_nth(subtitle_list, ii);
1278 burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
1279 if (!burned && mustBurn(ud, settings))
1281 gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
1282 gtk_list_store_remove (GTK_LIST_STORE(tm), &ti);
1283 ghb_array_remove(subtitle_list, ii);
1293 ghb_subtitle_exclusive_burn(ud, first_track);
1298 ghb_reset_subtitles(signal_user_data_t *ud, GValue *settings)
1305 g_debug("ghb_reset_subtitles");
1306 ghb_clear_subtitle_list(ud);
1307 titleindex = ghb_settings_combo_int(ud->settings, "title");
1311 slist = ghb_settings_get_value(settings, "subtitle_list");
1312 count = ghb_array_len(slist);
1313 for (ii = 0; ii < count; ii++)
1317 subtitle = ghb_value_dup(ghb_array_get_nth(slist, ii));
1318 source = ghb_settings_get_int(subtitle, "SubtitleSource");
1319 if (source == SRTSUB)
1320 ghb_add_srt(ud, subtitle);
1322 ghb_add_subtitle(ud, subtitle);