|
|
|
|
|
function github() { |
|
const OAUTH_URL = 'https://github.com/login/oauth'; |
|
const API_URL = 'https://api.github.com'; |
|
|
|
const client_id = 'e099a4803bb1e2e773a3'; |
|
const client_secret = '81fbfc45c65af8c0fbf2b4dae6f23f22e656cfb8'; |
|
|
|
const GithubAPI = axios.create({ |
|
baseURL: API_URL, |
|
headers: { accept: 'application/json' }, |
|
}); |
|
GithubAPI.interceptors.request.use((config) => { |
|
const accessToken = localStorage.getObject('githubOauthAccessKey'); |
|
|
|
config.headers.Authorization = `token ${accessToken}`; |
|
return config; |
|
}); |
|
|
|
const Github = { |
|
status: 0, |
|
username: '', |
|
}; |
|
|
|
window.GithubClient = { |
|
github: { |
|
handleCallback: (code, cb) => { |
|
const url = `${OAUTH_URL}/access_token`; |
|
const params = { |
|
client_id, |
|
client_secret, |
|
code, |
|
}; |
|
axios |
|
.post(url, '', { |
|
params, |
|
headers: { accept: 'application/json' }, |
|
}) |
|
.then((res) => { |
|
const ak = res.data.access_token; |
|
if (ak) |
|
localStorage.setItem('githubOauthAccessKey', JSON.stringify(ak)); |
|
if (cb !== undefined) { |
|
cb(ak); |
|
} |
|
}); |
|
}, |
|
openAuthUrl: () => { |
|
Github.status = 1; |
|
const url = `${OAUTH_URL}/authorize?client_id=${client_id}&scope=gist`; |
|
if (isElectron()) { |
|
|
|
const { BrowserWindow } = require('electron').remote; |
|
let win = new BrowserWindow({ |
|
width: 1000, |
|
height: 670, |
|
}); |
|
win.on('closed', () => { |
|
win = null; |
|
}); |
|
win.loadURL(url); |
|
return; |
|
} |
|
window.open(url, '_blank'); |
|
}, |
|
getStatus: () => Github.status, |
|
getStatusText: () => { |
|
switch (Github.status) { |
|
case 0: |
|
return '未连接'; |
|
case 1: |
|
return '连接中'; |
|
case 2: |
|
return `${Github.username}已登录`; |
|
default: |
|
return '???'; |
|
} |
|
}, |
|
updateStatus: async (callback) => { |
|
const access_token = localStorage.getObject('githubOauthAccessKey'); |
|
if (access_token == null) { |
|
Github.status = 0; |
|
} else { |
|
const { data } = await GithubAPI.get('/user'); |
|
if (data.login === undefined) { |
|
Github.status = 1; |
|
} else { |
|
Github.status = 2; |
|
Github.username = data.login; |
|
} |
|
} |
|
if (callback != null) { |
|
callback(Github.status); |
|
} |
|
}, |
|
logout: () => { |
|
localStorage.removeItem('githubOauthAccessKey'); |
|
Github.status = 0; |
|
}, |
|
}, |
|
|
|
gist: { |
|
json2gist(jsonObject) { |
|
const result = {}; |
|
|
|
result['listen1_backup.json'] = { |
|
content: JSON.stringify(jsonObject), |
|
}; |
|
|
|
const playlistIds = jsonObject.playerlists; |
|
const songsCount = playlistIds.reduce((count, playlistId) => { |
|
const playlist = jsonObject[playlistId]; |
|
const cover = `<img src="${playlist.info.cover_img_url}" width="140" height="140"><br/>`; |
|
const { title } = playlist.info; |
|
let tableHeader = '\n| 音乐标题 | 歌手 | 专辑 |\n'; |
|
tableHeader += '| --- | --- | --- |\n'; |
|
const tableBody = playlist.tracks.reduce( |
|
(r, track) => |
|
`${r} | ${track.title} | ${track.artist} | ${track.album} | \n`, |
|
'' |
|
); |
|
const content = `<details>\n <summary>${cover} ${title}</summary><p>\n${tableHeader}${tableBody}</p></details>`; |
|
const filename = `listen1_${playlistId}.md`; |
|
result[filename] = { |
|
content, |
|
}; |
|
return count + playlist.tracks.length; |
|
}, 0); |
|
const summary = `本歌单由[Listen1](https://listen1.github.io/listen1/)创建, 歌曲数:${songsCount},歌单数:${playlistIds.length},点击查看更多`; |
|
result['listen1_aha_playlist.md'] = { |
|
content: summary, |
|
}; |
|
|
|
return result; |
|
}, |
|
|
|
gist2json(gistFiles, callback) { |
|
if (!gistFiles['listen1_backup.json'].truncated) { |
|
const jsonString = gistFiles['listen1_backup.json'].content; |
|
return callback(JSON.parse(jsonString)); |
|
} |
|
|
|
const url = gistFiles['listen1_backup.json'].raw_url; |
|
|
|
GithubAPI.get(url).then((res) => callback(res.data)); |
|
return null; |
|
}, |
|
|
|
listExistBackup() { |
|
return GithubAPI.get('/gists').then((res) => { |
|
const result = res.data; |
|
return result.filter((backupObject) => |
|
backupObject.description.startsWith('updated by Listen1') |
|
); |
|
}); |
|
}, |
|
|
|
backupMySettings2Gist(files, gistId, isPublic) { |
|
let method = ''; |
|
let url = ''; |
|
if (gistId != null) { |
|
method = 'patch'; |
|
url = `/gists/${gistId}`; |
|
} else { |
|
method = 'post'; |
|
url = '/gists'; |
|
} |
|
return GithubAPI.request({ |
|
method, |
|
url, |
|
data: { |
|
description: `updated by Listen1(https://listen1.github.io/listen1/) at ${new Date().toLocaleString()}`, |
|
public: isPublic, |
|
files, |
|
}, |
|
}); |
|
}, |
|
|
|
importMySettingsFromGist(gistId) { |
|
return GithubAPI.get(`/gists/${gistId}`).then((res) => res.data.files); |
|
}, |
|
}, |
|
}; |
|
} |
|
|
|
github(); |
|
|