📄 cddb.c
字号:
num = atoi(buffer + 6); if (oldnum < 0 || num == oldnum) { strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs); bufs += len; } else { buffer2[BUF2SIZE - 1] = '\0'; cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2)); strncpy(buffer2, realstr, BUF2SIZE); bufs = len; } oldnum = num; break; } if (oldnum >= 0) cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2)); bufs = 0; oldnum = -1; command++; case 4: if (!strncmp(buffer, "EXTD", 4)) { break; } command++; case 5: if (!strncmp(buffer, "EXTT", 4)) { break; } command++; case 6: if (!strncmp(buffer, "PLAYORDER", 9)) { break; } command++; default: g_log(NULL, G_LOG_LEVEL_WARNING, "%s: illegal cddb-data: %s", PACKAGE, buffer); break; } } while (http_read_line(sock, buffer, 256) >= 0); if (oldnum >= 0) cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2)); http_close_connection(sock); return TRUE;}static gint cddb_get_protocol_level(void){ if (cdda_cfg.cddb_protocol_level < 1) cdda_cfg.cddb_protocol_level = cddb_check_protocol_level(cdda_cfg.cddb_server); return cdda_cfg.cddb_protocol_level;}static GList * cddb_get_server_list(gchar *server, gint protocol_level){ gint sock; gchar *getstr; gchar buffer[256]; gchar **message; GList *list = NULL; if((sock = cddb_http_open_connection(server, 80)) == 0) return NULL; cddb_log("Sending sites-command"); getstr = g_strdup_printf( "GET /~cddb/cddb.cgi?cmd=sites%s&proto=%d HTTP/1.0\r\n\r\n", cddb_generate_hello_string(), protocol_level); write(sock, getstr, strlen(getstr)); g_free(getstr); if (http_read_first_line(sock, buffer, 256) < 0) { http_close_connection(sock); return NULL; } cddb_log("Sites response: %s", buffer); switch (atoi(buffer)) { case 210: while ((http_read_line(sock, buffer, 256)) > 1) { message = g_strsplit(buffer, " ", 6); if (message && message[0] && message[1] && !strcasecmp(message[1], "http")) { list = g_list_prepend(list, message); } else { /* Ignore non-http servers */ g_strfreev(message); } } list = g_list_reverse(list); break; case 401: /* No site information available */ break; default: break; } http_close_connection(sock); return list;}int search_for_discid(char *abs_filename,char **cddb_file,guint32 disc_id){ struct dirent *tmpdir; DIR *dir; char tmp_id[10]; if ((dir = opendir(abs_filename)) == NULL) { return(0); } memset(tmp_id,0,10); sprintf(tmp_id,"%08x",disc_id); while ((tmpdir = readdir(dir)) != NULL) { if (!strncmp(tmp_id,tmpdir->d_name,8)){ if ((cddb_file[0] = (char *) g_malloc(strlen(abs_filename)+strlen(tmpdir->d_name)+1)) == NULL) { return(0); } strcpy(cddb_file[0],abs_filename); if (cddb_file[0][strlen(cddb_file[0])-1] != '/'){ strcat(cddb_file[0],"/"); } strcat(cddb_file[0],tmpdir->d_name); closedir(dir); return(1); } } closedir(dir); return(0);}int scan_cddb_dir(char *server,char **cddb_file,guint32 disc_id){ struct dirent *tmp; DIR *dir; char abs_filename[FILENAME_MAX]; struct stat st; if ((dir = opendir(&server[7])) == NULL) { return 0; } while (((tmp = readdir(dir)) != NULL)) { strcpy(abs_filename,&server[7]); if (abs_filename[strlen(abs_filename)-1] != '/'){ strcat(abs_filename,"/"); } strcat(abs_filename,tmp->d_name); if ((tmp->d_name[0] != '.') && (stat(abs_filename,&st)!= -1) && (S_ISDIR(st.st_mode)) && (search_for_discid(abs_filename,cddb_file,disc_id))){ break; } } closedir(dir); return(cddb_file[0]!=NULL);}int cddb_read_file(char *file, cddb_disc_header_t *cddb_info, cdinfo_t *cdinfo){ FILE *fd; gchar buffer[256], buffer2[BUF2SIZE]; gchar *realstr, *temp; gint len, command, bufs; gint num, oldnum; if((fd = fopen(file,"r")) == NULL) return 0; command = 1; bufs = 0; oldnum = -1; while (fgets(buffer, 256,fd) != NULL){ realstr = strchr(buffer, '='); if (buffer[0] == '#' || !realstr) continue; realstr++; len = strlen(realstr); if (realstr[len-1] == '\n') realstr[--len] = '\0'; /* remove newline */ switch (command) { case 1: if (!strncmp(buffer, "DISCID", 6)) break; command++; case 2: if (!strncmp(buffer, "DTITLE", 6)) { strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs); bufs += len; break; } if (bufs > 0) { buffer2[BUF2SIZE-1] = '\0'; if ((temp = strstr(buffer2, " / ")) != NULL) { cdda_cdinfo_cd_set(cdinfo, g_strdup(temp+3), g_strndup(buffer2, temp-buffer2)); } else cdda_cdinfo_cd_set(cdinfo, g_strdup(buffer2), g_strdup(buffer2)); bufs = 0; } command++; case 3: if (!strncmp(buffer, "TTITLE", 6)) { num = atoi(buffer + 6); if (oldnum < 0 || num == oldnum) { strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs); bufs += len; } else { buffer2[BUF2SIZE - 1] = '\0'; cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2)); strncpy(buffer2, realstr, BUF2SIZE); bufs = len; } oldnum = num; break; } if (oldnum >= 0) cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2)); bufs = 0; oldnum = -1; command++; case 4: if (!strncmp(buffer, "EXTD", 4)) { break; } command++; case 5: if (!strncmp(buffer, "EXTT", 4)) { break; } command++; case 6: if (!strncmp(buffer, "PLAYORDER", 9)) { break; } command++; default: g_log(NULL, G_LOG_LEVEL_WARNING, "%s: illegal cddb-data: %s", PACKAGE, buffer); break; } } if (oldnum >= 0) cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2)); fclose(fd); return(1);}void cdda_cddb_get_info(cdda_disc_toc_t *toc, cdinfo_t *cdinfo){ guint32 disc_id; cddb_disc_header_t cddb_disc_info; char *cddb_file[1]; disc_id = cdda_cddb_compute_discid(toc); cddb_file[0]=NULL; if ((cached_id != disc_id) && (strncmp(cdda_cfg.cddb_server,"file://",7) != 0)) { if (cddb_get_protocol_level() == 0) return; cached_id = disc_id; if(!cddb_query(cdda_cfg.cddb_server, toc, &cddb_disc_info)) return; if(!cddb_read(cdda_cfg.cddb_server, &cddb_disc_info, cdinfo)) return; cdinfo->is_valid = TRUE; } else if ((cached_id != disc_id) && (strncmp(cdda_cfg.cddb_server,"file://",7) == 0)){ cached_id = disc_id; if(!scan_cddb_dir(cdda_cfg.cddb_server,cddb_file,disc_id)) return; if(!cddb_read_file(cddb_file[0],&cddb_disc_info, cdinfo)){ g_free(cddb_file[0]); return; } cdinfo->is_valid = TRUE; g_free(cddb_file[0]); }}void cdda_cddb_set_server(gchar *new_server){ if (strcmp(cdda_cfg.cddb_server, new_server)) { g_free(cdda_cfg.cddb_server); cdda_cfg.cddb_server = g_strdup(new_server); cdda_cfg.cddb_protocol_level = 0; cached_id = 0; }}static gchar* cddb_position_string(gchar * input){ gchar deg[4], min[3]; if (input == NULL || strlen(input) < 7) return g_strdup(""); strncpy(deg, input + 1, 3); deg[3] = '\0'; strncpy(min, input + 5, 2); min[2] = '\0'; return g_strdup_printf("%2d
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -