Compare commits
	
		
			25 Commits
		
	
	
		
			archive/fl
			...
			develop
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6dadf326ac | |||
| 809803a194 | |||
| 2c6df73d02 | |||
| 
						 | 
					6407c1b072 | ||
| 
						 | 
					b9d99891db | ||
| 
						 | 
					48b73a89bc | ||
| 
						 | 
					82f4a3e6ec | ||
| df0e311dbc | |||
| 
						 | 
					ae195d9170 | ||
| 
						 | 
					f579afab16 | ||
| 
						 | 
					41098d09a7 | ||
| b2b04df23b | |||
| 51126e7f0f | |||
| 8f8f0c3cb0 | |||
| 
						 | 
					9597cddc80 | ||
| 
						 | 
					81f540e29d | ||
| 
						 | 
					4f6587e1f6 | ||
| 
						 | 
					ce19792a28 | ||
| 
						 | 
					ea6adfc1fc | ||
| 
						 | 
					db856aa6e2 | ||
| 
						 | 
					afdd320056 | ||
| 
						 | 
					f26ac80aa5 | ||
| 85d38f7939 | |||
| 
						 | 
					f21f752cbb | ||
| 
						 | 
					8558c555e5 | 
							
								
								
									
										1
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
{}
 | 
			
		||||
@@ -1,5 +0,0 @@
 | 
			
		||||
.*
 | 
			
		||||
node_modules/
 | 
			
		||||
src/
 | 
			
		||||
package-lock.json
 | 
			
		||||
tsconfig.json
 | 
			
		||||
							
								
								
									
										43
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								README.md
									
									
									
									
									
								
							@@ -1,3 +1,42 @@
 | 
			
		||||
# PeerTube plugin Quickstart
 | 
			
		||||
# Auto Import YouTube
 | 
			
		||||
 | 
			
		||||
See https://docs.joinpeertube.org/#/contribute-plugins?id=write-a-plugintheme
 | 
			
		||||
## Config
 | 
			
		||||
 | 
			
		||||
To use this plugin, you need to give some valid admins credential inside the plugin's settings.
 | 
			
		||||
 | 
			
		||||
After this you have to specify some YouTube Channel who need to be bind with a PeerTube Channel.
 | 
			
		||||
For this you have to use this format inside the plugins's setting. Into `URL list of Youtube channel to synchronize`'s text area. :
 | 
			
		||||
 | 
			
		||||
```json
 | 
			
		||||
[
 | 
			
		||||
   {
 | 
			
		||||
       "address":"https://www.youtube.com/feeds/videos.xml?channel_id=${MyYouTubeChannelID}",
 | 
			
		||||
       "ChannelId":"MyPeertubeChannelId"
 | 
			
		||||
   } ,
 | 
			
		||||
   ...
 | 
			
		||||
]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This an array of object who's in this format :
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
type SettingsContent = {
 | 
			
		||||
  address: string;
 | 
			
		||||
  channelId: string;
 | 
			
		||||
  timeloop?: number;
 | 
			
		||||
};
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### address
 | 
			
		||||
 | 
			
		||||
For exemple, to the Youtube channel : `https://www.youtube.com/channel/YouTube`, the channel id is `UCBR8-60-B28hp2BmDPdntcQ`. You can get it when you're clicking in the channel button on the video player. (He's not Highlighted by YouTube. Cheer Up !)  
 | 
			
		||||
So you need to specify the following address inside your configuration : `https://www.youtube.com/feeds/videos.xml?channel_id=UCBR8-60-B28hp2BmDPdntcQ`.
 | 
			
		||||
 | 
			
		||||
### channelId
 | 
			
		||||
 | 
			
		||||
The peertube's channel id is a number associated to a peertube's channel. He's unique per channel inside a same instance.
 | 
			
		||||
 | 
			
		||||
### timeloop
 | 
			
		||||
 | 
			
		||||
It's represent the time between two update of the videos list.  
 | 
			
		||||
It's not needful to specify the timeloop. The default value is set to 5 minutes.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										110
									
								
								lib/peertubeRequester.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								lib/peertubeRequester.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,110 @@
 | 
			
		||||
// Api request lib
 | 
			
		||||
import fetch, { Headers } from "node-fetch";
 | 
			
		||||
import { URL, URLSearchParams } from "url";
 | 
			
		||||
 | 
			
		||||
namespace PeerTubeRequester {
 | 
			
