tagomatic 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
@@ -19,13 +19,17 @@ module Tagomatic
19
19
  tag = tag_and_tail[0, 1]
20
20
  tail = tag_and_tail[1..-1]
21
21
  tag_mapping << tag
22
- regexp << FORMAT_REGEXP_ALBUM if tag == FORMAT_ID_ALBUM
23
22
  regexp << FORMAT_REGEXP_ARTIST if tag == FORMAT_ID_ARTIST
23
+ regexp << FORMAT_REGEXP_ARTIST_AGAIN if tag == FORMAT_ID_ARTIST_AGAIN
24
+ regexp << FORMAT_REGEXP_ALBUM if tag == FORMAT_ID_ALBUM
25
+ regexp << FORMAT_REGEXP_ALBUM_AGAIN if tag == FORMAT_ID_ALBUM_AGAIN
24
26
  regexp << FORMAT_REGEXP_DISC if tag == FORMAT_ID_DISC
25
27
  regexp << FORMAT_REGEXP_GENRE if tag == FORMAT_ID_GENRE
26
28
  regexp << FORMAT_REGEXP_IGNORE if tag == FORMAT_ID_IGNORE
27
- regexp << FORMAT_REGEXP_TITLE if tag == FORMAT_ID_TITLE
28
29
  regexp << FORMAT_REGEXP_TRACKNUM if tag == FORMAT_ID_TRACKNUM
30
+ regexp << FORMAT_REGEXP_TITLE if tag == FORMAT_ID_TITLE
31
+ regexp << FORMAT_REGEXP_WHITESPACE if tag == FORMAT_ID_WHITESPACE
32
+ regexp << FORMAT_REGEXP_EXTENDED_WHITESPACE if tag == FORMAT_ID_EXTENDED_WHITESPACE
29
33
  regexp << FORMAT_REGEXP_YEAR if tag == FORMAT_ID_YEAR
30
34
  regexp << Regexp.escape(tail)
31
35
  end
@@ -1,7 +1,11 @@
1
+ require 'tagomatic/tags'
2
+
1
3
  module Tagomatic
2
4
 
3
5
  class FormatMatcher
4
6
 
7
+ include Tagomatic::Tags
8
+
5
9
  def initialize(compiled_regexp, tag_mapping, original_format)
6
10
  @regexp = compiled_regexp
7
11
  @mapping = tag_mapping
@@ -12,13 +16,14 @@ module Tagomatic
12
16
  matchdata = @regexp.match(file_path)
13
17
  return nil unless matchdata
14
18
  return nil unless matchdata.captures.size == @mapping.size
15
- tags = {}
19
+ @tags = {}
16
20
  0.upto(@mapping.size) do |index|
17
21
  value = matchdata.captures[index]
18
22
  value = normalize(value) if value
19
- tags[@mapping[index]] = value
23
+ @tags[@mapping[index]] = value
20
24
  end
21
- tags
25
+ return nil unless valid_constraints?
26
+ @tags
22
27
  end
23
28
 
24
29
  def to_s
@@ -34,6 +39,17 @@ module Tagomatic
34
39
  capitalized.join(' ')
35
40
  end
36
41
 
42
+ def valid_constraints?
43
+ valid_double_match_with_same_value?(FORMAT_ID_ARTIST, FORMAT_ID_ARTIST_AGAIN) &&
44
+ valid_double_match_with_same_value?(FORMAT_ID_ALBUM, FORMAT_ID_ALBUM_AGAIN)
45
+ end
46
+
47
+ def valid_double_match_with_same_value?(base_tag, again_tag)
48
+ return true unless @tags.has_key?(again_tag)
49
+ return false unless @tags.has_key?(base_tag)
50
+ return @tags[base_tag] == @tags[again_tag]
51
+ end
52
+
37
53
  end
38
54
 
39
55
  end
@@ -24,7 +24,7 @@ module Tagomatic
24
24
  OptionParser.new do |opts|
25
25
  opts.banner = "Usage: #{$0} [options..] files.."
26
26
 
27
- opts.separator ""
27
+ opts.separator " "
28
28
  opts.separator "Specific options:"
29
29
 
30
30
  opts.on("-b", "--album [ALBUM]", "Set this album name.") do |album|
@@ -49,47 +49,57 @@ module Tagomatic
49
49
  @options[:year] = year
50
50
  end
51
51
 
52
+ opts.separator " "
53
+ opts.separator "Primary options:"
54
+
52
55
  opts.on("-f", "--format [FORMAT]", "Try applying this format string to determine tags. Multiple occurrences allowed.") do |format|
53
- @options[:formats] << format
56
+ @options[:formats] << format.gsub('|', '/')
54
57
  end
55
58
 
59
+ opts.separator " "
60
+
56
61
  opts.on("-c", "--[no-]cleantags", "Clean up tags by removing artist and album from title for example.") do |cleantags|
57
62
  @options[:cleantags]= cleantags
58
63
  end
59
- opts.on("-k", "--[no-]cleartags", "Clear any existing v1 and v2 tags.") do |cleartags|
64
+ opts.on("-k", "--[no-]cleartags", "Clear any existing v1 and v2 tags. This is an expensive and destructive operation.") do |cleartags|
60
65
  @options[:cleartags]= cleartags
61
66
  end
62
67
  opts.on("-e", "--[no-]errorstops", "Stop execution if an error occurs.") do |errorstops|
