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='') 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()