Compare commits
	
		
			1 Commits
		
	
	
		
			florent-pa
			...
			feature/us
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4f18003fb4 | 
@@ -1,110 +1,122 @@
 | 
			
		||||
// 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 };
 | 
			
		||||
// 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;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
   async getChannelId(channelName: string): Promise<number> {
 | 
			
		||||
      const response = await fetch(
 | 
			
		||||
        new URL(`/api/v1/videos-channels/${channelName}`, this.domainName),
 | 
			
		||||
        {
 | 
			
		||||
          method: "gett"
 | 
			
		||||
        }
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      const { id } = await response.json();
 | 
			
		||||
      return id;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { PeerTubeRequester };
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user