vk_music 3.1.4 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) 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 +76 -25
  9. data/LICENSE.txt +0 -0
  10. data/README.md +113 -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 +111 -187
  15. data/lib/vk_music/client.rb +187 -645
  16. data/lib/vk_music/playlist.rb +44 -97
  17. data/lib/vk_music/request.rb +13 -0
  18. data/lib/vk_music/request/audios.rb +29 -0
  19. data/lib/vk_music/request/base.rb +75 -0
  20. data/lib/vk_music/request/login.rb +35 -0
  21. data/lib/vk_music/request/my_page.rb +21 -0
  22. data/lib/vk_music/request/playlist.rb +31 -0
  23. data/lib/vk_music/request/playlist_section.rb +35 -0
  24. data/lib/vk_music/request/post.rb +22 -0
  25. data/lib/vk_music/request/profile.rb +24 -0
  26. data/lib/vk_music/request/search.rb +34 -0
  27. data/lib/vk_music/request/wall_section.rb +34 -0
  28. data/lib/vk_music/utility.rb +8 -78
  29. data/lib/vk_music/utility/audio_data_parser.rb +37 -0
  30. data/lib/vk_music/utility/audio_items_parser.rb +18 -0
  31. data/lib/vk_music/utility/audio_node_parser.rb +59 -0
  32. data/lib/vk_music/utility/audios_from_ids_loader.rb +21 -0
  33. data/lib/vk_music/utility/audios_ids_getter.rb +25 -0
  34. data/lib/vk_music/utility/audios_loader.rb +37 -0
  35. data/lib/vk_music/utility/data_type_guesser.rb +43 -0
  36. data/lib/vk_music/utility/duration_parser.rb +17 -0
  37. data/lib/vk_music/utility/last_profile_post_loader.rb +26 -0
  38. data/lib/vk_music/utility/link_decoder.rb +106 -0
  39. data/lib/vk_music/utility/node_text_children_reader.rb +14 -0
  40. data/lib/vk_music/utility/playlist_loader.rb +30 -0
  41. data/lib/vk_music/utility/playlist_node_parser.rb +21 -0
  42. data/lib/vk_music/utility/playlist_section_loader.rb +29 -0
  43. data/lib/vk_music/utility/playlist_url_parser.rb +32 -0
  44. data/lib/vk_music/utility/post_loader.rb +23 -0
  45. data/lib/vk_music/utility/post_url_parser.rb +24 -0
  46. data/lib/vk_music/utility/profile_id_resolver.rb +58 -0
  47. data/lib/vk_music/utility/wall_loader.rb +25 -0
  48. data/lib/vk_music/version.rb +7 -5
  49. data/lib/vk_music/web_parser.rb +9 -0
  50. data/lib/vk_music/web_parser/audios.rb +20 -0
  51. data/lib/vk_music/web_parser/base.rb +27 -0
  52. data/lib/vk_music/web_parser/login.rb +13 -0
  53. data/lib/vk_music/web_parser/my_page.rb +19 -0
  54. data/lib/vk_music/web_parser/playlist.rb +33 -0
  55. data/lib/vk_music/web_parser/playlist_section.rb +53 -0
  56. data/lib/vk_music/web_parser/post.rb +15 -0
  57. data/lib/vk_music/web_parser/profile.rb +33 -0
  58. data/lib/vk_music/web_parser/search.rb +56 -0
  59. data/lib/vk_music/web_parser/wall_section.rb +53 -0
  60. data/vk_music.gemspec +36 -40
  61. metadata +59 -77
  62. data/.travis.yml +0 -7
  63. data/bin/setup +0 -8
  64. data/lib/vk_music/constants.rb +0 -78
  65. data/lib/vk_music/exceptions.rb +0 -21
  66. data/lib/vk_music/link_decoder.rb +0 -102
  67. data/lib/vk_music/utility/log.rb +0 -51
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 745b91709f47cb2b6b5bcaa013824a51f836977ecbe4cd1259a74d4a6f56e8c8
4
- data.tar.gz: 9a7a2e9998adcd73a0c87d2934c6e763e8c76fdedcf08f757543497395e64322
3
+ metadata.gz: 1a54709405afad78ce1cfc55e5487ecb55d8a7930e3ef511997175eb01995c9a
4
+ data.tar.gz: dc49da61941078903e7b3da469631ba7d4eb266260ceed882a1b811e11d3ddaf
5
5
  SHA512:
