ehbrs-tools 0.9.0 → 0.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 29e80eafdb451c5637bfcafbb89ccb3cb13c157d97f8e6f0098af5ff6f512837
4
- data.tar.gz: 1580aa74f7e23b3af4a55f32499044d54a2e0e41d3f97e4dd96565f3faf10d31
3
+ metadata.gz: ffc4f5477aac7e6c40bc373d77e239599afaf91fe96f8f1b4c2248a4da8d7fa4
4
+ data.tar.gz: 7950f28d7c9222ce50c645cc4ee36c8be3e45bcaf89cc03cf8fcf1c6355cf88b
5
5
  SHA512:
6
- metadata.gz: 9ad21b21deec42c02fcc510bf1fae9a6c397d96f86922db35e82dbeec98336b9d6a1790f34ca92d199c1916074a2cec29be5233a8154e2f13ead0ff8722a1bad
7
- data.tar.gz: 7b8638979d00c8546c2b89386704bd09c2950561fb38267624357e4e640d45b6aa8685ba09d80ecf017acf8b8cdc174ac4923ee4a529b69687f875cf40b27014
6
+ metadata.gz: 3179aedf31490fc080ff805c6418c38477a7a7575d18415a8081beba23162f7e42efbb50c553deb871df640d1fc1d2f997a4f53caaf39cdb7a453ded3a6f65fd
7
+ data.tar.gz: 0532f3b45ad4014d11dab09e5947c95da727a0422806ad29f9125011d7b0722fc94e3e89b1f8317aeed76cab96a5a857e08fb68c61785830e858ba925cd75b38
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_cli/default_runner'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'eac_ruby_utils/console/docopt_runner'
6
+ require 'ehbrs/videos/series/rename/file'
7
+ require 'ehbrs/videos/series/rename/file/options'
8
+ require 'ehbrs/videos/series/rename/results_builder'
9
+
10
+ module Ehbrs
11
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
12
+ class Videos < ::EacRubyUtils::Console::DocoptRunner
13
+ class Series < ::EacRubyUtils::Console::DocoptRunner
14
+ class Rename < ::EacRubyUtils::Console::DocoptRunner
15
+ include ::EacCli::DefaultRunner
16
+ include ::EacRubyUtils::Fs::Traversable
17
+
18
+ runner_definition do
19
+ desc 'Renomeia arquivos de séries.'
20
+ bool_opt '-r', '--recursive', 'Recursivo.'
21
+ bool_opt '-c', '--confirm', 'Confirmação a renomeação.'
22
+ arg_opt '-k', '--kernel', 'Determina o kernel para os nomes dos arquivos.'
23
+ arg_opt '-E', '--extension', 'Substitui a extensão dos arquivos.'
24
+ arg_opt '-e', '--episode-increment', 'Aumenta o número do episódio.'
25
+ pos_arg 'paths', repeat: true, optional: true
26
+ end
27
+
28
+ def run
29
+ banner
30
+ show_results
31
+ rename_files
32
+ end
33
+
34
+ def banner
35
+ infov 'Paths', paths.count
36
+ infov 'Files found', files.count
37
+ end
38
+
39
+ def files_uncached
40
+ @files = []
41
+ paths.each { |path| traverser_check_path(path) }
42
+ @files
43
+ end
44
+
45
+ def paths
46
+ options.fetch('<paths>').if_present(['.'])
47
+ end
48
+
49
+ def traverser_recursive
50
+ options.fetch('--recursive')
51
+ end
52
+
53
+ def traverser_check_file(path)
54
+ @files << ::Ehbrs::Videos::Series::Rename::File.new(path, series_file_options)
55
+ end
56
+
57
+ def series_file_options_uncached
58
+ ::Ehbrs::Videos::Series::Rename::File::Options.new(options)
59
+ end
60
+
61
+ def show_results
62
+ ::Ehbrs::Videos::Series::Rename::ResultsBuilder.new(files).show(0)
63
+ end
64
+
65
+ def rename_files
66
+ return unless series_file_options.confirm
67
+
68
+ infom 'Renaming files...'
69
+ files.each(&:rename)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_cli/default_runner'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'eac_ruby_utils/console/docopt_runner'
6
+
7
+ module Ehbrs
8
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
9
+ class Videos < ::EacRubyUtils::Console::DocoptRunner
10
+ class Series < ::EacRubyUtils::Console::DocoptRunner
11
+ include ::EacCli::DefaultRunner
12
+ require_sub __FILE__
13
+
14
+ runner_definition do
15
+ desc 'Ferramentas para seriados.'
16
+ subcommands
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ehbrs
4
4
  module Tools
