Spaces:
Paused
Paused
| 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() |