Josh Coalson | ee44de4 | 2002-11-08 06:07:20 +0000 | [diff] [blame] | 1 | /* metaflac - Command-line FLAC metadata editor |
Josh Coalson | 0395dac | 2006-04-25 06:59:33 +0000 | [diff] [blame] | 2 | * Copyright (C) 2001,2002,2003,2004,2005,2006 Josh Coalson |
Josh Coalson | ee44de4 | 2002-11-08 06:07:20 +0000 | [diff] [blame] | 3 | * |
| 4 | * This program is free software; you can redistribute it and/or |
| 5 | * modify it under the terms of the GNU General Public License |
| 6 | * as published by the Free Software Foundation; either version 2 |
| 7 | * of the License, or (at your option) any later version. |
| 8 | * |
| 9 | * This program is distributed in the hope that it will be useful, |
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 | * GNU General Public License for more details. |
| 13 | * |
| 14 | * You should have received a copy of the GNU General Public License |
| 15 | * along with this program; if not, write to the Free Software |
| 16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 17 | */ |
| 18 | |
Josh Coalson | b1ec796 | 2006-05-24 04:41:36 +0000 | [diff] [blame] | 19 | #if HAVE_CONFIG_H |
| 20 | # include <config.h> |
| 21 | #endif |
| 22 | |
Josh Coalson | ee44de4 | 2002-11-08 06:07:20 +0000 | [diff] [blame] | 23 | #include "usage.h" |
| 24 | #include "FLAC/format.h" |
| 25 | #include <stdarg.h> |
| 26 | #include <stdio.h> |
| 27 | |
| 28 | static void usage_header(FILE *out) |
| 29 | { |
| 30 | fprintf(out, "==============================================================================\n"); |
| 31 | fprintf(out, "metaflac - Command-line FLAC metadata editor version %s\n", FLAC__VERSION_STRING); |
Josh Coalson | 0395dac | 2006-04-25 06:59:33 +0000 | [diff] [blame] | 32 | fprintf(out, "Copyright (C) 2001,2002,2003,2004,2005,2006 Josh Coalson\n"); |
Josh Coalson | ee44de4 | 2002-11-08 06:07:20 +0000 | [diff] [blame] | 33 | fprintf(out, "\n"); |
| 34 | fprintf(out, "This program is free software; you can redistribute it and/or\n"); |
| 35 | fprintf(out, "modify it under the terms of the GNU General Public License\n"); |
| 36 | fprintf(out, "as published by the Free Software Foundation; either version 2\n"); |
| 37 | fprintf(out, "of the License, or (at your option) any later version.\n"); |
| 38 | fprintf(out, "\n"); |
| 39 | fprintf(out, "This program is distributed in the hope that it will be useful,\n"); |
| 40 | fprintf(out, "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); |
| 41 | fprintf(out, "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); |
| 42 | fprintf(out, "GNU General Public License for more details.\n"); |
| 43 | fprintf(out, "\n"); |
| 44 | fprintf(out, "You should have received a copy of the GNU General Public License\n"); |
| 45 | fprintf(out, "along with this program; if not, write to the Free Software\n"); |
| 46 | fprintf(out, "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n"); |
| 47 | fprintf(out, "==============================================================================\n"); |
| 48 | } |
| 49 | |
| 50 | static void usage_summary(FILE *out) |
| 51 | { |
| 52 | fprintf(out, "Usage:\n"); |
| 53 | fprintf(out, " metaflac [options] [operations] FLACfile [FLACfile ...]\n"); |
| 54 | fprintf(out, "\n"); |
| 55 | fprintf(out, "Use metaflac to list, add, remove, or edit metadata in one or more FLAC files.\n"); |
| 56 | fprintf(out, "You may perform one major operation, or many shorthand operations at a time.\n"); |
| 57 | fprintf(out, "\n"); |
| 58 | fprintf(out, "Options:\n"); |
| 59 | fprintf(out, "--preserve-modtime Preserve the original modification time in spite of edits\n"); |
| 60 | fprintf(out, "--with-filename Prefix each output line with the FLAC file name\n"); |
| 61 | fprintf(out, " (the default if more than one FLAC file is specified)\n"); |
| 62 | fprintf(out, "--no-filename Do not prefix each output line with the FLAC file name\n"); |
| 63 | fprintf(out, " (the default if only one FLAC file is specified)\n"); |
Josh Coalson | 2a9ae6a | 2004-12-30 03:55:29 +0000 | [diff] [blame] | 64 | fprintf(out, "--no-utf8-convert Do not convert tags from UTF-8 to local charset,\n"); |
Josh Coalson | ee44de4 | 2002-11-08 06:07:20 +0000 | [diff] [blame] | 65 | fprintf(out, " or vice versa. This is useful for scripts.\n"); |
| 66 | fprintf(out, "--dont-use-padding By default metaflac tries to use padding where possible\n"); |
| 67 | fprintf(out, " to avoid rewriting the entire file if the metadata size\n"); |
| 68 | fprintf(out, " changes. Use this option to tell metaflac to not take\n"); |
| 69 | fprintf(out, " advantage of padding this way.\n"); |
| 70 | } |
| 71 | |
| 72 | int short_usage(const char *message, ...) |
| 73 | { |
| 74 | va_list args; |
| 75 | |
| 76 | if(message) { |
| 77 | va_start(args, message); |
| 78 | |
| 79 | (void) vfprintf(stderr, message, args); |
| 80 | |
| 81 | va_end(args); |
| 82 | |
| 83 | } |
| 84 | usage_header(stderr); |
| 85 | fprintf(stderr, "\n"); |
| 86 | fprintf(stderr, "This is the short help; for full help use 'metaflac --help'\n"); |
| 87 | fprintf(stderr, "\n"); |
| 88 | usage_summary(stderr); |
| 89 | |
| 90 | return message? 1 : 0; |
| 91 | } |
| 92 | |
| 93 | int long_usage(const char *message, ...) |
| 94 | { |
| 95 | FILE *out = (message? stderr : stdout); |
| 96 | va_list args; |
| 97 | |
| 98 | if(message) { |
| 99 | va_start(args, message); |
| 100 | |
| 101 | (void) vfprintf(stderr, message, args); |
| 102 | |
| 103 | va_end(args); |
| 104 | |
| 105 | } |
| 106 | usage_header(out); |
| 107 | fprintf(out, "\n"); |
| 108 | usage_summary(out); |
| 109 | fprintf(out, "\n"); |
| 110 | fprintf(out, "Shorthand operations:\n"); |
| 111 | fprintf(out, "--show-md5sum Show the MD5 signature from the STREAMINFO block.\n"); |
| 112 | fprintf(out, "--show-min-blocksize Show the minimum block size from the STREAMINFO block.\n"); |
| 113 | fprintf(out, "--show-max-blocksize Show the maximum block size from the STREAMINFO block.\n"); |
| 114 | fprintf(out, "--show-min-framesize Show the minimum frame size from the STREAMINFO block.\n"); |
| 115 | fprintf(out, "--show-max-framesize Show the maximum frame size from the STREAMINFO block.\n"); |
| 116 | fprintf(out, "--show-sample-rate Show the sample rate from the STREAMINFO block.\n"); |
| 117 | fprintf(out, "--show-channels Show the number of channels from the STREAMINFO block.\n"); |
| 118 | fprintf(out, "--show-bps Show the # of bits per sample from the STREAMINFO block.\n"); |
| 119 | fprintf(out, "--show-total-samples Show the total # of samples from the STREAMINFO block.\n"); |
| 120 | fprintf(out, "\n"); |
Josh Coalson | 0ceb449 | 2004-09-08 00:55:16 +0000 | [diff] [blame] | 121 | fprintf(out, "--show-vendor-tag Show the vendor string from the VORBIS_COMMENT block.\n"); |
| 122 | fprintf(out, "--show-tag=NAME Show all tags where the the field name matches 'NAME'.\n"); |
| 123 | fprintf(out, "--remove-tag=NAME Remove all tags whose field name is 'NAME'.\n"); |
| 124 | fprintf(out, "--remove-first-tag=NAME Remove first tag whose field name is 'NAME'.\n"); |
| 125 | fprintf(out, "--remove-all-tags Remove all tags, leaving only the vendor string.\n"); |
| 126 | fprintf(out, "--set-tag=FIELD Add a tag. The FIELD must comply with the Vorbis comment\n"); |
| 127 | fprintf(out, " spec, of the form \"NAME=VALUE\". If there is currently\n"); |
| 128 | fprintf(out, " no tag block, one will be created.\n"); |
Josh Coalson | 26c8235 | 2006-05-18 07:57:16 +0000 | [diff] [blame] | 129 | fprintf(out, "--set-tag-from-file=FIELD Like --set-tag, except the VALUE is a filename\n"); |
| 130 | fprintf(out, " whose contents will be read verbatim to set the tag value.\n"); |
| 131 | fprintf(out, " Unless --no-utf8-convert is specified, the contents will\n"); |
| 132 | fprintf(out, " be converted to UTF-8 from the local charset. This can\n"); |
| 133 | fprintf(out, " be used to store a cuesheet in a tag (e.g.\n"); |
| 134 | fprintf(out, " --set-tag-from-file=\"CUESHEET=image.cue\"). Do not try to\n"); |
| 135 | fprintf(out, " store binary data in tag fields! Use APPLICATION blocks\n"); |
| 136 | fprintf(out, " for that.\n"); |
Josh Coalson | 0ceb449 | 2004-09-08 00:55:16 +0000 | [diff] [blame] | 137 | fprintf(out, "--import-tags-from=FILE Import tags from a file. Use '-' for stdin. Each line\n"); |
| 138 | fprintf(out, " should be of the form NAME=VALUE. Multi-line comments\n"); |
| 139 | fprintf(out, " are currently not supported. Specify --remove-all-tags\n"); |
| 140 | fprintf(out, " and/or --no-utf8-convert before --import-tags-from if\n"); |
| 141 | fprintf(out, " necessary.\n"); |
| 142 | fprintf(out, "--export-tags-to=FILE Export tags to a file. Use '-' for stdin. Each line\n"); |
| 143 | fprintf(out, " will be of the form NAME=VALUE. Specify\n"); |
Josh Coalson | ee44de4 | 2002-11-08 06:07:20 +0000 | [diff] [blame] | 144 | fprintf(out, " --no-utf8-convert if necessary.\n"); |
Josh Coalson | 2a9ae6a | 2004-12-30 03:55:29 +0000 | [diff] [blame] | 145 | fprintf(out, "--import-cuesheet-from=FILE Import a cuesheet from a file. Use '-' for stdin.\n"); |
| 146 | fprintf(out, " Only one FLAC file may be specified. A seekpoint will be\n"); |
| 147 | fprintf(out, " added for each index point in the cuesheet to the SEEKTABLE\n"); |
| 148 | fprintf(out, " unless --no-cued-seekpoints is specified.\n"); |
Josh Coalson | 0ceb449 | 2004-09-08 00:55:16 +0000 | [diff] [blame] | 149 | fprintf(out, "--export-cuesheet-to=FILE Export CUESHEET block to a cuesheet file, suitable\n"); |
Josh Coalson | 2a9ae6a | 2004-12-30 03:55:29 +0000 | [diff] [blame] | 150 | fprintf(out, " for use by CD authoring software. Use '-' for stdout.\n"); |
Josh Coalson | 303123f | 2002-11-26 06:21:06 +0000 | [diff] [blame] | 151 | fprintf(out, " Only one FLAC file may be specified on the command line.\n"); |
Josh Coalson | ee44de4 | 2002-11-08 06:07:20 +0000 | [diff] [blame] | 152 | fprintf(out, "--add-replay-gain Calculates the title and album gains/peaks of the given\n"); |
| 153 | fprintf(out, " FLAC files as if all the files were part of one album,\n"); |
| 154 | fprintf(out, " then stores them in the VORBIS_COMMENT block. The tags\n"); |
| 155 | fprintf(out, " are the same as those used by vorbisgain. Existing\n"); |
| 156 | fprintf(out, " ReplayGain tags will be replaced. If only one FLAC file\n"); |
| 157 | fprintf(out, " is given, the album and title gains will be the same.\n"); |
| 158 | fprintf(out, " Since this operation requires two passes, it is always\n"); |
| 159 | fprintf(out, " executed last, after all other operations have been\n"); |
| 160 | fprintf(out, " completed and written to disk. All FLAC files specified\n"); |
| 161 | fprintf(out, " must have the same resolution, sample rate, and number\n"); |
| 162 | fprintf(out, " of channels. The sample rate must be one of 8, 11.025,\n"); |
| 163 | fprintf(out, " 12, 16, 22.05, 24, 32, 44.1, or 48 kHz.\n"); |
Josh Coalson | 83b8d28 | 2005-08-31 00:30:41 +0000 | [diff] [blame] | 164 | fprintf(out, "--remove-replay-gain Removes the ReplayGain tags.\n"); |
Josh Coalson | 4be849f | 2002-11-08 22:24:41 +0000 | [diff] [blame] | 165 | fprintf(out, "--add-seekpoint={#|X|#x|#s} Add seek points to a SEEKTABLE block\n"); |
| 166 | fprintf(out, " # : a specific sample number for a seek point\n"); |
| 167 | fprintf(out, " X : a placeholder point (always goes at the end of the SEEKTABLE)\n"); |
| 168 | fprintf(out, " #x : # evenly spaced seekpoints, the first being at sample 0\n"); |
| 169 | fprintf(out, " #s : a seekpoint every # seconds; # does not have to be a whole number\n"); |
| 170 | fprintf(out, " If no SEEKTABLE block exists, one will be created. If\n"); |
| 171 | fprintf(out, " one already exists, points will be added to the existing\n"); |
Josh Coalson | 63f2918 | 2002-12-21 03:30:10 +0000 | [diff] [blame] | 172 | fprintf(out, " table, and any duplicates will be turned into placeholder\n"); |
Josh Coalson | 4be849f | 2002-11-08 22:24:41 +0000 | [diff] [blame] | 173 | fprintf(out, " points. You may use many --add-seekpoint options; the\n"); |
| 174 | fprintf(out, " resulting SEEKTABLE will be the unique-ified union of\n"); |
| 175 | fprintf(out, " all such values. Example: --add-seekpoint=100x\n"); |
| 176 | fprintf(out, " --add-seekpoint=3.5s will add 100 evenly spaced\n"); |
| 177 | fprintf(out, " seekpoints and a seekpoint every 3.5 seconds.\n"); |
Josh Coalson | ee44de4 | 2002-11-08 06:07:20 +0000 | [diff] [blame] | 178 | fprintf(out, "--add-padding=length Add a padding block of the given length (in bytes).\n"); |
| 179 | fprintf(out, " The overall length of the new block will be 4 + length;\n"); |
| 180 | fprintf(out, " the extra 4 bytes is for the metadata block header.\n"); |
| 181 | fprintf(out, "\n"); |
| 182 | fprintf(out, "Major operations:\n"); |
| 183 | fprintf(out, "--version\n"); |
| 184 | fprintf(out, " Show the metaflac version number.\n"); |
| 185 | fprintf(out, "--list\n"); |
| 186 | fprintf(out, " List the contents of one or more metadata blocks to stdout. By default,\n"); |
| 187 | fprintf(out, " all metadata blocks are listed in text format. Use the following options\n"); |
| 188 | fprintf(out, " to change this behavior:\n"); |
| 189 | fprintf(out, "\n"); |
| 190 | fprintf(out, " --block-number=#[,#[...]]\n"); |
| 191 | fprintf(out, " An optional comma-separated list of block numbers to display. The first\n"); |
| 192 | fprintf(out, " block, the STREAMINFO block, is block 0.\n"); |
| 193 | fprintf(out, "\n"); |
| 194 | fprintf(out, " --block-type=type[,type[...]]\n"); |
| 195 | fprintf(out, " --except-block-type=type[,type[...]]\n"); |
Josh Coalson | 2a9ae6a | 2004-12-30 03:55:29 +0000 | [diff] [blame] | 196 | fprintf(out, " An optional comma-separated list of block types to be included or ignored\n"); |
Josh Coalson | ee44de4 | 2002-11-08 06:07:20 +0000 | [diff] [blame] | 197 | fprintf(out, " with this option. Use only one of --block-type or --except-block-type.\n"); |
| 198 | fprintf(out, " The valid block types are: STREAMINFO, PADDING, APPLICATION, SEEKTABLE,\n"); |
| 199 | fprintf(out, " VORBIS_COMMENT. You may narrow down the types of APPLICATION blocks\n"); |
| 200 | fprintf(out, " displayed as follows:\n"); |
| 201 | fprintf(out, " APPLICATION:abcd The APPLICATION block(s) whose textual repre-\n"); |
| 202 | fprintf(out, " sentation of the 4-byte ID is \"abcd\"\n"); |
| 203 | fprintf(out, " APPLICATION:0xXXXXXXXX The APPLICATION block(s) whose hexadecimal big-\n"); |
| 204 | fprintf(out, " endian representation of the 4-byte ID is\n"); |
| 205 | fprintf(out, " \"0xXXXXXXXX\". For the example \"abcd\" above the\n"); |
| 206 | fprintf(out, " hexadecimal equivalalent is 0x61626364\n"); |
| 207 | fprintf(out, "\n"); |
| 208 | fprintf(out, " NOTE: if both --block-number and --[except-]block-type are specified,\n"); |
| 209 | fprintf(out, " the result is the logical AND of both arguments.\n"); |
| 210 | fprintf(out, "\n"); |
| 211 | #if 0 |
| 212 | /*@@@ not implemented yet */ |
| 213 | fprintf(out, " --data-format=binary|text\n"); |
| 214 | fprintf(out, " By default a human-readable text representation of the data is displayed.\n"); |
| 215 | fprintf(out, " You may specify --data-format=binary to dump the raw binary form of each\n"); |
| 216 | fprintf(out, " metadata block. The output can be read in using a subsequent call to\n"); |
| 217 | fprintf(out, " "metaflac --append --from-file=..."\n"); |
| 218 | fprintf(out, "\n"); |
| 219 | #endif |
| 220 | fprintf(out, " --application-data-format=hexdump|text\n"); |
| 221 | fprintf(out, " If the application block you are displaying contains binary data but your\n"); |
| 222 | fprintf(out, " --data-format=text, you can display a hex dump of the application data\n"); |
| 223 | fprintf(out, " contents instead using --application-data-format=hexdump\n"); |
| 224 | fprintf(out, "\n"); |
| 225 | #if 0 |
| 226 | /*@@@ not implemented yet */ |
| 227 | fprintf(out, "--append\n"); |
| 228 | fprintf(out, " Insert a metadata block from a file. The input file must be in the same\n"); |
| 229 | fprintf(out, " format as generated with --list.\n"); |
| 230 | fprintf(out, "\n"); |
| 231 | fprintf(out, " --block-number=#\n"); |
| 232 | fprintf(out, " Specify the insertion point (defaults to last block). The new block will\n"); |
| 233 | fprintf(out, " be added after the given block number. This prevents the illegal insertion\n"); |
| 234 | fprintf(out, " of a block before the first STREAMINFO block. You may not --append another\n"); |
| 235 | fprintf(out, " STREAMINFO block.\n"); |
| 236 | fprintf(out, "\n"); |
| 237 | fprintf(out, " --from-file=filename\n"); |
| 238 | fprintf(out, " Mandatory 'option' to specify the input file containing the block contents.\n"); |
| 239 | fprintf(out, "\n"); |
| 240 | fprintf(out, " --data-format=binary|text\n"); |
| 241 | fprintf(out, " By default the block contents are assumed to be in binary format. You can\n"); |
| 242 | fprintf(out, " override this by specifying --data-format=text\n"); |
| 243 | fprintf(out, "\n"); |
| 244 | #endif |
| 245 | fprintf(out, "--remove\n"); |
| 246 | fprintf(out, " Remove one or more metadata blocks from the metadata. Unless\n"); |
| 247 | fprintf(out, " --dont-use-padding is specified, the blocks will be replaced with padding.\n"); |
| 248 | fprintf(out, " You may not remove the STREAMINFO block.\n"); |
| 249 | fprintf(out, "\n"); |
| 250 | fprintf(out, " --block-number=#[,#[...]]\n"); |
| 251 | fprintf(out, " --block-type=type[,type[...]]\n"); |
| 252 | fprintf(out, " --except-block-type=type[,type[...]]\n"); |
| 253 | fprintf(out, " See --list above for usage.\n"); |
| 254 | fprintf(out, "\n"); |
| 255 | fprintf(out, " NOTE: if both --block-number and --[except-]block-type are specified,\n"); |
| 256 | fprintf(out, " the result is the logical AND of both arguments.\n"); |
| 257 | fprintf(out, "\n"); |
| 258 | fprintf(out, "--remove-all\n"); |
| 259 | fprintf(out, " Remove all metadata blocks (except the STREAMINFO block) from the\n"); |
| 260 | fprintf(out, " metadata. Unless --dont-use-padding is specified, the blocks will be\n"); |
| 261 | fprintf(out, " replaced with padding.\n"); |
| 262 | fprintf(out, "\n"); |
| 263 | fprintf(out, "--merge-padding\n"); |
| 264 | fprintf(out, " Merge adjacent PADDING blocks into single blocks.\n"); |
| 265 | fprintf(out, "\n"); |
| 266 | fprintf(out, "--sort-padding\n"); |
| 267 | fprintf(out, " Move all PADDING blocks to the end of the metadata and merge them into a\n"); |
| 268 | fprintf(out, " single block.\n"); |
| 269 | |
| 270 | return message? 1 : 0; |
| 271 | } |