📄 janela.c
字号:
static gint focusin_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data){ mapped_window = 1; gtk_window_set_title(GTK_WINDOW(window), "U2B Downloader"); return FALSE;}static gint unmap_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data){ if( mapped_window ){ gtk_window_set_title(GTK_WINDOW(window), "U2B Downloader"); } return TRUE;}static gint delete_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data){ gtk_main_quit(); if(curl != NULL) curl_easy_cleanup(curl); exit(0); return TRUE;}void * fecth_page(void * arg){ void ** ret = arg ; const gchar* text1 = gtk_entry_get_text(GTK_ENTRY(text_entry)); *ret = (void*)find_url_to_download((char*)text1); gtk_main_quit(); return NULL;}static void button_chdir_clear_cb(GtkWidget* w, gpointer data){ gtk_entry_set_text(GTK_ENTRY(saveToDir),""); }static void button_link_clear_cb(GtkWidget* w, gpointer data){ gtk_entry_set_text(GTK_ENTRY(text_entry),""); }void * convert_thread(void * arg){ char tmp[1024]; if(dvd_quality){ sprintf(tmp,"ffmpeg -y -i \"%s.flv\" -target ntsc-dvd -aspect 4:3 \"%s.mpg\"", (char*)arg, (char*)arg); } else{ sprintf(tmp,"ffmpeg -y -acodec mp2 -i \"%s.flv\" -ab 128 -ar 22050 -b 500 -s 320x240 \"%s.mpg\"",(char*)arg,(char*)arg); } int ret = system(tmp); if(ret == 0) ((char*)arg)[0] = 0 ; gtk_main_quit(); return NULL;}static void button_click_cb(GtkWidget* w, gpointer data){ static int init = 0 ; gtk_widget_set_sensitive(w,FALSE); gtk_widget_set_sensitive(chdir_button, FALSE); gtk_widget_set_sensitive(check_button,FALSE); gtk_widget_set_sensitive(radio1, FALSE); gtk_widget_set_sensitive(radio2, FALSE); gtk_progress_set_value(GTK_PROGRESS(Bar), 0.0); const gchar* text1 = gtk_entry_get_text(GTK_ENTRY(text_entry)); const gchar* text2 = gtk_entry_get_text(GTK_ENTRY(saveToDir)); if((text1 != NULL && text2 != NULL) && (strlen((const char*)text1) > 0 && strlen((const char*)text2)>0)){ char buf[1024]; char tmp[1024]; char *ptr = NULL; FILE * fd = NULL; char * url = NULL; ptr = match((const char *)text1,"^((http://)?(\\w+\\.)?youtube\\.com/watch\\\?v=)([0-9A-Za-z_-]+)([&/].*)?$"); if(ptr == NULL){ ptr = match((const char *)text1, "(http://)?(www\\.)?metacafe\\.com/watch/([^/]+)/([^/]+/)?.*"); if(ptr == NULL){ open_dialog("\nwrong url format! check it.",GTK_MESSAGE_WARNING); return ; } } free(ptr); strcpy(tmp,text2); int size = strlen(tmp); if(tmp[size-1] == '/') tmp[size-1] = '\0'; if(strstr(tmp,".flv") == NULL){ DIR * dir = NULL; if((dir = opendir(tmp)) == NULL){ strcat(tmp,".flv"); // file is not a directory, just attach .flv } else{ closedir(dir); char tmp2[1024]; char term[32]; int i=0; strcpy(tmp2,tmp); strcat(tmp,"/video.flv"); while((fd = fopen(tmp,"r")) != NULL){ fclose(fd); sprintf(term,"/video(%d).flv",++i); strcpy(tmp,tmp2); strcat(tmp,term); } } } strcpy(buf,tmp); char * r = rindex(tmp,'/'); if(r != NULL) *r = '\0'; if(access(tmp,W_OK) != 0){ open_dialog("\nCan't open file to write.\nPermission denied.",GTK_MESSAGE_ERROR); return ; } if( init == 0){ if (!g_thread_supported ()) g_thread_init (NULL); gdk_threads_init (); init = 1; } if (!g_thread_create(&fecth_page, (void*)&url, FALSE, NULL) != 0){ gtk_label_set_text(( GtkLabel*)label_percent, " "); open_dialog("\ncan't create the thread",GTK_MESSAGE_ERROR); return ; } gtk_main(); if(url == NULL){ gtk_label_set_text(( GtkLabel*)label_percent, " "); open_dialog("\nError fetching url.\n-Check the video link.\n-Check your internet connection.",GTK_MESSAGE_ERROR); } else{ int status = start_download(url, buf); if(convert && status){ ptr = strstr(buf,".flv"); if(ptr != NULL) *ptr = '\0'; if (!g_thread_create(&convert_thread, &(buf[0]), FALSE, NULL) != 0){ gtk_label_set_text(( GtkLabel*)label_percent, " "); open_dialog("\ncan't create the thread",GTK_MESSAGE_ERROR); return ; } gtk_main(); if(buf[0] == 0) open_dialog("\nThe operation was a success!",GTK_MESSAGE_INFO); else open_dialog("\nError: conversion failed!",GTK_MESSAGE_ERROR); } else if(status){ open_dialog("\nThe operation was a success!",GTK_MESSAGE_INFO); } gtk_label_set_text(( GtkLabel*)label_percent, "Done." ); } } else{ open_dialog("\nYou should fill both fields.", GTK_MESSAGE_WARNING); }}void open_dialog(char * msg, GtkMessageType type){ GtkWidget *dialog; /* Create the widgets */ dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, type, GTK_BUTTONS_OK, "%s", msg); gtk_window_set_position (GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); gtk_widget_set_sensitive(button, TRUE); gtk_widget_set_sensitive(chdir_button, TRUE); gtk_widget_set_sensitive(check_button,TRUE); if(convert){ gtk_widget_set_sensitive(radio1, TRUE); gtk_widget_set_sensitive(radio2, TRUE); }}size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream){ return fwrite(ptr, size, nmemb, stream);} size_t my_read_func(void *ptr, size_t size, size_t nmemb, FILE *stream){ return fread(ptr, size, nmemb, stream);} int my_progress_func(GtkWidget *Bar, double t, /* dltotal */ double d, /* dlnow */ double ultotal, double ulnow){ /* printf("%d / %d (%g %%)\n", d, t, d*100.0/t);*/ static char value[64]; if((int)(d*100.0/t) >= 0){ gdk_threads_enter(); sprintf(value,"%.1f KB of %.1f KB",d/1024,t/1024); gtk_label_set_text(( GtkLabel*)label_percent, value ); if( !mapped_window ){ sprintf(value,"%d%% - U2B Downloader",(int)(d*100.0/t)); gtk_window_set_title(GTK_WINDOW(window), value); } else{ gtk_window_set_title(GTK_WINDOW(window), "U2B Downloader"); } if( ((int)(d*100.0/t) == 100) && convert ){ gtk_label_set_text(( GtkLabel*)label_percent, "Converting... wait." ); } gtk_progress_set_value(GTK_PROGRESS(Bar), d*100.0/t); gdk_threads_leave(); } return 0;}void *my_thread(void *ptr){ CURLcode res; FILE *outfile; stThread_info * info = (stThread_info*)ptr ; gchar *url = info->url; info->ret = NULL ; char * filename = info->filename ; curl = curl_easy_init(); if(curl) { outfile = fopen(filename, "w"); if(outfile == NULL){ curl_easy_cleanup(curl); info->ret = strerror(errno); gtk_main_quit(); return NULL; } curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_func); curl_easy_setopt(curl, CURLOPT_READFUNCTION, my_read_func); curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE); curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func); curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, Bar); res = curl_easy_perform(curl); if (res) { fclose(outfile); if(curl != NULL) curl_easy_cleanup(curl); curl = NULL; gtk_main_quit(); return NULL; } fclose(outfile); /* always cleanup */ if(curl != NULL) curl_easy_cleanup(curl); curl = NULL; } gtk_main_quit(); return NULL;}int start_download(char * url, char * filename){ stThread_info info ; info.url = url ; info.filename = filename ; printf("url=%s\n",url); if (!g_thread_create(&my_thread, (void*)&info, FALSE, NULL) != 0){ open_dialog("\nError: can't create thread!",GTK_MESSAGE_ERROR); return 0; } // g_thread_set_priority(thread,G_THREAD_PRIORITY_HIGH); gtk_main(); if(info.ret != NULL){ open_dialog(info.ret,GTK_MESSAGE_ERROR); return 0; } return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -