19 Commits
v0.1.5 ... main

Author SHA1 Message Date
Gitea CI
be0ae9e90f Bump version: 0.1.8 → 0.1.9 2025-11-01 21:32:10 +00:00
7db13e3113 Merge pull request 'dev' (#35) from dev into main
Reviewed-on: #35
2025-11-01 21:08:50 +00:00
e8406f2e79 feat: update css to make site look better 2025-11-01 22:08:05 +01:00
104daeca73 chore: change workflow python installation method 2025-11-01 22:02:08 +01:00
Gitea CI
07117fbc31 Bump version: 0.1.7 → 0.1.8 2025-07-05 11:51:43 +00:00
51d5880916 Merge pull request 'chore: also display downloads badge if no downloads' (#34) from dev into main
Reviewed-on: #34
2025-07-05 12:50:36 +01:00
4ae996bfd6 chore: also display downloads badge if no downloads 2025-07-05 13:49:11 +02:00
Gitea CI
773106958c Bump version: 0.1.6 → 0.1.7 2025-07-04 14:28:22 +00:00
8b7f79e671 Merge pull request 'chore: update dependencies' (#33) from dev into main
Reviewed-on: #33
2025-07-04 15:27:36 +01:00
029d4016be chore: update dependencies 2025-07-04 16:25:54 +02:00
Gitea CI
dbf4676f1e Bump version: 0.1.5 → 0.1.6 2025-06-29 13:16:32 +00:00
245ae7ec6f Merge pull request 'test: add antlr4-python3-runtime to deps' (#32) from dev into main
Reviewed-on: #32
2025-06-29 14:15:14 +01:00
152265f774 test: add antlr4-python3-runtime to deps 2025-06-29 15:14:49 +02:00
26150b1d5c Merge pull request 'Feat: add new function Check Availability' (#31) from dev into main
Reviewed-on: #31
2025-06-29 14:01:29 +01:00
ac0461f815 feat: add availability check 2025-06-29 14:59:04 +02:00
31196f6c5d update dependencies 2025-06-29 14:58:42 +02:00
583b04ffe9 Merge pull request 'chore: update release note template, remove workflow' (#30) from dev into main
Reviewed-on: #30
2025-06-17 20:32:21 +01:00
21791bbf45 chore: re-add enhancement part 2025-06-17 21:30:57 +02:00
8c08fec166 chore: delete broken workflow, update template to include enhancement section 2025-06-17 21:30:28 +02:00
8 changed files with 336 additions and 372 deletions

View File

@@ -11,9 +11,25 @@
"Feat"
]
},
{
"title": "## 🧰 Enhancements",
"labels": [
"enhancement",
"Enhancement",
"Kind/Enhancement",
"improvement",
"Improvement",
"Kind/Improvement"
]
},
{
"title": "## 🐛 Fixes",
"labels": ["fix","Fix", "Kind/Bug"]
"labels": [
"fix",
"Fix",
"Kind/Bug",
"Kind/Security"
]
},
{
"title": "## 🧪 Upgrade",

View File

@@ -50,8 +50,8 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v5
- name: Set up Python
run: uv python install
- name: "Set up Python"
uses: actions/setup-python@v6
with:
python-version-file: "pyproject.toml"

View File

@@ -1,180 +0,0 @@
on:
workflow_dispatch:
inputs:
github_release:
description: 'Create Gitea Release'
default: true
type: boolean
docker_release:
description: 'Push Docker images'
default: true
type: boolean
bump:
description: 'Bump type'
required: true
default: 'patch'
type: choice
options:
- 'major'
- 'minor'
- 'patch'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@master
with:
fetch-depth: 0
fetch-tags: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
registry: ${{ secrets.REGISTRY }}
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.TOKEN }}
- name: Install uv
uses: astral-sh/setup-uv@v5
- name: Set up Python
run: uv python install
with:
python-version-file: "pyproject.toml"
- name: Install the project
run: uv sync --all-extras --dev
- name: Create requirements.txt
run: |
echo "Creating requirements.txt"
uv export --format requirements.txt -o requirements.txt
echo "requirements.txt created"
- name: Set Git identity
run: |
git config user.name "Gitea CI"
git config user.email "ci@git.theprivateserver.de"
- name: Get Repository URL
id: get_repo_url
run: echo "REPO_URL=https://github.com/${{ github.repository }}" >> $GITHUB_OUTPUT
- name: Build Changelog
id: build_changelog
uses: https://github.com/mikepenz/release-changelog-builder-action@v5
with:
platform: "gitea"
mode: "COMMIT"
baseURL: "http://gitea:3000"
# configuration: ".gitea/changelog-config.json"
configurationJSON: |
{
"template": "#{{CHANGELOG}}",
"categories": [
{
"title": "## 🚀 Features",
"labels": ["feat"]
},
{
"title": "## 🐛 Fixes",
"labels": ["fix", "bug"]
},
{
"title": "## 🧹 Maintenance",
"labels": ["chore", "refactor", "cleanup"]
},
{
"title": "## 📦 Build",
"labels": ["build", "ci"]
},
{
"title": "## 📝 Documentation",
"labels": ["docs"]
},
{
"title": "## ⚡️ Performance Improvements",
"labels": ["perf"]
},
{
"title": "## 🧪 Tests",
"labels": ["test"]
},
{
"title": "## ⏪ Reverts",
"labels": ["revert"]
},
{
"title": "## 🎨 Styling",
"labels": ["style"]
},
{
"title": "## 🎯 Other Changes",
"labels": ["other", "misc", "enhancement"]
}
],
"label_extractor": [
{
"pattern": "^(build|chore|ci|docs|feat|fix|bug|perf|cleanup|refactor|revert|style|test){1}(\\([\\w\\-\\.]+\\))?(!)?: ([\\w ])+([\\s\\S]*)",
"target": "$1"
}
],
"empty_template": "- no changes",
"pr_template": "- [#{{TITLE}}](${{ steps.get_repo_url.outputs.REPO_URL }}/commit/#{{MERGE_SHA}}) by @#{{AUTHOR}}"
}
env:
GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }}
- name: Bump version
id: bump
run: |
uv tool install bump-my-version
uv tool run bump-my-version bump ${{ github.event.inputs.bump }} --allow-dirty
# echo the version to github env, the version is shown by using uv tool run bump-my-version show current_version
echo "VERSION<<EOF" >> $GITHUB_ENV
echo "$(uv tool run bump-my-version show current_version)" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Check version
run: echo ${{ env.VERSION }}
- name: Build and store Docker image
if: ${{ github.event.inputs.docker_release == 'true' }}
run: |
REPO_NAME=$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')
docker buildx build \
--platform linux/amd64 \
--tag ${{ secrets.REGISTRY }}/${REPO_NAME}:latest \
--tag ${{ secrets.REGISTRY }}/${REPO_NAME}:${{ env.VERSION }} \
--push .
- name: Push changes
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ github.ref }}
- name: Create release
id: create_release
if: ${{ github.event.inputs.github_release == 'true' }}
uses: softprops/action-gh-release@master
with:
tag_name: v${{ env.VERSION }}
release_name: Release ${{ env.VERSION }}
body: ${{steps.build_changelog.outputs.changelog}}
draft: false
prerelease: false
make_latest: true
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}

