ehbrs_ruby_utils 0.8.1 → 0.12.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: 5d6cb980ddbefaeb57fc570c2af7fb1721d903c7dd5cdf7c468269cae3ae4d9c
4
- data.tar.gz: 8ffc551a05af9d27639ae417f0d2a7f7a35e994f085d1176043f380234c82b0e
3
+ metadata.gz: 06d0a1af5ebc96661f619963ffda32539b7d15a4d84e17fe17ba148b98cb674f
4
+ data.tar.gz: 3ab5bb3db004590e52e997539c0a81937dce524c89cb9952f192a27fcbd74eeb
5
5
  SHA512:
6
- metadata.gz: 4650b3b69114b36460338077f1e31d8663993f310daf754dfc6a4fe589871336bbcb609b86fd77a49822f19b0affaa1acf07c6c40739318e92ab9a9927c5cf9d
7
- data.tar.gz: 0a6f7f6ff9442baa6b8b6accd1064322a9422cc89bd863fcbbb7dcddeb63ec519b04a1978ee185f17c87e5ef30e2effb436606e87140563de14ff2d9fc29053c
6
+ metadata.gz: fd975103eb147ab5dbd728e01ebb4d42f930f353fe6efb7e3286c6048182345152866917031f65b801d5411d966e415f88819eaaab2116c51854db3ce7d61d29
7
+ data.tar.gz: 341d04b398d655aceb84181dd4f1131c0eda4e43fe5e7ea80f709344e1ac222d4190dd10a1fa782b3d2b3b9e5f1af1b90659fc839c5c743e01a3bcaa586e19bd
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'eac_templates/patches'
5
+ require 'ehbrs_ruby_utils/patches'
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/files/info'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module EhbrsRubyUtils
7
+ module Fs
8
+ class CompressedPackage < ::Avm::Files::Info
9
+ MIME_TYPES = {
10
+ 'application/zip' => :zip,
11
+ 'application/x-7z-compressed' => :sevenzip,
12
+ 'application/x-rar' => :rar,
13
+ 'application/x-tar' => :tar
14
+ }.freeze
15
+
16
+ def extract_to(target)
17
+ target = target.to_pathname
18
+ target.mkpath
19
+ sub_extract_to(target)
20
+ end
21
+
22
+ private
23
+
24
+ def sub_extract_to(target)
25
+ MIME_TYPES[content_type.mime_type].if_present do |v|
26
+ return send("#{v}_extract_command", target).execute!
27
+ end
28
+ raise "Unknown how to extract \"#{path}\" (#{content_type})"
29
+ end
30
+
31
+ def sevenzip_extract_command(target_dir)
32
+ ::Ehbrs::Executables.sevenzip.command('x', path, '-o', target_dir)
33
+ end
34
+
35
+ def tar_extract_command(target_dir)
36
+ ::Ehbrs::Executables.tar.command('-xf', path, '-C', target_dir)
37
+ end
38
+
39
+ def rar_extract_command(target_dir)
40
+ ::Ehbrs::Executables.rar.command('x', path.expand_path).chdir(target_dir)
41
+ end
42
+
43
+ def zip_extract_command(target_dir)
44
+ ::Ehbrs::Executables.unzip.command(path, '-d', target_dir)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'ehbrs_ruby_utils/fs/selected/build_file'
5
+
6
+ module EhbrsRubyUtils
7
+ module Fs
8
+ class Selected
9
+ class Build
10
+ DEFAULT_TARGET_BASENAME_PROC = ::Proc.new { |path| path.basename.to_path }
11
+
12
+ attr_reader :selected, :target_dir, :target_basename_proc
13
+
14
+ def initialize(selected, target_dir, &target_basename_proc)
15
+ @selected = selected
16
+ @target_dir = target_dir.to_pathname
17
+ @target_basename_proc = target_basename_proc.presence || DEFAULT_TARGET_BASENAME_PROC
18
+ end
19
+
20
+ def perform
21
+ clear_target_dir
22
+ link_selected_found
23
+ end
24
+
25
+ private
26
+
27
+ def clear_target_dir
28
+ target_dir.children.each do |c|
29
+ c.unlink if c.symlink? && c.directory?
30
+ end
31
+ end
32
+
33
+ def link_selected_found
34
+ selected.found.each do |found|
35
+ ::EhbrsRubyUtils::Fs::Selected::BuildFile.new(self, found).perform
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Fs
7
+ class Selected
8
+ class BuildFile
9
+ common_constructor :build, :path do
10
+ self.path = path.to_pathname
11
+ end
12
+
13
+ def perform
14
+ target_path.make_symlink(path)
15
+ end
16
+
17
+ def target_path
18
+ build.target_dir.join(target_basename)
19
+ end
20
+
21
+ def target_basename
22
+ build.target_basename_proc.call(path)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Fs
7
+ class Selected
8
+ require_sub __FILE__
9
+ DEFAULT_FILENAME = '.selected'
10
+
11
+ enable_listable
12
+ enable_simple_cache
13
+ lists.add_symbol :option, :filename, :target_name_builder
14
+ common_constructor :root_path, :options, default: [{}] do
15
+ self.root_path = root_path.to_pathname
16
+ self.options = self.class.lists.option.hash_keys_validate!(options)
17
+ end
18
+
19
+ def build(target_dir, &directory_target_basename)
20
+ ::EhbrsRubyUtils::Fs::Selected::Build.new(self, target_dir, &directory_target_basename)
21
+ end
22
+
23
+ def filename
24
+ options[OPTION_FILENAME].if_present(DEFAULT_FILENAME)
25
+ end
26
+
27
+ private
28
+
29
+ # @return [Pathname]
30
+ def found_uncached
31
+ root_path.glob("**/#{filename}").map(&:parent).sort
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ # Filesystem utilities.
7
+ module Fs
8
+ require_sub __FILE__
9
+ end
10
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+ require 'ehbrs_ruby_utils/music/lyrics_book/resource'
5
+
6
+ module EhbrsRubyUtils
7
+ module Music
8
+ class LyricsBook
9
+ class Album < ::EhbrsRubyUtils::Music::LyricsBook::Resource
10
+ enable_simple_cache
11
+
12
+ def book
13
+ parent
14
+ end
15
+
16
+ def first_previous
17
+ previous.if_present { |v| v.songs.last }
18
+ end
19
+
20
+ def valid?
21
+ songs.any?
22
+ end
23
+
24
+ def header_title
25
+ "#{songs.first.number}-#{songs.last.number} | #{artist} | #{title}"
26
+ end
27
+
28
+ def artist
29
+ songs.lazy.map { |v| v.tag.artist }.find(&:present?)
30
+ end
31
+
32
+ def title
33
+ songs.lazy.map { |v| v.tag.album }.find(&:present?)
34
+ end
35
+
36
+ def songs_uncached
37
+ ::EhbrsRubyUtils::Music::LyricsBook::Song.create_list(self, path.children)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Music
7
+ class LyricsBook
8
+ class Resource
9
+ class << self
10
+ def create_list(parent, files)
11
+ r = files.sort.map { |path| new(parent, path) }.select(&:valid?)
12
+ previous = parent.first_previous
13
+ r.map do |e|
14
+ e.reset_cache
15
+ e.previous = previous
16
+ previous = e
17
+ end
18
+ end
19
+ end
20
+
21
+ enable_simple_cache
22
+ include ::Comparable
23
+ common_constructor :parent, :path
24
+ attr_accessor :previous
25
+
26
+ def filename
27
+ path.relative_path_from(parent.path)
28
+ end
29
+
30
+ def <=>(other)
31
+ path <=> other.path
32
+ end
33
+
34
+ def link_to_header
35
+ "<a href=\"\##{header_id}\" id=\"#{index_id}\">#{header_title}</a>"
36
+ end
37
+
38
+ def index_id
39
+ "index_#{header_id}"
40
+ end
41
+
42
+ def header_id
43
+ header_title.variableize
44
+ end
45
+
46
+ def header_index
47
+ parent.header_index + 1
48
+ end
49
+
50
+ def output_main
51
+ ::EhbrsRubyUtils::Music::LyricsBook::Resource.erb_template('main.html.erb', binding)
52
+ end
53
+
54
+ def output_index
55
+ erb_template('index.html.erb')
56
+ end
57
+
58
+ def type
59
+ self.class.name.demodulize.underscore
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+ require 'ehbrs_ruby_utils/music/lyrics_book/resource'
5
+
6
+ module EhbrsRubyUtils
7
+ module Music
8
+ class LyricsBook
9
+ class Song < ::EhbrsRubyUtils::Music::LyricsBook::Resource
10
+ enable_simple_cache
11
+ delegate :book, to: :album
12
+ delegate :provider, to: :book
13
+ delegate :tag, :to_s, to: :container
14
+
15
+ def album
16
+ parent
17
+ end
18
+
19
+ def lyrics
20
+ fetch_lyrics unless lyrics_cached?
21
+ cached_lyrics
22
+ end
23
+
24
+ def valid?
25
+ tag.present?
26
+ end
27
+
28
+ def lyrics_cached?
29
+ lyrics_cache.cached?
30
+ end
31
+
32
+ def cached_lyrics
33
+ ::YAML.load_file(lyrics_cache.content_path)
34
+ end
35
+
36
+ def header_title
37
+ "#{number} - #{title}"
38
+ end
39
+
40
+ delegate :title, to: :tag
41
+
42
+ private
43
+
44
+ def container_uncached
45
+ ::EhbrsRubyUtils::Videos::Container.new(path)
46
+ end
47
+
48
+ def fetch_lyrics
49
+ lyrics = fetched_lyrics
50
+ lyrics_cache.write(lyrics.to_yaml)
51
+ end
52
+
53
+ def fetched_lyrics
54
+ container.lyrics_by_provider(provider)
55
+ end
56
+
57
+ def lyrics_cache
58
+ (%w[artist album title].map { |k| tag.send(k) } + [provider.identifier])
59
+ .inject(fs_cache) { |a, e| a.child(e) }
60
+ end
61
+
62
+ def number_uncached
63
+ previous.if_present(0, &:number) + 1
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Music
7
+ class LyricsBook
8
+ require_sub __FILE__
9
+
10
+ DEFAULT_PROVIDER_NAME = 'lyrics.com'
11
+ DEFAULT_TITLE = 'Letras de músicas'
12
+
13
+ enable_listable
14
+ lists.add_symbol :option, :provider_name, :title
15
+ enable_simple_cache
16
+ common_constructor :source_dir, :options, default: [{}] do
17
+ self.source_dir = source_dir.to_pathname
18
+ self.options = self.class.lists.option.hash_keys_validate!(options)
19
+ end
20
+
21
+ def first_previous
22
+ nil
23
+ end
24
+
25
+ def header_index
26
+ 1
27
+ end
28
+
29
+ def output
30
+ erb_template('main.html.erb')
31
+ end
32
+
33
+ def path
34
+ source_dir
35
+ end
36
+
37
+ def title
38
+ options[OPTION_TITLE].if_present(DEFAULT_TITLE)
39
+ end
40
+
41
+ private
42
+
43
+ def albums_directories_uncached
44
+ r = []
45
+ t = ::EacRubyUtils::Fs::Traverser.new
46
+ t.recursive = true
47
+ t.check_directory = ->(directory) { r << directory }
48
+ t.check_path(source_dir)
49
+ r
50
+ end
51
+
52
+ def albums_uncached
53
+ ::EhbrsRubyUtils::Music::LyricsBook::Album.create_list(self, albums_directories)
54
+ end
55
+
56
+ def provider_uncached
57
+ ::UltimateLyrics::Provider.by_name(provider_name)
58
+ end
59
+
60
+ def provider_name
61
+ options[OPTION_PROVIDER_NAME].if_present(DEFAULT_PROVIDER_NAME)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Music
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ ::EacRubyUtils.require_sub __FILE__
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ ::EacRubyUtils.require_sub __FILE__
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EhbrsRubyUtils
4
- VERSION = '0.8.1'
4
+ VERSION = '0.12.0'
5
5
  end
