xvideosx 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. package/.codeclimate.yml +12 -0
  2. package/.editorconfig +12 -0
  3. package/.eslintignore +0 -0
  4. package/.eslintrc.yml +26 -0
  5. package/.gitattributes +107 -0
  6. package/.github/workflows/node.js.yml +29 -0
  7. package/.travis.yml +13 -0
  8. package/AUTHORS +2 -0
  9. package/CODE_OF_CONDUCT.md +5 -0
  10. package/LICENSE +29 -0
  11. package/README.md +188 -0
  12. package/index.js +1 -0
  13. package/lib/api/base.js +14 -0
  14. package/lib/api/index.js +5 -0
  15. package/lib/api/videos/best/best.js +19 -0
  16. package/lib/api/videos/best/best.spec.js +138 -0
  17. package/lib/api/videos/best/createHasNextFunction.js +10 -0
  18. package/lib/api/videos/best/createHasPreviousFunction.js +10 -0
  19. package/lib/api/videos/best/createNextFunction.js +12 -0
  20. package/lib/api/videos/best/createPreviousFunction.js +12 -0
  21. package/lib/api/videos/best/createRefreshFunction.js +11 -0
  22. package/lib/api/videos/best/index.js +1 -0
  23. package/lib/api/videos/best/parseResponse.js +45 -0
  24. package/lib/api/videos/best/parseVideo.js +27 -0
  25. package/lib/api/videos/dashboard/createHasNextFunction.js +10 -0
  26. package/lib/api/videos/dashboard/createHasPreviousFunction.js +10 -0
  27. package/lib/api/videos/dashboard/createNextFunction.js +12 -0
  28. package/lib/api/videos/dashboard/createPreviousFunction.js +12 -0
  29. package/lib/api/videos/dashboard/createRefreshFunction.js +11 -0
  30. package/lib/api/videos/dashboard/dashboard.js +14 -0
  31. package/lib/api/videos/dashboard/dashboard.spec.js +138 -0
  32. package/lib/api/videos/dashboard/index.js +1 -0
  33. package/lib/api/videos/dashboard/parseResponse.js +45 -0
  34. package/lib/api/videos/dashboard/parseVideo.js +27 -0
  35. package/lib/api/videos/details/details.js +48 -0
  36. package/lib/api/videos/details/details.spec.js +49 -0
  37. package/lib/api/videos/details/index.js +1 -0
  38. package/lib/api/videos/fresh/createHasNextFunction.js +10 -0
  39. package/lib/api/videos/fresh/createHasPreviousFunction.js +10 -0
  40. package/lib/api/videos/fresh/createNextFunction.js +12 -0
  41. package/lib/api/videos/fresh/createPreviousFunction.js +12 -0
  42. package/lib/api/videos/fresh/createRefreshFunction.js +11 -0
  43. package/lib/api/videos/fresh/fresh.js +14 -0
  44. package/lib/api/videos/fresh/fresh.spec.js +138 -0
  45. package/lib/api/videos/fresh/index.js +1 -0
  46. package/lib/api/videos/fresh/parseResponse.js +45 -0
  47. package/lib/api/videos/fresh/parseVideo.js +27 -0
  48. package/lib/api/videos/index.js +8 -0
  49. package/lib/api/videos/search/createHasNextFunction.js +10 -0
  50. package/lib/api/videos/search/createHasPreviousFunction.js +10 -0
  51. package/lib/api/videos/search/createNextFunction.js +12 -0
  52. package/lib/api/videos/search/createPreviousFunction.js +12 -0
  53. package/lib/api/videos/search/createRefreshFunction.js +11 -0
  54. package/lib/api/videos/search/index.js +1 -0
  55. package/lib/api/videos/search/parseResponse.js +45 -0
  56. package/lib/api/videos/search/parseVideo.js +27 -0
  57. package/lib/api/videos/search/search.js +23 -0
  58. package/lib/api/videos/search/search.spec.js +138 -0
  59. package/lib/api/videos/verified/createHasNextFunction.js +10 -0
  60. package/lib/api/videos/verified/createHasPreviousFunction.js +10 -0
  61. package/lib/api/videos/verified/createNextFunction.js +12 -0
  62. package/lib/api/videos/verified/createPreviousFunction.js +12 -0
  63. package/lib/api/videos/verified/createRefreshFunction.js +11 -0
  64. package/lib/api/videos/verified/index.js +1 -0
  65. package/lib/api/videos/verified/parseResponse.js +45 -0
  66. package/lib/api/videos/verified/parseVideo.js +27 -0
  67. package/lib/api/videos/verified/verified.js +14 -0
  68. package/lib/api/videos/verified/verified.spec.js +138 -0
  69. package/lib/index.js +1 -0
  70. package/lib/xvideos.js +1 -0
  71. package/lib/xvideos.spec.js +22 -0
  72. package/package.json +44 -0
