Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 100 additions & 10 deletions commands/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,67 @@ const { execFileSync } = require('child_process');
const URL = require('url');
const path = require('path');
const os = require('os');
const { fork } = require('child_process');
const process = require('process');

const osu = require('../osu.js');
const helper = require('../helper.js');
const frame = require('../renderer/render_frame.js')
const config = require('../config.json');

function abort_handler(msg, render_args, reject){
if (render_args.length !== 2) {
reject(`Expected exactly 2 arguments for a render abort, got ${render_args.length} arguments.`);
return;
}
let render_id = render_args.indexOf('abort') ? render_args[0] : render_args[1];
try{
render_id = parseInt(render_id);
render_id = render_id.toString(); // this is dumb, fix please
console.log(`Aborting render ${render_id}`);
console.log(helper.getItem("render_queue"));
if (JSON.parse(helper.getItem("render_queue")).hasOwnProperty(render_id)){
console.log(`${render_id} exists`);
let render = JSON.parse(helper.getItem("render_queue"))[render_id];
render.abort = true;
update_render(render);
return;
}
reject(`Render '${render_id}' not found.`);
} catch (e) {
reject(`Could not abort render '${render_id}': ${e}`);
}

}

function queue_render(){
let renders = JSON.parse(helper.getItem("render_queue"));
if (renders === null) {
renders = {};
}
let render_id;
while (true){
render_id = process.pid * 1000 + Math.floor(Math.random() * 1000);
render_id = render_id.toString();
if (!renders.hasOwnProperty(render_id)){
break;
}
}
renders[render_id] = {
"id": render_id,
"status": "queued",
"start_time": Date.now(),
"abort": false
};
helper.setItem("render_queue", JSON.stringify(renders));
return renders[render_id];
}

function update_render(render){
let renders = JSON.parse(helper.getItem("render_queue"));
renders[render.id] = render;
helper.setItem("render_queue", JSON.stringify(renders));
}

module.exports = {
command: ['render', 'frame', 'fail'],
description: "Render picture or gif of a beatmap at a specific time. Videos 10 seconds or longer are automatically rendered as mp4 video with audio and beatmap background.",
Expand Down Expand Up @@ -41,9 +95,9 @@ module.exports = {
let { argv, msg, last_beatmap } = obj;

let beatmap_id, beatmap_url, beatmap_promise, mods = [], time = 0,
ar, cs, od, length = 0, percent = 0, custom_url = false,
ar, cs, od, length = 0, percent = 0, custom_url = false, nobg = false, bg_opacity = 20,
size = [400, 300], type, objects,
video_type = 'gif', audio = true, download_promise, osr;
video_type = 'gif', audio = true, download_promise, osr, offset;

let score_id;

Expand All @@ -68,6 +122,13 @@ module.exports = {

argv.map(arg => arg.toLowerCase());

console.log(argv);
if (argv.includes('abort')){
abort_handler(msg, argv.slice(1), reject);
console.log('aborting');
return;
}

argv.slice(1).forEach(arg => {
if(arg.startsWith('+'))
mods = arg.substr(1).toUpperCase().match(/.{1,2}/g);
Expand Down Expand Up @@ -107,7 +168,6 @@ module.exports = {
audio = false;
}else if(arg.endsWith('%')){
speed = parseInt(arg) / 100;
speed = Math.max(0.01, speed);
}else if(arg.endsWith('fps')){
let _fps = parseInt(arg);
if(!isNaN(_fps)){
Expand All @@ -126,9 +186,11 @@ module.exports = {
ar = parseFloat(arg.substr(2));
}else if(arg.toLowerCase().startsWith('cs')){
cs = parseFloat(arg.substr(2));
}else if(arg.toLowerCase().startsWith('od')){
od = parseFloat(arg.substr(2));
}else if(arg.startsWith('(') && arg.endsWith(')')){
}else if(arg.toLowerCase().startsWith('od')) {
od = parseFloat(arg.substr(2));
}else if(arg.toLowerCase().endsWith('offset')){
offset = parseInt(arg) * 1000;
}else if(arg.startsWith('(') && arg.endsWith(')')){
objects = arg.substr(1, arg.length - 1).split(',').length;
}else if(arg == 'fail'){
if(msg.channel.id in last_beatmap){
Expand All @@ -140,7 +202,11 @@ module.exports = {
percent = last_beatmap[msg.channel.id].fail_percent;
length = 4;
}
}else{
} else if(arg == 'nobg') {
nobg = true;
} else if(arg.toLowerCase().endsWith('bgo')){
bg_opacity = parseInt(arg);
}else{
if(arg.startsWith('http://') || arg.startsWith('https://')){
beatmap_url = arg;
beatmap_promise = osu.parse_beatmap_url(beatmap_url);
Expand Down Expand Up @@ -202,16 +268,40 @@ module.exports = {
}

Promise.resolve(preview_promise).then(previewTime => {
let current_render = queue_render();
if(previewTime)
time = previewTime;

if(length > 0 || objects){
current_render.status = "rendering";
update_render(current_render);
resolve(null);

frame.get_frames(download_path, time, length * 1000, mods, size, {
combo,
type: video_type, cs, ar, od, analyze, hidden, flashlight, black: false, osr, score_id, audio, fps, speed,
fill: video_type == 'mp4', noshadow: true, percent, border: false, objects, msg
type: video_type,
cs,
ar,
od,
analyze,
hidden,
flashlight,
black: false,
osr,
score_id,
audio,
fps,
speed,
fill: video_type === 'mp4',
noshadow: true,
percent,
offset,
nobg,
bg_opacity,
border: false,
objects,
msg,
render: current_render,
});
}else{
frame.get_frame(download_path, time, mods, [800, 600], {
Expand Down
Loading