6
- metadata.gz: 1bd33552a23e56c0372500fc1edc20736afed079f650d4405650a91a48d01300269aeb37f51935c2c9916c4ee52449b7abb29949e7b32eb572e4641ac0e05e13
7
- data.tar.gz: a252e563da14bcf249e72ab997414dbdb14388fa2308f24afc99f0507d6c003bfd5f80e0335db8df30b8d1eb7300036c2380ad99fd47cf402083238891c4ba17
6
+ metadata.gz: dc27e9b56575d82481157b0cbde9d4ad742fd002f117601c8b8461422cb956bd18654f477499459480c1b298f768452ff01586017a0121865b8cc446feb1c444
7
+ data.tar.gz: 21a10dc20607098e432f9da31172c74d83f59b2e2cb41879d9aaaa25f3907c3bffbbc2440195f121178a5d349aed7f7f69cf7ccf1f8913d8cf82920f32012e94
@@ -0,0 +1,3 @@
1
+ # VkMusic spcification loads ENV variables from .env files
2
+ VK_LOGIN=+79991234567
3
+ VK_PASSWORD=password
@@ -0,0 +1,35 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+
21
+ steps:
22
+ - uses: actions/checkout@v2
23
+ - name: Set up Ruby
24
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
25
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
26
+ # uses: ruby/setup-ruby@v1
27
+ uses: ruby/setup-ruby@v1.52.0
28
+ with:
29
+ ruby-version: 2.7.2
30
+ - name: Install dependencies
31
+ run: bundle install
32
+ - name: Run rubocop
33
+ run: bundle exec rake rubocop
34
+ - name: Run yarddoc
35
+ run: bundle exec rake yard
data/.gitignore CHANGED
@@ -1,8 +1,14 @@
1
+ /.env
2
+ /.byebug_history
1
3
  /.bundle/
4
+ /.legacy/
2
5
  /.yardoc
3
6
  /_yardoc/
4
7
  /coverage/
5
8
  /doc/
6
9
  /pkg/
7
10
  /spec/reports/
11
+ /spec/.cookies
12
+ /spec/cassetes/*
13
+ !/spec/cassetes/README.md
8
14
  /tmp/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
@@ -0,0 +1,56 @@
1
+ # The behavior of RuboCop can be controlled via the .rubocop.yml
2
+ # configuration file. It makes it possible to enable/disable
3
+ # certain cops (checks) and to alter their behavior if they accept
4
+ # any parameters. The file can be placed either in your home
5
+ # directory or in some project directory.
6
+ #
7
+ # RuboCop will start looking for the configuration file in the directory
8
+ # where the inspected file is and continue its way up to the root directory.
9
+ #
10
+ # See https://docs.rubocop.org/rubocop/configuration
11
+
12
+ AllCops:
13
+ TargetRubyVersion: 2.7
14
+ EnabledByDefault: true
15
+
16
+ Layout/FirstMethodParameterLineBreak:
17
+ Enabled: false
18
+ Layout/FirstMethodArgumentLineBreak:
19
+ Enabled: false
20
+ Layout/MultilineMethodArgumentLineBreaks:
21
+ Enabled: false
22
+ Layout/EndOfLine:
23
+ Enabled: false
24
+ Layout/EndAlignment:
25
+ EnforcedStyleAlignWith: variable
26
+ Layout/FirstHashElementIndentation:
27
+ Enabled: false
28
+ Layout/MultilineAssignmentLayout:
29
+ EnforcedStyle: same_line
30
+ Layout/CaseIndentation:
31
+ EnforcedStyle: end
32
+ Lint/ConstantResolution:
33
+ Enabled: false
34
+ Metrics/ParameterLists:
35
+ Enabled: false
36
+ Metrics/BlockLength:
37
+ Exclude:
38
+ - 'spec/**/*_spec.rb'
39
+ Style/MethodCallWithArgsParentheses:
40
+ Enabled: false
41
+ Style/Copyright:
42
+ Enabled: false
43
+ Style/ClassVars:
44
+ Enabled: false
45
+ Style/MissingElse:
46
+ Enabled: false
47
+ Style/StringHashKeys:
48
+ Enabled: false
49
+ Style/ImplicitRuntimeError:
50
+ Enabled: false
51
+ Style/NumericLiterals:
52
+ Enabled: false
53
+ Style/DisableCopsWithinSourceCodeDirective:
54
+ Enabled: false
55
+ Layout/MultilineHashKeyLineBreaks:
56
+ Enabled: false
data/Gemfile CHANGED
@@ -1,10 +1,38 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in vk_music.gemspec
4
- gemspec
5
-
6
- gem "logger", "~> 1.4"
7
-
8
- gem "mechanize", "~> 2.7"
9
-
10
- gem "pry", "~> 0.12.2"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in vk_music.gemspec
6
+ gemspec
7
+
8
+ group :test, :development do
9
+ # Debugging console
10
+ gem 'pry'
11
+
12
+ # Another debugging console
13
+ gem 'byebug'
14
+
15
+ # The thing, forcing you to write good code
16
+ gem 'rubocop', require: false
17
+
18
+ # Rake tasks
19
+ gem 'rake', require: false
20
+
21
+ # Testing
22
+ gem 'rspec', require: false
23
+
24
+ # Docs
25
+ gem 'yard', require: false
26
+
27
+ # .env support
28
+ gem 'dotenv'
29
+
30
+ # Save web requests for fast and reliable testing
31
+ gem 'vcr'
32
+
33
+ # Stub web requests
34
+ gem 'webmock'
35
+
36
+ # Test coverage
37
+ gem 'simplecov', require: false, group: :test
38
+ end
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vk_music (3.1.3)
4
+ vk_music (4.0.1)
5
5
  execjs (~> 2.7)
