aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRblSb <msrblsb@gmail.com>2025-09-03 10:30:19 +0300
committerRblSb <msrblsb@gmail.com>2025-09-03 10:30:19 +0300
commit9ec382facd8d7813716a10e5f7db3ca7f4ba0259 (patch)
tree323d4eb3b2b0d51c030daf63c1dac7db974f2b63
parent0a771c1ab48819561c766790092407cf602fd68c (diff)
/crash, update yt-dlp on start, newer node fix
-rw-r--r--README.md1
-rw-r--r--build/server.js55
-rw-r--r--res/client.js5
-rw-r--r--src/Types.hx1
-rw-r--r--src/client/Main.hx5
-rw-r--r--src/server/ConsoleInput.hx5
-rw-r--r--src/server/Main.hx5
-rw-r--r--src/server/cache/Cache.hx5
-rw-r--r--src/server/cache/YoutubeCache.hx10
9 files changed, 72 insertions, 20 deletions
diff --git a/README.md b/README.md
index 349d94b..6121853 100644
--- a/README.md
+++ b/README.md
@@ -83,6 +83,7 @@ It just works, but you can also check [user/ folder](/user/README.md) for server
- `/unban Foo` (`/removeBan`) - Unban user `Foo`
- `/kick Foo` - Force `Foo` disconnection until page reload
- `/dump` - Download state dump to report issues
+- `/crash` - Crash server if you need to test your auto-restart solution
## Plugins
- [octosubs](https://github.com/RblSb/SyncTube-octosubs) - More colorful `ASS`/`SSA` subtitles support
diff --git a/build/server.js b/build/server.js
index d0385b4..d4802a0 100644
--- a/build/server.js
+++ b/build/server.js
@@ -1846,7 +1846,7 @@ JsonParser_$d8e5213783812cec0906ca233f0379dc.prototype = $extend(json2object_rea
this.value = null;
}
,loadJsonString: function(s,pos,variable) {
- this.value = this.loadString(s,pos,variable,["Connected","Disconnected","Login","PasswordRequest","LoginError","Logout","Message","ServerMessage","Progress","UpdateClients","BanClient","KickClient","AddVideo","RemoveVideo","SkipVideo","VideoLoaded","Pause","Play","GetTime","SetTime","SetRate","Rewind","Flashback","SetLeader","PlayItem","SetNextItem","ToggleItemType","ClearChat","ClearPlaylist","ShufflePlaylist","UpdatePlaylist","TogglePlaylistLock","Dump"],"Connected");
+ this.value = this.loadString(s,pos,variable,["Connected","Disconnected","Login","PasswordRequest","LoginError","Logout","Message","ServerMessage","Progress","UpdateClients","BanClient","KickClient","AddVideo","RemoveVideo","SkipVideo","VideoLoaded","Pause","Play","GetTime","SetTime","SetRate","Rewind","Flashback","SetLeader","PlayItem","SetNextItem","ToggleItemType","ClearChat","ClearPlaylist","ShufflePlaylist","UpdatePlaylist","TogglePlaylistLock","Dump","CrashTest"],"Connected");
}
,__class__: JsonParser_$d8e5213783812cec0906ca233f0379dc
});
@@ -3747,6 +3747,7 @@ server_ConsoleInput.prototype = {
initConsoleInput: function() {
var _gthis = this;
var rl = js_node_Readline.createInterface({ input : process.stdin, output : process.stdout, completer : $bind(this,this.onCompletion)});
+ var originalTrace = haxe_Log.trace;
haxe_Log.trace = function(msg,infos) {
js_node_Readline.clearLine(process.stdout,0);
js_node_Readline.cursorTo(process.stdout,0,null);
@@ -3758,6 +3759,9 @@ server_ConsoleInput.prototype = {
_gthis.parseLine(line);
rl.prompt();
});
+ rl.on("close",function() {
+ return haxe_Log.trace = originalTrace;
+ });
}
,formatOutput: function(v,infos) {
var str = Std.string(v);
@@ -3810,7 +3814,7 @@ server_ConsoleInput.prototype = {
var name = args[0];
var password = args[1];
if(this.main.isBadClientName(name)) {
- haxe_Log.trace(StringTools.replace(Lang.get("usernameError"),"$MAX","" + this.main.config.maxLoginLength),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 113, className : "server.ConsoleInput", methodName : "parseLine"});
+ haxe_Log.trace(StringTools.replace(Lang.get("usernameError"),"$MAX","" + this.main.config.maxLoginLength),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 116, className : "server.ConsoleInput", methodName : "parseLine"});
return;
}
this.main.addAdmin(name,password);
@@ -3831,7 +3835,7 @@ server_ConsoleInput.prototype = {
}
}
var _g1 = 0;
- while(_g1 < _g.length) haxe_Log.trace(haxe_io_Path.withoutExtension(_g[_g1++]),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 140, className : "server.ConsoleInput", methodName : "parseLine"});
+ while(_g1 < _g.length) haxe_Log.trace(haxe_io_Path.withoutExtension(_g[_g1++]),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 143, className : "server.ConsoleInput", methodName : "parseLine"});
break;
case "removeAdmin":
this.main.removeAdmin(args[0]);
@@ -3840,7 +3844,7 @@ server_ConsoleInput.prototype = {
server_Utils.ensureDir(this.main.logsDir);
var path = haxe_io_Path.normalize("" + this.main.logsDir + "/" + args[0] + ".json");
if(!sys_FileSystem.exists(path)) {
- haxe_Log.trace("File \"" + path + "\" not found",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 127, className : "server.ConsoleInput", methodName : "parseLine"});
+ haxe_Log.trace("File \"" + path + "\" not found",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 130, className : "server.ConsoleInput", methodName : "parseLine"});
return;
}
var text = js_node_Fs.readFileSync(path,{ encoding : "utf8"});
@@ -3853,7 +3857,7 @@ server_ConsoleInput.prototype = {
var len = args.length;
var actual = this.commands.h[command].args.length;
if(len != actual) {
- haxe_Log.trace("Wrong count of arguments for command \"" + command + "\" (" + len + " instead of " + actual + ")",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 152, className : "server.ConsoleInput", methodName : "isValidArgs"});
+ haxe_Log.trace("Wrong count of arguments for command \"" + command + "\" (" + len + " instead of " + actual + ")",{ fileName : "src/server/ConsoleInput.hx", lineNumber : 155, className : "server.ConsoleInput", methodName : "isValidArgs"});
return false;
}
return true;
@@ -3883,7 +3887,7 @@ server_ConsoleInput.prototype = {
var data = _g.value;
list.push("" + StringTools.rpad("/" + _g.key + " " + data.args.join(" ")," ",maxLength) + " | " + data.desc);
}
- haxe_Log.trace("Unknown command \"" + line + "\". List:\n" + list.join("\n"),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 171, className : "server.ConsoleInput", methodName : "printHelp"});
+ haxe_Log.trace("Unknown command \"" + line + "\". List:\n" + list.join("\n"),{ fileName : "src/server/ConsoleInput.hx", lineNumber : 174, className : "server.ConsoleInput", methodName : "printHelp"});
}
,__class__: server_ConsoleInput
};
@@ -5100,6 +5104,13 @@ server_Main.prototype = {
this.send(client,{ type : "Connected", connected : { uuid : client.uuid, config : this.config, history : this.messages, isUnknownClient : true, clientName : client.name, clients : this.clientList(), videoList : this.videoList.items, isPlaylistOpen : this.videoList.isOpen, itemPos : this.videoList.pos, globalIp : this.globalIp, playersCacheSupport : this.playersCacheSupport}});
this.sendClientListExcept(client);
break;
+ case "CrashTest":
+ if((client.group & 8) == 0) {
+ return;
+ }
+ haxe_Log.trace("Crashing...",{ fileName : "src/server/Main.hx", lineNumber : 1037, className : "server.Main", methodName : "onMessage"});
+ null[1]++;
+ break;
case "Disconnected":
if(!internal) {
return;
@@ -5595,7 +5606,7 @@ server_Main.prototype = {
client.setGroupFlag(ClientGroup.Banned,!isOutdated);
if(isOutdated) {
HxOverrides.remove(this.userList.bans,ban);
- haxe_Log.trace("" + client.name + " ban removed",{ fileName : "src/server/Main.hx", lineNumber : 1141, className : "server.Main", methodName : "checkBan"});
+ haxe_Log.trace("" + client.name + " ban removed",{ fileName : "src/server/Main.hx", lineNumber : 1146, className : "server.Main", methodName : "checkBan"});
this.sendClientList();
}
break;
@@ -5923,6 +5934,7 @@ var server_cache_Cache = function(main,cacheDir) {
this.isYtReady = this.youtubeCache.checkYtDeps();
if(this.isYtReady) {
this.youtubeCache.cleanYtInputFiles();
+ this.youtubeCache.checkUpdate();
}
};
server_cache_Cache.__name__ = true;
@@ -5951,16 +5963,16 @@ server_cache_Cache.prototype = {
if(this.cachedFiles.indexOf(name) != -1) {
continue;
}
- haxe_Log.trace("Remove untracked cache " + name,{ fileName : "src/server/cache/Cache.hx", lineNumber : 51, className : "server.cache.Cache", methodName : "removeUntrackedFiles"});
+ haxe_Log.trace("Remove untracked cache " + name,{ fileName : "src/server/cache/Cache.hx", lineNumber : 54, className : "server.cache.Cache", methodName : "removeUntrackedFiles"});
this.remove(name);
}
}
,log: function(client,msg) {
- haxe_Log.trace(msg,{ fileName : "src/server/cache/Cache.hx", lineNumber : 57, className : "server.cache.Cache", methodName : "log"});
+ haxe_Log.trace(msg,{ fileName : "src/server/cache/Cache.hx", lineNumber : 60, className : "server.cache.Cache", methodName : "log"});
this.main.serverMessage(client,msg);
}
,logByName: function(clientName,msg) {
- haxe_Log.trace(msg,{ fileName : "src/server/cache/Cache.hx", lineNumber : 62, className : "server.cache.Cache", methodName : "logByName"});
+ haxe_Log.trace(msg,{ fileName : "src/server/cache/Cache.hx", lineNumber : 65, className : "server.cache.Cache", methodName : "logByName"});
var tmp = ClientTools.getByName(this.main.clients,clientName);
if(tmp == null) {
return;
@@ -6015,13 +6027,13 @@ server_cache_Cache.prototype = {
var _gthis = this;
var tmp = js_node_Fs.statfs;
if(tmp == null) {
- haxe_Log.trace("Warning: no fs.statfs support in current nodejs version (needs v18+)",{ fileName : "src/server/cache/Cache.hx", lineNumber : 101, className : "server.cache.Cache", methodName : "getFreeDiskSpace"});
+ haxe_Log.trace("Warning: no fs.statfs support in current nodejs version (needs v18+)",{ fileName : "src/server/cache/Cache.hx", lineNumber : 104, className : "server.cache.Cache", methodName : "getFreeDiskSpace"});
callback(this.storageLimit);
return;
}
tmp("/",function(err,stats) {
if(err != null) {
- haxe_Log.trace(err,{ fileName : "src/server/cache/Cache.hx", lineNumber : 107, className : "server.cache.Cache", methodName : "getFreeDiskSpace"});
+ haxe_Log.trace(err,{ fileName : "src/server/cache/Cache.hx", lineNumber : 110, className : "server.cache.Cache", methodName : "getFreeDiskSpace"});
callback(_gthis.storageLimit);
return;
}
@@ -6402,6 +6414,13 @@ server_cache_YoutubeCache.prototype = {
return false;
}
}
+ ,checkUpdate: function() {
+ this.ytDlp.execAsync("-U",{ onData : function(d) {
+ haxe_Log.trace(d,{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 35, className : "server.cache.YoutubeCache", methodName : "checkUpdate"});
+ }}).catch(function(e) {
+ haxe_Log.trace(e,{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 38, className : "server.cache.YoutubeCache", methodName : "checkUpdate"});
+ });
+ }
,cleanYtInputFiles: function(prefix) {
if(prefix == null) {
prefix = "__tmp";
@@ -6420,7 +6439,7 @@ server_cache_YoutubeCache.prototype = {
,cacheYoutubeVideo: function(client,url,callback) {
var _gthis = this;
if(!this.cache.isYtReady) {
- haxe_Log.trace("Do `npm i https://github.com/RblSb/ytdlp-nodejs` to use cache feature (you also need to install `ffmpeg` to build mp4 from downloaded audio/video tracks).",{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 42, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
+ haxe_Log.trace("Do `npm i https://github.com/RblSb/ytdlp-nodejs` to use cache feature (you also need to install `ffmpeg` to build mp4 from downloaded audio/video tracks).",{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 52, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
return;
}
var clientName = client.name;
@@ -6439,11 +6458,11 @@ server_cache_YoutubeCache.prototype = {
this.log(clientName,"Caching " + outName + " already in progress");
return;
}
- haxe_Log.trace("Caching " + url + " to " + outName + "...",{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 74, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
+ haxe_Log.trace("Caching " + url + " to " + outName + "...",{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 84, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
this.main.sendByName(clientName,{ type : "Progress", progress : { type : "Caching", ratio : 0, data : outName}});
var useCookies = false;
var onGetInfo = function(info) {
- haxe_Log.trace("Get info with " + info.formats.length + " formats",{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 87, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
+ haxe_Log.trace("Get info with " + info.formats.length + " formats",{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 97, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
var _this = info.formats;
var _g = [];
var _g1 = 0;
@@ -6501,7 +6520,7 @@ server_cache_YoutubeCache.prototype = {
if(tmp == null) {
_gthis.log(clientName,"Error: format with audio not found");
var _g = 0;
- while(_g < aformats.length) haxe_Log.trace(aformats[_g++],{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 99, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
+ while(_g < aformats.length) haxe_Log.trace(aformats[_g++],{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 109, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
return;
}
var _this = info.formats;
@@ -6530,7 +6549,7 @@ server_cache_YoutubeCache.prototype = {
} else {
_gthis.log(clientName,"Error: video format not found");
var _g1 = 0;
- while(_g1 < _g.length) haxe_Log.trace(_g[_g1++],{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 109, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
+ while(_g1 < _g.length) haxe_Log.trace(_g[_g1++],{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 119, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
return;
}
var ignoreQualities = [];
@@ -6614,7 +6633,7 @@ server_cache_YoutubeCache.prototype = {
});
};
this.getInfoAsync(url,useCookies).then(onGetInfo).catch(function(err) {
- haxe_Log.trace(err,{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 188, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
+ haxe_Log.trace(err,{ fileName : "src/server/cache/YoutubeCache.hx", lineNumber : 198, className : "server.cache.YoutubeCache", methodName : "cacheYoutubeVideo"});
useCookies = true;
return _gthis.getInfoAsync(url,useCookies).then(onGetInfo).catch(function(err) {
_gthis.cleanYtInputFiles(inVideoName);
diff --git a/res/client.js b/res/client.js
index 2780e56..a97f1df 100644
--- a/res/client.js
+++ b/res/client.js
@@ -1773,6 +1773,8 @@ client_Main.prototype = {
this.onConnected(data);
this.onTimeGet.run();
break;
+ case "CrashTest":
+ break;
case "Disconnected":
break;
case "Dump":
@@ -2595,6 +2597,9 @@ client_Main.prototype = {
case "clear":
this.send({ type : "ClearChat"});
return true;
+ case "crash":
+ this.send({ type : "CrashTest"});
+ return true;
case "dump":
this.send({ type : "Dump"});
return true;
diff --git a/src/Types.hx b/src/Types.hx
index 9263c57..60ce612 100644
--- a/src/Types.hx
+++ b/src/Types.hx
@@ -296,4 +296,5 @@ enum abstract WsEventType(String) {
var UpdatePlaylist;
var TogglePlaylistLock;
var Dump;
+ var CrashTest;
}
diff --git a/src/client/Main.hx b/src/client/Main.hx
index d3d1ce2..5e05690 100644
--- a/src/client/Main.hx
+++ b/src/client/Main.hx
@@ -697,6 +697,8 @@ class Main {
case Dump:
Utils.saveFile("dump.json", ApplicationJson, data.dump.data);
+
+ case CrashTest:
}
}
@@ -1344,6 +1346,9 @@ class Main {
case "dump":
send({type: Dump});
return true;
+ case "crash":
+ send({type: CrashTest});
+ return true;
}
if (matchSimpleDate.match(command)) {
send({
diff --git a/src/server/ConsoleInput.hx b/src/server/ConsoleInput.hx
index e0712f5..f729e0d 100644
--- a/src/server/ConsoleInput.hx
+++ b/src/server/ConsoleInput.hx
@@ -57,6 +57,7 @@ class ConsoleInput {
output: process.stdout,
completer: onCompletion
});
+ final originalTrace = haxe.Log.trace;
haxe.Log.trace = (msg:Dynamic, ?infos:haxe.PosInfos) -> {
Readline.clearLine(process.stdout, 0);
Readline.cursorTo(process.stdout, 0, null);
@@ -68,7 +69,9 @@ class ConsoleInput {
parseLine(line);
rl.prompt();
});
- // rl.on("close", exit);
+ rl.on("close", () -> {
+ haxe.Log.trace = originalTrace;
+ });
}
function formatOutput(v:Dynamic, infos:haxe.PosInfos):String {
diff --git a/src/server/Main.hx b/src/server/Main.hx
index 66fbb27..e926492 100644
--- a/src/server/Main.hx
+++ b/src/server/Main.hx
@@ -1032,6 +1032,11 @@ class Main {
data: json
}
});
+ case CrashTest:
+ if (!client.isAdmin) return;
+ trace("Crashing...");
+ final arr:Array<Int> = cast null;
+ arr[1]++;
}
}
diff --git a/src/server/cache/Cache.hx b/src/server/cache/Cache.hx
index 56749d8..cfe2f66 100644
--- a/src/server/cache/Cache.hx
+++ b/src/server/cache/Cache.hx
@@ -28,7 +28,10 @@ class Cache {
youtubeCache = new YoutubeCache(main, this);
rawCache = new RawCache(main, this);
isYtReady = youtubeCache.checkYtDeps();
- if (isYtReady) youtubeCache.cleanYtInputFiles();
+ if (isYtReady) {
+ youtubeCache.cleanYtInputFiles();
+ youtubeCache.checkUpdate();
+ }
}
public function getCachedFiles():Array<String> {
diff --git a/src/server/cache/YoutubeCache.hx b/src/server/cache/YoutubeCache.hx
index 4f74080..c7053f9 100644
--- a/src/server/cache/YoutubeCache.hx
+++ b/src/server/cache/YoutubeCache.hx
@@ -29,6 +29,16 @@ class YoutubeCache {
}
}
+ public function checkUpdate():Void {
+ ytDlp.execAsync("-U", {
+ onData: d -> {
+ trace(d);
+ }
+ }).catchError(e -> {
+ trace(e);
+ });
+ }
+
public function cleanYtInputFiles(prefix = "__tmp"):Void {
final names = FileSystem.readDirectory(cache.cacheDir);
for (name in names) {
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage