evideo 0.1.4 → 0.2.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +7 -7
- data/evideo.gemspec +3 -3
- data/exe/evideo +6 -0
- data/lib/evideo.rb +18 -10
- data/lib/evideo/hrvideo.rb +21 -2
- data/lib/evideo/hrvprocessa.rb +49 -38
- data/lib/evideo/version.rb +1 -1
- metadata +17 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebefc113933dc1cc99fab42d3aecd5b907231b2bcf70d9364572305e303a5554
|
4
|
+
data.tar.gz: e68bd951fd8912ceea23ec54a4a3774f2234ae505e6b065e9c20b3bd9ed18fcd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8690ca607ae90682154d61498c1236aa4f1433527c07be0dd4b0a73c7b7a3f2c04f3e5804e033ead09b49ccb9aa39469466a284c65a897e2e4bbcff4bddfd10
|
7
|
+
data.tar.gz: f03bea64673a278436199ba8c623a57d84448103e277cfeda18e9532485bb70e44441f9015149d2b8cea5536e8066660efd07715f202a2552caa6ea8df40b50a
|
data/Gemfile.lock
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
evideo (0.1
|
5
|
-
thor
|
4
|
+
evideo (0.2.1)
|
5
|
+
thor
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
rake (
|
11
|
-
thor (0.
|
10
|
+
rake (13.0.1)
|
11
|
+
thor (1.0.1)
|
12
12
|
|
13
13
|
PLATFORMS
|
14
14
|
ruby
|
15
15
|
|
16
16
|
DEPENDENCIES
|
17
|
-
bundler
|
17
|
+
bundler
|
18
18
|
evideo!
|
19
|
-
rake
|
19
|
+
rake
|
20
20
|
|
21
21
|
BUNDLED WITH
|
22
|
-
1.
|
22
|
+
2.1.2
|
data/evideo.gemspec
CHANGED
@@ -31,8 +31,8 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
32
|
spec.require_paths = ['lib']
|
33
33
|
|
34
|
-
spec.add_development_dependency 'bundler'
|
35
|
-
spec.add_development_dependency 'rake'
|
34
|
+
spec.add_development_dependency 'bundler'
|
35
|
+
spec.add_development_dependency 'rake'
|
36
36
|
|
37
|
-
spec.add_dependency 'thor'
|
37
|
+
spec.add_dependency 'thor'
|
38
38
|
end
|
data/exe/evideo
ADDED
data/lib/evideo.rb
CHANGED
@@ -13,27 +13,35 @@ module Evideo
|
|
13
13
|
class_option :d, banner: 'DIR', type: :array,
|
14
14
|
default: ["/home/#{ID}/lust", "/media/#{ID}/hrv2"],
|
15
15
|
desc: 'Onde procurar videos'
|
16
|
-
class_option :i, banner: 'IN',
|
17
|
-
|
16
|
+
class_option :i, banner: 'IN', default: 'ftv', desc: 'Pasta origem'
|
17
|
+
class_option :o, banner: 'OUT', default: 'out', desc: 'Pasta destino'
|
18
18
|
desc 'conv', 'converte videos'
|
19
|
-
option :
|
20
|
-
desc: 'Pasta destino'
|
19
|
+
option :t, type: :boolean, default: false, desc: 'Processa somente segundos para teste'
|
21
20
|
# Processa videos
|
22
21
|
def conv
|
23
|
-
|
24
|
-
|
25
|
-
HRVideo.new(f).processa(dar, options[:o], dar.first)
|
22
|
+
Dir.glob("#{fin}/c*.???").sort.each do |f|
|
23
|
+
HRVideo.new(f).processa(options, fout)
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
29
27
|
desc 'test', 'testa videos'
|
30
28
|
# Analisa videos
|
31
29
|
def test
|
32
|
-
|
33
|
-
|
34
|
-
HRVideo.new(f).testa(dar, options[:o])
|
30
|
+
Dir.glob("#{fin}/c*.???").sort.each do |f|
|
31
|
+
HRVideo.new(f).testa(options, fout)
|
35
32
|
end
|
36
33
|
end
|
37
34
|
default_task :conv
|
35
|
+
no_commands do
|
36
|
+
# @return [String] pasta absoluta origem dos videos
|
37
|
+
def fin
|
38
|
+
"#{options[:d].first}/#{options[:i]}"
|
39
|
+
end
|
40
|
+
|
41
|
+
# @return [String] pasta absoluta destino dos videos
|
42
|
+
def fout
|
43
|
+
"#{options[:d].first}/#{options[:o]}"
|
44
|
+
end
|
45
|
+
end
|
38
46
|
end
|
39
47
|
end
|
data/lib/evideo/hrvideo.rb
CHANGED
@@ -13,6 +13,8 @@ module Evideo
|
|
13
13
|
attr_reader :duration
|
14
14
|
# @return [String] bitrate do ficheiro video
|
15
15
|
attr_reader :bitrate
|
16
|
+
# @return [String] frequencia audio do ficheiro video
|
17
|
+
attr_reader :audio
|
16
18
|
|
17
19
|
# Duration: 01:01:08.50, start: 0.000000, bitrate: 2228 kb/s
|
18
20
|
R1 = /duration:\s+(\d\d:\d\d:\d\d).*bitrate:\s+(\d+)\s+kb/i.freeze
|
@@ -21,6 +23,9 @@ module Evideo
|
|
21
23
|
R2 = /stream.*video:.*x\s*(\d+).*\s+(\d+\.*\d*)\s+fps/i.freeze
|
22
24
|
# display_aspect_ratio=16:9
|
23
25
|
R3 = /display_aspect_ratio\s*=\s*(\d+:\d+)$/i.freeze
|
26
|
+
# Stream #0:1(eng): Audio: aac (LC), 48000 Hz, stereo, fltp (default)
|
27
|
+
# Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
|
28
|
+
R4 = /stream.*audio:.*\s+(\d+)\s+hz/i.freeze
|
24
29
|
|
25
30
|
def initialize(fvideo)
|
26
31
|
@video = fvideo
|
@@ -28,11 +33,11 @@ module Evideo
|
|
28
33
|
@base = File.basename(fvideo, @ext).downcase
|
29
34
|
@duration = '00:00:00'
|
30
35
|
@bitrate = 0
|
31
|
-
@probe = `#{
|
36
|
+
@probe = `#{cmd_probe}` if File.exist?(fvideo)
|
32
37
|
return unless @probe
|
33
38
|
|
34
39
|
tr1 = @probe.scan(R1).flatten
|
35
|
-
@duration = tr1[0]
|
40
|
+
@duration = tr1[0].to_s
|
36
41
|
@bitrate = tr1[1].to_i
|
37
42
|
end
|
38
43
|
|
@@ -52,6 +57,20 @@ module Evideo
|
|
52
57
|
@ratio = @probe.scan(R3).flatten[0]
|
53
58
|
end
|
54
59
|
|
60
|
+
# Parametrizar audio
|
61
|
+
def r4
|
62
|
+
return unless @probe
|
63
|
+
|
64
|
+
@audio = @probe.scan(R4).flatten[0].to_i
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [String] audio
|
68
|
+
def audio
|
69
|
+
r4 unless @audio
|
70
|
+
|
71
|
+
@audio
|
72
|
+
end
|
73
|
+
|
55
74
|
# @return [String] height
|
56
75
|
def height
|
57
76
|
r2 unless @height
|
data/lib/evideo/hrvprocessa.rb
CHANGED
@@ -9,17 +9,19 @@ module Evideo
|
|
9
9
|
def show
|
10
10
|
return video unless @probe
|
11
11
|
|
12
|
-
"tempo: #{duration} rate: #{bitrate}"
|
12
|
+
"tempo: #{duration} rate: #{bitrate} ratio: #{ratio} height: #{height}"
|
13
13
|
end
|
14
14
|
|
15
15
|
# Testa validade video original
|
16
16
|
#
|
17
|
+
# @param [String] aot pasta destino dos videos absoluta
|
17
18
|
# @return [true, false] sim ou nao video esta ok
|
18
|
-
def ofok?
|
19
|
-
return false unless (bitrate < 3000 && ext == '.mp4') ||
|
20
|
-
|
19
|
+
def ofok?(aot)
|
20
|
+
return false unless (bitrate < 3000 && ext == '.mp4') || Time.parse(duration) < Time.parse('00:01:00')
|
21
|
+
return false unless ratio == '16:9' && height > 480
|
22
|
+
return false unless audio == 0
|
21
23
|
|
22
|
-
puts "
|
24
|
+
puts "mv \"#{video} #{aot}/#{base}.mp4\" # #{show}"
|
23
25
|
true
|
24
26
|
end
|
25
27
|
|
@@ -29,8 +31,7 @@ module Evideo
|
|
29
31
|
# @return [true, false] sim ou nao video esta ok
|
30
32
|
def vfok?(file)
|
31
33
|
return false unless File.exist?(file.video) &&
|
32
|
-
file.bitrate < 3000
|
33
|
-
Time.parse(file.duration) > Time.parse(duration) - 60
|
34
|
+
file.bitrate < 3000 && Time.parse(file.duration) > Time.parse(duration) - 60
|
34
35
|
|
35
36
|
puts "rm \"#{video}\" # #{file.video} #{file.show}"
|
36
37
|
true
|
@@ -39,45 +40,41 @@ module Evideo
|
|
39
40
|
# Testa validade videos processados em todos locais contra video original
|
40
41
|
#
|
41
42
|
# @param [Array<String>] ary array locais onde procurar videos
|
42
|
-
# @param [String]
|
43
|
+
# @param [String] pot pasta destino dos videos
|
43
44
|
# @return [true, false] sim ou nao <local>/<video> esta ok
|
44
|
-
def vdok?(ary,
|
45
|
+
def vdok?(ary, pot)
|
45
46
|
if ary.empty? then false
|
46
|
-
elsif vfok?(HRVideo.new("#{ary.first}/#{
|
47
|
-
else vdok?(ary.drop(1),
|
47
|
+
elsif vfok?(HRVideo.new("#{ary.first}/#{pot}/#{base}.mp4")) then true
|
48
|
+
else vdok?(ary.drop(1), pot)
|
48
49
|
end
|
49
50
|
end
|
50
51
|
|
51
|
-
# @return [String] opcoes gerais comando conversao
|
52
|
-
def geral
|
53
|
-
'-loglevel quiet -hide_banner' +
|
54
|
-
# para ignorar segundos no inicio
|
55
|
-
# ' -ss 15' \
|
56
|
-
''
|
57
|
-
end
|
58
|
-
|
59
52
|
# @return [String] aspect ratio comando conversao
|
60
53
|
def aspect
|
61
|
-
if ratio == '0:1' then
|
54
|
+
if ratio == '0:1' then height < 720 ? '' : ' -aspect 16:9'
|
62
55
|
else " -aspect #{ratio}"
|
63
56
|
end
|
64
57
|
end
|
65
58
|
|
66
59
|
# @return [String] video dimensions comando conversao
|
67
60
|
def dimension
|
68
|
-
if
|
69
|
-
elsif
|
70
|
-
else
|
61
|
+
if height < 480 then ' -s hd480'
|
62
|
+
elsif height <= 720 then ' -s hd720'
|
63
|
+
else ' -s hd1080'
|
71
64
|
end
|
72
65
|
end
|
73
66
|
|
74
67
|
# @return [String] comando analise
|
75
|
-
def
|
68
|
+
def cmd_probe
|
76
69
|
"ffprobe -hide_banner -show_streams \"#{video}\" 2>&1|grep -v title"
|
77
70
|
end
|
78
71
|
|
72
|
+
# Comando para processar videos
|
73
|
+
#
|
74
|
+
# @param [String] tempo do video processado
|
79
75
|
# @return [String] comando conversao
|
80
|
-
def
|
76
|
+
def cmd_mpeg(tempo)
|
77
|
+
puts "processar #{base}.mp4 -r #{[fps, 25].min} -b:v #{[bitrate, 2000].min}k" + dimension + aspect + tempo
|
81
78
|
"ffmpeg #{geral} -i \"#{video}\" -y -an " +
|
82
79
|
# framerate & bitrate
|
83
80
|
"-r #{[fps, 25].min} -b:v #{[bitrate, 2000].min}k" +
|
@@ -85,28 +82,42 @@ module Evideo
|
|
85
82
|
' -metadata title= -metadata artist= -metadata comment=' \
|
86
83
|
' -metadata major_brand= -metadata compatible_brands=' +
|
87
84
|
# para teste produz somente segundos
|
88
|
-
|
85
|
+
tempo
|
86
|
+
end
|
87
|
+
|
88
|
+
# @return [String] opcoes gerais comando conversao
|
89
|
+
def geral
|
90
|
+
'-loglevel quiet -hide_banner' +
|
91
|
+
# para ignorar segundos no inicio
|
92
|
+
# ' -ss 15' \
|
89
93
|
''
|
90
94
|
end
|
91
95
|
|
92
96
|
# Processa videos
|
93
97
|
#
|
94
|
-
# @param [
|
95
|
-
# @
|
96
|
-
# @
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
98
|
+
# @param [Hash] opcoes parametrizacao
|
99
|
+
# @option opcoes [Array<String>] :d locais onde procurar videos
|
100
|
+
# @option opcoes [<String>] :i pasta origem dos videos
|
101
|
+
# @option opcoes [<String>] :o pasta destino dos videos
|
102
|
+
# @option opcoes [<Boolean>] :t processa somente segundos para teste
|
103
|
+
# @param [String] aot pasta destino dos videos absoluta
|
104
|
+
def processa(opcoes, aot)
|
105
|
+
return if ofok?(aot) || vdok?(opcoes[:d], opcoes[:o])
|
106
|
+
|
107
|
+
system cmd_mpeg(opcoes[:t] ? ' -t 20' : '') + " #{aot}/#{base}.mp4"
|
108
|
+
vfok?(HRVideo.new("#{aot}/#{base}.mp4"))
|
102
109
|
end
|
103
110
|
|
104
111
|
# Testa videos
|
105
112
|
#
|
106
|
-
# @param [
|
107
|
-
# @
|
108
|
-
|
109
|
-
|
113
|
+
# @param [Hash] opcoes parametrizacao
|
114
|
+
# @option opcoes [Array<String>] :d locais onde procurar videos
|
115
|
+
# @option opcoes [<String>] :i pasta origem dos videos
|
116
|
+
# @option opcoes [<String>] :o pasta destino dos videos
|
117
|
+
# @option opcoes [<Boolean>] :t processa somente segundos para teste
|
118
|
+
# @param [String] aot pasta destino dos videos absoluta
|
119
|
+
def testa(opcoes, aot)
|
120
|
+
return if ofok?(aot) || vdok?(opcoes[:d], opcoes[:o])
|
110
121
|
|
111
122
|
puts "ls \"#{video}\" # #{show}"
|
112
123
|
end
|
data/lib/evideo/version.rb
CHANGED
metadata
CHANGED
@@ -1,63 +1,64 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evideo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hernâni Rodrigues Vaz
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: thor
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0
|
47
|
+
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0
|
54
|
+
version: '0'
|
55
55
|
description: Processa ficheiros video. Pode alterar bitrate, framerate, height, aspect
|
56
56
|
ratio e elimina metadata.
|
57
57
|
email:
|
58
58
|
- hernanirvaz@gmail.com
|
59
59
|
executables:
|
60
60
|
- ev
|
61
|
+
- evideo
|
61
62
|
extensions: []
|
62
63
|
extra_rdoc_files: []
|
63
64
|
files:
|
@@ -71,6 +72,7 @@ files:
|
|
71
72
|
- bin/setup
|
72
73
|
- evideo.gemspec
|
73
74
|
- exe/ev
|
75
|
+
- exe/evideo
|
74
76
|
- lib/evideo.rb
|
75
77
|
- lib/evideo/hrvideo.rb
|
76
78
|
- lib/evideo/hrvprocessa.rb
|
@@ -96,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
98
|
- !ruby/object:Gem::Version
|
97
99
|
version: '0'
|
98
100
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
101
|
+
rubygems_version: 3.1.2
|
100
102
|
signing_key:
|
101
103
|
specification_version: 4
|
102
104
|
summary: Processa ficheiros video.
|