vk_music 3.0.0 → 3.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3e95f75b40e89ac4f7d51056b3412f343e171a92431ebab522a998120df7f2d8
4
- data.tar.gz: 03613c0cd92fd68728c25f04442c8d8f7c24276b52c7e2af4c4c448a319c9c10
3
+ metadata.gz: 745b91709f47cb2b6b5bcaa013824a51f836977ecbe4cd1259a74d4a6f56e8c8
4
+ data.tar.gz: 9a7a2e9998adcd73a0c87d2934c6e763e8c76fdedcf08f757543497395e64322
5
5
  SHA512:
6
- metadata.gz: c32a1cabae2d9307e074132ccc69edf174df097d5fbf4c9a2fc596f33ca58f1cbbf49dab2c9ddbf21200e9f76326ab7926c1c68fc8b0dc81837c9faf1e9273f4
7
- data.tar.gz: b836b42444769bde9ea746aafa62300800d0d4c5e673b8c6ce6c4ff060ce20d152a8fd6b18189d1c63dce3d0203def9aab42d20fc2c4db181489906f8dcced01
6
+ metadata.gz: 1bd33552a23e56c0372500fc1edc20736afed079f650d4405650a91a48d01300269aeb37f51935c2c9916c4ee52449b7abb29949e7b32eb572e4641ac0e05e13
7
+ data.tar.gz: a252e563da14bcf249e72ab997414dbdb14388fa2308f24afc99f0507d6c003bfd5f80e0335db8df30b8d1eb7300036c2380ad99fd47cf402083238891c4ba17
@@ -1,66 +1,69 @@
1
- PATH
2
- remote: .
3
- specs:
4
- vk_music (3.0.0)
5
- execjs (~> 2.7)
6
- json (~> 2.0)
7
- logger (~> 1.4)
8
- mechanize (~> 2.7)
9
- net-http-persistent (= 2.9.4)
10
-
11
- GEM
12
- remote: https://rubygems.org/
13
- specs:
14
- coderay (1.1.2)
15
- domain_name (0.5.20190701)
16
- unf (>= 0.0.5, < 1.0.0)
17
- execjs (2.7.0)
18
- http-cookie (1.0.3)
19
- domain_name (~> 0.5)
20
- json (2.2.0)
21
- logger (1.4.1)
22
- mechanize (2.7.6)
23
- domain_name (~> 0.5, >= 0.5.1)
24
- http-cookie (~> 1.0)
25
- mime-types (>= 1.17.2)
26
- net-http-digest_auth (~> 1.1, >= 1.1.1)
27
- net-http-persistent (>= 2.5.2)
28
- nokogiri (~> 1.6)
29
- ntlm-http (~> 0.1, >= 0.1.1)
30
- webrobots (>= 0.0.9, < 0.2)
31
- method_source (0.9.2)
32
- mime-types (3.3)
33
- mime-types-data (~> 3.2015)
34
- mime-types-data (3.2019.1009)
35
- mini_portile2 (2.4.0)
36
- minitest (5.13.0)
37
- net-http-digest_auth (1.4.1)
38
- net-http-persistent (2.9.4)
39
- nokogiri (1.10.7-x64-mingw32)
40
- mini_portile2 (~> 2.4.0)
41
- ntlm-http (0.1.1)
42
- pry (0.12.2)
43
- coderay (~> 1.1.0)
44
- method_source (~> 0.9.0)
45
- rake (10.5.0)
46
- unf (0.1.4)
47
- unf_ext
48
- unf_ext (0.0.7.6)
49
- webrobots (0.1.2)
50
- yard (0.9.20)
51
-
52
- PLATFORMS
53
- x64-mingw32
54
-
55
- DEPENDENCIES
56
- bundler (~> 2.0)
57
- logger (~> 1.4)
58
- mechanize (~> 2.7)
59
- minitest (~> 5.0)
60
- pry (~> 0.12.2)
61
- rake (~> 10.0)
62
- vk_music!
63
- yard (~> 0.9)
64
-
65
- BUNDLED WITH
66
- 2.0.2
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ vk_music (3.1.3)
5
+ execjs (~> 2.7)
6
+ json (~> 2.0)
7
+ logger (~> 1.4)
8
+ mechanize (~> 2.7)
9
+ net-http-persistent (= 2.9.4)
10
+
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ specs:
14
+ coderay (1.1.2)
15
+ domain_name (0.5.20190701)
16
+ unf (>= 0.0.5, < 1.0.0)
17
+ execjs (2.7.0)
18
+ http-cookie (1.0.3)
19
+ domain_name (~> 0.5)
20
+ json (2.3.0)
21
+ logger (1.4.1)
22
+ mechanize (2.7.6)
23
+ domain_name (~> 0.5, >= 0.5.1)
24
+ http-cookie (~> 1.0)
25
+ mime-types (>= 1.17.2)
26
+ net-http-digest_auth (~> 1.1, >= 1.1.1)
27
+ net-http-persistent (>= 2.5.2)
28
+ nokogiri (~> 1.6)
29
+ ntlm-http (~> 0.1, >= 0.1.1)
30
+ webrobots (>= 0.0.9, < 0.2)
31
+ method_source (0.9.2)
32
+ mime-types (3.3)
33
+ mime-types-data (~> 3.2015)
34
+ mime-types-data (3.2019.1009)
35
+ mini_portile2 (2.4.0)
36
+ minitest (5.13.0)
37
+ net-http-digest_auth (1.4.1)
38
+ net-http-persistent (2.9.4)
39
+ nokogiri (1.10.8)
40
+ mini_portile2 (~> 2.4.0)
41
+ nokogiri (1.10.8-x64-mingw32)
42
+ mini_portile2 (~> 2.4.0)
43
+ ntlm-http (0.1.1)
44
+ pry (0.12.2)
45
+ coderay (~> 1.1.0)
46
+ method_source (~> 0.9.0)
47
+ rake (13.0.1)
48
+ unf (0.1.4)
49
+ unf_ext
50
+ unf_ext (0.0.7.6)
51
+ webrobots (0.1.2)
52
+ yard (0.9.20)
53
+
54
+ PLATFORMS
55
+ ruby
56
+ x64-mingw32
57
+
58
+ DEPENDENCIES
59
+ bundler (~> 2.0)
60
+ logger (~> 1.4)
61
+ mechanize (~> 2.7)
62
+ minitest (~> 5.0)
63
+ pry (~> 0.12.2)
64
+ rake (~> 13.0)
65
+ vk_music!
66
+ yard (~> 0.9)
67
+
68
+ BUNDLED WITH
69
+ 2.0.2
data/README.md CHANGED
@@ -71,6 +71,13 @@ audios = client.post(url: "https://vk.com/wall-4790861_5453")
71
71
  urls = audios.map(&:url) # URLs for every audio