View File

@@ -1,11 +1,12 @@
[project]
name = "kompage"
version = "0.1.5"
version = "0.1.9"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"anilistapi>=0.1.1",
"antlr4-python3-runtime>=4.9.3",
"flask>=3.1.1",
"httpx>=0.28.1",
"httpx-retries>=0.3.2",
@@ -28,7 +29,7 @@ url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/"
[tool.bumpversion]
current_version = "0.1.5"
current_version = "0.1.9"
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
serialize = ["{major}.{minor}.{patch}"]
search = "{current_version}"

View File

@@ -35,12 +35,13 @@ komga = KOMGAPI(
username=settings.komga.user,
password=settings.komga.password,
)
cat = Nyaa()
# komga_series = komga.seriesList()
@limit(limit=1, every=2)
async def fetch_data(
inputdata: Dict[str, Any], check_downloads: bool = False
inputdata: Dict[str, Any], check_downloads: int = 0
) -> List[Dict[str, Any]]:
log.error(f"fetch_data called with data: {inputdata}")
async with httpx.AsyncClient() as client:
@@ -92,36 +93,41 @@ async def fetch_data(
args={"id": manga.id},
)
komga_request = bool(requested)
results.append(
{
"id": manga.id,
"title": manga.title.english
if manga.title.english
else manga.title.romaji,
"image": manga.coverImage.get("large")
if manga.coverImage
else "https://demofree.sirv.com/nope-not-here.jpg",
"status": manga.status,
"type": manga.format,
"genres": manga.genres or [],
"tags": [tag.name for tag in (manga.tags or [])],
"description": manga.description.replace("<br>", "\n")
if manga.description
else "No description available",
"isAdult": manga.isAdult,
"in_komga": in_komga,
"requested": komga_request,
"siteUrl": manga.siteUrl,
}
)
if check_downloads:
for result in results:
downloads = Nyaa().search(result.get("title"), 3, 1)
else:
downloads = []
result["download"] = len(downloads) if downloads else 0
result_data: dict[str, Any] = {
"id": manga.id,
"title": manga.title.english
if manga.title.english
else manga.title.romaji,
"image": manga.coverImage.get("large")
if manga.coverImage
else "https://demofree.sirv.com/nope-not-here.jpg",
"status": manga.status,
"type": manga.format,
"genres": manga.genres or [],
"tags": [tag.name for tag in (manga.tags or [])],
"description": manga.description.replace("<br>", "\n")
if manga.description
else "No description available",
"isAdult": manga.isAdult,
"in_komga": in_komga,
"requested": komga_request,
"siteUrl": manga.siteUrl,
}
results.append(result_data)
# async check for available downloads
log.debug(f"Fetched {len(results)} results for query: {inputdata['query']}")
if check_downloads == 1:
for manga in results:
log.debug(f"Checking downloads for manga: {manga['title']}")
search_query = manga["title"]
search_results = cat.search(search_query, 3, 1)
manga["downloads"] = (
len(search_results) if isinstance(search_results, list) else 0
)
log.debug(f"Downloads for {manga['title']}: {manga['downloads']}")
log.error(f"Results: {results}")
return results
except ValueError as ve:
@@ -247,7 +253,10 @@ async def get_tags():
async def search():
data = await request.get_json()
print(data)
results = await fetch_data(data)
# in data replace bool value for check_downloads with 1 or 0
if "check_downloads" in data:
data["check_downloads"] = 1 if data["check_downloads"] is True else 0
results = await fetch_data(data, check_downloads=data.get("check_downloads", 0))
if not results:
return jsonify({"error": "No results found"}), 404
return jsonify(results)
@@ -358,9 +367,23 @@ async def delete_request():
return jsonify({"status": "failed"}), 400
if __name__ == "__main__":
log.info("Starting Komga Manga Grabber API")
# use hypercorn to run the app
import uvicorn
import sys
uvicorn.run(app, host="0.0.0.0", port=5001)
# run in test mode
log.info("Starting Komga Manga Grabber API")
if len(sys.argv) > 1:
if sys.argv[1] == "test":
log.info("Running in test mode")
# run in test mode
app.run(debug=True, host="0.0.0.0", port=5001)
elif sys.argv[1] == "prod":
log.info("Running in production mode")
# run in production mode
log.info("Starting Komga Manga Grabber API")
# use hypercorn to run the app
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=5001)
# run in test mode
else:
log.info("No arguments provided, running in default mode")
app.run(debug=True, host="0.0.0.0", port=5000)

View File

