{"id":19429802,"url":"https://github.com/soraxas/echo360","last_synced_at":"2025-05-15T12:03:39.857Z","repository":{"id":25866247,"uuid":"106752621","full_name":"soraxas/echo360","owner":"soraxas","description":"Commandline tool for automated downloads of echo360 videos hosted by university","archived":false,"fork":false,"pushed_at":"2024-12-17T23:34:17.000Z","size":5740,"stargazers_count":299,"open_issues_count":28,"forks_count":59,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-05-12T11:59:23.334Z","etag":null,"topics":["autodownload","echo360","lecture-videos","phantomjs","python","selenium","unikey","university","usyd","uuid"],"latest_commit_sha":null,"homepage":"https://cs.tinyiu.com/echo360","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/soraxas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2017-10-12T22:41:37.000Z","updated_at":"2025-05-01T19:15:46.000Z","dependencies_parsed_at":"2024-01-02T05:33:15.625Z","dependency_job_id":"33f1c4d3-cb0a-409d-aae2-9ec8507114af","html_url":"https://github.com/soraxas/echo360","commit_stats":{"total_commits":142,"total_committers":12,"mean_commits":"11.833333333333334","dds":0.5915492957746479,"last_synced_commit":"1d01827e444e0871cb6cb031078c8e22c92a25f8"},"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soraxas%2Fecho360","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soraxas%2Fecho360/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soraxas%2Fecho360/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soraxas%2Fecho360/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/soraxas","download_url":"https://codeload.github.com/soraxas/echo360/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253736102,"owners_count":21955782,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["autodownload","echo360","lecture-videos","phantomjs","python","selenium","unikey","university","usyd","uuid"],"created_at":"2024-11-10T14:21:27.807Z","updated_at":"2025-05-15T12:03:34.832Z","avatar_url":"https://github.com/soraxas.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Echo360 Videos Downloader\n\n[![PyPI - Version](https://img.shields.io/pypi/v/echo360)](https://pypi.org/project/echo360/)\n[![Package Application with Pyinstaller](https://github.com/soraxas/echo360/actions/workflows/build.yaml/badge.svg)](https://github.com/soraxas/echo360/actions/)\n[![linux-downloads](https://img.shields.io/badge/Download%20Executable-Linux%20\u0026%20Mac-blueviolet)](https://github.com/soraxas/echo360/releases/latest/download/echo360-linux)\n[![windows-downloads](https://img.shields.io/badge/Download%20Executable-Windows-blue)](https://github.com/soraxas/echo360/releases/latest/download/echo360-windows.exe)\n\necho360 is a command-line Python tool that allows you to download lecture videos from any university's Echo360 system and echo360 Cloud platform. All that's required is the particular course's url. See the FAQ for tips on how to find it.\n\nThe way this script works _should_ support all university's echo360 system in theory, see FAQ for details.\n\nSee it in action:\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"700\" height=\"auto\" src=\"docs/images/demo.gif\" alt=\"echo360 demo\" /\u003e\n\u003c/p\u003e\n\n**NEWS:** It now works with `echo360.org` platform as well. Special thanks to [*@cloudrac3r*](https://github.com/cloudrac3r) and *Emma* for their kind offering of providing sources and helped debugging it. Read [FAQ](#echo360-cloud) for details.\n\n# Getting Started\n\n### Automated Installation\n\n**Linux / MacOS**\n\n```shell\n./run.sh COURSE_URL  # where COURSE_URL is your course url\n```\n\n**Windows**\n\n```shell\nrun.bat COURSE_URL  # where COURSE_URL is your course url\n```\n\nThe scripts will boostrap all installation and download all needed files on the fly.\n\n**pip**\n\n```shell\npip install echo360\necho360-downloader COURSE_URL  # where COURSE_URL is your course url\n```\n\n### Optional\n\n-   ffmpeg (for transcoding ts file to mp4 file) See [here (windows)](https://www.easytechguides.com/install-ffmpeg/) or [here](https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg) for a brief instructions of installing it in different OS.\n\n## Manual\n\nThe provided script automated every operations, and install all dependency in a local python virtual environment. You can also use the system-wise python installation by manual installation. Get started by first install all requirements:\n\n```shell\npip install -r requirements.txt  # or with: python -m pip install -r requirements.txt\n```\n\nThen run with:\n\n```shell\npython echo360.py\n```\n\n### Operating System\n\n-   Linux\n-   OS X\n-   Windows\n\n# Usage\n\n**NOTE THAT** all the below command you can substitute `python echo360.py` with `./run.sh` (or `run.bat` if you are in windows)\n\n### Quick Start\n\n```shell\n\u003e\u003e\u003e python echo360.py                       \\\n    https://view.streaming.sydney.edu.au:8443/ess/portal/section/2018_S1C_INFO1001_ND\n```\n\n### Script args\n```\n\u003e\u003e\u003e usage: echo360.py [-h] [--output OUTPUT_PATH]\n                  [--after-date AFTER_DATEYYYY-MM-DD)]\n                  [--before-date BEFORE_DATE(YYYY-MM-DD] [--unikey UNIKEY]\n                  [--password PASSWORD] [--setup-credentials]\n                  [--download-phantomjs-binary] [--chrome] [--firefox]\n                  [--echo360cloud] [--interactive] [--alternative_feeds]\n                  [--debug] [--auto | --manual]\n                  ECHO360_URL\n\nDownload lectures from portal.\n\npositional arguments:\n  ECHO360_URL           Full URL of the echo360 course page, or only the UUID\n                        (which defaults to USYD). The URL of the course's\n                        video lecture page, for example: http://recordings.eng\n                        ineering.illinois.edu/ess/portal/section/115f3def-7371\n                        -4e98-b72f-6efe53771b2a)\n\noptional arguments:\n  -h, --help            show this help message and exit\n  --output OUTPUT_PATH, -o OUTPUT_PATH\n                        Path to the desired output directory. The output\n                        directory must exist. Otherwise the current directory\n                        is used.\n  --after-date AFTER_DATE(YYYY-MM-DD)\n                        Only download lectures newer than AFTER_DATE\n                        (inclusive). Note: this may be combined with --before-\n                        date.\n  --before-date BEFORE_DATE(YYYY-MM-DD)\n                        Only download lectures older than BEFORE_DATE\n                        (inclusive). Note: this may be combined with --after-\n                        date\n  --unikey UNIKEY, -u UNIKEY\n                        Your unikey for your University of Sydney elearning\n                        account\n  --password PASSWORD, -p PASSWORD\n                        Your password for your University of Sydney elearning\n                        account\n  --setup-credentials   Open a chrome instance to expose an ability for user\n                        to log into any website to obtain credentials needed\n                        before proceeding. (implies using chrome-driver)\n  --download-phantomjs-binary\n                        Force the echo360.py script to download a local binary\n                        file for phantomjs (will override system bin)\n  --chrome              Use Chrome Driver instead of phantomjs webdriver. You\n                        must have chromedriver installed in your PATH.\n  --firefox             Use Firefox Driver instead of phantomjs webdriver. You\n                        must have geckodriver installed in your PATH.\n  --interactive, -i     Interactively pick the lectures you want, instead of\n                        download all (default) or based on dates .\n  --alternative_feeds, -a\n                        Download first two video feeds. Since some university\n                        have multiple video feeds, with this option on the\n                        downloader will also try to download the second\n                        video, which could be the alternative feed. Might\n                        only work on some 'echo360.org' hosts.\n  --debug               Enable extensive logging.\n  --auto                Only effective for 'echo360.org' host. When set, this\n                        script will attempts to automatically redirects after\n                        you had logged into your institution's SSO.\n  --manual, -m          [Deprecated] Only effective for 'echo360.org' host.\n                        When set, the script requires user to manually\n                        continue the script within the terminal. This is the\n                        default behaviour and exists only for backward\n                        compatibility reason.\n```\n# Examples\n\n```shell\n\u003e\u003e\u003e python echo360.py                  \\\n    \"041698d6-f43a-4b09-a39a-b90475a63530\" \\  # Note this default to USYD's echo360\n    --output \"~/Lectures\"                     # Use full URL for other University\n```\n\n### Download all available lectures\n\n```shell\n\u003e\u003e\u003e python echo360.py                  \\\n    \"041698d6-f43a-4b09-a39a-b90475a63530\" \\\n    --output \"~/Lectures\"\n```\n\n### Download all lectures on or before a date\n\n```shell\n\u003e\u003e\u003e python echo360.py                  \\\n    \"041698d6-f43a-4b09-a39a-b90475a63530\" \\\n    --output \"~/Lectures\"                  \\\n    --before-date \"2014-10-14\"\n```\n\n### Download all lectures on or after a date\n\n```shell\n\u003e\u003e\u003e python echo360.py                  \\\n    \"041698d6-f43a-4b09-a39a-b90475a63530\" \\\n    --output \"~/Lectures\"                  \\\n    --after-date \"2014-10-14\"\n```\n\n### Download all lectures in a given date range (inclusive)\n\n```shell\n\u003e\u003e\u003e python echo360.py                  \\\n    \"041698d6-f43a-4b09-a39a-b90475a63530\" \\\n    --output \"~/Lectures\"                  \\\n    --after-date \"2014-08-26\"              \\\n    --before-date \"2014-10-14\"\n```\n\n### Use chrome driver (instead of phantomjs)\n\nNote: sometime it works better than phantomjs in some system\n\n```shell\n\u003e\u003e\u003e python echo360.py                  \\\n    \"041698d6-f43a-4b09-a39a-b90475a63530\" \\\n    --chrome\n```\n\n# FAQ\n\n### Is my university supported?\n\nThis is first built for the echo system in the University of Sydney, and then validated in several other universities' echo system. In theory, as long as the url are in the format of:\n\n```shell\nhttps://$(hostname)/ess/portal/section/$(UUID)\n```\nor\n```shell\nhttps://echo360.org[.xx]/\n```\nor with a dot net variant\n```shell\nhttps://echo360.net[.xx]/\n```\n\n... then it should be supported.\n\nThe variables `$(hostname)` and `$(UUID)` are what differentiate different University's echo360 system. If there is no credentials needed (ie no need to login before accessing the page), then 90% of the time it should works. If login is needed, some extra work might need to be put in before it works for your university. If that is the case, create an issue to let me know.\n\nAs for `echo360.org`, see [this](#echo360-cloud).\n\n### How do I retrieve the Course URL for a course?\n\nYou should go to the main Echo360 Lecture page, which usually composed of all the lecturer recordings in a list format as shown below. It's the main page that lists all the recorded lectures and gives you the option to stream them or download them individually. This is important for downloading all the available videos from within the course.\n\n\u003cimg height=\"auto\" src=\"docs/images/course_page.png\" alt=\"echo360 course main page\" /\u003e\n\nYou can usually find this link on your course's main webpage. If your course webpage only links directly to videos, then you should be able to navigate back **by clicking the title of your course name (top of page)**.\n\nThe URL for the University of Sydney - 2017 semester 2 of CIVL4903 looks like\n\n    https://view.streaming.sydney.edu.au:8443/ess/portal/section/041698d6-f43a-4b09-a39a-b90475a63530\n\nwhich you can verify is correct in the above screenshot. **This should be the full URL you enter into the script, for all other universities' echo system.**\n\nThe UUID (Unified Unique IDentifier) is the last element of the URL. So in the above example it's,\n\n    041698d6-f43a-4b09-a39a-b90475a63530\n\n### echo360 cloud\n\nEcho360 cloud refers to websites in the format of `https://echo360.org[.xx]`. This module now officially support this platform.\n\n\u003cp align=\"center\"\u003e\n\u003cimg height=\"auto\" width=\"700\" src=\"docs/images/echo360cloud_home.png\" alt=\"echo360 cloud course main page\" /\u003e\n\u003c/p\u003e\n\nThis method requires you to setup SSO credentials, therefore, it needs to open up a browser for you to setup your own university's SSO credentials.\n\nTo download videos, run:\n```shell\n./run.sh https://echo360.\u003corg|net\u003e[.xx]/section/$(UUID)/home\n```\nwhere `[.xx]` is an optional country flag specific to your echo360 platform and `$(UUID)` is the unique identifier for your course. This should the url that you can retrieve from your course's *main page* like the following.\n\n\u003cimg height=\"auto\" src=\"docs/images/echo360cloud_course-page.png\" alt=\"echo360 cloud course main page\" /\u003e\n\nNote that this implies `setup-credential` option and will use chrome-webdriver by default. If you don't have chrome or prefer to use firefox, run it with the ` --firefox` flag like so:\n```shell\n./run.sh https://echo360.\u003corg|net\u003e[.xx]/section/$(UUID)/home --firefox\n```\n\nAfter running the command, it will opens up a browser instance, most likely with a login page. You should then login with your student's credentials like what you would normally do. After you have successfully logged in, the module should automatically redirects you and continues. If the script hangs (e.g. failed to recognises that you have logged in), feel free to let me know.\n\n\n### I'm not sure of how to run it?\n\nFirst, you'd need to install [Python](https://www.python.org/downloads/) in your system. Then, you can follow the youtube tutorial videos to get an idea of how to use the module.\n\n- For [Windows users](https://www.youtube.com/watch?v=Lv1wtjnCcwI) (and showcased how to retrieve actual echo360 course url)\n[![](docs/images/youtube_win_tutorial.jpg)](https://www.youtube.com/watch?v=Lv1wtjnCcwI)\n\n### My credentials does not work?\n\nYou can setup any credentials need with manually logging into websites, by running the script with:\n```sh\n./run.sh ECHO360_URL --setup-credential\n```\nThis will open up a chrome instance that allows you to log into your website as you normally do. Afterwards, simply type 'continue' into your shell and press enter to continue to proceeds with the rest of the script.\n\n### My credentials does not work (echo360.org)?\n\nFor echo360.org, the default behaviour is it will always require you to setup-credentials, and the module will automatically detect login token and proceed the download process. For some institutions, this seems to be not sufficient (#29).\n\nYou can disable such behaviour with\n```sh\n./run.sh ECHO360_ORG_URL --manual\n```\nfor manual setup; and once you had logged in, type\n```sh\ncontinue\n```\nin your terminal to continue.\n\n### How do I download only individual video(s)?\n\nYou are in luck! It is now possible to pick a subset of videos to download from (instead of needing to download everything like before). Just pass the interactive argument like this:\n```sh\n./run.sh ECHO360_URL --interactive  # or ./run.sh ECHO360_URL -i\n```\n...and it shall presents an interactive screen for you to pick each individual video(s) that you want to download, like the screenshot as shown below.\n\n\u003cimg src=\"/docs/images/pick_individual_videos_screenshot.png\" width=\"650\" height=\"auto\" \u003e\n\n### My lecture has two video feeds, how can I download both of them?\n\nYou can add argument `--alternative_feeds` or simply `-a` to download both video feeds.\n\n### Technical details\n\nThe current script uses a web-driver to emulate as a web-browser in order to retrieve the original streaming link. There are current two options for the web-driver: PhantomJS and Chrome. It then uses a hls downloader to simultaneously download all the smaller parts of the videos, and combined into one. Transcoding into mp4 will be performed if ffmpeg is present in your system, and all files will be renamed into a nice format.\n\n# Credits\n\nCredits to [jhalstead85](https://github.com/jhalstead85/lecho360) for which this script is based upon.\nThis script has then been adopted to be usable for USYD echo360. It was then extended to work in canvas (which uses a human-readable name instead of UUID); and later automated the entire process and become usable for all other universities.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoraxas%2Fecho360","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoraxas%2Fecho360","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoraxas%2Fecho360/lists"}