id3rename 1.0.2
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.
- data/README +20 -0
- data/Rakefile +239 -0
- data/bin/id3rename +101 -0
- data/id3rename.gemspec +26 -0
- metadata +57 -0
data/README
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
NAME
|
2
|
+
id3rename
|
3
|
+
|
4
|
+
SYNOPSIS
|
5
|
+
id3rename paths paths* [options]+
|
6
|
+
|
7
|
+
DESCRIPTION
|
8
|
+
id3rename is a program to do simple renaming of mp3 files
|
9
|
+
|
10
|
+
PARAMETERS
|
11
|
+
paths (-2 -> paths)
|
12
|
+
--noop, -n
|
13
|
+
do no work, simply show what would be done
|
14
|
+
--help, -h
|
15
|
+
|
16
|
+
EXAMPLES
|
17
|
+
. id3rename badly-named.mp3
|
18
|
+
. id3rename badly-named.mp3 another-badly-named.mp3
|
19
|
+
. id3rename directory/full/of/badly-named.mp3 directory/full/of/another-badly-named.mp3
|
20
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,239 @@
|
|
1
|
+
This.author = "Ara T. Howard"
|
2
|
+
This.email = "ara.t.howard@gmail.com"
|
3
|
+
This.homepage = "http://github.com/ahoward/#{ This.lib }/tree/master"
|
4
|
+
This.rubyforge_project = 'codeforpeople'
|
5
|
+
|
6
|
+
task :default do
|
7
|
+
puts(Rake::Task.tasks.map{|task| task.name} - ['default'])
|
8
|
+
end
|
9
|
+
|
10
|
+
task :spec do
|
11
|
+
require 'spec/rake/spectask'
|
12
|
+
Spec::Rake::SpecTask.new do |t|
|
13
|
+
t.spec_files = FileList['spec/*_spec.rb']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
task :gemspec do
|
18
|
+
ignore_extensions = 'git', 'svn', 'tmp', /sw./, 'bak', 'gem'
|
19
|
+
ignore_directories = 'pkg'
|
20
|
+
ignore_files = 'test/log'
|
21
|
+
|
22
|
+
shiteless =
|
23
|
+
lambda do |list|
|
24
|
+
list.delete_if do |entry|
|
25
|
+
next unless test(?e, entry)
|
26
|
+
extension = File.basename(entry).split(%r/[.]/).last
|
27
|
+
ignore_extensions.any?{|ext| ext === extension}
|
28
|
+
end
|
29
|
+
list.delete_if do |entry|
|
30
|
+
next unless test(?d, entry)
|
31
|
+
dirname = File.expand_path(entry)
|
32
|
+
ignore_directories.any?{|dir| File.expand_path(dir) == dirname}
|
33
|
+
end
|
34
|
+
list.delete_if do |entry|
|
35
|
+
next unless test(?f, entry)
|
36
|
+
filename = File.expand_path(entry)
|
37
|
+
ignore_files.any?{|file| File.expand_path(file) == filename}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
lib = This.lib
|
42
|
+
version = This.version
|
43
|
+
files = shiteless[Dir::glob("**/**")]
|
44
|
+
executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
|
45
|
+
has_rdoc = true #File.exist?('doc')
|
46
|
+
test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
|
47
|
+
|
48
|
+
extensions = This.extensions
|
49
|
+
if extensions.nil?
|
50
|
+
%w( Makefile configure extconf.rb ).each do |ext|
|
51
|
+
extensions << ext if File.exists?(ext)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
extensions = [extensions].flatten.compact
|
55
|
+
|
56
|
+
template =
|
57
|
+
if test(?e, 'gemspec.erb')
|
58
|
+
Template{ IO.read('gemspec.erb') }
|
59
|
+
else
|
60
|
+
Template {
|
61
|
+
<<-__
|
62
|
+
## #{ lib }.gemspec
|
63
|
+
#
|
64
|
+
|
65
|
+
Gem::Specification::new do |spec|
|
66
|
+
spec.name = #{ lib.inspect }
|
67
|
+
spec.version = #{ version.inspect }
|
68
|
+
spec.platform = Gem::Platform::RUBY
|
69
|
+
spec.summary = #{ lib.inspect }
|
70
|
+
|
71
|
+
spec.files = #{ files.inspect }
|
72
|
+
spec.executables = #{ executables.inspect }
|
73
|
+
|
74
|
+
spec.require_path = "lib"
|
75
|
+
|
76
|
+
spec.has_rdoc = #{ has_rdoc.inspect }
|
77
|
+
spec.test_files = #{ test_files.inspect }
|
78
|
+
#spec.add_dependency 'lib', '>= version'
|
79
|
+
#spec.add_dependency 'fattr'
|
80
|
+
|
81
|
+
spec.extensions.push(*#{ extensions.inspect })
|
82
|
+
|
83
|
+
spec.rubyforge_project = #{ This.rubyforge_project.inspect }
|
84
|
+
spec.author = #{ This.author.inspect }
|
85
|
+
spec.email = #{ This.email.inspect }
|
86
|
+
spec.homepage = #{ This.homepage.inspect }
|
87
|
+
end
|
88
|
+
__
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
open("#{ lib }.gemspec", "w"){|fd| fd.puts template}
|
93
|
+
This.gemspec = "#{ lib }.gemspec"
|
94
|
+
end
|
95
|
+
|
96
|
+
task :gem => [:clean, :gemspec] do
|
97
|
+
Fu.mkdir_p This.pkgdir
|
98
|
+
before = Dir['*.gem']
|
99
|
+
cmd = "gem build #{ This.gemspec }"
|
100
|
+
`#{ cmd }`
|
101
|
+
after = Dir['*.gem']
|
102
|
+
gem = ((after - before).first || after.first) or abort('no gem!')
|
103
|
+
Fu.mv gem, This.pkgdir
|
104
|
+
This.gem = File.basename(gem)
|
105
|
+
end
|
106
|
+
|
107
|
+
task :readme do
|
108
|
+
samples = ''
|
109
|
+
prompt = '~ > '
|
110
|
+
lib = This.lib
|
111
|
+
version = This.version
|
112
|
+
|
113
|
+
Dir['sample*/*'].sort.each do |sample|
|
114
|
+
samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
|
115
|
+
|
116
|
+
cmd = "cat #{ sample }"
|
117
|
+
samples << Util.indent(prompt + cmd, 2) << "\n\n"
|
118
|
+
samples << Util.indent(`#{ cmd }`, 4) << "\n"
|
119
|
+
|
120
|
+
cmd = "ruby #{ sample }"
|
121
|
+
samples << Util.indent(prompt + cmd, 2) << "\n\n"
|
122
|
+
|
123
|
+
cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -Ilib #{ sample })'"
|
124
|
+
samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
|
125
|
+
end
|
126
|
+
|
127
|
+
template =
|
128
|
+
if test(?e, 'readme.erb')
|
129
|
+
Template{ IO.read('readme.erb') }
|
130
|
+
else
|
131
|
+
Template {
|
132
|
+
<<-__
|
133
|
+
NAME
|
134
|
+
#{ lib }
|
135
|
+
|
136
|
+
DESCRIPTION
|
137
|
+
|
138
|
+
INSTALL
|
139
|
+
gem install #{ lib }
|
140
|
+
|
141
|
+
SAMPLES
|
142
|
+
#{ samples }
|
143
|
+
__
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
open("README", "w"){|fd| fd.puts template}
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
task :clean do
|
152
|
+
Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
|
153
|
+
end
|
154
|
+
|
155
|
+
|
156
|
+
task :release => [:clean, :gemspec, :gem] do
|
157
|
+
gems = Dir[File.join(This.pkgdir, '*.gem')].flatten
|
158
|
+
raise "which one? : #{ gems.inspect }" if gems.size > 1
|
159
|
+
raise "no gems?" if gems.size < 1
|
160
|
+
cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.pkgdir }/#{ This.gem }"
|
161
|
+
puts cmd
|
162
|
+
system cmd
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
BEGIN {
|
170
|
+
$VERBOSE = nil
|
171
|
+
|
172
|
+
require 'ostruct'
|
173
|
+
require 'erb'
|
174
|
+
require 'fileutils'
|
175
|
+
|
176
|
+
Fu = FileUtils
|
177
|
+
|
178
|
+
This = OpenStruct.new
|
179
|
+
|
180
|
+
This.file = File.expand_path(__FILE__)
|
181
|
+
This.dir = File.dirname(This.file)
|
182
|
+
This.pkgdir = File.join(This.dir, 'pkg')
|
183
|
+
|
184
|
+
lib = ENV['LIB']
|
185
|
+
unless lib
|
186
|
+
lib = File.basename(Dir.pwd)
|
187
|
+
end
|
188
|
+
This.lib = lib
|
189
|
+
|
190
|
+
version = ENV['VERSION']
|
191
|
+
unless version
|
192
|
+
name = lib.capitalize
|
193
|
+
library = "./lib/#{ lib }"
|
194
|
+
program = "./bin/#{ lib }"
|
195
|
+
if test(?e, library)
|
196
|
+
require library
|
197
|
+
version = eval(name).send(:version)
|
198
|
+
elsif test(?e, program)
|
199
|
+
version = `#{ program } --version`.strip
|
200
|
+
end
|
201
|
+
abort('no version') if(version.nil? or version.empty?)
|
202
|
+
end
|
203
|
+
This.version = version
|
204
|
+
|
205
|
+
abort('no lib') unless This.lib
|
206
|
+
abort('no version') unless This.version
|
207
|
+
|
208
|
+
module Util
|
209
|
+
def indent(s, n = 2)
|
210
|
+
s = unindent(s)
|
211
|
+
ws = ' ' * n
|
212
|
+
s.gsub(%r/^/, ws)
|
213
|
+
end
|
214
|
+
|
215
|
+
def unindent(s)
|
216
|
+
indent = nil
|
217
|
+
s.each do |line|
|
218
|
+
next if line =~ %r/^\s*$/
|
219
|
+
indent = line[%r/^\s*/] and break
|
220
|
+
end
|
221
|
+
indent ? s.gsub(%r/^#{ indent }/, "") : s
|
222
|
+
end
|
223
|
+
extend self
|
224
|
+
end
|
225
|
+
|
226
|
+
class Template
|
227
|
+
def initialize(&block)
|
228
|
+
@block = block
|
229
|
+
@template = block.call.to_s
|
230
|
+
end
|
231
|
+
def expand(b=nil)
|
232
|
+
ERB.new(Util.unindent(@template)).result(b||@block)
|
233
|
+
end
|
234
|
+
alias_method 'to_s', 'expand'
|
235
|
+
end
|
236
|
+
def Template(*args, &block) Template.new(*args, &block) end
|
237
|
+
|
238
|
+
Dir.chdir(This.dir)
|
239
|
+
}
|
data/bin/id3rename
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'main' # sudo gem install main
|
7
|
+
require 'mp3info' # sudo gem install ruby-mp3info
|
8
|
+
|
9
|
+
Main {
|
10
|
+
Version = '1.0.2'
|
11
|
+
|
12
|
+
description <<-__
|
13
|
+
id3rename is a program to do simple renaming of mp3 files
|
14
|
+
__
|
15
|
+
|
16
|
+
examples <<-__
|
17
|
+
. id3rename badly-named.mp3
|
18
|
+
. id3rename badly-named.mp3 another-badly-named.mp3
|
19
|
+
. id3rename directory/full/of/badly-named.mp3 directory/full/of/another-badly-named.mp3
|
20
|
+
__
|
21
|
+
|
22
|
+
argument('paths'){
|
23
|
+
arity -1
|
24
|
+
}
|
25
|
+
|
26
|
+
option('--noop', '-n'){
|
27
|
+
description 'do no work, simply show what would be done'
|
28
|
+
}
|
29
|
+
|
30
|
+
option('--version'){
|
31
|
+
description 'print version and exit'
|
32
|
+
}
|
33
|
+
|
34
|
+
def run
|
35
|
+
if params['version'].given?
|
36
|
+
puts Version
|
37
|
+
exit
|
38
|
+
end
|
39
|
+
@paths = params['paths'].values
|
40
|
+
@noop = params['noop'].given?
|
41
|
+
finding_files_in(*@paths) do |file|
|
42
|
+
id3rename(file)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def id3rename(path)
|
47
|
+
src = path
|
48
|
+
dst = renamed(path)
|
49
|
+
unless src==dst
|
50
|
+
y src => dst
|
51
|
+
unless @noop
|
52
|
+
File.rename src, dst
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def finding_files_in(*paths, &block)
|
58
|
+
paths.flatten!
|
59
|
+
paths.compact!
|
60
|
+
paths.map! do |path|
|
61
|
+
path = File.expand_path(path)
|
62
|
+
test(?f, path) ? path : Dir[ File.join(path, '**', '**') ]
|
63
|
+
end
|
64
|
+
paths.flatten!
|
65
|
+
paths.map!{|path| Pathname.new(path).realpath.to_s}
|
66
|
+
paths.sort!
|
67
|
+
paths.uniq!
|
68
|
+
@seen = {}
|
69
|
+
paths.each do |path|
|
70
|
+
next if @seen[path]
|
71
|
+
@seen[path] = true
|
72
|
+
block.call(path) if(test(?f, path) and path =~ %r/\.mp3$/)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def renamed(path)
|
77
|
+
dirname, basename = File.split File.expand_path(path)
|
78
|
+
ext = basename.split(%r/\./).last
|
79
|
+
parts =
|
80
|
+
Mp3Info.open(path) do |mp3|
|
81
|
+
[
|
82
|
+
mp3.tag.artist,
|
83
|
+
#mp3.tag.album,
|
84
|
+
#mp3.tag.tracknum,
|
85
|
+
mp3.tag.title,
|
86
|
+
]
|
87
|
+
end
|
88
|
+
parts.compact!
|
89
|
+
parts.delete_if{|part| part.empty?}
|
90
|
+
basename = parts.map{|part| slug_for(part)}.join('_') + '.' + ext
|
91
|
+
File.join(dirname, basename)
|
92
|
+
end
|
93
|
+
|
94
|
+
def slug_for(*args)
|
95
|
+
string = args.flatten.compact.join('-')
|
96
|
+
words = string.to_s.scan(%r/\w+/)
|
97
|
+
words.map!{|word| word.gsub %r/[^0-9a-zA-Z_-]/, ''}
|
98
|
+
words.delete_if{|word| word.nil? or word.strip.empty?}
|
99
|
+
words.join('-').downcase
|
100
|
+
end
|
101
|
+
}
|
data/id3rename.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
## id3rename.gemspec
|
2
|
+
#
|
3
|
+
|
4
|
+
Gem::Specification::new do |spec|
|
5
|
+
spec.name = "id3rename"
|
6
|
+
spec.version = "1.0.2"
|
7
|
+
spec.platform = Gem::Platform::RUBY
|
8
|
+
spec.summary = "id3rename"
|
9
|
+
|
10
|
+
spec.files = ["bin", "bin/id3rename", "id3rename.gemspec", "Rakefile", "README"]
|
11
|
+
spec.executables = ["id3rename"]
|
12
|
+
|
13
|
+
spec.require_path = "lib"
|
14
|
+
|
15
|
+
spec.has_rdoc = true
|
16
|
+
spec.test_files = nil
|
17
|
+
#spec.add_dependency 'lib', '>= version'
|
18
|
+
#spec.add_dependency 'fattr'
|
19
|
+
|
20
|
+
spec.extensions.push(*[])
|
21
|
+
|
22
|
+
spec.rubyforge_project = "codeforpeople"
|
23
|
+
spec.author = "Ara T. Howard"
|
24
|
+
spec.email = "ara.t.howard@gmail.com"
|
25
|
+
spec.homepage = "http://github.com/ahoward/id3rename/tree/master"
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: id3rename
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ara T. Howard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-08-23 00:00:00 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: ara.t.howard@gmail.com
|
18
|
+
executables:
|
19
|
+
- id3rename
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- bin
|
26
|
+
- bin/id3rename
|
27
|
+
- id3rename.gemspec
|
28
|
+
- Rakefile
|
29
|
+
- README
|
30
|
+
has_rdoc: true
|
31
|
+
homepage: http://github.com/ahoward/id3rename/tree/master
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: "0"
|
42
|
+
version:
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
version:
|
49
|
+
requirements: []
|
50
|
+
|
51
|
+
rubyforge_project: codeforpeople
|
52
|
+
rubygems_version: 1.3.1
|
53
|
+
signing_key:
|
54
|
+
specification_version: 2
|
55
|
+
summary: id3rename
|
56
|
+
test_files: []
|
57
|
+
|