mirror of
				https://codeberg.org/ashley/poke
				synced 2025-07-17 16:52:11 +00:00 
			
		
		
		
	Merge pull request 'Add videobundler' (#92) from nin0dev/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/92
This commit is contained in:
		
						commit
						bd6337cc5c
					
				
							
								
								
									
										4
									
								
								videobundler/.env.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								videobundler/.env.example
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| TIME_BEFORE_DELETE=30 | ||||
| PORT=45872 | ||||
| # DO NOT PUT A / AT THE END OF THE URL | ||||
| PROXY_URL=https://eu-proxy.poketube.fun | ||||
							
								
								
									
										25
									
								
								videobundler/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								videobundler/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| # poke-videobundler | ||||
| 
 | ||||
| Takes 2 input streams, downloads them, and spits out a combined file. | ||||
| 
 | ||||
| ## Installation | ||||
| 
 | ||||
| 1. Make sure `ffmpeg`, `wget`, and Python 3 are all installed. | ||||
| 2. Download the program files to your computer - `main.py` and `.env.example`. | ||||
| 3. Run `python3 -m pip install flask python-dotenv waitress`. | ||||
| 
 | ||||
| ## Configuration | ||||
| 
 | ||||
| 1. Run `mv .env.example .env`, **even if you don't want to configure anything**. | ||||
| 2. Edit and fill in the values if needed. | ||||
| 
 | ||||
| ## Usage | ||||
| 
 | ||||
| 1. `python3 main.py`. | ||||
| 2. If everything went well, you shouldn't see any output at launch. | ||||
| 3. You will now be able to call the server at the configured port. | ||||
| 
 | ||||
| ## Endpoints | ||||
| 
 | ||||
| - `/`: Will return `{success:true}` if alive. | ||||
| - `/get_merged_video?id=VIDEO_ID&audio_itag=AUDIO_ITAG&video_itag=VIDEO_ITAG`: Returns a merged video. ID is the youtube video ID, and itags are self explanatory. | ||||
							
								
								
									
										64
									
								
								videobundler/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								videobundler/main.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| from datetime import datetime | ||||
| from dotenv import load_dotenv | ||||
| from flask import Flask, request, Response, send_file | ||||
| from threading import Thread | ||||
| from time import sleep | ||||
| 
 | ||||
| import io | ||||
| import json | ||||
| import os | ||||
| import random | ||||
| import string | ||||
| import subprocess | ||||
| import uuid | ||||
| 
 | ||||
| load_dotenv() | ||||
| 
 | ||||
| app = Flask(__name__) | ||||
| 
 | ||||
| def autodelete(job_id: str): | ||||
|     sleep(os.getenv("TIME_BEFORE_DELETE")) | ||||
|     os.remove(f"{job_id}.mp4") | ||||
|     os.remove(f"{job_id}.m4a") | ||||
|     os.remove(f"output.{job_id}.mp4") | ||||
| 
 | ||||
| def get_random_string(length): | ||||
|     # choose from all lowercase letter | ||||
|     letters = string.ascii_lowercase | ||||
|     result_str = "".join(random.choice(letters) for i in range(length)) | ||||
|     return result_str | ||||
| 
 | ||||
| @app.route("/") | ||||
| def ping(): | ||||
|     return json.loads(""" | ||||
|     { | ||||
|         "success": true | ||||
|     } | ||||
|     """) | ||||
| 
 | ||||
| @app.route("/get_merged_video") | ||||
| def get_merged_video(): | ||||
|     pwd = os.getcwd() | ||||
|     video_id = request.args.get("id") | ||||
|     job_id = get_random_string(10) | ||||
|     audio_itag = request.args.get("audio_itag") | ||||
|     video_itag = request.args.get("video_itag") | ||||
|     # Download both audio and video | ||||
|     subprocess.run(["wget", f"-O{job_id}.m4a", f"{os.getenv("PROXY_URL")}/latest_version?id={video_id}&itag={audio_itag}&local=true"], check=True) | ||||
|     subprocess.run(["wget", f"-O{job_id}.mp4", f"{os.getenv("PROXY_URL")}/latest_version?id={video_id}&itag={video_itag}&local=true"], check=True) | ||||
|     # Merge both files | ||||
|     subprocess.run(f"ffmpeg -i {pwd}/{job_id}.m4a -i {pwd}/{job_id}.mp4 -c copy {pwd}/output.{job_id}.mp4", shell=True, check=True) | ||||
|     thread = Thread(target=autodelete, args = (job_id, )) | ||||
|     thread.start() | ||||
|     with open(f"output.{job_id}.mp4", "rb") as bytes: | ||||
|         return send_file( | ||||
|             io.BytesIO(bytes.read()), | ||||
|             mimetype="video/mp4", | ||||
|             download_name=f"output.{job_id}.mp4", | ||||
|             as_attachment=True | ||||
|         ) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     from waitress import serve | ||||
|     serve(app, host="0.0.0.0", port=os.getenv("PORT")) | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Ashley ////
						Ashley ////