Нужна помощь по питону на тему '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
Пожалуйста помогите только те кто в этом шарит.