├── myvid.gif ├── Pipfile ├── LICENSE ├── README.md ├── transcribe.py ├── drive.py ├── .gitignore ├── index.html └── Pipfile.lock /myvid.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/royshil/audiograma/main/myvid.gif -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | selenium = "*" 8 | webdriver-manager = "*" 9 | boto3 = "*" 10 | ffmpeg-python = "*" 11 | 12 | [dev-packages] 13 | 14 | [requires] 15 | python_version = "3.8" 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Roy Shilkrot 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # audiograma 2 | An open source Audiogram maker - audio for your eyes! 3 | 4 | ![audiograma example](myvid.gif) 5 | 6 | ## Setup 7 | 8 | Run 9 | ``` 10 | $ pipenv install 11 | ``` 12 | 13 | Make sure you have ChromeDriver installed. 14 | You'd also need an AWS account with Transcribe enabled, as well as the AWS CLI installed (and configured with your account). 15 | 16 | ## Running 17 | :warning: This space station is not fully operational yet! :warning: 18 | 19 | Create an audio file with (mostly) speech. Save as `.wav` file. 20 | Run 21 | ``` 22 | $ python transcribe.py myaudiofile.wav 23 | ``` 24 | To get the transcription file from AWS saved as `myaudiofile.wav-transcription.json`. 25 | Potentially, edit the transcription to find errors. 26 | 27 | Then run 28 | ``` 29 | $ python drive.py myaudiofile.wav myaudiofile.wav-transcription.json 30 | ``` 31 | To get the audiogram video. 32 | :metal: 33 | 34 | ## Built with 35 | 36 | - [Selenium](https://www.selenium.dev/) and [chromedriver](https://chromedriver.chromium.org/) 37 | - [audiomotion.dev](https://audiomotion.dev) 38 | - [canvasTxt](https://canvas-txt.geongeorge.com/#/) 39 | - [Pizzicato](https://alemangui.github.io/pizzicato/) 40 | - [coolors.co](https://coolors.co/75b9be-006494-ffe5d4-003554-051923) 41 | - And a whole lot of Stackoverflow.com ... 42 | -------------------------------------------------------------------------------- /transcribe.py: -------------------------------------------------------------------------------- 1 | from genericpath import exists 2 | import time 3 | import boto3 4 | import os 5 | import logging 6 | from botocore.exceptions import ClientError 7 | import sys 8 | 9 | 10 | file_name = sys.argv[1] 11 | if not os.path.exists(file_name): 12 | logging.error('Please supply a filename to transcribe') 13 | sys.exit(1) 14 | 15 | transcribe = boto3.client('transcribe') 16 | object_name = os.path.basename(file_name) 17 | job_name = f"{object_name}-transcription" 18 | s3 = boto3.client('s3') 19 | bucket = "roystranscriptionbucket" 20 | 21 | logging.info('Sending audio file to S3') 22 | try: 23 | response = s3.upload_file(file_name, bucket, object_name) 24 | except ClientError as e: 25 | logging.error(e) 26 | exit(1) 27 | 28 | try: 29 | logging.info('Transcribing...') 30 | transcribe.start_transcription_job( 31 | TranscriptionJobName=job_name, 32 | Media={'MediaFileUri': f"s3://{bucket}/{object_name}"}, 33 | MediaFormat='wav', 34 | LanguageCode='he-IL', 35 | OutputBucketName=bucket, 36 | ) 37 | 38 | while True: 39 | status = transcribe.get_transcription_job(TranscriptionJobName=job_name) 40 | if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']: 41 | break 42 | logging.info("Not ready yet...") 43 | time.sleep(5) 44 | 45 | logging.info('Transcription finished. Download') 46 | transcription_file = job_name + '.json' 47 | s3.download_file(bucket, transcription_file, transcription_file) 48 | logging.info('Cleaning up resources') 49 | s3.delete_object(Bucket=bucket, Key=transcription_file) 50 | transcribe.delete_transcription_job(TranscriptionJobName=job_name) 51 | except Exception as e: 52 | logging.error(e) 53 | finally: 54 | logging.info('Delete audio file from S3') 55 | s3.delete_object(Bucket=bucket, Key=object_name) 56 | 57 | logging.info('Done. Result in ') 58 | -------------------------------------------------------------------------------- /drive.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.by import By 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | import ffmpeg 6 | import logging 7 | import os 8 | import sys 9 | 10 | logging.getLogger().setLevel(logging.INFO) 11 | 12 | if len(sys.argv) < 3: 13 | logging.fatal('Please supply a .wav and .json files on the command line') 14 | sys.exit(1) 15 | 16 | script_directory = os.path.dirname(__file__) 17 | 18 | options = webdriver.ChromeOptions() 19 | options.add_argument("--allow-insecure-localhost") 20 | options.add_experimental_option("excludeSwitches", [ 21 | "ignore-certificate-errors", 22 | "enable-automation" 23 | ]) 24 | options.add_argument("--disable-blink-features=AutomationControlled") 25 | options.add_argument("--disable-web-security") 26 | options.add_argument("--autoplay-policy=no-user-gesture-required") 27 | options.add_argument("--headless") 28 | options.add_argument("--nogpu") 29 | options.add_argument("--disablegpu") 30 | options.add_argument("--window-size=1280,1280") 31 | options.add_experimental_option('useAutomationExtension', False) 32 | options.add_experimental_option("prefs", { 33 | "download.default_directory" : script_directory, 34 | 'profile.default_content_setting_values.automatic_downloads': 2, 35 | }) 36 | options.add_argument("--mute-audio") 37 | 38 | if os.path.exists('myvid.webm'): 39 | os.unlink('myvid.webm') 40 | if os.path.exists('myvid.mp4'): 41 | os.unlink('myvid.mp4') 42 | 43 | logging.info('Create environment') 44 | driver = webdriver.Chrome(options=options) 45 | driver.get(f'file://{script_directory}/index.html') 46 | driver.execute_script(f'window.transcriptionFile = \'{script_directory}/{sys.argv[2]}\';') 47 | driver.execute_script(f'window.audioFile = \'{script_directory}/{sys.argv[1]}\';') 48 | driver.execute_script('window.startVideo();') 49 | logging.info('Creating video...') 50 | case_status = WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.ID, 'downloadlink'))) 51 | logging.info('Done.') 52 | driver.close() 53 | driver.quit() 54 | 55 | logging.info('Converting...') 56 | ( 57 | ffmpeg 58 | .input('myvid.webm') 59 | .output('myvid.mp4', **{'qscale:v': 3}) 60 | .global_args('-loglevel', 'error') 61 | .global_args('-y') 62 | .run() 63 | ) 64 | os.unlink('myvid.webm') 65 | logging.info('Video is ready.') 66 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | .DS_Store 132 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 20 | 21 | 22 | 23 |
24 | 25 | Stop 26 | Start 27 | 28 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "5afb27d3033ce44f6f6367489c8fc4b0595a856179c482f70498d494a594a8e7" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.8" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "async-generator": { 20 | "hashes": [ 21 | "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b", 22 | "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144" 23 | ], 24 | "markers": "python_version >= '3.5'", 25 | "version": "==1.10" 26 | }, 27 | "attrs": { 28 | "hashes": [ 29 | "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", 30 | "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" 31 | ], 32 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 33 | "version": "==21.2.0" 34 | }, 35 | "boto3": { 36 | "hashes": [ 37 | "sha256:76b3ee0d1dd860c9218bc864cd29f1ee986f6e1e75e8669725dd3c411039379e", 38 | "sha256:c39cb6ed376ba1d4689ac8f6759a2b2d8a0b0424dbec0cd3af1558079bcf06e8" 39 | ], 40 | "index": "pypi", 41 | "version": "==1.20.23" 42 | }, 43 | "botocore": { 44 | "hashes": [ 45 | "sha256:640b62110aa6d1c25553eceafb5bcd89aedeb84b191598d1f6492ad24374d285", 46 | "sha256:7459766c4594f3b8877e8013f93f0dc6c6486acbeb7d9c9ae488396529cc2e84" 47 | ], 48 | "markers": "python_version >= '3.6'", 49 | "version": "==1.23.23" 50 | }, 51 | "certifi": { 52 | "hashes": [ 53 | "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", 54 | "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569" 55 | ], 56 | "version": "==2021.10.8" 57 | }, 58 | "cffi": { 59 | "hashes": [ 60 | "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3", 61 | "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2", 62 | "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636", 63 | "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20", 64 | "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728", 65 | "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27", 66 | "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66", 67 | "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443", 68 | "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0", 69 | "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7", 70 | "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39", 71 | "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605", 72 | "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a", 73 | "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37", 74 | "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029", 75 | "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139", 76 | "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc", 77 | "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df", 78 | "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14", 79 | "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880", 80 | "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2", 81 | "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a", 82 | "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e", 83 | "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474", 84 | "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024", 85 | "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8", 86 | "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0", 87 | "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e", 88 | "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a", 89 | "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e", 90 | "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032", 91 | "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6", 92 | "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e", 93 | "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b", 94 | "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e", 95 | "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954", 96 | "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962", 97 | "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c", 98 | "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4", 99 | "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55", 100 | "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962", 101 | "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023", 102 | "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c", 103 | "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6", 104 | "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8", 105 | "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382", 106 | "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7", 107 | "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc", 108 | "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997", 109 | "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796" 110 | ], 111 | "version": "==1.15.0" 112 | }, 113 | "charset-normalizer": { 114 | "hashes": [ 115 | "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721", 116 | "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c" 117 | ], 118 | "markers": "python_version >= '3'", 119 | "version": "==2.0.9" 120 | }, 121 | "colorama": { 122 | "hashes": [ 123 | "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", 124 | "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" 125 | ], 126 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 127 | "version": "==0.4.4" 128 | }, 129 | "configparser": { 130 | "hashes": [ 131 | "sha256:1b35798fdf1713f1c3139016cfcbc461f09edbf099d1fb658d4b7479fcaa3daa", 132 | "sha256:e8b39238fb6f0153a069aa253d349467c3c4737934f253ef6abac5fe0eca1e5d" 133 | ], 134 | "markers": "python_version >= '3.6'", 135 | "version": "==5.2.0" 136 | }, 137 | "crayons": { 138 | "hashes": [ 139 | "sha256:bd33b7547800f2cfbd26b38431f9e64b487a7de74a947b0fafc89b45a601813f", 140 | "sha256:e73ad105c78935d71fe454dd4b85c5c437ba199294e7ffd3341842bc683654b1" 141 | ], 142 | "version": "==0.4.0" 143 | }, 144 | "cryptography": { 145 | "hashes": [ 146 | "sha256:2049f8b87f449fc6190350de443ee0c1dd631f2ce4fa99efad2984de81031681", 147 | "sha256:231c4a69b11f6af79c1495a0e5a85909686ea8db946935224b7825cfb53827ed", 148 | "sha256:24469d9d33217ffd0ce4582dfcf2a76671af115663a95328f63c99ec7ece61a4", 149 | "sha256:2deab5ec05d83ddcf9b0916319674d3dae88b0e7ee18f8962642d3cde0496568", 150 | "sha256:494106e9cd945c2cadfce5374fa44c94cfadf01d4566a3b13bb487d2e6c7959e", 151 | "sha256:4c702855cd3174666ef0d2d13dcc879090aa9c6c38f5578896407a7028f75b9f", 152 | "sha256:52f769ecb4ef39865719aedc67b4b7eae167bafa48dbc2a26dd36fa56460507f", 153 | "sha256:5c49c9e8fb26a567a2b3fa0343c89f5d325447956cc2fc7231c943b29a973712", 154 | "sha256:684993ff6f67000a56454b41bdc7e015429732d65a52d06385b6e9de6181c71e", 155 | "sha256:6fbbbb8aab4053fa018984bb0e95a16faeb051dd8cca15add2a27e267ba02b58", 156 | "sha256:8982c19bb90a4fa2aad3d635c6d71814e38b643649b4000a8419f8691f20ac44", 157 | "sha256:9511416e85e449fe1de73f7f99b21b3aa04fba4c4d335d30c486ba3756e3a2a6", 158 | "sha256:97199a13b772e74cdcdb03760c32109c808aff7cd49c29e9cf4b7754bb725d1d", 159 | "sha256:a776bae1629c8d7198396fd93ec0265f8dd2341c553dc32b976168aaf0e6a636", 160 | "sha256:aa94d617a4cd4cdf4af9b5af65100c036bce22280ebb15d8b5262e8273ebc6ba", 161 | "sha256:b17d83b3d1610e571fedac21b2eb36b816654d6f7496004d6a0d32f99d1d8120", 162 | "sha256:d73e3a96c38173e0aa5646c31bf8473bc3564837977dd480f5cbeacf1d7ef3a3", 163 | "sha256:d91bc9f535599bed58f6d2e21a2724cb0c3895bf41c6403fe881391d29096f1d", 164 | "sha256:ef216d13ac8d24d9cd851776662f75f8d29c9f2d05cdcc2d34a18d32463a9b0b", 165 | "sha256:f6a5a85beb33e57998dc605b9dbe7deaa806385fdf5c4810fb849fcd04640c81", 166 | "sha256:f92556f94e476c1b616e6daec5f7ddded2c082efa7cee7f31c7aeda615906ed8" 167 | ], 168 | "version": "==36.0.0" 169 | }, 170 | "ffmpeg-python": { 171 | "hashes": [ 172 | "sha256:65225db34627c578ef0e11c8b1eb528bb35e024752f6f10b78c011f6f64c4127", 173 | "sha256:ac441a0404e053f8b6a1113a77c0f452f1cfc62f6344a769475ffdc0f56c23c5" 174 | ], 175 | "index": "pypi", 176 | "version": "==0.2.0" 177 | }, 178 | "future": { 179 | "hashes": [ 180 | "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" 181 | ], 182 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", 183 | "version": "==0.18.2" 184 | }, 185 | "h11": { 186 | "hashes": [ 187 | "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6", 188 | "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042" 189 | ], 190 | "markers": "python_version >= '3.6'", 191 | "version": "==0.12.0" 192 | }, 193 | "idna": { 194 | "hashes": [ 195 | "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", 196 | "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" 197 | ], 198 | "markers": "python_version >= '3.5'", 199 | "version": "==3.3" 200 | }, 201 | "jmespath": { 202 | "hashes": [ 203 | "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", 204 | "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f" 205 | ], 206 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", 207 | "version": "==0.10.0" 208 | }, 209 | "outcome": { 210 | "hashes": [ 211 | "sha256:c7dd9375cfd3c12db9801d080a3b63d4b0a261aa996c4c13152380587288d958", 212 | "sha256:e862f01d4e626e63e8f92c38d1f8d5546d3f9cce989263c521b2e7990d186967" 213 | ], 214 | "markers": "python_version >= '3.6'", 215 | "version": "==1.1.0" 216 | }, 217 | "pycparser": { 218 | "hashes": [ 219 | "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", 220 | "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" 221 | ], 222 | "version": "==2.21" 223 | }, 224 | "pyopenssl": { 225 | "hashes": [ 226 | "sha256:5e2d8c5e46d0d865ae933bef5230090bdaf5506281e9eec60fa250ee80600cb3", 227 | "sha256:8935bd4920ab9abfebb07c41a4f58296407ed77f04bd1a92914044b848ba1ed6" 228 | ], 229 | "version": "==21.0.0" 230 | }, 231 | "python-dateutil": { 232 | "hashes": [ 233 | "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", 234 | "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" 235 | ], 236 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 237 | "version": "==2.8.2" 238 | }, 239 | "requests": { 240 | "hashes": [ 241 | "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", 242 | "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" 243 | ], 244 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 245 | "version": "==2.26.0" 246 | }, 247 | "s3transfer": { 248 | "hashes": [ 249 | "sha256:50ed823e1dc5868ad40c8dc92072f757aa0e653a192845c94a3b676f4a62da4c", 250 | "sha256:9c1dc369814391a6bda20ebbf4b70a0f34630592c9aa520856bf384916af2803" 251 | ], 252 | "markers": "python_version >= '3.6'", 253 | "version": "==0.5.0" 254 | }, 255 | "selenium": { 256 | "hashes": [ 257 | "sha256:27e7b64df961d609f3d57237caa0df123abbbe22d038f2ec9e332fb90ec1a939" 258 | ], 259 | "index": "pypi", 260 | "version": "==4.1.0" 261 | }, 262 | "six": { 263 | "hashes": [ 264 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", 265 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" 266 | ], 267 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 268 | "version": "==1.16.0" 269 | }, 270 | "sniffio": { 271 | "hashes": [ 272 | "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663", 273 | "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de" 274 | ], 275 | "markers": "python_version >= '3.5'", 276 | "version": "==1.2.0" 277 | }, 278 | "sortedcontainers": { 279 | "hashes": [ 280 | "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", 281 | "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" 282 | ], 283 | "version": "==2.4.0" 284 | }, 285 | "trio": { 286 | "hashes": [ 287 | "sha256:895e318e5ec5e8cea9f60b473b6edb95b215e82d99556a03eb2d20c5e027efe1", 288 | "sha256:c27c231e66336183c484fbfe080fa6cc954149366c15dc21db8b7290081ec7b8" 289 | ], 290 | "markers": "python_version >= '3.6'", 291 | "version": "==0.19.0" 292 | }, 293 | "trio-websocket": { 294 | "hashes": [ 295 | "sha256:5b558f6e83cc20a37c3b61202476c5295d1addf57bd65543364e0337e37ed2bc", 296 | "sha256:a3d34de8fac26023eee701ed1e7bf4da9a8326b61a62934ec9e53b64970fd8fe" 297 | ], 298 | "markers": "python_version >= '3.5'", 299 | "version": "==0.9.2" 300 | }, 301 | "urllib3": { 302 | "extras": [ 303 | "secure" 304 | ], 305 | "hashes": [ 306 | "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece", 307 | "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844" 308 | ], 309 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", 310 | "version": "==1.26.7" 311 | }, 312 | "webdriver-manager": { 313 | "hashes": [ 314 | "sha256:0a0df5e5d5d234702fd5948fec6c3884940aff904425725f15d8bb9eeaee18e8", 315 | "sha256:1e3aa366b95b80b260bd71aea3a63ea3f19a6d14308e0cd93e1144ca46b11ef4" 316 | ], 317 | "index": "pypi", 318 | "version": "==3.5.2" 319 | }, 320 | "wsproto": { 321 | "hashes": [ 322 | "sha256:868776f8456997ad0d9720f7322b746bbe9193751b5b290b7f924659377c8c38", 323 | "sha256:d8345d1808dd599b5ffb352c25a367adb6157e664e140dbecba3f9bc007edb9f" 324 | ], 325 | "markers": "python_full_version >= '3.6.1'", 326 | "version": "==1.0.0" 327 | } 328 | }, 329 | "develop": {} 330 | } 331 | --------------------------------------------------------------------------------