Commit Graph

1496 Commits (acf4169c79c169ca3957969e8e3fd2cc3b01becb)
 

Author SHA1 Message Date
Mike Lang c84b2254ee sheetsync: Streamlog middleware for playlists 4 months ago
Mike Lang e9b6e27598 sheetsync: Make the middleware interface explicit with a base class
The main purpose here is just documentation, so it's clear what the semantics of a middleware is.
4 months ago
Mike Lang 3ffbefea4f sheetsync: Split SheetsMiddleware into a common base class and events specific 4 months ago
Mike Lang bebce3df4c sheetsync: Only consider a row missing if we did a full sync
This prevents things being spuriously missing because they were in a worksheet we didn't sync.
4 months ago
Mike Lang 3cdd8f22ad Split SheetSync object to be fully generic and have an EventsSync object for events 4 months ago
Mike Lang 6a9884ee5b sheetsync: Move extra metrics columns into a variable 4 months ago
Mike Lang 37dd7c3e4f sheetsync: Move various config fields to be defined on the class object
Also make the columns lists into sets
4 months ago
Mike Lang 5559dffec6 sheetsync: pull metric gathering into a seperate function 4 months ago
Mike Lang 37f42853ec sheetsync: Extract db table name into a variable
So we can swap it out for playlists later
4 months ago
Mike Lang 00d0ecc3bb sheetsync: Handle sheet_name as an input column to avoid special casing
sheet_name must always be present on a sheet row, but is only present on a db row
if the db actually stores that data.

As a side benefit, the db will now update if sheet_name changes.
4 months ago
Mike Lang 2db20d202b sheetsync: Update streamlog middleware for section -> tab rename 4 months ago
Mike Lang 9fb356bf45 sheetsync: Better error handling for running out of space when creating rows 4 months ago
Mike Lang 29ff11457e sheetsync: Namespace all logs and metrics behind a sheetsync "name"
This helps differentiate the multiple syncs we now have and will have:
- syncing events from streamlog
- reverse syncing events to sheets
- syncing playlists
4 months ago
Mike Lang 87b504a00a sheetsync: Rename "row" and "event" to "sheet_row" and "db_row"
First step to combining event and playlist sync into one codepath.

No actual behaviour changes intended.
4 months ago
Mike Lang 20ee79cdb1 Get sheets working again 4 months ago
Mike Lang f89ab6fa43 Don't make sheet name an input column, go back to special casing it on row create
This means it won't update if put in the wrong place,
but avoids issues with reverse sync trying to write it out when it's not an actual column
4 months ago
Mike Lang 430938dc49 error is always a string, it just might be empty 4 months ago
Mike Lang f8d3eb7f00 wip: 4 months ago
Mike Lang ee4a68af50 clear up confusion with empty string vs None 4 months ago
Mike Lang 3e873ca5f6 wip: fixes 4 months ago
Mike Lang eebfa5885b sheetsync: pass in event id instead of event name 4 months ago
Mike Lang cf41f572f5 Fix streamlog formatting 4 months ago
Mike Lang db3a779292 docker-compose: Allow setting up sheetsync for sheets or streamlog 4 months ago
Mike Lang 986a1db964 sheetsync: Change how options are specified to allow multiple backends / syncs 4 months ago
Mike Lang 74869de89d Implement reverse sync mode
This is a mode where all data flows one-way from the database to the sheet.
It is intended to be used to populate an empty sheet from database events,
possibly sourced from somewhere else.

To make this work, a few changes were required:
* Track which ids we've seen so we know what events were not matched with a row
* Allow `row` to be None in sync_rows
* When it is, call the middleware to create a new row with a new id
* In sheets, this is implemented by tracking the last empty rows we saw, and claiming them as needed.
4 months ago
Mike Lang 85de9757f7 sheetsync: Remove pick_worksheets() from middleware api
Instead, get_rows() makes that decision internally if needed.
4 months ago
Mike Lang 17463d70fe sheetsync: Remove worksheet from middleware apis
since it's now baked into the row dict
4 months ago
Mike Lang eec58f2651 sheetsync: Always have sheet name as part of row dict 4 months ago
Mike Lang fa9a4b70bb bugfix 4 months ago
Mike Lang ca3f92c0b6 sheetsync: Use streamlog section instead of deriving day from start time 4 months ago
Mike Lang 071cd29f4d sheetsync: Implement Streamlog middleware 4 months ago
Mike Lang d064522d60 sheetsync: Move edit url management into Sheets middleware
As streamlog doesn't require it.
4 months ago
Mike Lang be111ccb2a Change database primary key from UUID to TEXT
We still store uuids, but in text form.
This allows us to store non-UUID ids for systems that have other ids.
4 months ago
Mike Lang 72f7c59a77 Sheetsync: Split into the main loop logic + sheets-specific middleware
NOTE ON CONFLICTS

