{"id":15195423,"url":"https://github.com/cca/panopto-session-data","last_synced_at":"2026-02-07T06:32:20.226Z","repository":{"id":84610433,"uuid":"500965775","full_name":"cca/panopto-session-data","owner":"cca","description":"analyzing Panopto session data for retention purposes","archived":false,"fork":false,"pushed_at":"2025-07-08T19:58:50.000Z","size":150,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-01T15:42:54.965Z","etag":null,"topics":["data-analysis","ipython-notebook","video"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cca.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-06-07T18:49:24.000Z","updated_at":"2025-07-08T19:58:53.000Z","dependencies_parsed_at":"2025-05-31T00:16:16.397Z","dependency_job_id":"06d60e57-f6cb-4a88-9da2-033efc64a325","html_url":"https://github.com/cca/panopto-session-data","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cca/panopto-session-data","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cca%2Fpanopto-session-data","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cca%2Fpanopto-session-data/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cca%2Fpanopto-session-data/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cca%2Fpanopto-session-data/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cca","download_url":"https://codeload.github.com/cca/panopto-session-data/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cca%2Fpanopto-session-data/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29188226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T05:07:31.176Z","status":"ssl_error","status_checked_at":"2026-02-07T05:06:15.227Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-analysis","ipython-notebook","video"],"created_at":"2024-09-27T23:23:26.204Z","updated_at":"2026-02-07T06:32:17.269Z","avatar_url":"https://github.com/cca.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Panopto Sessions Data\n\nAnalyzing Panopto session creation and usage so we can create scenarios for our retention policy.\n\n## Setup\n\nThis project uses python3 and [uv](https://docs.astral.sh/uv) for dependency management. Run `uv sync` to create a virtualenv. Then open the iPython notebook (e.g. in Visual Studio Code or iPython's own app) to work on the data. We may need to tell the notebook app where the virtualenv is located.\n\n## Panopto Reports\n\nTo get started, go to the Panopto System settings and select [Usage](https://ccarts.hosted.panopto.com/Panopto/Pages/Admin/Usage.aspx#), then **Create new report**. For the reports, select dates that cover our whole subscription (August 8th, 2020 to yesterday). The \"Sessions created or edited\" report provides information on the length and Stream Source of sessions; the \"Session usage\" report provides data on how many times a session was watched and when the last time it was watched. If you want the scripts here to work as is, rename the reports to \"sessionscreatedoredited.csv\" and \"sessionusage.csv\" respectively.\n\nOther reports could be added. \"Session ID\" is the key that links together session data from different reports.\n\n## Questions\n\n- How many sessions have never been watched?\n  - What is their **Stream Source**?\n  - What sorts of folders are those sessions in?\n- How many sessions have been watched at least once?\n  - What kinds of sessions tend to go watched vs. unwatched?\n- How many sessions haven't been watched _in the last year_?\n  - Same sub-questions about folders and source\n\n## Non-iPython Notebook approaches\n\nHere are the fields contained in the two sessions reports:\n\n```sh\n\u003e head -n1 sessionusage.csv\nSession Name,Session ID,Creator,Creator ID,Email,Start Time,Folder Name,Folder ID,Views and Downloads,Unique Viewers,Minutes Delivered,Average Minutes Delivered,Session Length,Rating Count,Average Rating,Most Recent View Date,Root Folder (Level 0),Subfolder (Level 1),Subfolder (Level 2),Subfolder (Level 3),Subfolder (Level 4)\n\u003e head -n1 sessionscreatedoredited.csv\nSession Name,Session ID,Creator,Creator ID,Email,Folder Name,Folder ID,Start Time,Last Time Edited,Last Approval Action,Last Approval Time,Last Approver Name,Last Approver Id,Session Length,Stream Count,Stream Source,Rating Count,Average Rating,Root Folder (Level 0),Subfolder (Level 1),Subfolder (Level 2),Subfolder (Level 3),Subfolder (Level 4)\n```\n\nWe can join the two reports CSVs together into one spreadsheet:\n\n`csvjoin -c 2 --outer sessionscreatedoredited.csv sessionusage.csv \u003e sessions.csv`\n\nNote that the overlapping columns will be duplicated (and numbered to distinguish themselves), but they can also just be ignored.\n\nWe can also create a sqlite database from the reports CSVs using [the `csvsql` command](https://csvkit.readthedocs.io/en/latest/scripts/csvsql.html).\n\n```sh\n# insert CSV data into sqlite database\n\u003e csvsql --tables sessions --db sqlite:///pano.db --insert --overwrite sessionscreatedoredited.csv\n\u003e csvsql --tables usage --db sqlite:///pano.db --insert --overwrite sessionusage.csv\n\u003e sqlite pano.db # connect to the db to run queries\n```\n\nThe insert.py script is a code-based approach to accomplishing the same task. It could be expanded to combine the two tables and drop duplicate columns using the approach at the top of the iPython notebook, for instance.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcca%2Fpanopto-session-data","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcca%2Fpanopto-session-data","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcca%2Fpanopto-session-data/lists"}