taffy 1.1.2 → 1.2.0

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 -35
  3. data/bin/taffy +50 -12
  4. data/taffy.gemspec +2 -2
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 80726aa3548445e7ab5b0dd1e765c138c585e470
4
- data.tar.gz: cfc8492d9a14ee9210f60ef79284bb1c50d68d1f
3
+ metadata.gz: 7b285af0466eca45d0e54a7b679e98603a260e13
4
+ data.tar.gz: c04e0465d601f3f6e077cc4cceffded7817ac745
5
5
  SHA512:
6
- metadata.gz: e9a942aac1363f7364ce1b37c77718550462b462a62f4ae2f7215dac98e1216b9bbd023b0e14a93a8ebedabf25c95234ea0ceab71fdb9e289165049ff0d14576
7
- data.tar.gz: bad018502a26c83940ac46070d3a67646cd73a78d60b54ed1a68bfc622eda1000f1795fb5f0915f2e3107eafe5a7de2464cde94c9c045aac730117dfe25f6384
6
+ metadata.gz: 660e523484ccd5d24db1adb78da2876379b55e9b9e82d2db11d29b4d874d87c031cb7267ed71c7ef6e2fe903e7c2a47832f8d6eca3f60b7a3ff05ce7f4c5aeb2
7
+ data.tar.gz: debe7f81f2e4235f33b0f345be2bf2228ab94530f42f80ae5952fb077461d43a91a7f259548db58e0ec5d100038d3090b70a61c9767a8678b8f360a8c14419a8
data/README.md CHANGED
@@ -2,48 +2,56 @@ Taffy
2
2
  =====
3
3
  Taffy is a command-line tool for reading and writing audio metadata, as
4
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.
5
+ tags for MP3, Ogg Vorbis, FLAC, WAV, and MP4 files, along with several
6
+ other file formats.
7
7
 
8
8
  Installation
9
9
  ------------
10
+ If installing via `gem`, you must have already installed your
11
+ distribution's TagLib package, usually called `taglib`, `taglib-devel`,
12
+ or `libtag1-dev`. Then run:
13
+
10
14
  gem install taffy
11
15
 
