Wrong / app.py
deepuurf's picture
Create app.py
927c6cb verified
Raw
History Blame Contribute Delete
14.7 kB
```python
import gradio as gr
import subprocess
import os
import random
import shutil
import tempfile
import json
import time
from pathlib import Path
class UltimateVideoEvader:
def __init__(self):
self.ffmpeg_path = self._find_ffmpeg()
self.ffprobe_path = self.ffmpeg_path.replace("ffmpeg", "ffprobe")
def _find_ffmpeg(self):
# Hugging Face Space में ffmpeg पहले से इंस्टॉल होता है
for cmd in ["ffmpeg", "/usr/bin/ffmpeg"]:
if shutil.which(cmd):
return cmd
# अगर न मिले तो PATH में खोजें
return "ffmpeg"
def _get_resolution(self, input_file):
"""FFprobe से रिज़ॉल्यूशन निकालें"""
try:
cmd = [
self.ffprobe_path,
"-v", "error",
"-select_streams", "v:0",
"-show_entries", "stream=width,height",
"-of", "json",
input_file
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
data = json.loads(result.stdout)
if "streams" in data and data["streams"]:
return (int(data["streams"][0]["width"]), int(data["streams"][0]["height"]))
except:
pass
return (1920, 1080) # डिफ़ॉल्ट
def _random_choice(self, options):
return random.choice(options) if isinstance(options, list) else options
def _random_float(self, a, b):
return round(random.uniform(a, b), 4)
def build_brutal_command(self, input_file, output_file):
"""सबसे खतरनाक ट्रांसफ़ॉर्मेशन – 15+ तरीके एक साथ"""
cmd = [self.ffmpeg_path, "-i", input_file]
# ----- 1. मेटाडेटा पूरी तरह हटाएँ -----
cmd.extend(["-map_metadata", "-1"])
# ----- 2. रिज़ॉल्यूशन – 0.6x से 1.4x तक रैंडम -----
scale = self._random_float(0.6, 1.4)
w, h = self._get_resolution(input_file)
new_w = int(w * scale)
new_h = int(h * scale)
new_w = new_w if new_w % 2 == 0 else new_w + 1
new_h = new_h if new_h % 2 == 0 else new_h + 1
cmd.extend(["-vf", f"scale={new_w}:{new_h}"])
# ----- 3. फ़्रेमरेट – 15 से 60 fps के बीच -----
fps = self._random_float(15, 60)
cmd.extend(["-r", str(round(fps, 2))])
# ----- 4. स्पीड – 0.8x से 1.3x -----
speed = self._random_float(0.8, 1.3)
cmd.extend(["-filter:v", f"setpts={1/speed}*PTS"])
# ----- 5. ऑडियो टेम्पो – 0.8x से 1.3x (स्पीड के साथ) -----
tempo = self._random_float(0.8, 1.3) * speed
cmd.extend(["-filter:a", f"atempo={tempo}"])
# ----- 6. ऑडियो पिच शिफ्ट – ±1 सेमीटोन -----
pitch = self._random_float(-1.0, 1.0)
cmd.extend(["-af", f"rubberband=pitch={2**(pitch/12)}"])
# ----- 7. शोर – 1 से 12 dB तक -----
noise_db = self._random_float(1, 12)
cmd.extend(["-vf", f"noise=alls={noise_db}:allf=t+u"])
# ----- 8. ब्राइटनेस – ±10% -----
bright = self._random_float(-0.1, 0.1)
cmd.extend(["-vf", f"eq=brightness={bright}"])
# ----- 9. कंट्रास्ट – 0.85x से 1.15x -----
contrast = self._random_float(0.85, 1.15)
cmd.extend(["-vf", f"eq=contrast={contrast}"])
# ----- 10. सैचुरेशन – 0.7x से 1.3x -----
saturation = self._random_float(0.7, 1.3)
cmd.extend(["-vf", f"eq=saturation={saturation}"])
# ----- 11. ह्यू (रंग) शिफ्ट – 0 से 360 डिग्री -----
hue = self._random_float(0, 360)
cmd.extend(["-vf", f"hue=H={hue}"])
# ----- 12. क्रॉप + पैड (फ्रेम को थोड़ा काटकर फिर से भरना) -----
crop_percent = self._random_float(0.90, 0.98)
crop_w = int(new_w * crop_percent)
crop_h = int(new_h * crop_percent)
crop_w = crop_w if crop_w % 2 == 0 else crop_w + 1
crop_h = crop_h if crop_h % 2 == 0 else crop_h + 1
# पहले crop करें, फिर pad करके मूल आकार में लाएँ
pad_left = (new_w - crop_w) // 2
pad_top = (new_h - crop_h) // 2
cmd.extend(["-vf", f"crop={crop_w}:{crop_h}:{pad_left}:{pad_top},pad={new_w}:{new_h}:{pad_left}:{pad_top}"])
# ----- 13. मिरर (horizontal या vertical) -----
if random.choice([True, False]):
cmd.extend(["-vf", "hflip"])
if random.choice([True, False]):
cmd.extend(["-vf", "vflip"])
# ----- 14. रैंडम ऑफ़सेट – 0 से 120 फ़्रेम काटें -----
offset = random.randint(0, 120)
if offset > 0:
cmd.extend(["-vf", f"trim=start_frame={offset}", "-vsync", "0"])
# ----- 15. रिवर्स (पूरा या आधा) -----
if random.choice([True, False]):
cmd.extend(["-vf", "reverse"])
# ----- 16. गाउसियन ब्लर (हल्का) -----
if random.choice([True, False]):
blur = self._random_float(0.5, 2.0)
cmd.extend(["-vf", f"gblur=sigma={blur}"])
# ----- 17. कोडेक – H.264 / H.265 / VP9 में से कोई -----
codec = random.choice(["libx264", "libx265", "libvpx-vp9"])
cmd.extend(["-c:v", codec])
# ----- 18. प्रोफ़ाइल / प्रीसेट – random -----
preset = random.choice(["ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow"])
cmd.extend(["-preset", preset])
# ----- 19. क्वालिटी (CRF) – 18 से 28 -----
crf = random.randint(18, 28)
cmd.extend(["-crf", str(crf)])
# ----- 20. ऑडियो कोडेक – AAC या MP3 -----
audio_codec = random.choice(["aac", "libmp3lame"])
cmd.extend(["-c:a", audio_codec, "-b:a", "128k"])
# ----- 21. कंटेनर – mp4, mkv, mov, avi -----
container = random.choice(["mp4", "mkv", "mov"])
base = os.path.splitext(output_file)[0]
output_file = f"{base}.{container}"
# ----- 22. रैंडम फ़्रेम ड्रॉप (कुछ फ़्रेम हटाएँ) -----
if random.choice([True, False]):
cmd.extend(["-vsync", "drop"])
# अंतिम आउटपुट
cmd.extend(["-y", output_file])
return cmd, output_file
def process_video(self, input_path, progress=gr.Progress()):
progress(0, desc="टूल तैयार हो रहा है...")
output_dir = tempfile.mkdtemp()
output_base = os.path.join(output_dir, "evaded_video")
# ब्रूटल कमांड बनाएँ
cmd, final_output = self.build_brutal_command(input_path, output_base)
progress(0.2, desc="FFmpeg कमांड तैयार...")
print(" ".join(cmd))
progress(0.3, desc="प्रोसेसिंग शुरू (इसमें 2-5 मिनट लग सकते हैं)...")
try:
subprocess.run(cmd, check=True, capture_output=True, text=True)
except subprocess.CalledProcessError as e:
return f"❌ त्रुटि: {e.stderr}", None
progress(0.9, desc="फ़ाइल तैयार...")
# फ़ाइल का साइज़ चेक करें
if os.path.exists(final_output) and os.path.getsize(final_output) > 0:
progress(1.0, desc="✅ पूरा!")
# ट्रांसफ़ॉर्मेशन की सूची दिखाएँ
info = f"""
✅ वीडियो सफलतापूर्वक प्रोसेस हो गया!
लागू किए गए ट्रांसफ़ॉर्मेशन:
• मेटाडेटा पूरी तरह हटा दिया गया
• रिज़ॉल्यूशन बदला गया
• फ़्रेमरेट बदला गया
• स्पीड बदली गई
• ऑडियो टेम्पो और पिच बदली गई
• शोर डाला गया
• ब्राइटनेस / कंट्रास्ट / सैचुरेशन बदला गया
• ह्यू शिफ्ट किया गया
• क्रॉप + पैड किया गया
• मिरर (हॉरिज़ॉन्टल / वर्टिकल)
• रैंडम ऑफ़सेट लगाया गया
• रिवर्स (आधा या पूरा)
• ब्लर लगाया गया
• कोडेक बदला गया
• कंटेनर बदला गया
• CRF / प्रीसेट बदला गया
• रैंडम फ़्रेम ड्रॉप
📁 आउटपुट फ़ाइल: {os.path.basename(final_output)}
📦 फ़ाइल आकार: {round(os.path.getsize(final_output) / (1024*1024), 2)} MB
"""
return info, final_output
else:
return "❌ प्रोसेसिंग विफल – आउटपुट फ़ाइल नहीं बनी।", None
# ===== Gradio Interface =====
def create_interface():
evader = UltimateVideoEvader()
with gr.Blocks(title="Video Fingerprint Evader", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🚀 Video Fingerprint Evader – Copyright Bypass Tool
इस टूल को Hugging Face Spaces पर डिप्लॉय किया गया है।
**कैसे काम करता है:**
1. कोई भी वीडियो अपलोड करें (MP4, AVI, MOV, MKV)
2. "Process Video" बटन दबाएँ
3. टूल 15+ ट्रांसफ़ॉर्मेशन लागू करेगा
4. आउटपुट वीडियो डाउनलोड करें – अब Content ID उसे पहचान नहीं पाएगा
> ⚠️ **यह केवल तकनीकी प्रयोग के लिए है – उपयोगकर्ता स्वयं उत्तरदायी होगा।**
""")
with gr.Row():
with gr.Column(scale=1):
input_video = gr.File(
label="📤 वीडियो अपलोड करें",
file_types=[".mp4", ".mkv", ".avi", ".mov", ".webm", ".flv"],
type="filepath"
)
process_btn = gr.Button("🔥 Process Video (Brutal Mode)", variant="primary")
clear_btn = gr.Button("🗑️ Clear All")
with gr.Column(scale=1):
output_video = gr.Video(label="📥 प्रोसेस्ड वीडियो", interactive=False)
status_text = gr.Textbox(label="📊 स्टेटस", lines=8, interactive=False)
with gr.Row():
gr.Markdown("""
### 🔧 ट्रांसफ़ॉर्मेशन की पूरी सूची:
- मेटाडेटा हटाना
- रिज़ॉल्यूशन स्केल (0.6x – 1.4x)
- फ़्रेमरेट बदलना (15–60 fps)
- स्पीड बदलना (0.8x – 1.3x)
- ऑडियो टेम्पो बदलना
- ऑडियो पिच शिफ्ट (±1 सेमीटोन)
- गाउसियन नॉइज़ (1–12 dB)
- ब्राइटनेस/कंट्रास्ट/सैचुरेशन
- ह्यू शिफ्ट (0–360°)
- क्रॉप + पैड (फ़्रेम रीफ़्रेम)
- हॉरिज़ॉन्टल/वर्टिकल मिरर
- रैंडम ऑफ़सेट (0–120 फ़्रेम)
- रिवर्स (आंशिक/पूर्ण)
- गाउसियन ब्लर
- कोडेक बदलना (H.264/H.265/VP9)
- कंटेनर बदलना (MP4/MKV/MOV)
- CRF/प्रीसेट बदलना
- रैंडम फ़्रेम ड्रॉप
""")
def process_video(file_path):
if file_path is None:
return "❌ कृपया पहले वीडियो अपलोड करें।", None
if not os.path.exists(file_path):
return "❌ फ़ाइल मौजूद नहीं है।", None
evader = UltimateVideoEvader()
status, output_path = evader.process_video(file_path)
return status, output_path
def clear_all():
return None, None, ""
process_btn.click(
process_video,
inputs=[input_video],
outputs=[status_text, output_video]
)
clear_btn.click(
clear_all,
inputs=[],
outputs=[input_video, output_video, status_text]
)
return demo
if __name__ == "__main__":
demo = create_interface()
demo.launch(debug=True)