63
68
  @options[:errorstops]= errorstops
64
69
  end
65
- opts.on("-s", "--[no-]guess", "Use format guessing. Can be combined with --format.") do |guess|
70
+ opts.on("-s", "--[no-]guess", "Use format guessing. Used only if no --format matched.") do |guess|
66
71
  @options[:guess] = guess
67
72
  end
68
- opts.on("-l", "--[no-]list", "List available formats for guessing.") do |list|
69
- @options[:list] = list
70
- end
71
73
  opts.on("-r", "--[no-]recurse", "Scan for files recursively.") do |recurse|
72
74
  @options[:recurse] = recurse
73
75
  end
74
- opts.on("-w", "--[no-]showtags", "Show the resulting tags.") do |showtags|
75
- @options[:showtags] = showtags
76
- end
77
76
  opts.on("-u", "--[no-]underscores", "Replace underscores with spaces before processing a file name.") do |underscores|
78
77
  @options[:underscores] = underscores
79
78
  end
79
+ opts.on("-v", "--[no-]verbose", "Print verbose messages about processing operations.") do |verbose|
80
+ @options[:verbose] = verbose
81
+ end
82
+ opts.on("-w", "--[no-]showtags", "Show the resulting tags.") do |showtags|
83
+ @options[:showtags] = showtags
84
+ end
80
85
 
81
- opts.separator ""
82
- opts.separator "Common options:"
86
+ opts.separator " "
87
+ opts.separator "Informational options:"
83
88
 
84
- opts.on("-v", "--[no-]verbose", "Run verbosely.") do |verbose|
85
- @options[:verbose] = verbose
89
+ opts.on("--help-formats", "Show help on writing --format strings.") do
90
+ puts File.read(File.join(File.dirname($0), '..', 'lib/tagomatic/tags.rb'))
91
+ exit
86
92
  end
87
- opts.on_tail("-h", "--help", "Show this message") do
88
- puts opts
93
+ opts.on("--list-formats", "List built-in formats used for guessing with --guess option.") do |list|
94
+ @options[:list] = list
95
+ end
96
+ opts.on("--version", "Show version information.") do |version|
97
+ puts File.read(File.join(File.dirname($0), '..', 'VERSION'))
89
98
  exit
90
99
  end
91
- opts.on_tail("--help-format", "Show help on writing --format strings") do
92
- puts File.read(File.join(File.dirname($0), '..', 'lib/tagomatic/tags.rb'))
100
+
101
+ opts.on_tail("--help", "Show this message") do
102
+ puts opts
93
103
  exit
94
104
  end
95
105
  end
@@ -16,7 +16,7 @@ module Tagomatic
16
16
  @file_path = path_prefix.nil? ? file_or_folder : File.join(path_prefix, file_or_folder)
17
17
  @logger.verbose "processing #{@file_path}"
18
18
  if is_taggable_file?
19
- yield @file_path
19
+ yield File.expand_path(@file_path)
20
20
  elsif is_scannable?
21
21
  enter_scannable_folder(&block)
22
22
  end
@@ -17,21 +17,29 @@ module Tagomatic
17
17
  # --format "%g/%a/%b - encoded by noone - %y/%n - %t.mp3"
18
18
 
19
19
  FORMAT_ID_ARTIST = 'a'
20
+ FORMAT_ID_ARTIST_AGAIN = 'A'
20
21
  FORMAT_ID_ALBUM = 'b'
22
+ FORMAT_ID_ALBUM_AGAIN = 'B'
21
23
  FORMAT_ID_DISC = 'd'
22
24
  FORMAT_ID_GENRE = 'g'
23
25
  FORMAT_ID_IGNORE = 'i'
24
- FORMAT_ID_TITLE = 't'
25
26
  FORMAT_ID_TRACKNUM = 'n'
27
+ FORMAT_ID_TITLE = 't'
28
+ FORMAT_ID_WHITESPACE = 's'
29
+ FORMAT_ID_EXTENDED_WHITESPACE = 'S'
26
30
  FORMAT_ID_YEAR = 'y'
27
31
 
28
32
  FORMAT_REGEXP_ARTIST = '([^\/]+)'
33
+ FORMAT_REGEXP_ARTIST_AGAIN = FORMAT_REGEXP_ARTIST
29
34
  FORMAT_REGEXP_ALBUM = '([^\/]+)'
35
+ FORMAT_REGEXP_ALBUM_AGAIN = FORMAT_REGEXP_ALBUM
30
36
  FORMAT_REGEXP_DISC = '\s*([0-9]+)\s*'
31
37
  FORMAT_REGEXP_GENRE = '([^\/]+)'
32
38
  FORMAT_REGEXP_IGNORE = '([^\/]+)'
33
- FORMAT_REGEXP_TITLE = '([^\/]+)'
34
39
  FORMAT_REGEXP_TRACKNUM = '\s*([0-9]+)\s*'
40
+ FORMAT_REGEXP_TITLE = '([^\/]+)'
41
+ FORMAT_REGEXP_WHITESPACE = '\s*'
42
+ FORMAT_REGEXP_EXTENDED_WHITESPACE = '[\s\-_\.]*'
35
43
  FORMAT_REGEXP_YEAR = '\s*([0-9]+)\s*'
36
44
 
37
45
  end
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.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Lukic