ehbrs_ruby_utils 0.17.3 → 0.19.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.
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