tagomatic 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,8 @@
1
1
  <component name="InspectionProjectProfileManager">
2
2
  <settings>
3
3
  <option name="PROJECT_PROFILE" value="Project Default" />
4
- <option name="USE_PROJECT_PROFILE" value="false" />
5
- <version value="1.0" />
4
+ <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
5
+ <scopes />
6
+ <list size="0" />
6
7
  </settings>
7
8
  </component>
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'mp3info'
3
+ require 'mp3info/id3v2'
4
+
5
+ class ID3v2
6
+
7
+ alias :original_decode_tag :decode_tag
8
+
9
+ def decode_tag(name, raw_value)
10
+ original_decode_tag name, raw_value
11
+ rescue
12
+ nil
13
+ end
14
+
15
+ end
@@ -4,12 +4,12 @@ module Tagomatic
4
4
 
5
5
  FORMAT_REGEXP_ARTIST = '([^\/]+)'
6
6
  FORMAT_REGEXP_ALBUM = '([^\/]+)'
7
- FORMAT_REGEXP_DISC = '([0-9]+)'
7
+ FORMAT_REGEXP_DISC = '\s*([0-9]+)\s*'
8
8
  FORMAT_REGEXP_GENRE = '([^\/]+)'
9
9
  FORMAT_REGEXP_IGNORE = '([^\/]+)'
10
10
  FORMAT_REGEXP_TITLE = '([^\/]+)'
11
- FORMAT_REGEXP_TRACKNUM = '([0-9]+)'
12
- FORMAT_REGEXP_YEAR = '([0-9]+)'
11
+ FORMAT_REGEXP_TRACKNUM = '\s*([0-9]+)\s*'
12
+ FORMAT_REGEXP_YEAR = '\s*([0-9]+)\s*'
13
13
 
14
14
  def initialize(format_matcher_factory)
15
15
  @format_matcher_factory = format_matcher_factory
@@ -15,12 +15,7 @@ module Tagomatic
15
15
  tags = {}
16
16
  0.upto(@mapping.size) do |index|
17
17
  value = matchdata.captures[index]
18
- if value
19
- value = value.gsub('_', ' ')
20
- parts = value.split(' ')
21
- capitalized = parts.map {|p| p.capitalize}
22
- value = capitalized.join(' ')
23
- end
18
+ value = normalize(value) if value
24
19
  tags[@mapping[index]] = value
25
20
  end
26
21
  tags
@@ -30,6 +25,15 @@ module Tagomatic
30
25
  @format
31
26
  end
32
27
 
28
+ protected
29
+
30
+ def normalize(value)
31
+ value = value.gsub('_', ' ')
32
+ parts = value.split(' ')
33
+ capitalized = parts.map {|p| p.capitalize}
34
+ capitalized.join(' ')
35
+ end
36
+
33
37
  end
34
38
 
35
39
  end
@@ -46,11 +46,12 @@ module Tagomatic
46
46
  protected
47
47
 
48
48
  def update(tag, value)
49
+ value.strip if value.respond_to?(:strip)
49
50
  @updates[tag] = value
50
51
  end
51
52
 
52
53
  def read(tag)
53
- @info.tag2.send(tag)
54
+ @info.tag.send(tag)
54
55
  end
55
56
 
56
57
  def write(tag, value)
@@ -8,7 +8,12 @@ module Tagomatic
8
8
 
9
9
  def error(message, optional_exception = nil)
10
10
  puts "ERROR: #{message}"
11
- $stderr.puts optional_exception.backtrace if optional_exception
11
+ exception optional_exception if optional_exception
12
+ end
13
+
14
+ def exception(exception)
15
+ $stderr.puts exception.to_s
16
+ $stderr.puts exception.backtrace
12
17
  end
13
18
 
14
19
  def verbose(message)
@@ -5,6 +5,7 @@ module Tagomatic
5
5
  class Options < Hash
6
6
 
7
7
  def initialize
8
+ self[:cleantags] = false
8
9
  self[:cleartags] = false
9
10
  self[:files] = []
10
11
  self[:formats] = []
@@ -53,11 +53,14 @@ module Tagomatic
53
53
  @options[:formats] << format