@@ -4,23 +4,49 @@ require 'eac_ruby_utils/core_ext'
4
4
  require 'ehbrs_ruby_utils/executables'
5
5
  require 'ehbrs_ruby_utils/videos/stream'
6
6
  require 'json'
7
+ require 'taglib'
8
+ require 'ultimate_lyrics/provider_search'
9
+ require 'ultimate_lyrics/song_metadata'
7
10
 
8
11
  module EhbrsRubyUtils
9
12
  module Videos
10
13
  class Container
14
+ class << self
15
+ def from_file(path)
16
+ new(path)
17
+ end
18
+ end
19
+
11
20
  enable_simple_cache
12
21
  common_constructor :path do
13
22
  self.path = path.to_pathname
14
23
  end
15
24
 
25
+ delegate :tag, to: :tag_file
26
+ delegate :to_s, to: :path
27
+
16
28
  ::EhbrsRubyUtils::Videos::Stream.lists.codec_type.each_value do |stream_type|
17
29
  define_method stream_type.to_s.pluralize do
18
30
  streams.select { |stream| stream.codec_type == stream_type }
19
31
  end
20
32
  end
21
33
 
34
+ # @param provider [UltimateLyrics::Provider]
35
+ # @return [UltimateLyrics::Lyrics]
36
+ def lyrics_by_provider(provider)
37
+ ::UltimateLyrics::ProviderSearch.new(provider, song_metadata).lyrics
38
+ end
39
+
22
40
  private