72
72
  ```
73
73
 
74
+ ### Recommended audios and etc
75
+ You can load audios from recommended sections, novices and VK charts:
76
+
77
+ ```ruby
78
+ audios = client.block(url: "https://m.vk.com/audio?act=block&block=PUlQVA8GR0R3W0tMF2teRGpJUVQPGVpfdF1YRwMGXUpkXktMF2tYUWRHS0IXDlpKZFpcVA8FFg")
79
+ ```
80
+
74
81
 
75
82
  ## Development
76
83
 
@@ -7,4 +7,18 @@ require "vk_music"
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
9
  require "pry"
10
+
11
+ print "Login (leave this empty if no login required): "
12
+ username = STDIN.gets.chomp
13
+
14
+ unless username.empty?
15
+ print "Password: "
16
+ password = STDIN.gets.chomp
17
+ puts
18
+
19
+ $client = VkMusic::Client.new(username: username, password: password)
20
+ puts "You can now access client at $client"
21
+ end
22
+ puts
23
+
10
24
  Pry.start
@@ -120,6 +120,7 @@ module VkMusic
120
120
  @owner_id = owner_id
121
121
  @secret_1 = secret_1
122
122
  @secret_2 = secret_2
123
+ @secret_1 = @secret_2 if @secret_1.nil? || @secret_1.empty?
123
124
  @artist = artist.strip
124
125
  @title = title.strip
125
126
  @duration = duration
@@ -81,7 +81,7 @@ module VkMusic
81
81
  raise Exceptions::ParseError
82
82
  end
83
83
  raise ArgumentError unless owner_id && playlist_id
84
- use_web = up_to > 200 if use_web.nil?
84
+ use_web ||= (up_to <= 200)
85
85
  if use_web
86
86
  playlist_web(owner_id, playlist_id, access_hash, up_to: up_to)
87
87
  else
@@ -196,6 +196,7 @@ module VkMusic
196
196
  end
197
197
  end
198
198
  alias_method :from_id, :get_urls
199
+
199
200
  ##
200
201
  # Update download URLs of audios.
201
202
  # @param audios [Array<Audio>]
@@ -207,6 +208,25 @@ module VkMusic
207
208
  end
208
209
  end
209
210
 
211
+ ##
212
+ # Retrieve audios from recommendations or alike pages.
213
+ # Specify either +url+ or +block_id+.
214
+ # @param url [String] URL.
215
+ # @param block_id [String] ID of block.
216
+ # @return [Array<Audio>] array of audios attached to post. Most of audios will
217
+ # already have download URLs, but there might be audios which can't be resolved.
218
+ def block(url: nil, block_id: nil)
219
+ begin
220
+ block_id = url.match(Constants::Regex::VK_BLOCK_URL).captures.first if url
221
+ rescue
222
+ raise Exceptions::ParseError
223
+ end
224
+
225
+ uri = URI(Constants::URL::VK[:audios])
226
+ uri.query = Utility.hash_to_params({ "act" => "block", "block" => block_id })
227
+ audios_from_page(uri)
228
+ end
229
+
210
230
  ##
211
231
  # @!endgroup
212
232
 
@@ -419,7 +439,10 @@ module VkMusic
419
439
  def audios_from_page(obj)
420
440
  page = obj.is_a?(Mechanize::Page) ? obj : load_page(obj)
421
441
  begin
422
- page.css(".audio_item.ai_has_btn").map { |elem| Audio.from_node(elem, @id) }
442
+ page.css(".audio_item.ai_has_btn").map do |elem|
443
+ data = JSON.parse(elem.attribute("data-audio"))
444
+ Audio.from_data(data, @id)
445
+ end
423
446
  rescue
424
447
  raise Exceptions::ParseError
425
448
  end
@@ -444,26 +467,7 @@ module VkMusic
444
467
  # @param up_to [Integer] if less than 0, all audios will be loaded.
445
468
  # @return [Playlist]
446
469
  def playlist_web(owner_id, playlist_id, access_hash = nil, up_to: -1)
447
- # Load first page and get info
448
- first_page = load_page_playlist(owner_id, playlist_id, access_hash, offset: 0)
449
- begin
450
- # Parse out essential data
451
- title = first_page.at_css(".audioPlaylist__title").text.strip
452
- subtitle = first_page.at_css(".audioPlaylist__subtitle").text.strip
453
-
454
- footer_node = first_page.at_css(".audioPlaylist__footer")
455
- if footer_node
456
- footer_match = footer_node.text.strip.match(/^\d+/)
457
- real_size = footer_match ? footer_match[0].to_i : 0
458
- else
459
- real_size = 0
460
- end
461
- rescue
462
- raise Exceptions::ParseError
463
- end
464
- # Now we can be sure we are on correct page and have essential data.
465
-
466
- first_page_audios = audios_from_page(first_page)
470
+ first_page_audios, title, subtitle, real_size = playlist_first_page_web(owner_id, playlist_id, access_hash || "")
467
471
 
468
472
  # Check whether need to make additional requests
469
473
  up_to = real_size if (up_to < 0 || up_to > real_size)
@@ -491,18 +495,16 @@ module VkMusic
491
495
  # @param up_to [Integer] if less than 0, all audios will be loaded.
492
496
  # @return [Playlist]
493
497
  def playlist_json(owner_id, playlist_id, access_hash, up_to: -1)
494
- # Trying to parse out audios
495
- first_json = load_json_playlist_section(owner_id, playlist_id, access_hash, offset: 0)
496
- begin
497
- first_data = first_json["data"][0]
498
- first_data_audios = audios_from_data(first_data["list"])
499
- rescue
500
- raise Exceptions::ParseError
498
+ if playlist_id == -1
499
+ first_audios, title, subtitle, real_size = playlist_first_page_json(owner_id, playlist_id, access_hash || "")
500
+ else
501
+ first_audios, title, subtitle, real_size = playlist_first_page_web(owner_id, playlist_id, access_hash || "")
501
502
  end
503
+ # NOTE: We need to load first page from web to be able to unmask links in future
502
504
 
503
- real_size = first_data["totalCount"]
505
+ # Check whether need to make additional requests
504
506
  up_to = real_size if (up_to < 0 || up_to > real_size)
505
- list = first_data_audios.first(up_to)
507
+ list = first_audios.first(up_to)
506
508
  while list.length < up_to do
507
509
  json = load_json_playlist_section(owner_id, playlist_id, access_hash, offset: list.length)
508
510
  audios = begin
@@ -515,11 +517,11 @@ module VkMusic
515
517
 
516
518
  begin
517
519
  Playlist.new(list,
518
- id: first_data["id"],
519
- owner_id: first_data["owner_id"],
520
- access_hash: first_data["access_hash"],
521
- title: CGI.unescapeHTML(first_data["title"].to_s),
522
- subtitle: CGI.unescapeHTML(first_data["subtitle"].to_s),
520
+ id: playlist_id,
521
+ owner_id: owner_id,
522
+ access_hash: access_hash,
523
+ title: title,
524
+ subtitle: subtitle,
523
525
  real_size: real_size
524
526
  )
525
527
  rescue
@@ -527,6 +529,57 @@ module VkMusic
527
529
  end
528
530
  end
529
531
 
532
+ ##
533
+ # Load playlist first page in web and return essential data.
534
+ # @note not suitable for user audios
535
+ # @param owner_id [Integer]
536
+ # @param playlist_id [Integer]
537
+ # @param access_hash [String, nil]
538
+ # @return [Array<Array, String, String, Integer>] array with audios from first page, title, subtitle and playlist real size.
539
+ def playlist_first_page_web(owner_id, playlist_id, access_hash)
540
+ first_page = load_page_playlist(owner_id, playlist_id, access_hash, offset: 0)
541
+ begin
542
+ # Parse out essential data
543
+ title = first_page.at_css(".audioPlaylist__title").text.strip
544
+ subtitle = first_page.at_css(".audioPlaylist__subtitle").text.strip
545
+
546
+ footer_node = first_page.at_css(".audioPlaylist__footer")
547
+ if footer_node
548
+ footer_match = footer_node.text.strip.match(/^\d+/)
549
+ real_size = footer_match ? footer_match[0].to_i : 0
550
+ else
551
+ real_size = 0
552
+ end
553
+
554
+ first_audios = audios_from_page(first_page)
555
+ rescue
556
+ raise Exceptions::ParseError
557
+ end
558
+ [first_audios, title, subtitle, real_size]
559
+ end
560
+
561
+ ##
562
+ # Load playlist first page in JSON and return essential data.
563
+ # @param owner_id [Integer]
564
+ # @param playlist_id [Integer]
565
+ # @param access_hash [String, nil]
566
+ # @return [Array<Array, String, String, Integer>] array with audios from first page, title, subtitle and playlist real size.
567
+ def playlist_first_page_json(owner_id, playlist_id, access_hash)
568
+ first_json = load_json_playlist_section(owner_id, playlist_id, access_hash, offset: 0)
569
+ begin
570
+ first_data = first_json["data"][0]
571
+ first_data_audios = audios_from_data(first_data["list"])
572
+ rescue
573
+ raise Exceptions::ParseError
574
+ end
575
+
576
+ real_size = first_data["totalCount"]
577
+ title = CGI.unescapeHTML(first_data["title"].to_s)
578
+ subtitle = CGI.unescapeHTML(first_data["subtitle"].to_s)
579
+
580
+ [first_data_audios, title, subtitle, real_size]
581
+ end
582
+
530
583
  ##
531
584
  # Found playlist URLs on *global* search page.
532
585
  # @param obj [Mechanize::Page, String, URI]
@@ -534,7 +587,7 @@ module VkMusic
534
587
  def playlist_urls_from_page(obj)
535
588
  page = obj.is_a?(Mechanize::Page) ? obj : load_page(obj)
536
589
  begin
537
- page.css(".AudioShowcase__block_playlists .AudioPlaylistSlider .al_playlist").map { |elem| elem.attribute("href").to_s }
590
+ page.css(".AudioBlock_music_playlists .AudioPlaylistSlider .al_playlist").map { |elem| elem.attribute("href").to_s }
538
591
  rescue
539
592
  raise Exceptions::ParseError
540
593
  end
@@ -22,7 +22,7 @@ module VkMusic
22
22
  login_action: "https://login.vk.com",
23
23
  wall: "https://m.vk.com/wall",
24
24
  audio_unavailable: "https://m.vk.com/mp3/audio_api_unavailable.mp3",
25
- profile_audios: "https://m.vk.com/audios",
25
+ profile_audios: "https://m.vk.com/audios"
26
26
  }
27
27
  end
28
28
 
@@ -52,13 +52,16 @@ module VkMusic
52
52
  VK_AUDIOS_URL_POSTFIX = /^audios(-?\d+)$/
53
53
  ##
54
54
  # Playlist URL regular expression.
55
- VK_PLAYLIST_URL_POSTFIX = /.*(?:audio_playlist|album\/)(-?\d+)_(\d+)(?:(?:(?:.*(?=&access_hash=)&access_hash=)|\/|%2F|_)([\da-z]+))?/
55
+ VK_PLAYLIST_URL_POSTFIX = /.*(?:audio_playlist|album\/|playlist\/)(-?\d+)_(\d+)(?:(?:(?:.*(?=&access_hash=)&access_hash=)|\/|%2F|_)([\da-z]+))?/
56
56
  ##
57
57
  # Post URL regular expression #1.
58
58
  VK_POST_URL_POSTFIX = /.*post(-?\d+)_(\d+)/
59
59
  ##
60
60
  # Post URL regular expression #2.
61
61
  VK_WALL_URL_POSTFIX = /.*wall(-?\d+)_(\d+)/
62
+ ##
63
+ # Audios block ID
64
+ VK_BLOCK_URL = /(?:section=recoms_block&type=|act=block&block=)([a-zA-Z\d]+)/
62
65
  end
63
66
 
64
67
  ##
@@ -29,6 +29,8 @@ module VkMusic
29
29
  :playlist
30
30
  when Constants::Regex::VK_WALL_URL_POSTFIX, Constants::Regex::VK_POST_URL_POSTFIX
31
31
  :post
32
+ when Constants::Regex::VK_BLOCK_URL
33
+ :block
32
34
  when Constants::Regex::VK_URL
33
35
  :audios
34
36
  else
@@ -1,5 +1,5 @@
1
1
  module VkMusic
2
2
  ##
3
3
  # Library version.
4
- VERSION = "3.0.0"
4
+ VERSION = "3.1.4"
5
5
  end
@@ -1,40 +1,40 @@
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", "~> 10.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
+ 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
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vk_music
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fizvlad
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-29 00:00:00.000000000 Z
11
+ date: 2020-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: yard
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -186,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
186
  - !ruby/object:Gem::Version
187
187
  version: '0'
188
188
  requirements: []
189
- rubygems_version: 3.0.4
189
+ rubygems_version: 3.1.0.pre2
190
190
  signing_key:
191
191
  specification_version: 4
192
192
  summary: Provides interface to work with VK music via HTTP requests