ehbrs_ruby_utils 0.17.3 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ehbrs_ruby_utils/{spreader_t1 → circular_list_spreader}/base_level.rb +1 -1
  3. data/lib/ehbrs_ruby_utils/{spreader_t1 → circular_list_spreader}/group_level.rb +5 -5
  4. data/lib/ehbrs_ruby_utils/{spreader_t1 → circular_list_spreader}/item_level.rb +4 -4
  5. data/lib/ehbrs_ruby_utils/circular_list_spreader/list/item_pair_spreadness.rb +72 -0
  6. data/lib/ehbrs_ruby_utils/circular_list_spreader/list.rb +49 -0
  7. data/lib/ehbrs_ruby_utils/circular_list_spreader.rb +32 -0
  8. data/lib/ehbrs_ruby_utils/music/ous/album.rb +1 -1
  9. data/lib/ehbrs_ruby_utils/version.rb +1 -1
  10. data/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode.rb +30 -0
  11. data/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title.rb +26 -0
  12. data/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers.rb +13 -0
  13. data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors/episode.rb +44 -0
  14. data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors/subtitle.rb +39 -0
  15. data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors/title.rb +37 -0
  16. data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors.rb +13 -0
  17. data/lib/ehbrs_ruby_utils/videos/opensubtitles.rb +9 -0
  18. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec.rb +66 -0
  19. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/ehbrs_music1.source.yaml +124 -0
  20. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/ehbrs_music1.target.yaml +70 -0
  21. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/minimum.source.yaml +7 -0
  22. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/minimum.target.yaml +5 -0
  23. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec.rb +7 -0
  24. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/counterpart_s01e01.source.html +993 -0
  25. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/counterpart_s01e01.target.yaml +5 -0
  26. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/wire-season-1-page-1.source.html +478 -0
  27. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/wire-season-1-page-1.target.yaml +43 -0
  28. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title_spec.rb +7 -0
  29. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title_spec_files/countepart.source.html +763 -0
  30. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title_spec_files/countepart.target.yaml +22 -0
  31. metadata +77 -39
  32. data/lib/ehbrs_ruby_utils/spreader_t1.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e33992f6ff34c43794a34bf8e7d9947aeb9a8987c407374128136b5d84a8ce41
4
- data.tar.gz: 052645d454f893b434f3d9a46b6881483f96a5a9cb5f32fc56634a8119e9f049
3
+ metadata.gz: 5b5a4ff5b36fa6184fe024c0dd3c31514b03656e9f31fc8f9d680bc0d71a46f6
4
+ data.tar.gz: 168d749fb34a32df6e65e31ffca81ded6123b7b96e79e74b60d2d7f749800fd6
5
5
  SHA512:
6
- metadata.gz: 53cae13cd044d18a702e2a1a58ccf95191e19fb8688ae6e28624fc12e73e165818d0067b1064c8a29b5a4b23d471e134c858e29b1151375f7d95ea4a6598aa61
7
- data.tar.gz: 9e6ab67552a88c0b201c6657f9cb3fe9387663a1d68654ca9b611baa8b8217cd1a67567c39602ce9ec83bbc2a6f9c700b004a147e64ce0d49858906b7f2a7a5f
6
+ metadata.gz: 86ede6154dc60b53a6fc4b871782be51e9f88e8abefd4ed82f0d8237e8e71935ac69b62406d00cee10c05090051e04deca3106ca3a57f2ec372bc8c97bfe3d84
7
+ data.tar.gz: 47bf252d71924e6f385ff8b9d99013475ddeda2e9975c49a913abcfcd84ad109ade0beff12e13781b80151c127d453ee33891891533e786d98f9726384e51ca6
@@ -3,7 +3,7 @@
3
3
  require 'eac_ruby_utils/core_ext'
4
4
 
5
5
  module EhbrsRubyUtils
6
- class SpreaderT1
6
+ class CircularListSpreader
7
7
  module BaseLevel
8
8
  extend ::Comparable
9
9
 
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
- require 'ehbrs_ruby_utils/spreader_t1/base_level'
5
- require 'ehbrs_ruby_utils/spreader_t1/item_level'
4
+ require 'ehbrs_ruby_utils/circular_list_spreader/base_level'
5
+ require 'ehbrs_ruby_utils/circular_list_spreader/item_level'
6
6
 
7
7
  module EhbrsRubyUtils
8
- class SpreaderT1
8
+ class CircularListSpreader
9
9
  class GroupLevel