@@ -1,96 +1,135 @@
/* other styles are in magic.css */
/* ========== GRID LAYOUT ========== */
/* Modern UI refresh */
:root {
--bg: #0b1020;
--bg-soft: #0f172a;
--surface: #111827;
--surface-2: #0f172a;
--text: #e5e7eb;
--muted: #9ca3af;
--ring: #60a5fa;
--primary: #6366f1;
--primary-600: #4f46e5;
--success: #10b981;
--danger: #ef4444;
--warning: #f59e0b;
}
* { box-sizing: border-box; }
html, body {
margin: 0;
padding: 0;
background: linear-gradient(180deg, var(--bg), var(--bg-soft));
color: var(--text);
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Helvetica Neue, Arial, "Apple Color Emoji", "Segoe UI Emoji";
}
body {
max-width: 1200px;
margin: 0 auto;
padding: 24px 16px 64px;
}
h1 {
font-size: 1.75rem;
line-height: 2rem;
margin: 0 0 16px 0;
font-weight: 700;
}
/* Layout */
.results {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 1em;
margin-top: 20px;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 16px;
margin-top: 16px;
}
/* Responsive: show 1 per row on small screens */
@media screen and (max-width: 768px) {
.results {
grid-template-columns: 1fr;
}
@media (max-width: 768px) {
.results { grid-template-columns: 1fr; }
}
/* ========== CARD STYLING ========== */
/* Cards */
.card {
position: relative;
padding: 10px;
border: 1px solid #ccc;
background: #fafafa;
border: 1px solid rgba(255,255,255,0.06);
background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02));
backdrop-filter: blur(6px);
text-align: center;
transition: box-shadow 0.2s transform 0.2s;
border-radius: 10px;
transition: box-shadow 0.2s ease, transform 0.2s ease, border-color 0.2s ease;
border-radius: 14px;
box-shadow:
0 1px 1px rgba(0,0,0,0.08),
0 10px 20px rgba(0,0,0,0.15);
}
.card:hover {
box-shadow: 0 0 10px #aaa;
transform: scale(1.1);
/* pop out by 10% */
z-index: 2;
/* ensure it appears above others */
box-shadow:
0 1px 1px rgba(0,0,0,0.08),
0 16px 32px rgba(0,0,0,0.25);
transform: translateY(-2px) scale(1.02);
z-index: 2;
}
.card img {
width: 100%;
height: auto;
}
.card img { width: 100%; height: auto; border-radius: 8px; }
/* ========== ACTION BUTTONS ========== */
.actions {
margin-top: 10px;
display: flex;
justify-content: space-around;
justify-content: space-between;
gap: 8px;
}
.actions .info {
background-color: #007bff;
color: white;
border: none;
padding: 0.5em 1em;
button, .button {
appearance: none;
border: 1px solid rgba(255,255,255,0.1);
background: linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.04));
color: var(--text);
padding: 8px 12px;
border-radius: 10px;
cursor: pointer;
border-radius: 5px;
margin-right: 0.5em;
transition: transform 0.15s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.actions .info:hover {
background-color: #0056b3;
button:hover, .button:hover {
transform: translateY(-1px);
border-color: rgba(255,255,255,0.2);
box-shadow: 0 8px 16px rgba(0,0,0,0.25);
}
.actions .request {
background-color: #28a745;
color: white;
border: none;
padding: 0.5em 1em;
cursor: pointer;
border-radius: 5px;
}
.actions .info, .refresh, .index, .request-page { border-color: rgba(99,102,241,0.4); }
.actions .info { background: linear-gradient(180deg, rgba(99,102,241,0.35), rgba(99,102,241,0.2)); }
.actions .request { border-color: rgba(16,185,129,0.4); background: linear-gradient(180deg, rgba(16,185,129,0.35), rgba(16,185,129,0.2)); }
.delete-button { border-color: rgba(239,68,68,0.4); background: linear-gradient(180deg, rgba(239,68,68,0.35), rgba(239,68,68,0.2)); }
.reset { border-color: rgba(239,68,68,0.4); background: linear-gradient(180deg, rgba(239,68,68,0.35), rgba(239,68,68,0.2)); color: #fff; }
.actions .request:hover {
background-color: #1e7e34;
}
/* Page actions */
.refresh, .index, .request-page { padding: 10px 14px; }
/* ========== MODAL ========== */
.modal {
position: fixed;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgba(0, 0, 0, 0.4);
z-index: 50;
inset: 0;
display: none;
background: rgba(2,6,23,0.7);
-webkit-backdrop-filter: blur(4px);
backdrop-filter: blur(4px);
}
.modal[style*="display: block"] { display: block; }
.modal-content {
background-color: #fefefe;
background: linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.03));
border: 1px solid rgba(255,255,255,0.1);
margin: 5% auto;
padding: 20px;
border: 1px solid #888;
width: 50%;
border-radius: 10px;
width: min(720px, 92%);
border-radius: 16px;
color: var(--text);
box-shadow: 0 20px 40px rgba(0,0,0,0.4);
}
.close {
@@ -98,6 +137,8 @@
font-size: 28px;
font-weight: bold;
cursor: pointer;
padding: 2px 8px;
border-radius: 8px;
}
/* ========== IMAGE CONTAINER ========== */
@@ -144,48 +185,72 @@ body.nsfw-disabled .image-container.nsfw:hover img {
pointer-events: none;
}
.download-badge {
position: absolute;
top: 8px;
right: 8px;
background-color: rgba(99,102,241,0.9);
color: white;
padding: 4px 8px;
font-size: 12px;
font-weight: 700;
border-radius: 6px;
z-index: 2;
}
.search-bar {
display: flex;
flex-direction: column;
gap: 10px;
gap: 12px;
margin-bottom: 20px;
padding: 16px;
border-radius: 16px;
background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02));
border: 1px solid rgba(255,255,255,0.08);
box-shadow: 0 10px 20px rgba(0,0,0,0.25);
}
.search-bar select {
padding: 5px;
border: 1px solid #ccc;
border-radius: 4px;
.search-bar input[type="text"], .search-bar select {
padding: 10px 12px;
border-radius: 10px;
border: 1px solid rgba(255,255,255,0.15);
background: rgba(255,255,255,0.04);
color: var(--text);
outline: none;
transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.search-bar input[type="text"]:focus, .search-bar select:focus {
border-color: var(--ring);
box-shadow: 0 0 0 3px rgba(96,165,250,0.2);
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 1;
background-color: var(--surface);
color: var(--text);
min-width: 200px;
box-shadow: 0 12px 28px rgba(0,0,0,0.35);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 10px;
z-index: 5;
}
.dropdown-content .dropdown-item {
padding: 8px 16px;
padding: 10px 14px;
cursor: pointer;
}
.dropdown-content .dropdown-item:hover {
background-color: #f1f1f1;
background-color: rgba(255,255,255,0.06);
}
.dropdown-content.show {
display: block;
}
.reset {
/* Implement design here */
background-color: #f44336;
/* round the edges of the button */
border-radius: 9px;
}
.reset { border-radius: 10px; }
.selectors {
display: flex;
@@ -200,23 +265,38 @@ body.nsfw-disabled .image-container.nsfw:hover img {
/* ========== KOMGA SPECIFIC STYLES ========== */
.card.komga {
border: 3px solid green;
box-sizing: border-box;
/* disable the request button for entries in Komga */
/* only allow the info button to be clicked */
opacity: 0.3;
.card.komga::after {
content: 'In Komga';
position: absolute;
top: 10px;
left: 10px;
background: rgba(16,185,129,0.9);
color: white;
font-size: 12px;
font-weight: 700;
padding: 4px 8px;
border-radius: 6px;
z-index: 3;
}
.card.requested {
border: 3px solid orange;
box-sizing: border-box;
/* disable the request button for entries in Komga */
/* only allow the info button to be clicked */
opacity: 0.3;
.card.requested::after {
content: 'Requested';
position: absolute;
top: 10px;
left: 10px;
background: rgba(245,158,11,0.9);
color: #111827;
font-size: 12px;
font-weight: 700;
padding: 4px 8px;
border-radius: 6px;
z-index: 3;
}
.card.komga { opacity: 0.6; }
.card.requested { opacity: 0.8; }
.card.manga.requested .request {
pointer-events: none;
opacity: 0.5;
@@ -236,9 +316,8 @@ body.nsfw-disabled .image-container.nsfw:hover img {
position: absolute;
top: 5px;
right: 5px;
background-color: #dc3545;
color: white;
border: none;
border: 1px solid rgba(255,255,255,0.15);
padding: 0.5em;
cursor: pointer;
border-radius: 50%;

View File

@@ -52,6 +52,10 @@
<input type="checkbox" id="toggleNovels" checked />
Show Novels
</label>
<label style="margin-left: 1em;">
<input type="checkbox" id="checkAvailability" />
Check Availability
</label>
</div>
@@ -271,13 +275,14 @@
const selectedGenres = document.getElementById("genreInput").value.split(',').map(v => v.trim()).filter(v => v);
const selectedTags = document.getElementById("tagInput").value.split(',').map(v => v.trim()).filter(v => v);
const selectedType = document.getElementById("typeSelect").value;
const checkDownloads = document.getElementById("checkAvailability").checked; // Get the checkbox value
const query = {
query: searchTerm,
genres: selectedGenres,
tags: selectedTags,
type: selectedType // Include the selected type in the query
type: selectedType,
check_downloads: checkDownloads // Pass the checkbox value
};
const loadingElement = document.getElementById("loading");
@@ -324,6 +329,24 @@
imageContainer.appendChild(badge);
}
// Add download badge if applicable
if (document.getElementById("checkAvailability").checked) {
const downloadBadge = document.createElement('div');
downloadBadge.className = 'download-badge';
downloadBadge.textContent = `${result.downloads} Downloads`;
downloadBadge.style.position = 'absolute';
downloadBadge.style.top = '8px';
downloadBadge.style.right = '8px';
downloadBadge.style.backgroundColor = 'rgba(0, 0, 255, 0.8)';
downloadBadge.style.color = 'white';
downloadBadge.style.padding = '4px 8px';
downloadBadge.style.fontSize = '12px';
downloadBadge.style.fontWeight = 'bold';
downloadBadge.style.borderRadius = '4px';
downloadBadge.style.zIndex = '1';
imageContainer.appendChild(downloadBadge);
}
const title = document.createElement('p');
title.textContent = result.title || 'Untitled';

124
uv.lock generated
View File

@@ -14,7 +14,7 @@ wheels = [
[[package]]
name = "anilistapi"
version = "0.1.1"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" }
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [
{ name = "limit" },
{ name = "requests" },
@@ -60,11 +60,11 @@ wheels = [
[[package]]
name = "certifi"
version = "2025.4.26"
version = "2025.6.15"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" }
sdist = { url = "https://files.pythonhosted.org/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b", size = 158753, upload-time = "2025-06-15T02:45:51.329Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" },
{ url = "https://files.pythonhosted.org/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", size = 157650, upload-time = "2025-06-15T02:45:49.977Z" },
]
[[package]]
@@ -129,27 +129,26 @@ wheels = [
[[package]]
name = "greenlet"
version = "3.2.2"
version = "3.2.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/34/c1/a82edae11d46c0d83481aacaa1e578fea21d94a1ef400afd734d47ad95ad/greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485", size = 185797, upload-time = "2025-05-09T19:47:35.066Z" }
sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752, upload-time = "2025-06-05T16:16:09.955Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/89/30/97b49779fff8601af20972a62cc4af0c497c1504dfbb3e93be218e093f21/greenlet-3.2.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59", size = 269150, upload-time = "2025-05-09T14:50:30.784Z" },
{ url = "https://files.pythonhosted.org/packages/21/30/877245def4220f684bc2e01df1c2e782c164e84b32e07373992f14a2d107/greenlet-3.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf", size = 637381, upload-time = "2025-05-09T15:24:12.893Z" },
{ url = "https://files.pythonhosted.org/packages/8e/16/adf937908e1f913856b5371c1d8bdaef5f58f251d714085abeea73ecc471/greenlet-3.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325", size = 651427, upload-time = "2025-05-09T15:24:51.074Z" },
{ url = "https://files.pythonhosted.org/packages/ad/49/6d79f58fa695b618654adac64e56aff2eeb13344dc28259af8f505662bb1/greenlet-3.2.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5", size = 645795, upload-time = "2025-05-09T15:29:26.673Z" },
{ url = "https://files.pythonhosted.org/packages/5a/e6/28ed5cb929c6b2f001e96b1d0698c622976cd8f1e41fe7ebc047fa7c6dd4/greenlet-3.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825", size = 648398, upload-time = "2025-05-09T14:53:36.61Z" },
{ url = "https://files.pythonhosted.org/packages/9d/70/b200194e25ae86bc57077f695b6cc47ee3118becf54130c5514456cf8dac/greenlet-3.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d", size = 606795, upload-time = "2025-05-09T14:53:47.039Z" },
{ url = "https://files.pythonhosted.org/packages/f8/c8/ba1def67513a941154ed8f9477ae6e5a03f645be6b507d3930f72ed508d3/greenlet-3.2.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf", size = 1117976, upload-time = "2025-05-09T15:27:06.542Z" },
{ url = "https://files.pythonhosted.org/packages/c3/30/d0e88c1cfcc1b3331d63c2b54a0a3a4a950ef202fb8b92e772ca714a9221/greenlet-3.2.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1e76106b6fc55fa3d6fe1c527f95ee65e324a13b62e243f77b48317346559708", size = 1145509, upload-time = "2025-05-09T14:54:02.223Z" },
{ url = "https://files.pythonhosted.org/packages/90/2e/59d6491834b6e289051b252cf4776d16da51c7c6ca6a87ff97e3a50aa0cd/greenlet-3.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421", size = 296023, upload-time = "2025-05-09T14:53:24.157Z" },
{ url = "https://files.pythonhosted.org/packages/65/66/8a73aace5a5335a1cba56d0da71b7bd93e450f17d372c5b7c5fa547557e9/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418", size = 629911, upload-time = "2025-05-09T15:24:22.376Z" },
{ url = "https://files.pythonhosted.org/packages/48/08/c8b8ebac4e0c95dcc68ec99198842e7db53eda4ab3fb0a4e785690883991/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4", size = 635251, upload-time = "2025-05-09T15:24:52.205Z" },
{ url = "https://files.pythonhosted.org/packages/37/26/7db30868f73e86b9125264d2959acabea132b444b88185ba5c462cb8e571/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763", size = 632620, upload-time = "2025-05-09T15:29:28.051Z" },
{ url = "https://files.pythonhosted.org/packages/10/ec/718a3bd56249e729016b0b69bee4adea0dfccf6ca43d147ef3b21edbca16/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b", size = 628851, upload-time = "2025-05-09T14:53:38.472Z" },
{ url = "https://files.pythonhosted.org/packages/9b/9d/d1c79286a76bc62ccdc1387291464af16a4204ea717f24e77b0acd623b99/greenlet-3.2.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207", size = 593718, upload-time = "2025-05-09T14:53:48.313Z" },
{ url = "https://files.pythonhosted.org/packages/cd/41/96ba2bf948f67b245784cd294b84e3d17933597dffd3acdb367a210d1949/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8", size = 1105752, upload-time = "2025-05-09T15:27:08.217Z" },
{ url = "https://files.pythonhosted.org/packages/68/3b/3b97f9d33c1f2eb081759da62bd6162159db260f602f048bc2f36b4c453e/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:45f9f4853fb4cc46783085261c9ec4706628f3b57de3e68bae03e8f8b3c0de51", size = 1125170, upload-time = "2025-05-09T14:54:04.082Z" },
{ url = "https://files.pythonhosted.org/packages/31/df/b7d17d66c8d0f578d2885a3d8f565e9e4725eacc9d3fdc946d0031c055c4/greenlet-3.2.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:9ea5231428af34226c05f927e16fc7f6fa5e39e3ad3cd24ffa48ba53a47f4240", size = 269899, upload-time = "2025-05-09T14:54:01.581Z" },
{ url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732, upload-time = "2025-06-05T16:10:08.26Z" },
{ url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033, upload-time = "2025-06-05T16:38:53.983Z" },
{ url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999, upload-time = "2025-06-05T16:41:37.89Z" },
{ url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368, upload-time = "2025-06-05T16:48:21.467Z" },
{ url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037, upload-time = "2025-06-05T16:13:06.402Z" },
{ url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402, upload-time = "2025-06-05T16:12:51.91Z" },
{ url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577, upload-time = "2025-06-05T16:36:49.787Z" },
{ url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121, upload-time = "2025-06-05T16:12:42.527Z" },
{ url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603, upload-time = "2025-06-05T16:20:12.651Z" },
{ url = "https://files.pythonhosted.org/packages/d8/ca/accd7aa5280eb92b70ed9e8f7fd79dc50a2c21d8c73b9a0856f5b564e222/greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86", size = 271479, upload-time = "2025-06-05T16:10:47.525Z" },
{ url = "https://files.pythonhosted.org/packages/55/71/01ed9895d9eb49223280ecc98a557585edfa56b3d0e965b9fa9f7f06b6d9/greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97", size = 683952, upload-time = "2025-06-05T16:38:55.125Z" },
{ url = "https://files.pythonhosted.org/packages/ea/61/638c4bdf460c3c678a0a1ef4c200f347dff80719597e53b5edb2fb27ab54/greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728", size = 696917, upload-time = "2025-06-05T16:41:38.959Z" },
{ url = "https://files.pythonhosted.org/packages/22/cc/0bd1a7eb759d1f3e3cc2d1bc0f0b487ad3cc9f34d74da4b80f226fde4ec3/greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a", size = 692443, upload-time = "2025-06-05T16:48:23.113Z" },
{ url = "https://files.pythonhosted.org/packages/67/10/b2a4b63d3f08362662e89c103f7fe28894a51ae0bc890fabf37d1d780e52/greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892", size = 692995, upload-time = "2025-06-05T16:13:07.972Z" },
{ url = "https://files.pythonhosted.org/packages/5a/c6/ad82f148a4e3ce9564056453a71529732baf5448ad53fc323e37efe34f66/greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141", size = 655320, upload-time = "2025-06-05T16:12:53.453Z" },
{ url = "https://files.pythonhosted.org/packages/5c/4f/aab73ecaa6b3086a4c89863d94cf26fa84cbff63f52ce9bc4342b3087a06/greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a", size = 301236, upload-time = "2025-06-05T16:15:20.111Z" },
]
[[package]]
@@ -280,7 +279,7 @@ wheels = [
[[package]]
name = "komcache"
version = "0.1.2"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" }
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [
{ name = "komconfig" },
{ name = "pymysql" },
@@ -294,7 +293,7 @@ wheels = [
[[package]]
name = "komconfig"
version = "0.2.2"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" }
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [
{ name = "omegaconf" },
]
@@ -306,7 +305,7 @@ wheels = [
[[package]]
name = "komgapi"
version = "0.1.1"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" }
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [
{ name = "httpx" },
{ name = "komconfig" },
@@ -324,6 +323,7 @@ version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "anilistapi" },
{ name = "antlr4-python3-runtime" },
{ name = "flask" },
{ name = "httpx" },
{ name = "httpx-retries" },
@@ -341,6 +341,7 @@ dependencies = [
[package.metadata]
requires-dist = [
{ name = "anilistapi", specifier = ">=0.1.1" },
{ name = "antlr4-python3-runtime", specifier = ">=4.9.3" },
{ name = "flask", specifier = ">=3.1.1" },
{ name = "httpx", specifier = ">=0.28.1" },
{ name = "httpx-retries", specifier = ">=0.3.2" },
@@ -357,16 +358,18 @@ requires-dist = [
[[package]]
name = "komsuite-nyaapy"
version = "0.1.0"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" }
version = "0.1.3"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [
{ name = "bencodepy" },
{ name = "httpx" },
{ name = "httpx-retries" },
{ name = "lxml" },
{ name = "regex" },
]
sdist = { url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/files/komsuite-nyaapy/0.1.0/komsuite_nyaapy-0.1.0.tar.gz", hash = "sha256:0d02de20268265012c9b5bd674af04809a63c8fbd6b167f446550ec65f39a3cc" }
sdist = { url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/files/komsuite-nyaapy/0.1.3/komsuite_nyaapy-0.1.3.tar.gz", hash = "sha256:bb11afe8f722bea974760e17fb6c3f199de2bf298202718449ad2fa3fec88a41" }
wheels = [
{ url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/files/komsuite-nyaapy/0.1.0/komsuite_nyaapy-0.1.0-py3-none-any.whl", hash = "sha256:128645dfbfd714037301bde78222273abb79a80def246cec97fc925a2c57aad0" },
{ url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/files/komsuite-nyaapy/0.1.3/komsuite_nyaapy-0.1.3-py3-none-any.whl", hash = "sha256:f8d3628759c8074928b412ea43305b9a972bac6eaaa645fbc4ab83cb14bef400" },
]
[[package]]
@@ -390,27 +393,26 @@ wheels = [
[[package]]
name = "lxml"
version = "5.4.0"
version = "6.0.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/76/3d/14e82fc7c8fb1b7761f7e748fd47e2ec8276d137b6acfe5a4bb73853e08f/lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd", size = 3679479, upload-time = "2025-04-23T01:50:29.322Z" }
sdist = { url = "https://files.pythonhosted.org/packages/c5/ed/60eb6fa2923602fba988d9ca7c5cdbd7cf25faa795162ed538b527a35411/lxml-6.0.0.tar.gz", hash = "sha256:032e65120339d44cdc3efc326c9f660f5f7205f3a535c1fdbf898b29ea01fb72", size = 4096938, upload-time = "2025-06-26T16:28:19.373Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/87/cb/2ba1e9dd953415f58548506fa5549a7f373ae55e80c61c9041b7fd09a38a/lxml-5.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:773e27b62920199c6197130632c18fb7ead3257fce1ffb7d286912e56ddb79e0", size = 8110086, upload-time = "2025-04-23T01:46:52.218Z" },
{ url = "https://files.pythonhosted.org/packages/b5/3e/6602a4dca3ae344e8609914d6ab22e52ce42e3e1638c10967568c5c1450d/lxml-5.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ce9c671845de9699904b1e9df95acfe8dfc183f2310f163cdaa91a3535af95de", size = 4404613, upload-time = "2025-04-23T01:46:55.281Z" },
{ url = "https://files.pythonhosted.org/packages/4c/72/bf00988477d3bb452bef9436e45aeea82bb40cdfb4684b83c967c53909c7/lxml-5.4.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9454b8d8200ec99a224df8854786262b1bd6461f4280064c807303c642c05e76", size = 5012008, upload-time = "2025-04-23T01:46:57.817Z" },
{ url = "https://files.pythonhosted.org/packages/92/1f/93e42d93e9e7a44b2d3354c462cd784dbaaf350f7976b5d7c3f85d68d1b1/lxml-5.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cccd007d5c95279e529c146d095f1d39ac05139de26c098166c4beb9374b0f4d", size = 4760915, upload-time = "2025-04-23T01:47:00.745Z" },
{ url = "https://files.pythonhosted.org/packages/45/0b/363009390d0b461cf9976a499e83b68f792e4c32ecef092f3f9ef9c4ba54/lxml-5.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fce1294a0497edb034cb416ad3e77ecc89b313cff7adbee5334e4dc0d11f422", size = 5283890, upload-time = "2025-04-23T01:47:04.702Z" },
{ url = "https://files.pythonhosted.org/packages/19/dc/6056c332f9378ab476c88e301e6549a0454dbee8f0ae16847414f0eccb74/lxml-5.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24974f774f3a78ac12b95e3a20ef0931795ff04dbb16db81a90c37f589819551", size = 4812644, upload-time = "2025-04-23T01:47:07.833Z" },
{ url = "https://files.pythonhosted.org/packages/ee/8a/f8c66bbb23ecb9048a46a5ef9b495fd23f7543df642dabeebcb2eeb66592/lxml-5.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:497cab4d8254c2a90bf988f162ace2ddbfdd806fce3bda3f581b9d24c852e03c", size = 4921817, upload-time = "2025-04-23T01:47:10.317Z" },
{ url = "https://files.pythonhosted.org/packages/04/57/2e537083c3f381f83d05d9b176f0d838a9e8961f7ed8ddce3f0217179ce3/lxml-5.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e794f698ae4c5084414efea0f5cc9f4ac562ec02d66e1484ff822ef97c2cadff", size = 4753916, upload-time = "2025-04-23T01:47:12.823Z" },
{ url = "https://files.pythonhosted.org/packages/d8/80/ea8c4072109a350848f1157ce83ccd9439601274035cd045ac31f47f3417/lxml-5.4.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:2c62891b1ea3094bb12097822b3d44b93fc6c325f2043c4d2736a8ff09e65f60", size = 5289274, upload-time = "2025-04-23T01:47:15.916Z" },
{ url = "https://files.pythonhosted.org/packages/b3/47/c4be287c48cdc304483457878a3f22999098b9a95f455e3c4bda7ec7fc72/lxml-5.4.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:142accb3e4d1edae4b392bd165a9abdee8a3c432a2cca193df995bc3886249c8", size = 4874757, upload-time = "2025-04-23T01:47:19.793Z" },
{ url = "https://files.pythonhosted.org/packages/2f/04/6ef935dc74e729932e39478e44d8cfe6a83550552eaa072b7c05f6f22488/lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982", size = 4947028, upload-time = "2025-04-23T01:47:22.401Z" },
{ url = "https://files.pythonhosted.org/packages/cb/f9/c33fc8daa373ef8a7daddb53175289024512b6619bc9de36d77dca3df44b/lxml-5.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4291d3c409a17febf817259cb37bc62cb7eb398bcc95c1356947e2871911ae61", size = 4834487, upload-time = "2025-04-23T01:47:25.513Z" },
{ url = "https://files.pythonhosted.org/packages/8d/30/fc92bb595bcb878311e01b418b57d13900f84c2b94f6eca9e5073ea756e6/lxml-5.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4f5322cf38fe0e21c2d73901abf68e6329dc02a4994e483adbcf92b568a09a54", size = 5381688, upload-time = "2025-04-23T01:47:28.454Z" },
{ url = "https://files.pythonhosted.org/packages/43/d1/3ba7bd978ce28bba8e3da2c2e9d5ae3f8f521ad3f0ca6ea4788d086ba00d/lxml-5.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0be91891bdb06ebe65122aa6bf3fc94489960cf7e03033c6f83a90863b23c58b", size = 5242043, upload-time = "2025-04-23T01:47:31.208Z" },
{ url = "https://files.pythonhosted.org/packages/ee/cd/95fa2201041a610c4d08ddaf31d43b98ecc4b1d74b1e7245b1abdab443cb/lxml-5.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:15a665ad90054a3d4f397bc40f73948d48e36e4c09f9bcffc7d90c87410e478a", size = 5021569, upload-time = "2025-04-23T01:47:33.805Z" },
{ url = "https://files.pythonhosted.org/packages/2d/a6/31da006fead660b9512d08d23d31e93ad3477dd47cc42e3285f143443176/lxml-5.4.0-cp313-cp313-win32.whl", hash = "sha256:d5663bc1b471c79f5c833cffbc9b87d7bf13f87e055a5c86c363ccd2348d7e82", size = 3485270, upload-time = "2025-04-23T01:47:36.133Z" },
{ url = "https://files.pythonhosted.org/packages/fc/14/c115516c62a7d2499781d2d3d7215218c0731b2c940753bf9f9b7b73924d/lxml-5.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:bcb7a1096b4b6b24ce1ac24d4942ad98f983cd3810f9711bcd0293f43a9d8b9f", size = 3814606, upload-time = "2025-04-23T01:47:39.028Z" },
{ url = "https://files.pythonhosted.org/packages/79/21/6e7c060822a3c954ff085e5e1b94b4a25757c06529eac91e550f3f5cd8b8/lxml-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6da7cd4f405fd7db56e51e96bff0865b9853ae70df0e6720624049da76bde2da", size = 8414372, upload-time = "2025-06-26T16:26:39.079Z" },
{ url = "https://files.pythonhosted.org/packages/a4/f6/051b1607a459db670fc3a244fa4f06f101a8adf86cda263d1a56b3a4f9d5/lxml-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b34339898bb556a2351a1830f88f751679f343eabf9cf05841c95b165152c9e7", size = 4593940, upload-time = "2025-06-26T16:26:41.891Z" },
{ url = "https://files.pythonhosted.org/packages/8e/74/dd595d92a40bda3c687d70d4487b2c7eff93fd63b568acd64fedd2ba00fe/lxml-6.0.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:51a5e4c61a4541bd1cd3ba74766d0c9b6c12d6a1a4964ef60026832aac8e79b3", size = 5214329, upload-time = "2025-06-26T16:26:44.669Z" },
{ url = "https://files.pythonhosted.org/packages/52/46/3572761efc1bd45fcafb44a63b3b0feeb5b3f0066886821e94b0254f9253/lxml-6.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d18a25b19ca7307045581b18b3ec9ead2b1db5ccd8719c291f0cd0a5cec6cb81", size = 4947559, upload-time = "2025-06-28T18:47:31.091Z" },
{ url = "https://files.pythonhosted.org/packages/94/8a/5e40de920e67c4f2eef9151097deb9b52d86c95762d8ee238134aff2125d/lxml-6.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d4f0c66df4386b75d2ab1e20a489f30dc7fd9a06a896d64980541506086be1f1", size = 5102143, upload-time = "2025-06-28T18:47:33.612Z" },
{ url = "https://files.pythonhosted.org/packages/7c/4b/20555bdd75d57945bdabfbc45fdb1a36a1a0ff9eae4653e951b2b79c9209/lxml-6.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f4b481b6cc3a897adb4279216695150bbe7a44c03daba3c894f49d2037e0a24", size = 5021931, upload-time = "2025-06-26T16:26:47.503Z" },
{ url = "https://files.pythonhosted.org/packages/b6/6e/cf03b412f3763d4ca23b25e70c96a74cfece64cec3addf1c4ec639586b13/lxml-6.0.0-cp313-cp313-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a78d6c9168f5bcb20971bf3329c2b83078611fbe1f807baadc64afc70523b3a", size = 5645469, upload-time = "2025-07-03T19:19:13.32Z" },
{ url = "https://files.pythonhosted.org/packages/d4/dd/39c8507c16db6031f8c1ddf70ed95dbb0a6d466a40002a3522c128aba472/lxml-6.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae06fbab4f1bb7db4f7c8ca9897dc8db4447d1a2b9bee78474ad403437bcc29", size = 5247467, upload-time = "2025-06-26T16:26:49.998Z" },
{ url = "https://files.pythonhosted.org/packages/4d/56/732d49def0631ad633844cfb2664563c830173a98d5efd9b172e89a4800d/lxml-6.0.0-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:1fa377b827ca2023244a06554c6e7dc6828a10aaf74ca41965c5d8a4925aebb4", size = 4720601, upload-time = "2025-06-26T16:26:52.564Z" },
{ url = "https://files.pythonhosted.org/packages/8f/7f/6b956fab95fa73462bca25d1ea7fc8274ddf68fb8e60b78d56c03b65278e/lxml-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1676b56d48048a62ef77a250428d1f31f610763636e0784ba67a9740823988ca", size = 5060227, upload-time = "2025-06-26T16:26:55.054Z" },
{ url = "https://files.pythonhosted.org/packages/97/06/e851ac2924447e8b15a294855caf3d543424364a143c001014d22c8ca94c/lxml-6.0.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0e32698462aacc5c1cf6bdfebc9c781821b7e74c79f13e5ffc8bfe27c42b1abf", size = 4790637, upload-time = "2025-06-26T16:26:57.384Z" },
{ url = "https://files.pythonhosted.org/packages/06/d4/fd216f3cd6625022c25b336c7570d11f4a43adbaf0a56106d3d496f727a7/lxml-6.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4d6036c3a296707357efb375cfc24bb64cd955b9ec731abf11ebb1e40063949f", size = 5662049, upload-time = "2025-07-03T19:19:16.409Z" },
{ url = "https://files.pythonhosted.org/packages/52/03/0e764ce00b95e008d76b99d432f1807f3574fb2945b496a17807a1645dbd/lxml-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7488a43033c958637b1a08cddc9188eb06d3ad36582cebc7d4815980b47e27ef", size = 5272430, upload-time = "2025-06-26T16:27:00.031Z" },
{ url = "https://files.pythonhosted.org/packages/5f/01/d48cc141bc47bc1644d20fe97bbd5e8afb30415ec94f146f2f76d0d9d098/lxml-6.0.0-cp313-cp313-win32.whl", hash = "sha256:5fcd7d3b1d8ecb91445bd71b9c88bdbeae528fefee4f379895becfc72298d181", size = 3612896, upload-time = "2025-06-26T16:27:04.251Z" },
{ url = "https://files.pythonhosted.org/packages/f4/87/6456b9541d186ee7d4cb53bf1b9a0d7f3b1068532676940fdd594ac90865/lxml-6.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:2f34687222b78fff795feeb799a7d44eca2477c3d9d3a46ce17d51a4f383e32e", size = 4013132, upload-time = "2025-06-26T16:27:06.415Z" },
{ url = "https://files.pythonhosted.org/packages/b7/42/85b3aa8f06ca0d24962f8100f001828e1f1f1a38c954c16e71154ed7d53a/lxml-6.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:21db1ec5525780fd07251636eb5f7acb84003e9382c72c18c542a87c416ade03", size = 3672642, upload-time = "2025-06-26T16:27:09.888Z" },
]
[[package]]
@@ -534,7 +536,7 @@ wheels = [
[[package]]
name = "requests"
version = "2.32.3"
version = "2.32.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
@@ -542,9 +544,9 @@ dependencies = [
{ name = "idna" },
{ name = "urllib3" },
]
sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" }
sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" },
{ url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" },
]
[[package]]
@@ -584,33 +586,33 @@ asyncio = [
[[package]]
name = "typing-extensions"
version = "4.14.0"
version = "4.14.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423, upload-time = "2025-06-02T14:52:11.399Z" }
sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839, upload-time = "2025-06-02T14:52:10.026Z" },
{ url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" },
]
[[package]]
name = "urllib3"
version = "2.4.0"
version = "2.5.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload-time = "2025-04-10T15:23:39.232Z" }
sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" },
{ url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
]
[[package]]
name = "uvicorn"
version = "0.34.3"
version = "0.35.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
{ name = "h11" },
]
sdist = { url = "https://files.pythonhosted.org/packages/de/ad/713be230bcda622eaa35c28f0d328c3675c371238470abdea52417f17a8e/uvicorn-0.34.3.tar.gz", hash = "sha256:35919a9a979d7a59334b6b10e05d77c1d0d574c50e0fc98b8b1a0f165708b55a", size = 76631, upload-time = "2025-06-01T07:48:17.531Z" }
sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473, upload-time = "2025-06-28T16:15:46.058Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6d/0d/8adfeaa62945f90d19ddc461c55f4a50c258af7662d34b6a3d5d1f8646f6/uvicorn-0.34.3-py3-none-any.whl", hash = "sha256:16246631db62bdfbf069b0645177d6e8a77ba950cfedbfd093acef9444e4d885", size = 62431, upload-time = "2025-06-01T07:48:15.664Z" },
{ url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" },
]
[[package]]