ehbrs_ruby_utils 0.16.1 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
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