DeepL Translator and display in real time. (Right window)

From the above, we have created a program that deepL translates YouTube Live chat and displays it in real time.
https://www.deepl.com/quality.html

translate_youtube_live_chat_gui.py
#Load the module.
import requests  #HTTP communication library
import tkinter  # Tcl/Tk Python interface
import time
#Load the function.
from tkinter import messagebox  #Create message box
from joblib import Parallel, delayed
from translator import deepl_translate  #DeepL Translator
# ======================================================================================================================
#Set the API URL.
YOUTUBE_API_VIDEO_URL = 'https://www.googleapis.com/youtube/v3/videos'  #YouTube video
YOUTUBE_API_CHAT_URL = 'https://www.googleapis.com/youtube/v3/liveChat/messages'  #YouTube chat
#Set the chat loading interval.(Note that if you make it too short, an error will occur.)
UPDATE_TIME = 5000  #millisecond
# ======================================================================================================================
#Performs processing when the button is clicked.
def click_button():
    #Get information from the GUI.
    youtube_live_url = edit_box1.get()  #YouTube Live URL
    youtube_api_key = edit_box2.get()  #YouTube API key
    deepl_api_key = edit_box3.get()  #DeepL API key
    target_lang = variable.get()  #Translated language
    #Get the video ID from the YouTube Live URL.
    video_id = youtube_live_url.replace('https://www.youtube.com/watch?v=', '')
    #Acquires the video data of the specified video ID.
    video_data = requests.get(
        YOUTUBE_API_VIDEO_URL, params={'key': youtube_api_key, 'id': video_id, 'part': 'liveStreamingDetails'}
    ).json()
    #If it is not YouTube Live, the process will be interrupted.
    if len(video_data['items']) == 0:
        messagebox.showerror('URL Error', 'Not Live')
        return  #Suspend processing.
    elif 'liveStreamingDetails' not in video_data['items'][0].keys():
        messagebox.showerror('URL Error', 'Not Live')
        return  #Suspend processing.
    elif 'activeLiveChatId' not in video_data['items'][0]['liveStreamingDetails'].keys():
        messagebox.showerror('URL Error', 'No Chat')
        return  #Suspend processing.
    #Get a chat ID.
    chat_id = video_data['items'][0]['liveStreamingDetails']['activeLiveChatId']
    #Add a message to the text box.
    add_message(chat_id, None, youtube_api_key, deepl_api_key, target_lang)  #Set the initial value of the page token to None.
#Add a message to the text box.
def add_message(chat_id, page_token, youtube_api_key, deepl_api_key, target_lang):
    #Cases are classified according to the presence or absence of pageToken. Avoid getting past chats.
    if type(page_token) == str:
        #Get the chat data of the specified chat ID.
        chat_data = requests.get(
            YOUTUBE_API_CHAT_URL,
            params={'key': youtube_api_key, 'liveChatId': chat_id, 'part': 'id,snippet,authorDetails',
                    'pageToken': page_token}
        ).json()
        #Record the time immediately after using the YouTube API.
        start_time = time.time()
        messages = []
        user_names = []
        for chat_item in chat_data['items']:  #Repeat as many times as there are chat items.
            #Create a message list.
            messages.append(chat_item['snippet']['displayMessage'])
            #Create a user name list.
            user_names.append(chat_item['authorDetails']['displayName'])
        #Translate with DeepL.
        trans_messages = Parallel(n_jobs=-1)(
            [delayed(deepl_translate)(message, target_lang, deepl_api_key) for message in messages]
        )
        for index, trans_message in enumerate(trans_messages):  #Repeat for the number of messages.
            #Get the user name.
            user_name = user_names[index]
            #Set the message to be displayed in the text box.
            display_message = '[' + user_name + '] ' + trans_message  # [username]+ Translated message
            #Add a message to the text box.
            txt_box.insert(tkinter.END, display_message)
            txt_box.insert(tkinter.END, '\n')
            txt_box.insert(tkinter.END, '\n')
        #Bring the scrollbar to the bottom.
        txt_box.see('end')
        #Update the window display.
        root.update()
    else:  #When pageToken is None
        #Get the chat data of the specified chat ID.
        chat_data = requests.get(
            YOUTUBE_API_CHAT_URL,
            params={'key': youtube_api_key, 'liveChatId': chat_id, 'part': 'id,snippet,authorDetails'}
        ).json()
        #Record the time immediately after using the YouTube API.
        start_time = time.time()
    #Update the page token.
    page_token = chat_data['nextPageToken']
    #Record the time just before using the YouTube API.
    end_time = time.time()
    #Calculate the time you are not using the YouTube API.
    elapsed_time_s = end_time - start_time  #Seconds
    elapsed_time_ms = round(elapsed_time_s * 1000)  #millisecond
    #Set the waiting time.
    wait_time = max({0, UPDATE_TIME - elapsed_time_ms})
    #Wait for the specified time.
    root.after(wait_time, add_message, chat_id, page_token, youtube_api_key, deepl_api_key, target_lang)
