71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"gitea.seeseepuff.be/seeseemelk/mysqlite"
|
|
"log"
|
|
)
|
|
|
|
func CalculateEpisodeNumbers(db *mysqlite.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.MustRollback()
|
|
|
|
query := `
|
|
select v.upload_date,
|
|
ifnull(
|
|
(select max(episode) from videos where upload_date = v.upload_date),
|
|
substr(upload_date, 6, 2) || substr(upload_date, 9, 2) || '00')
|
|
from videos v where episode is null group by upload_date
|
|
`
|
|
|
|
// Loop over each year and set the missing episode numbers
|
|
for row := range tx.Query(query).Range(&err) {
|
|
var uploadDate string
|
|
var lastEpisode int
|
|
err = row.Scan(&uploadDate, &lastEpisode)
|
|
log.Printf("Last episode for %s is %d", uploadDate, lastEpisode)
|
|
if err != nil {
|
|
return fmt.Errorf("error getting row: %w", err)
|
|
}
|
|
|
|
// Find all episodes that need updating
|
|
query := tx.Query("select id from videos where upload_date = ? and episode is null order by run, id desc").Bind(uploadDate)
|
|
|
|
// Update each episode
|
|
for episode := range query.Range(&err) {
|
|
var episodeId int
|
|
err = episode.Scan(&episodeId)
|
|
if err != nil {
|
|
return fmt.Errorf("error retrieving episode id: %w", err)
|
|
}
|
|
|
|
// Set the episode ID
|
|
lastEpisode++
|
|
err = tx.Query("update videos set episode = ? where id = ?").Bind(&lastEpisode, &episodeId).Exec()
|
|
if err != nil {
|
|
return fmt.Errorf("error updating episode id: %w", err)
|
|
}
|
|
}
|
|
if err != nil {
|
|
return fmt.Errorf("error retrieving episodes: %w", err)
|
|
}
|
|
}
|
|
if err != nil {
|
|
return fmt.Errorf("error fetching episodes: %w", err)
|
|
}
|
|
|
|
// Commit all changes
|
|
err = tx.Commit()
|
|
if err != nil {
|
|
return fmt.Errorf("error commiting changes: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|