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.
- 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
|