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.
- checksums.yaml +4 -4
- data/.env.example +3 -0
- data/.github/workflows/ruby.yml +35 -0
- data/.gitignore +6 -0
- data/.rspec +1 -0
- data/.rubocop.yml +56 -0
- data/Gemfile +38 -10
- data/Gemfile.lock +124 -70
- data/LICENSE.txt +0 -0
- data/README.md +121 -94
- data/Rakefile +15 -22
- data/bin/console +18 -24
- data/lib/vk_music.rb +32 -18
- data/lib/vk_music/audio.rb +112 -187
- data/lib/vk_music/client.rb +193 -677
- data/lib/vk_music/playlist.rb +44 -97
- data/lib/vk_music/request.rb +13 -0
- data/lib/vk_music/request/artist.rb +24 -0
- data/lib/vk_music/request/audios_reload.rb +29 -0
- data/lib/vk_music/request/base.rb +75 -0
- data/lib/vk_music/request/login.rb +35 -0
- data/lib/vk_music/request/my_page.rb +21 -0
- data/lib/vk_music/request/playlist.rb +31 -0
- data/lib/vk_music/request/playlist_section.rb +35 -0
- data/lib/vk_music/request/post.rb +22 -0
- data/lib/vk_music/request/profile.rb +24 -0
- data/lib/vk_music/request/search.rb +34 -0
- data/lib/vk_music/request/wall_section.rb +34 -0
- data/lib/vk_music/utility.rb +8 -78
- data/lib/vk_music/utility/artist_loader.rb +17 -0
- data/lib/vk_music/utility/artist_url_parser.rb +22 -0
- data/lib/vk_music/utility/audio_data_parser.rb +37 -0
- data/lib/vk_music/utility/audio_items_parser.rb +18 -0
- data/lib/vk_music/utility/audio_node_parser.rb +59 -0
- data/lib/vk_music/utility/audios_from_ids_loader.rb +21 -0
- data/lib/vk_music/utility/audios_ids_getter.rb +25 -0
- data/lib/vk_music/utility/audios_loader.rb +37 -0
- data/lib/vk_music/utility/data_type_guesser.rb +48 -0
- data/lib/vk_music/utility/duration_parser.rb +17 -0
- data/lib/vk_music/utility/last_profile_post_loader.rb +26 -0
- data/lib/vk_music/utility/link_decoder.rb +107 -0
- data/lib/vk_music/utility/node_text_children_reader.rb +14 -0
- data/lib/vk_music/utility/playlist_loader.rb +30 -0
- data/lib/vk_music/utility/playlist_node_parser.rb +21 -0
- data/lib/vk_music/utility/playlist_section_loader.rb +29 -0
- data/lib/vk_music/utility/playlist_url_parser.rb +32 -0
- data/lib/vk_music/utility/post_loader.rb +23 -0
- data/lib/vk_music/utility/post_url_parser.rb +24 -0
- data/lib/vk_music/utility/profile_id_resolver.rb +58 -0
- data/lib/vk_music/utility/wall_loader.rb +25 -0
- data/lib/vk_music/version.rb +7 -5
- data/lib/vk_music/web_parser.rb +9 -0
- data/lib/vk_music/web_parser/artist.rb +16 -0
- data/lib/vk_music/web_parser/audios_reload.rb +20 -0
- data/lib/vk_music/web_parser/base.rb +27 -0
- data/lib/vk_music/web_parser/login.rb +13 -0
- data/lib/vk_music/web_parser/my_page.rb +19 -0
- data/lib/vk_music/web_parser/playlist.rb +33 -0
- data/lib/vk_music/web_parser/playlist_section.rb +53 -0
- data/lib/vk_music/web_parser/post.rb +15 -0
- data/lib/vk_music/web_parser/profile.rb +33 -0
- data/lib/vk_music/web_parser/search.rb +56 -0
- data/lib/vk_music/web_parser/wall_section.rb +53 -0
- data/vk_music.gemspec +36 -40
- metadata +63 -77
- data/.travis.yml +0 -7
- data/bin/setup +0 -8
- data/lib/vk_music/constants.rb +0 -78
- data/lib/vk_music/exceptions.rb +0 -21
- data/lib/vk_music/link_decoder.rb +0 -102
- 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
|
data/vk_music.gemspec
CHANGED
@@ -1,40 +1,36 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
spec.
|
9
|
-
spec.
|
10
|
-
|
11
|
-
spec.
|
12
|
-
|
13
|
-
spec.
|
14
|
-
spec.
|
15
|
-
|
16
|
-
spec.
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
spec.metadata[
|
21
|
-
spec.metadata[
|
22
|
-
|
23
|
-
|
24
|
-
#
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
spec.
|
32
|
-
spec.
|
33
|
-
spec.
|
34
|
-
|
35
|
-
spec.add_runtime_dependency
|
36
|
-
|
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:
|
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:
|
11
|
+
date: 2021-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
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: '
|
48
|
-
type: :
|
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: '
|
26
|
+
version: '2.7'
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
28
|
+
name: json
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
58
30
|
requirements:
|
59
31
|
- - "~>"
|
60
32
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
62
|
-
type: :
|
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: '
|
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
|
-
|
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
|
-
- ".
|
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/
|
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.
|
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.
|
175
|
+
rubygems_version: 3.2.3
|
190
176
|
signing_key:
|
191
177
|
specification_version: 4
|
192
|
-
summary:
|
178
|
+
summary: A library to work with audios on popular Russian social network
|
193
179
|
test_files: []
|