partially implement playlist links in video descriptions

We make them conceptually "part of the footer" so they're updated only when the video
is otherwise updated (which would generally mean MODIFIED).
pull/305/head
Mike Lang 2 years ago committed by Mike Lang
parent cae4976cf6
commit 34a33fdeb6

@ -144,8 +144,10 @@ CREATE TABLE editors (
-- Playlists are communicated to playlist manager via this table. -- Playlists are communicated to playlist manager via this table.
-- Sheetsync will wipe and re-populate this table periodically to match what is in the sheet -- Sheetsync will wipe and re-populate this table periodically to match what is in the sheet
CREATE TABLE playlists ( CREATE TABLE playlists (
playlist_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
tags TEXT[] NOT NULL, tags TEXT[] NOT NULL,
playlist_id TEXT PRIMARY KEY show_in_description BOOLEAN NOT NULL
); );
EOSQL EOSQL

@ -364,6 +364,11 @@ class SheetSync(object):
overwriting the entire playlists table""" overwriting the entire playlists table"""
playlists = [] playlists = []
for row in rows: for row in rows:
# TODO redo sheet parsing for new columns
# Defaults for now:
name = ""
show_in_description = false
if len(row) != 3: if len(row) != 3:
continue continue
tags, _, playlist_id = row tags, _, playlist_id = row
@ -373,7 +378,7 @@ class SheetSync(object):
playlist_id = playlist_id.strip() playlist_id = playlist_id.strip()
if len(playlist_id) != 34 or not playlist_id.startswith('PL'): if len(playlist_id) != 34 or not playlist_id.startswith('PL'):
continue continue
playlists.append((tags, playlist_id)) playlists.append((playlist_id, tags, name, show_in_description))
# We want to wipe and replace all the current entries in the table. # We want to wipe and replace all the current entries in the table.
# The easiest way to do this is a DELETE then an INSERT, all within a transaction. # The easiest way to do this is a DELETE then an INSERT, all within a transaction.
# The "with" block will perform everything under it within a transaction, rolling back # The "with" block will perform everything under it within a transaction, rolling back
@ -381,7 +386,7 @@ class SheetSync(object):
logging.info("Updating playlists table with {} playlists".format(len(playlists))) logging.info("Updating playlists table with {} playlists".format(len(playlists)))
with self.conn: with self.conn:
query(self.conn, "DELETE FROM playlists") query(self.conn, "DELETE FROM playlists")
execute_values(self.conn.cursor(), "INSERT INTO playlists(tags, playlist_id) VALUES %s", playlists) execute_values(self.conn.cursor(), "INSERT INTO playlists(playlist_id, tags, name, show_in_description) VALUES %s", playlists)
@argh.arg('dbconnect', help= @argh.arg('dbconnect', help=

@ -259,11 +259,46 @@ def update_row(ident, editor=None):
for extra in extras: for extra in extras:
del new_row[extra] del new_row[extra]
# Check a row with id = ident is in the database
conn = app.db_manager.get_conn()
built_query = sql.SQL("""
SELECT id, state, {}
FROM events
WHERE id = %s
""").format(sql.SQL(', ').join(
sql.Identifier(key) for key in sheet_columns
))
results = database.query(conn, built_query, ident)
old_row = results.fetchone()._asdict()
if old_row is None:
return 'Row {} not found'.format(ident), 404
assert old_row['id'] == ident
playlists = query(conn, """
SELECT playlist_id, name, tags
FROM playlists
WHERE show_in_description
""")
# Filter for matching playlists for this video
playlists = [
playlist for playlist in playlists
if all(
tag.lower() in [t.lower() for t in old_row['tags']]
for tag in playlist.tags
)
]
# Include headers and footers # Include headers and footers
if 'video_title' in new_row: playlist_info = get_playlist_info(conn)
new_row['video_title'] = app.title_header + new_row['video_title'] new_row['video_title'] = app.title_header + new_row['video_title']
if 'video_description' in new_row: description_lines = ["This video is part of the following playlists:"]
new_row['video_description'] += app.description_footer description_lines += [
# TODO check this url
"{} [https://youtube.com/playlist/{}]".format(playlist.name, playlist.playlist_id)
for playlist in playlists
]
description_lines.append(app.description_footer)
new_row['video_description'] += "\n".join(description_lines)
# Validate youtube requirements on title and description # Validate youtube requirements on title and description
if len(new_row['video_title']) > MAX_TITLE_LENGTH: if len(new_row['video_title']) > MAX_TITLE_LENGTH:
@ -306,21 +341,6 @@ def update_row(ident, editor=None):
if not new_row['thumbnail_image'].startswith(b'\x89PNG\r\n\x1a\n'): if not new_row['thumbnail_image'].startswith(b'\x89PNG\r\n\x1a\n'):
return 'thumbnail_image must be a PNG', 400 return 'thumbnail_image must be a PNG', 400
conn = app.db_manager.get_conn()
# Check a row with id = ident is in the database
built_query = sql.SQL("""
SELECT id, state, {}
FROM events
WHERE id = %s
""").format(sql.SQL(', ').join(
sql.Identifier(key) for key in sheet_columns
))
results = database.query(conn, built_query, ident)
old_row = results.fetchone()._asdict()
if old_row is None:
return 'Row {} not found'.format(ident), 404
assert old_row['id'] == ident
if new_row['state'] == 'MODIFIED': if new_row['state'] == 'MODIFIED':
if old_row['state'] not in ['DONE', 'MODIFIED']: if old_row['state'] not in ['DONE', 'MODIFIED']:
return 'Video is in state {} and cannot be modified'.format(old_row['state']), 403 return 'Video is in state {} and cannot be modified'.format(old_row['state']), 403
@ -374,8 +394,6 @@ def update_row(ident, editor=None):
return 'Fields {} must be non-null for video to be cut'.format(', '.join(missing)), 400 return 'Fields {} must be non-null for video to be cut'.format(', '.join(missing)), 400
if len(new_row.get('video_title', '')) <= len(app.title_header): if len(new_row.get('video_title', '')) <= len(app.title_header):
return 'Video title must not be blank', 400 return 'Video title must not be blank', 400
if len(new_row.get('video_description', '')) <= len(app.description_footer):
return 'Video description must not be blank. If you have nothing else to say, just repeat the title.', 400
elif new_row['state'] != 'UNEDITED': elif new_row['state'] != 'UNEDITED':
return 'Invalid state {}'.format(new_row['state']), 400 return 'Invalid state {}'.format(new_row['state']), 400
new_row['uploader'] = None new_row['uploader'] = None

Loading…
Cancel
Save