youpy-scissor 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README.rdoc +3 -2
  2. data/Rakefile +1 -1
  3. data/lib/scissor.rb +36 -28
  4. metadata +1 -1
data/README.rdoc CHANGED
@@ -3,14 +3,15 @@
3
3
  == Description
4
4
  utility to chop mp3 files
5
5
 
6
- == Installation
6
+ == Requirements
7
7
 
8
- === Requirements
9
8
  * {ruby-mp3info}[http://ruby-mp3info.rubyforge.org/]
10
9
  * {FFmpeg}[http://ffmpeg.mplayerhq.hu/]
11
10
  * {Ecasound}[http://www.eca.cx/ecasound/]
12
11
  * {mpg123}[http://www.mpg123.de/]
13
12
 
13
+ == Installation
14
+
14
15
  === Archive Installation
15
16
 
16
17
  rake install
data/Rakefile CHANGED
@@ -17,7 +17,7 @@ DESCRIPTION = "utility to chop mp3 files"
17
17
  RUBYFORGE_PROJECT = "scissor"
18
18
  HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
19
19
  BIN_FILES = %w( )
20
- VERS = "0.0.7"
20
+ VERS = "0.0.8"
21
21
 
22
22
  REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
23
23
  CLEAN.include ['**/.*.sw?', '*.gem', '.config']
data/lib/scissor.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'mp3info'
2
- require 'fileutils'
3
-
4
- include FileUtils
2
+ require 'digest/md5'
3
+ require 'pathname'
5
4
 
6
5
  class Scissor
7
6
  class Error < StandardError; end
@@ -18,7 +17,7 @@ class Scissor
18
17
 
19
18
  if filename
20
19
  @fragments << Fragment.new(
21
- filename,
20
+ Pathname.new(filename),
22
21
  0,
23
22
  Mp3Info.new(filename).length)
24
23
  end
@@ -39,7 +38,7 @@ class Scissor
39
38
  raise OutOfDuration
40
39
  end
41
40
 
42
- new_mp3 = self.class.new
41
+ new_instance = self.class.new
43
42
  remain = length
44
43
 
45
44
  @fragments.each do |fragment|
@@ -50,7 +49,7 @@ class Scissor
50
49
  end
51
50
 
52
51
  if (start + remain) <= fragment.duration
53
- new_mp3.add_fragment(Fragment.new(
52
+ new_instance.add_fragment(Fragment.new(
54
53
  fragment.filename,
55
54
  fragment.start + start,
56
55
  remain))
@@ -58,7 +57,7 @@ class Scissor
58
57
  break
59
58
  else
60
59
  remain = remain - (fragment.duration - start)
61
- new_mp3.add_fragment(Fragment.new(
60
+ new_instance.add_fragment(Fragment.new(
62
61
  fragment.filename,
63
62
  fragment.start + start,
64
63
  fragment.duration - start))
@@ -67,7 +66,7 @@ class Scissor
67
66
  end
68
67
  end
69
68
 
70
- new_mp3
69
+ new_instance
71
70
  end
72
71
 
73
72
  def concat(other)
@@ -113,24 +112,24 @@ class Scissor
113
112
  end
114
113
 
115
114
  remain = filled_duration
116
- new_mp3 = self.class.new
115
+ new_instance = self.class.new
117
116
 
118
- while filled_duration > new_mp3.duration
117
+ while filled_duration > new_instance.duration
119
118
  if remain < duration
120
119
  added = slice(0, remain)
121
120
  else
122
121
  added = self
123
122
  end
124
123
 
125
- new_mp3 += added
124
+ new_instance += added
126
125
  remain -= added.duration
127
126
  end
128
127
 
129
- new_mp3
128
+ new_instance
130
129
  end
131
130
 
132
131
  def replace(start, duration, replaced)
133
- new_mp3 = self.class.new
132
+ new_instance = self.class.new
134
133
  offset = start + duration
135
134
 
136
135
  if offset > self.duration
@@ -138,13 +137,13 @@ class Scissor
138
137
  end
139
138
 
140
139
  if start > 0
141
- new_mp3 += slice(0, start)
140
+ new_instance += slice(0, start)
142
141
  end
143
142
 
144
- new_mp3 += replaced
145
- new_mp3 += slice(offset, self.duration - offset)
143
+ new_instance += replaced
144
+ new_instance += slice(offset, self.duration - offset)
146
145
 
147
- new_mp3
146
+ new_instance
148
147
  end
149
148
 
150
149
  def to_file(filename, options = {})
@@ -160,35 +159,44 @@ class Scissor
160
159
  :overwrite => false
161
160
  }.merge(options)
162
161
 
163
- if File.exists?(filename)
162
+ filename = Pathname.new(filename)
163
+
164
+ if filename.exist?
164
165
  if options[:overwrite]
165
- File.unlink(filename)
166
+ filename.unlink
166
167
  else
167
168
  raise FileExists
168
169
  end
169
170
  end
170
171
 
171
172
  position = 0.0
172
- tmpfile = '/tmp/scissor-' + $$.to_s + '.wav'
173
+ tmpdir = Pathname.new('/tmp/scissor-' + $$.to_s)
174
+ tmpdir.mkpath
175
+ tmpfile = tmpdir + 'tmp.wav'
173
176
  cmd = %w/ecasound/
174
177
 
175
178
  begin
176
179
  @fragments.each_with_index do |fragment, index|
177
- if !index.zero? && (index % 80).zero?
178
- run_command(cmd.join(' '))
179
- cmd = %w/ecasound/
180
+ fragment_tmpfile =
181
+ tmpdir + (Digest::MD5.hexdigest(fragment.filename) + '.wav')
182
+
183
+ unless fragment_tmpfile.exist?
184
+ run_command("ffmpeg -i \"#{fragment.filename}\" \"#{fragment_tmpfile}\"")
180
185
  end
181
186
 
182
- cmd << "-a:#{index} -i \"#{fragment.filename}\" -y:#{fragment.start} -t:#{fragment.duration} -o #{tmpfile} -y:#{position}"
187
+ cmd <<
188
+ "-a:#{index} " +
189
+ "-i:select,#{fragment.start},#{fragment.duration},\"#{fragment_tmpfile}\" " +
190
+ "-o #{tmpfile} " +
191
+ "-y:#{position}"
192
+
183
193
  position += fragment.duration
184
194
  end
185
195
 
186
196
  run_command(cmd.join(' '))
187
-
188
- cmd = "ffmpeg -i \"#{tmpfile}\" \"#{filename}\""
189
- run_command(cmd)
197
+ run_command("ffmpeg -i \"#{tmpfile}\" \"#{filename}\"")
190
198
  ensure
191
- rm tmpfile
199
+ tmpdir.rmtree
192
200
  end
193
201
 
194
202
  self.class.new(filename)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: youpy-scissor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - youpy