aboutsummaryrefslogtreecommitdiff
path: root/src/server/ApiManagers
diff options
context:
space:
mode:
authoranika-ahluwalia <anika.ahluwalia@gmail.com>2020-05-18 21:19:06 -0500
committeranika-ahluwalia <anika.ahluwalia@gmail.com>2020-05-18 21:19:06 -0500
commit18f166edfe42a4856a6fea659cb65fd79f00599f (patch)
treeb58f7b3bff1f7efd2284f59084701f68eb5460bc /src/server/ApiManagers
parentbcb3106513b5a7ddc1aac8b7e6a448de4c4ded21 (diff)
parent3f97c632bc13075a4c13a6485d2e53e6694b36fa (diff)
Merge branch 'master' of https://github.com/browngraphicslab/Dash-Web into script_documents
Diffstat (limited to 'src/server/ApiManagers')
-rw-r--r--src/server/ApiManagers/UploadManager.ts56
1 files changed, 29 insertions, 27 deletions
diff --git a/src/server/ApiManagers/UploadManager.ts b/src/server/ApiManagers/UploadManager.ts
index 06c2e516d..60c52bcfc 100644
--- a/src/server/ApiManagers/UploadManager.ts
+++ b/src/server/ApiManagers/UploadManager.ts
@@ -68,34 +68,34 @@ export default class UploadManager extends ApiManager {
method: Method.POST,
subscription: new RouteSubscriber("youtubeScreenshot"),
secureHandler: async ({ req, res }) => {
- const { url, t } = req.query;
- const parseUrl = (url: string) => {
- url = decodeURIComponent(url)
- if (!/^(?:f|ht)tps?\:\/\//.test(url)) {
- url = 'http://' + url
- }
- return url;
- }
- let targetUrl: string;
- if (!url || !t || !isWebUri(targetUrl = parseUrl(url as string))) {
- return res.send();
- }
- const buffer = await captureYoutubeScreenshot(targetUrl, t as string);
+ const { id, timecode } = req.body;
+ const convert = (raw: string) => {
+ const number = Math.floor(Number(raw));
+ const seconds = number % 60;
+ const minutes = (number - seconds) / 60;
+ return `${minutes}m${seconds}s`;
+ };
+ const suffix = timecode ? `&t=${convert(timecode)}` : ``;
+ const targetUrl = `https://www.youtube.com/watch?v=${id}${suffix}`;
+ const buffer = await captureYoutubeScreenshot(targetUrl);
if (!buffer) {
return res.send();
}
- const resolvedName = `${targetUrl}@${t}.png`;
+ const resolvedName = `youtube_capture_${id}_${suffix}.png`;
const resolvedPath = serverPathToFile(Directory.images, resolvedName);
- writeFile(resolvedPath, buffer, async error => {
- if (error) {
- return res.send();
- }
- await DashUploadUtils.outputResizedImages(() => createReadStream(resolvedPath), resolvedName, pathToDirectory(Directory.images));
- res.send({
- accessPaths: {
- agnostic: DashUploadUtils.getAccessPaths(Directory.images, resolvedName)
+ return new Promise<void>(resolve => {
+ writeFile(resolvedPath, buffer, async error => {
+ if (error) {
+ return res.send();
}
- } as Upload.FileInformation);
+ await DashUploadUtils.outputResizedImages(() => createReadStream(resolvedPath), resolvedName, pathToDirectory(Directory.images));
+ res.send({
+ accessPaths: {
+ agnostic: DashUploadUtils.getAccessPaths(Directory.images, resolvedName)
+ }
+ } as Upload.FileInformation);
+ resolve();
+ });
});
}
});
@@ -284,17 +284,19 @@ export default class UploadManager extends ApiManager {
*
* On failure, returns undefined.
*/
-async function captureYoutubeScreenshot(targetUrl: string, t: string): Promise<Opt<Buffer>> {
+async function captureYoutubeScreenshot(targetUrl: string): Promise<Opt<Buffer>> {
const browser = await launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] });
const page = await browser.newPage();
await page.setViewport({ width: 1920, height: 1080 });
- await page.goto(targetUrl + '&t=' + t, { waitUntil: 'networkidle0' });
+ await page.goto(targetUrl, { waitUntil: 'networkidle2' as any });
+ const videoPlayer = await page.$('.html5-video-player');
// hide youtube player controls.
- await page.evaluate(() => (document.querySelector('.ytp-chrome-bottom') as any).style.display = 'none');
+ await page.evaluate(() =>
+ (document.querySelector('.ytp-chrome-bottom') as any).style.display = 'none');
- const buffer = await (await page.$('.html5-video-player'))?.screenshot({ encoding: "binary" });
+ const buffer = await videoPlayer?.screenshot({ encoding: "binary" });
await browser.close();
return buffer;