6
- json (~> 2.0)
6
+ json (~> 2.3)
7
7
  logger (~> 1.4)
8
8
  mechanize (~> 2.7)
9
9
  net-http-persistent (= 2.9.4)
@@ -11,14 +11,23 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- coderay (1.1.2)
14
+ addressable (2.7.0)
15
+ public_suffix (>= 2.0.2, < 5.0)
16
+ ast (2.4.1)
17
+ byebug (11.1.3)
18
+ coderay (1.1.3)
19
+ crack (0.4.4)
20
+ diff-lcs (1.4.4)
21
+ docile (1.3.2)
15
22
  domain_name (0.5.20190701)
16
23
  unf (>= 0.0.5, < 1.0.0)
24
+ dotenv (2.7.6)
17
25
  execjs (2.7.0)
26
+ hashdiff (1.0.1)
18
27
  http-cookie (1.0.3)
19
28
  domain_name (~> 0.5)
20
- json (2.3.0)
21
- logger (1.4.1)
29
+ json (2.3.1)
30
+ logger (1.4.2)
22
31
  mechanize (2.7.6)
23
32
  domain_name (~> 0.5, >= 0.5.1)
24
33
  http-cookie (~> 1.0)
@@ -28,42 +37,84 @@ GEM
28
37
  nokogiri (~> 1.6)
29
38
  ntlm-http (~> 0.1, >= 0.1.1)
30
39
  webrobots (>= 0.0.9, < 0.2)
31
- method_source (0.9.2)
32
- mime-types (3.3)
40
+ method_source (1.0.0)
41
+ mime-types (3.3.1)
33
42
  mime-types-data (~> 3.2015)
34
- mime-types-data (3.2019.1009)
43
+ mime-types-data (3.2020.1104)
35
44
  mini_portile2 (2.4.0)
36
- minitest (5.13.0)
37
45
  net-http-digest_auth (1.4.1)
38
46
  net-http-persistent (2.9.4)
39
- nokogiri (1.10.8)
40
- mini_portile2 (~> 2.4.0)
41
- nokogiri (1.10.8-x64-mingw32)
47
+ nokogiri (1.10.10)
42
48
  mini_portile2 (~> 2.4.0)
43
49
  ntlm-http (0.1.1)
44
- pry (0.12.2)
45
- coderay (~> 1.1.0)
46
- method_source (~> 0.9.0)
50
+ parallel (1.19.2)
51
+ parser (2.7.2.0)
52
+ ast (~> 2.4.1)
53
+ pry (0.13.1)
54
+ coderay (~> 1.1)
55
+ method_source (~> 1.0)
56
+ public_suffix (4.0.6)
57
+ rainbow (3.0.0)
47
58
  rake (13.0.1)
