Netmirror / app.py
shethjenil's picture
Update app.py
733d3b8 verified
import gradio as gr
import m3u8
import requests
from urllib.parse import urlparse, parse_qs
def generate_gallery(user_text):
data = requests.get('https://net52.cc/pv/search.php', {'s': user_text}).json()['searchResult']
return [f'https://imgcdn.kim/pv/341/{item["id"]}.jpg' for item in data], data
def on_image_click(evt: gr.SelectData, data):
item = data[evt.index]
return item['t'], item['y'], item['r'] if item['r'] != "Series" else "", item['id'], item['r'] == "Series"
def get_data(id):
return requests.get('https://net52.cc/pv/post.php', {'id': id}).json() if id else {}
def get_video_data(id):
if not id:
return gr.Dropdown(choices=[]), {}
res = requests.get('https://net52.cc/pv/playlist.php', {'id': id}).json()[0]
in_data = parse_qs(urlparse(res['sources'][0]['file']).query)['in'][0]
data = {
"subtitle": [i['label'] for i in res.get('tracks', [])],
"quality": {i.stream_info.resolution[1]: i.uri for i in m3u8.load(f'https://net52.cc/pv/hls/{id}.m3u8?in={in_data}').playlists}
}
q = list(data['quality'].keys())
print(data)
return gr.Dropdown(choices=q, value=q[0] if q else None), data
def on_quality_change(quality, video_state):
if not video_state or not quality: # Bug fix: None check
return ""
return video_state['quality'].get(quality, "")
with gr.Blocks() as demo:
input_text = gr.Textbox(
label="Search",
placeholder="Movie / Series naam likho"
)
btn = gr.Button("Search")
gallery = gr.Gallery(
label="Results",
columns=4,
height=300
)
title_box = gr.Textbox(label="Title")
year_box = gr.Textbox(label="Year")
duration_box = gr.Textbox(label="Duration")
is_series_box = gr.Checkbox(label="This is Series")
get_data_btn = gr.Button("Get Data")
json_box = gr.JSON(label="JSON")
html_box = gr.HTML(html_template='<video src="${value}" controls></video>')
dropdown = gr.Dropdown()
get_movie = gr.Button("Get Movie")
data_state = gr.State()
id_state = gr.State()
video_state = gr.State()
btn.click(generate_gallery, input_text, [gallery, data_state])
get_data_btn.click(get_data, id_state, json_box)
get_movie.click(get_video_data, id_state, [dropdown, video_state])
dropdown.change(on_quality_change, [dropdown, video_state], html_box)
gallery.select(on_image_click, data_state, [title_box, year_box, duration_box, id_state, is_series_box])
gallery.preview_close(lambda: ('', '', '', '', False, {}), outputs=[title_box, year_box, duration_box, id_state, is_series_box, json_box])
demo.launch()