In master, we moved sheets.py to common as it only contained a generic client.
Now sheets.py also contains specific sheetsync stuff.

Our resolution:
- Keep the generic version in common
- Keep the old version verbatim (including the now-redundant generic client) in sheetsync

We will move the sheetsync implementation to the generic client after the rebase is complete.
4 months ago
Mike Lang 0e5bf1a0fe sheetsync: Split playlist runloop from normal sheets 4 months ago
Mike Lang a16259e892 sheetsync: Move id allocation out of sync_row() 4 months ago
Mike Lang 256e0f7ba1 sheetsync: Move row_index variable into row dict 4 months ago
Mike Lang c5c9075f9e Basic streamlog api 4 months ago
Mike Lang c2d2f4b85c Revert "sheetsync: Support archive sheet"
This reverts commit b93597c274.
4 months ago
Mike Lang 4c87ad6735 Revert "sheetsync: unmapped columns aren't a problem."
This reverts commit 5256577d00.
4 months ago
Mike Lang 9dec3cb729 Allow the youtube-manual upload backend to modify videos
So we can modify youtube videos we manually uploaded.
If the video isn't actually ours, it will error when the modify is attempted which is ok.
4 months ago
Mike Lang 49dd25c0fa playlist_manager: Improved handling of playlist outdated errors
By restarting the update immediately instead of waiting for the next one.
We only try this up to 3 times to prevent excessive quota usage if it keeps happening.
4 months ago
Mike Lang 90a6b5ee17 playlist_manager: Check for re-orderings without doing them initially
Previously, we would only do reorderings if we were refreshing the playlist
for some other reason (eg. a video was inserted).

We want to refresh the playlist before attempting reorderings,
so we split the routine into two parts:
- A part that finds out-of-order videos and returns a list of moves to make.
- A part that executes those moves.

We do the former before AND after refreshing, and the latter only with the result from after.
4 months ago
Mike Lang 0a55a74efd playlist_manager: Reorder first/last videos when needed 4 months ago
Mike Lang ce8e7bb3b4 playlist_manager: Make a specialized error for api requests
So we can easily check the status code.
4 months ago
Mike Lang a802cbb1d2 playlist_manager: Sort first/last videos correctly
In addition to sorting the videos themselves into the correct spots,
we need to special case them when scanning for the correct place to insert other videos.

Note this only places them in the correct place on insert,
which requires they be set in the playlist config BEFORE being inserted.

A follow-up commit will handle the case of needing to re-order them post insert.
4 months ago
Mike Lang fae5267941 playlist_manager: Fetch first/last event info when fetching playlists
And switch to passing around a namedtuple of these + tags instead of just tags.

To avoid confusion with the list of videos in the playlist, we refer to this data as the "playlist config".
4 months ago
Mike Lang 115fd8bba3 schema: Add first and last event ids to playlist table
These represent a pinned first/last video in a playlist.
On the choice of a video id vs an event id:
- Event ids are known before video ids, so we can "set and forget" before a video is uploaded
- No need to re-set if an event's video is re-edited or changed
- In cases where an external video is desired, we can use manual link to associate an event with it

Since we're referencing a primary key, we might as well also make it a proper foreign key
with sensible delete behaviour, though in practice we never delete events.
4 months ago
Mike Lang e9281e652c playlist_manager: Cache playlist entry IDs along with video IDs
This is required in order to be able to move entries later.
Note our view of entry IDs may always be out of date, so any time you use one
you have to handle it no longer existing.
4 months ago
Mike Lang 8c1a8e717e playlist_manager: Wrap lookups of playlist_state into a function
This prevents accidents where we do a simple lookup instead of a .get()
4 months ago