59
+ regexp_parser (1.8.2)
60
+ rexml (3.2.4)
61
+ rspec (3.10.0)
62
+ rspec-core (~> 3.10.0)
63
+ rspec-expectations (~> 3.10.0)
64
+ rspec-mocks (~> 3.10.0)
65
+ rspec-core (3.10.0)
66
+ rspec-support (~> 3.10.0)
67
+ rspec-expectations (3.10.0)
68
+ diff-lcs (>= 1.2.0, < 2.0)
69
+ rspec-support (~> 3.10.0)
70
+ rspec-mocks (3.10.0)
71
+ diff-lcs (>= 1.2.0, < 2.0)
72
+ rspec-support (~> 3.10.0)
73
+ rspec-support (3.10.0)
74
+ rubocop (1.2.0)
75
+ parallel (~> 1.10)
76
+ parser (>= 2.7.1.5)
77
+ rainbow (>= 2.2.2, < 4.0)
78
+ regexp_parser (>= 1.8)
79
+ rexml
80
+ rubocop-ast (>= 1.0.1)
81
+ ruby-progressbar (~> 1.7)
82
+ unicode-display_width (>= 1.4.0, < 2.0)
83
+ rubocop-ast (1.1.1)
84
+ parser (>= 2.7.1.5)
85
+ ruby-progressbar (1.10.1)
86
+ simplecov (0.19.1)
87
+ docile (~> 1.1)
88
+ simplecov-html (~> 0.11)
89
+ simplecov-html (0.12.3)
48
90
  unf (0.1.4)
49
91
  unf_ext
50
- unf_ext (0.0.7.6)
92
+ unf_ext (0.0.7.7)
93
+ unicode-display_width (1.7.0)
94
+ vcr (6.0.0)
95
+ webmock (3.9.5)
96
+ addressable (>= 2.3.6)
97
+ crack (>= 0.3.2)
98
+ hashdiff (>= 0.4.0, < 2.0.0)
51
99
  webrobots (0.1.2)
52
- yard (0.9.20)
100
+ yard (0.9.25)
53
101
 
54
102
  PLATFORMS
55
103
  ruby
56
104
  x64-mingw32
57
105
 
58
106
  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)
107
+ byebug
108
+ dotenv
109
+ pry
110
+ rake
111
+ rspec
112
+ rubocop
113
+ simplecov
114
+ vcr
65
115
  vk_music!
66
- yard (~> 0.9)
116
+ webmock
117
+ yard
67
118
 
68
119
  BUNDLED WITH