23
41
 
42
+ # @return [UltimateLyrics::SongMetadata]
43
+ def song_metadata_uncached
44
+ ::UltimateLyrics::SongMetadata.new(
45
+ ::UltimateLyrics::SongMetadata::Field.lists.sources.values
46
+ .map { |source| [source, tag.send(source)] }.to_h
47
+ )
48
+ end
49
+
24
50
  def probe_data_uncached
25
51
  ::JSON.parse(
26
52
  ::EhbrsRubyUtils::Executables.ffprobe.command(
@@ -34,6 +60,11 @@ module EhbrsRubyUtils
34
60
  ::EhbrsRubyUtils::Videos::Stream.new(stream_ffprobe_data)
35
61
  end
36
62
  end
63
+
64
+ # @return [TagLib::FileRef]
65
+ def tag_file_uncached
66
+ ::TagLib::FileRef.new(path.to_path)
67
+ end
37
68
  end
38
69
  end
39
70
  end
@@ -35,7 +35,7 @@ module EhbrsRubyUtils
35
35
  end
36
36
  end
37
37
 
38
- %i[codec_name codec_long_name].each do |method_name|
38
+ %i[codec_name codec_long_name height width].each do |method_name|
39
39
  define_method method_name do
40
40
  ffprobe_data[method_name]
41
41
  end
@@ -0,0 +1,3 @@
1
+ <% songs.each do |song| %>
2
+ <%= song.output_main %>
3
+ <% end %>
@@ -0,0 +1,11 @@
1
+ .album h2 {
2
+ background-color: lightgoldenrodyellow;
3
+ text-align: center;
4
+ }
5
+
6
+ .filename {
7
+ display: block;
8
+ font-size: small;
9
+ text-align: right;
10
+ font-style: italic;
11
+ }
@@ -0,0 +1,14 @@
1
+ <div class="index" >
2
+ <ul>
3
+ <% albums.each do |album| %>
4
+ <li>
5
+ <%= album.link_to_header %>
6
+ <ul>
7
+ <% album.songs.each do |song| %>
8
+ <li><%= song.link_to_header %></li>
9
+ <% end %>
10
+ </ul>
11
+ </li>
12
+ <% end %>
13
+ </ul>
14
+ </div>
@@ -0,0 +1,24 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <title><%= title %></title>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
8
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
9
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css">
10
+ <style>
11
+ <%= template.child('custom_style.css').content %>
12
+ </style>
13
+ </head>
14
+ <body>
15
+ <div class="container" >
16
+ <h1><%= title %></h1>
17
+ <h2>Índice</h2>
18
+ <%= erb_template('index.html.erb') %>
19
+ <% albums.each do |album| %>
20
+ <%= album.output_main %>
21
+ <% end %>
22
+ </div>
23
+ </body>
24
+ </html>
@@ -0,0 +1,8 @@
1
+ <div class="<%= type %>">
2
+ <h<%= header_index %> id='<%= header_id %>' >
3
+ <%= header_title %>
4
+ <a href="#<%= index_id %>" ><i class="bi-arrow-up-circle-fill"></i></a>
5
+ </h<%= header_index %>>
6
+ <span class="filename"><%= filename %></span>
7
+ <%= erb_template('inner.html.erb') %>
8
+ </div>
@@ -0,0 +1,5 @@
1
+ <% if lyrics.found? %>
2
+ <pre><%= lyrics.text %></pre>
3
+ <% else %>
4
+ <p><em>Letra indisponível.</em></p>
5
+ <% end %>
metadata CHANGED
@@ -1,15 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ehbrs_ruby_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.12.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: 2021-08-26 00:00:00.000000000 Z
11
+ date: 2021-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aranha-parsers
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.8'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.8.5
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.8'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.8.5
33
+ - !ruby/object:Gem::Dependency
34
+ name: avm
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.3'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.3.2
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.3'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.3.2
13
53
  - !ruby/object:Gem::Dependency
14
54
  name: eac_ruby_utils
15
55
  requirement: !ruby/object:Gem::Requirement
@@ -44,6 +84,34 @@ dependencies:
44
84
  - - ">="
45
85
  - !ruby/object:Gem::Version
46
86
  version: 0.1.1
87
+ - !ruby/object:Gem::Dependency
88
+ name: taglib-ruby
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '1.1'
94
+ type: :runtime
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '1.1'
101
+ - !ruby/object:Gem::Dependency
102
+ name: ultimate_lyrics
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '0.1'
108
+ type: :runtime
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '0.1'
47
115
  - !ruby/object:Gem::Dependency
48
116
  name: aranha-parsers
49
117
  requirement: !ruby/object:Gem::Requirement
@@ -81,8 +149,21 @@ files:
81
149
  - ".rspec"
82
150
  - ".rubocop.yml"
83
151
  - lib/ehbrs_ruby_utils.rb
152
+ - lib/ehbrs_ruby_utils/core_ext.rb
84
153
  - lib/ehbrs_ruby_utils/executables.rb
85
154
  - lib/ehbrs_ruby_utils/finances/bb_browser/docker_image.rb
155
+ - lib/ehbrs_ruby_utils/fs.rb
156
+ - lib/ehbrs_ruby_utils/fs/compressed_package.rb
157
+ - lib/ehbrs_ruby_utils/fs/selected.rb
158
+ - lib/ehbrs_ruby_utils/fs/selected/build.rb
159
+ - lib/ehbrs_ruby_utils/fs/selected/build_file.rb
160
+ - lib/ehbrs_ruby_utils/music.rb
161
+ - lib/ehbrs_ruby_utils/music/lyrics_book.rb
162
+ - lib/ehbrs_ruby_utils/music/lyrics_book/album.rb
163
+ - lib/ehbrs_ruby_utils/music/lyrics_book/resource.rb
164
+ - lib/ehbrs_ruby_utils/music/lyrics_book/song.rb
165
+ - lib/ehbrs_ruby_utils/patches.rb
166
+ - lib/ehbrs_ruby_utils/patches/object.rb
86
167
  - lib/ehbrs_ruby_utils/patches/object/template.rb
87
168
  - lib/ehbrs_ruby_utils/version.rb
88
169
  - lib/ehbrs_ruby_utils/videos.rb
@@ -114,6 +195,12 @@ files:
114
195
  - template/ehbrs_ruby_utils/finances/bb_browser/docker_image/README.md
115
196
  - template/ehbrs_ruby_utils/finances/bb_browser/docker_image/context/firefox.service
116
197
  - template/ehbrs_ruby_utils/finances/bb_browser/docker_image/context/startbrowser.sh
198
+ - template/ehbrs_ruby_utils/music/lyrics_book/album/inner.html.erb
199
+ - template/ehbrs_ruby_utils/music/lyrics_book/custom_style.css
200
+ - template/ehbrs_ruby_utils/music/lyrics_book/index.html.erb
201
+ - template/ehbrs_ruby_utils/music/lyrics_book/main.html.erb
202
+ - template/ehbrs_ruby_utils/music/lyrics_book/resource/main.html.erb
203
+ - template/ehbrs_ruby_utils/music/lyrics_book/song/inner.html.erb
117
204
  homepage:
118
205
  licenses: []
119
206
  metadata: {}