54
54
  end
55
55
 
56
+ opts.on("-c", "--cleantags", "Clean up tags by removing artist and album from title for example.") do |cleantags|
57
+ @options[:cleantags]= cleantags
58
+ end
56
59
  opts.on("-k", "--cleartags", "Clear any existing v1 and v2 tags.") do |cleartags|
57
- @options[:cleartags ]= cleartags
60
+ @options[:cleartags]= cleartags
58
61
  end
59
62
  opts.on("-e", "--errorstops", "Stop execution if an error occurs.") do |errorstops|
60
- @options[:errorstops ]= errorstops
63
+ @options[:errorstops]= errorstops
61
64
  end
62
65
  opts.on("-s", "--guess", "Use format guessing. Can be combined with --format.") do |guess|
63
66
  @options[:guess] = guess
@@ -1,3 +1,6 @@
1
+ require 'fileutils'
2
+
3
+ require 'monkey/id3v2'
1
4
  require 'tagomatic/info_updater'
2
5
 
3
6
  module Tagomatic
@@ -14,24 +17,31 @@ module Tagomatic
14
17
  FORMAT_ID_YEAR = 'y'
15
18
 
16
19
  KNOWN_FORMATS = [
17
- "%g/%a/%b [%y]/%n - %t.mp3",
18
- "%g/%a/%b [%y]/%n-%t.mp3",
19
- "%g/%a/%b [%y]/%n %t.mp3",
20
-
21
- "%g/%a/%b (%y)/%n - %t.mp3",
22
- "%g/%a/%b (%y)/%n-%t.mp3",
23
- "%g/%a/%b (%y)/%n %t.mp3",
24
-
25
- "%g/%a/(%y) %b/%n - %t.mp3",
26
- "%g/%a/(%y) %b/%n %t.mp3",
27
- "%g/%a/(%y) %b/%n-%t.mp3",
28
-
29
- "%g/%a/%b/%n - %t.mp3",
30
- "%g/%a/%b/%n %t.mp3",
20
+ "%g/%a/%b/CD%d/%n-%t.mp3",
21
+ "%g/%a/%b/CD%d/%n%t.mp3",
22
+ "%g/%a/%b/CD%d/%t.mp3",
23
+ "%g/%a/%b/cd%d/%n-%t.mp3",
24
+ "%g/%a/%b/cd%d/%n%t.mp3",
25
+ "%g/%a/%b/cd%d/%t.mp3",
26
+
27
+ "%g/%a/%b[%y]/%a-%b-%n-%t.mp3",
28
+ "%g/%a/%b[%y]/%n-%t.mp3",
29
+ "%g/%a/%b[%y]/%n%t.mp3",
30
+
31
+ "%g/%a/%b(%y)/%a-%b-%n-%t.mp3",
32
+ "%g/%a/%b(%y)/%n-%t.mp3",
33
+ "%g/%a/%b(%y)/%n%t.mp3",
34
+
35
+ "%g/%a/(%y)%b/%a-%b-%n-%t.mp3",
36
+ "%g/%a/(%y)%b/%n-%t.mp3",
37
+ "%g/%a/(%y)%b/%n%t.mp3",
38
+
39
+ "%g/%a/%b/%a-%b-%n-%t.mp3",
31
40
  "%g/%a/%b/%n-%t.mp3",
41
+ "%g/%a/%b/%n%t.mp3",
32
42
 
33
- "%a - %n - %t.mp3",
34
- "%n - %a - %t.mp3",
43
+ "%g/%a/%b/%t.mp3",
44
+ "%g/%a/%b/%t.MP3",
35
45
  ]
36
46
 
37
47
  def initialize(options, compiler, mp3info, info_updater_factory, logger)
@@ -43,12 +53,13 @@ module Tagomatic
43
53
  end
44
54
 
45
55
  def process!(file_path)
46
- file_path.gsub '_', ' ' if @options[:underscores]
47
-
48
56
  @logger.verbose "tagging #{file_path}"
49
57
 
50
58
  prepare_for_current_file(file_path)
59
+ replace_underscores if @options[:underscores]
51
60
  apply_formats