69
- 2.0.2
120
+ 2.1.4
File without changes
data/README.md CHANGED
@@ -1,94 +1,113 @@
1
- # VkMusic
2
-
3
- *vk_music* gem is a library to work with audios on popular Russian social network [vk.com](https://www.vk.com "vk.com"). VK disabled their public API for audios, so it is now necessary to use parsers instead.
4
-
5
- ## Installation
6
-
7
- Add this line to your application's Gemfile:
8
-
9
- ```ruby
10
- gem 'vk_music'
11
- ```
12
-
13
- And then execute:
14
-
15
- $ bundle
16
-
17
- Or install it yourself as:
18
-
19
- $ gem install vk_music
20
-
21
- ## Usage
22
-
23
- You can take a look on documentation [here](https://www.rubydoc.info/gems/vk_music/).
24
-
25
- ### Logging in
26
- Firstly, it is required to create new *VkMusic::Client* and provide login credentials:
27
-
28
- ```ruby
29
- client = VkMusic::Client.new(username: "+71234567890", password: "password")
30
- ```
31
-
32
- ### Searching for audios
33
- You can search audios by name with following method:
34
-
35
- ```ruby
36
- audios = client.find("Acid Spit - Mega Drive")
37
- puts audios[0] # Basic information about audio
38
- puts audios[0].url # URL to access audio. Notice that it is only accessible from your IP
39
- ```
40
-
41
- ### Parsing playlists
42
- You can load all the audios from playlist using following method:
43
-
44
- ```ruby
45
- playlist = client.playlist(url: "https://vk.com/audio?z=audio_playlist-37661843_1/0e420c32c8b69e6637")
46
- last_audios = playlist.first(10) # => Array<Audio>
47
- client.update_urls(last_audios) # We have to manually retrieve URLs for playlists
48
- urls = last_audios.map(&:url) # URLs for every audio
49
- ```
50
-
51
- ### User or group audios
52
- You can load audios from user or group page. Those audios will be returned as playlist. To do it simply pass user or group id:
53
-
54
- ```ruby
55
- playlist = client.audios(owner_id: 8024985)
56
- last_audios = playlist.first(10) # => Array<Audio>
57
- client.update_urls(last_audios) # We have to manually retrieve URLs for playlists
58
- urls = last_audios.map(&:url) # URLs for every audio
59
- ```
60
- You can set how many audios you actually need as well:
61
-
62
- ```ruby
63
- user_playlist = client.audios(url: "vk.com/id8024985", up_to: 10)
64
- ```
65
-
66
- ### Audios from post
67
- You can load up to 10 audios attached to some post. Those audios will be returned as array:
68
-
69
- ```ruby
70
- audios = client.post(url: "https://vk.com/wall-4790861_5453")
71
- urls = audios.map(&:url) # URLs for every audio
72
- ```
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
-
81
-
82
- ## Development
83
-
84
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
85
-
86
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
87
-
88
- ## Contributing
89
-
90
- Bug reports and pull requests are welcome on GitHub at https://github.com/fizvlad/vk-music-rb/issues.
91
-
92
- ## License
93
-
94
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
1
+ ![Gem](https://img.shields.io/gem/v/vk_music) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/fizvlad/vk-music-rb/Ruby) ![Lines of code](https://img.shields.io/tokei/lines/github/fizvlad/vk-music-rb) ![Gem](https://img.shields.io/gem/dtv/vk_music)
2
+
3
+ # VkMusic
4
+
5
+ *vk_music* gem is a library to work with audios on popular Russian social network
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'vk_music'
13
+ ```
14
+
15
+ And then execute:
16
+ ```
17
+ $ bundle
18
+ ```
19
+
20
+ Or install it using `gem`:
21
+
22
+ ```
23
+ $ gem install vk_music
24
+ ```
25
+
26
+ ## Usage
27
+
28
+ You can take a look on documentation at [rubydoc](https://www.rubydoc.info/gems/vk_music/).
29
+
30
+ ### Logging in
31
+
32
+ Firstly, it is required to create new `VkMusic::Client` instance and provide login credentials:
33
+
34
+ ```ruby
35
+ client = VkMusic::Client.new(username: "+79991234567", password: "password")
36
+ ```
37
+
38
+ ### Search
39
+
40
+ You can search audios using `Client#find`:
41
+
42
+ ```ruby
43
+ audios = client.find("Acid Spit - Mega Drive")
44
+ ```
45
+
46
+ You can also search for playlists using same method:
47
+
48
+ ```ruby
49
+ playlists = client.find("Jazz", type: :playlist)
50
+ ```
51
+
52
+ ### Playlists
53
+
54
+ You can load playlist audios with `Client#playlist`
55
+
56
+ ```ruby
57
+ playlist = client.playlist(url: "link")
58
+ ```
59
+
60
+ ### User or group audios
61
+
62
+ You can load profile audios with `Client#audios`
63
+
64
+ ```ruby
65
+ playlist = client.audios(owner_id: 8024985)
66
+ ```
67
+
68
+ ### Wall audios
69
+
70
+ You can load audios from profile wall with `Client#wall`
71
+
72
+ ```ruby
73
+ playlist = client.wall(owner_id: 8024985)
74
+ ```
75
+
76
+ ### Audios from post
77
+
78
+ You can load up to 10 audios attached to some post. Those audios will be returned as array:
79
+
80
+ ```ruby
81
+ audios = client.post(url: "link")
82
+ ```
83
+
84
+ ### Getting audio URL
85
+
86
+ To get audio URL you should go through following chain:
87
+ 1. Get audio ID
88
+ 2. Get audio encrypted URL
89
+ 3. Get audio decrypted URL
90
+
91
+ Usually most of audios already go with ID. Getting encrypted URL requires additional request to web, so it is performed with `Client#update_urls`, which will mutate provided array of audios:
92
+
93
+ ```ruby
94
+ client.update_urls(audios_array)
95
+ ```
96
+
97
+ After this you can get decrypted URL using `Audio#url`
98
+
99
+ ## Development
100
+
101
+ Feel free to add features. However, please make sure all your code is covered with tests.
102
+
103
+ ### Testing
104
+
105
+ This gem uses `rspec` and `vcr` for easy testing. *Be careful*, though, running `rspec` in clean repo may result in lot of requests to web and rate limiting or ban
106
+
107
+ ## Contributing
108
+
109
+ Bug reports and pull requests are welcome on GitHub at https://github.com/fizvlad/vk-music-rb/issues.
110
+
111
+ ## License
112
+
113
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).