diff options
| author | Magnus Hagander | 2025-12-12 17:50:55 +0000 |
|---|---|---|
| committer | Magnus Hagander | 2025-12-12 17:50:55 +0000 |
| commit | 1eaae22834de09e4ec5b1c7abfa054a3f38e0b30 (patch) | |
| tree | c2cb4d6852e1813ac1b8732cb1535552e0568245 | |
| parent | 10dc982c1ff423b6eab488b7c2b7fb85ed015acc (diff) | |
Add tools to delete videos and to find session info from filenames
| -rwxr-xr-x | tools/videos/delete_video_for_session.py | 55 | ||||
| -rwxr-xr-x | tools/videos/get_session_from_file.py | 49 |
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)) |
