├── .gitignore ├── .pre-commit-config.yaml ├── LICENSE ├── README.md ├── avsearch ├── __init__.py └── src │ ├── avsearch.py │ ├── cli.py │ ├── errors.py │ ├── schemas.py │ └── utils.py ├── examples ├── categories.json.example ├── pattern-replace.json.example ├── preview-autocomplete │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── index.html │ ├── package-lock.json │ ├── package.json │ ├── public │ │ ├── Algolia-logo-blue.png │ │ ├── favicon.png │ │ └── github-mark-white.png │ ├── src │ │ ├── app.tsx │ │ ├── createLoadVideoPlugin.ts │ │ └── env.ts │ ├── styles │ │ └── style.css │ └── util │ │ └── number.extensions.ts └── settings.json.example ├── poetry.lock ├── pyproject.toml └── scripts ├── build.sh └── pre-commit.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | # Byte-compiled / optimized / DLL files 3 | __pycache__/ 4 | *.py[cod] 5 | *$py.class 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | pip-wheel-metadata/ 25 | share/python-wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | MANIFEST 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | *.py,cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | db.sqlite3-journal 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | .python-version 87 | 88 | # pipenv 89 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 90 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 91 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 92 | # install all needed dependencies. 93 | #Pipfile.lock 94 | 95 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 96 | __pypackages__/ 97 | 98 | # Celery stuff 99 | celerybeat-schedule 100 | celerybeat.pid 101 | 102 | # SageMath parsed files 103 | *.sage.py 104 | 105 | # Environments 106 | .env 107 | .venv 108 | env/ 109 | venv/ 110 | ENV/ 111 | env.bak/ 112 | venv.bak/ 113 | 114 | # Spyder project settings 115 | .spyderproject 116 | .spyproject 117 | 118 | # Rope project settings 119 | .ropeproject 120 | 121 | # mkdocs documentation 122 | /site 123 | 124 | # mypy 125 | .mypy_cache/ 126 | .dmypy.json 127 | dmypy.json 128 | 129 | # Pyre type checker 130 | .pyre/ 131 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_stages: [commit, push] 2 | default_language_version: 3 | python: python3 4 | repos: 5 | - repo: https://github.com/psf/black 6 | rev: 22.10.0 7 | hooks: 8 | - id: black 9 | args: [ 10 | --line-length=120, 11 | --target-version=py37, 12 | avsearch 13 | ] 14 | exclude: ^(venv/|docs/|dist/) 15 | types: ['python'] 16 | - repo: https://github.com/PyCQA/flake8 17 | rev: 5.0.4 18 | hooks: 19 | - id: flake8 20 | args: [ 21 | --max-line-length=120, 22 | --per-file-ignores=avsearch/__init__.py:F401, 23 | avsearch 24 | ] 25 | exclude: ^(venv/|docs/dist/) 26 | types: ['python'] 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Algolia Samples 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 | # AVSearch 2 | 3 | Automated YouTube Audio/Video content transcription search for your website 4 | 5 | [Live demo](https://avsearch.vercel.com) 6 | 7 | --- 8 | 9 | # Getting Started 10 | 11 | ## 1. Installation 12 | 13 | ```shell 14 | # Install FFmpeg 15 | brew install ffmpeg # MacOS 16 | apt install ffmpeg # Linux 17 | choco install ffmpeg # Windows (Chocolatey) 18 | 19 | # Pip 20 | python3 -m pip install git+https://github.com/algolia-samples/avsearch 21 | 22 | # Wheel file (Download the latest release from https://github.com/algolia-samples/avsearch/releases) 23 | python3 -m pip install avsearch-?.?.?-py3-none-any.whl 24 | 25 | # From source 26 | git clone https://github.com/algolia-samples/avsearch 27 | cd avsearch 28 | 29 | # https://python-poetry.org/docs/#installation 30 | poetry install && poetry build 31 | 32 | # Optionally, install the wheel file 33 | python3 -m pip install ./dist/avsearch-?.?.?-py3-none-any.whl 34 | # Or, use poetry's shell 35 | poetry shell 36 | ``` 37 | 38 | ## 2. Set up Algolia 39 | 40 | To use this tool, you need an Algolia account. If you don't have one already, [create an account for free](https://www.algolia.com/users/sign-up). Note your [Application ID](https://www.algolia.com/doc/guides/sending-and-managing-data/manage-indices-and-apps/manage-your-apps/) during this process. 41 | 42 | Once you have an account, your API Key can be located [here](https://www.algolia.com/account/api-keys/all). You don't need to create an Index to get started, Algolia will automatically create the index for us - just come up with a good name! 43 | 44 | ## 3. Usage via the command line 45 | 46 | ```shell 47 | export ALGOLIA_APP_ID= 48 | export ALGOLIA_API_KEY= 49 | export ALGOLIA_INDEX_NAME= 50 | # Single video 51 | av-search --targets "https://www.youtube.com/watch?v=dQw4w9WgXcQ" 52 | # Multiple videos 53 | av-search --targets "https://youtu.be/dQw4w9WgXcQ,https://youtu.be/_C9PMLr_XC8" 54 | ``` 55 | 56 | ## 4. Usage via Python 57 | 58 | ```shell 59 | from avsearch import AVSearch 60 | 61 | avs = AVSearch(app_id='AAAA1234', ...) 62 | results = avs.transcribe( 63 | ["https://www.youtube.com/watch?v=zOz-Sk4K-64&list=PLuHdbqhRgWHLRlmvQ1OKLdjslSxXrAAjk"] 64 | ) 65 | ``` 66 | 67 | --- 68 | 69 | # Resources 70 | 71 | - [Algolia Documentation](https://www.algolia.com/doc/) 72 | - [OpenAI Whisper](https://github.com/openai/whisper) 73 | - [YouTube DL](https://github.com/ytdl-org/youtube-dl) 74 | 75 | # Contributing 76 | 77 | This project is open source and welcomes contributions. We only ask that you adhere to our [Code of Conduct](https://github.com/algolia-samples/.github/blob/master/CODE_OF_CONDUCT.md) when contributing and our process outlined below: 78 | 79 | 1. After completing your change, run the `scripts/pre-commit.sh` script to format and lint your code to fit our styling. This will run [Black](https://github.com/psf/black) and [Flake8](https://github.com/pycqa/flake8) automatically with our settings. 80 | 2. Submit a Pull Request with your changes and request approval. 81 | 3. Allow one week for your code to be reviewed by an Algolia team member. If changes are requested, these will need to be resolved before the changes are merged. 82 | 83 | # Authors 84 | 85 | - [Chuck Meyer, @chuckm](https://twitter.com/chuckm) 86 | - [Michael King, @makvoid](https://twitter.com/makvoid) 87 | -------------------------------------------------------------------------------- /avsearch/__init__.py: -------------------------------------------------------------------------------- 1 | from .src.avsearch import AVSearch 2 | from .src.cli import cli 3 | from .src.errors import ( 4 | MissingConfigurationError, 5 | MissingConfigurationFileError, 6 | InvalidFileSchemaError, 7 | ) 8 | from .src.schemas import category_patterns_schema, cleanup_patterns_schema 9 | 10 | __version__ = "0.1.0" 11 | -------------------------------------------------------------------------------- /avsearch/src/avsearch.py: -------------------------------------------------------------------------------- 1 | from algoliasearch.search_client import SearchClient 2 | import logging 3 | import os 4 | from pathlib import PosixPath 5 | import re 6 | from typing import List 7 | import whisper 8 | import youtube_dl 9 | 10 | from .utils import load_file 11 | from .schemas import cleanup_patterns_schema, category_patterns_schema 12 | 13 | class AVSearch: 14 | _model = None 15 | _downloaded = [] 16 | _file_errors = [] 17 | _cleanup_patterns = [] 18 | _categories_patterns = [] 19 | 20 | def __init__( 21 | self, 22 | app_id: str = None, 23 | index_name: str = None, 24 | api_key: str = None, 25 | pattern_replace_json_file: str = None, 26 | categories_json_file: str = None, 27 | whisper_model: str = "medium", 28 | youtube_dl_format: str = "bestaudio[ext=m4a]", 29 | use_download_archive: bool = False, 30 | combine_short_segments: bool = True, 31 | remove_after_transcription: bool = True, 32 | exit_on_error: bool = True, 33 | quiet: bool = False, 34 | ) -> None: 35 | self.whisper_model = whisper_model 36 | self.combine_short_segments = combine_short_segments 37 | self.remove_after_transcription = remove_after_transcription 38 | self.exit_on_error = exit_on_error 39 | self.quiet = quiet 40 | self.use_download_archive = use_download_archive 41 | 42 | # Setup custom logging format 43 | logging.basicConfig( 44 | level=logging.INFO, 45 | format="[A/V-Search] [%(levelname)s] %(message)s", 46 | ) 47 | 48 | # Setup YouTube-DL options 49 | self.ytdl_opts = {"format": youtube_dl_format, "progress_hooks": [self._progress_hook]} 50 | if self.use_download_archive: 51 | self._setup_download_archive() 52 | 53 | # Setup our Algolia Client & Index 54 | self.client = SearchClient.create(app_id, api_key) 55 | self.index = self.client.init_index(index_name) 56 | 57 | # Load, parse and validate JSON files if needed: 58 | if pattern_replace_json_file: 59 | self._cleanup_patterns = load_file(pattern_replace_json_file, cleanup_patterns_schema) 60 | if categories_json_file: 61 | self._categories_patterns = load_file(categories_json_file, category_patterns_schema) 62 | 63 | def transcribe(self, urls: List[str]) -> List[dict]: 64 | self._downloaded.clear() 65 | self._file_errors.clear() 66 | 67 | # Download each video and it's metadata in the queue 68 | with youtube_dl.YoutubeDL(self.ytdl_opts) as ydl: 69 | all_metadata = ydl.extract_info(urls[0]) 70 | 71 | # Check if we were able to download everything if required 72 | if len(self._file_errors) > 0 and self.exit_on_error: 73 | if not self.quiet: 74 | logging.error( 75 | f"""Error: An error occurred downloading and exit_on_error was set to True! 76 | ({', '.join(self._file_errors)})""" 77 | ) 78 | return 79 | 80 | # Ensure the model has been loaded 81 | if not self._model: 82 | self._setup_model() 83 | 84 | # For each file downloaded, transcribe the audio file 85 | transcriptions = [] 86 | for file in self._downloaded: 87 | file = file.decode("utf-8") 88 | 89 | # Extract metadata if a single video 90 | if "entries" not in all_metadata: 91 | metadata = all_metadata 92 | # Extract specific video metadata if a playlist is used 93 | else: 94 | metadata = next( 95 | filter( 96 | lambda entry: entry["id"] == self._get_video_id(file), 97 | all_metadata["entries"], 98 | ), 99 | None, 100 | ) 101 | if metadata is None: 102 | if not self.quiet: 103 | logging.error(f"Unable to locate metadata record for file, can't process video: {file}") 104 | return 105 | 106 | # Transcription / Parsing 107 | if not self.quiet: 108 | logging.info(f"Starting transcription of: {file}") 109 | result = self._model.transcribe(file) 110 | transcriptions.append( 111 | list( 112 | map( 113 | lambda segment: self._parse_segment(metadata, segment), 114 | self._combine_segments(result["segments"]) 115 | if self.combine_short_segments 116 | else result["segments"], 117 | ) 118 | ) 119 | ) 120 | if self.remove_after_transcription: 121 | os.unlink(file) 122 | 123 | if not self.quiet: 124 | logging.info("Done transcribing videos, starting sync to Algolia.") 125 | 126 | # Flatten the list of lists into a single list 127 | transcriptions = [item for sub in transcriptions for item in sub] 128 | 129 | # Create the context links for each transcription 130 | self._link_context(transcriptions) 131 | 132 | # Break the records into 10k record chunks 133 | chunks = [transcriptions[i : i + 10000] for i in range(0, len(transcriptions), 10000)] # noqa: E203 134 | 135 | # Save the transcription chunks into our Algolia Index 136 | for chunk in chunks: 137 | self.index.save_objects(chunk).wait() 138 | 139 | # All done! 140 | if not self.quiet: 141 | logging.info(f"Successfully saved {len(transcriptions)} transcription segments into your Index.") 142 | return transcriptions 143 | 144 | def _link_context(self, transcriptions: List[dict]) -> None: 145 | for index, transcription in enumerate(transcriptions): 146 | before = { 'start': 0, 'text': '' } 147 | after = { 'start': transcriptions[index]['end'], 'text': '' } 148 | # Grab the preceding context (if not the first record) 149 | if index != 0: 150 | context = transcriptions[index - 1] 151 | before = { 152 | 'start': context['start'], 153 | 'text': context['text'] 154 | } 155 | # Grab the succeeding context (if not the last record) 156 | if index != len(transcriptions) - 1: 157 | context = transcriptions[index + 1] 158 | after = { 159 | 'start': context['start'], 160 | 'text': context['text'] 161 | } 162 | # Add the context to the record 163 | transcription['context'] = { 164 | 'before': before, 165 | 'after': after 166 | } 167 | 168 | def _setup_model(self) -> None: 169 | if not self.quiet: 170 | logging.info(f"Loading Whisper's {self.whisper_model} model, please wait...") 171 | self._model = whisper.load_model(self.whisper_model) 172 | 173 | def _progress_hook(self, file: dict) -> None: 174 | # Check if an error occurred 175 | if file["status"] not in ["downloading", "finished"]: 176 | self._file_errors.append(file["filename"]) 177 | # Update the list once it has finished downloading 178 | if file["status"] == "finished": 179 | self._downloaded.append(file["filename"].encode("utf-8")) 180 | 181 | def _parse_segment(self, meta: dict, segment: dict) -> dict: 182 | return { 183 | "objectID": f"{meta['id']}-{segment['id']}", 184 | "videoID": meta["id"], 185 | "videoTitle": meta["title"], 186 | "videoDescription": meta["description"], 187 | "url": f'https://youtu.be/{meta["id"]}?t={round(segment["start"], 2):.0f}', 188 | "thumbnail": meta["thumbnails"][0]["url"], 189 | "text": segment["text"].strip(), 190 | "start": round(segment["start"], 2), 191 | "end": round(segment["end"], 2), 192 | "categories": self._categorize_segment(segment["text"]), 193 | } 194 | 195 | def _combine_segments(self, segments: List[dict]) -> List[dict]: 196 | stale_indexes = [] 197 | for index, segment in enumerate(segments): 198 | segment["text"] = self._cleanup_text(segment["text"].strip()) 199 | # If any segment is three words or smaller, combine it with the previous segment 200 | if len(segment["text"].split(" ")) <= 3: 201 | stale_indexes.append(index) 202 | new_segment = segments[index - 1] 203 | new_segment["text"] += f" {segment['text']}" 204 | new_segment["end"] = segment["end"] 205 | # Remove any stale indexes in reverse order (or else they will not be the same) 206 | for index in sorted(stale_indexes, reverse=True): 207 | segments.pop(index) 208 | return segments 209 | 210 | def _categorize_segment(self, text: str) -> List[str]: 211 | categories = map( 212 | lambda pat: pat["category"] if re.search(pat["symbol"], text, flags=re.I) else None, 213 | self._categories_patterns, 214 | ) 215 | return list(filter(lambda val: val is not None, categories)) 216 | 217 | def _cleanup_text(self, text: str) -> str: 218 | for sub in self._cleanup_patterns: 219 | text = re.sub(sub["symbol"], sub["value"], text, flags=re.I) 220 | return text 221 | 222 | def _get_video_id(self, file: str) -> str: 223 | groups = re.search(r".+-([A-Za-z0-9_\-]{11}).m4a", file).groups() 224 | if not len(groups): 225 | return None 226 | return groups[0] 227 | 228 | def _setup_download_archive(self) -> None: 229 | path = PosixPath("~/.config/algolia").expanduser().resolve() 230 | # Create the directory if it doesn't exist yet 231 | path.mkdir(parents=True, exist_ok=True) 232 | self.ytdl_opts["download_archive"] = PosixPath(f"{path}/.avsearch-archive") 233 | -------------------------------------------------------------------------------- /avsearch/src/cli.py: -------------------------------------------------------------------------------- 1 | import click 2 | from typing import List 3 | 4 | from .avsearch import AVSearch 5 | from .utils import load_config 6 | 7 | 8 | @click.command() 9 | @click.option( 10 | "--targets", 11 | help="Comma separated list of YouTube videos, playlists or channels to transcribe", 12 | required=True, 13 | ) 14 | @click.option("--quiet", help="Print out log messages with progress", default=False) 15 | @click.option( 16 | "--algolia-app-id", 17 | help="Algolia App ID of your project (can also be set via the environment variable ALGOLIA_APP_ID)", 18 | default=None, 19 | ) 20 | @click.option( 21 | "--algolia-index-name", 22 | help="""Algolia Index name to upload the transcriptions to 23 | (can also be set via the environment variable ALGOLIA_INDEX_NAME)""", 24 | default=None, 25 | ) 26 | @click.option( 27 | "--algolia-api-key", 28 | help="""Algolia Write API Key to upload the transcriptions with 29 | (can also be set via the environment variable ALGOLIA_API_KEY)""", 30 | default=None, 31 | ) 32 | @click.option( 33 | "--pattern-replace-json-file", 34 | help="JSON file of patterns to do find/replace operations on segments", 35 | ) 36 | @click.option( 37 | "--categories-json-file", 38 | help="JSON file of categories to attempt categorization of segments", 39 | ) 40 | @click.option( 41 | "--whisper-model", 42 | help="Whisper model to use for the transcription (https://alg.li/xaaQ26)", 43 | default="medium", 44 | ) 45 | @click.option( 46 | "--youtube-dl-format", 47 | help="Format option to pass to YouTube DL to download source video in (https://alg.li/AwDfRu)", 48 | default="bestaudio[ext=m4a]", 49 | ) 50 | @click.option( 51 | "--use-download-archive/--no-download-archive", 52 | help="""Use YouTube DL's download archive feature to only download 53 | and process videos that have not been downloaded before""", 54 | default=False, 55 | ) 56 | @click.option( 57 | "--combine-short-segments/--no-combine-short-segments", 58 | help="Combine short segments of three words or less with the previous segment.", 59 | default=True, 60 | ) 61 | @click.option( 62 | "--exit-on-error/--no-exit-on-error", 63 | help="Exit the entire process if one file has a download issue", 64 | default=True, 65 | ) 66 | @click.option( 67 | "--remove-after-transcribe/--no-remove-after-transcribe", 68 | help="Remove the source audio file after transcription is complete", 69 | default=True, 70 | ) 71 | def cli( 72 | targets: List[str], 73 | quiet: bool, 74 | algolia_app_id: str, 75 | algolia_index_name: str, 76 | algolia_api_key: str, 77 | pattern_replace_json_file: str, 78 | categories_json_file: str, 79 | whisper_model: str, 80 | youtube_dl_format: str, 81 | use_download_archive: bool, 82 | combine_short_segments: bool, 83 | exit_on_error: bool, 84 | remove_after_transcribe: bool, 85 | ): 86 | # If the configuration is not passed via an argument, load it via environment variables 87 | app_id, index_name, api_key = load_config(algolia_app_id, algolia_index_name, algolia_api_key) 88 | 89 | # Instantiate class 90 | avs = AVSearch( 91 | app_id, 92 | index_name, 93 | api_key, 94 | pattern_replace_json_file, 95 | categories_json_file, 96 | whisper_model, 97 | youtube_dl_format, 98 | use_download_archive, 99 | combine_short_segments, 100 | remove_after_transcribe, 101 | exit_on_error, 102 | quiet, 103 | ) 104 | 105 | # Run the transcription 106 | avs.transcribe(targets.split(",")) 107 | -------------------------------------------------------------------------------- /avsearch/src/errors.py: -------------------------------------------------------------------------------- 1 | class MissingConfigurationError(Exception): 2 | pass 3 | 4 | 5 | class MissingConfigurationFileError(Exception): 6 | pass 7 | 8 | 9 | class InvalidFileSchemaError(Exception): 10 | pass 11 | -------------------------------------------------------------------------------- /avsearch/src/schemas.py: -------------------------------------------------------------------------------- 1 | from schema import Schema 2 | 3 | cleanup_patterns_schema = Schema([{"symbol": str, "value": str}]) 4 | 5 | category_patterns_schema = Schema([{"symbol": str, "category": str}]) 6 | -------------------------------------------------------------------------------- /avsearch/src/utils.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | from schema import Schema 4 | from typing import Tuple 5 | 6 | from .errors import ( 7 | MissingConfigurationError, 8 | InvalidFileSchemaError, 9 | MissingConfigurationFileError, 10 | ) 11 | 12 | 13 | # Ensure the Algolia configuration is provided 14 | def load_config(app_id: str, index_name: str, api_key: str) -> Tuple[str, str, str]: 15 | config = { 16 | "ALGOLIA_APP_ID": { 17 | "cli": app_id, 18 | "env": os.environ.get("ALGOLIA_APP_ID", None), 19 | }, 20 | "ALGOLIA_INDEX_NAME": { 21 | "cli": index_name, 22 | "env": os.environ.get("ALGOLIA_INDEX_NAME", None), 23 | }, 24 | "ALGOLIA_API_KEY": { 25 | "cli": api_key, 26 | "env": os.environ.get("ALGOLIA_API_KEY", None), 27 | }, 28 | } 29 | # Check if configuration was passed via an argument 30 | if not all(map(lambda item: item["cli"], config.values())): 31 | env_config = list(map(lambda item: item["env"], config.values())) 32 | # If the configuration is missing from the environment variables as well, raise an exception 33 | if not all(env_config): 34 | missing = map( 35 | lambda item: item[0], 36 | filter(lambda item: item[1]["env"] is None, config.items()), 37 | ) 38 | raise MissingConfigurationError(f"Missing configuration value(s): {', '.join(missing)}") 39 | # Otherwise, load it from the environment variables 40 | else: 41 | app_id, index_name, api_key = env_config 42 | return (app_id, index_name, api_key) 43 | 44 | 45 | def load_file(file_path: str, schema: Schema): 46 | file_path = os.path.abspath(file_path) 47 | # Ensure the file exists 48 | if not os.path.exists(file_path): 49 | raise MissingConfigurationFileError(f"Specified configuration file is missing: {file_path}") 50 | with open(file_path, "r") as f: 51 | content = json.load(f) 52 | # Ensure the file content matches our schema 53 | if schema.validate(content): 54 | return content 55 | else: 56 | raise InvalidFileSchemaError(f"File contents do not follow the required schema: {file_path} {schema}") 57 | -------------------------------------------------------------------------------- /examples/categories.json.example: -------------------------------------------------------------------------------- 1 | [ 2 | { "symbol": "InstantSearch", "category": "instantsearch" }, 3 | { "symbol": "Autocomplete", "category": "autocomplete" }, 4 | { "symbol": "Webflow", "category": "webflow" }, 5 | { "symbol": "React", "category": "react" }, 6 | { "symbol": "NeuralSearch", "category": "neuralsearch" }, 7 | { "symbol": "Flutter", "category": "flutter" } 8 | ] -------------------------------------------------------------------------------- /examples/pattern-replace.json.example: -------------------------------------------------------------------------------- 1 | [ 2 | { "symbol": "instant search", "value": "InstantSearch" }, 3 | { "symbol": "auto complete", "value": "Autocomplete" }, 4 | { "symbol": "auto-complete", "value": "Autocomplete" }, 5 | { "symbol": "webflow", "value": "Webflow" }, 6 | { "symbol": "web flow", "value": "Webflow" }, 7 | { "symbol": "react", "value": "React" }, 8 | { "symbol": "ChatGPD", "value": "ChatGPT" }, 9 | { "symbol": "neural search", "value": "NeuralSearch" } 10 | ] -------------------------------------------------------------------------------- /examples/preview-autocomplete/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | .vercel 132 | -------------------------------------------------------------------------------- /examples/preview-autocomplete/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License Copyright (c) 2022 Chuck Meyer 2 | 3 | Permission is hereby granted, free of 4 | charge, to any person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, copy, modify, merge, 7 | publish, distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to the 9 | following conditions: 10 | 11 | The above copyright notice and this permission notice 12 | (including the next paragraph) shall be included in all copies or substantial 13 | portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 18 | EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /examples/preview-autocomplete/README.md: -------------------------------------------------------------------------------- 1 | # A/V Search Autocomplete with Preview 2 | 3 | This front end is modeled after the Algolia documentation search as detailed in [this blog post](https://www.algolia.com/blog/ux/replicating-the-algolia-documentation-search-with-autocomplete/). 4 | 5 | This is a cmd-K style search bar that includes query suggestions, click event capture, and a preview panel. You can navigate the front end using either the keyboard or mouse. Clicking an entry will open the YouTube video at the exact point in the session where the results were found. 6 | 7 | To run locally: 8 | 9 | `npm run dev` 10 | 11 | You can find a running demo here: 12 | 13 | [https://avsearch.vercel.app](https://avsearch.vercel.app) 14 | 15 | -------------------------------------------------------------------------------- /examples/preview-autocomplete/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | DevCon Moments | A/V Search 10 | 11 | 12 | 13 |
14 |
15 |

