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

📄 xlyrics.c

📁 lrc 歌词解析和实时显示源码, 是开发 mp3, 播放器的很好的模块
💻 C
📖 第 1 页 / 共 2 页
字号:
/* define the func to render the data*/void line_color_func(GtkTreeViewColumn *column,		GtkCellRenderer *cell,		GtkTreeModel *tree_model,		GtkTreeIter *iter,		gpointer data){	gchar *lyrics_line_buffer;	gint stat;	gchar *utf8;	gtk_tree_model_get(tree_model, iter,			0, &lyrics_line_buffer,			1, &stat,			-1);	if(stat == TRUE)/* active color*/		g_object_set(cell, "foreground-gdk", &ac_color, 				"foreground-set", TRUE,				NULL);	else		g_object_set(cell, "foreground-gdk", &ua_color, 				"foreground-set", TRUE,				NULL);	cell->xalign = 0.5;	utf8 = locale2utf8(lyrics_line_buffer);	g_object_set(cell, "text", utf8, NULL);	if(utf8) g_free(utf8);}void redraw_list(void){	PangoFontDescription *desc;	/* set the font*/	desc = pango_font_description_from_string(lyrics_font);	gtk_widget_modify_font(list_view, desc);	/* set the bg color*/	gtk_widget_modify_base(list_view, GTK_STATE_NORMAL, &bg_color);	gtk_widget_modify_base(list_view, GTK_STATE_SELECTED, &bg_color);	gtk_widget_modify_base(list_view, GTK_STATE_ACTIVE, &bg_color);	g_object_set(cell, "background-gdk", &bg_color,			"background-set", TRUE,			NULL);	gtk_widget_modify_bg(GTK_SCROLLED_WINDOW(scrolled_window)->vscrollbar,			GTK_STATE_ACTIVE, &bg_color);	/* set transparency */	if(!hiding) my_gtk_widget_set_transparency(window, opacity);	/* cleanup the list_store and lyrics*/	gtk_list_store_clear(list_store);	lyrics_cleanup(song);	song = NULL;	/* reload the lyrics */	if(is_fit_width)		gtk_window_resize(GTK_WINDOW(window), 10, height);		read_lyrics(lyrics_file);	set_line(last_line_number, TRUE);}/*set the player time according the line*/void set_line_time(GtkTreeView *treeview,		GtkTreePath *path,		GtkTreeViewColumn *col,		gpointer user_data){	GtkTreeIter iter;	gint line_number;	struct LyricsLine *line = NULL;	int session;	if(song && gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path))	{		gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, 2, &line_number, -1);		for(line = song->head; line != NULL; line = line->next)			if(line->line_number == line_number)				break;		if((session = is_player_on()) > -1 && line != NULL)			set_player_time(session, line->line_time);	}}/*create a blank list */GtkWidget *create_list( void ){	GtkTreeViewColumn *column;	scrolled_window = gtk_scrolled_window_new(NULL, NULL);	if(is_fit_width){		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),				GTK_POLICY_NEVER, 				GTK_POLICY_ALWAYS);	}else{		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),				GTK_POLICY_ALWAYS, 				GTK_POLICY_ALWAYS);	}	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),			GTK_SHADOW_NONE);	list_store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INT);	list_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(list_store));	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list_view), FALSE);	g_signal_connect(G_OBJECT(list_view), "button-press-event",			G_CALLBACK(deal_with_mouse), NULL);	g_signal_connect(G_OBJECT(list_view), "button-release-event",			G_CALLBACK(left_button_released), NULL);	g_signal_connect(G_OBJECT(list_view), "row-activated",			G_CALLBACK(set_line_time), NULL);	g_signal_connect(G_OBJECT(list_view), "motion_notify_event",			G_CALLBACK(move_with_mouse), NULL);	cell = gtk_cell_renderer_text_new ();	column = gtk_tree_view_column_new();	gtk_tree_view_column_set_title(column, "Xlyrics");	gtk_tree_view_append_column (GTK_TREE_VIEW (list_view),			GTK_TREE_VIEW_COLUMN (column));	gtk_tree_view_column_pack_start(column, cell, TRUE);	gtk_tree_view_column_set_cell_data_func(column, cell,			line_color_func,			NULL, NULL);	gtk_container_add(GTK_CONTAINER(scrolled_window), list_view);	gtk_widget_show_all(scrolled_window);	return scrolled_window;}/* confirm exit*/gint confirm(void){	gint response;	GtkWidget *dialog;	dialog = gtk_message_dialog_new(GTK_WINDOW(window),			GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,			GTK_MESSAGE_QUESTION,			GTK_BUTTONS_OK_CANCEL,			_("You will close the XLyrics \n Are you sure?"));	gtk_widget_show_all (dialog);	response = gtk_dialog_run(GTK_DIALOG(dialog));	switch(response)	{		case GTK_RESPONSE_OK:			return FALSE;		default:			gtk_widget_destroy(dialog);			return TRUE;	}}/* convert ascii generated by IE,Netscape */void conv_ascii_to_nomal(char *s)  {	char num[3];	int n;	if(!s) return;	num[2]='\0';	for(;*s;s++)	{		if(*s=='+') *s=' ';		else if(*s=='%') {			num[0]=*(s+1);			num[1]=*(s+2);			sscanf(num,"%x",&n);			*s=n;			strcpy(s+1,s+3);		}	}}/*load lyrics file*/void load_lyrics_file(char *playfile_full){	char *lyricsfile = NULL;	char *filename_begin;	strcpy(last_song, get_player_song(session));	gtk_list_store_clear(list_store);	lyrics_cleanup(song);	song = NULL;	conv_ascii_to_nomal(playfile_full);	filename_begin = rindex(playfile_full, '/'); /* get the last "/" */	if(filename_begin)	{		playfile = filename_begin + 1; /* now the playfile point to the file name*/		int n = strlen(playfile_full);		n -= strlen(playfile);		strncpy(mp3_dir, playfile_full, n);		mp3_dir[n] = '\0'; /*get the mp3 directory*/	}	else	{		strcpy(mp3_dir, "./");		playfile = playfile_full; /*set the mp3 directory is current direcrory*/	}	/*chop space*/	while(*playfile == ' ' || *playfile == '\t') playfile ++;	if(strlen(playfile) != 0)	{		/* first try to find file in cache, this will speed up the load*/		lyricsfile = find_lyrics_from_cache(playfile);		if(!lyricsfile)/*find the file in directory*/		{			int i;			gchar buf[1024];			for(i=0; i<2; i++)			{				if(look_in_mp3dir_mode						&& (lyricsfile = find_file_in_dir(mp3_dir, playfile, playfile_full, i)))					break;				else if((lyricsfile = find_file_in_dir(lyrics_dir, playfile, playfile_full, i)))					break;			}#if 1 /* if you think this is not good enough, just remove it */			if(!lyricsfile && !is_downloading)			{ /* no lyrics is found in the local directories, try to download it */				char *tmp, *ptr;				tmp = (char*)strdup(playfile);				ptr = strrchr(tmp, '.');				if(ptr) *ptr = '\0';				snprintf(buf, 1024, "%s/%s.lrc", lyrics_dir, tmp);				if(lyrics_download(tmp, buf) == 0)					is_downloading = 1;				g_free(tmp);			}else if(is_downloading)				is_downloading =  0;#endif			if(lyricsfile)				add_item_to_cache(playfile, lyricsfile);		}	}	if(lyricsfile)/* found the lyrics file*/	{		if(hiding)		{			hiding = FALSE;			gtk_widget_show_all(window);			gtk_window_move(GTK_WINDOW(window), pos_x, pos_y);			if(is_keep_above)				gtk_window_set_keep_above(GTK_WINDOW(window), is_keep_above);		}		strcpy(lyrics_file, lyricsfile);		is_lyrics_loaded = TRUE;		redraw_list(); 		g_free(lyricsfile);	}	else /* not find the lyrics file*/	{		if(hide_not_found)		{			hiding = TRUE;			gtk_widget_hide_all(window);		}		if(strlen(playfile) == 0)			strcpy(lyrics_file, "NULL file name");		else		{			lyricsfile = (char*)remove_ext(playfile);			strcpy(lyrics_file, lyricsfile);			g_free(lyricsfile);		}		is_lyrics_loaded = FALSE;		redraw_list();	}}/*timeout function*/gboolean timeout(gpointer data){	static char *curr_song = NULL;	if(is_config_update == TRUE)	{		is_config_update = FALSE;		update_config("xlyrics");		redraw_list();	}	if((session = is_player_on()) < 0)	{		quit(window, "nop");		return FALSE;	}	if((curr_song = get_player_song(session)) == NULL)	{		/* no song is in playlist*/		return TRUE;	}	if(strcmp(last_song, curr_song) != 0)	{	/* FIXME: the downloading process may be running,		 * if then, this action will make a mistake		 */		is_downloading = 0;		load_lyrics_file(curr_song);		if(is_lyrics_loaded)		{			gchar *utf8;			set_line(last_line_number, FALSE);			last_line_number = 0;			set_line(last_line_number, TRUE);			if(song->head)			{				utf8 = locale2utf8(song->head->buffer);				gtk_window_set_title(GTK_WINDOW(window), utf8);				g_free(utf8);			}			else			{/* the lyrics file is not a right one */				utf8 = locale2utf8(playfile);				gtk_window_set_title(GTK_WINDOW(window), utf8);				g_free(utf8);			}		}	}		if(is_downloading)	{/* check the downloading state */		switch(get_download_state()){			case 1:				return TRUE;			case -1:				is_downloading = 0;				break;			default:				load_lyrics_file(curr_song);				break;		}	}	if(is_lyrics_loaded)	{		static int time;		time = get_player_time(session);		lyrics_line = song->head;		while (lyrics_line)		{			if (lyrics_line->line_time == time)				break;			lyrics_line = lyrics_line->next;		}		if(lyrics_line &&				(last_line_number != lyrics_line->line_number || last_line_number == 0))		{			gchar *utf8;			set_line(last_line_number, FALSE);			last_line_number = lyrics_line->line_number;			utf8 = locale2utf8(lyrics_line->buffer);			gtk_window_set_title(GTK_WINDOW(window), utf8);			g_free(utf8);			set_line(last_line_number, TRUE);		}	}else		gtk_window_set_title(GTK_WINDOW(window), "Xlyrics");	return TRUE;}int main(int argc, char* argv[]){	const gchar *lang;	gchar stylerc[1024];#ifdef ENABLE_NLS	bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");	textdomain(GETTEXT_PACKAGE);#endif	init_config("xlyrics");	if(argc > 1)		strncpy(plugin_name, argv[1], 255);	/*first run or initial plugin failed*/	if(!strcmp(plugin_name, "") || !init_plugin(plugin_name)) 	{		gtk_init(&argc, &argv);		config(NULL, (gpointer)-1);		gtk_main();		return 0;	}	if((session = is_player_on()) < 0)		session = launch_player();	gtk_set_locale();	snprintf(stylerc, 1024, "%s/stylerc", PACKAGE_MENU_DIR);	gtk_rc_parse(stylerc);/*get style from stylerc file*/	gtk_init(&argc, &argv);	/* create the main window*/	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	gtk_widget_set_name(window, "main window");	gtk_window_set_title(GTK_WINDOW(window), "XLyrics");	gtk_window_set_default_size(GTK_WINDOW(window), width, height);	gtk_window_move(GTK_WINDOW(window), pos_x, pos_y);	gtk_window_set_decorated(GTK_WINDOW(window), have_border);	gtk_window_set_resizable(GTK_WINDOW(window), TRUE);	gtk_window_set_keep_above(GTK_WINDOW(window), is_keep_above);	g_signal_connect(G_OBJECT(window), "delete_event",			G_CALLBACK(confirm), NULL);	g_signal_connect(G_OBJECT(window), "destroy",			G_CALLBACK(quit), "win");	/* add the lyrics list*/	gtk_container_add(GTK_CONTAINER(window), create_list());	timer = g_timeout_add(300, &timeout, NULL);	gtk_widget_show(window);	my_gtk_widget_set_transparency(window, opacity);	gtk_main();	return 0;}

⌨️ 快捷键说明

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