Files
plain-ub-overfork/app/plugins/files/pixeldrain.py
overspend1 8fe355ed0c Update README and alive command for @overspend1 fork
- Updated README title to show OVERSPEND1 FORK
- Changed maintainer credit to @overspend1
- Updated alive command to show @overspend1 as creator instead of Meliodas
2025-07-25 20:27:05 +02:00

325 lines
12 KiB
Python

import asyncio
import aiohttp
import time
from pathlib import Path
from ub_core.utils import Download, DownloadedFile, get_tg_media_details, progress
from app import BOT, Message, bot
class PixelDrain:
BASE_URL = "https://pixeldrain.com"
API_URL = f"{BASE_URL}/api"
def __init__(self):
self._session = None
async def get_session(self):
if self._session is None or self._session.closed:
self._session = aiohttp.ClientSession()
return self._session
async def close_session(self):
if self._session and not self._session.closed:
await self._session.close()
async def upload_file(self, file_path: Path, message_to_edit: Message = None):
"""Upload file to PixelDrain"""
session = await self.get_session()
try:
file_size = file_path.stat().st_size
uploaded = 0
if message_to_edit:
await message_to_edit.edit("📤 <b>Uploading to PixelDrain...</b>")
with open(file_path, 'rb') as f:
data = aiohttp.FormData()
data.add_field('file', f, filename=file_path.name)
async with session.post(f"{self.API_URL}/file", data=data) as response:
if response.status == 201:
result = await response.json()
file_id = result.get('id')
file_info = {
'id': file_id,
'name': result.get('name', file_path.name),
'size': result.get('size', file_size),
'views': result.get('views', 0),
'url': f"{self.BASE_URL}/u/{file_id}",
'direct_url': f"{self.BASE_URL}/api/file/{file_id}",
'delete_url': f"{self.BASE_URL}/api/file/{file_id}"
}
return file_info
else:
error_text = await response.text()
raise Exception(f"Upload failed: {response.status} - {error_text}")
except Exception as e:
raise Exception(f"PixelDrain upload error: {str(e)}")
async def get_file_info(self, file_id: str):
"""Get file information from PixelDrain"""
session = await self.get_session()
try:
async with session.get(f"{self.API_URL}/file/{file_id}/info") as response:
if response.status == 200:
return await response.json()
else:
raise Exception(f"Failed to get file info: {response.status}")
except Exception as e:
raise Exception(f"Error getting file info: {str(e)}")
async def download_file(self, file_id: str, download_dir: Path, message_to_edit: Message = None):
"""Download file from PixelDrain"""
session = await self.get_session()
try:
# Get file info first
file_info = await self.get_file_info(file_id)
file_name = file_info.get('name', f'pixeldrain_{file_id}')
file_size = file_info.get('size', 0)
download_path = download_dir / file_name
download_dir.mkdir(parents=True, exist_ok=True)
if message_to_edit:
await message_to_edit.edit(f"📥 <b>Downloading from PixelDrain...</b>\n<code>{file_name}</code>")
async with session.get(f"{self.API_URL}/file/{file_id}") as response:
if response.status == 200:
downloaded = 0
with open(download_path, 'wb') as f:
async for chunk in response.content.iter_chunked(8192):
f.write(chunk)
downloaded += len(chunk)
if message_to_edit and file_size > 0:
progress_percent = (downloaded / file_size) * 100
await progress(downloaded, file_size, message_to_edit,
f"Downloading from PixelDrain...\n{file_name}")
return DownloadedFile(file=download_path, size=file_size)
else:
raise Exception(f"Download failed: {response.status}")
except Exception as e:
raise Exception(f"PixelDrain download error: {str(e)}")
pixeldrain = PixelDrain()
@bot.add_cmd(cmd="pdup")
async def pixeldrain_upload(bot: BOT, message: Message):
"""
CMD: PDUP
INFO: Upload files to PixelDrain
USAGE:
.pdup [reply to media]
.pdup [url]
"""
response = await message.reply("🔄 <b>Processing upload request...</b>")
if not message.replied and not message.input:
await response.edit("❌ <b>No input provided!</b>\n\nReply to a media file or provide a URL.")
return
try:
dl_dir = Path("downloads") / str(time.time())
# Handle replied media
if message.replied and message.replied.media:
await response.edit("📥 <b>Downloading media from Telegram...</b>")
tg_media = get_tg_media_details(message.replied)
file_name = tg_media.file_name or f"file_{int(time.time())}"
file_path = dl_dir / file_name
dl_dir.mkdir(parents=True, exist_ok=True)
await message.replied.download(
file_name=file_path,
progress=progress,
progress_args=(response, "Downloading from Telegram...", file_path)
)
# Handle URL input
elif message.input:
url = message.input.strip()
if not url.startswith(('http://', 'https://')):
await response.edit("❌ <b>Invalid URL!</b>\nPlease provide a valid HTTP/HTTPS URL.")
return
await response.edit("📥 <b>Downloading from URL...</b>")
dl_obj = await Download.setup(
url=url,
dir=dl_dir,
message_to_edit=response
)
downloaded_file = await dl_obj.download()
file_path = downloaded_file.path
await dl_obj.close()
# Upload to PixelDrain
await response.edit("📤 <b>Uploading to PixelDrain...</b>")
file_info = await pixeldrain.upload_file(file_path, response)
# Cleanup
if file_path.exists():
file_path.unlink()
if dl_dir.exists() and not any(dl_dir.iterdir()):
dl_dir.rmdir()
# Format response
size_mb = file_info['size'] / (1024 * 1024)
result_text = f"✅ <b>Successfully uploaded to PixelDrain!</b>\n\n"
result_text += f"📁 <b>File:</b> <code>{file_info['name']}</code>\n"
result_text += f"📊 <b>Size:</b> {size_mb:.2f} MB\n"
result_text += f"🆔 <b>ID:</b> <code>{file_info['id']}</code>\n"
result_text += f"👁 <b>Views:</b> {file_info['views']}\n\n"
result_text += f"🔗 <b>Share URL:</b>\n<code>{file_info['url']}</code>\n\n"
result_text += f"📎 <b>Direct URL:</b>\n<code>{file_info['direct_url']}</code>"
await response.edit(result_text)
except Exception as e:
await response.edit(f"❌ <b>Upload failed!</b>\n\n<code>{str(e)}</code>")
finally:
await pixeldrain.close_session()
@bot.add_cmd(cmd="pddl")
async def pixeldrain_download(bot: BOT, message: Message):
"""
CMD: PDDL
INFO: Download files from PixelDrain
USAGE:
.pddl [pixeldrain_url_or_id]
"""
response = await message.reply("🔄 <b>Processing download request...</b>")
if not message.input:
await response.edit("❌ <b>No input provided!</b>\n\nProvide a PixelDrain URL or file ID.")
return
try:
input_text = message.input.strip()
# Extract file ID from URL or use direct ID
if 'pixeldrain.com' in input_text:
if '/u/' in input_text:
file_id = input_text.split('/u/')[-1].split('?')[0]
elif '/api/file/' in input_text:
file_id = input_text.split('/api/file/')[-1].split('/')[0]
else:
await response.edit("❌ <b>Invalid PixelDrain URL!</b>\n\nUse format: https://pixeldrain.com/u/[file_id]")
return
else:
file_id = input_text
# Validate file ID
if not file_id or len(file_id) < 8:
await response.edit("❌ <b>Invalid file ID!</b>\n\nFile ID should be at least 8 characters long.")
return
# Download file
dl_dir = Path("downloads") / str(time.time())
downloaded_file = await pixeldrain.download_file(file_id, dl_dir, response)
# Send file back to user
with open(downloaded_file.path, 'rb') as f:
await message.reply_document(
document=f,
file_name=downloaded_file.path.name,
caption=f"📥 <b>Downloaded from PixelDrain</b>\n\n"
f"🆔 <b>File ID:</b> <code>{file_id}</code>\n"
f"📊 <b>Size:</b> {downloaded_file.size / (1024 * 1024):.2f} MB"
)
await response.delete()
# Cleanup
if downloaded_file.path.exists():
downloaded_file.path.unlink()
if dl_dir.exists() and not any(dl_dir.iterdir()):
dl_dir.rmdir()
except Exception as e:
await response.edit(f"❌ <b>Download failed!</b>\n\n<code>{str(e)}</code>")
finally:
await pixeldrain.close_session()
@bot.add_cmd(cmd="pdinfo")
async def pixeldrain_info(bot: BOT, message: Message):
"""
CMD: PDINFO
INFO: Get information about a PixelDrain file
USAGE:
.pdinfo [pixeldrain_url_or_id]
"""
response = await message.reply("🔄 <b>Fetching file information...</b>")
if not message.input:
await response.edit("❌ <b>No input provided!</b>\n\nProvide a PixelDrain URL or file ID.")
return
try:
input_text = message.input.strip()
# Extract file ID from URL or use direct ID
if 'pixeldrain.com' in input_text:
if '/u/' in input_text:
file_id = input_text.split('/u/')[-1].split('?')[0]
elif '/api/file/' in input_text:
file_id = input_text.split('/api/file/')[-1].split('/')[0]
else:
await response.edit("❌ <b>Invalid PixelDrain URL!</b>")
return
else:
file_id = input_text
# Get file info
file_info = await pixeldrain.get_file_info(file_id)
# Format file size
size_bytes = file_info.get('size', 0)
if size_bytes > 1024 * 1024 * 1024:
size_str = f"{size_bytes / (1024 * 1024 * 1024):.2f} GB"
elif size_bytes > 1024 * 1024:
size_str = f"{size_bytes / (1024 * 1024):.2f} MB"
elif size_bytes > 1024:
size_str = f"{size_bytes / 1024:.2f} KB"
else:
size_str = f"{size_bytes} B"
# Format upload date
upload_date = file_info.get('date_upload', 'Unknown')
if upload_date != 'Unknown':
upload_date = upload_date.replace('T', ' ').split('.')[0]
info_text = f"📋 <b>PixelDrain File Information</b>\n\n"
info_text += f"🆔 <b>ID:</b> <code>{file_id}</code>\n"
info_text += f"📁 <b>Name:</b> <code>{file_info.get('name', 'Unknown')}</code>\n"
info_text += f"📊 <b>Size:</b> {size_str}\n"
info_text += f"🎭 <b>MIME:</b> <code>{file_info.get('mime_type', 'Unknown')}</code>\n"
info_text += f"👁 <b>Views:</b> {file_info.get('views', 0)}\n"
info_text += f"📅 <b>Uploaded:</b> {upload_date}\n\n"
info_text += f"🔗 <b>Share URL:</b>\n<code>https://pixeldrain.com/u/{file_id}</code>\n\n"
info_text += f"📎 <b>Direct URL:</b>\n<code>https://pixeldrain.com/api/file/{file_id}</code>"
await response.edit(info_text)
except Exception as e:
await response.edit(f"❌ <b>Failed to get file info!</b>\n\n<code>{str(e)}</code>")
finally:
await pixeldrain.close_session()