16 | 17 | DevCon Moments 18 |

19 |

20 | A searchable archive of all of the sessions from Algolia DevCon 2022/2023 transcribed with OpenAI's Whisper library. Find all of your favorite DevCon moments! 21 |

22 | 23 | 26 |
27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /examples/preview-autocomplete/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "preview-autocomplete", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "build": "parcel build index.html", 7 | "dev": "parcel index.html", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "Chuck Meyer", 11 | "license": "MIT", 12 | "dependencies": { 13 | "@algolia/autocomplete-js": "^1.7.3", 14 | "@algolia/autocomplete-plugin-algolia-insights": "^1.7.3", 15 | "@algolia/autocomplete-plugin-query-suggestions": "^1.7.3", 16 | "@algolia/autocomplete-theme-classic": "^1.7.3", 17 | "algoliasearch": "^4.14.2", 18 | "preact": "^10.11.3", 19 | "search-insights": "^2.2.3" 20 | }, 21 | "devDependencies": { 22 | "parcel": "^2.8.0", 23 | "typescript": "^4.9.3" 24 | }, 25 | "alias": { 26 | "$": "./src/", 27 | "react": "preact/compat", 28 | "react-dom": "preact/compat", 29 | "react-dom/test-utils": "preact/test-utils", 30 | "react/jsx-runtime": "preact/jsx-runtime" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /examples/preview-autocomplete/public/Algolia-logo-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia-samples/avsearch/cfed813ac860f58bcb51cf824bd42dfbe8fd7c46/examples/preview-autocomplete/public/Algolia-logo-blue.png -------------------------------------------------------------------------------- /examples/preview-autocomplete/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia-samples/avsearch/cfed813ac860f58bcb51cf824bd42dfbe8fd7c46/examples/preview-autocomplete/public/favicon.png -------------------------------------------------------------------------------- /examples/preview-autocomplete/public/github-mark-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia-samples/avsearch/cfed813ac860f58bcb51cf824bd42dfbe8fd7c46/examples/preview-autocomplete/public/github-mark-white.png -------------------------------------------------------------------------------- /examples/preview-autocomplete/src/app.tsx: -------------------------------------------------------------------------------- 1 | import { h, render, Fragment } from 'preact'; 2 | import '../util/number.extensions'; 3 | import { createLoadVideoPlugin } from './createLoadVideoPlugin'; 4 | import { autocomplete, getAlgoliaResults } from '@algolia/autocomplete-js'; 5 | import algoliasearch from 'algoliasearch/lite'; 6 | import insightsClient from 'search-insights'; 7 | import { createQuerySuggestionsPlugin } from '@algolia/autocomplete-plugin-query-suggestions' 8 | import { createAlgoliaInsightsPlugin } from '@algolia/autocomplete-plugin-algolia-insights'; 9 | import '@algolia/autocomplete-theme-classic'; 10 | 11 | // Configure our Algolia Search client to connect to our indices 12 | const appId = 'OKF83BFQS4'; 13 | const apiKey = '2ee1381ed11d3fe70b60605b1e2cd3f4'; 14 | const searchClient = algoliasearch(appId, apiKey); 15 | 16 | // Configure our Algolia Insight client to send click and conversion events 17 | insightsClient('init', { appId, apiKey, useCookie: true }); 18 | const algoliaInsightsPlugin = createAlgoliaInsightsPlugin({ insightsClient }); 19 | 20 | const loadVideoPlugin = createLoadVideoPlugin({ 21 | container: 'ytVideo' 22 | }); 23 | 24 | // Configure query suggestions 25 | const querySuggestionsPlugin = createQuerySuggestionsPlugin({ 26 | searchClient, 27 | indexName: 'devcon-22-sessions_query_suggestions', 28 | getSearchParams({ state }) { 29 | return { hitsPerPage: state.query ? 3 : 5 }; 30 | }, 31 | transformSource({ source }) { 32 | return { 33 | ...source, 34 | templates: { 35 | ...source.templates, 36 | header({ state }) { 37 | return ( 38 | 39 | Suggestions 40 |
41 | 42 | ); 43 | }, 44 | }, 45 | }; 46 | }, 47 | }); 48 | 49 | const { setIsOpen } = autocomplete({ 50 | container: '#autocomplete', 51 | defaultActiveItemId: 0, 52 | detachedMediaQuery: '', 53 | openOnFocus: true, 54 | placeholder: 'Search sessions', 55 | plugins: [loadVideoPlugin,algoliaInsightsPlugin,querySuggestionsPlugin], 56 | getSources() { 57 | return [ 58 | { 59 | sourceId: 'sessions-devcon-2023', 60 | getItems({ query }) { 61 | return getAlgoliaResults({ 62 | searchClient, 63 | queries: [ 64 | { 65 | indexName: 'devcon-23-sessions', 66 | query, 67 | params: { 68 | clickAnalytics: true, 69 | attributesToSnippet: ['videoTitle:10', 'text:10'], 70 | snippetEllipsisText: '…', 71 | hitsPerPage: 10, 72 | distinct: 2 73 | } 74 | } 75 | ] 76 | }) 77 | }, 78 | onActive({ item, setContext }) { 79 | setContext({ preview: item }); 80 | }, 81 | templates: { 82 | header({ items, state, Fragment }) { 83 | if (items.length === 0 || state.query === '') { 84 | return null; 85 | } 86 | 87 | return ( 88 | 89 | 90 | Sessions DevCon 2023 91 | 92 |
93 | 94 | ); 95 | }, 96 | noResults() { 97 | return "No sessions match this query."; 98 | }, 99 | item({ item, state, components }) { 100 | if (state.query === '') { 101 | return null; 102 | } 103 | 104 | return ( 105 |
106 |
107 |
108 | {item.videoTitle} 114 |
115 |
116 |
117 | 118 |
119 |
120 | 121 |
122 |
123 |
124 |
125 | 133 |
134 |
135 | ) 136 | } 137 | } 138 | }, 139 | { 140 | sourceId: 'sessions-2022', 141 | getItems({ query }) { 142 | return getAlgoliaResults({ 143 | searchClient, 144 | queries: [ 145 | { 146 | indexName: 'devcon-22-sessions', 147 | query, 148 | params: { 149 | clickAnalytics: true, 150 | attributesToSnippet: ['videoTitle:10', 'text:10'], 151 | snippetEllipsisText: '…', 152 | hitsPerPage: 10, 153 | distinct: 2 154 | } 155 | } 156 | ] 157 | }) 158 | }, 159 | onActive({ item, setContext }) { 160 | setContext({ preview: item }); 161 | }, 162 | templates: { 163 | header({ items, state, Fragment }) { 164 | if (items.length === 0 || state.query === '') { 165 | return null; 166 | } 167 | 168 | return ( 169 | 170 | 171 | Sessions 2022 172 | 173 |
174 | 175 | ); 176 | }, 177 | noResults() { 178 | return "No sessions match this query."; 179 | }, 180 | item({ item, state, components }) { 181 | if (state.query === '') { 182 | return null; 183 | } 184 | 185 | return ( 186 |
187 |
188 |
189 | {item.videoTitle} 195 |
196 |
197 |
198 | 199 |
200 |
201 | 202 |
203 |
204 |
205 |
206 | 214 |
215 |
216 | ) 217 | } 218 | } 219 | } 220 | ]; 221 | }, 222 | render({ children, state, Fragment, components }, root) { 223 | const { preview } = state.context 224 | render( 225 | 226 |
227 |
{children}
228 | {state.query !== '' && 'preview' in state.context && ( 229 |
230 |
231 |

232 | ...{preview.context.before.text} {preview.context.after.text}... 233 |

234 |
235 |
236 | 237 |
238 |
239 | 240 |
241 |
242 | {preview.start.toTimeString()}-{preview.end.toTimeString()} 243 |
244 |
245 | {preview.videoTitle} 246 |
247 |
248 | {preview.categories.join(', ')} 249 |
250 |
251 | )} 252 |
253 |
, 254 | root 255 | ); 256 | } 257 | }); 258 | 259 | document.addEventListener('keydown', (event) => { 260 | if (event.metaKey && event.key.toLowerCase() === 'k') { 261 | setIsOpen(true); 262 | } 263 | }); 264 | -------------------------------------------------------------------------------- /examples/preview-autocomplete/src/createLoadVideoPlugin.ts: -------------------------------------------------------------------------------- 1 | function changeChannel(container: string, vidID: string, time: number) { 2 | const url = `https://www.youtube.com/embed/${vidID}?start=${Math.trunc(time)}&autoplay=1`; 3 | // console.log(url); 4 | // console.log(container); 5 | document.getElementById(container).src = url; 6 | } 7 | 8 | export function createLoadVideoPlugin(options) { 9 | return { 10 | name: 'aa.LoadVideoPlugin', 11 | subscribe({ onSelect }) { 12 | onSelect(({ item, state, event }) => { 13 | if (item.__autocomplete_indexName.endsWith('query_suggestions')) { 14 | console.log('Query suggestion'); 15 | // event.preventDefault(); 16 | // event.stopPropagation(); 17 | // setQuery(`${item.query} `); 18 | // refresh(); 19 | } 20 | else { 21 | // console.log(item.videoID); 22 | changeChannel(options.container, item.videoID, item.start); 23 | } 24 | }); 25 | }, 26 | __autocomplete_pluginOptions: options, 27 | }; 28 | } 29 | 30 | -------------------------------------------------------------------------------- /examples/preview-autocomplete/src/env.ts: -------------------------------------------------------------------------------- 1 | import * as preact from 'preact'; 2 | 3 | // Parcel picks the `source` field of the monorepo packages and thus doesn't 4 | // apply the Babel config. We therefore need to manually override the constants 5 | // in the app, as well as the React pragmas. 6 | // See https://twitter.com/devongovett/status/1134231234605830144 7 | (global as any).__DEV__ = process.env.NODE_ENV !== 'production'; 8 | (global as any).__TEST__ = false; 9 | (global as any).h = preact.h; 10 | (global as any).React = preact; 11 | -------------------------------------------------------------------------------- /examples/preview-autocomplete/styles/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | body { 6 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 7 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 8 | -webkit-font-smoothing: antialiased; 9 | -moz-osx-font-smoothing: grayscale; 10 | padding: 1rem; 11 | } 12 | 13 | @media (prefers-color-scheme: dark) { 14 | html { 15 | color-scheme: dark; 16 | } 17 | body { 18 | color: white; 19 | background: black; 20 | } 21 | } 22 | 23 | .container { 24 | margin: 0 auto; 25 | padding: 0 2rem; 26 | max-width: 640px; 27 | width: 100%; 28 | } 29 | 30 | .title { 31 | margin: 0; 32 | line-height: 1.15; 33 | font-size: 4rem; 34 | padding: 1rem; 35 | } 36 | 37 | .title, 38 | .description { 39 | text-align: center; 40 | } 41 | 42 | .description { 43 | margin: 1.5rem 0; 44 | line-height: 1.5; 45 | font-size: 1.5rem; 46 | } 47 | 48 | .footer{ 49 | text-align: center; 50 | margin: 4rem 0; 51 | line-height: 1.5; 52 | } 53 | 54 | body[data-theme="dark"] { 55 | background-color: rgb(0, 0, 0); 56 | color: rgb(183, 192, 199); 57 | } 58 | 59 | .aa-Grid { 60 | display: grid; 61 | padding: 2 calc(var(--aa-spacing-half) / 2); 62 | column-gap: calc(var(--aa-spacing-half) / 2); 63 | } 64 | 65 | .aa-DetachedContainer .aa-Grid { 66 | grid-template-columns: 1fr; 67 | } 68 | 69 | .aa-DetachedContainer--modal .aa-Grid { 70 | grid-template-columns: 50% 1fr; 71 | } 72 | 73 | .aa-MultiGrid { 74 | display: grid; 75 | grid-template-columns: 1fr 1fr 1fr; 76 | column-gap: calc(var(--aa-spacing-half) / 2); 77 | } 78 | 79 | .aa-Column { 80 | padding: calc(var(--aa-spacing-half) / 2) 0; 81 | } 82 | .aa-PanelLayout { 83 | padding: 0; 84 | overflow-x: hidden; 85 | } 86 | 87 | .aa-Detached .aa-DetachedContainer { 88 | background: none; 89 | } 90 | 91 | .aa-DetachedContainer .aa-DetachedFormContainer { 92 | background: rgba( 93 | var(--aa-background-color-rgb), 94 | var(--aa-background-color-alpha) 95 | ); 96 | padding: calc(var(--aa-spacing-half) * 1.5); 97 | } 98 | 99 | .aa-DetachedContainer .aa-Preview { 100 | display: none; 101 | } 102 | 103 | .aa-DetachedContainer--modal .aa-Preview { 104 | display: block; 105 | } 106 | 107 | .aa-PreviewLink { 108 | color: inherit; 109 | text-decoration: none; 110 | } 111 | 112 | .aa-PreviewImage { 113 | display: flex; 114 | justify-content: center; 115 | height: 150px; 116 | margin-bottom: var(--aa-spacing-half); 117 | padding: var(--aa-spacing-half); 118 | background: var(--aa-background-color); 119 | border: 1px solid var(--aa-selected-color); 120 | border-radius: 3px; 121 | } 122 | 123 | .aa-PreviewImage img { 124 | max-width: 100%; 125 | object-fit: contain; 126 | } 127 | 128 | .aa-PreviewTitle { 129 | color: var(--aa-primary-color-rgb); 130 | margin-bottom: var(--aa-spacing-half); 131 | font-weight: bold; 132 | font-size: 0.85em; 133 | } 134 | 135 | .aa-PreviewTimeIcon, 136 | .aa-PreviewTime { 137 | padding: 0.5em 0.25em; 138 | vertical-align: middle; 139 | display: inline-block; 140 | font-size: 0.85em; 141 | color: var(--aa-muted-color-rgb); 142 | } 143 | 144 | .aa-PreviewTitle mark, 145 | .aa-PreviewDescription mark { 146 | background: none; 147 | color: var(--aa-primary-color); 148 | } 149 | 150 | .aa-PreviewContent { 151 | background: #f9f9f9; 152 | border-left: 10px solid #ccc; 153 | margin: 1.5em 10px; 154 | quotes: "\201C""\201D""\2018""\2019"; 155 | font-style: italic; 156 | padding: 1.0em 0.5em; 157 | } 158 | 159 | .aa-PreviewContent:before { 160 | color: #ccc; 161 | content: open-quote; 162 | font-size: 4em; 163 | line-height: 0.1em; 164 | margin-right: 0.25em; 165 | vertical-align: -0.4em; 166 | } 167 | 168 | .aa-PreviewContent p { 169 | display: inline; 170 | } 171 | 172 | [data-autocomplete-source-id="sesions"] { 173 | margin-bottom: var(--aa-spacing-half); 174 | } 175 | 176 | -------------------------------------------------------------------------------- /examples/preview-autocomplete/util/number.extensions.ts: -------------------------------------------------------------------------------- 1 | interface Number { 2 | toTimeString() : string; 3 | } 4 | 5 | Number.prototype.toTimeString = function (): string { 6 | const sec_num = parseInt(this, 10); // don't forget the second param 7 | const hours = Math.floor(sec_num / 3600); 8 | const minutes = Math.floor((sec_num - (hours * 3600)) / 60); 9 | const seconds = sec_num - (hours * 3600) - (minutes * 60); 10 | 11 | const hoursString = ( hours < 10 ? '0'+hours.toString() : hours.toString() ); 12 | const minutesString = ( minutes < 10 ? '0'+minutes.toString() : minutes.toString() ); 13 | const secondsString = ( seconds < 10 ? '0'+seconds.toString() : seconds.toString() ); 14 | return ( hours > 0 ? 15 | hoursString+':'+minutesString+':'+secondsString : 16 | minutesString+':'+secondsString 17 | ); 18 | } 19 | 20 | -------------------------------------------------------------------------------- /examples/settings.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "alternativesAsExact": [ 3 | "ignorePlurals", 4 | "singleWordSynonym" 5 | ], 6 | "attributeForDistinct": "videoTitle", 7 | "distinct": 2, 8 | "exactOnSingleWordQuery": "attribute", 9 | "highlightPostTag": "", 10 | "highlightPreTag": "", 11 | "hitsPerPage": 20, 12 | "maxValuesPerFacet": 100, 13 | "minWordSizefor1Typo": 4, 14 | "minWordSizefor2Typos": 8, 15 | "paginationLimitedTo": 1000, 16 | "queryType": "prefixLast", 17 | "ranking": [ 18 | "typo", 19 | "geo", 20 | "words", 21 | "filters", 22 | "proximity", 23 | "attribute", 24 | "exact", 25 | "custom" 26 | ], 27 | "removeWordsIfNoResults": "none", 28 | "searchableAttributes": [ 29 | "unordered(text)", 30 | "unordered(categories)", 31 | "unordered(videoTitle)" 32 | ], 33 | "separatorsToIndex": "", 34 | "snippetEllipsisText": "", 35 | "version": 2 36 | } 37 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "algoliasearch" 5 | version = "2.6.3" 6 | description = "Algolia Search API Client for Python." 7 | optional = false 8 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 9 | files = [ 10 | {file = "algoliasearch-2.6.3-py2.py3-none-any.whl", hash = "sha256:0647732a91549132514ba5263cb12c7cc443baeb54bd52d324f84f6acd845ac1"}, 11 | {file = "algoliasearch-2.6.3.tar.gz", hash = "sha256:9706d1238ad912e87a9fb43791399de47fe559afd32964e91dfc69a7ca3fe0ce"}, 12 | ] 13 | 14 | [package.dependencies] 15 | requests = ">=2.21,<3.0" 16 | 17 | [[package]] 18 | name = "black" 19 | version = "22.12.0" 20 | description = "The uncompromising code formatter." 21 | optional = false 22 | python-versions = ">=3.7" 23 | files = [ 24 | {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, 25 | {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, 26 | {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, 27 | {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, 28 | {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, 29 | {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, 30 | {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, 31 | {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, 32 | {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, 33 | {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, 34 | {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, 35 | {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, 36 | ] 37 | 38 | [package.dependencies] 39 | click = ">=8.0.0" 40 | mypy-extensions = ">=0.4.3" 41 | pathspec = ">=0.9.0" 42 | platformdirs = ">=2" 43 | tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} 44 | typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} 45 | 46 | [package.extras] 47 | colorama = ["colorama (>=0.4.3)"] 48 | d = ["aiohttp (>=3.7.4)"] 49 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 50 | uvloop = ["uvloop (>=0.15.2)"] 51 | 52 | [[package]] 53 | name = "certifi" 54 | version = "2023.7.22" 55 | description = "Python package for providing Mozilla's CA Bundle." 56 | optional = false 57 | python-versions = ">=3.6" 58 | files = [ 59 | {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, 60 | {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, 61 | ] 62 | 63 | [[package]] 64 | name = "cfgv" 65 | version = "3.4.0" 66 | description = "Validate configuration and produce human readable error messages." 67 | optional = false 68 | python-versions = ">=3.8" 69 | files = [ 70 | {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, 71 | {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, 72 | ] 73 | 74 | [[package]] 75 | name = "charset-normalizer" 76 | version = "3.2.0" 77 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 78 | optional = false 79 | python-versions = ">=3.7.0" 80 | files = [ 81 | {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, 82 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, 83 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, 84 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, 85 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, 86 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, 87 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, 88 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, 89 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, 90 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, 91 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, 92 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, 93 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, 94 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, 95 | {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, 96 | {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, 97 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, 98 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, 99 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, 100 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, 101 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, 102 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, 103 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, 104 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, 105 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, 106 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, 107 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, 108 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, 109 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, 110 | {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, 111 | {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, 112 | {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, 113 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, 114 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, 115 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, 116 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, 117 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, 118 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, 119 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, 120 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, 121 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, 122 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, 123 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, 124 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, 125 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, 126 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, 127 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, 128 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, 129 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, 130 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, 131 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, 132 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, 133 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, 134 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, 135 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, 136 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, 137 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, 138 | {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, 139 | {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, 140 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, 141 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, 142 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, 143 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, 144 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, 145 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, 146 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, 147 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, 148 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, 149 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, 150 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, 151 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, 152 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, 153 | {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, 154 | {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, 155 | {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, 156 | ] 157 | 158 | [[package]] 159 | name = "click" 160 | version = "8.1.7" 161 | description = "Composable command line interface toolkit" 162 | optional = false 163 | python-versions = ">=3.7" 164 | files = [ 165 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, 166 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, 167 | ] 168 | 169 | [package.dependencies] 170 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 171 | 172 | [[package]] 173 | name = "colorama" 174 | version = "0.4.6" 175 | description = "Cross-platform colored terminal text." 176 | optional = false 177 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 178 | files = [ 179 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 180 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 181 | ] 182 | 183 | [[package]] 184 | name = "contextlib2" 185 | version = "21.6.0" 186 | description = "Backports and enhancements for the contextlib module" 187 | optional = false 188 | python-versions = ">=3.6" 189 | files = [ 190 | {file = "contextlib2-21.6.0-py2.py3-none-any.whl", hash = "sha256:3fbdb64466afd23abaf6c977627b75b6139a5a3e8ce38405c5b413aed7a0471f"}, 191 | {file = "contextlib2-21.6.0.tar.gz", hash = "sha256:ab1e2bfe1d01d968e1b7e8d9023bc51ef3509bba217bb730cee3827e1ee82869"}, 192 | ] 193 | 194 | [[package]] 195 | name = "distlib" 196 | version = "0.3.7" 197 | description = "Distribution utilities" 198 | optional = false 199 | python-versions = "*" 200 | files = [ 201 | {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, 202 | {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, 203 | ] 204 | 205 | [[package]] 206 | name = "filelock" 207 | version = "3.12.2" 208 | description = "A platform independent file lock." 209 | optional = false 210 | python-versions = ">=3.7" 211 | files = [ 212 | {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, 213 | {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, 214 | ] 215 | 216 | [package.extras] 217 | docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] 218 | testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] 219 | 220 | [[package]] 221 | name = "flake8" 222 | version = "5.0.4" 223 | description = "the modular source code checker: pep8 pyflakes and co" 224 | optional = false 225 | python-versions = ">=3.6.1" 226 | files = [ 227 | {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, 228 | {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, 229 | ] 230 | 231 | [package.dependencies] 232 | mccabe = ">=0.7.0,<0.8.0" 233 | pycodestyle = ">=2.9.0,<2.10.0" 234 | pyflakes = ">=2.5.0,<2.6.0" 235 | 236 | [[package]] 237 | name = "identify" 238 | version = "2.5.27" 239 | description = "File identification library for Python" 240 | optional = false 241 | python-versions = ">=3.8" 242 | files = [ 243 | {file = "identify-2.5.27-py2.py3-none-any.whl", hash = "sha256:fdb527b2dfe24602809b2201e033c2a113d7bdf716db3ca8e3243f735dcecaba"}, 244 | {file = "identify-2.5.27.tar.gz", hash = "sha256:287b75b04a0e22d727bc9a41f0d4f3c1bcada97490fa6eabb5b28f0e9097e733"}, 245 | ] 246 | 247 | [package.extras] 248 | license = ["ukkonen"] 249 | 250 | [[package]] 251 | name = "idna" 252 | version = "3.4" 253 | description = "Internationalized Domain Names in Applications (IDNA)" 254 | optional = false 255 | python-versions = ">=3.5" 256 | files = [ 257 | {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, 258 | {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, 259 | ] 260 | 261 | [[package]] 262 | name = "importlib-metadata" 263 | version = "6.8.0" 264 | description = "Read metadata from Python packages" 265 | optional = false 266 | python-versions = ">=3.8" 267 | files = [ 268 | {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, 269 | {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, 270 | ] 271 | 272 | [package.dependencies] 273 | zipp = ">=0.5" 274 | 275 | [package.extras] 276 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 277 | perf = ["ipython"] 278 | testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] 279 | 280 | [[package]] 281 | name = "jinja2" 282 | version = "3.1.2" 283 | description = "A very fast and expressive template engine." 284 | optional = false 285 | python-versions = ">=3.7" 286 | files = [ 287 | {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, 288 | {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, 289 | ] 290 | 291 | [package.dependencies] 292 | MarkupSafe = ">=2.0" 293 | 294 | [package.extras] 295 | i18n = ["Babel (>=2.7)"] 296 | 297 | [[package]] 298 | name = "llvmlite" 299 | version = "0.40.1" 300 | description = "lightweight wrapper around basic LLVM functionality" 301 | optional = false 302 | python-versions = ">=3.8" 303 | files = [ 304 | {file = "llvmlite-0.40.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ce9b1c7a59936382ffde7871978cddcda14098e5a76d961e204523e5c372fb"}, 305 | {file = "llvmlite-0.40.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3673c53cb21c65d2ff3704962b5958e967c6fc0bd0cff772998face199e8d87b"}, 306 | {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba2747cf5b4954e945c287fe310b3fcc484e2a9d1b0c273e99eb17d103bb0e6"}, 307 | {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd5e82cc990e5a3e343a3bf855c26fdfe3bfae55225f00efd01c05bbda79918"}, 308 | {file = "llvmlite-0.40.1-cp310-cp310-win32.whl", hash = "sha256:09f83ea7a54509c285f905d968184bba00fc31ebf12f2b6b1494d677bb7dde9b"}, 309 | {file = "llvmlite-0.40.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b37297f3cbd68d14a97223a30620589d98ad1890e5040c9e5fc181063f4ed49"}, 310 | {file = "llvmlite-0.40.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a66a5bd580951751b4268f4c3bddcef92682814d6bc72f3cd3bb67f335dd7097"}, 311 | {file = "llvmlite-0.40.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:467b43836b388eaedc5a106d76761e388dbc4674b2f2237bc477c6895b15a634"}, 312 | {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c23edd196bd797dc3a7860799054ea3488d2824ecabc03f9135110c2e39fcbc"}, 313 | {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36d9f244b6680cb90bbca66b146dabb2972f4180c64415c96f7c8a2d8b60a36"}, 314 | {file = "llvmlite-0.40.1-cp311-cp311-win_amd64.whl", hash = "sha256:5b3076dc4e9c107d16dc15ecb7f2faf94f7736cd2d5e9f4dc06287fd672452c1"}, 315 | {file = "llvmlite-0.40.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a7525db121f2e699809b539b5308228854ccab6693ecb01b52c44a2f5647e20"}, 316 | {file = "llvmlite-0.40.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:84747289775d0874e506f907a4513db889471607db19b04de97d144047fec885"}, 317 | {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e35766e42acef0fe7d1c43169a8ffc327a47808fae6a067b049fe0e9bbf84dd5"}, 318 | {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda71de10a1f48416309e408ea83dab5bf36058f83e13b86a2961defed265568"}, 319 | {file = "llvmlite-0.40.1-cp38-cp38-win32.whl", hash = "sha256:96707ebad8b051bbb4fc40c65ef93b7eeee16643bd4d579a14d11578e4b7a647"}, 320 | {file = "llvmlite-0.40.1-cp38-cp38-win_amd64.whl", hash = "sha256:e44f854dc11559795bcdeaf12303759e56213d42dabbf91a5897aa2d8b033810"}, 321 | {file = "llvmlite-0.40.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f643d15aacd0b0b0dc8b74b693822ba3f9a53fa63bc6a178c2dba7cc88f42144"}, 322 | {file = "llvmlite-0.40.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39a0b4d0088c01a469a5860d2e2d7a9b4e6a93c0f07eb26e71a9a872a8cadf8d"}, 323 | {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9329b930d699699846623054121ed105fd0823ed2180906d3b3235d361645490"}, 324 | {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2dbbb8424037ca287983b115a29adf37d806baf7e1bf4a67bd2cffb74e085ed"}, 325 | {file = "llvmlite-0.40.1-cp39-cp39-win32.whl", hash = "sha256:e74e7bec3235a1e1c9ad97d897a620c5007d0ed80c32c84c1d787e7daa17e4ec"}, 326 | {file = "llvmlite-0.40.1-cp39-cp39-win_amd64.whl", hash = "sha256:ff8f31111bb99d135ff296757dc81ab36c2dee54ed4bd429158a96da9807c316"}, 327 | {file = "llvmlite-0.40.1.tar.gz", hash = "sha256:5cdb0d45df602099d833d50bd9e81353a5e036242d3c003c5b294fc61d1986b4"}, 328 | ] 329 | 330 | [[package]] 331 | name = "markupsafe" 332 | version = "2.1.3" 333 | description = "Safely add untrusted strings to HTML/XML markup." 334 | optional = false 335 | python-versions = ">=3.7" 336 | files = [ 337 | {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, 338 | {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, 339 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, 340 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, 341 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, 342 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, 343 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, 344 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, 345 | {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, 346 | {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, 347 | {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, 348 | {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, 349 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, 350 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, 351 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, 352 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, 353 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, 354 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, 355 | {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, 356 | {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, 357 | {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, 358 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, 359 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, 360 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, 361 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, 362 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, 363 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, 364 | {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, 365 | {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, 366 | {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, 367 | {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, 368 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, 369 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, 370 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, 371 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, 372 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, 373 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, 374 | {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, 375 | {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, 376 | {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, 377 | {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, 378 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, 379 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, 380 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, 381 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, 382 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, 383 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, 384 | {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, 385 | {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, 386 | {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, 387 | ] 388 | 389 | [[package]] 390 | name = "mccabe" 391 | version = "0.7.0" 392 | description = "McCabe checker, plugin for flake8" 393 | optional = false 394 | python-versions = ">=3.6" 395 | files = [ 396 | {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, 397 | {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, 398 | ] 399 | 400 | [[package]] 401 | name = "more-itertools" 402 | version = "10.1.0" 403 | description = "More routines for operating on iterables, beyond itertools" 404 | optional = false 405 | python-versions = ">=3.8" 406 | files = [ 407 | {file = "more-itertools-10.1.0.tar.gz", hash = "sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a"}, 408 | {file = "more_itertools-10.1.0-py3-none-any.whl", hash = "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6"}, 409 | ] 410 | 411 | [[package]] 412 | name = "mpmath" 413 | version = "1.3.0" 414 | description = "Python library for arbitrary-precision floating-point arithmetic" 415 | optional = false 416 | python-versions = "*" 417 | files = [ 418 | {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, 419 | {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, 420 | ] 421 | 422 | [package.extras] 423 | develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] 424 | docs = ["sphinx"] 425 | gmpy = ["gmpy2 (>=2.1.0a4)"] 426 | tests = ["pytest (>=4.6)"] 427 | 428 | [[package]] 429 | name = "mypy-extensions" 430 | version = "1.0.0" 431 | description = "Type system extensions for programs checked with the mypy type checker." 432 | optional = false 433 | python-versions = ">=3.5" 434 | files = [ 435 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 436 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 437 | ] 438 | 439 | [[package]] 440 | name = "networkx" 441 | version = "3.1" 442 | description = "Python package for creating and manipulating graphs and networks" 443 | optional = false 444 | python-versions = ">=3.8" 445 | files = [ 446 | {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, 447 | {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, 448 | ] 449 | 450 | [package.extras] 451 | default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] 452 | developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] 453 | doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] 454 | extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] 455 | test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] 456 | 457 | [[package]] 458 | name = "nodeenv" 459 | version = "1.8.0" 460 | description = "Node.js virtual environment builder" 461 | optional = false 462 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" 463 | files = [ 464 | {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, 465 | {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, 466 | ] 467 | 468 | [package.dependencies] 469 | setuptools = "*" 470 | 471 | [[package]] 472 | name = "numba" 473 | version = "0.57.1" 474 | description = "compiling Python code using LLVM" 475 | optional = false 476 | python-versions = ">=3.8" 477 | files = [ 478 | {file = "numba-0.57.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db8268eb5093cae2288942a8cbd69c9352f6fe6e0bfa0a9a27679436f92e4248"}, 479 | {file = "numba-0.57.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:643cb09a9ba9e1bd8b060e910aeca455e9442361e80fce97690795ff9840e681"}, 480 | {file = "numba-0.57.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e9fab973d9e82c9f8449f75994a898daaaf821d84f06fbb0b9de2293dd9306"}, 481 | {file = "numba-0.57.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0602e4f896e6a6d844517c3ab434bc978e7698a22a733cc8124465898c28fa8"}, 482 | {file = "numba-0.57.1-cp310-cp310-win32.whl", hash = "sha256:3d6483c27520d16cf5d122868b79cad79e48056ecb721b52d70c126bed65431e"}, 483 | {file = "numba-0.57.1-cp310-cp310-win_amd64.whl", hash = "sha256:a32ee263649aa3c3587b833d6311305379529570e6c20deb0c6f4fb5bc7020db"}, 484 | {file = "numba-0.57.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c078f84b5529a7fdb8413bb33d5100f11ec7b44aa705857d9eb4e54a54ff505"}, 485 | {file = "numba-0.57.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e447c4634d1cc99ab50d4faa68f680f1d88b06a2a05acf134aa6fcc0342adeca"}, 486 | {file = "numba-0.57.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4838edef2df5f056cb8974670f3d66562e751040c448eb0b67c7e2fec1726649"}, 487 | {file = "numba-0.57.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b17fbe4a69dcd9a7cd49916b6463cd9a82af5f84911feeb40793b8bce00dfa7"}, 488 | {file = "numba-0.57.1-cp311-cp311-win_amd64.whl", hash = "sha256:93df62304ada9b351818ba19b1cfbddaf72cd89348e81474326ca0b23bf0bae1"}, 489 | {file = "numba-0.57.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8e00ca63c5d0ad2beeb78d77f087b3a88c45ea9b97e7622ab2ec411a868420ee"}, 490 | {file = "numba-0.57.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff66d5b022af6c7d81ddbefa87768e78ed4f834ab2da6ca2fd0d60a9e69b94f5"}, 491 | {file = "numba-0.57.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:60ec56386076e9eed106a87c96626d5686fbb16293b9834f0849cf78c9491779"}, 492 | {file = "numba-0.57.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c057ccedca95df23802b6ccad86bb318be624af45b5a38bb8412882be57a681"}, 493 | {file = "numba-0.57.1-cp38-cp38-win32.whl", hash = "sha256:5a82bf37444039c732485c072fda21a361790ed990f88db57fd6941cd5e5d307"}, 494 | {file = "numba-0.57.1-cp38-cp38-win_amd64.whl", hash = "sha256:9bcc36478773ce838f38afd9a4dfafc328d4ffb1915381353d657da7f6473282"}, 495 | {file = "numba-0.57.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae50c8c90c2ce8057f9618b589223e13faa8cbc037d8f15b4aad95a2c33a0582"}, 496 | {file = "numba-0.57.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9a1b2b69448e510d672ff9a6b18d2db9355241d93c6a77677baa14bec67dc2a0"}, 497 | {file = "numba-0.57.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3cf78d74ad9d289fbc1e5b1c9f2680fca7a788311eb620581893ab347ec37a7e"}, 498 | {file = "numba-0.57.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f47dd214adc5dcd040fe9ad2adbd2192133c9075d2189ce1b3d5f9d72863ef05"}, 499 | {file = "numba-0.57.1-cp39-cp39-win32.whl", hash = "sha256:a3eac19529956185677acb7f01864919761bfffbb9ae04bbbe5e84bbc06cfc2b"}, 500 | {file = "numba-0.57.1-cp39-cp39-win_amd64.whl", hash = "sha256:9587ba1bf5f3035575e45562ada17737535c6d612df751e811d702693a72d95e"}, 501 | {file = "numba-0.57.1.tar.gz", hash = "sha256:33c0500170d213e66d90558ad6aca57d3e03e97bb11da82e6d87ab793648cb17"}, 502 | ] 503 | 504 | [package.dependencies] 505 | importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} 506 | llvmlite = "==0.40.*" 507 | numpy = ">=1.21,<1.25" 508 | 509 | [[package]] 510 | name = "numpy" 511 | version = "1.24.4" 512 | description = "Fundamental package for array computing in Python" 513 | optional = false 514 | python-versions = ">=3.8" 515 | files = [ 516 | {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, 517 | {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, 518 | {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, 519 | {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, 520 | {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, 521 | {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, 522 | {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, 523 | {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, 524 | {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, 525 | {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, 526 | {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, 527 | {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, 528 | {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, 529 | {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, 530 | {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, 531 | {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, 532 | {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, 533 | {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, 534 | {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, 535 | {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, 536 | {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, 537 | {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, 538 | {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, 539 | {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, 540 | {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, 541 | {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, 542 | {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, 543 | {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, 544 | ] 545 | 546 | [[package]] 547 | name = "openai-whisper" 548 | version = "20230314" 549 | description = "Robust Speech Recognition via Large-Scale Weak Supervision" 550 | optional = false 551 | python-versions = ">=3.8" 552 | files = [] 553 | develop = false 554 | 555 | [package.dependencies] 556 | more-itertools = "*" 557 | numba = "*" 558 | numpy = "*" 559 | tiktoken = "0.3.3" 560 | torch = "*" 561 | tqdm = "*" 562 | 563 | [package.extras] 564 | dev = ["black", "flake8", "isort", "pytest", "scipy"] 565 | 566 | [package.source] 567 | type = "git" 568 | url = "https://github.com/openai/whisper.git" 569 | reference = "HEAD" 570 | resolved_reference = "e8622f9afc4eba139bf796c210f5c01081000472" 571 | 572 | [[package]] 573 | name = "pathspec" 574 | version = "0.11.2" 575 | description = "Utility library for gitignore style pattern matching of file paths." 576 | optional = false 577 | python-versions = ">=3.7" 578 | files = [ 579 | {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, 580 | {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, 581 | ] 582 | 583 | [[package]] 584 | name = "platformdirs" 585 | version = "3.10.0" 586 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 587 | optional = false 588 | python-versions = ">=3.7" 589 | files = [ 590 | {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, 591 | {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, 592 | ] 593 | 594 | [package.extras] 595 | docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] 596 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] 597 | 598 | [[package]] 599 | name = "pre-commit" 600 | version = "2.21.0" 601 | description = "A framework for managing and maintaining multi-language pre-commit hooks." 602 | optional = false 603 | python-versions = ">=3.7" 604 | files = [ 605 | {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, 606 | {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, 607 | ] 608 | 609 | [package.dependencies] 610 | cfgv = ">=2.0.0" 611 | identify = ">=1.0.0" 612 | nodeenv = ">=0.11.1" 613 | pyyaml = ">=5.1" 614 | virtualenv = ">=20.10.0" 615 | 616 | [[package]] 617 | name = "pycodestyle" 618 | version = "2.9.1" 619 | description = "Python style guide checker" 620 | optional = false 621 | python-versions = ">=3.6" 622 | files = [ 623 | {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, 624 | {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, 625 | ] 626 | 627 | [[package]] 628 | name = "pyflakes" 629 | version = "2.5.0" 630 | description = "passive checker of Python programs" 631 | optional = false 632 | python-versions = ">=3.6" 633 | files = [ 634 | {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, 635 | {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, 636 | ] 637 | 638 | [[package]] 639 | name = "pyyaml" 640 | version = "6.0.1" 641 | description = "YAML parser and emitter for Python" 642 | optional = false 643 | python-versions = ">=3.6" 644 | files = [ 645 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, 646 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, 647 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, 648 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, 649 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, 650 | {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, 651 | {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, 652 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, 653 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, 654 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, 655 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, 656 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, 657 | {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, 658 | {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, 659 | {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, 660 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, 661 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, 662 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, 663 | {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, 664 | {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, 665 | {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, 666 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, 667 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, 668 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, 669 | {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, 670 | {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, 671 | {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, 672 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, 673 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, 674 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, 675 | {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, 676 | {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, 677 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, 678 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, 679 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, 680 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, 681 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, 682 | {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, 683 | {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, 684 | {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, 685 | ] 686 | 687 | [[package]] 688 | name = "regex" 689 | version = "2023.8.8" 690 | description = "Alternative regular expression module, to replace re." 691 | optional = false 692 | python-versions = ">=3.6" 693 | files = [ 694 | {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, 695 | {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, 696 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, 697 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, 698 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, 699 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, 700 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, 701 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, 702 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, 703 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, 704 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, 705 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, 706 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, 707 | {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, 708 | {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, 709 | {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, 710 | {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, 711 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, 712 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, 713 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, 714 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, 715 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, 716 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, 717 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, 718 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, 719 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, 720 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, 721 | {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, 722 | {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, 723 | {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, 724 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, 725 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, 726 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, 727 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, 728 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, 729 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, 730 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, 731 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, 732 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, 733 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, 734 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, 735 | {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, 736 | {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, 737 | {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, 738 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, 739 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, 740 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, 741 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, 742 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, 743 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, 744 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, 745 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, 746 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, 747 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, 748 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, 749 | {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, 750 | {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, 751 | {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, 752 | {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, 753 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, 754 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, 755 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, 756 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, 757 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, 758 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, 759 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, 760 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, 761 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, 762 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, 763 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, 764 | {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, 765 | {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, 766 | {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, 767 | {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, 768 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, 769 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, 770 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, 771 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, 772 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, 773 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, 774 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, 775 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, 776 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, 777 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, 778 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, 779 | {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, 780 | {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, 781 | {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, 782 | ] 783 | 784 | [[package]] 785 | name = "requests" 786 | version = "2.31.0" 787 | description = "Python HTTP for Humans." 788 | optional = false 789 | python-versions = ">=3.7" 790 | files = [ 791 | {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, 792 | {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, 793 | ] 794 | 795 | [package.dependencies] 796 | certifi = ">=2017.4.17" 797 | charset-normalizer = ">=2,<4" 798 | idna = ">=2.5,<4" 799 | urllib3 = ">=1.21.1,<3" 800 | 801 | [package.extras] 802 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 803 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 804 | 805 | [[package]] 806 | name = "schema" 807 | version = "0.7.5" 808 | description = "Simple data validation library" 809 | optional = false 810 | python-versions = "*" 811 | files = [ 812 | {file = "schema-0.7.5-py2.py3-none-any.whl", hash = "sha256:f3ffdeeada09ec34bf40d7d79996d9f7175db93b7a5065de0faa7f41083c1e6c"}, 813 | {file = "schema-0.7.5.tar.gz", hash = "sha256:f06717112c61895cabc4707752b88716e8420a8819d71404501e114f91043197"}, 814 | ] 815 | 816 | [package.dependencies] 817 | contextlib2 = ">=0.5.5" 818 | 819 | [[package]] 820 | name = "setuptools" 821 | version = "68.1.2" 822 | description = "Easily download, build, install, upgrade, and uninstall Python packages" 823 | optional = false 824 | python-versions = ">=3.8" 825 | files = [ 826 | {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, 827 | {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, 828 | ] 829 | 830 | [package.extras] 831 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] 832 | testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] 833 | testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] 834 | 835 | [[package]] 836 | name = "sympy" 837 | version = "1.12" 838 | description = "Computer algebra system (CAS) in Python" 839 | optional = false 840 | python-versions = ">=3.8" 841 | files = [ 842 | {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, 843 | {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, 844 | ] 845 | 846 | [package.dependencies] 847 | mpmath = ">=0.19" 848 | 849 | [[package]] 850 | name = "tiktoken" 851 | version = "0.3.3" 852 | description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" 853 | optional = false 854 | python-versions = ">=3.8" 855 | files = [ 856 | {file = "tiktoken-0.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1f37fa75ba70c1bc7806641e8ccea1fba667d23e6341a1591ea333914c226a9"}, 857 | {file = "tiktoken-0.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3d7296c38392a943c2ccc0b61323086b8550cef08dcf6855de9949890dbc1fd3"}, 858 | {file = "tiktoken-0.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c84491965e139a905280ac28b74baaa13445b3678e07f96767089ad1ef5ee7b"}, 859 | {file = "tiktoken-0.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65970d77ea85ce6c7fce45131da9258cd58a802ffb29ead8f5552e331c025b2b"}, 860 | {file = "tiktoken-0.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bd3f72d0ba7312c25c1652292121a24c8f1711207b63c6d8dab21afe4be0bf04"}, 861 | {file = "tiktoken-0.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:719c9e13432602dc496b24f13e3c3ad3ec0d2fbdb9aace84abfb95e9c3a425a4"}, 862 | {file = "tiktoken-0.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:dc00772284c94e65045b984ed7e9f95d000034f6b2411df252011b069bd36217"}, 863 | {file = "tiktoken-0.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db2c40f79f8f7a21a9fdbf1c6dee32dea77b0d7402355dc584a3083251d2e15"}, 864 | {file = "tiktoken-0.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3c0f2231aa3829a1a431a882201dc27858634fd9989898e0f7d991dbc6bcc9d"}, 865 | {file = "tiktoken-0.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48c13186a479de16cfa2c72bb0631fa9c518350a5b7569e4d77590f7fee96be9"}, 866 | {file = "tiktoken-0.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6674e4e37ab225020135cd66a392589623d5164c6456ba28cc27505abed10d9e"}, 867 | {file = "tiktoken-0.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4a0c1357f6191211c544f935d5aa3cb9d7abd118c8f3c7124196d5ecd029b4af"}, 868 | {file = "tiktoken-0.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2e948d167fc3b04483cbc33426766fd742e7cefe5346cd62b0cbd7279ef59539"}, 869 | {file = "tiktoken-0.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:5dca434c8680b987eacde2dbc449e9ea4526574dbf9f3d8938665f638095be82"}, 870 | {file = "tiktoken-0.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:984758ebc07cd8c557345697c234f1f221bd730b388f4340dd08dffa50213a01"}, 871 | {file = "tiktoken-0.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:891012f29e159a989541ae47259234fb29ff88c22e1097567316e27ad33a3734"}, 872 | {file = "tiktoken-0.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:210f8602228e4c5d706deeb389da5a152b214966a5aa558eec87b57a1969ced5"}, 873 | {file = "tiktoken-0.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd783564f80d4dc44ff0a64b13756ded8390ed2548549aefadbe156af9188307"}, 874 | {file = "tiktoken-0.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:03f64bde9b4eb8338bf49c8532bfb4c3578f6a9a6979fc176d939f9e6f68b408"}, 875 | {file = "tiktoken-0.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1ac369367b6f5e5bd80e8f9a7766ac2a9c65eda2aa856d5f3c556d924ff82986"}, 876 | {file = "tiktoken-0.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:94600798891f78db780e5aa9321456cf355e54a4719fbd554147a628de1f163f"}, 877 | {file = "tiktoken-0.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e59db6fca8d5ccea302fe2888917364446d6f4201a25272a1a1c44975c65406a"}, 878 | {file = "tiktoken-0.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:19340d8ba4d6fd729b2e3a096a547ded85f71012843008f97475f9db484869ee"}, 879 | {file = "tiktoken-0.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542686cbc9225540e3a10f472f82fa2e1bebafce2233a211dee8459e95821cfd"}, 880 | {file = "tiktoken-0.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a43612b2a09f4787c050163a216bf51123851859e9ab128ad03d2729826cde9"}, 881 | {file = "tiktoken-0.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a11674f0275fa75fb59941b703650998bd4acb295adbd16fc8af17051aaed19d"}, 882 | {file = "tiktoken-0.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:65fc0a449630bab28c30b4adec257442a4706d79cffc2337c1d9df3e91825cdd"}, 883 | {file = "tiktoken-0.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:0b9a7a9a8b781a50ee9289e85e28771d7e113cc0c656eadfb6fc6d3a106ff9bb"}, 884 | {file = "tiktoken-0.3.3.tar.gz", hash = "sha256:97b58b7bfda945791ec855e53d166e8ec20c6378942b93851a6c919ddf9d0496"}, 885 | ] 886 | 887 | [package.dependencies] 888 | regex = ">=2022.1.18" 889 | requests = ">=2.26.0" 890 | 891 | [package.extras] 892 | blobfile = ["blobfile (>=2)"] 893 | 894 | [[package]] 895 | name = "tomli" 896 | version = "2.0.1" 897 | description = "A lil' TOML parser" 898 | optional = false 899 | python-versions = ">=3.7" 900 | files = [ 901 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 902 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 903 | ] 904 | 905 | [[package]] 906 | name = "torch" 907 | version = "2.0.1" 908 | description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" 909 | optional = false 910 | python-versions = ">=3.8.0" 911 | files = [ 912 | {file = "torch-2.0.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8ced00b3ba471856b993822508f77c98f48a458623596a4c43136158781e306a"}, 913 | {file = "torch-2.0.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:359bfaad94d1cda02ab775dc1cc386d585712329bb47b8741607ef6ef4950747"}, 914 | {file = "torch-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:7c84e44d9002182edd859f3400deaa7410f5ec948a519cc7ef512c2f9b34d2c4"}, 915 | {file = "torch-2.0.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:567f84d657edc5582d716900543e6e62353dbe275e61cdc36eda4929e46df9e7"}, 916 | {file = "torch-2.0.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:787b5a78aa7917465e9b96399b883920c88a08f4eb63b5a5d2d1a16e27d2f89b"}, 917 | {file = "torch-2.0.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e617b1d0abaf6ced02dbb9486803abfef0d581609b09641b34fa315c9c40766d"}, 918 | {file = "torch-2.0.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b6019b1de4978e96daa21d6a3ebb41e88a0b474898fe251fd96189587408873e"}, 919 | {file = "torch-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:dbd68cbd1cd9da32fe5d294dd3411509b3d841baecb780b38b3b7b06c7754434"}, 920 | {file = "torch-2.0.1-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:ef654427d91600129864644e35deea761fb1fe131710180b952a6f2e2207075e"}, 921 | {file = "torch-2.0.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:25aa43ca80dcdf32f13da04c503ec7afdf8e77e3a0183dd85cd3e53b2842e527"}, 922 | {file = "torch-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5ef3ea3d25441d3957348f7e99c7824d33798258a2bf5f0f0277cbcadad2e20d"}, 923 | {file = "torch-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0882243755ff28895e8e6dc6bc26ebcf5aa0911ed81b2a12f241fc4b09075b13"}, 924 | {file = "torch-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:f66aa6b9580a22b04d0af54fcd042f52406a8479e2b6a550e3d9f95963e168c8"}, 925 | {file = "torch-2.0.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:1adb60d369f2650cac8e9a95b1d5758e25d526a34808f7448d0bd599e4ae9072"}, 926 | {file = "torch-2.0.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:1bcffc16b89e296826b33b98db5166f990e3b72654a2b90673e817b16c50e32b"}, 927 | {file = "torch-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:e10e1597f2175365285db1b24019eb6f04d53dcd626c735fc502f1e8b6be9875"}, 928 | {file = "torch-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:423e0ae257b756bb45a4b49072046772d1ad0c592265c5080070e0767da4e490"}, 929 | {file = "torch-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8742bdc62946c93f75ff92da00e3803216c6cce9b132fbca69664ca38cfb3e18"}, 930 | {file = "torch-2.0.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:c62df99352bd6ee5a5a8d1832452110435d178b5164de450831a3a8cc14dc680"}, 931 | {file = "torch-2.0.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:671a2565e3f63b8fe8e42ae3e36ad249fe5e567435ea27b94edaa672a7d0c416"}, 932 | ] 933 | 934 | [package.dependencies] 935 | filelock = "*" 936 | jinja2 = "*" 937 | networkx = "*" 938 | sympy = "*" 939 | typing-extensions = "*" 940 | 941 | [package.extras] 942 | opt-einsum = ["opt-einsum (>=3.3)"] 943 | 944 | [[package]] 945 | name = "tqdm" 946 | version = "4.66.1" 947 | description = "Fast, Extensible Progress Meter" 948 | optional = false 949 | python-versions = ">=3.7" 950 | files = [ 951 | {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, 952 | {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, 953 | ] 954 | 955 | [package.dependencies] 956 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 957 | 958 | [package.extras] 959 | dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] 960 | notebook = ["ipywidgets (>=6)"] 961 | slack = ["slack-sdk"] 962 | telegram = ["requests"] 963 | 964 | [[package]] 965 | name = "typing-extensions" 966 | version = "4.7.1" 967 | description = "Backported and Experimental Type Hints for Python 3.7+" 968 | optional = false 969 | python-versions = ">=3.7" 970 | files = [ 971 | {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, 972 | {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, 973 | ] 974 | 975 | [[package]] 976 | name = "urllib3" 977 | version = "2.0.4" 978 | description = "HTTP library with thread-safe connection pooling, file post, and more." 979 | optional = false 980 | python-versions = ">=3.7" 981 | files = [ 982 | {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, 983 | {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, 984 | ] 985 | 986 | [package.extras] 987 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 988 | secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] 989 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 990 | zstd = ["zstandard (>=0.18.0)"] 991 | 992 | [[package]] 993 | name = "virtualenv" 994 | version = "20.24.3" 995 | description = "Virtual Python Environment builder" 996 | optional = false 997 | python-versions = ">=3.7" 998 | files = [ 999 | {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, 1000 | {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, 1001 | ] 1002 | 1003 | [package.dependencies] 1004 | distlib = ">=0.3.7,<1" 1005 | filelock = ">=3.12.2,<4" 1006 | platformdirs = ">=3.9.1,<4" 1007 | 1008 | [package.extras] 1009 | docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] 1010 | test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] 1011 | 1012 | [[package]] 1013 | name = "youtube-dl" 1014 | version = "2021.12.17" 1015 | description = "YouTube video downloader" 1016 | optional = false 1017 | python-versions = "*" 1018 | files = [] 1019 | develop = false 1020 | 1021 | [package.source] 1022 | type = "directory" 1023 | url = "../youtube-dl" 1024 | 1025 | [[package]] 1026 | name = "zipp" 1027 | version = "3.16.2" 1028 | description = "Backport of pathlib-compatible object wrapper for zip files" 1029 | optional = false 1030 | python-versions = ">=3.8" 1031 | files = [ 1032 | {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, 1033 | {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, 1034 | ] 1035 | 1036 | [package.extras] 1037 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 1038 | testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] 1039 | 1040 | [metadata] 1041 | lock-version = "2.0" 1042 | python-versions = ">=3.8,<4.0" 1043 | content-hash = "e24ae78be788d02fcc021a51ea57e479f4f98cc6c4710aaa77fb20d80885bedf" 1044 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "avsearch" 3 | version = "0.1.1" 4 | description = "Automated YouTube Audio/Video content transcription search for your website" 5 | authors = ["Michael King ", "Chuck Meyer "] 6 | readme = "README.md" 7 | license = "MIT" 8 | homepage = "https://github.com/algolia-samples/avsearch" 9 | repository = "https://github.com/algolia-samples/avsearch" 10 | documentation = "https://github.com/algolia-samples/avsearch" 11 | keywords = ["algolia", "youtube", "audio", "transcribe"] 12 | classifiers = [ 13 | "Topic :: Multimedia", 14 | "Topic :: Multimedia :: Sound/Audio :: Analysis", 15 | "Topic :: Scientific/Engineering", 16 | "Topic :: Scientific/Engineering :: Artificial Intelligence" 17 | ] 18 | 19 | [tool.poetry.urls] 20 | "Bug Tracker" = "https://github.com/algolia-samples/avsearch/issues" 21 | 22 | [tool.poetry.dependencies] 23 | python = ">=3.8,<4.0" 24 | algoliasearch = "^2.6.2" 25 | click = "^8.1.3" 26 | schema = "^0.7.5" 27 | openai-whisper = {git = "https://github.com/openai/whisper.git"} 28 | pre-commit = "^2.20.0" 29 | youtube-dl = {path = "../youtube-dl"} 30 | 31 | [tool.poetry.scripts] 32 | av-search = "avsearch:cli" 33 | 34 | [tool.poetry.group.dev.dependencies] 35 | black = "^22.10.0" 36 | flake8 = "^5.0.4" 37 | 38 | [build-system] 39 | requires = ["poetry-core"] 40 | build-backend = "poetry.core.masonry.api" 41 | -------------------------------------------------------------------------------- /scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if ! ./scripts/pre-commit.sh; then 3 | echo "Please correct the issues above before attempting to build." 4 | exit 1 5 | fi 6 | 7 | # Run the poetry build process 8 | poetry build 9 | 10 | if [ $? -ne 0 ]; then 11 | echo "An issue occurred during the build process - double check the output above and try again." 12 | exit 1 13 | else 14 | echo "The build finished successfully!" 15 | fi 16 | -------------------------------------------------------------------------------- /scripts/pre-commit.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Ensure we are within a poetry shell 4 | if [ -z $POETRY_ACTIVE ]; then 5 | echo "Poetry shell not active, attempting to start..." 6 | poetry shell 7 | fi 8 | 9 | # Black 10 | echo "---- Black ----" 11 | black \ 12 | --line-length=120 \ 13 | --target-version=py37 \ 14 | avsearch 15 | 16 | if [ $? -ne 0 ]; then 17 | echo "An issue was observed with Black - double check the output and re-run if needed." 18 | exit 1 19 | fi 20 | 21 | # Flake8 22 | echo "---- Flake8 ----" 23 | flake8 \ 24 | --max-line-length=120 \ 25 | --per-file-ignores=avsearch/__init__.py:F401 \ 26 | avsearch 27 | 28 | if [ $? -ne 0 ]; then 29 | echo "An issue was observed with Flake8 - double check the output and re-run if needed." 30 | exit 1 31 | else 32 | echo "Flake8 checked passed!" 33 | fi 34 | 35 | echo "All done!"; --------------------------------------------------------------------------------