You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

241 lines
4.7 KiB

  1. /*
  2. * cueprint.c -- print cd information based on a template
  3. *
  4. * Copyright (C) 2004 Svend Sorensen
  5. * For license terms, see the file COPYING in this distribution.
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h> /* exit() */
  9. #include <string.h> /* strcmp() */
  10. #include <unistd.h> /* getopt() */
  11. #include <ctype.h> /* isdigit() */
  12. #include "cuefile.h"
  13. /* default templates */
  14. #define D_TEMPLATE "%P \"%T\" (%N tracks)\n"
  15. #define T_TEMPLATE "%n: %p \"%t\"\n"
  16. char *progname;
  17. char *d_template = D_TEMPLATE; /* disc template */
  18. char *t_template = T_TEMPLATE; /* track template */
  19. void usage (int status)
  20. {
  21. if (0 == status) {
  22. fprintf(stdout, "%s: usage: cueprint [-h] [-i cue|toc] [-d TEMPLATE] [-t TEMPLATE] [file...]\n", progname);
  23. fputs("\
  24. \n\
  25. OPTIONS\n\
  26. -h print usage\n\
  27. -i cue|toc set format of file(s)\n\
  28. -d TEMPLATE set disc template (see TEMPLATE EXPANSION)\n\
  29. -t TEMPLATE set track template (see TEMPLATE EXPANSION)\n\
  30. \n\
  31. Template Expansion\n\
  32. Disc:\n\
  33. %A - album arranger\n\
  34. %C - album composer\n\
  35. %G - album genre\n\
  36. %M - album message\n\
  37. %N - number of tracks\n\
  38. %P - album performer\n\
  39. %S - album songwriter\n\
  40. %T - album title\n\
  41. %U - album UPC/EAN\n\
  42. Track:\n\
  43. %a - track arranger\n\
  44. %c - track composer\n\
  45. %g - track genre\n\
  46. %i - track ISRC\n\
  47. %m - track message\n\
  48. %n - track number\n\
  49. %p - track perfomer\n\
  50. %t - track title\n\
  51. %u - track ISRC (CD-TEXT)\n\
  52. \n\
  53. Any other %<character> is expanded to that character. For example, to get a\n\
  54. '%', use %%.\n\
  55. ", stdout);
  56. fprintf(stdout, "default disc template is:\n\"%s\"\n", D_TEMPLATE);
  57. fprintf(stdout, "default track template is:\n\"%s\"\n", T_TEMPLATE);
  58. } else {
  59. fprintf(stderr, "%s: syntax error\n", progname);
  60. fprintf(stderr, "run `%s -h' for usage\n", progname);
  61. }
  62. exit (status);
  63. }
  64. void disc_field (char *c, Cd *cd)
  65. {
  66. Cdtext *cdtext = NULL;
  67. cdtext = cd_get_cdtext(cd);
  68. switch (*c) {
  69. case 'A':
  70. printf("%s", cdtext_get(PTI_ARRANGER, cdtext));
  71. break;
  72. case 'C':
  73. printf("%s", cdtext_get(PTI_COMPOSER, cdtext));
  74. break;
  75. case 'G':
  76. printf("%s", cdtext_get(PTI_GENRE, cdtext));
  77. break;
  78. case 'M':
  79. printf("%s", cdtext_get(PTI_MESSAGE, cdtext));
  80. break;
  81. case 'N':
  82. printf("%0*d", 2, cd_get_ntrack(cd));
  83. break;
  84. case 'P':
  85. printf("%s", cdtext_get(PTI_PERFORMER, cdtext));
  86. break;
  87. case 'R':
  88. printf("%s", cdtext_get(PTI_ARRANGER, cdtext));
  89. break;
  90. case 'S':
  91. printf("%s", cdtext_get(PTI_SONGWRITER, cdtext));
  92. break;
  93. case 'T':
  94. printf("%s", cdtext_get(PTI_TITLE, cdtext));
  95. break;
  96. case 'U':
  97. printf("%s", cdtext_get(PTI_UPC_ISRC, cdtext));
  98. break;
  99. default:
  100. putchar(*c);
  101. break;
  102. }
  103. }
  104. void track_field (char *c, Cd *cd, int trackno)
  105. {
  106. Track *track = NULL;
  107. Cdtext *cdtext = NULL;
  108. track = cd_get_track(cd, trackno);
  109. cdtext = track_get_cdtext(track);
  110. switch (*c) {
  111. case 'a':
  112. printf("%s", cdtext_get(PTI_ARRANGER, cdtext));
  113. break;
  114. case 'c':
  115. printf("%s", cdtext_get(PTI_COMPOSER, cdtext));
  116. break;
  117. case 'f':
  118. printf("%s", track_get_filename(track));
  119. break;
  120. case 'g':
  121. printf("%s", cdtext_get(PTI_GENRE, cdtext));
  122. break;
  123. case 'i':
  124. printf("%s", track_get_isrc(track));
  125. break;
  126. case 'm':
  127. printf("%s", cdtext_get(PTI_MESSAGE, cdtext));
  128. break;
  129. case 'n':
  130. printf("%0*d", 2, trackno);
  131. break;
  132. case 'p':
  133. printf("%s", cdtext_get(PTI_PERFORMER, cdtext));
  134. break;
  135. case 's':
  136. printf("%s", cdtext_get(PTI_SONGWRITER, cdtext));
  137. break;
  138. case 't':
  139. printf("%s", cdtext_get(PTI_TITLE, cdtext));
  140. break;
  141. case 'u':
  142. printf("%s", cdtext_get(PTI_UPC_ISRC, cdtext));
  143. break;
  144. default:
  145. disc_field(c, cd);
  146. break;
  147. }
  148. }
  149. void print_info (Cd *cd)
  150. {
  151. int i; /* track */
  152. char *c;
  153. for (c = d_template; '\0' != *c; c++) {
  154. if ('%' == *c) {
  155. c++;
  156. disc_field(c, cd);
  157. } else {
  158. putchar(*c);
  159. }
  160. }
  161. for (i = 1; i <= cd_get_ntrack(cd); i++) {
  162. for (c = t_template; '\0' != *c; c++) {
  163. if ('%' == *c) {
  164. c++;
  165. track_field(c, cd, i);
  166. } else {
  167. putchar(*c);
  168. }
  169. }
  170. }
  171. }
  172. int info (char *name, int format)
  173. {
  174. Cd *cd = NULL;
  175. if (NULL == (cd = cf_parse(name, &format))) {
  176. fprintf(stderr, "%s: input file error\n", name);
  177. return -1;
  178. }
  179. print_info(cd);
  180. return 0;
  181. }
  182. int main (int argc, char **argv)
  183. {
  184. int format = UNKNOWN;
  185. /* getopt () variables */
  186. char c;
  187. extern char *optarg;
  188. extern int optind;
  189. progname = *argv;
  190. while (-1 != (c = getopt(argc, argv, "hi:d:t:"))) {
  191. switch (c) {
  192. case 'h':
  193. usage(0);
  194. break;
  195. case 'i':
  196. if (0 == strcmp("cue", optarg))
  197. format = CUE;
  198. else if (0 == strcmp("toc", optarg))
  199. format = TOC;
  200. break;
  201. case 'd':
  202. d_template = optarg;
  203. break;
  204. case 't':
  205. t_template = optarg;
  206. break;
  207. default:
  208. usage(1);
  209. break;
  210. }
  211. }
  212. if (optind == argc) {
  213. info("-", format);
  214. } else {
  215. for (; optind < argc; optind++)
  216. info(argv[optind], format);
  217. }
  218. return 0;
  219. }