video-stream/program/video.py
levina 5c9e12eca4
prepare
not finished yet
2021-10-26 12:58:34 +07:00

228 lines
8.8 KiB
Python

import os
import re
import asyncio
from pyrogram import Client
from pyrogram import filters
from pytgcalls import StreamType
from pyrogram.types import Message
from driver.filters import command
from youtubesearchpython import VideosSearch
from program.queues import QUEUE, add_to_queue
from config import contact_filter, BOT_USERNAME
from pytgcalls.types.input_stream import AudioVideoPiped
from pytgcalls.types.input_stream.quality import HighQualityAudio, MediumQualityAudio
from pytgcalls.types.input_stream.quality import HighQualityVideo, MediumQualityVideo, LowQualityVideo
def ytsearch(query):
try:
search = VideosSearch(query, limit=1)
for r in search.result()["result"]:
ytid = r['id']
if len(r['title']) > 34:
songname = r['title'][:35] + "..."
else:
songname = r['title']
url = f"https://www.youtube.com/watch?v={ytid}"
return [songname, url]
except Exception as e:
print(e)
return 0
async def ytdl(link):
proc = await asyncio.create_subprocess_exec(
'youtube-dl',
'-g',
'-f',
'best[height<=?720][width<=?1280]',
f'{link}',
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout, stderr = await proc.communicate()
if stdout:
return 1, stdout.decode().split('\n')[0]
else:
return 0, stderr.decode()
@Client.on_message(command(["vplay", f"vplay@{BOT_USERNAME}"]) & other_filters)
async def vplay(client, m: Message):
replied = m.reply_to_message
chat_id = m.chat.id
if replied:
if replied.video or replied.document:
loser = await replied.reply("📥 **downloading video...**")
dl = await replied.download()
link = replied.link
if len(m.command) < 2:
Q = 720
else:
pq = m.text.split(None, 1)[1]
if pq == "720" or "480" or "360":
Q = int(pq)
else:
Q = 720
await loser.edit("» __only 720, 480, 360 allowed__ \n💡 **now streaming video in 720p**")
if replied.video:
songname = replied.video.file_name[:35] + "..."
elif replied.document:
songname = replied.document.file_name[:35] + "..."
if chat_id in QUEUE:
pos = add_to_queue(chat_id, songname, dl, link, "Video", Q)
await loser.edit(f"💡 **Track added to the queue**\n🔢 At position » `{pos}`")
else:
if Q==720:
amaze = HighQualityVideo()
elif Q==480:
amaze = MediumQualityVideo()
elif Q==360:
amaze = LowQualityVideo()
await call_py.join_group_call(
chat_id,
AudioVideoPiped(
dl,
HighQualityAudio(),
amaze
),
stream_type=StreamType().pulse_stream,
)
add_to_queue(chat_id, songname, dl, link, "Video", Q)
await loser.edit(f"💡 **video streaming is started.**\n\n🏷 **Name:** [{songname}]({link})\n💬 **Chat:** `{chat_id}`", disable_web_page_preview=True)
else:
if len(m.command) < 2:
await m.reply("» reply to an **audio file** or **give something to search.**")
else:
loser = await m.reply("🔎 **searching...**")
query = m.text.split(None, 1)[1]
search = ytsearch(query)
Q = 720
amaze = HighQualityVideo()
if search==0:
await loser.edit("❌ **no results found.**")
else:
songname = search[0]
url = search[1]
veez, ytlink = await ytdl(url)
if veez==0:
await loser.edit(f"❌ youtube-dl issues detected\n\n» `{ytlink}`")
else:
if chat_id in QUEUE:
pos = add_to_queue(chat_id, songname, ytlink, url, "Video", Q)
await loser.edit(f"💡 **Track added to the queue**\n🔢 At position » `{pos}`")
else:
try:
await call_py.join_group_call(
chat_id,
AudioVideoPiped(
ytlink,
HighQualityAudio(),
amaze
),
stream_type=StreamType().pulse_stream,
)
add_to_queue(chat_id, songname, ytlink, url, "Video", Q)
await loser.edit(f"💡 **video streaming is started.**\n\n🏷 **Name:** [{songname}]({link})\n💬 **Chat:** `{chat_id}`", disable_web_page_preview=True)
except Exception as ep:
await loser.edit(f"❌ issues: `{ep}`")
else:
if len(m.command) < 2:
await m.reply("» reply to an **audio file** or **give something to search.**")
else:
loser = await m.reply("🔎 **searching...**")
query = m.text.split(None, 1)[1]
search = ytsearch(query)
Q = 720
amaze = HighQualityVideo()
if search==0:
await loser.edit("❌ **no results found.**")
else:
songname = search[0]
url = search[1]
veez, ytlink = await ytdl(url)
if veez==0:
await loser.edit(f"❌ youtube-dl issues detected\n\n» `{ytlink}`")
else:
if chat_id in QUEUE:
pos = add_to_queue(chat_id, songname, ytlink, url, "Video", Q)
await loser.edit(f"💡 **Track added to the queue**\n🔢 At position » `{pos}`")
else:
try:
await call_py.join_group_call(
chat_id,
AudioVideoPiped(
ytlink,
HighQualityAudio(),
amaze
),
stream_type=StreamType().pulse_stream,
)
add_to_queue(chat_id, songname, ytlink, url, "Video", Q)
await loser.edit(f"💡 **video streaming is started.**\n\n🏷 **Name:** [{songname}]({url})\n💬 **Chat:** `{chat_id}`", disable_web_page_preview=True)
except Exception as ep:
await loser.edit(f"❌ issues: `{ep}`")
@Client.on_message(command(["vstream", f"vstream@{BOT_USERNAME}"]) & other_filters)
async def vstream(client, m: Message):
chat_id = m.chat.id
if len(m.command) < 2:
await m.reply("» give me a live-link/m3u8 url/youtube link to stream.")
else:
if len(m.command)==2:
link = m.text.split(None, 1)[1]
Q = 720
loser = await m.reply("🔄 **processing stream...**")
elif len(m.command)==3:
op = m.text.split(None, 1)[1]
link = op.split(None, 1)[0]
quality = op.split(None, 1)[1]
if quality == "720" or "480" or "360":
Q = int(quality)
else:
Q = 720
await m.reply("» __only 720, 480, 360 allowed__ \n💡 **now streaming video in 720p**")
loser = await m.reply("🔄 **processing stream...**")
else:
await m.reply("**/vstream {link} {720/480/360}**")
regex = r"^(https?\:\/\/)?(www\.youtube\.com|youtu\.?be)\/.+"
match = re.match(regex,link)
if match:
veez, livelink = await ytdl(link)
else:
livelink = link
veez = 1
if veez==0:
await loser.edit(f"❌ youtube-dl issues detected\n\n» `{ytlink}`")
else:
if chat_id in QUEUE:
pos = add_to_queue(chat_id, "Live Stream", livelink, link, "Video", Q)
await loser.edit(f"💡 **Track added to the queue**\n🔢 At position » `{pos}`")
else:
if Q==720:
amaze = HighQualityVideo()
elif Q==480:
amaze = MediumQualityVideo()
elif Q==360:
amaze = LowQualityVideo()
try:
await call_py.join_group_call(
chat_id,
AudioVideoPiped(
livelink,
HighQualityAudio(),
amaze
),
stream_type=StreamType().pulse_stream,
)
add_to_queue(chat_id, "Live Stream", livelink, link, "Video", Q)
await loser.edit(f"💡 **video [live stream]({link}) is started.**\n💬 chat: `{chat_id}`", disable_web_page_preview=True)
except Exception as ep:
await loser.edit(f"❌ issues: `{ep}`")