5
- VERSION = '0.9.0'
5
+ VERSION = '0.10.0'
6
6
  end
7
7
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs/videos/series/rename/line_result_group'
4
+ require 'ehbrs/videos/series/rename/season_group'
5
+
6
+ module Ehbrs
7
+ module Videos
8
+ module Series
9
+ module Rename
10
+ class DirectoryGroup < LineResultGroup
11
+ def line_out
12
+ name.light_yellow
13
+ end
14
+
15
+ protected
16
+
17
+ def child_key
18
+ :season
19
+ end
20
+
21
+ def child_class
22
+ ::Ehbrs::Videos::Series::Rename::SeasonGroup
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs/videos/series/rename/line_result'
4
+
5
+ module Ehbrs
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ class File < ::Ehbrs::Videos::Series::Rename::LineResult
10
+ module BasenameParser
11
+ FORMATS = [{
12
+ format: /(\d+)(\d{2})(\d{2})/i,
13
+ build: ->(m) { { s: padding(m[1]), e: padding(m[2]) + '-' + padding(m[3]) } }
14
+ }, {
15
+ format: /s(\d+)e(\d+)-(\d+)/i,
16
+ build: ->(m) { { s: padding(m[1]), e: padding(m[2]) + '-' + padding(m[3]) } }
17
+ }, {
18
+ format: /(\d{1,2})\s*[^\d]\s*(\d{2})/i,
19
+ build: ->(m) { { s: padding(m[1]), e: padding(m[2]) } }
20
+ }, {
21
+ format: /(\d+)(\d{2})/i,
22
+ build: ->(m) { { s: padding(m[1]), e: padding(m[2]) } }
23
+ }, {
24
+ format: /(\d{2})/i,
25
+ build: ->(m) { { s: padding(1), e: padding(m[1]) } }
26
+ }].freeze
27
+
28
+ def self.padding(string)
29
+ string.to_s.rjust(2, '0')
30
+ end
31
+
32
+ def parse_uncached
33
+ FORMATS.each do |format|
34
+ m = format.fetch(:format).match(current_name)
35
+ return format.fetch(:build).call(m) if m
36
+ end
37
+ nil
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ehbrs
4
+ module Videos
5
+ module Series
6
+ module Rename
7
+ class File
8
+ class Options
9
+ def initialize(docopt_runner_options)
10
+ @options = docopt_runner_options
11
+ end
12
+
13
+ %w[kernel confirm recursive extension].each do |method|
14
+ class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
15
+ def #{method}
16
+ @options.fetch('--#{method}')
17
+ end
18
+ RUBY_EVAL
19
+ end
20
+
21
+ def episode_increment
22
+ r = @options.fetch('--episode-increment')
23
+ r.present? ? r.to_i : 0
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/fs/extname'
4
+ require 'ostruct'
5
+ require_relative 'line_result'
6
+ require_relative 'file/basename_parser'
7
+
8
+ module Ehbrs
9
+ module Videos
10
+ module Series
11
+ module Rename
12
+ class File < ::Ehbrs::Videos::Series::Rename::LineResult
13
+ include ::Ehbrs::Videos::Series::Rename::File::BasenameParser
14
+
15
+ attr_reader :file, :options
16
+
17
+ def initialize(file, options)
18
+ @file = file
19
+ @options = options
20
+ @options = ::OpenStruct.new(options) if options.is_a?(::Hash)
21
+ end
22
+
23
+ def rename
24
+ target = ::File.expand_path(new_name, dirname)
25
+ return if ::File.exist?(target)
26
+
27
+ infov 'Renaming', @file
28
+ FileUtils.mv(@file, target)
29
+ end
30
+
31
+ def season
32
+ return '??' if parse.blank?
33
+
34
+ parse.fetch(:s)
35
+ end
36
+
37
+ def episode
38
+ return '??' if parse.blank?
39
+
40
+ parse.fetch(:e)
41
+ end
42
+
43
+ def dirname
44
+ d = @file
45
+ while d != '/'
46
+ d = ::File.dirname(d)
47
+ return ::File.expand_path(d) + '/' unless ::File.basename(d).starts_with?('_')
48
+ end
49
+ raise "series_dirname not found for #{@file}"
50
+ end
51
+
52
+ def line_out
53
+ "#{episode.green}: " + if new_name == current_name
54
+ current_name.light_black
55
+ else
56
+ "#{new_name} <= #{current_name}"
57
+ end
58
+ end
59
+
60
+ def new_name
61
+ return "#{kernel}-s#{parse[:s]}e#{new_name_episodes}#{extension}" if parse.present?
62
+
63
+ current_name
64
+ end
65
+
66
+ private
67
+
68
+ def current_name
69
+ ::File.expand_path(@file).gsub(/\A#{::Regexp.quote(dirname)}/, '')
70
+ end
71
+
72
+ def rename?
73
+ return false unless new_name
74
+
75
+ current_name != new_name
76
+ end
77
+
78
+ def kernel
79
+ options.kernel || kernel_from_directory_name ||
80
+ raise("Kernel undefined (File: #{@file})")
81
+ end
82
+
83
+ def kernel_from_directory_name
84
+ dir = ::File.basename(dirname).sub(/\([0-9]+\)/, '')
85
+ dir.split(/\W+/).select { |w| /\A[a-z0-9]/.match(w) }.map { |p| p[0].downcase }.join('')
86
+ end
87
+
88
+ def extension
89
+ return options.extension if options.extension
90
+
91
+ extension_by_directory || ::EacRubyUtils::Fs.extname2(current_name)
92
+ end
93
+
94
+ def extension_by_directory
95
+ r = ::File.dirname(current_name)
96
+ return nil if r == '.'
97
+
98
+ r.gsub(/\A_/, '.')
99
+ end
100
+
101
+ def source_episodes
102
+ parse[:e].split('-').map(&:to_i)
103
+ end
104
+
105
+ def new_name_episodes
106
+ source_episodes.map do |i|
107
+ (i + options.episode_increment).to_s.rjust(2, '0')
108
+ end.join('-')
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Ehbrs
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ class LineResult
10
+ enable_simple_cache
11
+ enable_console_speaker
12
+
13
+ def show(level)
14
+ out(padding_level(level) + line_out + "\n")
15
+ end
16
+
17
+ private
18
+
19
+ def padding_level(level)
20
+ (' ' * level.to_i) + '* '
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'line_result'
4
+
5
+ module Ehbrs
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ class LineResultGroup < ::Ehbrs::Videos::Series::Rename::LineResult
10
+ attr_reader :name, :children
11
+
12
+ def initialize(name, files)
13
+ @name = name
14
+ @children = build_children(files)
15
+ end
16
+
17
+ def show(level)
18
+ super(level)
19
+ children.each do |child|
20
+ child.show(level + 1)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def build_children(files)
27
+ r = {}
28
+ files.each do |file|
29
+ key = file.send(child_key)
30
+ r[key] ||= []
31
+ r[key] << file
32
+ end
33
+ r.sort.map { |v| child_class.new(v[0], v[1]) }
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs/videos/series/rename/directory_group'
4
+ require 'ehbrs/videos/series/rename/line_result_group'
5
+
6
+ module Ehbrs
7
+ module Videos
8
+ module Series
9
+ module Rename
10
+ class ResultsBuilder < LineResultGroup
11
+ def initialize(files)
12
+ super '', files
13
+ end
14
+
15
+ def line_out
16
+ 'Groups: '.cyan + children.count.to_s
17
+ end
18
+
19
+ protected
20
+
21
+ def child_key
22
+ :dirname
23
+ end
24
+
25
+ def child_class
26
+ ::Ehbrs::Videos::Series::Rename::DirectoryGroup
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'line_result'
4
+
5
+ module Ehbrs
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ class SeasonGroup < ::Ehbrs::Videos::Series::Rename::LineResult
10
+ attr_reader :season, :files
11
+
12
+ def initialize(season, files)
13
+ @season = season
14
+ @files = files.sort_by { |f| [f.episode] }
15
+ end
16
+
17
+ def line_out
18
+ 'Season: '.cyan + "#{season} (#{first_episode} - #{last_episode})"
19
+ end
20
+
21
+ def show(level)
22
+ super
23
+ files.each { |file| file.show(level + 1) }
24
+ end
25
+
26
+ private
27
+
28
+ def first_episode
29
+ files.first.episode
30
+ end
31
+
32
+ def last_episode
33
+ files.last.episode
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Ehbrs
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ require_sub __FILE__
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Ehbrs
6
+ module Videos
7
+ module Series
8
+ require_sub __FILE__
9
+ end
10
+ end
11
+ end
@@ -20,5 +20,5 @@ Gem::Specification.new do |s|
20
20
  s.add_dependency 'colorize', '~> 0.8.1'
21
21
  s.add_dependency 'docopt', '~> 0.6.1'
22
22
  s.add_dependency 'net-ssh', '~> 4.2'
23
- s.add_development_dependency 'eac_ruby_gem_support', '~> 0.1'
23
+ s.add_development_dependency 'eac_ruby_gem_support', '~> 0.1', '>= 0.1.1'
24
24
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRubyUtils
4
+ module Fs
5
+ class << self
6
+ # A [File.extname] which find multiple extensions (Ex.: .tar.gz).
7
+ def extname(path, limit = -1)
8
+ recursive_extension(::File.basename(path), limit)
9
+ end
10
+
11
+ # Shortcut to +extname(2)+.
12
+ def extname2(path)
13
+ extname(path, 2)
14
+ end
15
+
16
+ private
17
+
18
+ def recursive_extension(basename, limit)
19
+ return '' if limit.zero?
20
+
21
+ m = /\A(.+)(\.[a-z][a-z0-9]*)\z/i.match(basename)
22
+ if m
23
+ "#{recursive_extension(m[1], limit - 1)}#{m[2]}"
24
+ else
25
+ ''
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyUtils
4
- VERSION = '0.32.0'
4
+ VERSION = '0.33.0'
5
5
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/fs/extname'
4
+
5
+ RSpec.describe ::EacRubyUtils::Fs do
6
+ describe '#extname' do
7
+ {
8
+ 'After.Life.S01E01.WEBRip.x264-ION10.mp4' => '.mp4',
9
+ 's01e01.en.srt' => '.en.srt',
10
+ 's01e01.srt' => '.srt',
11
+ '/path/to/file.tar.gz' => '.tar.gz'
12
+ }.each do |source, expected|
13
+ context "when source is \"#{source}\"" do
14
+ it { expect(described_class.extname(source)).to eq(expected) }
15
+ end
16
+ end
17
+ end
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ehbrs-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esquilo Azul Company
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-08 00:00:00.000000000 Z
11
+ date: 2020-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avm-tools
@@ -110,6 +110,8 @@ files:
110
110
  - lib/ehbrs/runner/vg/wii.rb
111
111
  - lib/ehbrs/runner/videos.rb
112
112
  - lib/ehbrs/runner/videos/extract.rb
113
+ - lib/ehbrs/runner/videos/series.rb
114
+ - lib/ehbrs/runner/videos/series/rename.rb
113
115
  - lib/ehbrs/runner/videos/unsupported.rb
114
116
  - lib/ehbrs/self.rb
115
117
  - lib/ehbrs/self/observers/used_space.rb
@@ -134,6 +136,16 @@ files:
134
136
  - lib/ehbrs/videos/file.rb
135
137
  - lib/ehbrs/videos/profiles/base.rb
136
138
  - lib/ehbrs/videos/profiles/same_quality.rb
139
+ - lib/ehbrs/videos/series.rb
140
+ - lib/ehbrs/videos/series/rename.rb
141
+ - lib/ehbrs/videos/series/rename/directory_group.rb
142
+ - lib/ehbrs/videos/series/rename/file.rb
143
+ - lib/ehbrs/videos/series/rename/file/basename_parser.rb
144
+ - lib/ehbrs/videos/series/rename/file/options.rb
145
+ - lib/ehbrs/videos/series/rename/line_result.rb
146
+ - lib/ehbrs/videos/series/rename/line_result_group.rb
147
+ - lib/ehbrs/videos/series/rename/results_builder.rb
148
+ - lib/ehbrs/videos/series/rename/season_group.rb
137
149
  - lib/ehbrs/videos/track.rb
138
150
  - lib/ehbrs/videos/unsupported/check_result.rb
139
151
  - lib/ehbrs/videos/unsupported/check_set.rb
@@ -206,6 +218,7 @@ files:
206
218
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/envs/ssh_env.rb
207
219
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/filesystem_cache.rb
208
220
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/fs.rb
221
+ - vendor/eac_ruby_utils/lib/eac_ruby_utils/fs/extname.rb
209
222
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/fs/temp.rb
210
223
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/fs/temp/directory.rb
211
224
  - vendor/eac_ruby_utils/lib/eac_ruby_utils/fs/temp/file.rb
@@ -275,6 +288,7 @@ files:
275
288
  - vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/envs/executable_spec.rb
276
289
  - vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/envs/ssh_env_spec.rb
277
290
  - vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/filesystem_cache_spec.rb
291
+ - vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/fs/extname_spec.rb
278
292
  - vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/fs/temp/temp_spec.rb
279
293
  - vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/fs/temp_spec.rb
280
294
  - vendor/eac_ruby_utils/spec/lib/eac_ruby_utils/listable_spec.rb