peertube urlreply
This commit is contained in:
parent
3f852ea6fb
commit
522b8d4efa
@ -33,6 +33,10 @@
|
|||||||
"name": "url-fediverse",
|
"name": "url-fediverse",
|
||||||
"version": "1.0.0"
|
"version": "1.0.0"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "url-peertube",
|
||||||
|
"version": "1.0.0"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "url-twitter",
|
"name": "url-twitter",
|
||||||
"version": "1.0.0"
|
"version": "1.0.0"
|
||||||
|
9
url-peertube/plugin.json
Normal file
9
url-peertube/plugin.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"main": "plugin.js",
|
||||||
|
"name": "url-peertube",
|
||||||
|
"description": "URLReply PeerTube",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"tags": ["urlreply"],
|
||||||
|
"dependencies": ["urlreply"],
|
||||||
|
"npmDependencies": []
|
||||||
|
}
|
72
url-peertube/plugin.ts
Normal file
72
url-peertube/plugin.ts
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
import { httpGET, sanitizeEscapedText, toHHMMSS } from '@squeebot/core/lib/common';
|
||||||
|
import {
|
||||||
|
Plugin,
|
||||||
|
EventListener,
|
||||||
|
DependencyLoad
|
||||||
|
} from '@squeebot/core/lib/plugin';
|
||||||
|
|
||||||
|
import { IMessage } from '@squeebot/core/lib/types';
|
||||||
|
|
||||||
|
async function peertubeResponse(url: URL, msg: IMessage): Promise<boolean> {
|
||||||
|
const url2go = `${url.origin}/api/v1/videos/${url.pathname.split('/')[3]}`;
|
||||||
|
let data;
|
||||||
|
|
||||||
|
try {
|
||||||
|
data = await httpGET(url2go);
|
||||||
|
if (!data) {
|
||||||
|
throw new Error('No API response, probably not peertube after all.');
|
||||||
|
}
|
||||||
|
data = JSON.parse(data);
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data.id || !data.uuid || data.errors) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const keys = [];
|
||||||
|
if (data.isLive) {
|
||||||
|
keys.push(['field', '[LIVE]', {color: 'red'}]);
|
||||||
|
}
|
||||||
|
|
||||||
|
keys.push(['field', 'PeerTube', { color: 'white', type: 'title' }]);
|
||||||
|
keys.push(['field', data.name, {type: 'description'}]);
|
||||||
|
|
||||||
|
keys.push(['field', data.views.toString(), { type: 'metric', label: 'Views' }]);
|
||||||
|
|
||||||
|
if (!data.isLive) {
|
||||||
|
keys.push(['field', toHHMMSS(data.duration.toString()), { label: 'Duration' }]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.likes != null) {
|
||||||
|
const likeCount = data.likes.toString();
|
||||||
|
const dislikeCount = data.dislikes.toString();
|
||||||
|
|
||||||
|
keys.push(['field', likeCount, { color: 'limegreen', label: ['▲', 'Likes'], type: 'metric' }]);
|
||||||
|
keys.push(['field', dislikeCount, { color: 'red', label: ['▼', 'Dislikes'], type: 'metric' }]);
|
||||||
|
}
|
||||||
|
|
||||||
|
keys.push(['field', data.channel.displayName || data.channel.name, { label: ['By'] }]);
|
||||||
|
|
||||||
|
msg.resolve(keys);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FediResponsePlugin extends Plugin {
|
||||||
|
@EventListener('pluginUnload')
|
||||||
|
public unloadEventHandler(plugin: string | Plugin): void {
|
||||||
|
if (plugin === this.name || plugin === this) {
|
||||||
|
this.emit('pluginUnloaded', this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@DependencyLoad('urlreply')
|
||||||
|
addUrlReply(urlreply: any): void {
|
||||||
|
urlreply.registerHandler(this.name, '/videos/watch/', async (url: URL, msg: IMessage) => {
|
||||||
|
return peertubeResponse(url, msg);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = FediResponsePlugin;
|
Loading…
Reference in New Issue
Block a user