10
- include ::EhbrsRubyUtils::SpreaderT1::BaseLevel
10
+ include ::EhbrsRubyUtils::CircularListSpreader::BaseLevel
11
11
  enable_simple_cache
12
12
 
13
13
  common_constructor :label
@@ -56,7 +56,7 @@ module EhbrsRubyUtils
56
56
  def push_item_level(current, item)
57
57
  raise "Key \"#{current}\" already used" if children[current].present?
58
58
 
59
- children[current] = ::EhbrsRubyUtils::SpreaderT1::ItemLevel.new(item)
59
+ children[current] = ::EhbrsRubyUtils::CircularListSpreader::ItemLevel.new(item)
60
60
  end
61
61
  end
62
62
  end
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/core_ext'
4
- require 'ehbrs_ruby_utils/spreader_t1/base_level'
4
+ require 'ehbrs_ruby_utils/circular_list_spreader/base_level'
5
5
 
6
6
  module EhbrsRubyUtils
7
- class SpreaderT1
7
+ class CircularListSpreader
8
8
  class ItemLevel
9
- include ::EhbrsRubyUtils::SpreaderT1::BaseLevel
9
+ include ::EhbrsRubyUtils::CircularListSpreader::BaseLevel
10
10
 
11
11
  common_constructor :item do
12
12
  self.removed = false
@@ -20,7 +20,7 @@ module EhbrsRubyUtils
20
20
  raise 'Item already removed' if removed?
21
21
 
22
22
  self.removed = true
23
- item
23
+ self
24
24
  end
25
25
 
26
26
  def remaining_i
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ class CircularListSpreader
7
+ class List
8
+ class ItemPairSpreadness
9
+ enable_method_class
10
+ enable_simple_cache
11
+ common_constructor :list, :left_index, :right_index do
12
+ raise "Right is not greater than left (Left: #{left_index}, Right: #{right_index}" unless
13
+ left_index < right_index
14
+ end
15
+
16
+ # @return [Integer]
17
+ def distance
18
+ to_right_distance * to_left_distance
19
+ end
20
+
21
+ # @return [Array]
22
+ def left_path
23
+ list.items.fetch(left_index).item.to_circular_list_spreader_path
24
+ end
25
+
26
+ # @return [Array]
27
+ def right_path
28
+ item_on_index_path(right_index)
29
+ end
30
+
31
+ # @return [Integer]
32
+ def to_left_distance
33
+ right_index - left_index
34
+ end
35
+
36
+ # @return [Integer]
37
+ def to_right_distance
38
+ list.count - right_index + left_index
39
+ end
40
+
41
+ # @return [Integer]
42
+ def result
43
+ similarity * distance
44
+ end
45
+
46
+ private
47
+
48
+ # @return [Integer]
49
+ def difference_uncached
50
+ lpath = item_on_index_path(left_index).reverse
51
+ rpath = item_on_index_path(right_index).reverse
52
+ r = lpath.count - 1
53
+ while r >= 0
54
+ return r + 1 if lpath.fetch(r) != rpath.fetch(r)
55
+
56
+ r -= 1
57
+ end
58
+
59
+ 0
60
+ end
61
+
62
+ def similarity_uncached
63
+ item_on_index_path(left_index).count - 1 - difference
64
+ end
65
+
66
+ def item_on_index_path(index)
67
+ list.items.fetch(index).item.to_circular_list_spreader_path
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ class CircularListSpreader
7
+ class List
8
+ require_sub __FILE__, require_dependency: true
9
+
10
+ class << self
11
+ def empty
12
+ new([], 0)
13
+ end
14
+ end
15
+
16
+ enable_simple_cache
17
+ common_constructor :items, :inserted_at
18
+ compare_by :spreadness, :inserted_at
19
+ delegate :count, to: :items
20
+
21
+ def insert(position, item_level)
22
+ dup_items = items.dup
23
+ dup_items.insert(position, item_level)
24
+ self.class.new(dup_items, position)
25
+ end
26
+
27
+ def items_pair_enumerator
28
+ ::Enumerator.new do |enum|
29
+ (count - 1).times do |li|
30
+ ((li + 1)..(count - 1)).each do |ri|
31
+ enum.yield(li, ri)
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ def to_s
38
+ items.map { |i| i.item.to_s }.join(', ')
39
+ end
40
+
41
+ private
42
+
43
+ # @return [Integer]
44
+ def spreadness_uncached
45
+ items_pair_enumerator.inject(0) { |a, e| a + item_pair_spreadness(*e) }
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ class CircularListSpreader
7
+ require_sub __FILE__
8
+ common_constructor :items
9
+
10
+ # @return [EhbrsRubyUtils::SpreaderT1::GroupLevel]
11
+ def build_root
12
+ r = ::EhbrsRubyUtils::CircularListSpreader::GroupLevel.new('ROOT')
13
+ items.each { |item| r.push(item.to_circular_list_spreader_path, item) }
14
+ r
15
+ end
16
+
17
+ # @return [Array]
18
+ def result
19
+ base_list = ::EhbrsRubyUtils::CircularListSpreader::List.empty
20
+ build_root.pop_all.each do |item|
21
+ base_list = lists_with_item(base_list, item).max
22
+ end
23
+ base_list.items.map(&:item)
24
+ end
25
+
26
+ def lists_with_item(base_list, item)
27
+ (base_list.count + 1).times.map do |position|
28
+ base_list.insert(position, item)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -18,7 +18,7 @@ module EhbrsRubyUtils
18
18
  [language, category.name, artist.name, name]
