vk_music 3.1.6 → 4.0.3

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 +72 -21
  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 +112 -187
  15. data/lib/vk_music/client.rb +181 -647
  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_reload.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 +107 -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_reload.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: 6142de69f08e3ca82697048c3062fc42eea675370f64e678433f8587edc4011e
4
- data.tar.gz: 8321b28592040daf8af1880c0fb15a1969ba33017cdd9a2919063c43f446ce9e
3
+ metadata.gz: 067f26c1a3f2e46794a61c4a62fae7dd40f190e70e91b7331c4891f83cf3bd9f
4
+ data.tar.gz: 2942d5b5999a65a8fd29b8eebc2e632b44c944d204984d0d85df4a3fdf74c437
5
5
  SHA512:
6
- metadata.gz: 21d19b28d4141f33ae545a5216ec6ee192df00de769b9f8cb2f9b856a997662d8bd31560f1846dac7370b142d8182baa0789d3dfa2599afc7d8bf8408f142ea5
7
- data.tar.gz: e431fd771443125940ef2bb3fc611b63d3f9c7d3818caf0712af3103331f6d0643c02b3bdf5aacba61852447e10ef854cfeeb9b47a3a63278a9349585094f751
6
+ metadata.gz: 512889a498b3d0aa5c3413e24596b660d312acddb450052f8d1d44315c1e84d89749fbdb9d225b2e21555eb83efbca6d77922c0227a287154dee78991786250f
7
+ data.tar.gz: e3bf4628feccd1120a9afaedfebe3a5d9d9b9f6965b13dd3bcec58526bbcf2fdcd943577e33b2b398227f7c48fd60577ecf81686b42283540e0ef6308df26132
@@ -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.5)
4
+ vk_music (4.0.3)
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
+ addressable (2.7.0)
15
+ public_suffix (>= 2.0.2, < 5.0)
16
+ ast (2.4.1)
17
+ byebug (11.1.3)
14
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.1)
21
- logger (1.4.2)
29
+ json (2.5.1)
30
+ logger (1.4.3)
22
31
  mechanize (2.7.6)
23
32
  domain_name (~> 0.5, >= 0.5.1)
24
33
  http-cookie (~> 1.0)
@@ -28,43 +37,85 @@ 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)
40
+ method_source (1.0.0)
32
41
  mime-types (3.3.1)
33
42
  mime-types-data (~> 3.2015)
34
- mime-types-data (3.2020.0512)
43
+ mime-types-data (3.2020.1104)
35
44
  mini_portile2 (2.4.0)
36
- minitest (5.14.1)
37
45
  net-http-digest_auth (1.4.1)
38
46
  net-http-persistent (2.9.4)
39
47
  nokogiri (1.10.10)
40
48
  mini_portile2 (~> 2.4.0)
41
- nokogiri (1.10.10-x64-mingw32)
42
- 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.20.1)
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 (2.0.0)
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.6.1)
75
+ parallel (~> 1.10)
76
+ parser (>= 2.7.1.5)
77
+ rainbow (>= 2.2.2, < 4.0)
78
+ regexp_parser (>= 1.8, < 3.0)
79
+ rexml
80
+ rubocop-ast (>= 1.2.0, < 2.0)
81
+ ruby-progressbar (~> 1.7)
82
+ unicode-display_width (>= 1.4.0, < 2.0)
83
+ rubocop-ast (1.3.0)
84
+ parser (>= 2.7.1.5)
85
+ ruby-progressbar (1.10.1)
86
+ simplecov (0.20.0)
87
+ docile (~> 1.1)
88
+ simplecov-html (~> 0.11)
89
+ simplecov_json_formatter (~> 0.1)
90
+ simplecov-html (0.12.3)
91
+ simplecov_json_formatter (0.1.2)
48
92
  unf (0.1.4)
49
93
  unf_ext
50
94
  unf_ext (0.0.7.7)
51
- unf_ext (0.0.7.7-x64-mingw32)
95
+ unicode-display_width (1.7.0)
96
+ vcr (6.0.0)
97
+ webmock (3.10.0)
98
+ addressable (>= 2.3.6)
99
+ crack (>= 0.3.2)
100
+ hashdiff (>= 0.4.0, < 2.0.0)
52
101
  webrobots (0.1.2)
53
102
  yard (0.9.25)
54
103
 
55
104
  PLATFORMS
56
105
  ruby
57
- x64-mingw32
58
106
 
59
107
  DEPENDENCIES
60
- bundler (~> 2.0)
61
- logger (~> 1.4)
62
- mechanize (~> 2.7)
63
- minitest (~> 5.0)
64
- pry (~> 0.12.2)
65
- rake (~> 13.0)
108
+ byebug
109
+ dotenv
110
+ pry
111
+ rake
112
+ rspec
113
+ rubocop
114
+ simplecov
115
+ vcr
66
116
  vk_music!
67
- yard (~> 0.9)
117
+ webmock
118
+ yard
68
119
 
69
120
  BUNDLED WITH
70
121
  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).