61
+ clean_tags if @options[:cleantags]
62
+ normalize_tags
52
63
  apply_forced_tags
53
64
  try_updating_mp3file
54
65
  end
@@ -60,6 +71,17 @@ module Tagomatic
60
71
  @tags = nil
61
72
  end
62
73
 
74
+ def replace_underscores
75
+ folder_path = File.dirname(@file_path)
76
+ file_name = File.basename(@file_path)
77
+ clean = file_name.gsub('_', ' ')
78
+ return if clean == file_name
79
+ @logger.verbose "renaming #{file_name} to #{clean}"
80
+ FileUtils.cd folder_path
81
+ FileUtils.mv file_name, clean
82
+ @file_path = File.join(folder_path, clean)
83
+ end
84
+
63
85
  def apply_formats
64
86
  apply_custom_formats if custom_formats_available?
65
87
  apply_known_formats if no_tags_set? and guessing_allowed?
@@ -105,6 +127,33 @@ module Tagomatic
105
127
  formats.map! { |f| f.is_a?(FormatMatcher) ? f : @compiler.compile_format(f) }
106
128
  end
107
129
 
130
+ def clean_tags
131
+ artist = @tags['a']
132
+ artist = Regexp.compile("[ -]*#{Regexp.escape(artist)}[ -]*", Regexp::IGNORECASE) if artist
133
+
134
+ album = @tags['b']
135
+ album = album.sub(artist, '') if artist and album
136
+ @tags['b'] = album unless album.nil? or album.empty?
137
+
138
+ album = Regexp.compile("[ -]*#{Regexp.escape(album)}[ -]*", Regexp::IGNORECASE) if album
139
+
140
+ title = @tags['t']
141
+ title = title.sub(artist, '') if artist and title
142
+ title = title.sub(album, '') if album and title
143
+ @tags['t'] = title unless title.nil? or title.empty?
144
+ end
145
+
146
+ def normalize_tags
147
+ normalized = Hash.new
148
+ @tags.each do |tag, value|
149
+ next if value.nil?
150
+ parts = value.gsub('_', ' ').split(' ')
151
+ capitalized = parts.map {|p| p.capitalize}
152
+ normalized[tag] = capitalized.join(' ')
153
+ end
154
+ @tags = normalized
155
+ end
156
+
108
157
  def apply_forced_tags
109
158
  @tags ||= Hash.new
110
159
  @tags[:album] if @options[:album]
@@ -164,6 +213,7 @@ module Tagomatic
164
213
  end
165
214
 
166
215
  updater.apply if updater.dirty?
216
+ puts "updated #{@file_path}" if updater.dirty?
167
217
  end
168
218
 
169
219
  def show_tags
@@ -174,9 +224,9 @@ module Tagomatic
174
224
  output << '/b='
175
225
  output << ( @mp3.tag.album || '<album>' )
176
226
  output << '/y='
177
- output << ( @mp3.tag.year ? "#{@mp3.tag2.TYER}" : '<year>' )
227
+ output << ( @mp3.tag.year ? "#{@mp3.tag.year}" : '<year>' )
178
228
  output << '/n='
179
- output << ( @mp3.tag.tracknum ? "#{@mp3.tag2.TRCK}" : '<tracknum>' )
229
+ output << ( @mp3.tag.tracknum ? "#{@mp3.tag.tracknum}" : '<tracknum>' )
180
230
  output << '/t='
181
231
  output << ( @mp3.tag.title || '<title>' )
182
232
  puts output
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tagomatic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Lukic
@@ -90,6 +90,7 @@ files:
90
90
  - Rakefile
91
91
  - VERSION
92
92
  - bin/tagomatic
93
+ - lib/monkey/id3v2.rb
93
94
  - lib/monkey/string.rb
94
95
  - lib/tagomatic/format_compiler.rb
95
96
  - lib/tagomatic/format_matcher.rb
@@ -138,5 +139,5 @@ signing_key:
138
139
  specification_version: 3
139
140
  summary: Simple command-line mp3 tagger based on mp3info gem. Supports folder-specific configuration files.
140
141
  test_files:
141
- - test/test_tagomatic.rb
142
142
  - test/helper.rb
143
+ - test/test_tagomatic.rb