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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cbacc62b58b0bfda756ed9ab6dd805d7ed2f83f53ad4b9a473380c333a03fa36
4
- data.tar.gz: cdac5c566f42e62025b9f1eca06c633d676725e7c47bdaf56efd30eb35ec32fa
3
+ metadata.gz: ebefc113933dc1cc99fab42d3aecd5b907231b2bcf70d9364572305e303a5554
4
+ data.tar.gz: e68bd951fd8912ceea23ec54a4a3774f2234ae505e6b065e9c20b3bd9ed18fcd
5
5
  SHA512:
6
- metadata.gz: 1a70f3e4b577446166522283413fedeaa0c4e080628ffe8ec050ce544be7df72ccd30a90a0c33338e5b7b4e5e256dba7db0eb67c86f3d931b42e0142ba61a10d
7
- data.tar.gz: 76bf6aa4ee171e44d58ef4c9a5401361a7a186b550c03f4a58beda77fc7d8cbc163a0eb7d21312ca95fc157376757e993a562698ad407023e3ca402bd99e250b
6
+ metadata.gz: e8690ca607ae90682154d61498c1236aa4f1433527c07be0dd4b0a73c7b7a3f2c04f3e5804e033ead09b49ccb9aa39469466a284c65a897e2e4bbcff4bddfd10
7
+ data.tar.gz: f03bea64673a278436199ba8c623a57d84448103e277cfeda18e9532485bb70e44441f9015149d2b8cea5536e8066660efd07715f202a2552caa6ea8df40b50a
@@ -1,22 +1,22 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- evideo (0.1.4)
5
- thor (~> 0.1)
4
+ evideo (0.2.1)
5
+ thor
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- rake (10.5.0)
11
- thor (0.20.3)
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 (~> 1.17)
17
+ bundler
18
18
  evideo!
19
- rake (~> 10.0)
19
+ rake
20
20
 
21
21
  BUNDLED WITH
22
- 1.17.2
22
+ 2.1.2
@@ -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', '~> 1.17'
35
- spec.add_development_dependency 'rake', '~> 10.0'
34
+ spec.add_development_dependency 'bundler'
35
+ spec.add_development_dependency 'rake'
36
36
 
37
- spec.add_dependency 'thor', '~> 0.1'
37
+ spec.add_dependency 'thor'
38
38
  end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'evideo'
5
+
6
+ Evideo::CLI.start(ARGV)
@@ -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', default: 'ftv',
17
- desc: 'Pasta origem'
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 :o, banner: 'OUT', default: 'out',
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
- dar = options[:d]
24
- Dir.glob("#{dar.first}/#{options[:i]}/*.???").sort.each do |f|
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
- dar = options[:d]
33
- Dir.glob("#{dar.first}/#{options[:i]}/*.???").sort.each do |f|
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
@@ -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 = `#{probe}` if File.exist?(fvideo)
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
@@ -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
- Time.parse(duration) < Time.parse('00:01:00')
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 "rm \"#{video}\" # #{show}"
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] out pasta destino dos videos
43
+ # @param [String] pot pasta destino dos videos
43
44
  # @return [true, false] sim ou nao <local>/<video> esta ok
44
- def vdok?(ary, out)
45
+ def vdok?(ary, pot)
45
46
  if ary.empty? then false
46
- elsif vfok?(HRVideo.new("#{ary.first}/#{out}/#{base}.mp4")) then true
47
- else vdok?(ary.drop(1), out)
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 bitrate < 720 ? '' : ' -aspect 16:9'
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 bitrate < 480 then ' -s hd480'
69
- elsif bitrate <= 720 then ' -s hd720'
70
- else ' -s hd1080'
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 probe
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 mpeg
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
- # ' -t 20' \
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 [Array<String>] dar locais onde procurar videos
95
- # @param [String] out pasta destino dos videos
96
- # @param [String] din pasta origem dos videos
97
- def processa(dar, out, din)
98
- return if ofok? || vdok?(dar, out)
99
-
100
- system mpeg + " #{din}/#{out}/#{base}.mp4"
101
- vfok?(HRVideo.new("#{din}/#{out}/#{base}.mp4"))
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 [Array<String>] dar locais onde procurar videos
107
- # @param [String] out pasta destino dos videos
108
- def testa(dar, out)
109
- return if ofok? || vdok?(dar, out)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Evideo
4
- VERSION = '0.1.4'
4
+ VERSION = '0.2.1'
5
5
  end
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
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: 2019-12-03 00:00:00.000000000 Z
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: '1.17'
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: '1.17'
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: '10.0'
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: '10.0'
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.1'
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.1'
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.0.3
101
+ rubygems_version: 3.1.2
100
102
  signing_key:
101
103
  specification_version: 4
102
104
  summary: Processa ficheiros video.