ehbrs_ruby_utils 0.16.1 → 0.17.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: 248e8e66248825fd3c183caa3a5f24d0887ff5aff0522fcd4e5cabe270881b09
4
- data.tar.gz: fc395fe779b480bd8d3ce45f7c87a95a322478024e810a35887e2a625f05d211
3
+ metadata.gz: 678c73f950762bef38a405dc8000777e7be1801e1f5b2269bb2650d960d85054
4
+ data.tar.gz: 617b5092066e951579b0f3d72777d52dfc1947cd0d6e0868f43fbfef49d39a6c
5
5
  SHA512:
6
- metadata.gz: 2f0b5100010b034b30c5986f5f24d92b8ff77ed1ddbd6984f6600c2089746b30bf967ef5c6958df8cdd7b089204f871aa3ef79c31f5b2b58c35dcc66746c4c0e
7
- data.tar.gz: ffc7fd0468c1c278b3e6003f149b3cbd9e215fcbfcddbb39f3666b0b10eef8be77da78f674938fa5be8f1745f4dadb9c3329886abfca767a4d95a62572a75494
6
+ metadata.gz: 3c20bd80670e01c298019d4249e6c7cc47fcb9652ad1f8fb2a56d46fd603ae819c6ddf9f4d8528b6fe777d66145ad4533495ccb5045fda1c07a13e3495a1fed1
7
+ data.tar.gz: c80de348a43e2203c3f604701baa71b90735988aad3f9efde8ed1a82e1f998872f58eaf8ed2cbd66cead96c29f13e7e13e743fa5845b23a6c74c54f48abd7c9b
@@ -14,7 +14,7 @@ module EhbrsRubyUtils
14
14
  s = total_i <=> other.total_i
15
15
  return s unless s.zero?
16
16
 
17
- other.label <=> label
17
+ label <=> other.label
18
18
  end
19
19
 
20
20
  def remaining?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EhbrsRubyUtils
