116 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html><html><head>
 | 
						|
	<title>ytdl server</title>
 | 
						|
	<style>
 | 
						|
		
 | 
						|
		#url_input {
 | 
						|
			width: 320px;
 | 
						|
		}
 | 
						|
		#alias_input {
 | 
						|
			width: 64px;
 | 
						|
		}
 | 
						|
 | 
						|
		#server_output {
 | 
						|
			max-height: 160px;
 | 
						|
			white-space: pre;
 | 
						|
			overflow-y: scroll;
 | 
						|
			font-family: monospace;
 | 
						|
			border: 1px gray solid;
 | 
						|
			padding: 3px;
 | 
						|
		}
 | 
						|
 | 
						|
		table, th, td {
 | 
						|
			border: 1px black solid;
 | 
						|
			border-collapse: collapse;
 | 
						|
			padding: 3px;
 | 
						|
		}
 | 
						|
 | 
						|
	</style>
 | 
						|
</head><body>
 | 
						|
	<h1>ytdl server</h1>
 | 
						|
	<div>paste url from one of <a href="https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md" target="_blank">supported sites</a> to import and serve best quality media file for things like vrchat where a streamable url is required.</div>
 | 
						|
	<p>
 | 
						|
		<div>url: <input id="url_input" type="text" placeholder="https://www.youtube.com/watch?v=dQw4w9WgXcQ" /></label><input id="submit_button" type="submit" /></div>
 | 
						|
	</p>
 | 
						|
	<p id="server_output"></p>
 | 
						|
 | 
						|
	<script>
 | 
						|
		var url_input = document.getElementById("url_input");
 | 
						|
		var submit_button = document.getElementById("submit_button");
 | 
						|
		var server_output = document.getElementById("server_output");
 | 
						|
		submit_button.onclick = function() {
 | 
						|
			url_input.disabled = true;
 | 
						|
			submit_button.disabled = true;
 | 
						|
			server_output.innerText = '';
 | 
						|
			var ws = new WebSocket(`${location.protocol.replace('http','ws')}//${location.host}/w?url=${encodeURIComponent(url_input.value)}`);
 | 
						|
			function print(html) {
 | 
						|
				server_output.innerHTML += html + '\n';
 | 
						|
				server_output.scrollTop = server_output.scrollHeight;
 | 
						|
			}
 | 
						|
			ws.onerror = function (event) {
 | 
						|
				print(`<span style="color: red">WebSocket connection failed</span>`);
 | 
						|
			};
 | 
						|
			ws.onmessage = function (evt) {
 | 
						|
				console.log(evt.data)
 | 
						|
				print(evt.data);
 | 
						|
			};
 | 
						|
			ws.onclose = function () {
 | 
						|
				url_input.value = "";
 | 
						|
				url_input.disabled = false;
 | 
						|
				submit_button.disabled = false;
 | 
						|
				loadList();
 | 
						|
			}
 | 
						|
		}
 | 
						|
	</script>
 | 
						|
 | 
						|
	<h2>Downloads</h2>
 | 
						|
	<table>
 | 
						|
		<thead>
 | 
						|
			<tr>
 | 
						|
				<th></th>
 | 
						|
				<th>File name</th>
 | 
						|
				<th>Duration</th>
 | 
						|
				<th>Size</th>
 | 
						|
				<th>Date added</th>
 | 
						|
			</tr>
 | 
						|
		</thead>
 | 
						|
		<tbody id="tbody">
 | 
						|
		</tbody>
 | 
						|
	</table>
 | 
						|
	<p id="diskinfo"></p>
 | 
						|
	<script>
 | 
						|
		function loadList() {
 | 
						|
			fetch("/api/list").then(res => res.json()).then(data => {
 | 
						|
				tbody.innerHTML = '';
 | 
						|
				data.list.forEach((file, index) => {
 | 
						|
					var url = `${location.origin}/v/${encodeURIComponent(file.name)}`;
 | 
						|
					var row = tbody.insertRow(0);
 | 
						|
					row.insertCell().innerHTML = `<button title="Copy URL" onclick="navigator.clipboard.writeText('${url}')">📋</button>`;
 | 
						|
					row.insertCell().innerHTML = `<a href="${url}">${file.name}</a>`;
 | 
						|
					row.insertCell().innerHTML = `<span title="${file.duration} seconds">${formatDuration(file.duration)}</span>`;
 | 
						|
					row.insertCell().innerHTML = `<span title="${file.size} bytes">${formatBytes(file.size)}</span>`
 | 
						|
					row.insertCell().innerHTML = `<span title="${file.mtime}">${new Date(file.mtime).toLocaleString()}</span>`;
 | 
						|
				});
 | 
						|
				diskinfo.innerText = `Disk free: ${formatBytes(data.diskinfo.available)}`;
 | 
						|
			});
 | 
						|
		}
 | 
						|
 | 
						|
		loadList();
 | 
						|
		
 | 
						|
		function formatDuration(seconds) {
 | 
						|
			if (!seconds) return "?";
 | 
						|
			var d = new Date(0);
 | 
						|
			d.setSeconds(seconds);
 | 
						|
			var hms = d.toISOString().substring(11, 19);
 | 
						|
			if (hms.startsWith("00:")) hms = hms.substring(3);
 | 
						|
			return hms;
 | 
						|
		}
 | 
						|
 | 
						|
		function formatBytes(bytes) {
 | 
						|
			if (bytes == 0) return "0 B";
 | 
						|
			var e = Math.floor(Math.log(bytes) / Math.log(1000));
 | 
						|
			return (bytes / Math.pow(1000, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';
 | 
						|
		}
 | 
						|
 | 
						|
	</script>
 | 
						|
</body></html>
 |