ehbrs-tools 0.3.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/ehbrs +2 -2
- data/lib/ehbrs/executables.rb +8 -7
- data/lib/ehbrs/runner.rb +33 -0
- data/lib/ehbrs/runner/vg.rb +19 -0
- data/lib/ehbrs/runner/vg/ips.rb +88 -0
- data/lib/ehbrs/runner/vg/wii.rb +75 -0
- data/lib/ehbrs/runner/videos.rb +23 -0
- data/lib/ehbrs/runner/videos/unsupported.rb +63 -0
- data/lib/ehbrs/tools/version.rb +1 -1
- data/lib/ehbrs/vg.rb +9 -0
- data/lib/ehbrs/vg/wii.rb +11 -0
- data/lib/ehbrs/vg/wii/file_move.rb +89 -0
- data/lib/ehbrs/vg/wii/game_file.rb +64 -0
- data/lib/ehbrs/vg/wii/wit.rb +13 -0
- data/lib/ehbrs/vg/wii/wit/image_format.rb +46 -0
- data/lib/ehbrs/vg/wii/wit/parsers/dump.rb +62 -0
- data/lib/ehbrs/vg/wii/wit/parsers/info.rb +39 -0
- data/lib/ehbrs/vg/wii/wit/path.rb +55 -0
- data/lib/ehbrs/videos/unsupported/search.rb +13 -10
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils.rb +1 -19
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/by_reference.rb +1 -1
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/custom_format.rb +53 -0
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/command.rb +7 -0
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/spawn.rb +32 -0
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/fs.rb +9 -0
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/fs/traversable.rb +47 -0
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/fs/traverser.rb +74 -0
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/patches/class/common_constructor.rb +2 -2
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/version.rb +1 -1
- data/vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/custom_format_spec.rb +60 -0
- metadata +37 -8
- data/lib/ehbrs/tools/runner.rb +0 -35
- data/lib/ehbrs/tools/runner/vg.rb +0 -26
- data/lib/ehbrs/tools/runner/vg/ips.rb +0 -90
- data/lib/ehbrs/tools/runner/videos.rb +0 -25
- data/lib/ehbrs/tools/runner/videos/unsupported.rb +0 -65
- data/vendor/eac_ruby_utils/lib/eac_ruby_utils/filesystem_traverser.rb +0 -56
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'eac_ruby_utils/custom_format'
|
5
|
+
require 'ehbrs/vg/wii/wit/parsers/dump'
|
6
|
+
require 'ehbrs/vg/wii/wit/path'
|
7
|
+
require 'pathname'
|
8
|
+
|
9
|
+
module Ehbrs
|
10
|
+
module Vg
|
11
|
+
module Wii
|
12
|
+
class GameFile < ::Pathname
|
13
|
+
enable_simple_cache
|
14
|
+
|
15
|
+
FORMAT = ::EacRubyUtils::CustomFormat.new(
|
16
|
+
b: :basename,
|
17
|
+
d: :dirname,
|
18
|
+
e: :extname,
|
19
|
+
i: :id6,
|
20
|
+
n: :disc_name,
|
21
|
+
t: :database_title,
|
22
|
+
T: :disc_type
|
23
|
+
)
|
24
|
+
|
25
|
+
def database_title
|
26
|
+
properties.fetch('DB title')
|
27
|
+
end
|
28
|
+
|
29
|
+
def disc_name
|
30
|
+
properties.fetch('Disc name')
|
31
|
+
end
|
32
|
+
|
33
|
+
def disc_type
|
34
|
+
properties.fetch('File & disc type/type')
|
35
|
+
end
|
36
|
+
|
37
|
+
def format(string)
|
38
|
+
FORMAT.format(string).with(self)
|
39
|
+
end
|
40
|
+
|
41
|
+
def id6
|
42
|
+
properties.fetch('Disc & part IDs/disc')
|
43
|
+
end
|
44
|
+
|
45
|
+
def valid?
|
46
|
+
properties.present?
|
47
|
+
end
|
48
|
+
|
49
|
+
def wit_path
|
50
|
+
::Ehbrs::Vg::Wii::Wit::Path.new(disc_type, self)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def properties_uncached
|
56
|
+
r = ::Ehbrs::Executables.wit.command.append(['dump', to_s]).execute
|
57
|
+
return nil unless r.fetch(:exit_code).zero?
|
58
|
+
|
59
|
+
::Ehbrs::Vg::Wii::Wit::Parsers::Dump.new(r.fetch(:stdout)).properties
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'ehbrs/executables'
|
5
|
+
require 'ehbrs/vg/wii/wit/parsers/info'
|
6
|
+
|
7
|
+
module Ehbrs
|
8
|
+
module Vg
|
9
|
+
module Wii
|
10
|
+
module Wit
|
11
|
+
class ImageFormat
|
12
|
+
class << self
|
13
|
+
SECTION_NAME_PATTERN = /\A#{::Regexp.quote('IMAGE-FORMAT:')}(.+)\z/.freeze
|
14
|
+
|
15
|
+
enable_simple_cache
|
16
|
+
|
17
|
+
def by_name(name)
|
18
|
+
all.find { |i| i.name.downcase == name.to_s.downcase } ||
|
19
|
+
raise(::ArgumentError, "Image not found with name \"#{name.to_s.downcase}\"" \
|
20
|
+
" (Available: #{all.map(&:name).join(', ')})")
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def all_uncached
|
26
|
+
::Ehbrs::Vg::Wii::Wit::Parsers::Info.new(info_output).images.map do |_label, data|
|
27
|
+
new(
|
28
|
+
*%w[name info option].map { |k| data.fetch(k) },
|
29
|
+
*%w[extensions attributes].map { |k| data.fetch(k).to_s.split(/\s+/) }
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def info_output
|
35
|
+
::Ehbrs::Executables.wit.command
|
36
|
+
.append(%w[info image-format --sections])
|
37
|
+
.execute!
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
common_constructor :name, :description, :option, :extensions, :attributes
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module Ehbrs
|
6
|
+
module Vg
|
7
|
+
module Wii
|
8
|
+
module Wit
|
9
|
+
module Parsers
|
10
|
+
class Dump
|
11
|
+
enable_simple_cache
|
12
|
+
common_constructor :output
|
13
|
+
|
14
|
+
FILE_DISC_TYPE_PATTERN = %r{\A(\S+)/(\S+)\s+&\s+(\S+)\z}.freeze
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def properties_uncached
|
19
|
+
r = {}
|
20
|
+
output.each_line do |line|
|
21
|
+
dump_output_line_to_hash(line).if_present { |v| r.merge!(v) }
|
22
|
+
end
|
23
|
+
r
|
24
|
+
end
|
25
|
+
|
26
|
+
def dump_output_line_to_hash(line)
|
27
|
+
m = /\A\s*([^:]+):\s+(.+)\z/.match(line.strip)
|
28
|
+
return nil unless m
|
29
|
+
|
30
|
+
parse_attribute(m[1].strip, m[2].strip)
|
31
|
+
end
|
32
|
+
|
33
|
+
def line_method_parser(label)
|
34
|
+
"parse_#{label}".parameterize.underscore
|
35
|
+
end
|
36
|
+
|
37
|
+
def parse_attribute(label, value)
|
38
|
+
method = line_method_parser(label)
|
39
|
+
return { label => value } unless respond_to?(method, true)
|
40
|
+
|
41
|
+
send(method, value).map { |k, v| ["#{label}/#{k}", v] }.to_h
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_file_disc_type(value)
|
45
|
+
FILE_DISC_TYPE_PATTERN
|
46
|
+
.match(value)
|
47
|
+
.if_present { |m| { type: m[1], platform_acronym: m[2], platform_name: m[3] } }
|
48
|
+
.if_blank { raise "\"#{FILE_DISC_TYPE_PATTERN}\" does not match \"#{value}\"" }
|
49
|
+
end
|
50
|
+
|
51
|
+
def parse_disc_part_ids(value)
|
52
|
+
value.split(',').map(&:strip).map do |v|
|
53
|
+
r = v.split('=')
|
54
|
+
[r[0].strip, r[1].strip]
|
55
|
+
end.to_h
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'ehbrs/executables'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'inifile'
|
7
|
+
|
8
|
+
module Ehbrs
|
9
|
+
module Vg
|
10
|
+
module Wii
|
11
|
+
module Wit
|
12
|
+
module Parsers
|
13
|
+
class Info
|
14
|
+
SECTION_NAME_PATTERN = /\A#{::Regexp.quote('IMAGE-FORMAT:')}(.+)\z/.freeze
|
15
|
+
|
16
|
+
enable_simple_cache
|
17
|
+
common_constructor :output
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def images_uncached
|
22
|
+
ini = ::IniFile.new(content: output)
|
23
|
+
r = {}
|
24
|
+
ini.sections.each do |section_name|
|
25
|
+
image_section_name = parse_image_section_name(section_name)
|
26
|
+
r[image_section_name] = ini[section_name] if image_section_name.present?
|
27
|
+
end
|
28
|
+
r
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse_image_section_name(section_name)
|
32
|
+
SECTION_NAME_PATTERN.match(section_name).if_present { |m| m[1] }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module Ehbrs
|
6
|
+
module Vg
|
7
|
+
module Wii
|
8
|
+
module Wit
|
9
|
+
class Path
|
10
|
+
WIT_PATH_PATTERN = /\A(?:([a-z0-9]+):)?(.+)\z/i.freeze
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def assert(source)
|
14
|
+
source = parse(source) unless source.is_a?(self)
|
15
|
+
source
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse(path)
|
19
|
+
WIT_PATH_PATTERN
|
20
|
+
.match(path)
|
21
|
+
.if_present { |m| new(m[1], m[2]) }
|
22
|
+
.if_blank { raise "\"#{WIT_PATH_PATTERN}\" does not match \"#{path}\"" }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
common_constructor :type, :path do
|
27
|
+
self.type = type.to_s.upcase
|
28
|
+
self.path = ::Pathname.new(path.to_s)
|
29
|
+
end
|
30
|
+
|
31
|
+
def change?(other)
|
32
|
+
type_change?(other) || path_change?(other)
|
33
|
+
end
|
34
|
+
|
35
|
+
def path_change?(other)
|
36
|
+
path.expand_path.to_s != other.path.expand_path.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_s
|
40
|
+
r = path.to_s
|
41
|
+
r = "#{type.to_s.upcase}:#{r}" if type.present?
|
42
|
+
r
|
43
|
+
end
|
44
|
+
|
45
|
+
def type_change?(other)
|
46
|
+
return false if other.type.blank?
|
47
|
+
return true if type.blank?
|
48
|
+
|
49
|
+
type != other.type
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'eac_ruby_utils/
|
3
|
+
require 'eac_ruby_utils/fs/traversable'
|
4
4
|
require 'eac_ruby_utils/core_ext'
|
5
5
|
require 'ehbrs/videos/unsupported/file'
|
6
6
|
|
@@ -8,7 +8,9 @@ module Ehbrs
|
|
8
8
|
module Videos
|
9
9
|
module Unsupported
|
10
10
|
class Search
|
11
|
+
include ::EacRubyUtils::Fs::Traversable
|
11
12
|
enable_console_speaker
|
13
|
+
enable_simple_cache
|
12
14
|
|
13
15
|
VALID_EXTENSIONS = %w[.avi .mp4 .mkv .m4v].freeze
|
14
16
|
|
@@ -21,22 +23,23 @@ module Ehbrs
|
|
21
23
|
run
|
22
24
|
end
|
23
25
|
|
26
|
+
def traverser_recursive
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def traverser_sort
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
24
34
|
private
|
25
35
|
|
26
36
|
def run
|
27
37
|
start_banner
|
28
|
-
|
29
|
-
traverser.recursive = true
|
30
|
-
traverser.check_file = method(:check_file)
|
31
|
-
traverser.check_path(@root)
|
38
|
+
traverser_check_path(@root)
|
32
39
|
end_banner
|
33
40
|
end
|
34
41
|
|
35
|
-
def
|
36
|
-
true
|
37
|
-
end
|
38
|
-
|
39
|
-
def check_file(file)
|
42
|
+
def traverser_check_file(file)
|
40
43
|
@files += 1
|
41
44
|
check_video(file) if video_file?(file)
|
42
45
|
end
|
@@ -1,24 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module EacRubyUtils
|
4
|
-
require 'eac_ruby_utils/arguments_consumer'
|
5
|
-
require 'eac_ruby_utils/by_reference'
|
6
|
-
require 'eac_ruby_utils/configs'
|
7
|
-
require 'eac_ruby_utils/console'
|
8
|
-
require 'eac_ruby_utils/contextualizable'
|
9
|
-
require 'eac_ruby_utils/core_ext'
|
10
|
-
require 'eac_ruby_utils/envs'
|
11
|
-
require 'eac_ruby_utils/filesystem_cache'
|
12
|
-
require 'eac_ruby_utils/filesystem_traverser'
|
13
|
-
require 'eac_ruby_utils/fs_cache'
|
14
|
-
require 'eac_ruby_utils/listable'
|
15
|
-
require 'eac_ruby_utils/options_consumer'
|
16
|
-
require 'eac_ruby_utils/settings_provider'
|
17
|
-
require 'eac_ruby_utils/patch'
|
18
|
-
require 'eac_ruby_utils/patches'
|
19
|
-
require 'eac_ruby_utils/paths_hash'
|
20
4
|
require 'eac_ruby_utils/require_sub'
|
21
|
-
|
22
|
-
require 'eac_ruby_utils/simple_cache'
|
23
|
-
require 'eac_ruby_utils/yaml'
|
5
|
+
::EacRubyUtils.require_sub __FILE__
|
24
6
|
end
|
@@ -7,7 +7,7 @@ module EacRubyUtils
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def method_missing(method_name, *arguments, &block)
|
10
|
-
return object.send(method_name, *arguments) if object.respond_to?(method_name)
|
10
|
+
return object.send(method_name, *arguments, &block) if object.respond_to?(method_name)
|
11
11
|
|
12
12
|
super
|
13
13
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EacRubyUtils
|
4
|
+
# A formatter like [String.sprintf].
|
5
|
+
class CustomFormat
|
6
|
+
TYPE_PATTERN = /[a-zA-Z]/.freeze
|
7
|
+
SEQUENCE_PATTERN = /(?<!%)%(#{TYPE_PATTERN})/.freeze
|
8
|
+
|
9
|
+
attr_reader :mapping
|
10
|
+
|
11
|
+
def initialize(mapping)
|
12
|
+
@mapping = mapping.map { |k, v| [k.to_sym, v] }.to_h.freeze
|
13
|
+
end
|
14
|
+
|
15
|
+
def format(string)
|
16
|
+
::EacRubyUtils::CustomFormat::String.new(self, string)
|
17
|
+
end
|
18
|
+
|
19
|
+
class String
|
20
|
+
attr_reader :format, :string
|
21
|
+
|
22
|
+
def initialize(format, string)
|
23
|
+
@format = format
|
24
|
+
@string = string
|
25
|
+
end
|
26
|
+
|
27
|
+
def mapping
|
28
|
+
@mapping ||= format.mapping.select do |k, _v|
|
29
|
+
sequences.include?(k)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def sequences
|
34
|
+
@sequences ||= string.scan(SEQUENCE_PATTERN).map(&:first).uniq.map(&:to_sym)
|
35
|
+
end
|
36
|
+
|
37
|
+
def source_object_value(object, method)
|
38
|
+
return object.send(method) if object.respond_to?(method)
|
39
|
+
return object[method] if object.respond_to?('[]')
|
40
|
+
|
41
|
+
raise ::ArgumentError, "Methods \"#{method}\" or \"[]\" not found for #{object}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def with(source_object)
|
45
|
+
r = string
|
46
|
+
mapping.each do |key, method|
|
47
|
+
r = r.gsub(/%#{::Regexp.quote(key)}/, source_object_value(source_object, method).to_s)
|
48
|
+
end
|
49
|
+
r.gsub('%%', '%')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -4,6 +4,7 @@ require 'active_support/core_ext/hash/indifferent_access'
|
|
4
4
|
require 'eac_ruby_utils/console/speaker'
|
5
5
|
require 'eac_ruby_utils/envs/command/extra_options'
|
6
6
|
require 'eac_ruby_utils/envs/process'
|
7
|
+
require 'eac_ruby_utils/envs/spawn'
|
7
8
|
require 'pp'
|
8
9
|
require 'shellwords'
|
9
10
|
|
@@ -69,6 +70,12 @@ module EacRubyUtils
|
|
69
70
|
r
|
70
71
|
end
|
71
72
|
|
73
|
+
def spawn(options = {})
|
74
|
+
c = command(options)
|
75
|
+
puts "SPAWN: #{c}".light_red if debug?
|
76
|
+
::EacRubyUtils::Envs::Spawn.new(c)
|
77
|
+
end
|
78
|
+
|
72
79
|
def system!(options = {})
|
73
80
|
return if system(options)
|
74
81
|
|