⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lyrics_download.c

📁 lrc 歌词解析和实时显示源码, 是开发 mp3, 播放器的很好的模块
💻 C
字号:
/*  XLyrics by xiaosuo <xiaosuo1@eyou.com> *  Homepage gentux.blogchina.com *   *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. */#include <gtk/gtk.h>#include <stdlib.h>#include <stdio.h>#include <sys/types.h>#include <sys/wait.h>#include <signal.h>#include "lyrics_download.h"#include "internal.h"static GtkListStore *store; /* the lyrics files list store */static GtkWidget *tree; /* the tree view of the list store */static gchar *resrc = NULL; /* the music name */static gchar *redes = NULL; /* the lyrics filename to be saved */static GtkWidget *download_window;static int pid = 0; /* the pid of the script */static int tpid = 0; /* the pid of the script */static int wait_user  = 0; /* wait user to choose */static int final = 0; /* the final download *//* get the content after " - "*//* the return var must be freed*/char *extract_title2(const char *s){	char *c = NULL, *ss;	ss = (char*)strdup(s);	if((c = strrchr(ss, '-')) && *(c+1) == ' ' && *(c+2))	{		strncpy(ss, c+2, strlen(c+2));		*(ss + strlen(c+2)) = '\0';	}	return ss;}/* the callback function of double click */void choose_one(GtkTreeView *treeview,		GtkTreePath *path,		GtkTreeViewColumn *col,		gpointer user_data){	GtkTreeIter iter;	gchar *resrc;	if(gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)){		gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 1, &resrc, -1);		gtk_widget_destroy(download_window);		tpid = fork();		if(tpid == 0){			execlp("/usr/lib/xlyrics/downloadlyrics.pl",					"downloadlyrics.pl", resrc, redes, 0);			exit(-1);		}		wait_user = 0;		final = 1;	}}/* read lyrics info and filled list sote with these */void add_lyrics_info(const gchar *resrc){	FILE *info;	char buf[256];	gchar *utf8;	gtk_list_store_clear(GTK_LIST_STORE(store));	snprintf(buf, 256, "/tmp/%s.lrc.info", resrc);	info = fopen(buf, "r");	if(info){		GtkTreeIter iter;		gchar *ptr;		while(fgets(buf, 256, info)){			gtk_list_store_append(GTK_LIST_STORE(store), &iter);			if((ptr=strrchr(buf, '\r')) != NULL) *ptr = '\0';			if((ptr=strrchr(buf, '\n')) != NULL) *ptr = '\0';			utf8 = locale2utf8(buf);			if((ptr=strrchr(utf8, '@')) != NULL) *ptr = '\0';			gtk_list_store_set(GTK_LIST_STORE(store), &iter,					0, utf8,					1, buf,					-1);			g_free(utf8);		}		fclose(info);	}}void search_online(GtkButton *button, gpointer data){	gchar *str;	GtkEntry *entry;	int child;	char buf[256];	entry = GTK_ENTRY(data);	str = utf82locale(gtk_entry_get_text(entry));	child = fork();	if(child == 0){		execlp("/usr/lib/xlyrics/downloadlyrics.pl",				"downloadlyrics.pl", str, "/tmp/tmp_lyrics",				"list", 0);		exit(-1);	}else if(child > 0){ 		waitpid(child, NULL, 0);		add_lyrics_info(str);	}	g_free(str);}void entry_activate(GtkEntry *entry, gpointer data){	search_online(NULL, entry);}/* create the download window, so the user can choose or * search the lyrics manuallly */GtkWidget* create_download_window(gboolean chose, char *download_dir){	GtkWidget *scrolled_window;	GtkTreeViewColumn *column;	GtkCellRenderer *renderer;	GtkWidget *hbox;	GtkWidget *vbox;	GtkWidget *entry;	GtkWidget *button;	GtkTooltips *download_tip;	gchar *utf8;	/* download window */	download_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	gtk_window_set_title(GTK_WINDOW(download_window), 			_("Lyrics download manager"));	gtk_window_set_default_size(GTK_WINDOW(download_window),			220, 260);	gtk_window_set_keep_above(GTK_WINDOW(download_window), TRUE);	gtk_window_set_position(GTK_WINDOW(download_window), GTK_WIN_POS_CENTER);	vbox = gtk_vbox_new(FALSE, 5);	hbox = gtk_hbox_new(FALSE, 5);	entry = gtk_entry_new();	g_signal_connect(G_OBJECT(entry), "activate",			G_CALLBACK(entry_activate), NULL);	gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 5);	button = gtk_button_new_with_label(_("Search"));	g_signal_connect(G_OBJECT(button), "clicked",			G_CALLBACK(search_online), entry);	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5);	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);	/* list view widget */	store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);	tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));	g_signal_connect(G_OBJECT(tree), "row-activated",			G_CALLBACK(choose_one), download_dir);	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);	renderer = gtk_cell_renderer_text_new();	column = gtk_tree_view_column_new_with_attributes("lyrics", renderer,			"text", 0, NULL);	gtk_tree_view_append_column(GTK_TREE_VIEW (tree), column);	/* scrolled_window */	download_tip = gtk_tooltips_new();	gtk_tooltips_set_tip(GTK_TOOLTIPS(download_tip), tree,			_("Double click the item to download the lyrics"),			_("Choose the lyrics you want to download, and\			double click on the item, the lyrics will be\			downloaded automaticly"));	scrolled_window = gtk_scrolled_window_new(NULL, NULL);		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);	gtk_container_add(GTK_CONTAINER(scrolled_window), tree);	gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 5);	gtk_container_add(GTK_CONTAINER(download_window), vbox);	if(chose){		if(resrc != NULL && (utf8=locale2utf8(resrc)) != NULL){			gtk_entry_set_text(GTK_ENTRY(entry), utf8);			g_free(utf8);		}		add_lyrics_info(resrc);		wait_user = 1;	}	gtk_widget_show_all(download_window);		return download_window;}/* main function of download lyrics file  * src:music not music.mp3 * des:/dir/music.lrc */int lyrics_download(const char* src, const char* des){	if(!src || !des) return -1;	/* remove xxx-xxx */	if(redes) g_free(redes);	redes = (gchar*)strdup(des);	if(resrc) g_free(resrc);	resrc = extract_title2(src);	/* start a new process to download the lyrics*/	if(pid) kill(pid, SIGKILL);	pid = fork();	if(pid == 0){		execlp("/usr/lib/xlyrics/downloadlyrics.pl",				"downloadlyrics.pl", src, des, "first", 0);		exit(-1);	}else if(pid < 0)		return -1;	tpid = 0;	wait_user = 0;	final = 0;	return 0;}/* get the download state, if more than one file is found * ask the user to choose the right one * Return Value:: 0:downloaded; 1:processing; -1:error */int get_download_state(){	FILE *info;	int i;	char buf[256];	if(wait_user) return 1;	if(!pid && !tpid) return 0;	/* check the download process */	if(tpid){		switch(waitpid(tpid, NULL, WNOHANG)){			case 0: /* downloading */				return 1;			case -1: /* error */				return -1;			default:				tpid = 0;				break; /* process exit */		}	}	/* check the download process */	if(pid){		switch(waitpid(pid, NULL, WNOHANG)){			case 0: /* downloading */				return 1;			case -1: /* error */				return -1;			default:				pid = 0;				break; /* process exit */		}	}	snprintf(buf, 256, "/tmp/%s.lrc.info", resrc);	info = fopen(buf, "r");	if(!info) return -1; 	for(i=0; fgets(buf, 256, info); i++) ;	if(i < 2) fclose(info);	if(i == 0) return -1;	if(i == 1) return 0;	if(final) return 0;	/* more file found need user choose one */	create_download_window(TRUE, NULL);	return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -