ehbrs-tools 0.3.1 → 0.5.0
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/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
|
|