Нужна помощь по питону на тему 'YouTube клиент'

Я сделал свой YouTube клиент но есть одно но. Когда я просматриваю список у меня только эти 3 пункта:

Смотреть на YouTube,
Аудио режим,
Сменить зеркало Invidious

но мне надо вместо этого имя видео и его превью при наведении на имя видео.

Вот код:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import os
import sqlite3
from pyfzf.pyfzf import FzfPrompt
from os.path import exists
from urllib.parse import urlparse  # Для проверки URL
import pygetwindow as gw  # Импортируем pygetwindow
from selenium.common.exceptions import TimeoutException

print("Загрузка...5 секунд....")

def minimize_window():
    window_title = "Mozilla Firefox"  # Или "Firefox" в зависимости от локализации
    try:
        window = gw.getWindowsWithTitle(window_title)[0]
        window.minimize()  # Свернуть окно
    except IndexError:
        print("Окно Firefox не найдено.")

# Настройки для запуска Firefox в фоновом режиме
options = Options()
options.headless = False  # Запуск в фоновом режиме
driver = webdriver.Firefox(options=options)
minimize_window()
fzf = FzfPrompt()


def is_valid_url(url):
    parsed = urlparse(url)
    return parsed.scheme in ('http', 'https')


def search():
    sear = input("Введите то, что вы хотите найти: ")
    print("Начинаю поиск " + sear)

    search_url = f"https://yewtu.be/search?q={sear.replace(' ', '%20')}"
    driver.get(search_url)

    try:
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "a[href*='/watch']"))
        )
        print("Страница с результатами поиска загружена!")
    except TimeoutException:
        print("Ошибка: Страница не загрузилась в течение 20 секунд.")
        return

    video_details_list = []
    videos = driver.find_elements(By.CSS_SELECTOR, "a[href*='/watch']")

    # Извлекаем информацию о каждом видео
    for video in videos:
        video_name = video.get_attribute("title")
        if video_name:
            video_url = video.get_attribute('href')
            video_image = video.find_element(By.XPATH, ".//img").get_attribute("src")

            # Ищем описание, если оно доступно
            description = video.find_element(By.XPATH, "..//yt-formatted-string[contains(@class, 'description')]").text

            # Формируем строку для выбора через `fzf`
            video_info = f"{video_name}\nОписание: {description}\nURL: {video_url}\nПревью: {video_image}"
            video_details_list.append(video_info)

    if not video_details_list:
        print("Нет результатов поиска.")
        return

    # Выбор видео с дополнительной информацией
    target_video_info = fzf.prompt(video_details_list)[0]

    # Найдём URL выбранного видео
    for video in videos:
        video_name = video.get_attribute("title")
        video_url = video.get_attribute('href')
        if target_video_info.startswith(video_name):
            comand = "mpv " + video_url
            os.system(comand)
            break


def func():
    db = sqlite3.connect('Chanelll.db')
    db.row_factory = lambda cursor, row: row[0]
    c = db.cursor()
    ids = c.execute('SELECT NAME FROM Chanelll').fetchall()
    ids.append("ПОИСК+++")

    target_chanel = fzf.prompt(ids)
    print(target_chanel[0])
    vibor = target_chanel[0]

    if vibor == "ПОИСК+++":
        search()
    else:
        nomber_chanel = ids.index(target_chanel[0])
        url = f[nomber_chanel]

        if is_valid_url(url):  # Проверка URL перед загрузкой
            driver.get(url)
        else:
            print(f"Неверный URL: {url}")
            return

        time.sleep(2)
        spisokNAME = []
        video_elements = driver.find_elements(By.CSS_SELECTOR, "a[href*='/watch']")

        # Извлекаем только названия видео
        for video in video_elements:
            video_name = video.get_attribute("title")
            if video_name:  # Проверка, что элемент имеет название
                spisokNAME.append(video_name)

        if not spisokNAME:
            print("Нет доступных видео.")
            return

        # Выбор видео по названию
        target_video = fzf.prompt(spisokNAME)[0]

        # Запускаем выбранное видео
        for video in video_elements:
            if video.get_attribute("title") == target_video:
                video_url = video.get_attribute('href')
                comand2 = "mpv --fs=yes " + video_url
                os.system(comand2)
                break



while True:
    kom = exists("Chanelll.db")
    with open('subscribe.txt') as file:
        f = [line.strip() for line in file if line.strip()]  # Удаляем пустые строки

    if kom:
        print("База каналов найдена!")
        db = sqlite3.connect('Chanelll.db')
        func()
    else:
        print("Генерируем базу каналов, это может занять некоторое время...")
        db = sqlite3.connect('Chanelll.db')
        cur = db.cursor()
        cur.execute("""CREATE TABLE IF NOT EXISTS Chanelll (
            ID INTEGER PRIMARY KEY,
            NAME TEXT,
            URL TEXT
        )""")

        db.commit()

        for url in f:
            if not is_valid_url(url):  # Проверка перед загрузкой
                print(f"Пропущен некорректный URL: {url}")
                continue

            driver.get(url)
            time.sleep(3)
            try:
                element2 = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located((By.CSS_SELECTOR, "h1"))
                )
                pre_canell = element2.text

                cur.execute("""INSERT INTO Chanelll(NAME, URL) VALUES (?,?);""", (pre_canell, url))
                db.commit()
                print(pre_canell + "  Добавлен в базу!  ")
            except Exception as e:
                print(f"Не удалось загрузить канал для {url}: {e}")
        func()

Вот таблица sqlite3 Chanelll.db:

ID NAME URL
1 Rozetked https://yewtu.be/channel/UCDF_NIAEkcAUvzxe1DUzaQA

Вот текстовый документ subscribe.txt:

https://yewtu.be/channel/UCDF_NIAEkcAUvzxe1DUzaQA

Пожалуйста помогите только те кто в этом шарит.


Ответы (0 шт):