Panopto provides no way to bulk download sessions. This is a simple command-line tool for downloading sessions and their corresponding metadata. We want to:
- ✅ Traverse the Panopto folder hierarchy starting at a given point
- (TODO) Filter through sessions according to criteria (e.g. an option to not download private sessions)
- ✅ Download video & caption files
- ❌ Confirm videos transferred successfully using content hashes
- ❓ Push the video files to cloud storage
- ✅ Retain the video metadata alongside the sessions
- ✅ Mirror the Panopto folder hierarchy in cloud storage
- Panopto admin goes to System > OAuth2 Clients
- New > make it a server-side client*
- CORS URL:
http://localhost& Redirect URL:http://localhost:9127/redirect - Copy the client ID and secret into the
.envfile (see example.env)
* This fake server-side weirdness is how the Panopto OAuth2 example was designed and could be avoided by rewriting it.
uv sync
# test (no downloads) with "CCA Departments" folder ID
uv run panochive --test c117dc01-bc96-4eca-a53a-ace50173fb6emise is also used to autoload the .env file and manage the python version, but these could be done manually, e.g. export SERVER=ccarts.hosted.panopto.com etc...
# download Panopto folder to local "dest" folder (data by default)
uv run panochive de58c934-a306-4aea-95c8-b45601224869 --dest path/to/dest
# recursively download everything in a portion of the folder hierarchy
uv run panochive -r de58c934-a306-4aea-95c8-b45601224869Once downloaded, we can copy the files from their "dest" (data) folder to GCP using gcloud storage cp. Make sure to preserve the Panopto folder hierarchy, e.g. if you download ROOT/Libraries/CAPL Archive then the folder locally will be data/CAPL Archive. If you copy that to GCP, put it where it belongs under "Libraries", not in the bucket's root.
uv run panochive FOLDER_ID
gcloud storage cp --recursive "data/CAPL Archive" "gs://panopto_archive/Libraries"uv run pytest src/panochive/tests # test
uv run ruff format src/panochive # formatting
uv run ruff check src/panochive # type checking and lintingECL-2.0