From a99ff09e7dd3754827d8637a60eed8e6ebc9324e Mon Sep 17 00:00:00 2001 From: Sebastiaan de Schaetzen Date: Tue, 11 Feb 2025 13:42:58 +0100 Subject: [PATCH] Use month-day-count numbering system --- episodes.go | 18 ++++++++----- episodes_test.go | 54 ++++++++++++++++++++++----------------- migrations/2_renumber.sql | 1 + 3 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 migrations/2_renumber.sql diff --git a/episodes.go b/episodes.go index 8635971..b5fe929 100644 --- a/episodes.go +++ b/episodes.go @@ -16,23 +16,29 @@ func CalculateEpisodeNumbers(db *sql.DB) error { } defer tx.Rollback() - // First find all years that still need episodes numbers - rows, err := tx.Query("select v.year, max((select max(episode) from videos where year = v.year)) from videos v where episode is null group by year") + // First find all days that still need episodes numbers + rows, err := tx.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`) 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) - log.Printf("Last episode is %d", lastEpisode) + var uploadDate string + var lastEpisode int + err = rows.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 - episodes, err := tx.Query("select id from videos where year = ? and episode is null order by run, id desc", year) + episodes, err := tx.Query("select id from videos where upload_date = ? and episode is null order by run, id desc", uploadDate) if err != nil { return fmt.Errorf("error retrieving episodes: %w", err) } diff --git a/episodes_test.go b/episodes_test.go index 04492cc..ab569d2 100644 --- a/episodes_test.go +++ b/episodes_test.go @@ -11,7 +11,13 @@ func TestCalculateEpisodeNumbers(t *testing.T) { t.Error(err) } - _, err = db.Exec("insert into videos (title, url, year, episode, run) values ('Video A', 'a', 2025, 1, 1), ('Video B', 'b', 2025, null, 2), ('Old Video', 'c', 2020, 100, 1)") + _, err = db.Exec(`insert into videos (title, url, upload_date, year, episode, run) values + ('Video A', 'a', '2025-01-04', 2025, 10401, 1), + ('Video D', 'd', '2025-01-05', 2025, null, 2), + ('Video C', 'c', '2025-01-04', 2025, null, 2), + ('Video B', 'b', '2025-01-04', 2025, null, 2), + ('Video E', 'e', '2025-10-01', 2025, null, 3), + ('Old Video', 'z', '2020-12-31', 2020, 100, 1)`) if err != nil { t.Error(err) } @@ -26,31 +32,31 @@ func TestCalculateEpisodeNumbers(t *testing.T) { t.Error(err) } - var title string - var episode int - rows.Next() - err = rows.Scan(&title, &episode) - if err != nil { - t.Error(err) + expectedList := []struct { + Title string + Episode int + }{ + {"Video A", 10401}, + {"Video D", 10501}, + {"Video C", 10403}, + {"Video B", 10402}, + {"Video E", 100101}, } - if title != "Video A" { - t.Errorf("Title is %s, expected Video A", title) - } - if episode != 1 { - t.Errorf("Episode is %d, expected 1", episode) - } + for _, expected := range expectedList { + var title string + var episode int + rows.Next() + err = rows.Scan(&title, &episode) + if err != nil { + t.Error(err) + } - rows.Next() - err = rows.Scan(&title, &episode) - if err != nil { - t.Error(err) - } - - if title != "Video B" { - t.Errorf("Title is %s, expected Video B", title) - } - if episode != 2 { - t.Errorf("Episode is %d, expected 2", episode) + if title != expected.Title { + t.Errorf("Title is %s, expected %s", title, expected.Title) + } + if episode != expected.Episode { + t.Errorf("Episode is %d, expected %d for video %s", episode, expected.Episode, title) + } } } diff --git a/migrations/2_renumber.sql b/migrations/2_renumber.sql new file mode 100644 index 0000000..73ef63c --- /dev/null +++ b/migrations/2_renumber.sql @@ -0,0 +1 @@ +UPDATE videos SET episode=NULL, state='pending', cast=NULL;