@@ -0,0 +1,12 @@
1
+ engines:
2
+ eslint:
3
+ enabled: true
4
+ channel: 'eslint-2'
5
+ checks:
6
+ import/no-unresolved:
7
+ enabled: false
8
+ new-cap:
9
+ enabled: false
10
+ ratings:
11
+ paths:
12
+ - '*.js'
package/.editorconfig ADDED
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ end_of_line = lf
5
+ charset = utf-8
6
+ #trim_trailing_whitespace = true
7
+ insert_final_newline = true
8
+ indent_style = space
9
+ indent_size = 2
10
+
11
+ [*.md]
12
+ trim_trailing_whitespace = false
package/.eslintignore ADDED
File without changes
package/.eslintrc.yml ADDED
@@ -0,0 +1,26 @@
1
+ extends: airbnb-base
2
+ plugins:
3
+ - import
4
+ rules:
5
+ no-shadow: off
6
+ import/no-dynamic-require: off
7
+ global-require: off
8
+ no-param-reassign: off
9
+ consistent-return: off
10
+ arrow-body-style: off
11
+ no-underscore-dangle: off
12
+ import/extensions: off
13
+ prefer-destructuring: off
14
+ strict: off
15
+ max-len: off
16
+ no-console: off
17
+ no-restricted-globals: off
18
+ globals:
19
+ process: readonly
20
+ describe: readonly
21
+ before: readonly
22
+ after: readonly
23
+ beforeEach: readonly
24
+ suite: readonly
25
+ test: readonly
26
+ it: readonly
package/.gitattributes ADDED
@@ -0,0 +1,107 @@
1
+ # These settings are for any web project
2
+
3
+ # Handle line endings automatically for files detected as text
4
+ # and leave all files detected as binary untouched.
5
+ # * text=auto
6
+ # NOTE - originally I had the above line un-commented. it caused me a lot of grief related to line endings because I was dealing with WordPress plugins and the website changing line endings out if a user modified a plugin through the web interface. commenting this line out seems to have alleviated the git chaos where simply switching to a branch caused it to believe 500 files were modified.
7
+
8
+ #
9
+ # The above will handle all files NOT found below
10
+ #
11
+
12
+ #
13
+ ## These files are text and should be normalized (Convert crlf => lf)
14
+ #
15
+
16
+ # source code
17
+ *.php text
18
+ *.css text
19
+ *.sass text
20
+ *.scss text
21
+ *.less text
22
+ *.styl text
23
+ *.js text
24
+ *.coffee text
25
+ *.json text
26
+ *.htm text
27
+ *.html text
28
+ *.xml text
29
+ *.svg text
30
+ *.txt text
31
+ *.ini text
32
+ *.inc text
33
+ *.pl text
34
+ *.rb text
35
+ *.py text
36
+ *.scm text
37
+ *.sql text
38
+ *.sh text
39
+ *.bat text
40
+
41
+ # templates
42
+ *.ejs text
43
+ *.hbt text
44
+ *.jade text
45
+ *.haml text
46
+ *.hbs text
47
+ *.dot text
48
+ *.tmpl text
49
+ *.phtml text
50
+
51
+ # server config
52
+ .htaccess text
53
+
54
+ # git config
55
+ .gitattributes text
56
+ .gitignore text
57
+ .gitconfig text
58
+
59
+ # code analysis config
60
+ .jshintrc text
61
+ .jscsrc text
62
+ .jshintignore text
63
+ .csslintrc text
64
+
65
+ # misc config
66
+ *.yaml text
67
+ *.yml text
68
+ .editorconfig text
69
+
70
+ # build config
71
+ *.npmignore text
72
+ *.bowerrc text
73
+
74
+ # Heroku
75
+ Procfile text
76
+ .slugignore text
77
+
78
+ # Documentation
79
+ *.md text
80
+ LICENSE text
81
+ AUTHORS text
82
+
83
+
84
+ #
85
+ ## These files are binary and should be left untouched
86
+ #
87
+
88
+ # (binary is a macro for -text -diff)
89
+ *.png binary
90
+ *.jpg binary
91
+ *.jpeg binary
92
+ *.gif binary
93
+ *.ico binary
94
+ *.mov binary
95
+ *.mp4 binary
96
+ *.mp3 binary
97
+ *.flv binary
98
+ *.fla binary
99
+ *.swf binary
100
+ *.gz binary
101
+ *.zip binary
102
+ *.7z binary
103
+ *.ttf binary
104
+ *.eot binary
105
+ *.woff binary
106
+ *.pyc binary
107
+ *.pdf binary
@@ -0,0 +1,29 @@
1
+ # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
2
+ # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
3
+
4
+ name: Node.js CI
5
+
6
+ on:
7
+ push:
8
+ branches: [ master ]
9
+ pull_request:
10
+ branches: [ master ]
11
+
12
+ jobs:
13
+ build:
14
+
15
+ runs-on: ubuntu-latest
16
+
17
+ strategy:
18
+ matrix:
19
+ node-version: [10.x, 12.x, 14.x]
20
+
21
+ steps:
22
+ - uses: actions/checkout@v2
23
+ - name: Use Node.js ${{ matrix.node-version }}
24
+ uses: actions/setup-node@v1
25
+ with:
26
+ node-version: ${{ matrix.node-version }}
27
+ - run: npm ci
28
+ - run: npm run build --if-present
29
+ - run: npm test
package/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ language: node_js
2
+ sudo: required
3
+ addons:
4
+ chrome: stable
5
+ node_js:
6
+ - 12
7
+ install:
8
+ - npm install
9
+ - npm install -g codeclimate-test-reporter
10
+ script:
11
+ - npm run eslint
12
+ - npm run coverage
13
+ - codeclimate-test-reporter < coverage/lcov.info
package/AUTHORS ADDED
@@ -0,0 +1,2 @@
1
+ Yeferson Yair Tejada Rivas <yeferok2@gmail.com> (https://github.com/4CROS2)
2
+
@@ -0,0 +1,5 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ If it's open source, so it's all bout it's contributors!
4
+
5
+ I'm no dictator to say what's allowed or not in an open project.
package/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2018, Rodrigo Gomes da Silva
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ * Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.md ADDED
@@ -0,0 +1,188 @@
1
+ # xvideos
2
+
3
+ [![Build Status](https://travis-ci.org/rodrigogs/xvideos.svg?branch=master)](https://travis-ci.org/rodrigogs/xvideos)
4
+ [![Code Climate](https://codeclimate.com/github/rodrigogs/xvideos/badges/gpa.svg)](https://codeclimate.com/github/rodrigogs/xvideos)
5
+ [![Test Coverage](https://codeclimate.com/github/rodrigogs/xvideos/badges/coverage.svg)](https://codeclimate.com/github/rodrigogs/xvideos/coverage)
6
+
7
+ A a [Node.js](https://nodejs.org) [xvideos.com](xvideos.com) API library.
8
+
9
+ ### Install
10
+ ```bash
11
+ $ npm install @rodrigogs/xvideos
12
+ ```
13
+
14
+ ### Usage
15
+ ```javascript
16
+ const xvideos = require('@rodrigogs/xvideos');
17
+
18
+ //-- Inside an async function --//
19
+
20
+ // Retrieve fresh videos
21
+ const fresh = await xvideos.videos.fresh({ page: 1 });
22
+ console.log(fresh.videos); // { url, path, title, duration, profile: { name, url }, views, }
23
+ console.log(fresh.pagination.current); // 1
24
+ console.log(fresh.pagination.pages); // [1, 2, 3, 4, 5...]
25
+ console.log(fresh.hasNext()); // true
26
+ console.log(fresh.hasPrevious()); // false
27
+
28
+ const nextPage = await fresh.next();
29
+ console.log(nextPage.pagination.current); // 2
30
+ console.log(nextPage.hasNext()); // true
31
+ console.log(nextPage.hasPrevious()); // true
32
+
33
+ const previousPage = await fresh.previous();
34
+ console.log(previousPage.pagination.current); // 1
35
+ console.log(previousPage.hasNext()); // true
36
+ console.log(previousPage.hasPrevious()); // tfalse
37
+
38
+ const detail = await xvideos.videos.details(fresh.videos[0]); /**
39
+ {
40
+ title,
41
+ duration,
42
+ image,
43
+ videoType,
44
+ videoWidth,
45
+ videoHeigth,
46
+ views,
47
+ files: {
48
+ low,
49
+ high,
50
+ HLS,
51
+ thumb,
52
+ thumb69,
53
+ thumbSlide,
54
+ thumbSlideBig
55
+ }
56
+ } **/
57
+ ```
58
+
59
+ ### API
60
+ * Retrieve [dashboard videos](https://www.xvideos.com)
61
+ ```javascript
62
+ const dashboardList = await xvideos.videos.dashboard({ page: 1 });
63
+ ```
64
+ * Is there a next page?
65
+ ```javascript
66
+ console.log(deshboardList.hasNext()); // true or false
67
+ ```
68
+ * Is there a previous page?
69
+ ```javascript
70
+ console.log(deshboardList.hasPrevious()); // true or false
71
+ ```
72
+ * Refresh page videos
73
+ ```javascript
74
+ const refreshedVideos = await deshboardList.refresh();
75
+ ```
76
+ * Retrieve next deshboard page videos
77
+ ```javascript
78
+ const nextVideos = await deshboardList.next();
79
+ ```
80
+ * Retrieve previous deshboard page videos
81
+ ```javascript
82
+ const previousVideos = await deshboardList.previous();
83
+ ```
84
+ * Retrieve [fresh videos](https://www.xvideos.com/new/1)
85
+ ```javascript
86
+ const freshList = await xvideos.videos.fresh({ page: 1 });
87
+ ```
88
+ * Is there a next page?
89
+ ```javascript
90
+ console.log(freshList.hasNext()); // true or false
91
+ ```
92
+ * Is there a previous page?
93
+ ```javascript
94
+ console.log(freshList.hasPrevious()); // true or false
95
+ ```
96
+ * Refresh page videos
97
+ ```javascript
98
+ const refreshedVideos = await freshList.refresh();
99
+ ```
100
+ * Retrieve next fresh page videos
101
+ ```javascript
102
+ const nextVideos = await freshList.next();
103
+ ```
104
+ * Retrieve previous fresh page videos
105
+ ```javascript
106
+ const previousVideos = await freshList.previous();
107
+ ```
108
+ * Retrieve [best videos](https://www.xvideos.com/best)
109
+ ```javascript
110
+ const bestList = await xvideos.videos.best({ year: '2018', month: '02', page: 1 });
111
+ ```
112
+ * Is there a next page?
113
+ ```javascript
114
+ console.log(bestList.hasNext()); // true or false
115
+ ```
116
+ * Is there a previous page?
117
+ ```javascript
118
+ console.log(bestList.hasPrevious()); // true or false
119
+ ```
120
+ * Refresh page videos
121
+ ```javascript
122
+ const refreshedVideos = await bestList.refresh();
123
+ ```
124
+ * Retrieve next best page videos
125
+ ```javascript
126
+ const nextVideos = await bestList.next();
127
+ ```
128
+ * Retrieve previous best page videos
129
+ ```javascript
130
+ const previousVideos = await bestList.previous();
131
+ ```
132
+ * Retrieve [verified videos](https://www.xvideos.com/verified/videos)
133
+ ```javascript
134
+ const verifiedList = await xvideos.videos.verified({ page: 1 });
135
+ ```
136
+ * Is there a next page?
137
+ ```javascript
138
+ console.log(verifiedList.hasNext()); // true or false
139
+ ```
140
+ * Is there a previous page?
141
+ ```javascript
142
+ console.log(verifiedList.hasPrevious()); // true or false
143
+ ```
144
+ * Refresh page videos
145
+ ```javascript
146
+ const refreshedVideos = await verifiedList.refresh();
147
+ ```
148
+ * Retrieve next verified page videos
149
+ ```javascript
150
+ const nextVideos = await verifiedList.next();
151
+ ```
152
+ * Retrieve previous verified page videos
153
+ ```javascript
154
+ const previousVideos = await verifiedList.previous();
155
+ ```
156
+ * Retrieve [video details](https://www.xvideos.com/video36638661/chaturbate_lulacum69_30-05-2018)
157
+ ```javascript
158
+ const details = await xvideos.videos.details({ url: 'https://www.xvideos.com/video36638661/chaturbate_lulacum69_30-05-2018' });
159
+ ```
160
+
161
+ * Filter [videos](https://www.xvideos.com/?k=threesome)
162
+ ```javascript
163
+ const videos = await xvideos.videos.details({ k: 'threesome' });
164
+ const videos = await xvideos.videos.details({ k: 'public', page: 5 });
165
+ ```
166
+ * Is there a next page?
167
+ ```javascript
168
+ console.log(videos.hasNext()); // true or false
169
+ ```
170
+ * Is there a previous page?
171
+ ```javascript
172
+ console.log(videos.hasPrevious()); // true or false
173
+ ```
174
+ * Refresh page videos
175
+ ```javascript
176
+ const refreshedVideos = await videos.refresh();
177
+ ```
178
+ * Retrieve next verified page videos
179
+ ```javascript
180
+ const nextVideos = await videos.next();
181
+ ```
182
+ * Retrieve previous verified page videos
183
+ ```javascript
184
+ const previousVideos = await videos.previous();
185
+ ```
186
+
187
+ ### License
188
+ [Licence](https://github.com/4CROS2/xvideos/blob/main/LICENSE) © Yeferson Yair Tejada Rivas
package/index.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./lib');
@@ -0,0 +1,14 @@
1
+ const axios = require('axios');
2
+
3
+ const BASE_URL = 'https://www.xvideos.com';
4
+
5
+ const createRequest = (options = {}) => {
6
+ return axios.create({ baseURL: BASE_URL, ...options });
7
+ };
8
+
9
+ const base = {
10
+ BASE_URL,
11
+ createRequest,
12
+ };
13
+
14
+ module.exports = base;
@@ -0,0 +1,5 @@
1
+ const api = {
2
+ videos: require('./videos'),
3
+ };
4
+
5
+ module.exports = api;
@@ -0,0 +1,19 @@
1
+ const base = require('../../base');
2
+ const parseResponse = require('./parseResponse');
3
+
4
+ const PATH = '/best';
5
+
6
+ const best = async ({ year, month, page = 1 } = {}) => {
7
+ if (!year) year = new Date().getFullYear();
8
+ year = String(year);
9
+ if (!month) month = new Date().getMonth() + 1; // Date.getMonth is zero based
10
+ month = String(month).padStart(2, '0');
11
+
12
+ if (page < 1 || page > Number.MAX_SAFE_INTEGER) {
13
+ throw new Error(`Invalid page: ${page}`);
14
+ }
15
+ const request = base.createRequest();
16
+ return parseResponse(page, await request.get(`${PATH}/${year}-${month}/${page === 0 ? '' : page}`));
17
+ };
18
+
19
+ module.exports = best;
@@ -0,0 +1,138 @@
1
+ /* eslint-disable padded-blocks */
2
+
3
+ const chai = require('chai');
4
+ const best = require('./best');
5
+
6
+ before(() => {
7
+ chai.should();
8
+ });
9
+
10
+ describe('api/videos/best', () => {
11
+
12
+ it('should list best video pages', async () => {
13
+ const list = await best({ page: 2 });
14
+
15
+ list.should.be.an('object');
16
+ list.pagination.should.be.an('object');
17
+ list.pagination.page.should.be.equals(2);
18
+ list.pagination.pages.should.be.an('array');
19
+ list.pagination.pages[0].should.be.a('number');
20
+ list.hasNext.should.be.a('function');
21
+ list.hasNext().should.be.equals(true);
22
+ list.hasPrevious.should.be.a('function');
23
+ list.hasPrevious().should.be.equals(true);
24
+ list.next.should.be.a('function');
25
+ list.previous.should.be.a('function');
26
+ list.videos.should.be.an('array');
27
+ list.videos.forEach((video) => {
28
+ video.should.be.an('object');
29
+ video.should.have.ownPropertyDescriptor('duration');
30
+ video.duration.should.be.a('string');
31
+ video.should.have.ownPropertyDescriptor('path');
32
+ video.path.should.be.a('string');
33
+ video.should.have.ownPropertyDescriptor('profile');
34
+ video.profile.should.be.an('object');
35
+ video.profile.should.have.ownPropertyDescriptor('name');
36
+ video.profile.name.should.be.an('string');
37
+ video.profile.should.have.ownPropertyDescriptor('url');
38
+ video.profile.url.should.be.an('string');
39
+ video.should.have.ownPropertyDescriptor('title');
40
+ video.title.should.be.a('string');
41
+ video.should.have.ownPropertyDescriptor('url');
42
+ video.url.should.be.a('string');
43
+ video.should.have.ownPropertyDescriptor('views');
44
+ video.views.should.be.a('string');
45
+ });
46
+
47
+ const previous = await list.previous();
48
+ previous.should.be.an('object');
49
+ previous.pagination.should.be.an('object');
50
+ previous.pagination.page.should.be.equals(1);
51
+ previous.pagination.pages.should.be.an('array');
52
+ previous.pagination.pages[0].should.be.a('number');
53
+ previous.hasNext.should.be.a('function');
54
+ previous.hasNext().should.be.equals(true);
55
+ previous.hasPrevious.should.be.a('function');
56
+ previous.hasPrevious().should.be.equals(false);
57
+ previous.next.should.be.a('function');
58
+ previous.previous.should.be.a('function');
59
+ previous.videos.should.be.an('array');
60
+ previous.videos.forEach((video) => {
61
+ video.should.be.an('object');
62
+ video.should.have.ownPropertyDescriptor('duration');
63
+ video.duration.should.be.a('string');
64
+ video.should.have.ownPropertyDescriptor('path');
65
+ video.path.should.be.a('string');
66
+ video.should.have.ownPropertyDescriptor('profile');
67
+ video.profile.should.be.an('object');
68
+ video.profile.should.have.ownPropertyDescriptor('name');
69
+ video.profile.name.should.be.an('string');
70
+ video.profile.should.have.ownPropertyDescriptor('url');
71
+ video.profile.url.should.be.an('string');
72
+ video.should.have.ownPropertyDescriptor('title');
73
+ video.title.should.be.a('string');
74
+ video.should.have.ownPropertyDescriptor('url');
75
+ video.url.should.be.a('string');
76
+ video.should.have.ownPropertyDescriptor('views');
77
+ video.views.should.be.a('string');
78
+ });
79
+
80
+ const next = await list.next();
81
+ next.should.be.an('object');
82
+ next.pagination.should.be.an('object');
83
+ next.pagination.page.should.be.equals(3);
84
+ next.pagination.pages.should.be.an('array');
85
+ next.pagination.pages[0].should.be.a('number');
86
+ next.hasNext.should.be.a('function');
87
+ next.hasNext().should.be.equals(true);
88
+ next.hasPrevious.should.be.a('function');
89
+ next.hasPrevious().should.be.equals(true);
90
+ next.next.should.be.a('function');
91
+ next.previous.should.be.a('function');
92
+ next.videos.should.be.an('array');
93
+ next.videos.forEach((video) => {
94
+ video.should.be.an('object');
95
+ video.should.have.ownPropertyDescriptor('duration');
96
+ video.duration.should.be.a('string');
97
+ video.should.have.ownPropertyDescriptor('path');
98
+ video.path.should.be.a('string');
99
+ video.should.have.ownPropertyDescriptor('profile');
100
+ video.profile.should.be.an('object');
101
+ video.profile.should.have.ownPropertyDescriptor('name');
102
+ video.profile.name.should.be.an('string');
103
+ video.profile.should.have.ownPropertyDescriptor('url');
104
+ video.profile.url.should.be.an('string');
105
+ video.should.have.ownPropertyDescriptor('title');
106
+ video.title.should.be.a('string');
107
+ video.should.have.ownPropertyDescriptor('url');
108
+ video.url.should.be.a('string');
109
+ video.should.have.ownPropertyDescriptor('views');
110
+ video.views.should.be.a('string');
111
+ });
112
+
113
+ await list.refresh();
114
+ }).timeout(10000);
115
+
116
+ it('should fail when page parameter is beyond limit', async () => {
117
+ let err;
118
+ try {
119
+ await best({ page: Number.MAX_SAFE_INTEGER + 1 });
120
+ } catch (error) {
121
+ err = error;
122
+ } finally {
123
+ err.should.be.an('error');
124
+ }
125
+ }).timeout(10000);
126
+
127
+ it('should fail when page parameter is less than 1', async () => {
128
+ let err;
129
+ try {
130
+ await best({ page: 0 });
131
+ } catch (error) {
132
+ err = error;
133
+ } finally {
134
+ err.should.be.an('error');
135
+ }
136
+ }).timeout(10000);
137
+
138
+ });
@@ -0,0 +1,10 @@
1
+ const hasNextFunction = (currentPage, pages) => () => {
2
+ return currentPage < Math.max(...pages);
3
+ };
4
+
5
+ const createHasNextFunction = (pagination) => {
6
+ const { page, pages } = pagination;
7
+ return hasNextFunction(page, pages);
8
+ };
9
+
10
+ module.exports = createHasNextFunction;
@@ -0,0 +1,10 @@
1
+ const hasPreviousFunction = (currentPage, pages) => () => {
2
+ return currentPage > Math.min(...pages);
3
+ };
4
+
5
+ const createHasPreviousFunction = (pagination) => {
6
+ const { page, pages } = pagination;
7
+ return hasPreviousFunction(page, pages);
8
+ };
9
+
10
+ module.exports = createHasPreviousFunction;
@@ -0,0 +1,12 @@
1
+ const nextFunction = (currentPage) => () => {
2
+ const best = require('./best');
3
+ const next = currentPage + 1;
4
+ return best({ page: next });
5
+ };
6
+
7
+ const createNextFunction = (pagination) => {
8
+ const { page } = pagination;
9
+ return nextFunction(page);
10
+ };
11
+
12
+ module.exports = createNextFunction;
@@ -0,0 +1,12 @@
1
+ const previousFunction = (currentPage) => () => {
2
+ const best = require('./best');
3
+ const previous = currentPage - 1;
4
+ return best({ page: previous });
5
+ };
6
+
7
+ const createPreviousFunction = (pagination) => {
8
+ const { page } = pagination;
9
+ return previousFunction(page);
10
+ };
11
+
12
+ module.exports = createPreviousFunction;
@@ -0,0 +1,11 @@
1
+ const refreshFunction = (currentPage) => () => {
2
+ const best = require('./best');
3
+ return best(currentPage);
4
+ };
5
+
6
+ const createRefreshFunction = (pagination) => {
7
+ const { page } = pagination;
8
+ return refreshFunction(page);
9
+ };
10
+
11
+ module.exports = createRefreshFunction;
@@ -0,0 +1 @@
1
+ module.exports = require('./best');