4
- VERSION = '0.16.1'
4
+ VERSION = '0.17.0'
5
5
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/videos/series/rename/line_result_group'
4
+ require 'ehbrs_ruby_utils/videos/series/rename/season_group'
5
+
6
+ module EhbrsRubyUtils
7
+ module Videos
8
+ module Series
9
+ module Rename
10
+ class DirectoryGroup < LineResultGroup
11
+ def line_out
12
+ name.to_s.colorize(:light_yellow)
13
+ end
14
+
15
+ protected
16
+
17
+ def child_key
18
+ :season
19
+ end
20
+
21
+ def child_class
22
+ ::EhbrsRubyUtils::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_ruby_utils/videos/series/rename/line_result'
4
+
5
+ module EhbrsRubyUtils
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ class File < ::EhbrsRubyUtils::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,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EhbrsRubyUtils
4
+ module Videos
5
+ module Series
6
+ module Rename
7
+ class File
8
+ class Options
9
+ common_constructor :options
10
+ delegate :kernel, :confirm, :recursive, :extension, to: :options
11
+
12
+ def episode_increment
13
+ options.episode_increment.if_present(0, &:to_i)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ class File
10
+ class Renamer
11
+ enable_speaker
12
+ common_constructor :owner
13
+ delegate :current_name, :dirname, :file, :new_name, to: :owner
14
+
15
+ def perform
16
+ return unless rename?
17
+
18
+ version_number = 0
19
+ loop do
20
+ target_path = dirname.join(build_target_name(version_number))
21
+ break perform_rename(target_path) unless target_path.exist?
22
+
23
+ version_number += 1
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def build_target_name(version_number)
30
+ return new_name unless version_number.positive?
31
+
32
+ extname = ::File.extname(new_name)
33
+ "#{::File.basename(new_name, extname)}.v#{version_number}#{extname}"
34
+ end
35
+
36
+ def perform_rename(target_path)
37
+ infov 'Renaming', file.to_path
38
+ ::FileUtils.mv(file.to_path, target_path.to_path)
39
+ end
40
+
41
+ def rename?
42
+ return false unless new_name
43
+
44
+ current_name != new_name
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/fs/extname'
4
+ require 'ehbrs_ruby_utils/videos/series/rename/line_result'
5
+ require 'ostruct'
6
+
7
+ module EhbrsRubyUtils
8
+ module Videos
9
+ module Series
10
+ module Rename
11
+ class File < ::EhbrsRubyUtils::Videos::Series::Rename::LineResult
12
+ require_sub __FILE__, include_modules: true
13
+
14
+ common_constructor :file, :options do
15
+ self.file = file.to_pathname.expand_path
16
+ self.options = ::OpenStruct.new(options) if options.is_a?(::Hash)
17
+ end
18
+
19
+ # @return [String]
20
+ def current_name
21
+ file.basename.to_path
22
+ end
23
+
24
+ def rename
25
+ EhbrsRubyUtils::Videos::Series::Rename::File::Renamer.new(self).perform
26
+ end
27
+
28
+ def season
29
+ return '??' if parse.blank?
30
+
31
+ parse.fetch(:s)
32
+ end
33
+
34
+ def episode
35
+ return '??' if parse.blank?
36
+
37
+ parse.fetch(:e)
38
+ end
39
+
40
+ # @return [Pathname]
41
+ def dirname
42
+ d = file
43
+ until d.root?
44
+ d = d.dirname
45
+ return d unless d.basename.to_path.starts_with?('_')
46
+ end
47
+ raise "series_dirname not found for #{file.to_path}"
48
+ end
49
+
50
+ def line_out
51
+ "#{episode.green}: " + if new_name == current_name
52
+ current_name.light_black
53
+ else
54
+ "#{new_name} <= #{current_name}"
55
+ end
56
+ end
57
+
58
+ def new_name
59
+ return "#{kernel}-s#{parse[:s]}e#{new_name_episodes}#{extension}" if parse.present?
60
+
61
+ current_name
62
+ end
63
+
64
+ private
65
+
66
+ def kernel
67
+ options.kernel || kernel_from_directory_name ||
68
+ raise("Kernel undefined (File: #{file.to_path})")
69
+ end
70
+
71
+ def kernel_from_directory_name
72
+ dir = dirname.basename.to_path.sub(/\([0-9]+\)/, '')
73
+ dir.split(/\W+/).select { |w| /\A[a-z0-9]/.match(w) }.map { |p| p[0].downcase }.join('')
74
+ end
75
+
76
+ def extension
77
+ return options.extension if options.extension
78
+
79
+ extension_by_directory || ::EacRubyUtils::Fs.extname2(current_name)
80
+ end
81
+
82
+ def extension_by_directory
83
+ r = ::File.dirname(current_name)
84
+ return nil if r == '.'
85
+
86
+ r.gsub(/\A_/, '.')
87
+ end
88
+
89
+ def source_episodes
90
+ parse[:e].split('-').map(&:to_i)
91
+ end
92
+
93
+ def new_name_episodes
94
+ source_episodes.map do |i|
95
+ (i + options.episode_increment).to_s.rjust(2, '0')
96
+ end.join('-')
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ class LineResult
10
+ enable_simple_cache
11
+ enable_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 EhbrsRubyUtils
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ class LineResultGroup < ::EhbrsRubyUtils::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_ruby_utils/videos/series/rename/directory_group'
4
+ require 'ehbrs_ruby_utils/videos/series/rename/line_result_group'
5
+
6
+ module EhbrsRubyUtils
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
+ ::EhbrsRubyUtils::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 EhbrsRubyUtils
6
+ module Videos
7
+ module Series
8
+ module Rename
9
+ class SeasonGroup < ::EhbrsRubyUtils::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 EhbrsRubyUtils
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 EhbrsRubyUtils
6
+ module Videos
7
+ module Series
8
+ require_sub __FILE__
9
+ end
10
+ end
11
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ehbrs_ruby_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.1
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo H. Bogoni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-24 00:00:00.000000000 Z
11
+ date: 2022-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha-parsers
@@ -193,6 +193,17 @@ files:
193
193
  - lib/ehbrs_ruby_utils/videos/convert_job.rb
194
194
  - lib/ehbrs_ruby_utils/videos/quality.rb
195
195
  - lib/ehbrs_ruby_utils/videos/resolution.rb
196
+ - lib/ehbrs_ruby_utils/videos/series.rb
197
+ - lib/ehbrs_ruby_utils/videos/series/rename.rb
198
+ - lib/ehbrs_ruby_utils/videos/series/rename/directory_group.rb
199
+ - lib/ehbrs_ruby_utils/videos/series/rename/file.rb
200
+ - lib/ehbrs_ruby_utils/videos/series/rename/file/basename_parser.rb
201
+ - lib/ehbrs_ruby_utils/videos/series/rename/file/options.rb
202
+ - lib/ehbrs_ruby_utils/videos/series/rename/file/renamer.rb
203
+ - lib/ehbrs_ruby_utils/videos/series/rename/line_result.rb
204
+ - lib/ehbrs_ruby_utils/videos/series/rename/line_result_group.rb
205
+ - lib/ehbrs_ruby_utils/videos/series/rename/results_builder.rb
206
+ - lib/ehbrs_ruby_utils/videos/series/rename/season_group.rb
196
207
  - lib/ehbrs_ruby_utils/videos/stream.rb
197
208
  - lib/ehbrs_ruby_utils/web_utils.rb
198
209
  - lib/ehbrs_ruby_utils/web_utils/instance.rb