Improve episode numbering system
All checks were successful
Build / build (push) Successful in 1m55s

This commit is contained in:
Sebastiaan de Schaetzen 2025-02-07 15:35:46 +01:00
parent f3c359d7a2
commit a27ca2c828
7 changed files with 94 additions and 20 deletions

View File

@ -43,10 +43,10 @@ func DownloadAllVideos(db *sql.DB) error {
log.Printf("Starting downloads...") log.Printf("Starting downloads...")
for { for {
// Fetch the next record from the database // Fetch the next record from the database
row := db.QueryRow("select id, url, `cast`, title, description, upload_date, thumbnail from videos where state = 'pending' order by id desc limit 1") row := db.QueryRow("select id, url, `cast`, title, description, upload_date, thumbnail, episode from videos where state = 'pending' and episode is not null order by year, episode limit 1")
var id int var id, episode int
var href, cast, title, description, uploadDateStr, thumbnailUrl string var href, cast, title, description, uploadDateStr, thumbnailUrl string
err = row.Scan(&id, &href, &cast, &title, &description, &uploadDateStr, &thumbnailUrl) err = row.Scan(&id, &href, &cast, &title, &description, &uploadDateStr, &thumbnailUrl, &episode)
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
log.Printf("No videos found for downloading") log.Printf("No videos found for downloading")
return nil return nil
@ -60,7 +60,7 @@ func DownloadAllVideos(db *sql.DB) error {
} }
// Download the actual video // Download the actual video
baseFileName := fmt.Sprintf("/s%de1%02d%02d", uploadDate.Year(), uploadDate.Month(), uploadDate.Day()) baseFileName := fmt.Sprintf("/S%dE%03d", uploadDate.Year(), episode)
log.Printf("Downloading %s", href) log.Printf("Downloading %s", href)
cmd := exec.Command("yt-dlp", cast, "-o", filepath.Join(tempDir, baseFileName+".%(ext)s")) cmd := exec.Command("yt-dlp", cast, "-o", filepath.Join(tempDir, baseFileName+".%(ext)s"))
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
@ -93,10 +93,10 @@ func DownloadAllVideos(db *sql.DB) error {
// Write XML sidecar // Write XML sidecar
nfo := NFO{} nfo := NFO{}
nfo.Aired = uploadDateStr
nfo.Plot = description nfo.Plot = description
nfo.Title = title nfo.Title = title
nfo.Year = uploadDate.Year() nfo.Year = uploadDate.Year()
nfo.Aired = uploadDate.Format(time.DateOnly)
nfoData, err := xml.MarshalIndent(nfo, "", " ") nfoData, err := xml.MarshalIndent(nfo, "", " ")
if err != nil { if err != nil {
return fmt.Errorf("error marshalling NFO data: %w", err) return fmt.Errorf("error marshalling NFO data: %w", err)

63
episodes.go Normal file
View File

@ -0,0 +1,63 @@
package main
import (
"database/sql"
"fmt"
"log"
)
func CalculateEpisodeNumbers(db *sql.DB) error {
log.Printf("Calculating episode numbers")
// Start a transaction
tx, err := db.Begin()
if err != nil {
return fmt.Errorf("error starting transaction: %w", err)
}
defer tx.Rollback()
// First find all years that still need episodes numbers
rows, err := tx.Query("select year, max(ifnull(episode, 0)) from videos where episode is null group by year")
if err != nil {
return fmt.Errorf("error retrieving rows: %w", err)
}
// Loop over each year and set the missing episode numbers
for rows.Next() {
var year, lastEpisode int
err = rows.Scan(&year, &lastEpisode)
if err != nil {
return fmt.Errorf("error getting row: %w", err)
}
// Find all episodes that need updating
episodes, err := tx.Query("select id from videos where year = ? and episode is null order by run, id desc", year)
if err != nil {
return fmt.Errorf("error retrieving episodes: %w", err)
}
// Update each episode
for episodes.Next() {
var episodeId int
err = episodes.Scan(&episodeId)
if err != nil {
return fmt.Errorf("error retrieving episode id: %w", err)
}
// Set the episode ID
lastEpisode++
_, err = tx.Exec("update videos set episode = ? where id = ?", &lastEpisode, &episodeId)
if err != nil {
return fmt.Errorf("error updating episode id: %w", err)
}
}
}
// Commit all changes
err = tx.Commit()
if err != nil {
return fmt.Errorf("error commiting changes: %w", err)
}
return nil
}

View File

@ -53,6 +53,11 @@ func main() {
panic(err) panic(err)
} }
err = CalculateEpisodeNumbers(db)
if err != nil {
panic(err)
}
err = DownloadAllVideos(db) err = DownloadAllVideos(db)
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -2,7 +2,15 @@ CREATE TABLE IF NOT EXISTS videos (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT, title TEXT,
url TEXT NOT NULL UNIQUE, url TEXT NOT NULL UNIQUE,
inserted_on DATETIME DEFAULT CURRENT_TIMESTAMP inserted_on TEXT DEFAULT CURRENT_TIMESTAMP,
upload_date TEXT,
cast TEXT,
description TEXT,
year INTEGER,
episode INTEGER,
run INTEGER,
state TEXT NOT NULL DEFAULT 'pending',
thumbnail TEXT
); );
INSERT INTO videos (url) values ('/supporters/videos/81886'); INSERT INTO videos (url, run, thumbnail) values ('/supporters/videos/81886', 0, 'https://imgproxy.fourthwall.com/ymbpbC7b9fO7tWlsg3e8sEdv8b3TuqXDGjr5FNM-uIg/rs:fill:607:342:0/sm:1/enc/N2U3ODcwN2I3Y2Iw/ZTZlYgoXdyrvsfaC/wje2R4f5TYcCwB4Y/ilNrHvoVDCjpBH8z/xnY0ho0FU6HlR9bX/Pk1pfFXOIFCqKnm6/2SKEU7hk5GgZTVXP/vDclApaRvgHzNXsF/pT8enEz076L7hSD-/0rENKD99989AC33R/5ZkKjg1ZZSc.webp');

View File

@ -1,3 +0,0 @@
ALTER TABLE videos ADD COLUMN upload_date TEXT;
ALTER TABLE videos ADD COLUMN cast TEXT;
ALTER TABLE videos ADD COLUMN description TEXT;

View File

@ -1,4 +0,0 @@
ALTER TABLE videos ADD COLUMN state TEXT NOT NULL DEFAULT 'pending';
ALTER TABLE videos ADD COLUMN thumbnail TEXT;
UPDATE videos SET thumbnail='https://imgproxy.fourthwall.com/ymbpbC7b9fO7tWlsg3e8sEdv8b3TuqXDGjr5FNM-uIg/rs:fill:607:342:0/sm:1/enc/N2U3ODcwN2I3Y2Iw/ZTZlYgoXdyrvsfaC/wje2R4f5TYcCwB4Y/ilNrHvoVDCjpBH8z/xnY0ho0FU6HlR9bX/Pk1pfFXOIFCqKnm6/2SKEU7hk5GgZTVXP/vDclApaRvgHzNXsF/pT8enEz076L7hSD-/0rENKD99989AC33R/5ZkKjg1ZZSc.webp' WHERE url = '/supporters/videos/81886';

View File

@ -108,11 +108,7 @@ func (w *WebClient) DiscoverAllVideos(db *sql.DB) error {
return fmt.Errorf("error opening page: %w", err) return fmt.Errorf("error opening page: %w", err)
} }
//page.Keyboard().Press("End")
//time.Sleep(3 * time.Second)
count, err := w.page.GetByTestId("VideoCatalog.Video").Count() count, err := w.page.GetByTestId("VideoCatalog.Video").Count()
//count, err := el.Count()
println(count, err) println(count, err)
println("Looping over videos...") println("Looping over videos...")
@ -122,6 +118,15 @@ func (w *WebClient) DiscoverAllVideos(db *sql.DB) error {
} }
defer tx.Rollback() defer tx.Rollback()
// Find the next run number
var currentRun int
row := tx.QueryRow("select max(run) from videos")
err = row.Scan(&currentRun)
if err != nil {
return fmt.Errorf("error retrieving current run: %w", err)
}
currentRun++
previousUrls := make(map[string]struct{}) previousUrls := make(map[string]struct{})
for { for {
@ -173,7 +178,7 @@ func (w *WebClient) DiscoverAllVideos(db *sql.DB) error {
// Insert it into the database // Insert it into the database
log.Printf("Adding video %s", href) log.Printf("Adding video %s", href)
_, err = tx.Exec("insert into videos(url, thumbnail) values (?, ?)", href, thumbnail) _, err = tx.Exec("insert into videos(url, thumbnail, run) values (?, ?, ?)", href, thumbnail, currentRun)
if err != nil { if err != nil {
return fmt.Errorf("error inserting into db: %w", err) return fmt.Errorf("error inserting into db: %w", err)
} }
@ -263,7 +268,7 @@ func (w *WebClient) FetchVideoMetadata(db *sql.DB) error {
return fmt.Errorf("error starting transaction: %w", err) return fmt.Errorf("error starting transaction: %w", err)
} }
defer tx.Rollback() defer tx.Rollback()
result, err := tx.Exec("update videos set title = ?, description = ?, cast = ?, upload_date = ? where id = ?", title, description, castSource, uploadDate.Format(time.DateOnly), id) result, err := tx.Exec("update videos set title = ?, description = ?, cast = ?, upload_date = ?, year = ? where id = ?", title, description, castSource, uploadDate.Format(time.DateOnly), uploadDate.Year(), id)
if err != nil { if err != nil {
return fmt.Errorf("error updating database: %w", err) return fmt.Errorf("error updating database: %w", err)
} }