vk_music 3.1.7 → 4.1.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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +3 -0
  3. data/.github/workflows/ruby.yml +35 -0
  4. data/.gitignore +6 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +56 -0
  7. data/Gemfile +38 -10
  8. data/Gemfile.lock +124 -70
  9. data/LICENSE.txt +0 -0
  10. data/README.md +121 -94
  11. data/Rakefile +15 -22
  12. data/bin/console +18 -24
  13. data/lib/vk_music.rb +32 -18
  14. data/lib/vk_music/audio.rb +112 -187
  15. data/lib/vk_music/client.rb +193 -677
  16. data/lib/vk_music/playlist.rb +44 -97
  17. data/lib/vk_music/request.rb +13 -0
  18. data/lib/vk_music/request/artist.rb +24 -0
  19. data/lib/vk_music/request/audios_reload.rb +29 -0
  20. data/lib/vk_music/request/base.rb +75 -0
  21. data/lib/vk_music/request/login.rb +35 -0
  22. data/lib/vk_music/request/my_page.rb +21 -0
  23. data/lib/vk_music/request/playlist.rb +31 -0
  24. data/lib/vk_music/request/playlist_section.rb +35 -0
  25. data/lib/vk_music/request/post.rb +22 -0
  26. data/lib/vk_music/request/profile.rb +24 -0
  27. data/lib/vk_music/request/search.rb +34 -0
  28. data/lib/vk_music/request/wall_section.rb +34 -0
  29. data/lib/vk_music/utility.rb +8 -78
  30. data/lib/vk_music/utility/artist_loader.rb +17 -0
  31. data/lib/vk_music/utility/artist_url_parser.rb +22 -0
  32. data/lib/vk_music/utility/audio_data_parser.rb +37 -0
  33. data/lib/vk_music/utility/audio_items_parser.rb +18 -0
  34. data/lib/vk_music/utility/audio_node_parser.rb +59 -0
  35. data/lib/vk_music/utility/audios_from_ids_loader.rb +21 -0
  36. data/lib/vk_music/utility/audios_ids_getter.rb +25 -0
  37. data/lib/vk_music/utility/audios_loader.rb +37 -0
  38. data/lib/vk_music/utility/data_type_guesser.rb +48 -0
  39. data/lib/vk_music/utility/duration_parser.rb +17 -0
  40. data/lib/vk_music/utility/last_profile_post_loader.rb +26 -0
  41. data/lib/vk_music/utility/link_decoder.rb +107 -0
  42. data/lib/vk_music/utility/node_text_children_reader.rb +14 -0
  43. data/lib/vk_music/utility/playlist_loader.rb +30 -0
  44. data/lib/vk_music/utility/playlist_node_parser.rb +21 -0
  45. data/lib/vk_music/utility/playlist_section_loader.rb +29 -0
  46. data/lib/vk_music/utility/playlist_url_parser.rb +32 -0
  47. data/lib/vk_music/utility/post_loader.rb +23 -0
  48. data/lib/vk_music/utility/post_url_parser.rb +24 -0
  49. data/lib/vk_music/utility/profile_id_resolver.rb +58 -0
  50. data/lib/vk_music/utility/wall_loader.rb +25 -0
  51. data/lib/vk_music/version.rb +7 -5
  52. data/lib/vk_music/web_parser.rb +9 -0
  53. data/lib/vk_music/web_parser/artist.rb +16 -0
  54. data/lib/vk_music/web_parser/audios_reload.rb +20 -0
  55. data/lib/vk_music/web_parser/base.rb +27 -0
  56. data/lib/vk_music/web_parser/login.rb +13 -0
  57. data/lib/vk_music/web_parser/my_page.rb +19 -0
  58. data/lib/vk_music/web_parser/playlist.rb +33 -0
  59. data/lib/vk_music/web_parser/playlist_section.rb +53 -0
  60. data/lib/vk_music/web_parser/post.rb +15 -0
  61. data/lib/vk_music/web_parser/profile.rb +33 -0
  62. data/lib/vk_music/web_parser/search.rb +56 -0
  63. data/lib/vk_music/web_parser/wall_section.rb +53 -0
  64. data/vk_music.gemspec +36 -40
  65. metadata +63 -77
  66. data/.travis.yml +0 -7
  67. data/bin/setup +0 -8
  68. data/lib/vk_music/constants.rb +0 -78
  69. data/lib/vk_music/exceptions.rb +0 -21
  70. data/lib/vk_music/link_decoder.rb +0 -102
  71. data/lib/vk_music/utility/log.rb +0 -51
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # Artist top audios web page
6
+ class Artist < Base
7
+ # @return [Array<Audio>]
8
+ def audios
9
+ audio_section = node.at_css('.AudioSection.AudioSection__artist_audios')
10
+ return [] if audio_section.nil?
11
+
12
+ Utility::AudioItemsParser.call(audio_section, @client_id)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # Audios reload JSON parser
6
+ class AudiosReload < Base
7
+ # Array with audio data
8
+ def audios_data
9
+ @audios_data ||= json['data'].first || []
10
+ end
11
+
12
+ # @return [Array<Audio>]
13
+ def audios
14
+ audios_data.map do |el|
15
+ Utility::AudioDataParser.call(el, @client_id)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # Base class for all web parsers
6
+ class Base
7
+ # @param content [String, Nokogiri::XML::Searchable]
8
+ # @param client_id [Integer?]
9
+ def initialize(content, client_id: nil)
10
+ @content = content
11
+ @client_id = client_id
12
+ end
13
+
14
+ private
15
+
16
+ attr_reader :content
17
+
18
+ def node
19
+ @node ||= @content.is_a?(String) ? Nokogiri::HTML.fragment(@content) : @content
20
+ end
21
+
22
+ def json
23
+ @json ||= JSON.parse(@content.is_a?(String) ? @content : @content.body)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # Login page parser
6
+ class Login < Base
7
+ # @return [Mechanize::Form]
8
+ def login_form
9
+ node.forms.find { |f| f.action.start_with?('https://login.vk.com') }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # Current user page parser
6
+ class MyPage < Base
7
+ # User id
8
+ def id
9
+ Integer(node.content.match(/window.vk = {"id":(\d+)/).captures.first, 10)
10
+ end
11
+
12
+ # User name
13
+ def name
14
+ link = node.at_css('.ip_user_link .op_owner')
15
+ link.attribute('data-name').value
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # Playlist mobile web page parser
6
+ class Playlist < Base
7
+ # @return [Array<Audio>]
8
+ def audios
9
+ Utility::AudioItemsParser.call(node, @client_id)
10
+ end
11
+
12
+ # @return [String]
13
+ def title
14
+ node.at_css('.audioPlaylist__title').content.strip
15
+ end
16
+
17
+ # @return [String?]
18
+ def subtitle
19
+ result = node.at_css('.audioPlaylist__subtitle').content.strip
20
+ return if result.nil? || result.empty?
21
+
22
+ result
23
+ end
24
+
25
+ # @return [Integer?]
26
+ def real_size
27
+ content = node.at_css('.audioPlaylist__footer').content
28
+ matches = content.gsub(/\s/, '').match(/^(\d+)/)&.captures
29
+ matches ? Integer(matches.first, 10) : nil
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # PlaylistSection JSON parser
6
+ class PlaylistSection < Base
7
+ # Parsed JSON
8
+ def data
9
+ @data ||= json['data'].first || {}
10
+ end
11
+
12
+ # @return [Array<Audio>]
13
+ def audios
14
+ return unless data&.key?('list')
15
+
16
+ data['list'].map do |el|
17
+ Utility::AudioDataParser.call(el, @client_id)
18
+ end
19
+ end
20
+
21
+ # @return [String]
22
+ def title
23
+ return unless data&.key?('title')
24
+
25
+ data['title'].to_s
26
+ end
27
+
28
+ # @return [String?]
29
+ def subtitle
30
+ return unless data&.key?('rawDescription')
31
+
32
+ re = data['rawDescription']
33
+ return if re.nil? || re.empty?
34
+
35
+ re
36
+ end
37
+
38
+ # @return [Integer?]
39
+ def real_size
40
+ return unless data&.key?('totalCount')
41
+
42
+ data['totalCount']
43
+ end
44
+
45
+ # @return [Boolean]
46
+ def more?
47
+ return unless data&.key?('hasMore')
48
+
49
+ data['hasMore'].to_s == '1'
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # Post page web parser
6
+ class Post < Base
7
+ # @return [Array<Audio>]
8
+ def audios
9
+ node.css('.wi_body > .pi_medias .medias_audio').map do |el|
10
+ Utility::AudioNodeParser.call(el, @client_id)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # Profile page parser
6
+ class Profile < Base
7
+ # Regex for href which contains id of profile
8
+ ID_CONTAINING_HREF = /(?:audios|photo|write|owner_id=|friends\?id=)(-?\d+)/.freeze
9
+ private_constant :ID_CONTAINING_HREF
10
+
11
+ # Regex for ID of .wall_item anchor
12
+ POST_ANCHOR_NAME_REGEX = /post(-?\d+)_(\d+)/.freeze
13
+ private_constant :POST_ANCHOR_NAME_REGEX
14
+
15
+ # Profile id
16
+ def id
17
+ link = node.link_with(href: ID_CONTAINING_HREF, css: '.basisProfile a,.basisGroup a')
18
+ return unless link
19
+
20
+ Integer(link.href.match(ID_CONTAINING_HREF).captures.first, 10)
21
+ end
22
+
23
+ # Last post ID
24
+ def last_post_id
25
+ ids = node.css('.wall_posts .wall_item').map do |el|
26
+ str = el.at_css('.post__anchor')&.attr('name')&.match(POST_ANCHOR_NAME_REGEX)&.captures&.last
27
+ str ? Integer(str, 10) : nil
28
+ end
29
+ ids.compact.max
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # Audio search page parser
6
+ class Search < Base
7
+ # Audios found
8
+ # @return [Array<Audio>]
9
+ def audios
10
+ title_index = search_result_blocks.find_index { |node| node.inner_text.include?('Все аудиозаписи') }
11
+ return [] if title_index.nil?
12
+
13
+ block = search_result_blocks[title_index + 1]
14
+
15
+ Utility::AudioItemsParser.call(block, @client_id)
16
+ end
17
+
18
+ # Path to page with all results
19
+ # @return [String?]
20
+ def audios_all_path
21
+ title = search_result_blocks.find { |node| node.inner_text.include?('Все аудиозаписи') }
22
+ return if title.nil?
23
+
24
+ title.at_css('a').attribute('href').value
25
+ end
26
+
27
+ # Playlists found
28
+ # @return [Array<Playlist>]
29
+ def playlists
30
+ title_index = search_result_blocks.find_index { |node| node.inner_text.include?('Альбомы') }
31
+ return [] if title_index.nil?
32
+
33
+ block = search_result_blocks[title_index + 1]
34
+
35
+ block.css('.audioPlaylists__item').map do |elem|
36
+ Utility::PlaylistNodeParser.call(elem)
37
+ end
38
+ end
39
+
40
+ # Path to page with all results
41
+ # @return [String?]
42
+ def playlists_all_path
43
+ title = search_result_blocks.find { |node| node.inner_text.include?('Альбомы') }
44
+ return if title.nil?
45
+
46
+ title.at_css('a').attribute('href').value
47
+ end
48
+
49
+ private
50
+
51
+ def search_result_blocks
52
+ @search_result_blocks ||= node.css('.AudioBlock').children
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VkMusic
4
+ module WebParser
5
+ # WallSection JSON parser
6
+ class WallSection < Base
7
+ # Parsed JSON
8
+ def data
9
+ @data ||= json['data'].first || {}
10
+ end
11
+
12
+ # @return [Array<Audio>]
13
+ def audios
14
+ return unless data&.key?('list')
15
+
16
+ data['list'].map do |el|
17
+ Utility::AudioDataParser.call(el, @client_id)
18
+ end
19
+ end
20
+
21
+ # @return [String]
22
+ def title
23
+ return unless data&.key?('title')
24
+
25
+ data['title'].to_s
26
+ end
27
+
28
+ # @return [String?]
29
+ def subtitle
30
+ return unless data&.key?('rawDescription')
31
+
32
+ re = data['rawDescription']
33
+ return if re.nil? || re.empty?
34
+
35
+ re
36
+ end
37
+
38
+ # @return [Integer?]
39
+ def real_size
40
+ return unless data&.key?('totalCount')
41
+
42
+ data['totalCount']
43
+ end
44
+
45
+ # @return [Boolean]
46
+ def more?
47
+ return unless data&.key?('hasMore')
48
+
49
+ data['hasMore'].to_s == '1'
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,40 +1,36 @@
1
- lib = File.expand_path("lib", __dir__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "vk_music/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "vk_music"
7
- spec.version = VkMusic::VERSION
8
- spec.authors = ["Fizvlad"]
9
- spec.email = ["fizvlad@mail.ru"]
10
-
11
- spec.summary = "Provides interface to work with VK music via HTTP requests"
12
- spec.description = "Library to work with audios on popular Russian social network vk.com. VK disabled their public API for audios, so it is now necessary to use parsers instead."
13
- spec.homepage = "https://github.com/fizvlad/vk-music-rb"
14
- spec.license = "MIT"
15
-
16
- spec.required_ruby_version = ">=2.3.1"
17
-
18
-
19
- spec.metadata["homepage_uri"] = spec.homepage
20
- spec.metadata["source_code_uri"] = "https://github.com/fizvlad/vk-music-rb"
21
- spec.metadata["changelog_uri"] = "https://github.com/fizvlad/vk-music-rb/releases"
22
-
23
- # Specify which files should be added to the gem when it is released.
24
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
26
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
- end
28
- spec.require_paths = ["lib"]
29
-
30
- spec.add_development_dependency "bundler", "~> 2.0"
31
- spec.add_development_dependency "rake", "~> 13.0"
32
- spec.add_development_dependency "yard", "~>0.9"
33
- spec.add_development_dependency "minitest", "~> 5.0"
34
-
35
- spec.add_runtime_dependency "logger", "~>1.4"
36
- spec.add_runtime_dependency "mechanize", "~>2.7"
37
- spec.add_runtime_dependency "net-http-persistent", "2.9.4" # Required for mechanize. Future versions cause error.
38
- spec.add_runtime_dependency "execjs", "~>2.7"
39
- spec.add_runtime_dependency "json", "~>2.0"
40
- end
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'vk_music/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'vk_music'
9
+ spec.version = VkMusic::VERSION
10
+ spec.authors = ['Fizvlad']
11
+ spec.email = ['fizvlad@mail.ru']
12
+
13
+ spec.summary = 'A library to work with audios on popular Russian social network'
14
+ spec.description = 'A library to work with audios on popular Russian social network'
15
+ spec.homepage = 'https://github.com/fizvlad/vk-music-rb'
16
+ spec.license = 'MIT'
17
+
18
+ spec.required_ruby_version = '>=2.7.1'
19
+
20
+ spec.metadata['homepage_uri'] = spec.homepage
21
+ spec.metadata['source_code_uri'] = 'https://github.com/fizvlad/vk-music-rb'
22
+ spec.metadata['changelog_uri'] = 'https://github.com/fizvlad/vk-music-rb/releases'
23
+
24
+ # Specify which files should be added to the gem when it is released.
25
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
26
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
27
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
28
+ end
29
+ spec.require_paths = ['lib']
30
+
31
+ spec.add_runtime_dependency('execjs', '~> 2.7')
32
+ spec.add_runtime_dependency('json', '~> 2.3')
33
+ spec.add_runtime_dependency('logger', '~> 1.4')
34
+ spec.add_runtime_dependency('mechanize', '~> 2.7')
35
+ spec.add_runtime_dependency('net-http-persistent', '2.9.4')
36
+ end
metadata CHANGED
@@ -1,71 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vk_music
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.7
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fizvlad
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-02 00:00:00.000000000 Z
11
+ date: 2021-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '2.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '2.0'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '13.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '13.0'
41
- - !ruby/object:Gem::Dependency
42
- name: yard
14
+ name: execjs
43
15
  requirement: !ruby/object:Gem::Requirement
44
16
  requirements:
45
17
  - - "~>"
46
18
  - !ruby/object:Gem::Version
47
- version: '0.9'
48
- type: :development
19
+ version: '2.7'
20
+ type: :runtime
49
21
  prerelease: false
50
22
  version_requirements: !ruby/object:Gem::Requirement
51
23
  requirements:
52
24
  - - "~>"
53
25
  - !ruby/object:Gem::Version
54
- version: '0.9'
26
+ version: '2.7'
55
27
  - !ruby/object:Gem::Dependency
56
- name: minitest
28
+ name: json
57
29
  requirement: !ruby/object:Gem::Requirement
58
30
  requirements:
59
31
  - - "~>"
60
32
  - !ruby/object:Gem::Version
61
- version: '5.0'
62
- type: :development
33
+ version: '2.3'
34
+ type: :runtime
63
35
  prerelease: false
64
36
  version_requirements: !ruby/object:Gem::Requirement
65
37
  requirements:
66
38
  - - "~>"
67
39
  - !ruby/object:Gem::Version
68
- version: '5.0'
40
+ version: '2.3'
69
41
  - !ruby/object:Gem::Dependency
70
42
  name: logger
71
43
  requirement: !ruby/object:Gem::Requirement
@@ -108,61 +80,75 @@ dependencies:
108
80
  - - '='
109
81
  - !ruby/object:Gem::Version
110
82
  version: 2.9.4
111
- - !ruby/object:Gem::Dependency
112
- name: execjs
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '2.7'
118
- type: :runtime
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '2.7'
125
- - !ruby/object:Gem::Dependency
126
- name: json
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '2.0'
132
- type: :runtime
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '2.0'
139
- description: Library to work with audios on popular Russian social network vk.com.
140
- VK disabled their public API for audios, so it is now necessary to use parsers instead.
83
+ description: A library to work with audios on popular Russian social network
141
84
  email:
142
85
  - fizvlad@mail.ru
143
86
  executables: []
144
87
  extensions: []
145
88
  extra_rdoc_files: []
146
89
  files:
90
+ - ".env.example"
91
+ - ".github/workflows/ruby.yml"
147
92
  - ".gitignore"
148
- - ".travis.yml"
93
+ - ".rspec"
94
+ - ".rubocop.yml"
149
95
  - Gemfile
150
96
  - Gemfile.lock
151
97
  - LICENSE.txt
152
98
  - README.md
153
99
  - Rakefile
154
100
  - bin/console
155
- - bin/setup
156
101
  - lib/vk_music.rb
157
102
  - lib/vk_music/audio.rb
158
103
  - lib/vk_music/client.rb
159
- - lib/vk_music/constants.rb
160
- - lib/vk_music/exceptions.rb
161
- - lib/vk_music/link_decoder.rb
162
104
  - lib/vk_music/playlist.rb
105
+ - lib/vk_music/request.rb
106
+ - lib/vk_music/request/artist.rb
107
+ - lib/vk_music/request/audios_reload.rb
108
+ - lib/vk_music/request/base.rb
109
+ - lib/vk_music/request/login.rb
110
+ - lib/vk_music/request/my_page.rb
111
+ - lib/vk_music/request/playlist.rb
112
+ - lib/vk_music/request/playlist_section.rb
113
+ - lib/vk_music/request/post.rb
114
+ - lib/vk_music/request/profile.rb
115
+ - lib/vk_music/request/search.rb
116
+ - lib/vk_music/request/wall_section.rb
163
117
  - lib/vk_music/utility.rb
164
- - lib/vk_music/utility/log.rb
118
+ - lib/vk_music/utility/artist_loader.rb
119
+ - lib/vk_music/utility/artist_url_parser.rb
120
+ - lib/vk_music/utility/audio_data_parser.rb
121
+ - lib/vk_music/utility/audio_items_parser.rb
122
+ - lib/vk_music/utility/audio_node_parser.rb
123
+ - lib/vk_music/utility/audios_from_ids_loader.rb
124
+ - lib/vk_music/utility/audios_ids_getter.rb
125
+ - lib/vk_music/utility/audios_loader.rb
126
+ - lib/vk_music/utility/data_type_guesser.rb
127
+ - lib/vk_music/utility/duration_parser.rb
128
+ - lib/vk_music/utility/last_profile_post_loader.rb
129
+ - lib/vk_music/utility/link_decoder.rb
130
+ - lib/vk_music/utility/node_text_children_reader.rb
131
+ - lib/vk_music/utility/playlist_loader.rb
132
+ - lib/vk_music/utility/playlist_node_parser.rb
133
+ - lib/vk_music/utility/playlist_section_loader.rb
134
+ - lib/vk_music/utility/playlist_url_parser.rb
135
+ - lib/vk_music/utility/post_loader.rb
136
+ - lib/vk_music/utility/post_url_parser.rb
137
+ - lib/vk_music/utility/profile_id_resolver.rb
138
+ - lib/vk_music/utility/wall_loader.rb
165
139
  - lib/vk_music/version.rb
140
+ - lib/vk_music/web_parser.rb
141
+ - lib/vk_music/web_parser/artist.rb
142
+ - lib/vk_music/web_parser/audios_reload.rb
143
+ - lib/vk_music/web_parser/base.rb
144
+ - lib/vk_music/web_parser/login.rb
145
+ - lib/vk_music/web_parser/my_page.rb
146
+ - lib/vk_music/web_parser/playlist.rb
147
+ - lib/vk_music/web_parser/playlist_section.rb
148
+ - lib/vk_music/web_parser/post.rb
149
+ - lib/vk_music/web_parser/profile.rb
150
+ - lib/vk_music/web_parser/search.rb
151
+ - lib/vk_music/web_parser/wall_section.rb
166
152
  - vk_music.gemspec
167
153
  homepage: https://github.com/fizvlad/vk-music-rb
168
154
  licenses:
@@ -179,15 +165,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
179
165
  requirements:
180
166
  - - ">="
181
167
  - !ruby/object:Gem::Version
182
- version: 2.3.1
168
+ version: 2.7.1
183
169
  required_rubygems_version: !ruby/object:Gem::Requirement
184
170
  requirements:
185
171
  - - ">="
186
172
  - !ruby/object:Gem::Version
187
173
  version: '0'
188
174
  requirements: []
189
- rubygems_version: 3.1.4
175
+ rubygems_version: 3.2.3
190
176
  signing_key:
191
177
  specification_version: 4
192
- summary: Provides interface to work with VK music via HTTP requests
178
+ summary: A library to work with audios on popular Russian social network
193
179
  test_files: []