Created
November 8, 2014 15:10
-
-
Save krofna/3e38c416eb981f43298a to your computer and use it in GitHub Desktop.
Quick hack I was asked to make. Converts & Burns subtitles to movies. NOTE: See line 38
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Copyright © 2014 Mislav Blažević <[email protected]> | |
This work is free. You can redistribute it and/or modify it under the | |
terms of the Do What The Fuck You Want To Public License, Version 2, | |
as published by Sam Hocevar. See the COPYING file for more details. | |
*/ | |
#include <gtk/gtk.h> | |
#include <vte/vte.h> | |
GtkWidget *buttonvid, *buttonsub, *term; | |
pid_t spawn_recode(gchar* subfile) | |
{ | |
gchar* recode_argv[4]; | |
recode_argv[0] = "recode"; | |
recode_argv[1] = "windows-1250..utf8"; | |
recode_argv[2] = subfile; | |
recode_argv[3] = NULL; | |
return vte_terminal_fork_command(VTE_TERMINAL(term), "recode", recode_argv, NULL, NULL, FALSE, FALSE, FALSE); | |
} | |
void spawn_ffmpeg(gchar* vidfile, gchar* subfile) | |
{ | |
gchar* ffmpeg_argv[15]; | |
ffmpeg_argv[0] = "ffmpeg"; | |
ffmpeg_argv[1] = "-i"; | |
ffmpeg_argv[2] = vidfile; | |
ffmpeg_argv[3] = "-acodec"; | |
ffmpeg_argv[4] = "copy"; | |
ffmpeg_argv[5] = "-vcodec"; | |
ffmpeg_argv[6] = "libx264"; | |
ffmpeg_argv[7] = "-crf"; | |
ffmpeg_argv[8] = "18"; | |
ffmpeg_argv[9] = "-preset"; | |
ffmpeg_argv[10] = "medium"; | |
ffmpeg_argv[11] = "-vf"; | |
ffmpeg_argv[12] = g_strdup_printf("subtitles=%s", subfile); | |
ffmpeg_argv[13] = "/home/krofna/converted.avi"; | |
ffmpeg_argv[14] = NULL; | |
vte_terminal_fork_command(VTE_TERMINAL(term), "ffmpeg", ffmpeg_argv, NULL, NULL, FALSE, FALSE, FALSE); | |
g_free(ffmpeg_argv[12]); | |
} | |
void watch_callback(GPid pid, gint status, gpointer user_data) | |
{ | |
gchar* subfile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(buttonsub)); | |
gchar* vidfile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(buttonvid)); | |
spawn_ffmpeg(vidfile, subfile); | |
} | |
void magic(bool recode) | |
{ | |
gchar* subfile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(buttonsub)); | |
gchar* vidfile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(buttonvid)); | |
if (!(subfile && vidfile)) | |
goto cleanup; | |
if (recode) | |
g_child_watch_add(spawn_recode(subfile), &watch_callback, 0); | |
else | |
spawn_ffmpeg(vidfile, subfile); | |
cleanup: | |
g_free(subfile); | |
g_free(vidfile); | |
} | |
void conv(GtkWidget* button, void*) | |
{ | |
magic(true); | |
} | |
void burn(GtkWidget* button, void*) | |
{ | |
magic(false); | |
} | |
int main(int argc, char* argv[]) | |
{ | |
GtkWidget* window; | |
gtk_init(&argc, &argv); | |
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
gtk_window_set_title(GTK_WINDOW(window), "Krofnikator"); | |
gtk_container_set_border_width(GTK_CONTAINER(window), 15); | |
g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL); | |
GtkWidget* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); | |
GtkWidget* vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); | |
GtkWidget* labelvid = gtk_label_new("Video"); | |
gtk_box_pack_start(GTK_BOX(box), labelvid, TRUE, TRUE, 5); | |
buttonvid = gtk_file_chooser_button_new(0, GTK_FILE_CHOOSER_ACTION_OPEN); | |
gtk_widget_set_size_request(buttonvid, 200, 30); | |
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(buttonvid), "/home/dunja"); | |
gtk_box_pack_start(GTK_BOX(box), buttonvid, TRUE, TRUE, 5); | |
GtkWidget* labelsub = gtk_label_new("Subtitles"); | |
gtk_box_pack_start(GTK_BOX(box), labelsub, TRUE, TRUE, 5); | |
buttonsub = gtk_file_chooser_button_new(0, GTK_FILE_CHOOSER_ACTION_OPEN); | |
gtk_widget_set_size_request(buttonsub, 200, 30); | |
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(buttonsub), "/home/dunja"); | |
gtk_box_pack_start(GTK_BOX(box), buttonsub, TRUE, TRUE, 5); | |
GtkWidget* buttonconv = gtk_button_new_with_label("Convert & Burn"); | |
g_signal_connect(buttonconv, "clicked", G_CALLBACK(conv), 0); | |
gtk_box_pack_start(GTK_BOX(box), buttonconv, TRUE, TRUE, 5); | |
GtkWidget* buttonburn = gtk_button_new_with_label("Burn"); | |
g_signal_connect(buttonburn, "clicked", G_CALLBACK(burn), 0); | |
gtk_box_pack_start(GTK_BOX(box), buttonburn, TRUE, TRUE, 5); | |
term = vte_terminal_new(); | |
gtk_box_pack_start(GTK_BOX(vbox), box, TRUE, TRUE, 5); | |
gtk_box_pack_start(GTK_BOX(vbox), term, TRUE, TRUE, 5); | |
gtk_container_add(GTK_CONTAINER(window), vbox); | |
gtk_widget_show_all(window); | |
gtk_main(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment