taffy 1.0.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +43 -34
  3. data/bin/taffy +41 -9
  4. data/taffy.gemspec +4 -4
  5. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a5bf0ec96d13e39c428d1cefc0d512c18cf00d63
4
- data.tar.gz: 83f113d30021a166a9ccf3496253f9e418d4ea73
3
+ metadata.gz: 727ec7db507261872cfb085e9f2cb700ce306432
4
+ data.tar.gz: 0372a2d4f1751c73fffdbe78f9bfe98e2b0e1bd0
5
5
  SHA512:
6
- metadata.gz: 6abd3d0c624c8b9b022285fecd2c58b9783c0194055eb973d3450933303b72c78462b725238243d2191fd2534c3e1f906785f268bd172661a49be7018f300d5a
7
- data.tar.gz: 05e2ceddb7183f239accddbb279c3f50f06cc598f8635a64aecff6fe889a7cb7e77bc27bcca468b5f210d2f991fadb6a0c90e922a3232773f475cf561ed32e31
6
+ metadata.gz: 6df863135ca65cc7c494029d0a706042f4fe1009ef66d02d2132f5408b5fb7b1e63beb676e891c134a8c8025715b9a79f4d150c3bc71feb62bae5f7eab074036
7
+ data.tar.gz: b9ee4171e030a1d3d45fdbb3b12bc21e86ee90c46ce757a511dae335ce517a39e83e05b888660be601c59925760707683fd1fe5f732a37ccac3aa6fe5c1914f5
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  Taffy
2
2
  =====
3
- Taffy is a command-line interface for reading and writing audio (and
4
- video) metadata, as supported by [TagLib](http://taglib.github.io/).
5
- That means it can edit tags for MP3, Ogg Vorbis, FLAC, WAV, and MP4
6
- files, along with a few other file formats I've never used.
3
+ Taffy is a command-line tool for reading and writing audio metadata, as
4
+ supported by [TagLib](http://taglib.github.io/). That means it can edit
5
+ tags for MP3, Ogg Vorbis, FLAC, WAV, and MP4 files, along with a few
6
+ other file formats I've never used.
7
7
 
8
8
  Installation
9
9
  ------------
@@ -11,44 +11,53 @@ Installation
11
11
 
12
12
  Usage
13
13
  -----
14
- Usage: taffy [options] file ...
15
-
16
- Tag options:
17
- -l, --album=ALBUM Set album tag
18
- -r, --artist=ARTIST Set artist tag
19
- -c, --comment=COMMENT Set comment tag
20
- -g, --genre=GENRE Set genre tag
21
- -t, --title=TITLE Set title tag
22
- -n, --track=TRACK Set track tag
23
- -y, --year=YEAR Set year tag
24
- --no-album Clear album tag
25
- --no-artist Clear artist tag
26
- --no-comment Clear comment tag
27
- --no-genre Clear genre tag
28
- --no-title Clear title tag
29
- --no-track Clear track tag
30
- --no-year Clear year tag
31
- --clear Clear all tags
32
-
33
- If no tag options are given, file tags are printed instead.
34
-
35
- Other options:
36
- -h, --help Show this message
37
- --version Show version
14
+ Usage: taffy [options] file ...
15
+
16
+ Tag options:
17
+ -l, --album ALBUM Set album tag
18
+ -r, --artist ARTIST Set artist tag
19
+ -c, --comment COMMENT Set comment tag
20
+ -g, --genre GENRE Set genre tag
21
+ -t, --title TITLE Set title tag
22
+ -n, --track TRACK Set track tag
23
+ -y, --year YEAR Set year tag
24
+ --no-album Clear album tag
25
+ --no-artist Clear artist tag
26
+ --no-comment Clear comment tag
27
+ --no-genre Clear genre tag
28
+ --no-title Clear title tag
29
+ --no-track Clear track tag
30
+ --no-year Clear year tag
31
+ --clear Clear all tags
32
+
33
+ Filename options:
34
+ --rename SPEC Rename file based on tags
35
+
36
+ If no options are given, file tags are printed instead.
37
+
38
+ In a filename spec, a sequence such as %R or %r stands for
39
+ the corresponding tag, in this case the artist name. %R
40
+ leaves letter case intact, while %r downcases the tag. A
41
+ sequence such as %_t maps special characters in the tag
42
+ to the given substitute, in this case an underscore.
43
+
44
+ Other options:
45
+ -h, --help Show this message and exit
46
+ --version Show version and exit
38
47
 
39
48
  Examples
40
49
  --------
41
- Tag an audio file with a title:
42
-
43
- taffy -t "Queen of the Mole People" song.mp3
50
+ Print tags from an audio file:
51
+
52
+ taffy song.mp3
44
53
 
45
54
  Tag a series of files with an artist, album, and year:
46
55
 
47
56
  taffy -r Deerhoof -l "The Man, The King, The Girl" -y 1997 *.mp3
48
57
 
49
- Clear tags from a file:
50
-
51
- taffy --clear song.mp3
58
+ Tag an audio file, then rename it to "14 - Queen of the Mole People.mp3":
59
+
60
+ taffy -n 14 -t "Queen of the Mole People" --rename "%n - %T" song.mp3
52
61
 
53
62
  Etymology
54
63
  ---------
data/bin/taffy CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'optparse'
4
+ require 'shellwords'
5
+
4
6
  require 'taglib'
5
7
 
6
- VERSION = [1, 0, 0]
8
+ VERSION = [1, 1, 1]
7
9
 
8
10
  FIELDS = [
9
11
  ['l', 'album', String],
@@ -16,6 +18,7 @@ FIELDS = [
16
18
  ]
17
19
 
18
20
  actions = []
21
+ rename_spec = nil
19
22
  status = 0
20
23
 
21
24
  options = OptionParser.new do |opts|
@@ -26,19 +29,17 @@ options = OptionParser.new do |opts|
26
29
 
27
30
  FIELDS.each do |f|
28
31
  short = "-#{f[0]}#{f[1].upcase}"
29
- long = "--#{f[1]}=#{f[1].upcase}"
32
+ long = "--#{f[1]} #{f[1].upcase}"
30
33
  opts.on(short, long, f[2], "Set #{f[1]} tag") do |x|
31
34
  actions << ->(r) { r.send("#{f[1]}=", x) }
32
35
  end
33
36
  end
34
-
35
37
  FIELDS.each do |f|
36
38
  long = "--no-#{f[1]}"
37
39
  opts.on(long, "Clear #{f[1]} tag") do
38
40
  actions << ->(r) { r.send("#{f[1]}=", f[2] == String ? nil : 0) }
39
41
  end
40
42
  end
41
-
42
43
  opts.on("--clear", "Clear all tags") do
43
44
  FIELDS.each do |f|
44
45
  actions << ->(r) { r.send("#{f[1]}=", f[2] == String ? nil : 0) }
@@ -46,17 +47,30 @@ options = OptionParser.new do |opts|
46
47
  end
47
48
 
48
49
  opts.separator ""
49
- opts.separator "If no tag options are given, file tags are printed instead."
50
+ opts.separator "Filename options:"
51
+
52
+ opts.on("--rename SPEC", String, "Rename file based on tags") do |spec|
53
+ rename_spec = spec
54
+ end
55
+
56
+ opts.separator ""
57
+ opts.separator "If no options are given, file tags are printed instead."
58
+ opts.separator ""
59
+ opts.separator "In a filename spec, a sequence such as %R or %r stands for"
60
+ opts.separator "the corresponding tag, in this case the artist name. %R"
61
+ opts.separator "leaves letter case intact, while %r downcases the tag. A"
62
+ opts.separator "sequence such as %_t maps special characters in the tag"
63
+ opts.separator "to the given substitute, in this case an underscore."
50
64
  opts.separator ""
51
65
  opts.separator "Other options:"
52
66
 
53
- opts.on_tail("-h", "--help", "Show this message") do
67
+ opts.on_tail("-h", "--help", "Show this message and exit") do
54
68
  puts opts
55
69
  exit
56
70
  end
57
71
 
58
- opts.on_tail("--version", "Show version") do
59
- puts VERSION.join('.')
72
+ opts.on_tail("--version", "Show version and exit") do
73
+ puts "taffy #{VERSION.join('.')}"
60
74
  exit
61
75
  end
62
76
  end
@@ -84,6 +98,19 @@ def print_info(filename, tag)
84
98
  puts
85
99
  end
86
100
 
101
+ def rename(tag, spec)
102
+ FIELDS.each do |f|
103
+ tag_string = tag.send(f[1]).to_s
104
+ tag_string = tag_string.rjust(2, '0') if f[1] == 'track'
105
+ spec.gsub!(/%(\W|_)?(#{f[0]}|#{f[0].upcase})/) do |match|
106
+ sub = $2 == f[0] ? tag_string.downcase : tag_string
107
+ match.size == 3 ? sub.shellescape.gsub(/\\./, $1) : sub
108
+ end
109
+ end
110
+
111
+ spec
112
+ end
113
+
87
114
  ARGV.each do |filename|
88
115
  TagLib::FileRef.open(filename) do |fileref|
89
116
  if fileref.null?
@@ -92,12 +119,17 @@ ARGV.each do |filename|
92
119
  next
93
120
  end
94
121
 
95
- if actions.empty?
122
+ if actions.empty? and !rename_spec
96
123
  print_info(filename, fileref.tag)
97
124
  else
98
125
  actions.each { |action| action.call(fileref.tag) }
99
126
  fileref.save
100
127
  end
128
+
129
+ if rename_spec
130
+ name = rename(fileref.tag, rename_spec) + File.extname(filename)
131
+ File.rename(filename, File.join(File.dirname(filename), name))
132
+ end
101
133
  end
102
134
  end
103
135
 
data/taffy.gemspec CHANGED
@@ -1,9 +1,9 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'taffy'
3
- s.version = '1.0.0'
4
- s.date = '2015-04-26'
5
- s.summary = 'command-line media tagging interface'
6
- s.description = "A command-line interface for reading and writing audio \
3
+ s.version = '1.1.1'
4
+ s.date = '2015-04-27'
5
+ s.summary = 'A command-line audio tagging tool'
6
+ s.description = "A command-line tool for reading and writing audio \
7
7
  metadata.".squeeze(' ')
8
8
  s.authors = ['Brandon Mulcahy']
9
9
  s.email = 'brandon@jangler.info'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: taffy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Mulcahy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-26 00:00:00.000000000 Z
11
+ date: 2015-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: taglib-ruby
@@ -30,7 +30,7 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 0.7.0
33
- description: A command-line interface for reading and writing audio metadata.
33
+ description: A command-line tool for reading and writing audio metadata.
34
34
  email: brandon@jangler.info
35
35
  executables:
36
36
  - taffy
@@ -64,5 +64,5 @@ rubyforge_project:
64
64
  rubygems_version: 2.4.5
65
65
  signing_key:
66
66
  specification_version: 4
67
- summary: command-line media tagging interface
67
+ summary: A command-line audio tagging tool
68
68
  test_files: []