		||||
  export type Config = {
 | 
			
		||||
    domainName: string | URL;
 | 
			
		||||
    username: string;
 | 
			
		||||
    password: string;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type UploadInstruction = {
 | 
			
		||||
  [key: string]: string;
 | 
			
		||||
  channelId: string;
 | 
			
		||||
  targetUrl: string;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PeerTubeRequester {
 | 
			
		||||
  readonly domainName: URL;
 | 
			
		||||
  readonly username: string;
 | 
			
		||||
  readonly password: string;
 | 
			
		||||
 | 
			
		||||
  constructor(readonly config: PeerTubeRequester.Config) {
 | 
			
		||||
    this.domainName = new URL("/", config.domainName);
 | 
			
		||||
    this.username = config.username;
 | 
			
		||||
    this.password = config.password;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async requestAuthToken(): Promise<any> {
 | 
			
		||||
    let response = await fetch(
 | 
			
		||||
      new URL(`/api/v1/oauth-clients/local`, this.domainName)
 | 
			
		||||
    );
 | 
			
		||||
    if (!response.ok) {
 | 
			
		||||
      throw new Error("Cannot get client credentials : " + response.statusText); // CRASH
 | 
			
		||||
    }
 | 
			
		||||
    const { client_id: clientId, client_secret: clientSecret } =
 | 
			
		||||
      await response.json();
 | 
			
		||||
 | 
			
		||||
    const clientInfo: { [key: string]: string } = {
 | 
			
		||||
      client_id: clientId,
 | 
			
		||||
      client_secret: clientSecret,
 | 
			
		||||
      grant_type: "password",
 | 
			
		||||
      response_type: "code",
 | 
			
		||||
      username: this.username,
 | 
			
		||||
      password: this.password,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let myParams = new URLSearchParams();
 | 
			
		||||
    for (const key in clientInfo) myParams.append(key, clientInfo[key]);
 | 
			
		||||
 | 
			
		||||
    response = await fetch(new URL(`/api/v1/users/token`, this.domainName), {
 | 
			
		||||
      method: "post",
 | 
			
		||||
      body: myParams,
 | 
			
		||||
    });
 | 
			
		||||
    if (!response.ok) {
 | 
			
		||||
      throw new Error("Cannot get access Token : " + response.statusText); // CRASH
 | 
			
		||||
    }
 | 
			
		||||
    const { access_token: accessToken } = await response.json();
 | 
			
		||||
    return accessToken;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async uploadFromUrl(message: UploadInstruction): Promise<void> {
 | 
			
		||||
    const accessToken = await this.requestAuthToken();
 | 
			
		||||
    const myUploadForm = new URLSearchParams();
 | 
			
		||||
    const myHeader = new Headers();
 | 
			
		||||
    myHeader.append("Authorization", `Bearer ${accessToken}`);
 | 
			
		||||
    for (const key in message) myUploadForm.append(key, message[key]);
 | 
			
		||||
 | 
			
		||||
    const response = await fetch(
 | 
			
		||||
      new URL("/api/v1/videos/imports", this.domainName),
 | 
			
		||||
      {
 | 
			
		||||
        method: "post",
 | 
			
		||||
        headers: myHeader,
 | 
			
		||||
        body: myUploadForm,
 | 
			
		||||
      }
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    if (!response.ok) {
 | 
			
		||||
      switch (response.status) {
 | 
			
		||||
        case 400:
 | 
			
		||||
          throw new Error(
 | 
			
		||||
            `Bad or malformed request. Probably because your target URL (from Youtube?) was not accepted by the API.\
 | 
			
		||||
                        The target URL you attempted to pass: ${message.targetUrl}.
 | 
			
		||||
                        Response from the server: ${response.statusText}`
 | 
			
		||||
          );
 | 
			
		||||
          break;
 | 
			
		||||
        case 403:
 | 
			
		||||
          throw new Error(response.statusText);
 | 
			
		||||
          break;
 | 
			
		||||
        case 409:
 | 
			
		||||
          throw new Error(
 | 
			
		||||
            `Oops, your instance did not allowed the HTTPS import.\
 | 
			
		||||
                        Contact your administrator.
 | 
			
		||||
                        ${response.statusText}`
 | 
			
		||||
          );
 | 
			
		||||
          break;
 | 
			
		||||
        default:
 | 
			
		||||
          throw new Error(
 | 
			
		||||
            `Oh, you encountered an undocumented issues.\
 | 
			
		||||
                        Please create an issue to the plugin project.
 | 
			
		||||
                        ERROR: ${response.statusText}`
 | 
			
		||||
          );
 | 
			
		||||
          break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { PeerTubeRequester };
 | 
			
		||||
							
								
								
									
										493
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										493
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,16 +1,21 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "peertube-plugin-auto-import-ytb",
 | 
			
		||||
  "version": "0.0.2",
 | 
			
		||||
  "version": "0.0.1",
 | 
			
		||||
  "lockfileVersion": 2,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "packages": {
 | 
			
		||||
    "": {
 | 
			
		||||
      "version": "0.0.2",
 | 
			
		||||
      "version": "0.0.1",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "listener-rss-agregator": "0.0.2"
 | 
			
		||||
        "@types/node-fetch": "^2.5.11",
 | 
			
		||||
        "form-data": "^4.0.0",
 | 
			
		||||
        "listener-rss": "^0.0.3",
 | 
			
		||||
        "listener-rss-aggregator": "^0.0.5",
 | 
			
		||||
        "node-fetch": "^2.6.1"
 | 
			
		||||
      },
 | 
			
		||||
      "devDependencies": {
 | 
			
		||||
        "tsc": "^2.0.3"
 | 
			
		||||
        "ts-node": "^10.0.0",
 | 
			
		||||
        "typescript": "^4.3.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@databases/escape-identifier": {
 | 
			
		||||
@@ -43,10 +48,56 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@databases/validate-unicode/-/validate-unicode-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@tsconfig/node10": {
 | 
			
		||||
      "version": "1.0.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
 | 
			
		||||
      "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@tsconfig/node12": {
 | 
			
		||||
      "version": "1.0.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
 | 
			
		||||
      "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@tsconfig/node14": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@tsconfig/node16": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@types/node": {
 | 
			
		||||
      "version": "15.12.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz",
 | 
			
		||||
      "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA=="
 | 
			
		||||
      "version": "16.3.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.1.tgz",
 | 
			
		||||
      "integrity": "sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@types/node-fetch": {
 | 
			
		||||
      "version": "2.5.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.11.tgz",
 | 
			
		||||
      "integrity": "sha512-2upCKaqVZETDRb8A2VTaRymqFBEgH8u6yr96b/u3+1uQEPDRo3mJLEiPk7vdXBHRtjwkjqzFYMJXrt0Z9QsYjQ==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@types/node": "*",
 | 
			
		||||
        "form-data": "^3.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@types/node-fetch/node_modules/form-data": {
 | 
			
		||||
      "version": "3.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "asynckit": "^0.4.0",
 | 
			
		||||
        "combined-stream": "^1.0.8",
 | 
			
		||||
        "mime-types": "^2.1.12"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@types/sqlite3": {
 | 
			
		||||
      "version": "3.1.7",
 | 
			
		||||
@@ -83,11 +134,22 @@
 | 
			
		||||
        "readable-stream": "^2.0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/arg": {
 | 
			
		||||
      "version": "4.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/asap": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/asynckit": {
 | 
			
		||||
      "version": "0.4.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 | 
			
		||||
      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/balanced-match": {
 | 
			
		||||
      "version": "1.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
 | 
			
		||||
@@ -102,6 +164,12 @@
 | 
			
		||||
        "concat-map": "0.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/buffer-from": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/chownr": {
 | 
			
		||||
      "version": "1.1.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
 | 
			
		||||
@@ -115,6 +183,17 @@
 | 
			
		||||
        "node": ">=0.10.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/combined-stream": {
 | 
			
		||||
      "version": "1.0.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
			
		||||
      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "delayed-stream": "~1.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.8"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/concat-map": {
 | 
			
		||||
      "version": "0.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
			
		||||
@@ -130,6 +209,12 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
 | 
			
		||||
      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/create-require": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/debug": {
 | 
			
		||||
      "version": "3.2.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
 | 
			
		||||
@@ -146,6 +231,14 @@
 | 
			
		||||
        "node": ">=4.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/delayed-stream": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.4.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/delegates": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
 | 
			
		||||
@@ -162,6 +255,15 @@
 | 
			
		||||
        "node": ">=0.10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/diff": {
 | 
			
		||||
      "version": "4.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.3.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/entities": {
 | 
			
		||||
      "version": "2.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
 | 
			
		||||
@@ -170,6 +272,19 @@
 | 
			
		||||
        "url": "https://github.com/fb55/entities?sponsor=1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/form-data": {
 | 
			
		||||
      "version": "4.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "asynckit": "^0.4.0",
 | 
			
		||||
        "combined-stream": "^1.0.8",
 | 
			
		||||
        "mime-types": "^2.1.12"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/fs-minipass": {
 | 
			
		||||
      "version": "1.2.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
 | 
			
		||||
@@ -277,20 +392,45 @@
 | 
			
		||||
      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/listener-rss": {
 | 
			
		||||
      "version": "0.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listener-rss/-/listener-rss-0.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-ljH6FD4NMypkrZ9ZIMdW2YdAlm/Jer++zPI+1HTWK7BbhPJmUF3sSymqUqAjBcfH3xjt+fpYPqYgNYNM1fEYpA==",
 | 
			
		||||
      "version": "0.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listener-rss/-/listener-rss-0.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-rccetOTwyyww/KDuaMX0EMjaGi+Jx+bojp18Ucxra6OeCfz2hC9FEasVNeENR096+ndOCS/rkKTJl+RD9rlAAQ==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "rss-parser": "3.11.0"
 | 
			
		||||
        "rss-parser": "^3.11.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/listener-rss-agregator": {
 | 
			
		||||
      "version": "0.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listener-rss-agregator/-/listener-rss-agregator-0.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-ATj4esXtHLThe1/wkJ/ukA9+pC9FwBCNZCbVv7Ywr1eIbxBR+AHR5090lzCQt3WJsBblpTTZMni+vHxmGjRR7Q==",
 | 
			
		||||
    "node_modules/listener-rss-aggregator": {
 | 
			
		||||
      "version": "0.0.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listener-rss-aggregator/-/listener-rss-aggregator-0.0.5.tgz",
 | 
			
		||||
      "integrity": "sha512-0QE7kkzurjsWr4gNAJ4X+C7UFSyaVuYq2mKYXZ3shvyj81kULpBgFZSg/70MZkUoqixgWQ5P8oxyztRDOP78tw==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@databases/sqlite": "^3.0.0",
 | 
			
		||||
        "listener-rss": "^0.0.1"
 | 
			
		||||
        "listener-rss": "^0.0.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/make-error": {
 | 
			
		||||
      "version": "1.3.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
 | 
			
		||||
      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/mime-db": {
 | 
			
		||||
      "version": "1.48.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
 | 
			
		||||
      "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/mime-types": {
 | 
			
		||||
      "version": "2.1.31",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
 | 
			
		||||
      "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "mime-db": "1.48.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/minimatch": {
 | 
			
		||||
@@ -348,9 +488,9 @@
 | 
			
		||||
      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/needle": {
 | 
			
		||||
      "version": "2.6.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz",
 | 
			
		||||
      "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==",
 | 
			
		||||
      "version": "2.8.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/needle/-/needle-2.8.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ZTq6WYkN/3782H1393me3utVYdq2XyqNUFBsprEE3VMAT0+hP/cItpnITpqsY6ep2yeFE4Tqtqwc74VqUlUYtw==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "debug": "^3.2.6",
 | 
			
		||||
        "iconv-lite": "^0.4.4",
 | 
			
		||||
@@ -363,6 +503,14 @@
 | 
			
		||||
        "node": ">= 4.4.x"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/node-fetch": {
 | 
			
		||||
      "version": "2.6.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
 | 
			
		||||
      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "4.x || >=6.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/node-pre-gyp": {
 | 
			
		||||
      "version": "0.11.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
 | 
			
		||||
@@ -540,9 +688,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/rss-parser": {
 | 
			
		||||
      "version": "3.11.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.11.0.tgz",
 | 
			
		||||
      "integrity": "sha512-oTLoYW+bNqNwkz8OpGinBU9s3As0sdczQjETIZFgyAdi7AopyhoVFGPIyFMYXXEY8hayKzD5CH+4CtmiPtJ89g==",
 | 
			
		||||
      "version": "3.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "entities": "^2.0.3",
 | 
			
		||||
        "xml2js": "^0.4.19"
 | 
			
		||||
@@ -581,6 +729,25 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/source-map": {
 | 
			
		||||
      "version": "0.6.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 | 
			
		||||
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.10.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/source-map-support": {
 | 
			
		||||
      "version": "0.5.19",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
 | 
			
		||||
      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "buffer-from": "^1.0.0",
 | 
			
		||||
        "source-map": "^0.6.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/sqlite3": {
 | 
			
		||||
      "version": "4.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz",
 | 
			
		||||
@@ -632,9 +799,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tar": {
 | 
			
		||||
      "version": "4.4.13",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
 | 
			
		||||
      "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
 | 
			
		||||
      "version": "4.4.14",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.14.tgz",
 | 
			
		||||
      "integrity": "sha512-ouN3XcSWYOAHmXZ+P4NEFJvqXL50To9OZBSQNNP30vBUFJFZZ0PLX15fnwupv6azfxMUfUDUr2fhYw4zGAEPcg==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "chownr": "^1.1.1",
 | 
			
		||||
        "fs-minipass": "^1.2.5",
 | 
			
		||||
@@ -656,13 +823,59 @@
 | 
			
		||||
        "promise": "^6.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsc": {
 | 
			
		||||
      "version": "2.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsc/-/tsc-2.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-SN+9zBUtrpUcOpaUO7GjkEHgWtf22c7FKbKCA4e858eEM7Qz86rRDpgOU2lBIDf0fLCsEg65ms899UMUIB2+Ow==",
 | 
			
		||||
    "node_modules/ts-node": {
 | 
			
		||||
      "version": "10.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@tsconfig/node10": "^1.0.7",
 | 
			
		||||
        "@tsconfig/node12": "^1.0.7",
 | 
			
		||||
        "@tsconfig/node14": "^1.0.0",
 | 
			
		||||
        "@tsconfig/node16": "^1.0.1",
 | 
			
		||||
        "arg": "^4.1.0",
 | 
			
		||||
        "create-require": "^1.1.0",
 | 
			
		||||
        "diff": "^4.0.1",
 | 
			
		||||
        "make-error": "^1.1.1",
 | 
			
		||||
        "source-map-support": "^0.5.17",
 | 
			
		||||
        "yn": "3.1.1"
 | 
			
		||||
      },
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "ts-node": "dist/bin.js",
 | 
			
		||||
        "ts-node-cwd": "dist/bin-cwd.js",
 | 
			
		||||
        "ts-node-script": "dist/bin-script.js",
 | 
			
		||||
        "ts-node-transpile-only": "dist/bin-transpile.js",
 | 
			
		||||
        "ts-script": "dist/bin-script-deprecated.js"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=12.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@swc/core": ">=1.2.50",
 | 
			
		||||
        "@swc/wasm": ">=1.2.50",
 | 
			
		||||
        "@types/node": "*",
 | 
			
		||||
        "typescript": ">=2.7"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@swc/core": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "@swc/wasm": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/typescript": {
 | 
			
		||||
      "version": "4.3.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
 | 
			
		||||
      "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "tsc": "bin/tsc"
 | 
			
		||||
        "tsc": "bin/tsc",
 | 
			
		||||
        "tsserver": "bin/tsserver"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=4.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/util-deprecate": {
 | 
			
		||||
@@ -707,6 +920,15 @@
 | 
			
		||||
      "version": "3.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/yn": {
 | 
			
		||||
      "version": "3.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=6"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
@@ -740,10 +962,55 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@databases/validate-unicode/-/validate-unicode-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g=="
 | 
			
		||||
    },
 | 
			
		||||
    "@tsconfig/node10": {
 | 
			
		||||
      "version": "1.0.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
 | 
			
		||||
      "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "@tsconfig/node12": {
 | 
			
		||||
      "version": "1.0.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
 | 
			
		||||
      "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "@tsconfig/node14": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "@tsconfig/node16": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "@types/node": {
 | 
			
		||||
      "version": "15.12.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz",
 | 
			
		||||
      "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA=="
 | 
			
		||||
      "version": "16.3.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.1.tgz",
 | 
			
		||||
      "integrity": "sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA=="
 | 
			
		||||
    },
 | 
			
		||||
    "@types/node-fetch": {
 | 
			
		||||
      "version": "2.5.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.11.tgz",
 | 
			
		||||
      "integrity": "sha512-2upCKaqVZETDRb8A2VTaRymqFBEgH8u6yr96b/u3+1uQEPDRo3mJLEiPk7vdXBHRtjwkjqzFYMJXrt0Z9QsYjQ==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@types/node": "*",
 | 
			
		||||
        "form-data": "^3.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "form-data": {
 | 
			
		||||
          "version": "3.0.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
 | 
			
		||||
          "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "asynckit": "^0.4.0",
 | 
			
		||||
            "combined-stream": "^1.0.8",
 | 
			
		||||
            "mime-types": "^2.1.12"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "@types/sqlite3": {
 | 
			
		||||
      "version": "3.1.7",
 | 
			
		||||
@@ -777,11 +1044,22 @@
 | 
			
		||||
        "readable-stream": "^2.0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "arg": {
 | 
			
		||||
      "version": "4.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "asap": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0="
 | 
			
		||||
    },
 | 
			
		||||
    "asynckit": {
 | 
			
		||||
      "version": "0.4.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 | 
			
		||||
      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
 | 
			
		||||
    },
 | 
			
		||||
    "balanced-match": {
 | 
			
		||||
      "version": "1.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
 | 
			
		||||
@@ -796,6 +1074,12 @@
 | 
			
		||||
        "concat-map": "0.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "buffer-from": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "chownr": {
 | 
			
		||||
      "version": "1.1.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
 | 
			
		||||
@@ -806,6 +1090,14 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
 | 
			
		||||
    },
 | 
			
		||||
    "combined-stream": {
 | 
			
		||||
      "version": "1.0.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
			
		||||
      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "delayed-stream": "~1.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "concat-map": {
 | 
			
		||||
      "version": "0.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
			
		||||
@@ -821,6 +1113,12 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
 | 
			
		||||
      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
 | 
			
		||||
    },
 | 
			
		||||
    "create-require": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "debug": {
 | 
			
		||||
      "version": "3.2.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
 | 
			
		||||
@@ -834,6 +1132,11 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
 | 
			
		||||
      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
 | 
			
		||||
    },
 | 
			
		||||
    "delayed-stream": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
 | 
			
		||||
    },
 | 
			
		||||
    "delegates": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
 | 
			
		||||
@@ -844,11 +1147,27 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
 | 
			
		||||
      "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
 | 
			
		||||
    },
 | 
			
		||||
    "diff": {
 | 
			
		||||
      "version": "4.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "entities": {
 | 
			
		||||
      "version": "2.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
 | 
			
		||||
    },
 | 
			
		||||
    "form-data": {
 | 
			
		||||
      "version": "4.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "asynckit": "^0.4.0",
 | 
			
		||||
        "combined-stream": "^1.0.8",
 | 
			
		||||
        "mime-types": "^2.1.12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "fs-minipass": {
 | 
			
		||||
      "version": "1.2.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
 | 
			
		||||
@@ -944,20 +1263,39 @@
 | 
			
		||||
      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
 | 
			
		||||
    },
 | 
			
		||||
    "listener-rss": {
 | 
			
		||||
      "version": "0.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listener-rss/-/listener-rss-0.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-ljH6FD4NMypkrZ9ZIMdW2YdAlm/Jer++zPI+1HTWK7BbhPJmUF3sSymqUqAjBcfH3xjt+fpYPqYgNYNM1fEYpA==",
 | 
			
		||||
      "version": "0.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listener-rss/-/listener-rss-0.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-rccetOTwyyww/KDuaMX0EMjaGi+Jx+bojp18Ucxra6OeCfz2hC9FEasVNeENR096+ndOCS/rkKTJl+RD9rlAAQ==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "rss-parser": "3.11.0"
 | 
			
		||||
        "rss-parser": "^3.11.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "listener-rss-agregator": {
 | 
			
		||||
      "version": "0.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listener-rss-agregator/-/listener-rss-agregator-0.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-ATj4esXtHLThe1/wkJ/ukA9+pC9FwBCNZCbVv7Ywr1eIbxBR+AHR5090lzCQt3WJsBblpTTZMni+vHxmGjRR7Q==",
 | 
			
		||||
    "listener-rss-aggregator": {
 | 
			
		||||
      "version": "0.0.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listener-rss-aggregator/-/listener-rss-aggregator-0.0.5.tgz",
 | 
			
		||||
      "integrity": "sha512-0QE7kkzurjsWr4gNAJ4X+C7UFSyaVuYq2mKYXZ3shvyj81kULpBgFZSg/70MZkUoqixgWQ5P8oxyztRDOP78tw==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@databases/sqlite": "^3.0.0",
 | 
			
		||||
        "listener-rss": "^0.0.1"
 | 
			
		||||
        "listener-rss": "^0.0.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "make-error": {
 | 
			
		||||
      "version": "1.3.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
 | 
			
		||||
      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "mime-db": {
 | 
			
		||||
      "version": "1.48.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
 | 
			
		||||
      "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "mime-types": {
 | 
			
		||||
      "version": "2.1.31",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
 | 
			
		||||
      "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "mime-db": "1.48.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "minimatch": {
 | 
			
		||||
@@ -1009,15 +1347,20 @@
 | 
			
		||||
      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "needle": {
 | 
			
		||||
      "version": "2.6.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz",
 | 
			
		||||
      "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==",
 | 
			
		||||
      "version": "2.8.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/needle/-/needle-2.8.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ZTq6WYkN/3782H1393me3utVYdq2XyqNUFBsprEE3VMAT0+hP/cItpnITpqsY6ep2yeFE4Tqtqwc74VqUlUYtw==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "debug": "^3.2.6",
 | 
			
		||||
        "iconv-lite": "^0.4.4",
 | 
			
		||||
        "sax": "^1.2.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node-fetch": {
 | 
			
		||||
      "version": "2.6.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
 | 
			
		||||
      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
 | 
			
		||||
    },
 | 
			
		||||
    "node-pre-gyp": {
 | 
			
		||||
      "version": "0.11.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
 | 
			
		||||
@@ -1167,9 +1510,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "rss-parser": {
 | 
			
		||||
      "version": "3.11.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.11.0.tgz",
 | 
			
		||||
      "integrity": "sha512-oTLoYW+bNqNwkz8OpGinBU9s3As0sdczQjETIZFgyAdi7AopyhoVFGPIyFMYXXEY8hayKzD5CH+4CtmiPtJ89g==",
 | 
			
		||||
      "version": "3.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "entities": "^2.0.3",
 | 
			
		||||
        "xml2js": "^0.4.19"
 | 
			
		||||
@@ -1205,6 +1548,22 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
 | 
			
		||||
    },
 | 
			
		||||
    "source-map": {
 | 
			
		||||
      "version": "0.6.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 | 
			
		||||
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "source-map-support": {
 | 
			
		||||
      "version": "0.5.19",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
 | 
			
		||||
      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "buffer-from": "^1.0.0",
 | 
			
		||||
        "source-map": "^0.6.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "sqlite3": {
 | 
			
		||||
      "version": "4.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz",
 | 
			
		||||
@@ -1246,9 +1605,9 @@
 | 
			
		||||
      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
 | 
			
		||||
    },
 | 
			
		||||
    "tar": {
 | 
			
		||||
      "version": "4.4.13",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
 | 
			
		||||
      "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
 | 
			
		||||
      "version": "4.4.14",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.14.tgz",
 | 
			
		||||
      "integrity": "sha512-ouN3XcSWYOAHmXZ+P4NEFJvqXL50To9OZBSQNNP30vBUFJFZZ0PLX15fnwupv6azfxMUfUDUr2fhYw4zGAEPcg==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chownr": "^1.1.1",
 | 
			
		||||
        "fs-minipass": "^1.2.5",
 | 
			
		||||
@@ -1267,10 +1626,28 @@
 | 
			
		||||
        "promise": "^6.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "tsc": {
 | 
			
		||||
      "version": "2.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsc/-/tsc-2.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-SN+9zBUtrpUcOpaUO7GjkEHgWtf22c7FKbKCA4e858eEM7Qz86rRDpgOU2lBIDf0fLCsEg65ms899UMUIB2+Ow==",
 | 
			
		||||
    "ts-node": {
 | 
			
		||||
      "version": "10.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@tsconfig/node10": "^1.0.7",
 | 
			
		||||
        "@tsconfig/node12": "^1.0.7",
 | 
			
		||||
        "@tsconfig/node14": "^1.0.0",
 | 
			
		||||
        "@tsconfig/node16": "^1.0.1",
 | 
			
		||||
        "arg": "^4.1.0",
 | 
			
		||||
        "create-require": "^1.1.0",
 | 
			
		||||
        "diff": "^4.0.1",
 | 
			
		||||
        "make-error": "^1.1.1",
 | 
			
		||||
        "source-map-support": "^0.5.17",
 | 
			
		||||
        "yn": "3.1.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "typescript": {
 | 
			
		||||
      "version": "4.3.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
 | 
			
		||||
      "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "util-deprecate": {
 | 
			
		||||
@@ -1309,6 +1686,12 @@
 | 
			
		||||
      "version": "3.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
 | 
			
		||||
    },
 | 
			
		||||
    "yn": {
 | 
			
		||||
      "version": "3.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								package.json
									
									
									
									
									
								
							@@ -1,36 +1,40 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "peertube-plugin-auto-import-ytb",
 | 
			
		||||
  "description": "PeerTube plugin quickstart",
 | 
			
		||||
  "description": "Peertube plugin to auto import videos from a youtube channel to a local peertube channel",
 | 
			
		||||
  "version": "0.0.2",
 | 
			
		||||
  "author": "AmauryJOLY",
 | 
			
		||||
  "bugs": "https://framagit.org/framasoft/peertube/peertube-plugin-quickstart/issues",
 | 
			
		||||
  "bugs": "https://zeteo.me/gitea/Outils-PeerTube/peertube-plugin-auto-import-ytb/issues",
 | 
			
		||||
  "clientScripts": [],
 | 
			
		||||
  "css": [],
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "tsc": "^2.0.3"
 | 
			
		||||
    "ts-node": "^10.0.0",
 | 
			
		||||
    "typescript": "^4.3.4"
 | 
			
		||||
  },
 | 
			
		||||
  "engine": {
 | 
			
		||||
    "peertube": ">=1.3.0"
 | 
			
		||||
    "peertube": ">=3.2.0"
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://framagit.org/framasoft/peertube/peertube-plugin-quickstart",
 | 
			
		||||
  "homepage": "https://zeteo.me/gitea/Outils-PeerTube/peertube-plugin-auto-import-ytb",
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "peertube",
 | 
			
		||||
    "plugin"
 | 
			
		||||
  ],
 | 
			
		||||
  "library": "./dist/main.js",
 | 
			
		||||
  "library": "./dist/src/main.js",
 | 
			
		||||
  "files": [
 | 
			
		||||
    "dist/",
 | 
			
		||||
    "README.md"
 | 
			
		||||
  ],
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "buildAndDeploy": "npm run build && npm run deploy",
 | 
			
		||||
    "predeploy": "npm run build",
 | 
			
		||||
    "deploy": "bash ./scripts/deploy.sh",
 | 
			
		||||
    "build": "tsc"
 | 
			
		||||
  },
 | 
			
		||||
  "staticDirs": {},
 | 
			
		||||
  "translations": {
 | 
			
		||||
  },
 | 
			
		||||
  "translations": {},
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "listener-rss-agregator": "0.0.2"
 | 
			
		||||
    "@types/node-fetch": "^2.5.11",
 | 
			
		||||
    "form-data": "^4.0.0",
 | 
			
		||||
    "listener-rss-aggregator": "^0.0.5",
 | 
			
		||||
    "listener-rss": "^0.0.3",
 | 
			
		||||
    "node-fetch": "^2.6.1"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,13 @@
 | 
			
		||||
tmp_dir=$(mktemp -d)/peertube-plugin-auto-import-ytb/
 | 
			
		||||
work_dir=$(pwd)/
 | 
			
		||||
# echo $work_dir
 | 
			
		||||
#/bin/bash
 | 
			
		||||
tmp_dir=$(mktemp -d)/peertube-plugin-auto-import-ytb
 | 
			
		||||
work_dir=$(pwd)
 | 
			
		||||
# echo "${work_dir}"
 | 
			
		||||
 | 
			
		||||
mkdir $tmp_dir
 | 
			
		||||
mkdir "${tmp_dir}"
 | 
			
		||||
# echo "directory created"
 | 
			
		||||
rsync --exclude-from=$work_dir.rsyncignore $work_dir $tmp_dir -ar
 | 
			
		||||
cp "${work_dir}/dist" "${work_dir}/package.json" "${work_dir}/LICENSE" $tmp_dir -r
 | 
			
		||||
# echo "rsync --exclude-from=$work_dir.rsyncignore $work_dir $tmp_dir"
 | 
			
		||||
# echo "rsync done"
 | 
			
		||||
cd ../PeerTube
 | 
			
		||||
node ./dist/server/tools/peertube.js plugins install --path $tmp_dir
 | 
			
		||||
cd "../PeerTube-cli"
 | 
			
		||||
node "./dist/server/tools/peertube.js" plugins install --path "${tmp_dir}"
 | 
			
		||||
# echo $tmp_dir
 | 
			
		||||
							
								
								
									
										175
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										175
									
								
								src/main.ts
									
									
									
									
									
								
							@@ -1,63 +1,158 @@
 | 
			
		||||
import { ManageListener } from 'listener-rss-agregator';
 | 
			
		||||
import { ListenerRssAggregator } from "listener-rss-aggregator";
 | 
			
		||||
import { ListenerRss } from "listener-rss";
 | 
			
		||||
import { PeerTubeRequester } from "../lib/peertubeRequester";
 | 
			
		||||
 | 
			
		||||
let myManager : ManageListener;
 | 
			
		||||
let bindistenerChannelId: {[key: string] : string} = {};
 | 
			
		||||
type ListenerData = ListenerRss.Config & {
 | 
			
		||||
  address: string;
 | 
			
		||||
  channelId: string;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
import * as path from 'path';
 | 
			
		||||
let myManager: ListenerRssAggregator;
 | 
			
		||||
let listenersDataBinding = new Map<string, ListenerData>();
 | 
			
		||||
let logger: any;
 | 
			
		||||
let peertube: PeerTubeRequester | undefined = undefined;
 | 
			
		||||
let goodPeertubeCredential: boolean = false;
 | 
			
		||||
 | 
			
		||||
import * as path from "path";
 | 
			
		||||
import fs from "fs";
 | 
			
		||||
 | 
			
		||||
async function register({
 | 
			
		||||
    registerSetting,
 | 
			
		||||
    settingsManager,
 | 
			
		||||
  registerSetting,
 | 
			
		||||
  settingsManager,
 | 
			
		||||
  peertubeHelpers,
 | 
			
		||||
}: any) {
 | 
			
		||||
  registerSetting({
 | 
			
		||||
    name: 'ytb-urls',
 | 
			
		||||
    label: 'liste des urls youtube a auto-importer',
 | 
			
		||||
    type: 'input-textarea'
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  const basePath = peertubeHelpers.plugin.getDataDirectoryPath();
 | 
			
		||||
  myManager = new ManageListener(path.join(basePath, '/data/storage.bd'));
 | 
			
		||||
  logger = peertubeHelpers.logger;
 | 
			
		||||
 | 
			
		||||
  const inputs = await settingsManager.getSetting('ytb-urls');
 | 
			
		||||
  registerSetting({
 | 
			
		||||
    name: "ytb-urls",
 | 
			
		||||
    label: "URL list of Youtube channel to synchronize",
 | 
			
		||||
    type: "input-textarea",
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  addListeners(inputs);
 | 
			
		||||
  registerSetting({
 | 
			
		||||
    name: "admin-name",
 | 
			
		||||
    label: "Admin Username",
 | 
			
		||||
    type: "input",
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  settingsManager.onSettingsChange((settings: any) => {
 | 
			
		||||
    myManager.stopAll();
 | 
			
		||||
    myManager.save();
 | 
			
		||||
  registerSetting({
 | 
			
		||||
    name: "admin-password",
 | 
			
		||||
    label: "Admin Password",
 | 
			
		||||
    type: "input-password",
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
    addListeners(settings['ytb-urls']);
 | 
			
		||||
  })
 | 
			
		||||
  logger.debug("setting register");
 | 
			
		||||
  fs.appendFileSync(path.join(basePath, "/storage.bd"), "");
 | 
			
		||||
 | 
			
		||||
  myManager.on('update', (entries: any) => {
 | 
			
		||||
    // for (const item in entries.items)
 | 
			
		||||
    //   console.info(item.)
 | 
			
		||||
      
 | 
			
		||||
  })
 | 
			
		||||
  
 | 
			
		||||
  const configAggregator = await ListenerRssAggregator.instantiateAggregator(
 | 
			
		||||
    path.join(basePath, "/storage.bd")
 | 
			
		||||
  );
 | 
			
		||||
  myManager = new ListenerRssAggregator(configAggregator);
 | 
			
		||||
 | 
			
		||||
  logger.debug("Aggregator created");
 | 
			
		||||
 | 
			
		||||
  const settingYtbUrls = await settingsManager.getSetting("ytb-urls");
 | 
			
		||||
  if (settingYtbUrls) await addListeners(settingYtbUrls);
 | 
			
		||||
 | 
			
		||||
  const settingCredentials: any = await settingsManager.getSettings([
 | 
			
		||||
    "admin-name",
 | 
			
		||||
    "admin-password",
 | 
			
		||||
  ]);
 | 
			
		||||
 | 
			
		||||
  if (settingCredentials["admin-name"] && settingCredentials["admin-password"])
 | 
			
		||||
    apiRequestInitializer({
 | 
			
		||||
      domainName: peertubeHelpers.config.getWebserverUrl(),
 | 
			
		||||
      username: settingCredentials["admin-name"],
 | 
			
		||||
      password: settingCredentials["admin-password"],
 | 
			
		||||
    });
 | 
			
		||||
  logger.debug("Actual config loaded");
 | 
			
		||||
 | 
			
		||||
  settingsManager.onSettingsChange(async (settings: any) => {
 | 
			
		||||
    if (
 | 
			
		||||
      !peertube ||
 | 
			
		||||
      peertube.username != settings["admin-name"] ||
 | 
			
		||||
      peertube.password != settings["admin-password"]
 | 
			
		||||
    )
 | 
			
		||||
      apiRequestInitializer({
 | 
			
		||||
        domainName: peertubeHelpers.config.getWebserverUrl(),
 | 
			
		||||
        username: settings["admin-name"],
 | 
			
		||||
        password: settings["admin-password"],
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
    await addListeners(settings["ytb-urls"]);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  myManager.on("newEntries", async (entries: any) => {
 | 
			
		||||
    const datas = listenersDataBinding.get(entries.addressListener);
 | 
			
		||||
    if (!datas) return;
 | 
			
		||||
 | 
			
		||||
    logger.debug(
 | 
			
		||||
      "New entries detected from channel #%i: %s",
 | 
			
		||||
      datas.channelId,
 | 
			
		||||
      JSON.stringify(entries)
 | 
			
		||||
    );
 | 
			
		||||
    for (const item of entries.items)
 | 
			
		||||
      if (peertube)
 | 
			
		||||
        await peertube.uploadFromUrl({
 | 
			
		||||
          channelId: datas.channelId,
 | 
			
		||||
          targetUrl: item.link,
 | 
			
		||||
        });
 | 
			
		||||
      else {
 | 
			
		||||
        logger.warn("Bad credential provides. New entries Skipped.");
 | 
			
		||||
      }
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function addListeners(listenerInput: any) {
 | 
			
		||||
  for (const line in listenerInput.split('\n'))
 | 
			
		||||
    if (!myManager.listenerArray.map((it: any) => it.address).includes(line)) // si ligne non présente
 | 
			
		||||
    {
 | 
			
		||||
      let splitted = line.split(':');
 | 
			
		||||
      bindistenerChannelId[splitted[1]] = splitted[0];
 | 
			
		||||
      myManager.registerListener({ address: splitted[0] });
 | 
			
		||||
    }
 | 
			
		||||
async function apiRequestInitializer(data: PeerTubeRequester.Config) {
 | 
			
		||||
  peertube = new PeerTubeRequester(data);
 | 
			
		||||
 | 
			
		||||
  myManager.save();
 | 
			
		||||
  myManager.startAll();
 | 
			
		||||
  try {
 | 
			
		||||
    await peertube.requestAuthToken();
 | 
			
		||||
    goodPeertubeCredential = true;
 | 
			
		||||
    logger.debug("credential ok");
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    logger.warn("Error during the credential validation : " + error);
 | 
			
		||||
    peertube = undefined;
 | 
			
		||||
    goodPeertubeCredential = false;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function addListeners(listenerInput: string) {
 | 
			
		||||
  let listeners: ListenerData[];
 | 
			
		||||
  try {
 | 
			
		||||
    listeners = JSON.parse(listenerInput);
 | 
			
		||||
  } catch {
 | 
			
		||||
    logger.error("Malformed URL");
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  let newListeners = listeners.filter(
 | 
			
		||||
    (item) => !listenersDataBinding.has(item.address)
 | 
			
		||||
  );
 | 
			
		||||
  let removedUrls = Array.from(listenersDataBinding.keys()).filter(
 | 
			
		||||
    (url) => !listeners.some((listener) => listener.address === url)
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  for (const newItem of newListeners) {
 | 
			
		||||
    listenersDataBinding.set(newItem.address, newItem);
 | 
			
		||||
  }
 | 
			
		||||
  for (const removedUrl of removedUrls) {
 | 
			
		||||
    listenersDataBinding.delete(removedUrl);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  myManager.stopAll();
 | 
			
		||||
  await myManager.saveOverride(listeners);
 | 
			
		||||
 | 
			
		||||
  if (logger) logger.debug("Configuration changed: " + listenerInput);
 | 
			
		||||
 | 
			
		||||
  if (goodPeertubeCredential) myManager.startAll();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function unregister() {
 | 
			
		||||
  myManager.stopAll();
 | 
			
		||||
  myManager.save();
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  register,
 | 
			
		||||
  unregister
 | 
			
		||||
}
 | 
			
		||||
  unregister,
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -4,18 +4,18 @@
 | 
			
		||||
 | 
			
		||||
    /* Basic Options */
 | 
			
		||||
    // "incremental": true,                         /* Enable incremental compilation */
 | 
			
		||||
    "target": "es5",                                /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */
 | 
			
		||||
    "module": "commonjs",                           /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
 | 
			
		||||
    "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */,
 | 
			
		||||
    "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
 | 
			
		||||
    // "lib": [],                                   /* Specify library files to be included in the compilation. */
 | 
			
		||||
    // "allowJs": true,                             /* Allow javascript files to be compiled. */
 | 
			
		||||
    // "checkJs": true,                             /* Report errors in .js files. */
 | 
			
		||||
    // "jsx": "preserve",                           /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
 | 
			
		||||
    "declaration": true,                         /* Generates corresponding '.d.ts' file. */
 | 
			
		||||
    "declarationMap": true,                      /* Generates a sourcemap for each corresponding '.d.ts' file. */
 | 
			
		||||
    // "declaration": true,                         /* Generates corresponding '.d.ts' file. */
 | 
			
		||||
    // "declarationMap": true,                      /* Generates a sourcemap for each corresponding '.d.ts' file. */
 | 
			
		||||
    // "sourceMap": true,                           /* Generates corresponding '.map' file. */
 | 
			
		||||
    // "outFile": "./",                             /* Concatenate and emit output to single file. */
 | 
			
		||||
    "outDir": "./dist/",                              /* Redirect output structure to the directory. */
 | 
			
		||||
    "rootDir": "./src/",                             /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
 | 
			
		||||
    "outDir": "./dist/" /* Redirect output structure to the directory. */,
 | 
			
		||||
    // "rootDir": "./src/",                             /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
 | 
			
		||||
    // "composite": true,                           /* Enable project compilation */
 | 
			
		||||
    // "tsBuildInfoFile": "./",                     /* Specify file to store incremental compilation information */
 | 
			
		||||
    // "removeComments": true,                      /* Do not emit comments to output. */
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
    // "isolatedModules": true,                     /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
 | 
			
		||||
 | 
			
		||||
    /* Strict Type-Checking Options */
 | 
			
		||||
    "strict": true,                                 /* Enable all strict type-checking options. */
 | 
			
		||||
    "strict": true /* Enable all strict type-checking options. */,
 | 
			
		||||
    // "noImplicitAny": true,                       /* Raise error on expressions and declarations with an implied 'any' type. */
 | 
			
		||||
    // "strictNullChecks": true,                    /* Enable strict null checks. */
 | 
			
		||||
    // "strictFunctionTypes": true,                 /* Enable strict checking of function types. */
 | 
			
		||||
@@ -47,11 +47,14 @@
 | 
			
		||||
    // "moduleResolution": "node",                  /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
 | 
			
		||||
    // "baseUrl": "./",                             /* Base directory to resolve non-absolute module names. */
 | 
			
		||||
    // "paths": {},                                 /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
 | 
			
		||||
    // "rootDirs": [],                              /* List of root folders whose combined content represents the structure of the project at runtime. */
 | 
			
		||||
    "rootDirs": [
 | 
			
		||||
      "./src/",
 | 
			
		||||
      "./lib/"
 | 
			
		||||
    ] /* List of root folders whose combined content represents the structure of the project at runtime. */,
 | 
			
		||||
    // "typeRoots": [],                             /* List of folders to include type definitions from. */
 | 
			
		||||
    // "types": [],                                 /* Type declaration files to be included in compilation. */
 | 
			
		||||
    // "allowSyntheticDefaultImports": true,        /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
 | 
			
		||||
    "esModuleInterop": true,                        /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
 | 
			
		||||
    "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
 | 
			
		||||
    // "preserveSymlinks": true,                    /* Do not resolve the real path of symlinks. */
 | 
			
		||||
    // "allowUmdGlobalAccess": true,                /* Allow accessing UMD globals from modules. */
 | 
			
		||||
 | 
			
		||||
@@ -66,7 +69,7 @@
 | 
			
		||||
    // "emitDecoratorMetadata": true,               /* Enables experimental support for emitting type metadata for decorators. */
 | 
			
		||||
 | 
			
		||||
    /* Advanced Options */
 | 
			
		||||
    "skipLibCheck": true,                           /* Skip type checking of declaration files. */
 | 
			
		||||
    "forceConsistentCasingInFileNames": true        /* Disallow inconsistently-cased references to the same file. */
 | 
			
		||||
    "skipLibCheck": true /* Skip type checking of declaration files. */,
 | 
			
		||||
    "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user