16
+ If you use Arch Linux or a derivative, you may also install via the [AUR
17
+ package](https://aur.archlinux.org/packages/taffy/).
18
+
12
19
  Usage
13
20
  -----
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
21
+ Usage: taffy [options] file ...
22
+
23
+ Tag options:
24
+ -l, --album ALBUM Set album tag
25
+ -r, --artist ARTIST Set artist tag
26
+ -c, --comment COMMENT Set comment tag
27
+ -g, --genre GENRE Set genre tag
28
+ -t, --title TITLE Set title tag
29
+ -n, --track TRACK Set track tag
30
+ -y, --year YEAR Set year tag
31
+ --no-album Clear album tag
32
+ --no-artist Clear artist tag
33
+ --no-comment Clear comment tag
34
+ --no-genre Clear genre tag
35
+ --no-title Clear title tag
36
+ --no-track Clear track tag
37
+ --no-year Clear year tag
38
+ --clear Clear all tags
39
+
40
+ Filename options:
41
+ --extract SPEC Extract tags from filename
42
+ --rename SPEC Rename file based on tags
43
+
44
+ If no options are given, file tags are printed instead.
45
+
46
+ In a filename spec, a sequence such as %R or %r stands for
47
+ the corresponding tag, in this case the artist name. In a
48
+ filename, %R leaves letter case intact, while %r downcases
49
+ the tag. A sequence such as %_t maps special characters in
50
+ the tag to the given substitute, in this case an underscore.
51
+
52
+ Other options:
53
+ -h, --help Show this message and exit
54
+ --version Show version and exit
47
55
 
48
56
  Examples
49
57
  --------
data/bin/taffy CHANGED
@@ -5,7 +5,7 @@ require 'shellwords'
5
5
 
6
6
  require 'taglib'
7
7
 
8
- VERSION = [1, 1, 2]
8
+ VERSION = [1, 2, 0]
9
9
 
10
10
  FIELDS = [
11
11
  ['l', 'album', String],
@@ -18,8 +18,8 @@ FIELDS = [
18
18
  ]
19
19
 
20
20
  actions = []
21
- rename_spec = nil
22
- status = 0
21
+ extract_spec = rename_spec = nil
22
+ $status = 0
23
23
 
24
24
  options = OptionParser.new do |opts|
25
25
  opts.banner += " file ..."
@@ -49,6 +49,9 @@ options = OptionParser.new do |opts|
49
49
  opts.separator ""
50
50
  opts.separator "Filename options:"
51
51
 
52
+ opts.on("--extract SPEC", String, "Extract tags from filename") do |spec|
53
+ extract_spec = spec
54
+ end
52
55
  opts.on("--rename SPEC", String, "Rename file based on tags") do |spec|
53
56
  rename_spec = spec
54
57
  end
@@ -57,10 +60,10 @@ options = OptionParser.new do |opts|
57
60
  opts.separator "If no options are given, file tags are printed instead."
58
61
  opts.separator ""
59
62
  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."
63
+ opts.separator "the corresponding tag, in this case the artist name. In a"
64
+ opts.separator "filename, %R leaves letter case intact, while %r downcases"
65
+ opts.separator "the tag. A sequence such as %_t maps special characters in"
66
+ opts.separator "the tag to the given substitute, in this case an underscore."
64
67
  opts.separator ""
65
68
  opts.separator "Other options:"
66
69
 
@@ -98,6 +101,30 @@ def print_info(filename, tag)
98
101
  puts
99
102
  end
100
103
 
104
+ def extract(tag, spec, filename)
105
+ name = File.basename(filename)
106
+ name = name.slice(0, name.size - File.extname(name).size)
107
+ regexp = Regexp.new(spec.gsub(/%(\W|_)?([lrcgt])/, '(.+)').
108
+ gsub(/%(\W|_)?([ny])/, '(\d+)'))
109
+ if filematch = regexp.match(name)
110
+ i = 1
111
+ loop do
112
+ specmatch = /%(?:\W|_)?([lrcgtny])/.match(spec)
113
+ break unless specmatch
114
+ FIELDS.each do |f|
115
+ next if f[0] != specmatch[1]
116
+ val = 'ny'.include?(f[0]) ? filematch[i].to_i : filematch[i]
117
+ tag.send("#{f[1]}=", val)
118
+ end
119
+ spec = specmatch.post_match
120
+ i += 1
121
+ end
122
+ else
123
+ warn("#{filename} did not match extraction spec")
124
+ $status = 2
125
+ end
126
+ end
127
+
101
128
  def rename(tag, spec)
102
129
  spec = spec.dup
103
130
 
@@ -117,22 +144,33 @@ ARGV.each do |filename|
117
144
  TagLib::FileRef.open(filename) do |fileref|
118
145
  if fileref.null?
119
146
  warn("Could not open file: #{filename}")
120
- status = 2
147
+ $status = 2
121
148
  next
122
149
  end
123
150
 
124
- if actions.empty? and !rename_spec
151
+ if extract_spec
152
+ extract(fileref.tag, extract_spec, filename)
153
+ fileref.save
154
+ end
155
+
156
+ if actions.empty? and !(extract_spec or rename_spec)
125
157
  print_info(filename, fileref.tag)
126
- else
158
+ elsif !actions.empty?
127
159
  actions.each { |action| action.call(fileref.tag) }
128
160
  fileref.save
129
161
  end
130
162
 
131
163
  if rename_spec
132
164
  name = rename(fileref.tag, rename_spec) + File.extname(filename)
133
- File.rename(filename, File.join(File.dirname(filename), name))
165
+ path = File.join(File.dirname(filename), name)
166
+ if File.exist?(path)
167
+ warn("Cannot rename; file exists: #{name}")
168
+ $status = 2
169
+ else
170
+ File.rename(filename, path)
171
+ end
134
172
  end
135
173
  end
136
174
  end
137
175
 
138
- exit(status)
176
+ exit($status)
data/taffy.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'taffy'
3
- s.version = '1.1.2'
4
- s.date = '2015-04-27'
3
+ s.version = '1.2.0'
4
+ s.date = '2015-04-29'
5
5
  s.summary = 'A command-line audio tagging tool'
6
6
  s.description = "A command-line tool for reading and writing audio \
7
7
  metadata.".squeeze(' ')
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.1.2
4
+ version: 1.2.0
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-27 00:00:00.000000000 Z
11
+ date: 2015-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: taglib-ruby