Skip to content

Instantly share code, notes, and snippets.

@Dafrok
Created November 13, 2019 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Dafrok/1d7b065f83f847591d468c74131f9a97 to your computer and use it in GitHub Desktop.
Save Dafrok/1d7b065f83f847591d468c74131f9a97 to your computer and use it in GitHub Desktop.
const defaultManagerUrl = 'https://openapi.iqiyi.com';
const defaultUploadUrl = 'https://upload.iqiyi.com';
class QiyiSdk {
constructor(options = {}) {
const {
appKey,
appSecret,
managerUrl,
uploadUrl,
authType,
fragmentSize
} = options;
this.appKey = appKey || 'e64a09bece964bb484e5decc30c0b950';
this.appSecret = appSecret || 'f48d2b799f9661acdb6041e4ac7c142f';
this.managerUrl = managerUrl || defaultManagerUrl;
this.uploadUrl = uploadUrl || defaultUploadUrl;
this.authType = authType || 'enterprise';
this.fragmentSize = fragmentSize || 1024 * 2048;
this.request = this.request.bind(this);
this.getToken = this.getToken.bind(this);
this.refreshToken = this.refreshToken.bind(this);
}
// 基础请求方法
async request(url, reqData) {
// const {managerUrl, request} = this;
const res = await fetch(url, reqData);
const {code, data, msg} = await res.json();
if (code === 'A00000') {
return data;
}
// 令牌失效后重试
else if (code === 'A21332') {
// await this.refreshToken();
// return request(url, reqData);
}
throw {
code,
msg
};
}
// 获取 access token
async getToken() {
const {token, authType, appKey, appSecret, managerUrl, request} = this;
if (token) {
return token.accessToken;
}
const data = await request(`${managerUrl}/api/${authType}/authorize?client_id=${appKey}&client_secret=${appSecret}`);
this.token = {
accessToken: data.access_token,
refreshToken: data.refresh_token,
expiresIn: data.expires_in
};
return this.token.accessToken;
}
// 刷新 access token
async refreshToken() {
const {token, appKey, managerUrl, request} = this;
if (!token) {
return this.getToken();
}
const data = request(`${managerUrl}/api/oauth2/token?grant_type=refresh_token&refresh_token=${token.refreshToken}&client_id=${appKey}`);
this.token = {
accessToken: data.access_token,
refreshToken: data.refresh_token,
expiresIn: data.expires_in
};
return this.token.accessToken;
}
async upload(file) {
const data = await this.initFile(file);
const uploader = await this.initUpload(data);
const fragments = await this.sliceData(data);
await this.uploadFragments(fragments, uploader);
return this.finishUpload(uploader);
}
finishUpload({file_id}) {
const {uploadUrl, request} = this;
return request(`${uploadUrl}/uploadfinish?file_id=${file_id}`);
}
sliceData(data) {
const fragments = [];
const {fragmentSize} = this;
for (let i = 0; i < data.size; i += fragmentSize) {
fragments.push({
file_size: fragmentSize,
range: `${i}-${i + fragmentSize - 1}`,
file: data.data.slice(i, i + fragmentSize - 1)
});
}
return fragments;
}
// 初始化准备上传的文件
initFile(file) {
return new Promise((resolve, reject) => {
const {type, size} = file;
const reader = new FileReader();
reader.onload = e => resolve({
type,
size,
data: e.target.result
});
reader.onerror = reject;
reader.readAsBinaryString(file);
});
}
// 初始化上传参数
async initUpload(data) {
const {uploadUrl, request} = this;
const token = await this.getToken();
return request(`${uploadUrl}/openupload`, {
method: 'POST',
headers: {
filetype: data.type,
filesize: data.size,
access_token: token
}
});
}
// 上传所有片段
async uploadFragments(fragments, uploader) {
for (let i = 0; i < fragments.length; i++) {
try {
await this.uploadFragment(fragments[i], uploader);
}
catch (e) {
await this.uploadFragment(fragments[i], uploader);
}
}
}
// 上传片段
uploadFragment({file_size, range, file}, {upload_url, file_id}) {
return fetch(upload_url, {
method: 'POST',
headers: {
file_id,
file_size,
range
},
body: file
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment