Add
This commit is contained in:
parent
3c9bf5936b
commit
b78a1381b2
47
check.py
Normal file
47
check.py
Normal file
@ -0,0 +1,47 @@
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
|
||||
def get_folder_size(folder_path):
|
||||
total_size = 0
|
||||
for dirpath, dirnames, filenames in os.walk(folder_path):
|
||||
for filename in filenames:
|
||||
filepath = os.path.join(dirpath, filename)
|
||||
if os.path.exists(filepath):
|
||||
total_size += os.path.getsize(filepath)
|
||||
return total_size
|
||||
|
||||
|
||||
def delete_files(folder_path, extensions):
|
||||
os.system('sudo pkill -f revivetube.py')
|
||||
process = subprocess.Popen(['sudo', 'nohup', 'python3', 'revivetube.py'])
|
||||
for dirpath, dirnames, filenames in os.walk(folder_path):
|
||||
for filename in filenames:
|
||||
if any(filename.lower().endswith(ext) for ext in extensions):
|
||||
filepath = os.path.join(dirpath, filename)
|
||||
try:
|
||||
os.remove(filepath)
|
||||
except:
|
||||
print(f"ERROR deleting {filepath}")
|
||||
|
||||
|
||||
def monitor_folder(folder_path, size_limit_gb, check_interval):
|
||||
size_limit_bytes = size_limit_gb * 1024 * 1024 * 1024 # GB -> Bytes
|
||||
while True:
|
||||
folder_size = get_folder_size(folder_path)
|
||||
print(f"Current folder size: {folder_size / (1024 * 1024):.2f} MB")
|
||||
|
||||
if folder_size > size_limit_bytes:
|
||||
print("Size limit exceeded. Deleting files...")
|
||||
delete_files(folder_path, [".flv", ".mp4"])
|
||||
|
||||
time.sleep(check_interval)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
folder_to_monitor = "./sigma/videos/"
|
||||
size_limit = 0.5 # 500 MB
|
||||
interval = 5
|
||||
|
||||
monitor_folder(folder_to_monitor, size_limit, interval)
|
152
revivetube.py
152
revivetube.py
@ -71,6 +71,22 @@ os.makedirs(VIDEO_FOLDER, exist_ok=True)
|
||||
MAX_VIDEO_SIZE = 1 * 1024 * 1024 * 1024
|
||||
MAX_FOLDER_SIZE = 5 * 1024 * 1024 * 1024
|
||||
|
||||
async def run_subprocess(cmd, timeout=300):
|
||||
loop = asyncio.get_event_loop()
|
||||
def _run():
|
||||
try:
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
timeout=timeout,
|
||||
check=True
|
||||
)
|
||||
return result
|
||||
except Exception as e:
|
||||
return e
|
||||
return await loop.run_in_executor(None, _run)
|
||||
|
||||
def get_folder_size(path):
|
||||
total_size = 0
|
||||
for dirpath, dirnames, filenames in os.walk(path):
|
||||
@ -286,82 +302,70 @@ async def watch():
|
||||
async def process_video(video_id):
|
||||
video_mp4_path = os.path.join(VIDEO_FOLDER, f"{video_id}.mp4")
|
||||
video_flv_path = os.path.join(VIDEO_FOLDER, f"{video_id}.flv")
|
||||
|
||||
temp_dir = tempfile.mkdtemp()
|
||||
|
||||
try:
|
||||
video_status[video_id] = {"status": "downloading"}
|
||||
temp_dir = tempfile.mkdtemp()
|
||||
|
||||
try:
|
||||
subprocess.run([
|
||||
"yt-dlp",
|
||||
"-o", os.path.join(temp_dir, f"{video_id}.%(ext)s"),
|
||||
"--cookies", "cookies.txt",
|
||||
"--proxy", "http://localhost:4000",
|
||||
"-f", "worstvideo+worstaudio",
|
||||
f"https://youtube.com/watch?v={video_id}"
|
||||
], check=True)
|
||||
|
||||
downloaded_files = [f for f in os.listdir(temp_dir) if video_id in f]
|
||||
if not downloaded_files:
|
||||
raise Exception("No video file downloaded")
|
||||
ytdlp_cmd = [
|
||||
"yt-dlp",
|
||||
"-o", os.path.join(temp_dir, f"{video_id}.%(ext)s"),
|
||||
"--cookies", "cookies.txt",
|
||||
"-f", "worstvideo+worstaudio",
|
||||
f"https://youtube.com/watch?v={video_id}"
|
||||
]
|
||||
result = await run_subprocess(ytdlp_cmd)
|
||||
if isinstance(result, Exception):
|
||||
raise result
|
||||
|
||||
downloaded_file = os.path.join(temp_dir, downloaded_files[0])
|
||||
|
||||
if not downloaded_file.endswith(".mp4"):
|
||||
video_status[video_id] = {"status": "converting"}
|
||||
try:
|
||||
subprocess.run([
|
||||
"ffmpeg",
|
||||
"-y",
|
||||
"-i", downloaded_file,
|
||||
"-c:v", "libx264",
|
||||
"-crf", "51",
|
||||
"-c:a", "aac",
|
||||
"-strict", "experimental",
|
||||
"-preset", "ultrafast",
|
||||
"-b:a", "64k",
|
||||
"-movflags", "+faststart",
|
||||
"-vf", "scale=854:480",
|
||||
video_mp4_path
|
||||
], check=True, timeout=300, stderr=subprocess.PIPE)
|
||||
except subprocess.TimeoutExpired:
|
||||
raise Exception("MP4 conversion timed out")
|
||||
except subprocess.CalledProcessError as e:
|
||||
error_output = e.stderr.decode('utf-8') if e.stderr else str(e)
|
||||
raise Exception(f"MP4 conversion failed: {error_output}")
|
||||
else:
|
||||
shutil.copy(downloaded_file, video_mp4_path)
|
||||
downloaded_files = [f for f in os.listdir(temp_dir) if video_id in f]
|
||||
if not downloaded_files:
|
||||
raise Exception("No video file downloaded")
|
||||
|
||||
if not os.path.exists(video_flv_path):
|
||||
video_status[video_id] = {"status": "converting for Wii"}
|
||||
try:
|
||||
subprocess.run([
|
||||
"ffmpeg",
|
||||
"-y",
|
||||
"-i", video_mp4_path,
|
||||
"-ar", "22050",
|
||||
"-f", "flv",
|
||||
"-s", "320x240",
|
||||
"-ab", "32k",
|
||||
"-preset", "ultrafast",
|
||||
"-crf", "51",
|
||||
"-filter:v", "fps=fps=15",
|
||||
video_flv_path
|
||||
], check=True, timeout=300, stderr=subprocess.PIPE)
|
||||
except subprocess.TimeoutExpired:
|
||||
raise Exception("FLV conversion timed out")
|
||||
except subprocess.CalledProcessError as e:
|
||||
error_output = e.stderr.decode('utf-8') if e.stderr else str(e)
|
||||
raise Exception(f"FLV conversion failed: {error_output}")
|
||||
downloaded_file = os.path.join(temp_dir, downloaded_files[0])
|
||||
|
||||
# Convert to MP4 if needed
|
||||
if not downloaded_file.endswith(".mp4"):
|
||||
video_status[video_id] = {"status": "converting"}
|
||||
ffmpeg_cmd = [
|
||||
"ffmpeg", "-y",
|
||||
"-i", downloaded_file,
|
||||
"-c:v", "libx264",
|
||||
"-crf", "51",
|
||||
"-c:a", "aac",
|
||||
"-preset", "ultrafast",
|
||||
"-b:a", "64k",
|
||||
"-movflags", "+faststart",
|
||||
"-vf", "scale=854:480",
|
||||
video_mp4_path
|
||||
]
|
||||
result = await run_subprocess(ffmpeg_cmd)
|
||||
if isinstance(result, Exception):
|
||||
raise result
|
||||
else:
|
||||
shutil.copy(downloaded_file, video_mp4_path)
|
||||
|
||||
# Convert to FLV
|
||||
if not os.path.exists(video_flv_path):
|
||||
video_status[video_id] = {"status": "converting for Wii"}
|
||||
ffmpeg_flv_cmd = [
|
||||
"ffmpeg", "-y",
|
||||
"-i", video_mp4_path,
|
||||
"-ar", "22050",
|
||||
"-f", "flv",
|
||||
"-s", "320x240",
|
||||
"-ab", "32k",
|
||||
"-preset", "ultrafast",
|
||||
"-crf", "51",
|
||||
"-filter:v", "fps=fps=15",
|
||||
video_flv_path
|
||||
]
|
||||
result = await run_subprocess(ffmpeg_flv_cmd)
|
||||
if isinstance(result, Exception):
|
||||
raise result
|
||||
|
||||
video_status[video_id] = {"status": "complete", "url": f"/sigma/videos/{video_id}.mp4"}
|
||||
|
||||
video_status[video_id] = {"status": "complete", "url": f"/sigma/videos/{video_id}.mp4"}
|
||||
|
||||
finally:
|
||||
try:
|
||||
shutil.rmtree(temp_dir)
|
||||
except:
|
||||
pass
|
||||
|
||||
except Exception as e:
|
||||
error_msg = str(e)
|
||||
video_status[video_id] = {"status": "error", "message": error_msg}
|
||||
@ -372,6 +376,12 @@ async def process_video(video_id):
|
||||
except:
|
||||
pass
|
||||
|
||||
finally:
|
||||
try:
|
||||
shutil.rmtree(temp_dir)
|
||||
except:
|
||||
pass
|
||||
|
||||
@app.route("/status/<video_id>")
|
||||
async def check_status(video_id):
|
||||
return jsonify(video_status.get(video_id, {"status": "pending"}))
|
||||
@ -456,7 +466,7 @@ async def channel_m():
|
||||
channel_name = info.get('uploader', 'Unknown')
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"https://invidious.errexe.xyz/channel/{channel_id}", timeout=10) as response:
|
||||
async with session.get(f"https://invidious.materialio.us/channel/{channel_id}", timeout=10) as response:
|
||||
if response.status != 200:
|
||||
return "Failed to fetch channel page.", 500
|
||||
soup = BeautifulSoup(await response.text(), "html.parser")
|
||||
|
80
robots.txt
Normal file
80
robots.txt
Normal file
@ -0,0 +1,80 @@
|
||||
User-agent: AI2Bot
|
||||
User-agent: Ai2Bot-Dolma
|
||||
User-agent: aiHitBot
|
||||
User-agent: Amazonbot
|
||||
User-agent: Andibot
|
||||
User-agent: anthropic-ai
|
||||
User-agent: Applebot
|
||||
User-agent: Applebot-Extended
|
||||
User-agent: bedrockbot
|
||||
User-agent: Brightbot 1.0
|
||||
User-agent: Bytespider
|
||||
User-agent: CCBot
|
||||
User-agent: ChatGPT-User
|
||||
User-agent: Claude-SearchBot
|
||||
User-agent: Claude-User
|
||||
User-agent: Claude-Web
|
||||
User-agent: ClaudeBot
|
||||
User-agent: cohere-ai
|
||||
User-agent: cohere-training-data-crawler
|
||||
User-agent: Cotoyogi
|
||||
User-agent: Crawlspace
|
||||
User-agent: Diffbot
|
||||
User-agent: DuckAssistBot
|
||||
User-agent: EchoboxBot
|
||||
User-agent: FacebookBot
|
||||
User-agent: Factset_spyderbot
|
||||
User-agent: FirecrawlAgent
|
||||
User-agent: FriendlyCrawler
|
||||
User-agent: Google-CloudVertexBot
|
||||
User-agent: Google-Extended
|
||||
User-agent: GoogleOther
|
||||
User-agent: GoogleOther-Image
|
||||
User-agent: GoogleOther-Video
|
||||
User-agent: GPTBot
|
||||
User-agent: iaskspider/2.0
|
||||
User-agent: ICC-Crawler
|
||||
User-agent: ImagesiftBot
|
||||
User-agent: img2dataset
|
||||
User-agent: ISSCyberRiskCrawler
|
||||
User-agent: Kangaroo Bot
|
||||
User-agent: meta-externalagent
|
||||
User-agent: Meta-ExternalAgent
|
||||
User-agent: meta-externalfetcher
|
||||
User-agent: Meta-ExternalFetcher
|
||||
User-agent: MistralAI-User/1.0
|
||||
User-agent: MyCentralAIScraperBot
|
||||
User-agent: NovaAct
|
||||
User-agent: OAI-SearchBot
|
||||
User-agent: omgili
|
||||
User-agent: omgilibot
|
||||
User-agent: Operator
|
||||
User-agent: PanguBot
|
||||
User-agent: Panscient
|
||||
User-agent: panscient.com
|
||||
User-agent: Perplexity-User
|
||||
User-agent: PerplexityBot
|
||||
User-agent: PetalBot
|
||||
User-agent: PhindBot
|
||||
User-agent: Poseidon Research Crawler
|
||||
User-agent: QualifiedBot
|
||||
User-agent: QuillBot
|
||||
User-agent: quillbot.com
|
||||
User-agent: SBIntuitionsBot
|
||||
User-agent: Scrapy
|
||||
User-agent: SemrushBot
|
||||
User-agent: SemrushBot-BA
|
||||
User-agent: SemrushBot-CT
|
||||
User-agent: SemrushBot-OCOB
|
||||
User-agent: SemrushBot-SI
|
||||
User-agent: SemrushBot-SWA
|
||||
User-agent: Sidetrade indexer bot
|
||||
User-agent: TikTokSpider
|
||||
User-agent: Timpibot
|
||||
User-agent: VelenPublicWebCrawler
|
||||
User-agent: Webzio-Extended
|
||||
User-agent: wpbot
|
||||
User-agent: YandexAdditional
|
||||
User-agent: YandexAdditionalBot
|
||||
User-agent: YouBot
|
||||
Disallow: /
|
@ -128,7 +128,8 @@
|
||||
<a href="https://revivemii.errexe.xyz/discord-redirect.html">Discord Server</a> |
|
||||
<a href="mailto:theerrorexe@gmail.com">Contact</a> |
|
||||
<a href="/site_storage/credits.html">Credits</a> |
|
||||
<a href="mailto:dmca@errexe.xyz">DMCA: dmca@errexe.xyz</a>
|
||||
<a href="mailto:dmca@errexe.xyz">DMCA: dmca@errexe.xyz</a> |
|
||||
<a htef="https://git.errexe.xyz/TheErrorExe/modified-revivetube-for-ytolderrexexyz">Modified Source Code</a>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -112,7 +112,8 @@
|
||||
<a href="https://revivemii.errexe.xyz/discord-redirect.html">Discord Server</a> |
|
||||
<a href="mailto:theerrorexe@gmail.com">Contact</a> |
|
||||
<a href="/site_storage/credits.html">Credits</a> |
|
||||
<a href="mailto:dmca@errexe.xyz">DMCA: dmca@errexe.xyz</a>
|
||||
<a href="mailto:dmca@errexe.xyz">DMCA: dmca@errexe.xyz</a> |
|
||||
<a href="https://git.errexe.xyz/TheErrorExe/modified-revivetube-for-ytolderrexexyz">Modified Source Code</a>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -125,7 +125,8 @@
|
||||
<a href="https://revivemii.errexe.xyz/discord-redirect.html">Discord Server</a> |
|
||||
<a href="mailto:theerrorexe@gmail.com">Contact</a> |
|
||||
<a href="/site_storage/credits.html">Credits</a> |
|
||||
<a href="mailto:dmca@errexe.xyz">DMCA: dmca@errexe.xyz</a>
|
||||
<a href="mailto:dmca@errexe.xyz">DMCA: dmca@errexe.xyz</a> |
|
||||
<a href="https://git.errexe.xyz/TheErrorExe/modified-revivetube-for-ytolderrexexyz">Modified Source Code</a>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -125,7 +125,8 @@
|
||||
<a href="https://revivemii.errexe.xyz/discord-redirect.html">Discord Server</a> |
|
||||
<a href="mailto:theerrorexe@gmail.com">Contact</a> |
|
||||
<a href="/site_storage/credits.html">Credits</a> |
|
||||
<a href="mailto:dmca@errexe.xyz">DMCA: dmca@errexe.xyz</a>
|
||||
<a href="mailto:dmca@errexe.xyz">DMCA: dmca@errexe.xyz</a> |
|
||||
<a href="https://git.errexe.xyz/TheErrorExe/modified-revivetube-for-ytolderrexexyz">Modified Source Code</a>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
x
Reference in New Issue
Block a user