.bundle
63 |
64 | Just download the _.bundle_ file and run:
65 |
66 | git clone file.bundle
67 |
68 |
69 | ## Scheduler
70 | The workflow defined in [.github/workflows/job.yml](/.github/workflows/job.yml) runs `iagitup` on a schedule.
71 | As a one-time setup you need to copy values from https://archive.org/account/s3.php as
72 | [GitHub Secrets](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository)
73 | under names `S3_ACCESS` and `S3_SECRET`. Then update the list of repositories in
74 | [repositories/list.txt](/repositories/list.txt).
75 |
76 | ## License (GPLv3)
77 |
78 | Copyright (C) 2017-2018 Giovanni Damiola
79 |
80 | This program is free software: you can redistribute it and/or modify
81 | it under the terms of the GNU General Public License as published by
82 | the Free Software Foundation, either version 3 of the License, or
83 | (at your option) any later version.
84 |
85 | This program is distributed in the hope that it will be useful,
86 | but WITHOUT ANY WARRANTY; without even the implied warranty of
87 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
88 | GNU General Public License for more details.
89 |
90 | You should have received a copy of the GNU General Public License
91 | along with this program. If not, see .
92 |
--------------------------------------------------------------------------------
/flake.lock:
--------------------------------------------------------------------------------
1 | {
2 | "nodes": {
3 | "flake-utils": {
4 | "locked": {
5 | "lastModified": 1642700792,
6 | "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=",
7 | "owner": "numtide",
8 | "repo": "flake-utils",
9 | "rev": "846b2ae0fc4cc943637d3d1def4454213e203cba",
10 | "type": "github"
11 | },
12 | "original": {
13 | "owner": "numtide",
14 | "repo": "flake-utils",
15 | "type": "github"
16 | }
17 | },
18 | "mach-nix": {
19 | "inputs": {
20 | "flake-utils": "flake-utils",
21 | "nixpkgs": [
22 | "nixpkgs"
23 | ],
24 | "pypi-deps-db": "pypi-deps-db"
25 | },
26 | "locked": {
27 | "lastModified": 1705470643,
28 | "narHash": "sha256-CqgkRcvOonJ2fL6542/ykZR3yL6qVLWy0pdyY5YKRlE=",
29 | "owner": "DavHau",
30 | "repo": "mach-nix",
31 | "rev": "28f563aeb8c9e679a3f2b531c728573fce7a4594",
32 | "type": "github"
33 | },
34 | "original": {
35 | "owner": "DavHau",
36 | "repo": "mach-nix",
37 | "type": "github"
38 | }
39 | },
40 | "nixpkgs": {
41 | "locked": {
42 | "lastModified": 1708118438,
43 | "narHash": "sha256-kk9/0nuVgA220FcqH/D2xaN6uGyHp/zoxPNUmPCMmEE=",
44 | "owner": "NixOS",
45 | "repo": "nixpkgs",
46 | "rev": "5863c27340ba4de8f83e7e3c023b9599c3cb3c80",
47 | "type": "github"
48 | },
49 | "original": {
50 | "id": "nixpkgs",
51 | "ref": "nixos-unstable",
52 | "type": "indirect"
53 | }
54 | },
55 | "pypi-deps-db": {
56 | "flake": false,
57 | "locked": {
58 | "lastModified": 1685526402,
59 | "narHash": "sha256-V0SXx0dWlUBL3E/wHWTszrkK2dOnuYYnBc7n6e0+NQU=",
60 | "owner": "DavHau",
61 | "repo": "pypi-deps-db",
62 | "rev": "ba35683c35218acb5258b69a9916994979dc73a9",
63 | "type": "github"
64 | },
65 | "original": {
66 | "owner": "DavHau",
67 | "repo": "pypi-deps-db",
68 | "type": "github"
69 | }
70 | },
71 | "root": {
72 | "inputs": {
73 | "mach-nix": "mach-nix",
74 | "nixpkgs": "nixpkgs"
75 | }
76 | }
77 | },
78 | "root": "root",
79 | "version": 7
80 | }
81 |
--------------------------------------------------------------------------------
/flake.nix:
--------------------------------------------------------------------------------
1 | {
2 | description = "iagitup";
3 |
4 | inputs = {
5 | nixpkgs.url = "nixpkgs/nixos-unstable";
6 | mach-nix.url = "github:DavHau/mach-nix";
7 | mach-nix.inputs.nixpkgs.follows = "nixpkgs";
8 | # dream2nix.url = "github:nix-community/dream2nix";
9 | # nixpkgs.follows = "dream2nix/nixpkgs";
10 | };
11 |
12 | outputs = { self, mach-nix, nixpkgs }: {
13 | devShells.x86_64-linux.default = mach-nix.lib.x86_64-linux.mkPythonShell {
14 | ignoreDataOutdated = true;
15 | python = "python312";
16 | requirements = ''
17 | setuptools
18 | internetarchive
19 | git
20 | '';
21 | };
22 | };
23 | }
24 |
--------------------------------------------------------------------------------
/iagitup/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/noql-net/archiver/274da98677a5cef8a2eace568fdbbc7b7a4c065a/iagitup/__init__.py
--------------------------------------------------------------------------------
/iagitup/iagitup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 |
4 | from __future__ import unicode_literals
5 |
6 | __author__ = "Giovanni Damiola"
7 | __copyright__ = "Copyright 2018, Giovanni Damiola"
8 | __main_name__ = 'iagitup'
9 | __license__ = 'GPLv3'
10 | __version__ = "v1.8"
11 |
12 | import os
13 | import subprocess
14 | import shutil
15 | import json
16 | from internetarchive import get_session
17 | import git
18 | import requests
19 | from datetime import datetime
20 | from markdown2 import markdown_path
21 |
22 |
23 | def mkdirs(path):
24 | """Make directory, if it doesn't exist."""
25 | if not os.path.exists(path):
26 | os.makedirs(path)
27 |
28 | # download the github repo
29 | def repo_download(github_repo_url):
30 | """Downloads a GitHub repo locally.
31 |
32 | arguments:
33 | github_repo_url -- the GitHub repo home url
34 |
35 | returns:
36 | github_repo_data, github_repo_dir - the repo details and the local repo directory
37 | """
38 | download_dir = os.path.expanduser('~/.iagitup/downloads')
39 | mkdirs(os.path.expanduser('~/.iagitup'))
40 | mkdirs(download_dir)
41 |
42 | # parsing url to initialize the github api rul and get the repo_data
43 | gh_user, gh_repo = github_repo_url.split('/')[3:]
44 | gh_api_url = "https://api.github.com/repos/{}/{}".format(gh_user, gh_repo)
45 |
46 | # delete the temp directory if exists
47 | github_repo_dir = os.path.join(download_dir, gh_repo)
48 | if os.path.exists(github_repo_dir):
49 | shutil.rmtree(github_repo_dir)
50 |
51 | # get the data from GitHub api
52 | req = requests.get(gh_api_url)
53 | if req.status_code == 200:
54 | github_repo_data = json.loads(req.text)
55 | # download the repo from github
56 | github_repo_dir = os.path.join(download_dir, gh_repo)
57 | try:
58 | git.Git().clone(github_repo_data['clone_url'], github_repo_dir)
59 | except Exception as e:
60 | print(f'Error occurred while downloading: {github_repo_url}')
61 | print(str(e))
62 | exit(1)
63 | else:
64 | raise ValueError(f'Error occurred while downloading: {github_repo_url}. Status code: {req.status_code}')
65 |
66 | return github_repo_data, github_repo_dir
67 |
68 |
69 | def get_description_from_readme(gh_repo_folder):
70 | """From the GitHub repo returns html description from the README.md or readme.txt
71 |
72 | arguments:
73 | gh_repo_folder -- the repo local folder path
74 |
75 | returns:
76 | description -- html description
77 | """
78 | path = os.path.join(gh_repo_folder, 'README.md')
79 | path3 = os.path.join(gh_repo_folder, 'readme.md')
80 | path2 = os.path.join(gh_repo_folder, 'readme.txt')
81 | description = ''
82 | if os.path.exists(path):
83 | description = markdown_path(path)
84 | description = description.replace('\n', '')
85 | elif os.path.exists(path3):
86 | description = markdown_path(path3)
87 | description = description.replace('\n', '')
88 | elif os.path.exists(path2):
89 | with open(path2, 'r') as f:
90 | description = f.readlines()
91 | description =' '.join(description)
92 | return description
93 |
94 | def create_bundle(gh_repo_folder, repo_name):
95 | """creates the gir repository bundle to upload
96 |
97 | arguments:
98 | gh_repo_folder -- the repo local folder path
99 | repo_name -- the repo name
100 |
101 | returns:
102 | bundle_path -- the path to the bundle file
103 | """
104 | print(gh_repo_folder, repo_name)
105 | if os.path.exists(gh_repo_folder):
106 | main_pwd = os.getcwd()
107 | os.chdir(gh_repo_folder)
108 | bundle_name = '{}.bundle'.format(repo_name)
109 | subprocess.check_call(['git', 'bundle', 'create', bundle_name, '--all'])
110 | bundle_path = os.path.join(gh_repo_folder, bundle_name)
111 | os.chdir(main_pwd)
112 | else:
113 | raise ValueError('Error creating bundle, directory does not exist: {}'.format(gh_repo_folder))
114 | return bundle_path
115 |
116 | def upload_ia(*, github_repo_folder, github_repo_data, ia_session, custom_meta=None):
117 | """Uploads the bundle to the Internet Archive.
118 |
119 | arguments:
120 | github_repo_folder -- path to the bundle
121 | github_repo_data -- repository metadata
122 | custom_meta -- custom metadata
123 |
124 | returns:
125 | item_name -- Internet Archive item identifier
126 | meta -- the item metadata
127 | bundle_filename -- the git bundle filename
128 | """
129 | # formatting some dates string
130 | pushed = datetime.strptime(github_repo_data['pushed_at'], '%Y-%m-%dT%H:%M:%SZ')
131 | pushed_date = pushed.strftime('%Y-%m-%d_%H-%M-%S')
132 | raw_pushed_date = pushed.strftime('%Y-%m-%d %H:%M:%S')
133 | date = pushed.strftime('%Y-%m-%d')
134 | year = pushed.year
135 |
136 | # preparing some names
137 | repo_name = github_repo_data['full_name'].replace('/', '-')
138 | original_url = github_repo_data['html_url']
139 | bundle_filename = '{}_-_{}'.format(repo_name, pushed_date)
140 |
141 | # preparing some description
142 | description_footer = f'To restore the repository download the bundle wget https://archive.org/download/github.com-{bundle_filename}/{bundle_filename}.bundle
and run: git clone {bundle_filename}.bundle
'
143 | description = f'
{github_repo_data['description']}
{get_description_from_readme(github_repo_folder)}
{description_footer}'
144 |
145 | # preparing uploader metadata
146 | uploader_url = github_repo_data['owner']['html_url']
147 | uploader_name = github_repo_data['owner']['login']
148 |
149 | # let's grab the avatar too
150 | uploader_avatar_url = github_repo_data['owner']['avatar_url']
151 | pic = requests.get(uploader_avatar_url, stream = True)
152 | uploader_avatar_path = os.path.join(github_repo_folder, 'cover.jpg')
153 | with open(uploader_avatar_path, 'wb') as f:
154 | pic.raw.decode_content = True
155 | shutil.copyfileobj(pic.raw, f)
156 |
157 | # some Internet Archive Metadata
158 | collection = 'open_source_software'
159 | mediatype = 'software'
160 | subject = 'GitHub;code;software;git'
161 |
162 | uploader = f'{__main_name__} - {__version__}'
163 |
164 | description = f'{description}
Source: {original_url}
Uploader: {uploader_name}
Upload date: {date}'
165 |
166 | ## Creating bundle file of the git repo
167 | try:
168 | bundle_file = create_bundle(github_repo_folder, bundle_filename)
169 | except ValueError as err:
170 | print(str(err))
171 | shutil.rmtree(github_repo_folder)
172 | exit(1)
173 |
174 | # inizializing the internet archive item name
175 | # here we set the ia identifier
176 | item_name = f'github.com-{repo_name}_-_{pushed_date}'
177 | title = item_name
178 |
179 | #initializing the main metadata
180 | meta = dict(
181 | mediatype=mediatype,
182 | creator=uploader_name,
183 | collection=collection,
184 | title=title,
185 | year=year,
186 | date=date,
187 | subject=subject,
188 | uploaded_with=uploader,
189 | originalurl=original_url,
190 | pushed_date=raw_pushed_date,
191 | description=description
192 | )
193 |
194 | # override default metadata with any supplemental metadata provided.
195 | if custom_meta is not None:
196 | meta.update(custom_meta)
197 |
198 | try:
199 | # upload the item to the Internet Archive
200 | print(f"Creating item on Internet Archive: {meta['title']}")
201 | item = ia_session.get_item(item_name)
202 | # checking if the item already exists:
203 | if not item.exists:
204 | print(f"Uploading file to the internet archive: {bundle_file}")
205 | item.upload(bundle_file, metadata=meta, retries=3, verbose=True, delete=False)
206 | # upload the item to the Internet Archive
207 | print("Uploading avatar...")
208 | item.upload(os.path.join(github_repo_folder, 'cover.jpg'), retries=3, verbose=True, delete=True)
209 | else:
210 | print("\nSTOP: The same repository seems already archived.")
211 | print(f"---->> Archived repository URL: \n \thttps://archive.org/details/{item_name}")
212 | print(f"---->> Archived git bundle file: \n \thttps://archive.org/download/{item_name}/{bundle_filename}.bundle \n\n")
213 | shutil.rmtree(github_repo_folder)
214 | exit(0)
215 |
216 | except Exception as e:
217 | print(str(e))
218 | shutil.rmtree(github_repo_folder)
219 | exit(1)
220 |
221 | # return item identifier and metadata as output
222 | return item_name, meta, bundle_filename
223 |
224 | def get_ia_session(s3_keys = None):
225 | """creates an ia (Internet Archive) session. If no s3_keys is provided tries to configure ia interactively.
226 |
227 | arguments:
228 | s3_keys -- tuple (access, secret) for S3 access (optional)
229 | returns:
230 | ia session or None if no s3 keys are provided and interactive configuration fails.
231 | """
232 | if s3_keys is not None:
233 | return get_session(config={'s3': {'access': s3_keys[0], 'secret': s3_keys[1]}})
234 |
235 | config_file = os.path.expanduser('~/.config/ia.ini')
236 | if not os.path.exists(config_file):
237 | # fallback config file
238 | config_file = os.path.expanduser('~/.ia')
239 |
240 | if not os.path.exists(config_file):
241 | msg = '\nWARNING - It looks like you need to configure your Internet Archive account!\n \
242 | for registration go to https://archive.org/account/login.createaccount.php\n'
243 | print(msg)
244 | try:
245 | failed = subprocess.call(["ia", "configure"])
246 | if failed:
247 | exit(1)
248 | except Exception as e:
249 | msg = f'\nSomething went wrong trying to configure your internet archive account.\n Error - {str(e)}'
250 | print(msg)
251 | exit(1)
252 |
253 | return get_session(config_file=config_file)
254 |
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # iagitup - Download github repository and upload it to the Internet Archive with metadata.
4 |
5 | # Copyright (C) 2017-2018 Giovanni Damiola
6 | # This program is free software: you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation, either version 3 of the License, or
9 | # (at your option) any later version.
10 | #
11 | # This program is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with this program. If not, see .
18 |
19 | from __future__ import unicode_literals
20 |
21 | __author__ = "Giovanni Damiola"
22 | __copyright__ = "Copyright 2018, Giovanni Damiola"
23 | __main_name__ = 'iagitup'
24 | __license__ = 'GPLv3'
25 | __status__ = "Production/Stable"
26 | __version__ = "v1.8"
27 |
28 | import shutil
29 | import argparse
30 |
31 | from iagitup import iagitup
32 |
33 | PROGRAM_DESCRIPTION = 'A tool to archive a GitHub repository to the Internet Archive. \
34 | The script downloads the GitHub repository, creates a git bundle and uploads \
35 | it to archive.org. https://github.com/gdamdam/iagitup'
36 |
37 | # Configure argparser
38 | parser = argparse.ArgumentParser(description=PROGRAM_DESCRIPTION)
39 | parser.add_argument('--metadata', '-m', default=None, type=str, required=False, help='custom metadata to add to the archive.org item')
40 | parser.add_argument('--s3-access', '-s3a', default=None, type=str, required=False, help='Internet Archive S3 access key (from https://archive.org/account/s3.php)')
41 | parser.add_argument('--s3-secret', '-s3s', default=None, type=str, required=False, help='Internet Archive S3 secret key (from https://archive.org/account/s3.php)')
42 | parser.add_argument('--version', '-v', action='version', version=__version__)
43 | parser.add_argument('url', type=str, help='[GITHUB REPO] to archive')
44 | args = parser.parse_args()
45 |
46 | def main():
47 | if args.url == "":
48 | return
49 |
50 | s3_keys = None
51 | if args.s3_access is not None and args.s3_secret is not None:
52 | s3_keys = (args.s3_access, args.s3_secret)
53 | ia_session = iagitup.get_ia_session(s3_keys)
54 |
55 | repo_url = args.url
56 | custom_metadata = args.metadata
57 | custom_meta_dict = None
58 |
59 | print(f":: Downloading {repo_url} repository...")
60 | repo_data, repo_dir = iagitup.repo_download(repo_url)
61 |
62 | # parse supplemental metadata.
63 | if custom_metadata is not None:
64 | custom_meta_dict = {}
65 | for meta in custom_metadata.split(','):
66 | k, v = meta.split(':')
67 | custom_meta_dict[k] = v
68 |
69 | # upload the repo on IA
70 | identifier, meta, bundle_filename = iagitup.upload_ia(
71 | github_repo_folder=repo_dir,
72 | github_repo_data=repo_data,
73 | ia_session=ia_session,
74 | custom_meta=custom_meta_dict)
75 |
76 | # cleaning
77 | shutil.rmtree(repo_dir)
78 |
79 | # output
80 | print("\n:: Upload FINISHED. Item information:")
81 | print(f"Identifier: {meta['title']}")
82 | print(f"Archived repository URL: \n \thttps://archive.org/details/{identifier}")
83 | print(f"Archived git bundle file: \n \thttps://archive.org/download/{identifier}/{bundle_filename}.bundle \n\n")
84 |
85 |
86 | if __name__ == '__main__':
87 | main()
88 |
89 |
--------------------------------------------------------------------------------
/poetry.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand.
2 |
3 | [[package]]
4 | name = "certifi"
5 | version = "2024.7.4"
6 | description = "Python package for providing Mozilla's CA Bundle."
7 | optional = false
8 | python-versions = ">=3.6"
9 | groups = ["main"]
10 | files = [
11 | {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"},
12 | {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"},
13 | ]
14 |
15 | [[package]]
16 | name = "charset-normalizer"
17 | version = "3.3.2"
18 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
19 | optional = false
20 | python-versions = ">=3.7.0"
21 | groups = ["main"]
22 | files = [
23 | {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"},
24 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"},
25 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"},
26 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"},
27 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"},
28 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"},
29 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"},
30 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"},
31 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"},
32 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"},
33 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"},
34 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"},
35 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"},
36 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"},
37 | {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"},
38 | {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"},
39 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"},
40 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"},
41 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"},
42 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"},
43 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"},
44 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"},
45 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"},
46 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"},
47 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"},
48 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"},
49 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"},
50 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"},
51 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"},
52 | {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"},
53 | {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"},
54 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"},
55 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"},
56 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"},
57 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"},
58 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"},
59 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"},
60 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"},
61 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"},
62 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"},
63 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"},
64 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"},
65 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"},
66 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"},
67 | {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"},
68 | {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"},
69 | {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"},
70 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"},
71 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"},
72 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"},
73 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"},
74 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"},
75 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"},
76 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"},
77 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"},
78 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"},
79 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"},
80 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"},
81 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"},
82 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"},
83 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"},
84 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"},
85 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"},
86 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"},
87 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"},
88 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"},
89 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"},
90 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"},
91 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"},
92 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"},
93 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"},
94 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"},
95 | {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"},
96 | {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"},
97 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"},
98 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"},
99 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"},
100 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"},
101 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"},
102 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"},
103 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"},
104 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"},
105 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"},
106 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"},
107 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"},
108 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"},
109 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"},
110 | {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"},
111 | {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"},
112 | {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"},
113 | ]
114 |
115 | [[package]]
116 | name = "colorama"
117 | version = "0.4.6"
118 | description = "Cross-platform colored terminal text."
119 | optional = false
120 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
121 | groups = ["main"]
122 | markers = "platform_system == \"Windows\""
123 | files = [
124 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
125 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
126 | ]
127 |
128 | [[package]]
129 | name = "gitdb"
130 | version = "4.0.11"
131 | description = "Git Object Database"
132 | optional = false
133 | python-versions = ">=3.7"
134 | groups = ["main"]
135 | files = [
136 | {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"},
137 | {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"},
138 | ]
139 |
140 | [package.dependencies]
141 | smmap = ">=3.0.1,<6"
142 |
143 | [[package]]
144 | name = "gitpython"
145 | version = "3.1.44"
146 | description = "GitPython is a Python library used to interact with Git repositories"
147 | optional = false
148 | python-versions = ">=3.7"
149 | groups = ["main"]
150 | files = [
151 | {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"},
152 | {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"},
153 | ]
154 |
155 | [package.dependencies]
156 | gitdb = ">=4.0.1,<5"
157 |
158 | [package.extras]
159 | doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"]
160 | test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""]
161 |
162 | [[package]]
163 | name = "idna"
164 | version = "3.10"
165 | description = "Internationalized Domain Names in Applications (IDNA)"
166 | optional = false
167 | python-versions = ">=3.6"
168 | groups = ["main"]
169 | files = [
170 | {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
171 | {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
172 | ]
173 |
174 | [package.extras]
175 | all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
176 |
177 | [[package]]
178 | name = "internetarchive"
179 | version = "5.4.0"
180 | description = "A Python interface to archive.org."
181 | optional = false
182 | python-versions = ">=3.9"
183 | groups = ["main"]
184 | files = [
185 | {file = "internetarchive-5.4.0-py3-none-any.whl", hash = "sha256:4d5c9b059a68172439b2b1e00e84133ab6bc3b2f758fa2bc91f72fac552b215d"},
186 | {file = "internetarchive-5.4.0.tar.gz", hash = "sha256:869d6606210d333c7faca709196fad9bdcb925b614c134920ce8eb24b82ecffd"},
187 | ]
188 |
189 | [package.dependencies]
190 | jsonpatch = ">=0.4"
191 | requests = ">=2.25.0,<3.0.0"
192 | tqdm = ">=4.0.0"
193 | urllib3 = ">=1.26.0"
194 |
195 | [package.extras]
196 | all = ["black", "mypy", "pre-commit", "pytest", "pytest (==7.1.2)", "responses (==0.20.0)", "ruff (==0.8.5)", "safety", "setuptools", "tqdm-stubs (>=0.2.0)", "types-colorama", "types-jsonpatch (>=0.1.0a0)", "types-pygments", "types-requests (>=2.25.0,<3.0.0)", "types-setuptools", "types-ujson (>=4.2.0)", "types-urllib3 (>=1.26.0)"]
197 | dev = ["black", "mypy", "pre-commit", "pytest", "safety", "setuptools"]
198 | docs = ["alabaster (==0.7.12)", "docutils (<0.18)", "sphinx (==4.5.0)", "sphinx-autodoc-typehints (==1.18.1)"]
199 | test = ["pytest (==7.1.2)", "responses (==0.20.0)", "ruff (==0.8.5)"]
200 | types = ["tqdm-stubs (>=0.2.0)", "types-colorama", "types-jsonpatch (>=0.1.0a0)", "types-pygments", "types-requests (>=2.25.0,<3.0.0)", "types-setuptools", "types-ujson (>=4.2.0)", "types-urllib3 (>=1.26.0)"]
201 |
202 | [[package]]
203 | name = "jsonpatch"
204 | version = "1.33"
205 | description = "Apply JSON-Patches (RFC 6902)"
206 | optional = false
207 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*"
208 | groups = ["main"]
209 | files = [
210 | {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"},
211 | {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"},
212 | ]
213 |
214 | [package.dependencies]
215 | jsonpointer = ">=1.9"
216 |
217 | [[package]]
218 | name = "jsonpointer"
219 | version = "2.4"
220 | description = "Identify specific nodes in a JSON document (RFC 6901)"
221 | optional = false
222 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*"
223 | groups = ["main"]
224 | files = [
225 | {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"},
226 | {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"},
227 | ]
228 |
229 | [[package]]
230 | name = "markdown2"
231 | version = "2.5.3"
232 | description = "A fast and complete Python implementation of Markdown"
233 | optional = false
234 | python-versions = "<4,>=3.9"
235 | groups = ["main"]
236 | files = [
237 | {file = "markdown2-2.5.3-py3-none-any.whl", hash = "sha256:a8ebb7e84b8519c37bf7382b3db600f1798a22c245bfd754a1f87ca8d7ea63b3"},
238 | {file = "markdown2-2.5.3.tar.gz", hash = "sha256:4d502953a4633408b0ab3ec503c5d6984d1b14307e32b325ec7d16ea57524895"},
239 | ]
240 |
241 | [package.extras]
242 | all = ["latex2mathml ; python_version >= \"3.8.1\"", "pygments (>=2.7.3)", "wavedrom"]
243 | code-syntax-highlighting = ["pygments (>=2.7.3)"]
244 | latex = ["latex2mathml ; python_version >= \"3.8.1\""]
245 | wavedrom = ["wavedrom"]
246 |
247 | [[package]]
248 | name = "requests"
249 | version = "2.32.3"
250 | description = "Python HTTP for Humans."
251 | optional = false
252 | python-versions = ">=3.8"
253 | groups = ["main"]
254 | files = [
255 | {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
256 | {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
257 | ]
258 |
259 | [package.dependencies]
260 | certifi = ">=2017.4.17"
261 | charset-normalizer = ">=2,<4"
262 | idna = ">=2.5,<4"
263 | urllib3 = ">=1.21.1,<3"
264 |
265 | [package.extras]
266 | socks = ["PySocks (>=1.5.6,!=1.5.7)"]
267 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
268 |
269 | [[package]]
270 | name = "smmap"
271 | version = "5.0.1"
272 | description = "A pure Python implementation of a sliding window memory map manager"
273 | optional = false
274 | python-versions = ">=3.7"
275 | groups = ["main"]
276 | files = [
277 | {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"},
278 | {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"},
279 | ]
280 |
281 | [[package]]
282 | name = "tqdm"
283 | version = "4.66.3"
284 | description = "Fast, Extensible Progress Meter"
285 | optional = false
286 | python-versions = ">=3.7"
287 | groups = ["main"]
288 | files = [
289 | {file = "tqdm-4.66.3-py3-none-any.whl", hash = "sha256:4f41d54107ff9a223dca80b53efe4fb654c67efaba7f47bada3ee9d50e05bd53"},
290 | {file = "tqdm-4.66.3.tar.gz", hash = "sha256:23097a41eba115ba99ecae40d06444c15d1c0c698d527a01c6c8bd1c5d0647e5"},
291 | ]
292 |
293 | [package.dependencies]
294 | colorama = {version = "*", markers = "platform_system == \"Windows\""}
295 |
296 | [package.extras]
297 | dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"]
298 | notebook = ["ipywidgets (>=6)"]
299 | slack = ["slack-sdk"]
300 | telegram = ["requests"]
301 |
302 | [[package]]
303 | name = "urllib3"
304 | version = "2.2.2"
305 | description = "HTTP library with thread-safe connection pooling, file post, and more."
306 | optional = false
307 | python-versions = ">=3.8"
308 | groups = ["main"]
309 | files = [
310 | {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"},
311 | {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"},
312 | ]
313 |
314 | [package.extras]
315 | brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""]
316 | h2 = ["h2 (>=4,<5)"]
317 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
318 | zstd = ["zstandard (>=0.18.0)"]
319 |
320 | [metadata]
321 | lock-version = "2.1"
322 | python-versions = "^3.11"
323 | content-hash = "43faa781a1c2c5f479ecf579c97e849589e8bf2a11a70d4be088c5147c1e709b"
324 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | package-mode = false
3 |
4 | [tool.poetry.dependencies]
5 | python = "^3.12"
6 | internetarchive = "^5.4.0"
7 | gitpython = "^3.1.44"
8 | markdown2 = "^2.5.3"
9 |
10 |
11 | [build-system]
12 | requires = ["poetry-core"]
13 | build-backend = "poetry.core.masonry.api"
14 |
--------------------------------------------------------------------------------
/repositories/list.txt:
--------------------------------------------------------------------------------
1 | https://github.com/bepass-org/oblivion
2 | https://github.com/bepass-org/oblivion-desktop
3 | https://github.com/bepass-org/warp-plus
4 | https://github.com/ircfspace/endpoint
5 | https://github.com/ircfspace/warpkey
6 | https://github.com/ircfspace/tconfig
7 | https://github.com/ircfspace/location
8 | https://github.com/ircfspace/fragment
9 | https://github.com/soroushmirzaei/telegram-configs-collector
10 | https://github.com/Chocolate4U/Iran-sing-box-rules
11 | https://github.com/TheyCallMeSecond/config-examples
12 | https://github.com/TheyCallMeSecond/Argo
13 | https://github.com/TheyCallMeSecond/sing-box-manager
14 | https://github.com/TheyCallMeSecond/WARP-Endpoint-IP
15 | https://github.com/2dust/v2rayN
16 | https://github.com/2dust/v2rayNG
17 | https://github.com/2dust/AndroidLibV2rayLite
18 | https://github.com/2dust/AndroidLibXrayLite
19 | https://github.com/2dust/v2flyNG
20 | https://github.com/2dust/D-Tools
21 | https://github.com/2dust/clashN
22 | https://github.com/xchacha20-poly1305/airport2hell
23 | https://github.com/xchacha20-poly1305/anchor
24 | https://github.com/xchacha20-poly1305/AnPing
25 | https://github.com/xchacha20-poly1305/AnSip
26 | https://github.com/xchacha20-poly1305/antibody
27 | https://github.com/xchacha20-poly1305/husi
28 | https://github.com/xchacha20-poly1305/TLS-scribe
29 | https://github.com/tun2proxy/tun2proxy
30 | https://github.com/tun2proxy/tproxy-config
31 | https://github.com/tun2proxy/wintun-bindings
32 | https://github.com/tun2proxy/socks5-impl
33 | https://github.com/tun2proxy/slirpnetstack
34 | https://github.com/tun2proxy/dns2socks
35 | https://github.com/tun2proxy/socks-hub
36 | https://github.com/vfarid/v2ray-worker
37 | https://github.com/arshiacomplus/WarpScanner
38 | https://github.com/MortezaBashsiz/CFScanner
39 | https://github.com/GFW-knocker/MahsaNG
40 | https://github.com/GFW-knocker/Xray-core
41 | https://github.com/Surfboardv2ray/batch-fragment-scanner
42 | https://github.com/Surfboardv2ray/v2ray-refiner
43 | https://github.com/Surfboardv2ray/Trojan-worker
44 | https://github.com/Surfboardv2ray/Xray-Load-Balancer
45 | https://github.com/lord-alfred/ipranges
46 | https://github.com/ByteMysticRogue/Hiddify-Warp
47 | https://github.com/kyochikuto/sing-box-plus
48 | https://github.com/ShadowZagrosDev/oblivion-helper
49 |
--------------------------------------------------------------------------------