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.
- checksums.yaml +4 -4
- data/lib/ehbrs_ruby_utils/{spreader_t1 → circular_list_spreader}/base_level.rb +1 -1
- data/lib/ehbrs_ruby_utils/{spreader_t1 → circular_list_spreader}/group_level.rb +5 -5
- data/lib/ehbrs_ruby_utils/{spreader_t1 → circular_list_spreader}/item_level.rb +4 -4
- data/lib/ehbrs_ruby_utils/circular_list_spreader/list/item_pair_spreadness.rb +72 -0
- data/lib/ehbrs_ruby_utils/circular_list_spreader/list.rb +49 -0
- data/lib/ehbrs_ruby_utils/circular_list_spreader.rb +32 -0
- data/lib/ehbrs_ruby_utils/music/ous/album.rb +1 -1
- data/lib/ehbrs_ruby_utils/version.rb +1 -1
- data/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode.rb +30 -0
- data/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title.rb +26 -0
- data/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers.rb +13 -0
- data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors/episode.rb +44 -0
- data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors/subtitle.rb +39 -0
- data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors/title.rb +37 -0
- data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors.rb +13 -0
- data/lib/ehbrs_ruby_utils/videos/opensubtitles.rb +9 -0
- data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec.rb +66 -0
- data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/ehbrs_music1.source.yaml +124 -0
- data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/ehbrs_music1.target.yaml +70 -0
- data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/minimum.source.yaml +7 -0
- data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/minimum.target.yaml +5 -0
- data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec.rb +7 -0
- data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/counterpart_s01e01.source.html +993 -0
- data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/counterpart_s01e01.target.yaml +5 -0
- data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/wire-season-1-page-1.source.html +478 -0
- data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/wire-season-1-page-1.target.yaml +43 -0
- data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title_spec.rb +7 -0
- data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title_spec_files/countepart.source.html +763 -0
- data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title_spec_files/countepart.target.yaml +22 -0
- metadata +77 -39
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b5a4ff5b36fa6184fe024c0dd3c31514b03656e9f31fc8f9d680bc0d71a46f6
|
4
|
+
data.tar.gz: 168d749fb34a32df6e65e31ffca81ded6123b7b96e79e74b60d2d7f749800fd6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86ede6154dc60b53a6fc4b871782be51e9f88e8abefd4ed82f0d8237e8e71935ac69b62406d00cee10c05090051e04deca3106ca3a57f2ec372bc8c97bfe3d84
|
7
|
+
data.tar.gz: 47bf252d71924e6f385ff8b9d99013475ddeda2e9975c49a913abcfcd84ad109ade0beff12e13781b80151c127d453ee33891891533e786d98f9726384e51ca6
|
@@ -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/
|
5
|
-
require 'ehbrs_ruby_utils/
|
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
|
8
|
+
class CircularListSpreader
|
9
9
|
class GroupLevel
|
10
|
-
include ::EhbrsRubyUtils::
|
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::
|
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/
|
4
|
+
require 'ehbrs_ruby_utils/circular_list_spreader/base_level'
|
5
5
|
|
6
6
|
module EhbrsRubyUtils
|
7
|
-
class
|
7
|
+
class CircularListSpreader
|
8
8
|
class ItemLevel
|
9
|
-
include ::EhbrsRubyUtils::
|
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
|
-
|
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
|
@@ -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,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,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
|