Compare commits

..

5 Commits

Author SHA1 Message Date
LuanRT
389b0f362f chore: format code 2021-10-25 02:25:52 -03:00
LuanRT
6ce4a89766 build (package): increment version 2021-10-25 02:24:12 -03:00
LuanRT
4d7573c46f docs: rephrasing 2021-10-25 01:25:00 -03:00
LuanRT
445de3546d chore: update examples 2021-10-25 01:23:07 -03:00
LuanRT
3b265119d6 docs: rephrase 2021-10-25 01:20:00 -03:00
7 changed files with 48 additions and 46 deletions

View File

@@ -128,7 +128,7 @@ const search = await youtube.search('Looking for life on Mars - Documentary');
Getting details about a specific video:
Get details about a specific video:
```js
const video = await youtube.getDetails(search.videos[0].id);
@@ -188,7 +188,7 @@ const video = await youtube.getDetails(search.videos[0].id);
</p>
</details>
Getting comments:
Get comments:
```js
const video = await youtube.getDetails(VIDEO_ID_HERE);
@@ -278,7 +278,7 @@ const comments_continuation = await comments.getContinuation();
</p>
</details>
Getting subscriptions feed:
Get subscriptions feed:
```js
const mysubfeed = await youtube.getSubscriptionsFeed();
```
@@ -452,7 +452,7 @@ const mysubfeed = await youtube.getSubscriptionsFeed();
</p>
</details>
Getting notifications:
Get notifications:
```js
const notifications = await youtube.getNotifications();
@@ -493,7 +493,7 @@ const notifications = await youtube.getNotifications();
---
* Subscribing/Unsubscribing to channels:
* Subscribe/Unsubscribe:
```js
const video = await youtube.getDetails(VIDEO_ID_HERE); // this is equivalent to opening the watch page on YouTube
@@ -501,7 +501,7 @@ await video.subscribe();
await video.unsubscribe();
```
* Liking/Disliking:
* Like/Dislike:
```js
const video = await youtube.getDetails(VIDEO_ID_HERE); // this is equivalent to opening the watch page on YouTube
@@ -510,23 +510,23 @@ await video.dislike();
await video.removeLike(); // removes either a like or dislike
```
* Commenting:
* Comment:
```js
const video = await youtube.getDetails(VIDEO_ID_HERE);
await video.comment('Haha, nice!');
```
* Changing notification preferences:
* Change notification preferences:
```js
const video = await youtube.getDetails(VIDEO_ID_HERE);
await video.setNotificationPref('ALL'); // ALL | NONE | PERSONALIZED
```
All of the interactions above will return ```{ success: true, status_code: 200 }``` if everything goes alright.
All of the above interactions will return ```{ success: true, status_code: 200 }``` if everything goes alright.
### Fetching live chats:
---
YouTube.js isn't able to download live content yet, but it does allow you to fetch live chats in an easy way plus you can also send messages!
YouTube.js isn't able to download live content yet, but it does allow you to fetch live chats plus you can also send messages!
```js
const Innertube = require('youtubei.js');
@@ -570,7 +570,7 @@ await msg.deleteMessage();
### Downloading videos:
---
The library provides an easy-to-use and simple downloader:
YouTube.js provides an easy-to-use and simple downloader:
```js
const fs = require('fs');

View File

@@ -11,11 +11,13 @@ async function start() {
console.info('Search results:', search);
if (search.videos.length === 0)
return console.info('[INFO]', 'Could not find any video about that on YouTube.');
return console.error('Could not find any video about that on YouTube.');
const video = await youtube.getDetails(search.videos[0].id);
const video = await youtube.getDetails(search.videos[0].id).catch((error) => error);
console.info('Video details:', video);
if (video.error) return;
if (video instanceof Error)
return console.error('Could not get details for ' + search.videos[0].title);
if (youtube.logged_in) {
const myNotifications = await youtube.getNotifications();

View File

@@ -56,7 +56,7 @@ async function browse(session, action_type) {
break;
default:
}
const response = await Axios.post(`${Constants.urls.YT_BASE_URL}/youtubei/v1/browse${session.logged_in && session.cookie.length < 1 ? '' : `?key=${session.key}`}`, JSON.stringify(data), Constants.innertube_request_opts({ session })).catch((error) => error);
if (response instanceof Error) return { success: false, status_code: response.response.status, message: response.message };
return {
@@ -104,7 +104,7 @@ async function notifications(session, action_type, args = {}) {
async function livechat(session, action_type, args = {}) {
let data;
switch (action_type) {
case 'live_chat/send_message':
case 'live_chat/send_message':
data = {
context: session.context,
params: Utils.generateMessageParams(args.channel_id, args.video_id),
@@ -127,7 +127,7 @@ async function livechat(session, action_type, args = {}) {
break;
default:
}
const response = await Axios.post(`${Constants.urls.YT_BASE_URL}/youtubei/v1/${action_type}${session.logged_in && session.cookie.length < 1 ? '' : `?key=${session.key}`}`, JSON.stringify(data), Constants.innertube_request_opts({ session, params: args.params })).catch((error) => error);
if (response instanceof Error) return { success: false, status_code: response.response.status, message: response.message };
return {

View File

@@ -149,7 +149,7 @@ class Innertube extends EventEmitter {
} else {
video_data.getLivechat = () => {};
}
video_data.like = () => Actions.engage(this, 'like/like', { video_id: id });
video_data.dislike = () => Actions.engage(this, 'like/dislike', { video_id: id });
video_data.removeLike = () => Actions.engage(this, 'like/removelike', { video_id: id });
@@ -161,32 +161,32 @@ class Innertube extends EventEmitter {
return video_data;
}
async getComments(video_id, token) {
let comment_section_token;
if (!token) {
const data_continuation = await Actions.getContinuation(this, { video_id });
const item_section_renderer = data_continuation.data.contents.twoColumnWatchNextResults.results.results.contents.find((item) => item.itemSectionRenderer);
comment_section_token = item_section_renderer.itemSectionRenderer.contents[0].continuationItemRenderer.continuationEndpoint.continuationCommand.token;
}
const response = await Actions.getContinuation(this, { continuation_token: comment_section_token || token });
if (!response.success) throw new Error('Could not fetch comment section');
const comments_section = { comments: [] };
!token && (comments_section.comment_count = response.data.onResponseReceivedEndpoints[0].reloadContinuationItemsCommand.continuationItems && response.data.onResponseReceivedEndpoints[0].reloadContinuationItemsCommand.continuationItems[0].commentsHeaderRenderer.countText.runs[0].text || 'N/A');
let continuation_token;
!token && (continuation_token = response.data.onResponseReceivedEndpoints[1].reloadContinuationItemsCommand.continuationItems.find((item) => item.continuationItemRenderer).continuationItemRenderer.continuationEndpoint.continuationCommand.token)
|| (continuation_token = response.data.onResponseReceivedEndpoints[0].appendContinuationItemsAction.continuationItems.find((item) => item.continuationItemRenderer).continuationItemRenderer.continuationEndpoint.continuationCommand.token);
!token && (continuation_token = response.data.onResponseReceivedEndpoints[1].reloadContinuationItemsCommand.continuationItems.find((item) => item.continuationItemRenderer).continuationItemRenderer.continuationEndpoint.continuationCommand.token) ||
(continuation_token = response.data.onResponseReceivedEndpoints[0].appendContinuationItemsAction.continuationItems.find((item) => item.continuationItemRenderer).continuationItemRenderer.continuationEndpoint.continuationCommand.token);
comments_section.getContinuation = () => this.getComments(video_id, continuation_token);
let contents;
!token && (contents = response.data.onResponseReceivedEndpoints[1].reloadContinuationItemsCommand.continuationItems)
|| (contents = response.data.onResponseReceivedEndpoints[0].appendContinuationItemsAction.continuationItems);
!token && (contents = response.data.onResponseReceivedEndpoints[1].reloadContinuationItemsCommand.continuationItems) ||
(contents = response.data.onResponseReceivedEndpoints[0].appendContinuationItemsAction.continuationItems);
contents.forEach((thread) => {
if (!thread.commentThreadRenderer) return;
const comment = {
@@ -207,26 +207,26 @@ class Innertube extends EventEmitter {
};
comments_section.comments.push(comment);
});
return comments_section;
}
async getSubscriptionsFeed() {
const response = await Actions.browse(this, 'subscriptions_feed');
if (!response.success) throw new Error('Could not fetch subscriptions feed');
const contents = response.data.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents;
const subscriptions_feed = {};
contents.forEach((section) => {
if (!section.itemSectionRenderer) return;
const section_contents = section.itemSectionRenderer.contents[0];
const section_items = section_contents.shelfRenderer.content.gridRenderer.items;
const key = section_contents.shelfRenderer.title.runs[0].text;
subscriptions_feed[key.toLowerCase().replace(/ +/g, '_')] = [];
section_items.forEach((item) => {
const content = {
title: item.gridVideoRenderer.title.runs.map((run) => run.text).join(' '),
@@ -240,18 +240,18 @@ class Innertube extends EventEmitter {
owner_badges: item.gridVideoRenderer.ownerBadges && item.gridVideoRenderer.ownerBadges.map((badge) => badge.metadataBadgeRenderer.tooltip) || 'N/A'
}
};
subscriptions_feed[key.toLowerCase().replace(/ +/g, '_')].push(content);
});
});
return subscriptions_feed;
}
async getNotifications() {
const response = await Actions.notifications(this, 'get_notification_menu');
if (!response.success) throw new Error('Could not fetch notifications');
const contents = response.data.actions[0].openPopupAction.popup.multiPageMenuRenderer.sections[0];
if (!contents.multiPageMenuNotificationSectionRenderer) return { error: 'You don\'t have any notification.' };
return contents.multiPageMenuNotificationSectionRenderer.items.map((notification) => {

View File

@@ -49,7 +49,7 @@ class SigDecipher {
}
const url_components = new URL(args.url);
args.sp !== undefined ? url_components.searchParams.set(args.sp, signature.join('')) : url_components.searchParams.set('signature', signature.join(''));
url_components.searchParams.set('cver', this.cver);
url_components.searchParams.set('ratebypass', 'yes');

6
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "youtubei.js",
"version": "1.2.1",
"version": "1.2.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "youtubei.js",
"version": "1.2.1",
"version": "1.2.2",
"license": "MIT",
"dependencies": {
"axios": "^0.21.4",
@@ -273,4 +273,4 @@
"integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow=="
}
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "youtubei.js",
"version": "1.2.1",
"version": "1.2.2",
"description": "An object-oriented library that allows you to search, get detailed info about videos, subscribe, unsubscribe, like, dislike, comment, download videos and much more!",
"main": "index.js",
"scripts": {
@@ -43,4 +43,4 @@
"url": "https://github.com/LuanRT/YouTube.js/issues"
},
"homepage": "https://github.com/LuanRT/YouTube.js#readme"
}
}