video_to_mp3 0.0.5 → 0.0.6
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.md +42 -5
- data/lib/convertor/convertor.rb +81 -0
- data/lib/convertor/hash.rb +8 -0
- data/lib/video_to_mp3.rb +73 -9
- data/video_to_mp3.gemspec +3 -1
- metadata +4 -2
data/README.md
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
+
Note
|
2
|
+
------------
|
3
|
+
|
4
|
+
"VideoToMp3.new.connvert_to_mp3" to mp3 method would be same as convert method which is there in this release as I have made this a generic method which also gives you the fexibility to specify your own ffmpeg conversion options
|
5
|
+
|
1
6
|
Video to mp3
|
2
7
|
=========
|
3
8
|
|
4
|
-
This is a video to mp3 convertor.
|
9
|
+
This is a video to mp3 convertor. It converts your video files into mp3
|
5
10
|
|
6
11
|
Requirements
|
7
12
|
------------
|
@@ -23,12 +28,44 @@ Quick Start
|
|
23
28
|
|
24
29
|
In your code
|
25
30
|
|
26
|
-
|
31
|
+
You can intialize the code as you
|
32
|
+
|
33
|
+
video = VideoToMp3.new(input_filename, output_filename, {:ab => 64000, :ar => 22050, :destination_path => "destination/path"})
|
34
|
+
|
35
|
+
Then you will have method to convert into mp3 and the default location for the file will be "/home/username/mp3_files"
|
36
|
+
|
37
|
+
Just call video.convert and it will do the conversion
|
38
|
+
|
39
|
+
or
|
40
|
+
|
41
|
+
video = VideoToMp3.new
|
42
|
+
|
43
|
+
video.convert({
|
44
|
+
:input_filename => "/absolute/path/to/input/file",
|
45
|
+
:output_filename => "outputfile" #you dont need to add mp3 in the end,
|
46
|
+
:destination_path => "/absolute/destination/path" #this should be directory path
|
47
|
+
#and any other option which which ffmpeg take for the mp3 audio conversion as key value pair
|
48
|
+
#for eg :ab => 64000 --> audio bitrate '-ab 64000'
|
49
|
+
})
|
50
|
+
|
51
|
+
incase you donot provide any options for conversion then it uses the default option which is
|
52
|
+
{
|
53
|
+
:ar => 44100, #audio rate
|
54
|
+
:q => 1, #audio quality 1..20
|
55
|
+
:ab => 128000 #audio bit rate
|
56
|
+
}
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
convert_to_mp3 has been not changed and can be used as it was
|
62
|
+
|
63
|
+
VideoToMp3.new.connvert_to_mp3("\path\to\video\file", "outputfile_name", "\destination\path")
|
27
64
|
|
28
|
-
if you do not provide the output filename and destination path then inputfile name is set as
|
29
|
-
outputfile name and "mp3_files" directory get created if you do not provide the destination path
|
65
|
+
if you do not provide the output filename and destination path then inputfile name is set as
|
66
|
+
outputfile name and "mp3_files" directory get created if you do not provide the destination path
|
30
67
|
|
31
|
-
you can find the converted file at destination\path\outputfile_name.mp3
|
68
|
+
you can find the converted file at destination\path\outputfile_name.mp3
|
32
69
|
|
33
70
|
|
34
71
|
Issue Report
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class Convertor
|
2
|
+
|
3
|
+
@@default_convert_options = {
|
4
|
+
:ar => 44100, #audio rate
|
5
|
+
:q => 1, #audio quality 1..20
|
6
|
+
:ab => 128000 #audio bit rate
|
7
|
+
}
|
8
|
+
|
9
|
+
######################
|
10
|
+
# Attribute accessors
|
11
|
+
######################
|
12
|
+
attr_accessor :in_filename, :out_filename, :duration, :options, :destination_path
|
13
|
+
|
14
|
+
|
15
|
+
######################
|
16
|
+
# Protected methods
|
17
|
+
######################
|
18
|
+
protected
|
19
|
+
|
20
|
+
def path
|
21
|
+
return "#{destination_path.to_s}/#{out_filename.to_s}.mp3"
|
22
|
+
end
|
23
|
+
|
24
|
+
def stringify_options
|
25
|
+
options_arr = []
|
26
|
+
|
27
|
+
options.each do |k, v|
|
28
|
+
options_arr << "-#{k.to_s.dup} #{v}"
|
29
|
+
end
|
30
|
+
|
31
|
+
return options_arr.join(" ")
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_file_duration
|
36
|
+
return nil if in_filename.nil? or in_filename.empty?
|
37
|
+
|
38
|
+
command = "#{ffmpeg} -i \"#{File.expand_path(in_filename)}\" 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"
|
39
|
+
command_output = `#{command}`
|
40
|
+
|
41
|
+
|
42
|
+
if command_output =~ /([\d][\d]):([\d][\d]):([\d][\d]).([\d]+)/
|
43
|
+
hours = $1; mins = $2; seconds = $3; mseconds = $4
|
44
|
+
time_in_seconds = (( (hours.to_i * 60 + mins.to_i) * 60 + seconds.to_i) + (mseconds.to_f / 100).ceil).to_i
|
45
|
+
end
|
46
|
+
|
47
|
+
return Time.at(time_in_seconds).gmtime.strftime('%R:%S') if !time_in_seconds.nil? or !time_in_seconds.to_s.empty?
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
def ffmpeg
|
52
|
+
@ffmpeg ||= `which ffmpeg`.chomp
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_for_errors
|
56
|
+
|
57
|
+
raise VideoToMp3Error, "No input file supplied" if in_filename.nil? or in_filename.empty?
|
58
|
+
|
59
|
+
raise VideoToMp3Error, "Invalid options. It should be a hash" unless options.is_a?(Hash)
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_default_attributes
|
64
|
+
if out_filename.nil? or out_filename.empty?
|
65
|
+
self.out_filename = in_filename.split("/")[-1].split(".")[0..-2].join("")
|
66
|
+
end
|
67
|
+
|
68
|
+
if destination_path.nil? or destination_path.empty?
|
69
|
+
self.destination_path = "#{ENV["HOME"]}/mp3_files"
|
70
|
+
|
71
|
+
raise VideoToMp3Error, "Unable to create directory at location - #{destination_path}" if
|
72
|
+
!Dir.exist?(destination_path) and !system("mkdir #{destination_path}")
|
73
|
+
end
|
74
|
+
|
75
|
+
if duration.nil?
|
76
|
+
self.duration = get_file_duration
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
data/lib/video_to_mp3.rb
CHANGED
@@ -1,22 +1,82 @@
|
|
1
1
|
require "errors/video_to_mp3_error"
|
2
|
+
require "convertor/hash"
|
3
|
+
require "convertor/convertor"
|
4
|
+
|
5
|
+
class VideoToMp3 < Convertor
|
6
|
+
|
7
|
+
def initialize(in_filename = nil, out_filename = nil, options = {})
|
8
|
+
|
9
|
+
raise VideoToMp3Error, "Please install ffmpeg on your system. \n
|
10
|
+
Checkout the installation guide at http://ffmpeg.org/download.html
|
11
|
+
" if ffmpeg.nil? or ffmpeg.empty?
|
12
|
+
|
13
|
+
raise VideoToMp3Error, "Invalid hash options" if !options.empty? and !options.is_a?(Hash)
|
14
|
+
|
15
|
+
@in_filename = in_filename
|
16
|
+
@out_filename = out_filename
|
17
|
+
@options = options.symbolize_keys!
|
18
|
+
@duration = get_file_duration
|
19
|
+
end
|
20
|
+
|
21
|
+
########################################################################################
|
22
|
+
# options takes the hash which will allow user to set the custom quality parameter
|
23
|
+
# for eg quality paramter q 1..20, audio rate ab 44100, 22050 etc
|
24
|
+
########################################################################################
|
25
|
+
|
26
|
+
def convert(convert_options = {})
|
27
|
+
self.options = convert_options
|
28
|
+
|
29
|
+
#symbolize the hash keys
|
30
|
+
self.options.symbolize_keys!
|
31
|
+
|
32
|
+
#delete the input/output filename if exists in the options hash
|
33
|
+
self.in_filename = self.options.delete(:input_filename) || in_filename
|
34
|
+
self.out_filename = self.options.delete(:output_filename) || out_filename
|
35
|
+
|
36
|
+
#raises error in case it does not have the minimum required data t convert
|
37
|
+
check_for_errors
|
38
|
+
|
39
|
+
#set the destionation path if exists in options has
|
40
|
+
self.destination_path = self.options.delete(:destination_path)
|
41
|
+
|
42
|
+
#check if options are empty now
|
43
|
+
self.options = @@default_convert_options if options.empty?
|
44
|
+
|
45
|
+
#returns the ffmpeg options hash as string for eg - '-ab 128000 -ac 2'
|
46
|
+
options_string = stringify_options
|
47
|
+
|
48
|
+
#set the deafult attributes if not present for eg - output filename duration etc
|
49
|
+
set_default_attributes
|
50
|
+
|
51
|
+
#convert to mp3
|
52
|
+
ffmpeg_command = "#{ffmpeg} -i #{in_filename} #{options_string} #{path}"
|
53
|
+
|
54
|
+
#system method runs the command and return the true or false
|
55
|
+
command_status = system(ffmpeg_command)
|
56
|
+
|
57
|
+
if command_status == true
|
58
|
+
return path
|
59
|
+
else
|
60
|
+
raise VideoToMp3Error, "Wrong file name or check the ffmpeg installation on your system"
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
2
64
|
|
3
|
-
class VideoToMp3
|
4
65
|
|
5
|
-
#method to convert
|
66
|
+
#method to convert the video file to mp3
|
6
67
|
def connvert_to_mp3(input_filename, output_filename = nil, destination_path = "")
|
7
68
|
raise VideoToMp3Error, "No input file supplied" if input_filename.nil? or input_filename.empty?
|
8
69
|
|
9
70
|
#set the output filename sames as input filename if it is not supplied
|
10
71
|
output_filename = input_filename.split("/")[-1] if output_filename.nil? or input_filename.empty?
|
11
|
-
ffmpeg = `which ffmpeg`.chomp
|
12
72
|
|
13
73
|
raise VideoToMp3Error, "Please install ffmpeg on your system. \n
|
14
|
-
|
74
|
+
Checkout the installation guide at http://ffmpeg.org/download.html
|
15
75
|
" if ffmpeg.nil? or ffmpeg.empty?
|
16
76
|
|
17
77
|
if destination_path.nil? or destination_path.empty?
|
18
78
|
#create the mp3_files directory
|
19
|
-
default_path = "mp3_files"
|
79
|
+
default_path = "#{ENV["HOME"]}/mp3_files"
|
20
80
|
system("mkdir #{default_path}")
|
21
81
|
destination_path = default_path
|
22
82
|
end
|
@@ -24,10 +84,6 @@ class VideoToMp3
|
|
24
84
|
path = "#{destination_path}/#{output_filename}.mp3"
|
25
85
|
ffmpeg_command = "#{ffmpeg} -i #{input_filename} -q 1 #{path}"
|
26
86
|
|
27
|
-
puts "*********************************"
|
28
|
-
puts ffmpeg_command
|
29
|
-
puts "*********************************"
|
30
|
-
|
31
87
|
#system method runs the command and return the true or false
|
32
88
|
command_status = system(ffmpeg_command)
|
33
89
|
|
@@ -40,4 +96,12 @@ class VideoToMp3
|
|
40
96
|
|
41
97
|
end
|
42
98
|
|
99
|
+
def options
|
100
|
+
@options ||= {}
|
101
|
+
end
|
102
|
+
|
103
|
+
def duration
|
104
|
+
@duration ||= get_file_duration
|
105
|
+
end
|
106
|
+
|
43
107
|
end
|
data/video_to_mp3.gemspec
CHANGED
@@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path("../lib", __FILE__)
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "video_to_mp3"
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.6"
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.author = "Naveen Agarwal"
|
8
8
|
s.email = ["naveenagarwal287@gmail.com"]
|
@@ -22,6 +22,8 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.files = [
|
23
23
|
"lib/video_to_mp3.rb",
|
24
24
|
"lib/errors/video_to_mp3_error.rb",
|
25
|
+
"lib/convertor/hash.rb",
|
26
|
+
"lib/convertor/convertor.rb",
|
25
27
|
"README.md",
|
26
28
|
"video_to_mp3.gemspec"
|
27
29
|
]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: video_to_mp3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-26 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: audio/video media convertor
|
15
15
|
email:
|
@@ -20,6 +20,8 @@ extra_rdoc_files: []
|
|
20
20
|
files:
|
21
21
|
- lib/video_to_mp3.rb
|
22
22
|
- lib/errors/video_to_mp3_error.rb
|
23
|
+
- lib/convertor/hash.rb
|
24
|
+
- lib/convertor/convertor.rb
|
23
25
|
- README.md
|
24
26
|
- video_to_mp3.gemspec
|
25
27
|
homepage: https://github.com/naveenagarwal/video_to_mp3.git
|