# ======================================================================================================================
#Create a window.
root = tkinter.Tk()
root.title('YouTube Live Chat DeepL Translator')
root.geometry('600x650')
root.resizable(False, False)
#Create a frame.
frame = tkinter.Frame(root)
frame.pack()
frame.place(x=0, y=70)
#Create a text box.
txt_box = tkinter.Text(frame, font=('Arial', 10), width=82, height=29)
y_scroll = tkinter.Scrollbar(frame, orient=tkinter.VERTICAL, command=txt_box.yview)  #Vertical scroll bar
y_scroll.pack(side=tkinter.RIGHT, fill='y')  #Vertical scroll bar
txt_box['yscrollcommand'] = y_scroll.set  #Vertical scroll bar
txt_box.pack()
#Create a button.
button = tkinter.Button(root, text='Start', font=('Arial', 15), command=click_button)
button.pack()
button.place(x=500, y=20)
#Create a label.
label1 = tkinter.Label(root, text='YouTube Live URL', font=('Arial', 12))
label1.pack()
label1.place(x=20, y=5)
#Create a label.
label2 = tkinter.Label(root, text='YouTube API Key', font=('Arial', 10))
label2.pack()
label2.place(x=140, y=590)
#Create a label.
label3 = tkinter.Label(root, text='DeepL API Key', font=('Arial', 10))
label3.pack()
label3.place(x=370, y=590)
#Create a label.
label4 = tkinter.Label(root, text='Target Language', font=('Arial', 10))
label4.pack()
label4.place(x=10, y=590)
#Create an edit box to enter the YouTube Live URL.
edit_box1 = tkinter.Entry(root, font=('Arial', 12), width=50)
edit_box1.pack()
edit_box1.place(x=20, y=30)
#Create an edit box to enter the YouTube API key.
edit_box2 = tkinter.Entry(root, font=('Arial', 10), width=30, show='*')
edit_box2.pack()
edit_box2.place(x=140, y=610)
#Create an edit box to enter the DeepL API key.
edit_box3 = tkinter.Entry(root, font=('Arial', 10), width=30, show='*')
edit_box3.pack()
edit_box3.place(x=370, y=610)
#Create a pull-down menu to select the translation language.
option_list = [
    'German',      # DE
    'English',     # EN
    'French',      # FR
    'Italian',     # IT
    'Japanese',    # JA
    'Spanish',     # ES
    'Dutch',       # NL
    'Polish',      # PL
    'Portuguese',  # PT
    'Russian',     # RU
    'Chinese'      # ZH
]
variable = tkinter.StringVar(root)
variable.set(option_list[4])  # JA
pull_down_menu = tkinter.OptionMenu(root, variable, *option_list)
pull_down_menu.config(width=10, font=('Arial', 10))
pull_down_menu.pack()
pull_down_menu.place(x=10, y=610)
#Draw a window.
root.mainloop()
translator.py
#Load the module.
import requests  #HTTP communication library
# ======================================================================================================================
#Set the URL of DeepL API.
DEEPL_API_URL = 'https://api.deepl.com/v2/translate'
# ======================================================================================================================
#Translate with DeepL.
def deepl_translate(src_text, target_lang, deepl_api_key):
    #Set the translation language code.
    if target_lang == 'German':
        target_lang_code = 'DE'
    elif target_lang == 'English':
        target_lang_code = 'EN'
    elif target_lang == 'French':
        target_lang_code = 'FR'
    elif target_lang == 'Italian':
        target_lang_code = 'IT'
    elif target_lang == 'Japanese':
        target_lang_code = 'JA'
    elif target_lang == 'Spanish':
        target_lang_code = 'ES'
    elif target_lang == 'Dutch':
        target_lang_code = 'NL'
    elif target_lang == 'Polish':
        target_lang_code = 'PL'
    elif target_lang == 'Portuguese':
        target_lang_code = 'PT'
    elif target_lang == 'Russian':
        target_lang_code = 'RU'
    elif target_lang == 'Chinese':
        target_lang_code = 'ZH'
    else:
        target_lang_code = None
    deepl_trans_result = requests.post(
        DEEPL_API_URL, data={"auth_key": deepl_api_key, "text": src_text, "target_lang": target_lang_code}
    ).json()
    trans_text = deepl_trans_result["translations"][0]["text"]
    return trans_text
        Recommended Posts