diff --git a/check.py b/check.py new file mode 100644 index 0000000..5cf7b53 --- /dev/null +++ b/check.py @@ -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) diff --git a/revivetube.py b/revivetube.py index 03d85ea..146c447 100644 --- a/revivetube.py +++ b/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/") 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") diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..0edf11f --- /dev/null +++ b/robots.txt @@ -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: / diff --git a/site_storage/channel_template.html b/site_storage/channel_template.html index 5fc3837..75948d7 100644 --- a/site_storage/channel_template.html +++ b/site_storage/channel_template.html @@ -128,7 +128,8 @@ Discord Server | Contact | Credits | -DMCA: dmca@errexe.xyz +DMCA: dmca@errexe.xyz | +Modified Source Code

diff --git a/site_storage/credits.html b/site_storage/credits.html index d672dd4..dc7ec85 100644 --- a/site_storage/credits.html +++ b/site_storage/credits.html @@ -112,7 +112,8 @@ Discord Server | Contact | Credits | - DMCA: dmca@errexe.xyz + DMCA: dmca@errexe.xyz | +Modified Source Code

diff --git a/site_storage/index_template.html b/site_storage/index_template.html index 1b7767a..e73af96 100644 --- a/site_storage/index_template.html +++ b/site_storage/index_template.html @@ -125,7 +125,8 @@ Discord Server | Contact | Credits | - DMCA: dmca@errexe.xyz + DMCA: dmca@errexe.xyz | + Modified Source Code

diff --git a/site_storage/search_template.html b/site_storage/search_template.html index 4341053..b73151b 100644 --- a/site_storage/search_template.html +++ b/site_storage/search_template.html @@ -125,7 +125,8 @@ Discord Server | Contact | Credits | -DMCA: dmca@errexe.xyz +DMCA: dmca@errexe.xyz | +Modified Source Code

diff --git a/start.py b/start.py new file mode 100644 index 0000000..8a800e5 --- /dev/null +++ b/start.py @@ -0,0 +1,6 @@ +import subprocess +import time +while True: + process = subprocess.Popen(["python3", "revivetube.py"]) + process.wait() + time.sleep(1)