19
19
  end
20
20
 
21
- def to_spreader_t1_path
21
+ def to_circular_list_spreader_path
22
22
  to_a
23
23
  end
24
24
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EhbrsRubyUtils
4
- VERSION = '0.17.3'
4
+ VERSION = '0.19.0'
5
5
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/html/item_list'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module EhbrsRubyUtils
7
+ module Videos
8
+ module Opensubtitles
9
+ module Parsers
10
+ class Episode < ::Aranha::Parsers::Html::ItemList
11
+ ITEMS_XPATH = '//table[@id = "search_results"]/tbody/tr[starts-with(@id, "name")]'
12
+
13
+ field :href, :string, './/a[contains(@href, "/subtitleserve/")]/@href'
14
+
15
+ def items_xpath
16
+ ITEMS_XPATH
17
+ end
18
+
19
+ def data
20
+ { subtitles: items_data, next_page_href: next_page_href }
21
+ end
22
+
23
+ def next_page_href
24
+ nokogiri.at_xpath('//*[@id = "pager"]//a[text() = ">>"]/@href').if_present(&:text)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/html/item_list'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module EhbrsRubyUtils
7
+ module Videos
8
+ module Opensubtitles
9
+ module Parsers
10
+ class Title < ::Aranha::Parsers::Html::ItemList
11
+ ITEMS_XPATH = '//table[@id = "search_results"]/tbody/tr[@itemprop = "episode"]'
12
+
13
+ field :href, :string, './/a[@itemprop = "url"]/@href'
14
+
15
+ def items_xpath
16
+ ITEMS_XPATH
17
+ end
18
+
19
+ def data
20
+ { episodes: items_data }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ 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 Opensubtitles
8
+ module Parsers
9
+ require_sub __FILE__
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/default_processor'
4
+ require 'ehbrs_ruby_utils/videos/opensubtitles/parsers/episode'
5
+ require 'ehbrs_ruby_utils/videos/opensubtitles/processors/subtitle'
6
+ require 'eac_ruby_utils/core_ext'
7
+
8
+ module EhbrsRubyUtils
9
+ module Videos
10
+ module Opensubtitles
11
+ module Processors
12
+ class Episode < ::Aranha::DefaultProcessor
13
+ enable_simple_cache
14
+ enable_speaker
15
+
16
+ def perform
17
+ infov source_uri, subtitles.count
18
+ subtitles.each(&:perform)
19
+ next_page.if_present(&:perform)
20
+ end
21
+
22
+ private
23
+
24
+ def next_page_uncached
25
+ data.fetch(:next_page_href)
26
+ .if_present { |v| self.class.new(source_uri + v, extra_data) }
27
+ end
28
+
29
+ def subtitle_uri(subtitle_data)
30
+ source_uri + subtitle_data.fetch(:href)
31
+ end
32
+
33
+ def subtitles_uncached
34
+ data.fetch(:subtitles).map do |subtitle_data|
35
+ ::EhbrsRubyUtils::Videos::Opensubtitles::Processors::Subtitle.new(
36
+ subtitle_uri(subtitle_data), extra_data
37
+ )
38
+ end + next_page.if_present([], &:subtitles)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/default_processor'
4
+ require 'eac_fs/cached_download'
5
+ require 'eac_ruby_utils/core_ext'
6
+
7
+ module EhbrsRubyUtils
8
+ module Videos
9
+ module Opensubtitles
10
+ module Processors
11
+ class Subtitle < ::Aranha::DefaultProcessor
12
+ enable_simple_cache
13
+ enable_speaker
14
+
15
+ def perform
16
+ infov ' * ', source_uri
17
+ assert_download
18
+ rescue ::RuntimeError => e
19
+ error(e)
20
+ end
21
+
22
+ private
23
+
24
+ def assert_download
25
+ cached_download.assert
26
+ end
27
+
28
+ def cached_download_uncached
29
+ ::EacFs::CachedDownload.new(source_uri, fs_cache)
30
+ end
31
+
32
+ def fs_object_id
33
+ source_uri.to_s.parameterize
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/default_processor'
4
+ require 'ehbrs_ruby_utils/videos/opensubtitles/parsers/title'
5
+ require 'ehbrs_ruby_utils/videos/opensubtitles/processors/episode'
6
+ require 'eac_ruby_utils/core_ext'
7
+
8
+ module EhbrsRubyUtils
9
+ module Videos
10
+ module Opensubtitles
11
+ module Processors
12
+ class Title < ::Aranha::DefaultProcessor
13
+ enable_simple_cache
14
+ enable_speaker
15
+
16
+ def perform
17
+ infov 'Episodes', episodes.count
18
+ episodes.each(&:perform)
19
+ end
20
+
21
+ private
22
+
23
+ def episode_uri(episode_data)
24
+ source_uri + episode_data.fetch(:href)
25
+ end
26
+
27
+ def episodes_uncached
28
+ data.fetch(:episodes).map do |episode_data|
29
+ ::EhbrsRubyUtils::Videos::Opensubtitles::Processors::Episode
30
+ .new(episode_uri(episode_data), extra_data)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ 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 Opensubtitles
8
+ module Processors
9
+ require_sub __FILE__
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Opensubtitles
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/circular_list_spreader'
4
+
5
+ ::RSpec.describe ::EhbrsRubyUtils::CircularListSpreader do
6
+ let(:node_class) do
7
+ ::Class.new do
8
+ ::Kernel.const_set('NodeClass', self)
9
+
10
+ class << self
11
+ def from_file(file)
12
+ from_hash(nil, 'ROOT', ::EacRubyUtils::Yaml.load_file(file))
13
+ end
14
+
15
+ def from_hash(parent, label, hash)
16
+ new(parent, label).children_from_hash(hash)
17
+ end
18
+ end
19
+
20
+ common_constructor :parent, :label
21
+ attr_reader :children
22
+
23
+ def children_from_hash(hash)
24
+ @children = if hash.is_a?(::Hash)
25
+ hash.map { |k, v| self.class.from_hash(self, k, v) }
26
+ else
27
+ false
28
+ end
29
+
30
+ self
31
+ end
32
+
33
+ def id
34
+ to_circular_list_spreader_path.join(' | ')
35
+ end
36
+
37
+ def leaf?
38
+ !children.is_a?(::Enumerable)
39
+ end
40
+
41
+ def recursive_leafs
42
+ if leaf?
43
+ [self]
44
+ else
45
+ children.flat_map(&:recursive_leafs)
46
+ end
47
+ end
48
+
49
+ def to_circular_list_spreader_path
50
+ return [] if parent.blank?
51
+
52
+ parent.if_present([], &:to_circular_list_spreader_path) + [label]
53
+ end
54
+
55
+ def to_s
56
+ label
57
+ end
58
+ end
59
+ end
60
+
61
+ include_examples 'source_target_fixtures', __FILE__
62
+
63
+ def source_data(source_file)
64
+ described_class.new(node_class.from_file(source_file).recursive_leafs).result.map(&:id)
65
+ end
66
+ end
@@ -0,0 +1,124 @@
1
+ ---
2
+ en:
3
+ Pop anglofônico:
4
+ Adele:
5
+ 2011 - 21: true
6
+ 2015 - 25: true
7
+ 2021 - 30: true
8
+ Aurora:
9
+ 2016 - All My Demons Greeting Me as a Friend: true
10
+ 2018 - Infections Of A Different Kind – Step 1: true
11
+ Celine Dion:
12
+ 2008 - My Love (Essential Collection): true
13
+ Colbie Caillat:
14
+ 2011 - All Of You: true
15
+ Lana Del Rey:
16
+ 2012 - Born To Die - Disc 1: true
17
+ 2012 - Paradise: true
18
+ 2019 - Norman Fucking Rockwell: true
19
+ 2021 - Chemtrails Over The Country Club: true
20
+ Maroon 5:
21
+ 2018 - Essentials - P1: true
22
+ 2018 - Essentials - P2: true
23
+ Michael Jackson:
24
+ Michael Jackson P1: true
25
+ Michael Jackson P2: true
26
+ Michael Jackson P3: true
27
+ Olivia Rodrigo:
28
+ 2021 - Sour: true
29
+ Taylor Swift:
30
+ 2008 - Fearless: true
31
+ Rock anglofônico:
32
+ Alanis Morissette:
33
+ 2020 - Jagged Little Pill: true
34
+ Christopher Cross:
35
+ 1979 - Christopher Cross: true
36
+ Guns n' Roses:
37
+ 2004 - Greatest Hits: true
38
+ Michael Kiwanuka:
39
+ 2019 - Kiwanuka: true
40
+ Queen:
41
+ 2011 - The Ultimate Best Of Queen - P1: true
42
+ 2011 - The Ultimate Best Of Queen - P2: true
43
+ Sinead O'Connor:
44
+ 1990 - I Do Not Want What I Haven't Got: true
45
+ Weyes Blood:
46
+ 2019 - Titanic Rising: true
47
+ Anglofônico - Vários:
48
+ Aldous Harding:
49
+ 2019 - Designer: true
50
+ FKA Twigs:
51
+ 2019 - Magdalene: true
52
+ Jamila Woods:
53
+ 2019 - LEGACY! LEGACY!: true
54
+ Norah Jones:
55
+ "[2002] Come Away With Me": true
56
+ Vários:
57
+ 2021 - Cinema Selecionadas: true
58
+ Americana - Country:
59
+ Dixie Chicks:
60
+ 2006 - Taking The Long Way: true
61
+ Kacey Musgraves:
62
+ 2013 - Same Trailer Different Park: true
63
+ 2018 - Golden Hour: true
64
+ 2021 - Star-Crossed: true
65
+ pt:
66
+ Pop-rock brasileiro:
67
+ Anavitória:
68
+ 2016 - Anavitória: true
69
+ 2018 - O Tempo é Agora: true
70
+ Ira:
71
+ A26 2004 Ira! - Acústico MTV: true
72
+ Kiko Zambianchi:
73
+ 1985 - Choque: true
74
+ Nando Reis:
75
+ 2016 - Jardim-Pomar: true
76
+ Pitty:
77
+ 2003 - Admirável Chip Novo: true
78
+ Rita Lee:
79
+ 2003 - Balacobaco: true
80
+ Tiago Iorc:
81
+ 2015 - Troco Likes: true
82
+ MPB:
83
+ Belchior:
84
+ 2022 - Selecionadas - Parte 1: true
85
+ 2022 - Selecionadas - Parte 2: true
86
+ Beto Guedes:
87
+ 2004 - Em Algum Lugar: true
88
+ 2022 - Selecionadas - 1: true
89
+ 2022 - Selecionadas - 2: true
90
+ Chico Buarque:
91
+ "(1972) Quando O Carnaval Chegar": true
92
+ "(1983) Para Viver Um Grande Amor - Trilha Sonora": true
93
+ "(1988) Dança Da Meia-Lua": true
94
+ 2022 - Selecionadas - 1: true
95
+ Diana Pequeno:
96
+ 1978 - Diana Pequeno: true
97
+ 1979 - Eterno Como Areia: true
98
+ Elis Regina:
99
+ 1976. Falso Brilhante: true
100
+ Gilberto Gil:
101
+ 1972 - Expresso 2222: true
102
+ Lô Borges:
103
+ 2022 - Selecionadas: true
104
+ Maria Bethania:
105
+ 1977 - Pássaro da Manhã: true
106
+ Marina Machado:
107
+ 2002 - Marina 6 Horas da Tarde: true
108
+ 2008 - Tempo Quente: true
109
+ Marisa Monte:
110
+ "(2000) Memorias, Cronicas e Declaracoes de Amor": true
111
+ "(2002) - Tribalistas": true
112
+ "(2006) Infinito Particular": true
113
+ Milton Nascimento:
114
+ 1999 - Crooner: true
115
+ Os Mutantes:
116
+ 1971 - Jardim Elétrico: true
117
+ Trio Amaranto:
118
+ Brasilêro: true
119
+ Vários:
120
+ 1976 - Doces Bárbaros: true
121
+ Zeca Baleiro:
122
+ 2019 - O Amor no Caos, Vol. 1: true
123
+ Zé Ramalho:
124
+ 1978 - Zé Ramalho I: true