ehbrs_ruby_utils 0.40.0 → 0.41.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ehbrs_ruby_utils/bga/session/skip_trophies.rb +2 -2
- data/lib/ehbrs_ruby_utils/music/lyrics_book/song.rb +1 -1
- data/lib/ehbrs_ruby_utils/version.rb +1 -1
- data/lib/ehbrs_ruby_utils/videos/{container.rb → file.rb} +1 -1
- data/lib/ehbrs_ruby_utils/videos/stream.rb +33 -2
- data/lib/ehbrs_ruby_utils/videos2/convert_job.rb +99 -0
- data/lib/ehbrs_ruby_utils/videos2/extract/package.rb +75 -0
- data/lib/ehbrs_ruby_utils/videos2/extract/package_file.rb +53 -0
- data/lib/ehbrs_ruby_utils/videos2/extract.rb +11 -0
- data/lib/ehbrs_ruby_utils/videos2/profiles/base.rb +35 -0
- data/lib/ehbrs_ruby_utils/videos2/profiles/same_quality.rb +21 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/check_result.rb +24 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/check_set.rb +43 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/check_support.rb +71 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/checks/codec_extra_unlisted.rb +29 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/checks/codec_extra_unsupported.rb +28 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/checks/codec_unlisted.rb +25 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/checks/codec_unsupported.rb +27 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/checks/invalid_extension.rb +27 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/checks.rb +13 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/file/fix.rb +45 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/file.rb +51 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/fix_profile.rb +44 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/fixes/supported_codec/ffmpeg_args.rb +68 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/fixes/supported_codec.rb +15 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/fixes/supported_container.rb +17 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/profiles/aoc.rb +27 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/profiles/base.rb +117 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/profiles/philco.rb +28 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/profiles/samsung.rb +33 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/profiles.rb +13 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/search.rb +75 -0
- data/lib/ehbrs_ruby_utils/videos2/unsupported/track.rb +32 -0
- data/lib/ehbrs_ruby_utils/videos2.rb +9 -0
- metadata +32 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a44e90ef4da84b99b3b0f0ec915528e06feef36f88ac6e1a89d7b6cd2dfa4a85
|
4
|
+
data.tar.gz: 236d80b4491da318c1f5bc6ff6336ca9db5ddbb47b36e0222f817f906796e518
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d2ef32002c18d1a907989c1cd11f423bd010e4f03af74a857a4ee9c046bbd9ca5f22015f82f1711191918da22da320ace42e70f49de6f14b36cd1d624cb9d48
|
7
|
+
data.tar.gz: 6f9eef1ee52d3f97517448a03a346d6b392fecd4e26d064b7afa2b1eeddb0e530afffa6d3f25118752004c48d1be1ee382c11426156ae39ffec507ada037cb6d
|
@@ -10,6 +10,10 @@ module EhbrsRubyUtils
|
|
10
10
|
|
11
11
|
lists.add_symbol :codec_type, :audio, :video, :subtitle, :data, :attachment
|
12
12
|
|
13
|
+
DURATION_TAG_TO_SECONDS_PARSER = /\A(\d{2}):(\d{2}):(\d{2}.\d+)\z/.to_parser do |m|
|
14
|
+
(m[1].to_i * 3600) + (m[2].to_i * 60) + m[3].to_f
|
15
|
+
end
|
16
|
+
|
13
17
|
common_constructor :ffprobe_data do
|
14
18
|
self.ffprobe_data = ffprobe_data.symbolize_keys.freeze
|
15
19
|
self.class.lists.codec_type.value_validate!(codec_type)
|
@@ -21,8 +25,19 @@ module EhbrsRubyUtils
|
|
21
25
|
end
|
22
26
|
end
|
23
27
|
|
28
|
+
# @return [Integer]
|
29
|
+
def codec_tag
|
30
|
+
ffprobe_data.fetch(:codec_tag).to_i(16)
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [ActiveSupport::Duration, nil]
|
34
|
+
def duration
|
35
|
+
duration_from_root || duration_from_tags
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [String]
|
24
39
|
def to_s
|
25
|
-
|
40
|
+
[index, codec_type, codec_name, language, codec_tag_string].join('|')
|
26
41
|
end
|
27
42
|
|
28
43
|
def to_h
|
@@ -35,7 +50,7 @@ module EhbrsRubyUtils
|
|
35
50
|
end
|
36
51
|
end
|
37
52
|
|
38
|
-
%i[codec_name codec_long_name height width].each do |method_name|
|
53
|
+
%i[codec_name codec_long_name codec_tag_string height width].each do |method_name|
|
39
54
|
define_method method_name do
|
40
55
|
ffprobe_data[method_name]
|
41
56
|
end
|
@@ -60,6 +75,22 @@ module EhbrsRubyUtils
|
|
60
75
|
def title
|
61
76
|
tags[:title]
|
62
77
|
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
# @return [ActiveSupport::Duration, nil]
|
82
|
+
def duration_from_root
|
83
|
+
ffprobe_data[:duration].if_present do |v|
|
84
|
+
::ActiveSupport::Duration.build(v.to_f)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# @return [ActiveSupport::Duration, nil]
|
89
|
+
def duration_from_tags
|
90
|
+
tags[:DURATION].if_present do |v|
|
91
|
+
::ActiveSupport::Duration.build(DURATION_TAG_TO_SECONDS_PARSER.parse!(v))
|
92
|
+
end
|
93
|
+
end
|
63
94
|
end
|
64
95
|
end
|
65
96
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'ehbrs_ruby_utils/executables'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
module EhbrsRubyUtils
|
8
|
+
module Videos2
|
9
|
+
class ConvertJob
|
10
|
+
enable_speaker
|
11
|
+
enable_simple_cache
|
12
|
+
|
13
|
+
FORMATS_TO_EXTENSIONS = {
|
14
|
+
'matroska' => '.mkv'
|
15
|
+
}.freeze
|
16
|
+
|
17
|
+
attr_reader :input, :profile
|
18
|
+
|
19
|
+
def initialize(input, profile)
|
20
|
+
raise "Input file \"#{input}\" does not exist" unless ::File.exist?(input.to_s)
|
21
|
+
|
22
|
+
@input = input
|
23
|
+
@profile = profile
|
24
|
+
end
|
25
|
+
|
26
|
+
def run
|
27
|
+
if ::File.exist?(converted)
|
28
|
+
warn("Converted file already exist: \"#{converted}\"")
|
29
|
+
else
|
30
|
+
profile.run_callbacks(:convert) { convert }
|
31
|
+
profile.run_callbacks(:swap) { swap }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def target
|
36
|
+
::File.join(::File.dirname(input), "#{::File.basename(input, '.*')}#{target_extension}")
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def command_args_uncached
|
42
|
+
r = ['-i', input] + profile_ffmpeg_args
|
43
|
+
r += ['-f', format_by_input] if format_by_args.blank?
|
44
|
+
r + [converting]
|
45
|
+
end
|
46
|
+
|
47
|
+
def convert
|
48
|
+
infov 'Convert args', command_args.shelljoin
|
49
|
+
::EhbrsRubyUtils::Executables.ffmpeg.command.append(command_args).system!
|
50
|
+
end
|
51
|
+
|
52
|
+
def format_by_args_uncached
|
53
|
+
profile_ffmpeg_args.rindex('-f').if_present do |option_index|
|
54
|
+
profile_ffmpeg_args[option_index + 1]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def format_by_input
|
59
|
+
r = FORMATS_TO_EXTENSIONS.invert[target_extension_by_input]
|
60
|
+
return if r.present?
|
61
|
+
|
62
|
+
target_extension_by_input.gsub(/\A\./, '')
|
63
|
+
end
|
64
|
+
|
65
|
+
def format_to_extension(format)
|
66
|
+
FORMATS_TO_EXTENSIONS[format].if_present(".#{format}")
|
67
|
+
end
|
68
|
+
|
69
|
+
def profile_ffmpeg_args_uncached
|
70
|
+
profile.ffmpeg_args
|
71
|
+
end
|
72
|
+
|
73
|
+
def swap
|
74
|
+
::FileUtils.mv(input, converted)
|
75
|
+
::FileUtils.mv(converting, target)
|
76
|
+
end
|
77
|
+
|
78
|
+
def converting
|
79
|
+
"#{target}.converting"
|
80
|
+
end
|
81
|
+
|
82
|
+
def converted
|
83
|
+
input.basename_sub { |b| "#{b}.converted" }
|
84
|
+
end
|
85
|
+
|
86
|
+
def target_extension
|
87
|
+
target_extension_by_args || target_extension_by_input
|
88
|
+
end
|
89
|
+
|
90
|
+
def target_extension_by_args
|
91
|
+
format_by_args.if_present { |v| format_to_extension(v) }
|
92
|
+
end
|
93
|
+
|
94
|
+
def target_extension_by_input
|
95
|
+
::File.extname(input)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'ehbrs_ruby_utils/fs/compressed_package'
|
5
|
+
require 'ehbrs_ruby_utils/videos2/extract/package_file'
|
6
|
+
|
7
|
+
module EhbrsRubyUtils
|
8
|
+
module Videos2
|
9
|
+
module Extract
|
10
|
+
class Package
|
11
|
+
enable_simple_cache
|
12
|
+
|
13
|
+
common_constructor :path, :target_dir, :qualities do
|
14
|
+
self.path = path.to_pathname
|
15
|
+
self.target_dir = target_dir.to_pathname
|
16
|
+
end
|
17
|
+
|
18
|
+
delegate :to_s, to: :path
|
19
|
+
|
20
|
+
def run(delete)
|
21
|
+
selected_files.each(&:copy_to_selected_dir)
|
22
|
+
files.each(&:move_to_quality_dir)
|
23
|
+
extract_dir.rmdir
|
24
|
+
path.unlink if delete
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def files_uncached
|
30
|
+
::Pathname.glob("#{extract_dir}/**/*").map do |file|
|
31
|
+
::EhbrsRubyUtils::Videos2::Extract::PackageFile.new(self, file)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def extract_dir_uncached
|
36
|
+
r = target_dir / path.basename
|
37
|
+
raise "Extract directory \"#{r}\" is a file" if r.file?
|
38
|
+
|
39
|
+
r.rmtree if r.directory?
|
40
|
+
::EhbrsRubyUtils::Fs::CompressedPackage.new(path).extract_to(r)
|
41
|
+
r
|
42
|
+
end
|
43
|
+
|
44
|
+
def files_qualities_uncached
|
45
|
+
qualities_with_default.select { |q| grouped_files.keys.include?(q) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def grouped_files_uncached
|
49
|
+
r = {}
|
50
|
+
files.each do |file|
|
51
|
+
r[file.quality] ||= []
|
52
|
+
r[file.quality] << file
|
53
|
+
end
|
54
|
+
r
|
55
|
+
end
|
56
|
+
|
57
|
+
def qualities_with_default
|
58
|
+
qualities + [::EhbrsRubyUtils::Videos2::Extract::PackageFile::DEFAULT_QUALITY]
|
59
|
+
end
|
60
|
+
|
61
|
+
def selected_dir_uncached
|
62
|
+
target_dir / 'selected'
|
63
|
+
end
|
64
|
+
|
65
|
+
def selected_files
|
66
|
+
files.select { |f| f.quality == selected_quality }
|
67
|
+
end
|
68
|
+
|
69
|
+
def selected_quality_uncached
|
70
|
+
files_qualities.first
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module EhbrsRubyUtils
|
6
|
+
module Videos2
|
7
|
+
module Extract
|
8
|
+
class PackageFile
|
9
|
+
DEFAULT_QUALITY = '__default__'
|
10
|
+
|
11
|
+
enable_simple_cache
|
12
|
+
common_constructor :package, :path do
|
13
|
+
self.path = path.to_pathname
|
14
|
+
end
|
15
|
+
|
16
|
+
def copy_to_selected_dir
|
17
|
+
::FileUtils.cp(path.to_path, selected_dir.to_path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def match_quality?(quality)
|
21
|
+
path.basename_sub { |b| b.to_s.downcase }.basename
|
22
|
+
.fnmatch?("*#{quality.downcase}*".gsub(/\A\*+/, '*').gsub(/\*+\z/, '*'))
|
23
|
+
end
|
24
|
+
|
25
|
+
def move_to_quality_dir
|
26
|
+
::FileUtils.mv(path.to_path, quality_dir.to_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def quality_uncached
|
32
|
+
package.qualities.find { |q| match_quality?(q) } || DEFAULT_QUALITY
|
33
|
+
end
|
34
|
+
|
35
|
+
def quality_dir
|
36
|
+
r = package.target_dir / quality
|
37
|
+
r.mkpath
|
38
|
+
r
|
39
|
+
end
|
40
|
+
|
41
|
+
def selected_dir
|
42
|
+
r = nil
|
43
|
+
r = package.target_dir / 'source' if /\.torrent/ =~ path.to_path
|
44
|
+
r = package.target_dir / 'subtitle' if /\.srt/ =~ path.to_path
|
45
|
+
raise "Destination unknown: #{path}" unless r
|
46
|
+
|
47
|
+
r.mkpath
|
48
|
+
r
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EhbrsRubyUtils
|
4
|
+
module Videos2
|
5
|
+
module Profiles
|
6
|
+
module Base
|
7
|
+
extend ::ActiveSupport::Concern
|
8
|
+
|
9
|
+
attr_reader :convert_job
|
10
|
+
|
11
|
+
included do
|
12
|
+
include ActiveSupport::Callbacks
|
13
|
+
define_callbacks :convert, :swap
|
14
|
+
end
|
15
|
+
|
16
|
+
def ffmpeg_args
|
17
|
+
[]
|
18
|
+
end
|
19
|
+
|
20
|
+
def on_convert_job
|
21
|
+
old_value = convert_job
|
22
|
+
begin
|
23
|
+
yield
|
24
|
+
ensure
|
25
|
+
self.convert_job = old_value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_writer :convert_job
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ehbrs_ruby_utils/videos2/profiles/base'
|
4
|
+
|
5
|
+
module EhbrsRubyUtils
|
6
|
+
module Videos2
|
7
|
+
module Profiles
|
8
|
+
module SameQuality
|
9
|
+
extend ::ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
include ::EhbrsRubyUtils::Videos2::Profiles::Base
|
13
|
+
end
|
14
|
+
|
15
|
+
def ffmpeg_args
|
16
|
+
super + ['-q:a', '0', '-q:v', '0']
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module EhbrsRubyUtils
|
6
|
+
module Videos2
|
7
|
+
module Unsupported
|
8
|
+
class CheckResult
|
9
|
+
enable_simple_cache
|
10
|
+
common_constructor :source, :check
|
11
|
+
|
12
|
+
def passed?
|
13
|
+
message.blank?
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def message_uncached
|
19
|
+
check.check(source)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ehbrs_ruby_utils/videos2/unsupported/checks'
|
4
|
+
|
5
|
+
module EhbrsRubyUtils
|
6
|
+
module Videos2
|
7
|
+
module Unsupported
|
8
|
+
class CheckSet
|
9
|
+
enable_simple_cache
|
10
|
+
common_constructor :checks
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# type: "file" or "track"
|
14
|
+
def build(profiles, type)
|
15
|
+
r = {}
|
16
|
+
profiles.each do |profile|
|
17
|
+
profile.send("#{type}_checks").each do |check|
|
18
|
+
r[check] ||= CheckWithProfiles.new(check)
|
19
|
+
r[check].add_profile(profile)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
new(r.values)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class CheckWithProfiles < ::SimpleDelegator
|
27
|
+
def initialize(check)
|
28
|
+
super(check)
|
29
|
+
@profiles = []
|
30
|
+
end
|
31
|
+
|
32
|
+
def check_name
|
33
|
+
__getobj__.class.name.demodulize
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_profile(profile)
|
37
|
+
@profiles << profile
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'ehbrs_ruby_utils/videos2/unsupported/check_result'
|
5
|
+
|
6
|
+
module EhbrsRubyUtils
|
7
|
+
module Videos2
|
8
|
+
module Unsupported
|
9
|
+
module CheckSupport
|
10
|
+
common_concern do
|
11
|
+
enable_simple_cache
|
12
|
+
enable_speaker
|
13
|
+
end
|
14
|
+
|
15
|
+
def aggressions_banner(title)
|
16
|
+
return if passed?
|
17
|
+
|
18
|
+
info title
|
19
|
+
pad_speaker do
|
20
|
+
unpassed_checks.each do |u|
|
21
|
+
info "* #{u.message}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def ffmpeg_fix_args
|
27
|
+
unpassed_checks.flat_map do |check|
|
28
|
+
check.check.fix.if_present([]) { |v| v.ffmpeg_args(self) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def passed?
|
33
|
+
unpassed_checks.none?
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def unpassed_checks_uncached
|
39
|
+
checks.reject(&:passed?)
|
40
|
+
end
|
41
|
+
|
42
|
+
def checks_uncached
|
43
|
+
options.fetch(check_set_key).checks.map do |check|
|
44
|
+
::EhbrsRubyUtils::Videos2::Unsupported::CheckResult.new(self, check)
|
45
|
+
end
|
46
|
+
rescue StandardError => e
|
47
|
+
raise "#{e.message} (Source: #{self})"
|
48
|
+
end
|
49
|
+
|
50
|
+
def fix_blocks_uncached
|
51
|
+
checks.reject(&:passed?).select { |c| c.check.fix.blank? }
|
52
|
+
end
|
53
|
+
|
54
|
+
def fixes_uncached
|
55
|
+
checks.reject(&:passed?).map { |c| c.check.fix }.compact_blank
|
56
|
+
end
|
57
|
+
|
58
|
+
def pad_speaker(&block)
|
59
|
+
::EacRubyUtils::Speaker.context.on(::EacCli::Speaker.new(err_line_prefix: ' '), &block)
|
60
|
+
end
|
61
|
+
|
62
|
+
def new_padded_cli_speaker
|
63
|
+
::EacCli::Speaker.new(
|
64
|
+
err_line_prefix("#{::EacRubyUtils::Speaker.context.optional_current
|
65
|
+
.if_present('') { |v| v.is_a?(::EacCli::Speaker) ? v.err_line_prefix : '' }} ")
|
66
|
+
)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EhbrsRubyUtils
|
4
|
+
module Videos2
|
5
|
+
module Unsupported
|
6
|
+
module Checks
|
7
|
+
class CodecExtraUnlisted
|
8
|
+
TYPE = :stream
|
9
|
+
|
10
|
+
common_constructor :codec, :listed_extras
|
11
|
+
|
12
|
+
def check(track)
|
13
|
+
return nil unless track.codec_name == codec
|
14
|
+
return nil if listed_extras.any? do |extra|
|
15
|
+
track.codec_tag_string.downcase.include?(extra.downcase)
|
16
|
+
end
|
17
|
+
|
18
|
+
"Not listed extra for codec \"#{codec}\" (Track: #{track}" \
|
19
|
+
", listed extra: #{listed_extras})"
|
20
|
+
end
|
21
|
+
|
22
|
+
def fix
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ehbrs_ruby_utils/videos2/unsupported/fixes/supported_codec'
|
4
|
+
|
5
|
+
module EhbrsRubyUtils
|
6
|
+
module Videos2
|
7
|
+
module Unsupported
|
8
|
+
module Checks
|
9
|
+
class CodecExtraUnsupported
|
10
|
+
TYPE = :stream
|
11
|
+
|
12
|
+
common_constructor :codec, :extra
|
13
|
+
|
14
|
+
def check(track)
|
15
|
+
return nil unless track.codec_name == codec
|
16
|
+
return nil unless track.codec_tag_string.downcase.include?(extra.downcase)
|
17
|
+
|
18
|
+
"Unsupported extra \"#{extra}\" for codec \"#{codec}\" and track #{track}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def fix
|
22
|
+
::EhbrsRubyUtils::Videos2::Unsupported::Fixes::SupportedCodec.new
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EhbrsRubyUtils
|
4
|
+
module Videos2
|
5
|
+
module Unsupported
|
6
|
+
module Checks
|
7
|
+
class CodecUnlisted
|
8
|
+
TYPE = :stream
|
9
|
+
|
10
|
+
common_constructor :listed_codecs
|
11
|
+
|
12
|
+
def check(track)
|
13
|
+
return nil if listed_codecs.include?(track.codec_name)
|
14
|
+
|
15
|
+
"Not listed codec \"#{track.codec_name}\" (Track: #{track}, listed: #{listed_codecs})"
|
16
|
+
end
|
17
|
+
|
18
|
+
def fix
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ehbrs_ruby_utils/videos2/unsupported/fixes/supported_codec'
|
4
|
+
|
5
|
+
module EhbrsRubyUtils
|
6
|
+
module Videos2
|
7
|
+
module Unsupported
|
8
|
+
module Checks
|
9
|
+
class CodecUnsupported
|
10
|
+
TYPE = :stream
|
11
|
+
|
12
|
+
common_constructor :codec
|
13
|
+
|
14
|
+
def check(track)
|
15
|
+
return nil unless track.codec_name == codec
|
16
|
+
|
17
|
+
"Unsupported codec \"#{codec}\" for track #{track}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def fix
|
21
|
+
::EhbrsRubyUtils::Videos2::Unsupported::Fixes::SupportedCodec.new
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ehbrs_ruby_utils/videos2/unsupported/fixes/supported_container'
|
4
|
+
|
5
|
+
module EhbrsRubyUtils
|
6
|
+
module Videos2
|
7
|
+
module Unsupported
|
8
|
+
module Checks
|
9
|
+
class InvalidExtension
|
10
|
+
TYPE = :container
|
11
|
+
|
12
|
+
common_constructor :extension
|
13
|
+
|
14
|
+
def check(video)
|
15
|
+
return nil unless ::File.extname(video.path) == extension
|
16
|
+
|
17
|
+
"File has invalid extension: #{extension}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def fix
|
21
|
+
::EhbrsRubyUtils::Videos2::Unsupported::Fixes::SupportedContainer.new
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|