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 }