import React from "react"; import ReactDOM from "react-dom"; import YouTube from 'react-youtube'; import { post } from "axios"; import Dropzone from "react-dropzone"; import { BarLoader } from "react-spinners"; import { css } from "react-emotion"; import debounce from "lodash/debounce" import { COMIXIFY_API, MAX_FILE_SIZE, PERMITTED_VIDEO_EXTENSIONS, FROM_YOUTUBE_API, MIN_RESPONSE_DELAY } from "./constants"; class App extends React.Component { static appStates = { INITIAL: 0, PROCESSING: 1, FINISHED: 2, UPLOAD_ERROR: 3, DROP_ERROR: 4, SAMPLE_PROCESSING: 5 }; ytInput = React.createRef(); constructor(props) { super(props); this.state = { state: App.appStates.INITIAL, videoId: null, drop_errors: [], result_comics: null, framesMode: "0", rlMode: "0", imageAssessment: "0", styleTransferMode: "0", }; this.onVideoDrop = this.onVideoDrop.bind(this); this.onModelChange = this.onModelChange.bind(this); this.handleResponse = debounce(this.handleResponse.bind(this), MIN_RESPONSE_DELAY); this.onYouTubeSubmit = this.onYouTubeSubmit.bind(this); this.onSamplingChange = this.onSamplingChange.bind(this); this.onImageAssessmentChange = this.onImageAssessmentChange.bind(this); this.styleTransferChange = this.styleTransferChange.bind(this); } static onVideoUploadProgress(progressEvent) { let percentCompleted = Math.round( progressEvent.loaded * 100 / progressEvent.total ); console.log(percentCompleted); } onModelChange(e) { let value = e.currentTarget.value; this.setState({ rlMode: value }) } styleTransferChange(e) { let value = e.currentTarget.value; this.setState({ styleTransferMode: value }) } onSamplingChange(e) { let value = e.currentTarget.value; this.setState({ framesMode: value }) } onImageAssessmentChange(e) { let value = e.currentTarget.value; this.setState({ imageAssessment: value }) } handleResponse(res) { if(res === "debounce") { return } if (res.data["status_message"] === "ok") { this.setState({ state: App.appStates.FINISHED, result_comics: res.data["comic"] }); } else { this.setState({ state: App.appStates.UPLOAD_ERROR }); } } processVideo(video) { let { framesMode, rlMode, imageAssessment, styleTransferMode } = this.state; let data = new FormData(); data.append("file", video); data.set('frames_mode', parseInt(framesMode)); data.set('rl_mode', parseInt(rlMode)); data.set("image_assessment_mode", parseInt(imageAssessment)); data.set('style_transfer_mode', parseInt(styleTransferMode)); this.handleResponse("debounce"); post(COMIXIFY_API, data, { headers: { "content-type": "multipart/form-data" }, onUploadProgress: App.onVideoUploadProgress }) .then(this.handleResponse) .catch(err => { console.error(err); this.setState({ state: App.appStates.UPLOAD_ERROR }); }); this.setState({ state: App.appStates.PROCESSING }); } onVideoDrop(files, rejected) { if (rejected.length !== 0) { console.error(rejected); this.setState({ drop_errors: ["Maximum size for single video is 50MB"], state: App.appStates.DROP_ERROR }); return; } this.processVideo(files[0]); } submitYouTube(link) { let { framesMode, rlMode, imageAssessment, styleTransferMode } = this.state; this.handleResponse("debounce"); post(FROM_YOUTUBE_API, { url: link, frames_mode: parseInt(framesMode), rl_mode: parseInt(rlMode), image_assessment_mode: parseInt(imageAssessment), style_transfer_mode: parseInt(styleTransferMode) }) .then(this.handleResponse) .catch(err => { console.error(err); this.setState({ state: App.appStates.UPLOAD_ERROR }); }); } onYouTubeSubmit() { let ytLink = this.ytInput.current.value; this.submitYouTube(ytLink); this.setState({ state: App.appStates.PROCESSING }); } onSamplePlay(videoId) { let link = "https://www.youtube.com/watch?v=" + videoId; this.submitYouTube(link); this.setState({ videoId: videoId, state: App.appStates.SAMPLE_PROCESSING }); } render() { let { state, drop_errors, result_comics, framesMode, rlMode, videoId, imageAssessment, styleTransferMode } = this.state; let showUsage = [ App.appStates.INITIAL, App.appStates.UPLOAD_ERROR, App.appStates.DROP_ERROR, App.appStates.FINISHED ].includes(state); let isProcessing = [ App.appStates.SAMPLE_PROCESSING, App.appStates.PROCESSING ].includes(state); return (
{state === App.appStates.FINISHED && [ ,

Go again:

]} {state === App.appStates.DROP_ERROR && drop_errors.map((o, i) =>

{o}

)} {state === App.appStates.UPLOAD_ERROR && (

Server Error: Please try again later.

)} {showUsage && (
Pipeline settings:
Frame sampling:
Extraction model:
Image assessment:
Style Transfer model:
)} {showUsage && (

Drop video here, or click to select manually

)} {showUsage && (
Or select one of sample videos:
Movie scene
Movie scene
Music
Superhero
)} {state === App.appStates.SAMPLE_PROCESSING && ( )} {isProcessing && ( )}
); } } ReactDOM.render(, document.getElementById("demo"));