diff --git a/webui.py b/webui.py index 1747a8b..c74146a 100644 --- a/webui.py +++ b/webui.py @@ -1,13 +1,16 @@ import gradio as gr from summarizer import load_document, setup_summarization_chain -from yt_summarizer import summarize_video +from yt_summarizer import summarize_video, check_link from translator import setup_translator_chain def summarize(url): - docs = load_document(url) - llm_chain = setup_summarization_chain() - result = llm_chain.run(docs) + if check_link(url): + result = summarize_video(url) + else: + docs = load_document(url) + llm_chain = setup_summarization_chain() + result = llm_chain.run(docs) return [result, gr.Button("🇹🇷 Translate ", visible=True)] @@ -16,25 +19,6 @@ def translate(text): result = llm_chain.run(text) return result -def update_ui(content_type): - if content_type == "Web": - # Set visibility for Web URL input to True and Video URL input to False - url_visibility = "" # Empty string signifies no change for a text box. - video_url_visibility = "" # Set video URL field to empty since it should be hidden. - btn_text = "Generate Summary" # Button text for generating summary from a web URL - elif content_type == "Video": - # Set visibility for Web URL input to False and Video URL input to True - url_visibility = "" # Set web URL field to empty since it should be hidden. - video_url_visibility = "" # Empty string signifies no change for a text box. - btn_text = "Summarize Video" # Button text for summarizing video content - else: - # Hide both inputs (unlikely to need this else, but just in case) - url_visibility = "" - video_url_visibility = "" - btn_text = "" # Clear the button text - - return url_visibility, video_url_visibility, btn_text - with gr.Blocks() as demo: gr.Markdown( """# Cobanov Web and Video Summarizer @@ -43,22 +27,18 @@ with gr.Blocks() as demo: with gr.Row(): with gr.Column(): - content_type = gr.Radio(choices=["Web", "Video"], label="Select Content Type", value="Web") - url = gr.Text(label="URL", placeholder="Enter URL here") - video_url = gr.Text(label="YouTube Video URL", placeholder="Enter YouTube video URL here", visible=False) btn_generate = gr.Button("Generate") summary = gr.Markdown(label="Summary") btn_translate = gr.Button(visible=False) - - content_type.change(update_ui, inputs=[content_type], outputs=[url, video_url, btn_generate]) gr.Examples( [ "https://cobanov.dev/haftalik-bulten/hafta-13", "https://bawolf.substack.com/p/embeddings-are-a-good-starting-point", + "https://www.youtube.com/watch?v=4pOpQwiUVXc", ], inputs=[url], ) @@ -71,9 +51,7 @@ with gr.Blocks() as demo: Repo: github.com/mertcobanov/easy-web-summarizer ```""" ) - btn_generate.click(lambda url, video_url: summarize(url) if url else summarize_video(video_url), - inputs=[url, video_url], - outputs=[summary, btn_translate]) + btn_generate.click(summarize, inputs=[url], outputs=[summary, btn_translate]) btn_translate.click(translate, inputs=[summary], outputs=[summary]) demo.launch() \ No newline at end of file diff --git a/yt_summarizer.py b/yt_summarizer.py index 428524b..ae74759 100644 --- a/yt_summarizer.py +++ b/yt_summarizer.py @@ -2,6 +2,7 @@ from langchain_community.document_loaders import YoutubeLoader from langchain.text_splitter import TokenTextSplitter from langchain_community.chat_models import ChatOllama from langchain.chains.summarize import load_summarize_chain +from langchain_core.prompts import PromptTemplate import re def check_link(link): @@ -24,8 +25,27 @@ def split_chunks(transcript): return chunks def yt_summarization_chain(): + prompt_template = PromptTemplate( + template="""As a professional summarizer specialized in video content, create a detailed and comprehensive summary of the YouTube video transcript provided. While crafting your summary, adhere to these guidelines: + 1. Capture the essence of the video, focusing on main ideas and key details. Ensure the summary is in-depth and insightful, reflecting any narrative or instructional elements present in the video. + + 2. Exclude any redundant expressions and non-critical details to enhance the clarity and conciseness of the summary. + + 3. Base the summary strictly on the transcript provided, avoiding assumptions or additions from external sources. + + 4. Present the summary in a well-structured paragraph form, making it easy to read and understand. + + 5. Conclude with "[End of Notes, Message #X]", where "X" is the sequence number of the summarizing request, to indicate the completion of the task. + + By adhering to this optimized prompt, you are expected to produce a clear, detailed, and audience-friendly summary that effectively conveys the core content and themes of the YouTube video. + + "{text}" + + DETAILED SUMMARY:""", + input_variables=["text"], + ) llm = ChatOllama(model="llama3") - summarize_chain = load_summarize_chain(llm=llm, chain_type="refine", verbose=True) + summarize_chain = load_summarize_chain(llm=llm, prompt=prompt_template, verbose=True) return summarize_chain def summarize_video(video_link): @@ -35,4 +55,4 @@ def summarize_video(video_link): sum_chain = yt_summarization_chain() result = sum_chain.run(chunks) - return result[0] \ No newline at end of file + return result \ No newline at end of file