xvideosx 1.4.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.
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');