summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Hagander2025-12-12 17:50:55 +0000
committerMagnus Hagander2025-12-12 17:50:55 +0000
commit1eaae22834de09e4ec5b1c7abfa054a3f38e0b30 (patch)
treec2cb4d6852e1813ac1b8732cb1535552e0568245
parent10dc982c1ff423b6eab488b7c2b7fb85ed015acc (diff)
Add tools to delete videos and to find session info from filenames
-rwxr-xr-xtools/videos/delete_video_for_session.py55
-rwxr-xr-xtools/videos/get_session_from_file.py49
2 files changed, 104 insertions, 0 deletions
diff --git a/tools/videos/delete_video_for_session.py b/tools/videos/delete_video_for_session.py
new file mode 100755
index 00000000..70c9b8a5
--- /dev/null
+++ b/tools/videos/delete_video_for_session.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+
+import argparse
+import datetime
+import json
+import os
+import requests
+import sys
+
+from videoutil import get_current_token
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser("Get session info from filename")
+ parser.add_argument('statefile', type=str, help='State file')
+ parser.add_argument('sessionid', type=int, help='Session id to delete video for')
+ args = parser.parse_args()
+
+ if not os.path.isfile(args.statefile):
+ print("{} not found".format(args.statefile))
+ sys.exit(1)
+
+ with open(args.statefile) as f:
+ state = json.load(f)
+
+ if str(args.sessionid) not in state['sessions']:
+ print("Session {} not found in state.".format(args.sessionid))
+ sys.exit(1)
+
+ videoid = state['sessions'][str(args.sessionid)]['youtube']
+
+ while True:
+ r = input("Delete youtube video {}? ".format(videoid)).lower()
+ if r in ('n', 'no'):
+ print("Not deleting.")
+ sys.exit(0)
+ elif r in ('y', 'yes'):
+ break
+
+ token = get_current_token()
+ sess = requests.Session()
+ sess.headers['Authorization'] = 'Bearer {}'.format(token)
+
+ print("Deleting video {}".format(videoid))
+ r = sess.delete('https://www.googleapis.com/youtube/v3/videos?id={}'.format(videoid))
+ r.raise_for_status()
+ if r.status_code != 204:
+ print("Invalid status of delete: {}".format(r.status_code))
+ sys.exit(1)
+
+ print("Deleted.")
+ del state['sessions'][str(args.sessionid)]['youtube']
+ if not state['sessions'][str(args.sessionid)]:
+ del state['sessions'][str(args.sessionid)]
+ with open(args.statefile, 'w') as f:
+ json.dump(state, f)
diff --git a/tools/videos/get_session_from_file.py b/tools/videos/get_session_from_file.py
new file mode 100755
index 00000000..1875a199
--- /dev/null
+++ b/tools/videos/get_session_from_file.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+
+import argparse
+import datetime
+import jinja2
+import json
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser("Get session info from filename")
+ parser.add_argument('jsonschedule', type=argparse.FileType(), help='JSON Schedule file')
+ parser.add_argument('filenametemplate', type=str, help='Jinja2 template to generate filenames')
+ parser.add_argument('filenames', type=str, nargs='+', help='Filename to look up')
+ parser.add_argument('--statefile', type=argparse.FileType(), help='State file')
+ args = parser.parse_args()
+
+ jsonschedule = json.load(args.jsonschedule)
+ if args.statefile:
+ state = json.load(args.statefile)
+ else:
+ state = None
+
+ env = jinja2.Environment()
+ fntemplate = env.from_string(args.filenametemplate)
+
+ matches = {}
+ for d in jsonschedule['days']:
+ dat = datetime.datetime.strptime(d['day'], '%Y-%m-%d').date()
+
+ for s in d['sessions']:
+ if s.get('empty', False):
+ continue
+
+ s['starttime'] = datetime.datetime.fromisoformat(s['starttime'])
+ s['endtime'] = datetime.datetime.fromisoformat(s['endtime'])
+
+ fn = fntemplate.render({'day': dat, 'session': s})
+ if fn:
+ matches[fn] = s
+
+ for fn in args.filenames:
+ if fn in matches:
+ s = matches[fn]
+ if state and str(matches[fn]['id']) in state['sessions']:
+ print("{}: {} (session {}, videoids {})".format(fn, s['title'], s['id'], state['sessions'][str(s['id'])]))
+ else:
+ print("{}: {} (session {})".format(fn, s['title'], s['id']))
+ else:
+ print("{} not matched".format(fn))