2025-02-18 17:46:37 +01:00
|
|
|
#
|
|
|
|
# Copyright (c) 2025 Fedir Kovalov.
|
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, version 3.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful, but
|
|
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
# General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
|
|
|
2025-02-17 20:08:35 +01:00
|
|
|
import requests
|
|
|
|
from io import BytesIO
|
|
|
|
from PIL import Image, ImageTk
|
|
|
|
import tkinter as tk
|
|
|
|
import yt_dlp
|
|
|
|
import shadowtube.recommend as rec
|
|
|
|
import shadowtube.preprocess as prep
|
|
|
|
|
|
|
|
# kjdshfgklshdfjkglkadshf
|
|
|
|
|
|
|
|
import webbrowser
|
|
|
|
|
|
|
|
# List of 8 YouTube video IDs
|
|
|
|
video_ids = rec.recommend(
|
|
|
|
prep.sort_history(
|
|
|
|
prep.parse_database(
|
|
|
|
"/home/fedir/.var/app/io.freetubeapp.FreeTube/config/FreeTube/history.db"
|
|
|
|
)
|
|
|
|
),
|
|
|
|
verbose=True,
|
|
|
|
count=8,
|
|
|
|
)
|
|
|
|
|
|
|
|
print(video_ids)
|
|
|
|
|
|
|
|
|
|
|
|
def get_video_info(video_id):
|
|
|
|
"""Fetch the title and thumbnail URL of a YouTube video using yt_dlp."""
|
|
|
|
ydl_opts = {"quiet": True, "no_warnings": True, "extract_flat": True}
|
|
|
|
|
|
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
|
|
info = ydl.extract_info(
|
|
|
|
f"https://www.youtube.com/watch?v={video_id}", download=False
|
|
|
|
)
|
|
|
|
return info.get("title", "Title Not Found"), info.get("thumbnail", "")
|
|
|
|
|
|
|
|
|
|
|
|
def open_video(event, video_id):
|
|
|
|
"""Open the YouTube video in the default web browser when clicked."""
|
|
|
|
webbrowser.open(f"https://www.youtube.com/watch?v={video_id}")
|
|
|
|
|
|
|
|
|
|
|
|
def show_video_preview(video_id, row, col):
|
|
|
|
"""Fetch and display a video's title and thumbnail in a grid layout."""
|
|
|
|
title, thumbnail_url = get_video_info(video_id)
|
|
|
|
|
|
|
|
# Fetch thumbnail
|
|
|
|
response = requests.get(thumbnail_url)
|
|
|
|
if response.status_code == 200:
|
|
|
|
image_data = Image.open(BytesIO(response.content))
|
|
|
|
image_data = image_data.resize((200, 112)) # Resize for grid
|
|
|
|
photo = ImageTk.PhotoImage(image_data)
|
|
|
|
else:
|
|
|
|
photo = None
|
|
|
|
|
|
|
|
# Create thumbnail label (clickable)
|
|
|
|
thumbnail_label = tk.Label(root, image=photo, cursor="hand2")
|
|
|
|
thumbnail_label.image = photo # Keep reference
|
|
|
|
thumbnail_label.grid(row=row, column=col, padx=10, pady=10)
|
|
|
|
thumbnail_label.bind("<Button-1>", lambda event, v=video_id: open_video(event, v))
|
|
|
|
|
|
|
|
# Create title label (wrapped text)
|
|
|
|
title_label = tk.Label(
|
|
|
|
root, text=title, font=("Arial", 10, "bold"), wraplength=200, justify="center"
|
|
|
|
)
|
|
|
|
title_label.grid(row=row + 1, column=col, padx=10, pady=5)
|
|
|
|
|
|
|
|
|
|
|
|
# Create Tkinter window
|
|
|
|
root = tk.Tk()
|
|
|
|
root.title("YouTube Video Previews")
|
|
|
|
|
|
|
|
# Add all 8 videos in a 2x4 grid
|
|
|
|
for index, video_id in enumerate(video_ids):
|
|
|
|
row = (index // 4) * 2 # Every second row for the title
|
|
|
|
col = index % 4
|
|
|
|
show_video_preview(video_id, row, col)
|
|
|
|
|
|
|
|
root.mainloop()
|
|
|
|
|
|
|
|
|
|
|
|
# kjdhfglkjsdhfgkljhsdkfg
|