mpg123info 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/bin/bash
  2. if test $# -eq 0; then
  3. echo "Give me some MPEG 1.0/2.0/2.5 layer 1/2/3 audio file name(s) and I give you meta info about it in an easily-parseable format:
  4. name=value
  5. for simple value association and
  6. name.=value
  7. to add another line to existing value (multiline comments)."
  8. fi
  9. for i in "$@"
  10. do
  11. echo lp "$i"
  12. echo tag
  13. echo scan
  14. echo format
  15. echo sample
  16. done |
  17. mpg123 -t -R |
  18. perl -e '
  19. while(<STDIN>)
  20. {
  21. if(/\@T \{/)
  22. {
  23. print "# meta info for: ".(shift @ARGV)."\n";
  24. $field = undef;
  25. %count = ();
  26. %linecount = ();
  27. }
  28. elsif(/\@T ID3:(.*)$/)
  29. {
  30. $field = undef;
  31. print "ID3v1.title=".substr($1, 0, 30)."\n";
  32. print "ID3v1.artist=".substr($1, 30, 30)."\n";
  33. print "ID3v1.album=".substr($1, 60, 30)."\n";
  34. print "ID3v1.year=".substr($1, 90, 4)."\n";
  35. print "ID3v1.comment=".substr($1, 94, 30)."\n";
  36. print "ID3v1.genre=".substr($1, 124)."\n";
  37. }
  38. elsif(/\@T ID3\.([^:]+):(.*)$/)
  39. {
  40. $field = undef;
  41. print "ID3.$1=$2\n";
  42. }
  43. elsif(/\@T (ID3v2\.\S{4})(|\s+lang\(([^\(\)]*)\)\s+desc\(([^\(\)]*)\)):/)
  44. {
  45. $class = $1;
  46. $field = ++$count{$class} > 1 ? "$class$count{$class}" : $class;
  47. print "$field.lang=$3\n" if(defined $3);
  48. print "$field.desc=$4\n" if(defined $4);
  49. }
  50. elsif(/\@T =(.*)$/)
  51. {
  52. next unless defined $field;
  53. print "$field".(++$linecount{$field} > 1 ? ".=" : "=").$1."\n";
  54. }
  55. elsif(/\@FORMAT\s+(\d+)\s+(\d+)/)
  56. {
  57. print "format.rate=$1\n";
  58. print "format.channels=$2\n";
  59. }
  60. elsif(/\@SAMPLE\s+(\d+)\s+(\d+)/)
  61. {
  62. print "samples=$2\n";
  63. }
  64. }
  65. ' "$@"