51a52 > #include 56a58 > #include "opt.h" 131a134,135 > static void mserv_cmd_x_cover(t_client *cl, const char *ru, > const char *line); 146c150,151 < t_cmds mserv_cmds[] = { --- > t_cmds mserv_cmds[] = > { 148c153,154 < { 0, level_guest, "QUIT", mserv_cmd_quit, --- > { > 0, level_guest, "QUIT", mserv_cmd_quit, 150,151c156,159 < "" }, < { 0, level_guest, "HELP", mserv_cmd_help, --- > "" > }, > { > 0, level_guest, "HELP", mserv_cmd_help, 153,154c161,164 < "[ []]" }, < { 0, level_guest, "USER", mserv_cmd_user, --- > "[ []]" > }, > { > 0, level_guest, "USER", mserv_cmd_user, 156,157c166,169 < "" }, < { 0, level_guest, "PASS", mserv_cmd_pass, --- > "" > }, > { > 0, level_guest, "PASS", mserv_cmd_pass, 159,160c171,174 < " []" }, < { 0, level_guest, "DATE", mserv_cmd_date, --- > " []" > }, > { > 0, level_guest, "DATE", mserv_cmd_date, 162,163c176,179 < "" }, < { 1, level_guest, "STATUS", mserv_cmd_status, --- > "" > }, > { > 1, level_guest, "STATUS", mserv_cmd_status, 165,166c181,184 < "" }, < { 1, level_guest, "USERINFO", mserv_cmd_userinfo, --- > "" > }, > { > 1, level_guest, "USERINFO", mserv_cmd_userinfo, 168,169c186,189 < "" }, < { 1, level_user, "WHO", mserv_cmd_who, --- > "" > }, > { > 1, level_user, "WHO", mserv_cmd_who, 171,172c191,194 < "" }, < { 1, level_user, "SAY", mserv_cmd_say, --- > "" > }, > { > 1, level_user, "SAY", mserv_cmd_say, 174,175c196,199 < "" }, < { 1, level_user, "EMOTE", mserv_cmd_emote, --- > "" > }, > { > 1, level_user, "EMOTE", mserv_cmd_emote, 177,178c201,204 < "" }, < { 1, level_guest, "ALBUMS", mserv_cmd_albums, --- > "" > }, > { > 1, level_guest, "ALBUMS", mserv_cmd_albums, 180,181c206,209 < "" }, < { 1, level_guest, "TRACKS", mserv_cmd_tracks, --- > "" > }, > { > 1, level_guest, "TRACKS", mserv_cmd_tracks, 183,184c211,214 < "[]" }, < { 1, level_guest, "RATINGS", mserv_cmd_ratings, --- > "[]" > }, > { > 1, level_guest, "RATINGS", mserv_cmd_ratings, 186,187c216,219 < "[ ]" }, < { 1, level_guest, "QUEUE", mserv_cmd_queue, --- > "[ ]" > }, > { > 1, level_guest, "QUEUE", mserv_cmd_queue, 189,190c221,224 < "[ [|RANDOM]]" }, < { 1, level_user, "UNQUEUE", mserv_cmd_unqueue, --- > "[ [|RANDOM]]" > }, > { > 1, level_user, "UNQUEUE", mserv_cmd_unqueue, 192,193c226,229 < " " }, < { 1, level_user, "PLAY", mserv_cmd_play, --- > " " > }, > { > 1, level_user, "PLAY", mserv_cmd_play, 195,196c231,234 < "" }, < { 1, level_user, "STOP", mserv_cmd_stop, --- > "" > }, > { > 1, level_user, "STOP", mserv_cmd_stop, 198,199c236,239 < "" }, < { 1, level_user, "NEXT", mserv_cmd_next, --- > "" > }, > { > 1, level_user, "NEXT", mserv_cmd_next, 201,202c241,244 < "" }, < { 1, level_user, "PAUSE", mserv_cmd_pause, --- > "" > }, > { > 1, level_user, "PAUSE", mserv_cmd_pause, 204,205c246,249 < "" }, < { 1, level_user, "CLEAR", mserv_cmd_clear, --- > "" > }, > { > 1, level_user, "CLEAR", mserv_cmd_clear, 207,208c251,254 < "" }, < { 1, level_user, "REPEAT", mserv_cmd_repeat, --- > "" > }, > { > 1, level_user, "REPEAT", mserv_cmd_repeat, 210,211c256,259 < "" }, < { 1, level_guest, "RANDOM", mserv_cmd_random, --- > "" > }, > { > 1, level_guest, "RANDOM", mserv_cmd_random, 213,214c261,264 < "[off|on]" }, < { 1, level_user, "FILTER", mserv_cmd_filter, --- > "[off|on]" > }, > { > 1, level_user, "FILTER", mserv_cmd_filter, 216,217c266,269 < "off|" }, < { 1, level_guest, "FACTOR", mserv_cmd_factor, --- > "off|" > }, > { > 1, level_guest, "FACTOR", mserv_cmd_factor, 219,220c271,274 < "<0=play worst, 0.5=play any, 0.99=play best>" }, < { 1, level_guest, "TOP", mserv_cmd_top, --- > "<0=play worst, 0.5=play any, 0.99=play best>" > }, > { > 1, level_guest, "TOP", mserv_cmd_top, 222,223c276,279 < "[]" }, < { 1, level_guest, "VOLUME", mserv_cmd_volume, --- > "[]" > }, > { > 1, level_guest, "VOLUME", mserv_cmd_volume, 225,226c281,284 < "[[+|-][<0-100>]]" }, < { 1, level_guest, "BASS", mserv_cmd_bass, --- > "[[+|-][<0-100>]]" > }, > { > 1, level_guest, "BASS", mserv_cmd_bass, 228,229c286,289 < "[[+|-][<0-100>]]" }, < { 1, level_guest, "TREBLE", mserv_cmd_treble, --- > "[[+|-][<0-100>]]" > }, > { > 1, level_guest, "TREBLE", mserv_cmd_treble, 231,232c291,294 < "[[+|-][<0-100>]]" }, < { 1, level_guest, "HISTORY", mserv_cmd_history, --- > "[[+|-][<0-100>]]" > }, > { > 1, level_guest, "HISTORY", mserv_cmd_history, 234,235c296,299 < "" }, < { 1, level_user, "RATE", mserv_cmd_rate, --- > "" > }, > { > 1, level_user, "RATE", mserv_cmd_rate, 237,238c301,304 < "[ []] " }, < { 1, level_user, "CHECK", mserv_cmd_check, --- > "[ []] " > }, > { > 1, level_user, "CHECK", mserv_cmd_check, 240,241c306,309 < "" }, < { 1, level_guest, "SEARCH", mserv_cmd_search, --- > "" > }, > { > 1, level_guest, "SEARCH", mserv_cmd_search, 243,244c311,314 < "" }, < { 1, level_guest, "SEARCHF", mserv_cmd_searchf, --- > "" > }, > { > 1, level_guest, "SEARCHF", mserv_cmd_searchf, 246,247c316,319 < "" }, < { 1, level_guest, "ASEARCH", mserv_cmd_asearch, --- > "" > }, > { > 1, level_guest, "ASEARCH", mserv_cmd_asearch, 249,250c321,324 < "" }, < { 1, level_guest, "INFO", mserv_cmd_info, --- > "" > }, > { > 1, level_guest, "INFO", mserv_cmd_info, 252,253c326,329 < "[ []]" }, < { 1, level_user, "PASSWORD", mserv_cmd_password, --- > "[ []]" > }, > { > 1, level_user, "PASSWORD", mserv_cmd_password, 255c331,332 < " " }, --- > " " > }, 257c334,335 < { 1, level_user, "IDEA", mserv_cmd_idea, --- > { > 1, level_user, "IDEA", mserv_cmd_idea, 259c337,338 < "" }, --- > "" > }, 261c340,341 < { 1, level_master, "MOO", mserv_cmd_moo, --- > { > 1, level_master, "MOO", mserv_cmd_moo, 263,264c343,346 < "" }, < { 1, level_master, "CREATE", mserv_cmd_create, --- > "" > }, > { > 1, level_master, "CREATE", mserv_cmd_create, 266,267c348,351 < " " }, < { 1, level_master, "REMOVE", mserv_cmd_remove, --- > " " > }, > { > 1, level_master, "REMOVE", mserv_cmd_remove, 269,270c353,356 < "" }, < { 1, level_master, "LEVEL", mserv_cmd_level, --- > "" > }, > { > 1, level_master, "LEVEL", mserv_cmd_level, 272,273c358,361 < " " }, < { 1, level_priv, "KICK", mserv_cmd_kick, --- > " " > }, > { > 1, level_priv, "KICK", mserv_cmd_kick, 275,276c363,366 < " [0|]" }, < { 1, level_priv, "RESET", mserv_cmd_reset, --- > " [0|]" > }, > { > 1, level_priv, "RESET", mserv_cmd_reset, 278,279c368,371 < "" }, < { 1, level_priv, "SYNC", mserv_cmd_sync, --- > "" > }, > { > 1, level_priv, "SYNC", mserv_cmd_sync, 281,282c373,376 < "" }, < { 1, level_priv, "GAP", mserv_cmd_gap, --- > "" > }, > { > 1, level_priv, "GAP", mserv_cmd_gap, 284,285c378,381 < "[]" }, < { 1, level_master, "SHUTDOWN", mserv_cmd_shutdown, --- > "[]" > }, > { > 1, level_master, "SHUTDOWN", mserv_cmd_shutdown, 287,288c383,386 < "" }, < { 1, level_priv, "SET", mserv_cmd_set, --- > "" > }, > { > 1, level_priv, "SET", mserv_cmd_set, 290,291c388,391 < "" }, < { 1, level_guest, "X", mserv_cmd_x, --- > "" > }, > { > 1, level_guest, "X", mserv_cmd_x, 293c393,394 < "" }, --- > "" > }, 297c398,399 < t_cmds mserv_x_cmds[] = { --- > t_cmds mserv_x_cmds[] = > { 299c401,402 < { 1, level_guest, "AUTHORS", mserv_cmd_x_authors, --- > { > 1, level_guest, "AUTHORS", mserv_cmd_x_authors, 301,302c404,407 < "" }, < { 1, level_guest, "AUTHORID", mserv_cmd_x_authorid, --- > "" > }, > { > 1, level_guest, "AUTHORID", mserv_cmd_x_authorid, 304,305c409,412 < "" }, < { 1, level_guest, "AUTHORINFO", mserv_cmd_x_authorinfo, --- > "" > }, > { > 1, level_guest, "AUTHORINFO", mserv_cmd_x_authorinfo, 307,308c414,417 < "" }, < { 1, level_guest, "AUTHORTRACKS", mserv_cmd_x_authortracks, --- > "" > }, > { > 1, level_guest, "AUTHORTRACKS", mserv_cmd_x_authortracks, 310,311c419,422 < "" }, < { 1, level_guest, "GENRES", mserv_cmd_x_genres, --- > "" > }, > { > 1, level_guest, "GENRES", mserv_cmd_x_genres, 313,314c424,427 < "" }, < { 1, level_guest, "GENREID", mserv_cmd_x_genreid, --- > "" > }, > { > 1, level_guest, "GENREID", mserv_cmd_x_genreid, 316,317c429,432 < "" }, < { 1, level_guest, "GENREINFO", mserv_cmd_x_genreinfo, --- > "" > }, > { > 1, level_guest, "GENREINFO", mserv_cmd_x_genreinfo, 319,320c434,437 < "" }, < { 1, level_guest, "GENRETRACKS", mserv_cmd_x_genretracks, --- > "" > }, > { > 1, level_guest, "GENRETRACKS", mserv_cmd_x_genretracks, 322c439,445 < "" }, --- > "" > }, > { > 1, level_guest, "COVER", mserv_cmd_x_cover, > "returns uuencoded cd cover picture", > "" > }, 326,327c449,452 < t_cmds mserv_set_cmds[] = { < { 1, level_priv, "AUTHOR", mserv_cmd_set_author, --- > t_cmds mserv_set_cmds[] = > { > { > 1, level_priv, "AUTHOR", mserv_cmd_set_author, 329,330c454,457 < " " }, < { 1, level_priv, "NAME", mserv_cmd_set_name, --- > " " > }, > { > 1, level_priv, "NAME", mserv_cmd_set_name, 332,333c459,462 < " " }, < { 1, level_priv, "GENRE", mserv_cmd_set_genre, --- > " " > }, > { > 1, level_priv, "GENRE", mserv_cmd_set_genre, 335,336c464,467 < " [] [,]*" }, < { 1, level_priv, "YEAR", mserv_cmd_set_year, --- > " [] [,]*" > }, > { > 1, level_priv, "YEAR", mserv_cmd_set_year, 338,339c469,472 < " <0|year>" }, < { 1, level_priv, "ALBUMAUTHOR", mserv_cmd_set_albumauthor, --- > " <0|year>" > }, > { > 1, level_priv, "ALBUMAUTHOR", mserv_cmd_set_albumauthor, 341,342c474,477 < " " }, < { 1, level_priv, "ALBUMNAME", mserv_cmd_set_albumname, --- > " " > }, > { > 1, level_priv, "ALBUMNAME", mserv_cmd_set_albumname, 344c479,480 < " " }, --- > " " > }, 374a511 > 399a537 > 412a551 > 420a560 > 440c580,581 < } else { --- > } > else { 459c600,601 < } else { --- > } > else { 491c633,634 < } else { --- > } > else { 503c646,647 < } else { --- > } > else { 515a660 > 531a677 > 555c701,702 < } else { --- > } > else { 559c706,707 < } else { --- > } > else { 566c714,715 < } else if (!stricmp("COMPUTER", s)) { --- > } > else if (!stricmp("COMPUTER", s)) { 568c717,718 < } else if (!stricmp("RTCOMPUTER", s)) { --- > } > else if (!stricmp("RTCOMPUTER", s)) { 570c720,721 < } else { --- > } > else { 592a744 > 627c779,780 < } else { --- > } > else { 641a795 > 678c832,833 < } else { --- > } > else { 715a871 > 742c898,899 < } else { --- > } > else { 754a912 > 777a936 > 809a969 > 844c1004,1005 < } else { --- > } > else { 865a1027 > 907a1070 > 922c1085,1086 < } else { --- > } > else { 930a1095 > 947c1112,1113 < } else { --- > } > else { 972c1138,1139 < } else { --- > } > else { 986a1154 > 1008c1176,1177 < } else { --- > } > else { 1045c1214,1215 < } else { --- > } > else { 1054a1225 > 1107a1279 > 1143c1315,1316 < } else { --- > } > else { 1186c1359,1360 < } else if (p == 1) { --- > } > else if (p == 1) { 1200c1374,1375 < } else { --- > } > else { 1222c1397,1398 < } else { --- > } > else { 1249a1426 > 1291c1468,1469 < } else if (client->mode == mode_rtcomputer) { --- > } > else if (client->mode == mode_rtcomputer) { 1303a1482 > 1334c1513,1514 < } else { --- > } > else { 1344a1525 > 1361c1542,1543 < } else { --- > } > else { 1365a1548 > 1380c1563,1564 < } else { --- > } > else { 1384a1569 > 1395c1580,1581 < } else { --- > } > else { 1405a1592 > 1426a1614 > 1448c1636,1637 < } else { --- > } > else { 1452a1642 > 1481c1671,1672 < } else if (!stricmp(line, "off")) { --- > } > else if (!stricmp(line, "off")) { 1493a1685 > 1510c1702,1703 < } else { --- > } > else { 1523a1717 > 1546a1741 > 1592c1787,1788 < } else { --- > } > else { 1614c1810,1811 < } else { --- > } > else { 1627a1825 > 1636c1834,1835 < } else if ((val = mserv_setmixer(cl, SOUND_MIXER_PCM, line)) != -1) { --- > } > else if ((val = mserv_setmixer(cl, SOUND_MIXER_PCM, line)) != -1) { 1639c1838,1839 < } else { --- > } > else { 1651a1852 > 1660c1861,1862 < } else if ((val = mserv_setmixer(cl, SOUND_MIXER_BASS, line)) != -1) { --- > } > else if ((val = mserv_setmixer(cl, SOUND_MIXER_BASS, line)) != -1) { 1663c1865,1866 < } else { --- > } > else { 1675a1879 > 1684c1888,1889 < } else if ((val = mserv_setmixer(cl, SOUND_MIXER_TREBLE, line)) != -1) { --- > } > else if ((val = mserv_setmixer(cl, SOUND_MIXER_TREBLE, line)) != -1) { 1687c1892,1893 < } else { --- > } > else { 1699a1906 > 1707a1915 > 1715a1924 > 1765a1975 > 1813a2024 > 1869c2080,2081 < } else { --- > } > else { 1893a2106 > 1940a2154 > 1983a2198 > 2027a2243 > 2047c2263,2264 < } else { --- > } > else { 2059a2277 > 2096c2314,2315 < } else { --- > } > else { 2104c2323,2324 < } else { --- > } > else { 2134c2354,2355 < } else { --- > } > else { 2176c2397,2398 < } else { --- > } > else { 2186c2408,2409 < rate2->rating == 0) { /* 0 means heard, not rated */ --- > /* 0 means heard, not rated */ > rate2->rating == 0) { 2192c2415,2416 < } else { --- > } > else { 2204c2428,2429 < } else { --- > } > else { 2212a2438 > 2260c2486,2487 < } else { --- > } > else { 2283c2510,2511 < } else { --- > } > else { 2287a2516 > 2321c2550,2551 < } else { --- > } > else { 2336c2566,2567 < } else { --- > } > else { 2340a2572 > 2363c2595,2596 < } else { --- > } > else { 2373c2606,2607 < } else { --- > } > else { 2377a2612 > 2414c2649,2650 < } else { --- > } > else { 2429c2665,2666 < } else { --- > } > else { 2433a2671 > 2471c2709,2710 < } else { --- > } > else { 2563a2803 > 2581c2821,2822 < if (rate && rate->rating) /* rate->rating being 0 means 'heard' */ --- > /* rate->rating being 0 means 'heard' */ > if (rate && rate->rating) 2588c2829,2830 < } else { --- > } > else { 2597a2840 > 2612a2856 > 2640c2884,2885 < if (rate && rate->rating) /* rate->rating being 0 means 'heard' */ --- > /* rate->rating being 0 means 'heard' */ > if (rate && rate->rating) 2651a2897 > 2685c2931,2932 < } else { --- > } > else { 2701a2949 > 2730a2979 > 2760c3009,3010 < } else { --- > } > else { 2778a3029 > 2800a3052 > 2811a3064 > 2824c3077,3078 < } else { --- > } > else { 2835a3090 > 2855a3111 > 2876c3132,3133 < } else { --- > } > else { 2885a3143,3265 > > //======= > // Command: X COVER - send an album cover (jpg/gif) uuencoded > //======= > // uuencode base64 stuff > // see: http://www.opengroup.org/onlinepubs/009695399/utilities/uuencode.html > #define ENC(c) ( mmset[ (c) & 077 ] ) > static char mmset[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; > #define UUENC_CPL (57) // characters per line > > static void mserv_cmd_x_cover(t_client *cl, const char *ru, const char *line) > { > char linespl[LINEBUFLEN]; > t_rating *rate; > t_album *album; > t_track *track; > unsigned int n_album; > unsigned int n_track; > unsigned int i; > char *str[3]; > char *end; > char ago[64]; > int diff; > char token[16]; > char year[32]; > unsigned int ttime; > char buf[80]; > char wbuf[80], *wptr; > int n; > FILE *in; > DIR *dir; > struct dirent *ent; > char fullpath[1024]; > char cover[1024]; > > > strcpy(linespl, line); > if (mserv_split(str, 2, linespl, " ") < 1) { > mserv_response(cl, "BADPARM", NULL); > return; > } > n_album = strtol(str[0], &end, 10); > if (!*str[0] || *end) { > mserv_response(cl, "NAN", NULL); > return; > } > > /* album information */ > if ((album = mserv_getalbum(n_album)) == NULL) { > mserv_response(cl, "NOALBUM", NULL); > return; > } > // find the first track with filename. The cover should be > // on the same directory (assumes 1 CD = 1 directory) > for (i = 0; i < TRACKSPERALBUM; i++) { > if (album->tracks[i] && album->tracks[i]->filename) { > sprintf(fullpath,"%s/%s",opt_path_tracks,album->tracks[i]->filename); > (*strrchr(fullpath, '/')) = '\0'; > mserv_log("Cover on path: %s", fullpath); > break; > } > } > > // find the album cover ..file.. > if ((dir = opendir(fullpath)) == NULL) { > mserv_response(cl, "NOALBUM","Opendir %s", fullpath); > mserv_log("Cant opendir %s", fullpath); > return; > } > while((ent = readdir(dir))) { > char *exten; > /* ignore dot files */ > if (ent->d_name[0] == '.') > continue; > if (exten=strrchr(ent->d_name,'.')) { > if (stricmp(exten,".jpg")==0 || > stricmp(exten,".gif")==0) { > // found our first cover file.. > sprintf(cover,"%s/%s",fullpath,ent->d_name); > mserv_log("Cover found: %s",cover); > break; > } > } > } > closedir(dir); > > // open our cover > if ((in = fopen(cover, "r")) == NULL) { > mserv_log("Cant open coverfile: %s", cover); > mserv_response(cl, "NOALBUM","Cant open %s",cover); > return; > } > // before we start, first a header. TODO->new header! > mserv_responsent(cl, "ALBUMS", NULL); > > // Base64 uuencode algo, pretty basic > for (;;) { > n = fread(buf, 1, UUENC_CPL, in); > wptr = wbuf; > /* Make sure additional bits are always zero */ > if (n>0 && n < UUENC_CPL) > memset(buf+n, 0, UUENC_CPL - n); > *wptr++ = ENC(n); // linelength as first char > if (n<=0) > break; > for (i=0; i unsigned char *p = buf + i; > int v; > *wptr++ = ENC(v=(*p >> 2)); > *wptr++ = ENC(v=((*p << 4) & 060 | (p[1] >> 4) & 017)); > *wptr++ = ENC(v=((p[1] << 2) & 074 | (p[2] >> 6) & 03)); > *wptr++ = ENC(v=(p[2] & 077)); > } > strcpy(wptr,"\r\n"); > mserv_send(cl,wbuf,0); > if (n <= 0) > break; > } > fclose(in); > mserv_send(cl, ".\r\n", 0); > } > > 2900a3281 > 2925c3306,3307 < if (rate && rate->rating) /* rate->rating being 0 means 'heard' */ --- > /* rate->rating being 0 means 'heard' */ > if (rate && rate->rating) 2935a3318 > 2969c3352,3353 < } else { --- > } > else {