s
This commit is contained in:
@@ -1 +1 @@
|
||||
https://live.douyin.com/147650297461
|
||||
https://live.douyin.com/147650297461,主播: 娱乐摆摊记
|
||||
|
||||
310
index.html
310
index.html
@@ -1,215 +1,113 @@
|
||||
<!--
|
||||
Project: DouyinLiveRecorder
|
||||
Author: Hmily
|
||||
Build: 2023.08.14 - 20:24:05
|
||||
GitHub Project URL: https://github.com/ihmily/DouyinLiveRecorder
|
||||
-->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="never">
|
||||
<title>M3U8 视频播放器</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet">
|
||||
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest/dist/hls.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/flv.js@1.6.2/dist/flv.min.js"></script>
|
||||
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Roboto', Arial, sans-serif;
|
||||
background-color: #1a237e;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
color: #ffffff;
|
||||
background-image: linear-gradient(120deg, #1a237e 0%, #283593 50%, #4a148c 100%);
|
||||
}
|
||||
|
||||
|
||||
.container {
|
||||
max-width: 640px;
|
||||
width: 80%;
|
||||
padding: 20px;
|
||||
background-color: #ffffff;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
#videoPlayer {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
padding-bottom: 56.25%;
|
||||
position: relative;
|
||||
background-color: #000;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.15);
|
||||
display: none;
|
||||
}
|
||||
|
||||
video {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#videoUrlInput{
|
||||
display: block;
|
||||
width: 100%;
|
||||
margin: 10px 0;
|
||||
padding: 8px;
|
||||
border-radius: 5px;
|
||||
border: 1px solid #ccc;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#playButton {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
background-color: #283593;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
border-radius: 5px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
margin: 0 0 10px 0;
|
||||
box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
#playButton:hover {
|
||||
background-color: #1a237e;
|
||||
}
|
||||
|
||||
.description {
|
||||
margin-top: 20px;
|
||||
line-height: 1.4;
|
||||
font-size: 14px;
|
||||
text-align: left;
|
||||
background-color: #f8f9fa;
|
||||
padding: 15px;
|
||||
border-radius: 5px;
|
||||
|
||||
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.15);
|
||||
display: block;
|
||||
}
|
||||
.footer {
|
||||
margin-top: 30px;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
p{
|
||||
color: black;
|
||||
}
|
||||
|
||||
a.no_style {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
@media screen and (max-width: 768px) {
|
||||
.container {
|
||||
width: 90%;
|
||||
border-radius: 0;
|
||||
box-shadow: none;
|
||||
margin-top:30px;
|
||||
}
|
||||
body {
|
||||
overflow-y: scroll;
|
||||
}
|
||||
#videoUrlInput{
|
||||
|
||||
margin-top: 30px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
</style>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>M3U8/FLV + PM2 控制</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest/dist/hls.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/flv.js@1.6.2/dist/flv.min.js"></script>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
background: linear-gradient(120deg, #1a237e 0%, #283593 50%, #4a148c 100%);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: flex-start;
|
||||
flex-direction: column;
|
||||
padding: 20px;
|
||||
}
|
||||
.container { max-width: 640px; width: 100%; background:#fff; color:#000; padding:20px; border-radius:10px; }
|
||||
#videoPlayer { width:100%; height:0; padding-bottom:56.25%; position:relative; background:#000; display:none; border-radius:5px; }
|
||||
video { position:absolute; top:0; left:0; width:100%; height:100%; }
|
||||
input, button { width:100%; margin:5px 0; padding:8px; border-radius:5px; border:1px solid #ccc; box-sizing:border-box; }
|
||||
button { background:#283593; color:white; border:none; cursor:pointer; font-weight:bold; }
|
||||
button:hover { background:#1a237e; }
|
||||
#pm2Buttons button { width:24%; margin-right:1%; }
|
||||
#pm2Buttons button:last-child { margin-right:0; }
|
||||
#pm2Log { background:#000;color:#0f0;padding:10px;height:200px;overflow:auto; white-space: pre-wrap; font-family: monospace; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<input type="text" id="videoUrlInput" placeholder="请输入 M3U8或者FLV 视频链接">
|
||||
<button id="playButton">播放视频</button>
|
||||
<div id="videoPlayer">
|
||||
<video controls></video>
|
||||
</div>
|
||||
<div class="description">
|
||||
<p><strong>说明</strong><p>
|
||||
<p>M3U8文件格式</p>
|
||||
<p>M3U8文件是采用UTF-8编码格式的M3U文件。M3U文件本身是一个纯文本索引文件,其核心功能是记录多媒体文件链接。当用户打开此类文件时,播放软件会根据索引查找相应的音视频文件网络地址,然后进行在线播放。</p>
|
||||
<p>M3U最初设计用于播放音频文件,例如MP3。但随着时间推移,更多的播放器和软件开始使用M3U来播放视频文件列表,同时也支持在线流媒体音频源的指定。目前,许多播放器和软件都兼容M3U文件格式。</p>
|
||||
<p>FLV文件格式(Flash Video Format)是Adobe公司开发的一种专门用于网页视频播放的文件格式。FLV格式的视频文件通常用于播放短视频和在线流媒体,可以嵌入到网页中供用户观看。FLV视频通常由Adobe Flash Player播放器播放,而其他第三方播放器也支持此格式。</p>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<p>© 2023 <a href='https://github.com/ihmily/DouyinLiveRecorder' class="no_style" target="_blank">Hmily</a>. All rights reserved.</p>
|
||||
</div>
|
||||
<script>
|
||||
function httpToHttps(url) {
|
||||
if (url.startsWith("http://")) {
|
||||
return url.replace("http://", "https://");
|
||||
}
|
||||
return url;
|
||||
}
|
||||
function playVideo() {
|
||||
let videoUrl = document.getElementById('videoUrlInput').value;
|
||||
const video = document.querySelector('#videoPlayer video');
|
||||
const description = document.querySelector('.description');
|
||||
if (videoUrl == ''){
|
||||
alert('请输入视频链接');
|
||||
return;
|
||||
}
|
||||
videoUrl = httpToHttps(videoUrl);
|
||||
if (videoUrl.includes('.m3u8')) {
|
||||
videoPlayer.style.display = 'block';
|
||||
description.style.display = 'none';
|
||||
if (Hls.isSupported()) {
|
||||
const hls = new Hls();
|
||||
hls.attachMedia(video);
|
||||
hls.on(Hls.Events.MEDIA_ATTACHED, () => {
|
||||
hls.loadSource(videoUrl);
|
||||
});
|
||||
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
|
||||
video.src = videoUrl;
|
||||
} else {
|
||||
alert('M3U8 格式不受您的浏览器支持。');
|
||||
console.error('M3U8 格式不受您的浏览器支持。');
|
||||
return;
|
||||
}
|
||||
} else if (videoUrl.includes('.flv')) {
|
||||
if (flvjs.isSupported()) {
|
||||
const flvPlayer = flvjs.createPlayer({
|
||||
type: 'flv',
|
||||
url: videoUrl
|
||||
});
|
||||
flvPlayer.attachMediaElement(video);
|
||||
flvPlayer.load();
|
||||
flvPlayer.play();
|
||||
} else {
|
||||
alert('FLV 格式不受您的浏览器支持。');
|
||||
console.error('FLV 格式不受您的浏览器支持。');
|
||||
return;
|
||||
}
|
||||
|
||||
videoPlayer.style.display = 'block';
|
||||
description.style.display = 'none';
|
||||
} else {
|
||||
console.error('不支持播放该视频格式。');
|
||||
alert('不支持播放该视频格式。');
|
||||
}
|
||||
<div class="container">
|
||||
<h2>视频播放器</h2>
|
||||
<input type="text" id="videoUrlInput" placeholder="请输入 M3U8 或 FLV 链接">
|
||||
<button id="playButton">播放视频</button>
|
||||
<div id="videoPlayer">
|
||||
<video controls></video>
|
||||
</div>
|
||||
|
||||
<h2>PM2 控制</h2>
|
||||
<div id="pm2Buttons">
|
||||
<button onclick="pm2Action('start')">启动</button>
|
||||
<button onclick="pm2Action('stop')">停止</button>
|
||||
<button onclick="pm2Action('restart')">重启</button>
|
||||
<button onclick="pm2Action('status')">状态</button>
|
||||
</div>
|
||||
<pre id="pm2Log">PM2 日志显示区</pre>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const video = document.querySelector('#videoPlayer video');
|
||||
const videoPlayer = document.getElementById('videoPlayer');
|
||||
|
||||
function httpToHttps(url) {
|
||||
return url.startsWith("http://") ? url.replace("http://", "https://") : url;
|
||||
}
|
||||
|
||||
function playVideo() {
|
||||
let url = document.getElementById('videoUrlInput').value.trim();
|
||||
if(!url){ alert('请输入视频链接'); return; }
|
||||
url = httpToHttps(url);
|
||||
|
||||
videoPlayer.style.display = 'block';
|
||||
if(url.includes('.m3u8')){
|
||||
if(Hls.isSupported()){
|
||||
const hls = new Hls();
|
||||
hls.attachMedia(video);
|
||||
hls.on(Hls.Events.MEDIA_ATTACHED, ()=>{ hls.loadSource(url); });
|
||||
} else if(video.canPlayType('application/vnd.apple.mpegurl')){
|
||||
video.src = url;
|
||||
} else { alert('M3U8 不支持'); return; }
|
||||
} else if(url.includes('.flv')){
|
||||
if(flvjs.isSupported()){
|
||||
const flvPlayer = flvjs.createPlayer({type:'flv',url:url});
|
||||
flvPlayer.attachMediaElement(video);
|
||||
flvPlayer.load(); flvPlayer.play();
|
||||
} else { alert('FLV 不支持'); return; }
|
||||
} else { alert('不支持此格式'); }
|
||||
}
|
||||
document.getElementById('playButton').addEventListener('click', playVideo);
|
||||
|
||||
// ---------------- PM2 控制 ----------------
|
||||
async function pm2Action(action){
|
||||
const pre = document.getElementById('pm2Log');
|
||||
try {
|
||||
const res = await fetch(`/${action}`);
|
||||
const data = await res.json();
|
||||
|
||||
if(action === "status"){
|
||||
pre.textContent =
|
||||
`【PM2 状态】
|
||||
${data.status}
|
||||
|
||||
【最近输出日志】
|
||||
${data.recent_log}
|
||||
|
||||
【最近错误日志】
|
||||
${data.recent_error}`;
|
||||
} else {
|
||||
pre.textContent = data.output || data.error;
|
||||
}
|
||||
} catch(e){
|
||||
pre.textContent = `请求失败: ${e}`;
|
||||
}
|
||||
}
|
||||
|
||||
// 可选:每 2 秒自动刷新状态
|
||||
setInterval(()=>{ pm2Action('status'); }, 2000);
|
||||
</script>
|
||||
|
||||
document.getElementById('playButton').addEventListener('click', playVideo);
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
215
index2.html
Normal file
215
index2.html
Normal file
@@ -0,0 +1,215 @@
|
||||
<!--
|
||||
Project: DouyinLiveRecorder
|
||||
Author: Hmily
|
||||
Build: 2023.08.14 - 20:24:05
|
||||
GitHub Project URL: https://github.com/ihmily/DouyinLiveRecorder
|
||||
-->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="referrer" content="never">
|
||||
<title>M3U8 视频播放器</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet">
|
||||
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest/dist/hls.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/flv.js@1.6.2/dist/flv.min.js"></script>
|
||||
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Roboto', Arial, sans-serif;
|
||||
background-color: #1a237e;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
color: #ffffff;
|
||||
background-image: linear-gradient(120deg, #1a237e 0%, #283593 50%, #4a148c 100%);
|
||||
}
|
||||
|
||||
|
||||
.container {
|
||||
max-width: 640px;
|
||||
width: 80%;
|
||||
padding: 20px;
|
||||
background-color: #ffffff;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
#videoPlayer {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
padding-bottom: 56.25%;
|
||||
position: relative;
|
||||
background-color: #000;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.15);
|
||||
display: none;
|
||||
}
|
||||
|
||||
video {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#videoUrlInput{
|
||||
display: block;
|
||||
width: 100%;
|
||||
margin: 10px 0;
|
||||
padding: 8px;
|
||||
border-radius: 5px;
|
||||
border: 1px solid #ccc;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#playButton {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
background-color: #283593;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
border-radius: 5px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
margin: 0 0 10px 0;
|
||||
box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
#playButton:hover {
|
||||
background-color: #1a237e;
|
||||
}
|
||||
|
||||
.description {
|
||||
margin-top: 20px;
|
||||
line-height: 1.4;
|
||||
font-size: 14px;
|
||||
text-align: left;
|
||||
background-color: #f8f9fa;
|
||||
padding: 15px;
|
||||
border-radius: 5px;
|
||||
|
||||
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.15);
|
||||
display: block;
|
||||
}
|
||||
.footer {
|
||||
margin-top: 30px;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
p{
|
||||
color: black;
|
||||
}
|
||||
|
||||
a.no_style {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
@media screen and (max-width: 768px) {
|
||||
.container {
|
||||
width: 90%;
|
||||
border-radius: 0;
|
||||
box-shadow: none;
|
||||
margin-top:30px;
|
||||
}
|
||||
body {
|
||||
overflow-y: scroll;
|
||||
}
|
||||
#videoUrlInput{
|
||||
|
||||
margin-top: 30px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<input type="text" id="videoUrlInput" placeholder="请输入 M3U8或者FLV 视频链接">
|
||||
<button id="playButton">播放视频</button>
|
||||
<div id="videoPlayer">
|
||||
<video controls></video>
|
||||
</div>
|
||||
<div class="description">
|
||||
<p><strong>说明</strong><p>
|
||||
<p>M3U8文件格式</p>
|
||||
<p>M3U8文件是采用UTF-8编码格式的M3U文件。M3U文件本身是一个纯文本索引文件,其核心功能是记录多媒体文件链接。当用户打开此类文件时,播放软件会根据索引查找相应的音视频文件网络地址,然后进行在线播放。</p>
|
||||
<p>M3U最初设计用于播放音频文件,例如MP3。但随着时间推移,更多的播放器和软件开始使用M3U来播放视频文件列表,同时也支持在线流媒体音频源的指定。目前,许多播放器和软件都兼容M3U文件格式。</p>
|
||||
<p>FLV文件格式(Flash Video Format)是Adobe公司开发的一种专门用于网页视频播放的文件格式。FLV格式的视频文件通常用于播放短视频和在线流媒体,可以嵌入到网页中供用户观看。FLV视频通常由Adobe Flash Player播放器播放,而其他第三方播放器也支持此格式。</p>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<p>© 2023 <a href='https://github.com/ihmily/DouyinLiveRecorder' class="no_style" target="_blank">Hmily</a>. All rights reserved.</p>
|
||||
</div>
|
||||
<script>
|
||||
function httpToHttps(url) {
|
||||
if (url.startsWith("http://")) {
|
||||
return url.replace("http://", "https://");
|
||||
}
|
||||
return url;
|
||||
}
|
||||
function playVideo() {
|
||||
let videoUrl = document.getElementById('videoUrlInput').value;
|
||||
const video = document.querySelector('#videoPlayer video');
|
||||
const description = document.querySelector('.description');
|
||||
if (videoUrl == ''){
|
||||
alert('请输入视频链接');
|
||||
return;
|
||||
}
|
||||
videoUrl = httpToHttps(videoUrl);
|
||||
if (videoUrl.includes('.m3u8')) {
|
||||
videoPlayer.style.display = 'block';
|
||||
description.style.display = 'none';
|
||||
if (Hls.isSupported()) {
|
||||
const hls = new Hls();
|
||||
hls.attachMedia(video);
|
||||
hls.on(Hls.Events.MEDIA_ATTACHED, () => {
|
||||
hls.loadSource(videoUrl);
|
||||
});
|
||||
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
|
||||
video.src = videoUrl;
|
||||
} else {
|
||||
alert('M3U8 格式不受您的浏览器支持。');
|
||||
console.error('M3U8 格式不受您的浏览器支持。');
|
||||
return;
|
||||
}
|
||||
} else if (videoUrl.includes('.flv')) {
|
||||
if (flvjs.isSupported()) {
|
||||
const flvPlayer = flvjs.createPlayer({
|
||||
type: 'flv',
|
||||
url: videoUrl
|
||||
});
|
||||
flvPlayer.attachMediaElement(video);
|
||||
flvPlayer.load();
|
||||
flvPlayer.play();
|
||||
} else {
|
||||
alert('FLV 格式不受您的浏览器支持。');
|
||||
console.error('FLV 格式不受您的浏览器支持。');
|
||||
return;
|
||||
}
|
||||
|
||||
videoPlayer.style.display = 'block';
|
||||
description.style.display = 'none';
|
||||
} else {
|
||||
console.error('不支持播放该视频格式。');
|
||||
alert('不支持播放该视频格式。');
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('playButton').addEventListener('click', playVideo);
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
71
web.py
Normal file
71
web.py
Normal file
@@ -0,0 +1,71 @@
|
||||
from fastapi import FastAPI
|
||||
from fastapi.responses import FileResponse, JSONResponse
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
# ---------------- 配置 ----------------
|
||||
BOT_NAME = "hdmi" # PM2 进程名
|
||||
BASE_DIR = Path(__file__).parent
|
||||
|
||||
# 允许前端跨域访问
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
# 静态文件
|
||||
app.mount("/static", StaticFiles(directory=BASE_DIR), name="static")
|
||||
|
||||
# ---------------- PM2 控制 ----------------
|
||||
def pm2_cmd(cmd: str):
|
||||
try:
|
||||
out = subprocess.check_output(f"pm2 {cmd}", shell=True, stderr=subprocess.STDOUT, text=True)
|
||||
return out
|
||||
except subprocess.CalledProcessError as e:
|
||||
return e.output
|
||||
|
||||
def read_log(log_type="out", lines=50):
|
||||
log_file = BASE_DIR.parent / f".pm2/logs/{BOT_NAME}-{log_type}.log"
|
||||
try:
|
||||
with open(log_file, "r", encoding="utf-8") as f:
|
||||
content = f.readlines()[-lines:]
|
||||
return "".join(content)
|
||||
except FileNotFoundError:
|
||||
return f"未找到日志文件: {log_file}"
|
||||
|
||||
@app.get("/start")
|
||||
def start():
|
||||
out = pm2_cmd(f"start {BOT_NAME}")
|
||||
return JSONResponse({"action": "start", "output": out})
|
||||
|
||||
@app.get("/stop")
|
||||
def stop():
|
||||
out = pm2_cmd(f"stop {BOT_NAME} --no-autorestart")
|
||||
return JSONResponse({"action": "stop", "output": out})
|
||||
|
||||
@app.get("/restart")
|
||||
def restart():
|
||||
out = pm2_cmd(f"restart {BOT_NAME}")
|
||||
return JSONResponse({"action": "restart", "output": out})
|
||||
|
||||
@app.get("/status")
|
||||
def status():
|
||||
status = pm2_cmd(f"status {BOT_NAME}")
|
||||
log = read_log("out", 50)
|
||||
error_log = read_log("error", 50)
|
||||
return JSONResponse({
|
||||
"status": status,
|
||||
"recent_log": log,
|
||||
"recent_error": error_log
|
||||
})
|
||||
|
||||
# ---------------- HTML ----------------
|
||||
@app.get("/")
|
||||
def index():
|
||||
return FileResponse(BASE_DIR / "index.html")
|
||||
Reference in New Issue
Block a user