Compare commits

...

90 Commits
0.0.3 ... main

Author SHA1 Message Date
b084c2e643 Merge pull request '⬆️ Update dependency urllib3 to v2.2.2' (#35) from renovate/urllib3-2.x into main
All checks were successful
ci / docker (push) Successful in 14s
Reviewed-on: #35
2024-06-20 12:25:10 +02:00
342ed840bc Merge pull request '⬆️ Update docker/build-push-action action to v6' (#36) from renovate/docker-build-push-action-6.x into main
Some checks failed
ci / docker (push) Failing after 14m16s
Reviewed-on: #36
2024-06-20 12:07:14 +02:00
241d989600 ⬆️ Update docker/build-push-action action to v6
All checks were successful
ci / docker (pull_request) Successful in 12s
2024-06-18 01:11:12 +00:00
f5e1ec2a51 ⬆️ Update dependency urllib3 to v2.2.2
All checks were successful
ci / docker (pull_request) Successful in 35s
2024-06-18 01:11:07 +00:00
54a9eaae6c Merge pull request '⬆️ Update dependency typing_extensions to v4.12.2' (#34) from renovate/typing_extensions-4.x into main
All checks were successful
ci / docker (push) Successful in 13s
Reviewed-on: #34
2024-06-10 12:10:19 +02:00
86446f22e6 ⬆️ Update dependency typing_extensions to v4.12.2
All checks were successful
ci / docker (pull_request) Successful in 35s
2024-06-10 10:09:11 +00:00
5cd7621065 Merge pull request '⬆️ Update dependency typing_extensions to v4.12.1' (#32) from renovate/typing_extensions-4.x into main
All checks were successful
ci / docker (push) Successful in 28s
Reviewed-on: #32
2024-06-05 09:59:12 +02:00
f52b555f6c Merge pull request '⬆️ Update dependency certifi to v2024.6.2' (#33) from renovate/certifi-2024.x into main
Some checks failed
ci / docker (push) Has been cancelled
Reviewed-on: #33
2024-06-05 09:59:04 +02:00
9156129790 ⬆️ Update dependency certifi to v2024.6.2
All checks were successful
ci / docker (pull_request) Successful in 11s
2024-06-03 01:05:51 +00:00
27beb67f5b ⬆️ Update dependency typing_extensions to v4.12.1
All checks were successful
ci / docker (pull_request) Successful in 32s
2024-06-02 01:12:26 +00:00
9015c6c4fd Merge pull request '⬆️ Update dependency requests to v2.32.3' (#31) from renovate/requests-2.x into main
All checks were successful
ci / docker (push) Successful in 39s
Reviewed-on: #31
2024-05-30 10:53:46 +02:00
5f32eebd6b ⬆️ Update dependency requests to v2.32.3
All checks were successful
ci / docker (pull_request) Successful in 28s
2024-05-30 01:05:48 +00:00
e1969bcae9 Merge pull request '⬆️ Update dependency requests to v2.32.2' (#29) from renovate/requests-2.x into main
All checks were successful
ci / docker (push) Successful in 26s
Reviewed-on: #29
2024-05-24 14:29:42 +02:00
343ef81e5e Merge pull request '⬆️ Update dependency typing_extensions to v4.12.0' (#30) from renovate/typing_extensions-4.x into main
Some checks failed
ci / docker (push) Has been cancelled
Reviewed-on: #30
2024-05-24 14:29:35 +02:00
84c29fd4b6 ⬆️ Update dependency typing_extensions to v4.12.0
All checks were successful
ci / docker (pull_request) Successful in 1m7s
2024-05-24 01:05:29 +00:00
bbb97828e1 ⬆️ Update dependency requests to v2.32.2
All checks were successful
ci / docker (pull_request) Successful in 26s
2024-05-22 01:12:18 +00:00
e4beb8ae64 Merge pull request '⬆️ Update dependency aiohttp to v3.9.5' (#28) from renovate/aiohttp-3.x into main
All checks were successful
ci / docker (push) Successful in 35s
Reviewed-on: #28
2024-05-16 09:25:10 +02:00
a738435020 ⬆️ Update dependency aiohttp to v3.9.5
All checks were successful
ci / docker (pull_request) Successful in 48s
2024-04-17 01:09:28 +00:00
c7b312b41f Merge pull request '⬆️ Update dependency idna to v3.7' (#27) from renovate/idna-3.x into main
All checks were successful
ci / docker (push) Successful in 22s
Reviewed-on: #27
2024-04-16 13:20:33 +02:00
82e220d920 Merge pull request '⬆️ Update dependency aiohttp to v3.9.4' (#26) from renovate/aiohttp-3.x into main
Some checks failed
ci / docker (push) Has been cancelled
Reviewed-on: #26
2024-04-16 13:20:26 +02:00
0c08a8c0b2 ⬆️ Update dependency idna to v3.7
All checks were successful
ci / docker (pull_request) Successful in 26s
2024-04-12 01:05:09 +00:00
c99f631220 ⬆️ Update dependency aiohttp to v3.9.4
All checks were successful
ci / docker (pull_request) Successful in 22s
2024-04-12 01:05:02 +00:00
f2a56448f7 Add .gitea/workflows/docker.yml
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci / docker (push) Successful in 1m2s
2024-04-11 10:35:45 +02:00
67e232ff33 Merge pull request '⬆️ Update dependency typing_extensions to v4.11.0' (#25) from renovate/typing_extensions-4.x into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #25
2024-04-11 09:20:09 +02:00
Renovate
0b63bb9915 ⬆️ Update dependency typing_extensions to v4.11.0
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-04-11 01:05:33 +00:00
ca2ebe0fe3 Merge pull request '⬆️ Update dependency pixivpy3 to v3.7.5' (#22) from renovate/pixivpy3-3.x into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #22
2024-03-07 09:56:30 +01:00
fe6ecdfa05 Merge pull request '⬆️ Update dependency pyparsing to v3.1.2' (#23) from renovate/pyparsing-3.x into main
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Reviewed-on: #23
2024-03-07 09:56:13 +01:00
Renovate
250524a936 ⬆️ Update dependency pyparsing to v3.1.2
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-03-07 02:07:02 +00:00
Renovate
b1228b458d ⬆️ Update dependency pixivpy3 to v3.7.5
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-03-04 02:05:19 +00:00
adcd7e92d3 Merge pull request '⬆️ Update dependency typing_extensions to v4.10.0' (#21) from renovate/typing_extensions-4.x into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #21
2024-02-27 13:57:41 +01:00
Renovate
7742051c45 ⬆️ Update dependency typing_extensions to v4.10.0
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-02-26 02:04:34 +00:00
a06aa2e307 Merge pull request '⬆️ Update dependency multidict to v6.0.5' (#18) from renovate/multidict-6.x into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #18
2024-02-22 09:02:24 +01:00
481bb06b73 Merge pull request '⬆️ Update dependency certifi to v2024' (#19) from renovate/certifi-2024.x into main
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Reviewed-on: #19
2024-02-22 09:02:14 +01:00
4c00f4f620 Merge pull request '⬆️ Update dependency urllib3 to v2.2.1' (#20) from renovate/urllib3-2.x into main
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Reviewed-on: #20
2024-02-22 09:02:02 +01:00
Renovate
ade474e035 ⬆️ Update dependency urllib3 to v2.2.1
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-02-19 02:04:47 +00:00
Renovate
4cbb59f8aa ⬆️ Update dependency certifi to v2024
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-02-02 02:12:32 +00:00
Renovate
0e4d60c466 ⬆️ Update dependency multidict to v6.0.5
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-02-02 02:12:24 +00:00
776f46a30b Merge pull request '⬆️ Update dependency aiohttp to v3.9.3' (#16) from renovate/aiohttp-3.x into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #16
2024-01-31 09:08:42 +01:00
b16383e856 Merge pull request '⬆️ Update dependency urllib3 to v2.2.0' (#17) from renovate/urllib3-2.x into main
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Reviewed-on: #17
2024-01-31 09:08:32 +01:00
Renovate
cfb770d553 ⬆️ Update dependency urllib3 to v2.2.0
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-31 02:06:01 +00:00
Renovate
dabd9c37dd ⬆️ Update dependency aiohttp to v3.9.3
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-30 02:14:06 +00:00
8dd8ab0996 Fix python 3.12
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2024-01-25 11:54:17 +01:00
d57751e1a1 Merge pull request '⬆️ Update dependency typing_extensions to v4.9.0' (#14) from renovate/typing_extensions-4.x into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #14
2024-01-25 11:34:02 +01:00
62155703ae Merge pull request '⬆️ Update dependency idna to v3.6' (#12) from renovate/idna-3.x into main
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Reviewed-on: #12
2024-01-25 11:33:55 +01:00
d7ab55a64a Merge pull request '⬆️ Update dependency attrs to v23.2.0' (#10) from renovate/attrs-23.x into main
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Reviewed-on: #10
2024-01-25 11:33:46 +01:00
d9a5e50685 Merge pull request '⬆️ Update dependency yarl to v1.9.4' (#8) from renovate/yarl-1.x into main
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Reviewed-on: #8
2024-01-25 11:33:35 +01:00
Renovate
6a4aaf76f7 ⬆️ Update dependency typing_extensions to v4.9.0
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
2024-01-25 10:33:27 +00:00
Renovate
bd7758fce2 ⬆️ Update dependency idna to v3.6
Some checks failed
ci/woodpecker/pr/woodpecker Pipeline failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-25 10:33:22 +00:00
Renovate
19f4e88a07 ⬆️ Update dependency attrs to v23.2.0
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-25 10:33:18 +00:00
Renovate
98ca76d285 ⬆️ Update dependency yarl to v1.9.4
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-25 10:33:15 +00:00
cc6a8bd47c Merge pull request '⬆️ Update dependency aiohttp to v3.9.1' (#9) from renovate/aiohttp-3.x into main
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Reviewed-on: #9
2024-01-25 11:32:14 +01:00
246e846052 Merge pull request '⬆️ Update dependency certifi to v2023.11.17' (#11) from renovate/certifi-2023.x into main
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Reviewed-on: #11
2024-01-25 11:32:03 +01:00
afaa6e42ee Merge pull request '⬆️ Update dependency isort to v5.13.2' (#13) from renovate/isort-5.x into main
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Reviewed-on: #13
2024-01-25 11:31:50 +01:00
36b895cf22 Merge pull request '⬆️ Update dependency urllib3 to v2.1.0' (#15) from renovate/urllib3-2.x into main
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Reviewed-on: #15
2024-01-25 11:28:22 +01:00
a5b690b4af Merge pull request '⬆️ Update dependency frozenlist to v1.4.1' (#7) from renovate/frozenlist-1.x into main
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Reviewed-on: #7
2024-01-25 11:28:09 +01:00
Renovate
2b2190a32b ⬆️ Update dependency urllib3 to v2.1.0
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-25 10:27:50 +00:00
Renovate
0b614ba907 ⬆️ Update dependency isort to v5.13.2
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-25 10:27:34 +00:00
Renovate
759a63a7d6 ⬆️ Update dependency certifi to v2023.11.17
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-25 10:27:24 +00:00
Renovate
501c77af7b ⬆️ Update dependency aiohttp to v3.9.1
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-25 10:27:11 +00:00
Renovate
8c47ae8a07 ⬆️ Update dependency frozenlist to v1.4.1
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-25 10:27:01 +00:00
b305825bf6 Merge pull request '⬆️ Update dependency charset-normalizer to v3.3.2' (#6) from renovate/charset-normalizer-3.x into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #6
2024-01-25 11:26:46 +01:00
Renovate
11bdc75857 ⬆️ Update dependency charset-normalizer to v3.3.2
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
2024-01-25 10:25:49 +00:00
a7883d8edd Freeze deps
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-01-25 11:24:38 +01:00
311baa21e0 Add posts info on reply
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-01-25 11:13:49 +01:00
1900355cf2 Merge pull request '⬆️ Update dependency pixivpy3 to v3.7.4' (#4) from renovate/pixivpy3-3.x into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #4
2023-11-08 10:29:40 +01:00
Renovate
b80613e3d1 ⬆️ Update dependency pixivpy3 to v3.7.4
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
2023-11-08 02:04:28 +00:00
1aecdc2d9c Stay on python 3.11 for now
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-11-02 22:38:53 +01:00
1ea6f9f871 aiohttp beta for python 3.12
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2023-11-02 22:36:07 +01:00
ff4b530b26 Switch to full image
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2023-11-02 22:32:16 +01:00
e61325fc1e Pin deps
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2023-11-02 22:27:25 +01:00
69f55616e2 Merge pull request '⬆️ Update python Docker tag to v3.12' (#2) from renovate/python-3.x into main
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Reviewed-on: #2
2023-11-02 22:25:03 +01:00
Renovate
4d7a91801b ⬆️ Update python Docker tag to v3.12
Some checks failed
ci/woodpecker/pr/woodpecker Pipeline failed
ci/woodpecker/push/woodpecker Pipeline failed
2023-11-02 21:23:08 +00:00
30df41f5a5 Update renovate.json
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-11-02 22:22:40 +01:00
ee75a9dbc0 Merge pull request 'Configure Renovate' (#1) from renovate/configure into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
Reviewed-on: #1
2023-11-02 22:21:05 +01:00
9759eb7bf4 Fix submited by for context menue
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2023-11-02 22:20:33 +01:00
Renovate
840f8a58c5 Add renovate.json
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-11-02 21:12:17 +00:00
703feb8ca3 Fix max thread to 10 because au pool size
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-11-02 21:42:14 +01:00
bc5683cd72 Fix async blocking state 2023-11-02 21:41:53 +01:00
f4e4c5dda4 Message formating
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-11-02 21:11:32 +01:00
2cb1539517 Fix crash 2
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-11-02 20:57:29 +01:00
82b9ee4a39 Fix crash
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-11-02 20:49:26 +01:00
1fd60f9207 Add artist name
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-11-02 16:29:28 +01:00
36591fda85 handle file size
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-11-02 16:15:41 +01:00
f23f6cc55f Add logging
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-11-02 12:02:03 +01:00
5912a8527f Add thread for multiple image
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-11-02 11:43:33 +01:00
sclement
61ef3bfd30 Check if image is visible
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-11-01 21:33:13 +01:00
sclement
50034cf7b0 Add slash command
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-10-31 15:31:07 +01:00
sclement
7047538a78 Add muted tips
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-31 11:53:52 +01:00
sclement
d08d5131f7 Fix regexp
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-10-30 17:27:40 +01:00
sclement
c592146efb Sort file
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2023-10-30 16:55:16 +01:00
16 changed files with 472 additions and 148 deletions

View File

@ -0,0 +1,48 @@
name: ci
on:
push:
branches:
- "*"
tags:
- "*"
pull_request:
branches:
- "main"
jobs:
docker:
runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
git.sebclem.fr/${{ gitea.repository }}
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
- name: Login to registry
if: github.ref_type == 'tag'
uses: docker/login-action@v3
with:
registry: git.sebclem.fr
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: ${{ github.ref_type == 'tag' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

12
.vscode/launch.json vendored
View File

@ -4,11 +4,21 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Remote Attach",
"type": "python",
"request": "attach",
"connect": { "host": "docker.cloud.home", "port": 5678 },
"pathMappings": [
{ "localRoot": "${workspaceFolder}", "remoteRoot": "." }
],
"justMyCode": true
},
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "main.py",
"program": "src/main.py",
"envFile": "${workspaceFolder}/.env",
"console": "integratedTerminal",
"justMyCode": true

View File

@ -1,6 +1,9 @@
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.codeActionsOnSave": {
"source.organizeImports": true
}
},
"python.formatting.provider": "none",
"python.analysis.autoImportCompletions": true,

View File

@ -1,5 +1,5 @@
# For more information, please refer to https://aka.ms/vscode-docker-python
FROM python:3.10-slim
FROM python:3.12-alpine
# Keeps Python from generating .pyc files in the container
ENV PYTHONDONTWRITEBYTECODE=1
@ -7,6 +7,8 @@ ENV PYTHONDONTWRITEBYTECODE=1
# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1
RUN apk add build-base
# Install pip requirements
COPY requirements.txt .
RUN python -m pip install -r requirements.txt
@ -19,4 +21,5 @@ COPY . /app
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser
CMD ["python", "main.py"]
# During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
CMD ["python", "src/main.py"]

View File

@ -6,6 +6,6 @@ services:
build:
context: .
dockerfile: ./Dockerfile
command: ["sh", "-c", "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 main.py "]
command: ["sh", "-c", "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 src/main.py "]
ports:
- 5678:5678

55
main.py
View File

@ -1,55 +0,0 @@
import math
import os
import re
from shlex import join
from tempfile import TemporaryDirectory
import discord
import pixiv
import send_message
REFRESH_TOKEN = os.getenv("PIXIV_REFRESH_TOKEN")
if REFRESH_TOKEN is None:
print("Pixiv refresh token is missing, please set PIXIV_REFRESH_TOKEN")
exit(1)
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
if DISCORD_TOKEN is None:
print("Discord token is missing, please set DISCORD_TOKEN")
exit(1)
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f"We have logged in as {client.user}")
@client.event
async def on_message(message: discord.Message):
if message.author == client.user:
return
if (
match := re.search(
r"(?P<url>https?://(?:www\.)?pixiv.net/\w+/artworks/(?P<id>\d+))",
message.content,
)
) is not None:
with TemporaryDirectory() as tmp_dir:
async with message.channel.typing():
title = pixiv.dowload_pixiv_images(
int(match.group("id")), tmp_dir, REFRESH_TOKEN
)
files = os.listdir(tmp_dir)
files.reverse()
await send_message.send_message_with_embed(
message, files, title, tmp_dir, match.group("url")
)
await send_message.send_message(message, files, tmp_dir)
client.run(DISCORD_TOKEN)

View File

@ -1,27 +0,0 @@
import pixivpy3
def dowload_pixiv_images(
illust_id: int,
dest_folder: str,
refresh_token: str,
):
api = pixivpy3.AppPixivAPI()
api.auth(refresh_token=refresh_token)
# get origin url
json_result = api.illust_detail(illust_id)
illust = json_result.illust
pages = illust["meta_pages"]
if len(pages) > 0:
print(f"Dowloading mutiple images to {dest_folder}")
for page in pages:
url = page["image_urls"]["original"]
print(url)
api.download(url=url, path=dest_folder)
else:
print(f"Dowloading single image to {dest_folder}")
api.download(
url=illust["meta_single_page"]["original_image_url"], path=dest_folder
)
print("Down4load finished !")
return illust["title"]

8
renovate.json Normal file
View File

@ -0,0 +1,8 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
],
"commitMessagePrefix": ":arrow_up:"
}

View File

@ -1,2 +1,21 @@
pixivpy3
discord.py
pixivpy3==3.7.5
discord.py==2.3.2
# Freeze
aiohttp==3.9.5
aiosignal==1.3.1
async-timeout==4.0.3
attrs==23.2.0
certifi==2024.6.2
charset-normalizer==3.3.2
cloudscraper==1.2.71
frozenlist==1.4.1
idna==3.7
isort==5.13.2
multidict==6.0.5
pyparsing==3.1.2
requests==2.32.3
requests-toolbelt==1.0.0
typing_extensions==4.12.2
urllib3==2.2.2
yarl==1.9.4

View File

@ -1,59 +0,0 @@
import math
import os
import discord
async def send_message_with_embed(
message: discord.Message, files, title: str, tmp_dir: str, url: str
):
to_send_files = []
to_send_embeds = []
for file in files:
joined = os.path.join(tmp_dir, file)
embed = discord.Embed(url=url)
embed.set_image(url=f"attachment://{file}")
to_send_files.append(discord.File(joined, file))
to_send_embeds.append(embed)
if len(to_send_embeds) > 4:
parts = math.ceil(len(to_send_embeds) / 4)
i = 1
while len(to_send_embeds) > 4:
splited_file = to_send_files[:4]
to_send_files = to_send_files[4:]
splited_embed = to_send_embeds[:4]
to_send_embeds = to_send_embeds[4:]
for embed in splited_embed:
embed.title = f"{title} - Part {i}/{parts}"
if i == 1:
await message.reply(files=splited_file, embeds=splited_embed)
else:
await message.channel.send(files=splited_file, embeds=splited_embed)
i = i + 1
for embed in to_send_embeds:
embed.title = f"{title} - Part {i}/{parts}"
await message.channel.send(files=to_send_files, embeds=to_send_embeds)
else:
for embed in to_send_embeds:
embed.title = title
await message.reply(files=to_send_files, embeds=to_send_embeds)
async def send_message(message: discord.Message, files, tmp_dir: str):
to_send_files = []
for file in files:
joined = os.path.join(tmp_dir, file)
to_send_files.append(discord.File(joined, file))
if len(to_send_files) > 10:
first = True
while len(to_send_files) > 10:
splited_file = to_send_files[:4]
to_send_files = to_send_files[4:]
if first:
await message.reply(files=splited_file)
first = False
else:
await message.channel.send(files=splited_file)
await message.channel.send(files=to_send_files)
else:
await message.reply(files=to_send_files)

View File

View File

@ -0,0 +1,108 @@
import os
from typing import List
import discord
from idna import intranges_contain
TIPS_MESSAGE = ":bulb: TIPS: You can disable Discord's default preview for link by wrapping it around `<` `>`"
IMAGE_NBR_LIMIT = 10
DEFAULT_UPLOAD_SIZE_LIMIT = 209715200
async def send_message(
message: discord.Message,
files,
tmp_dir: str,
muted: bool,
title: str,
art_author: str,
):
to_send_files = []
for file in files:
joined = os.path.join(tmp_dir, file)
to_send_files.append(discord.File(joined, file))
upload_size_limit = (
message.guild.filesize_limit
if message.guild is not None
else DEFAULT_UPLOAD_SIZE_LIMIT
)
first = True
while len(to_send_files) > 0:
nbr_file_to_send = get_max_files_number(to_send_files, upload_size_limit)
splited_file = to_send_files[:nbr_file_to_send]
to_send_files = to_send_files[nbr_file_to_send:]
if first and nbr_file_to_send <= 0:
return
elif nbr_file_to_send <= 0:
# Next file is to big to be sent, skip it
to_send_files = to_send_files[1:]
elif first:
await message.reply(
files=splited_file,
content=f"**{title}** by `{art_author}` {chr(10) + TIPS_MESSAGE if not muted else ''}",
)
first = False
else:
await message.channel.send(files=splited_file) # type: ignore
async def send_command_reply(
interaction: discord.Interaction,
files,
tmp_dir: str,
muted: bool,
title: str,
art_author: str,
url: str,
author: discord.User | discord.Member,
):
to_send_files = []
for file in files:
joined = os.path.join(tmp_dir, file)
to_send_files.append(discord.File(joined, file))
upload_size_limit = (
interaction.guild.filesize_limit
if interaction.guild is not None
else DEFAULT_UPLOAD_SIZE_LIMIT
)
first = True
while len(to_send_files) > 0:
nbr_file_to_send = get_max_files_number(to_send_files, upload_size_limit)
splited_file = to_send_files[:nbr_file_to_send]
to_send_files = to_send_files[nbr_file_to_send:]
if first and nbr_file_to_send <= 0:
await interaction.followup.send(
content=f"This image exceeds upload file size limit", ephemeral=True
)
elif nbr_file_to_send <= 0:
# Next file is to big to be sent, skip it
to_send_files = to_send_files[1:]
elif first:
await interaction.followup.send(
files=splited_file,
content=f"**{title}** by `{art_author}` - <{url}> - Submited by {author.mention} {chr(10) + TIPS_MESSAGE if not muted else ''}",
)
first = False
else:
await interaction.channel.send(files=splited_file) # type: ignore
def get_max_files_number(files: List[discord.File], size_limit: int):
size = 0
nbr = 0
for file in files:
size = size + os.path.getsize(file.fp.name) # type: ignore
nbr = nbr + 1
if nbr >= IMAGE_NBR_LIMIT and size < size_limit:
return IMAGE_NBR_LIMIT
elif size > size_limit:
# We exceeds size limit, remove one image
if nbr >= IMAGE_NBR_LIMIT:
return IMAGE_NBR_LIMIT - 1
else:
return nbr - 1
# We didn't reach any limit
return nbr

View File

@ -0,0 +1,25 @@
import re
from typing import Tuple, Union
import discord
link_regexp = r"(?P<muted1><)?(?P<url>https?://(?:www\.)?pixiv.net/(?:\w+/)?artworks/(?P<id>\d+))(?P<muted2>>)?"
def should_process(
message: discord.Message,
) -> Tuple[bool, bool, Union[re.Match, None]]:
if match := re.search(link_regexp, message.content):
muted = bool(match.group("muted1")) and bool(match.group("muted2"))
if len(message.attachments) == 0:
return (True, muted, match)
else:
return (False, False, match)
return (False, False, None)
def check_pixiv_url(url: str):
if match := re.search(link_regexp, url):
return (True, match)
else:
return (False, None)

161
src/main.py Normal file
View File

@ -0,0 +1,161 @@
import asyncio
import logging
import os
from shlex import join
from tempfile import TemporaryDirectory
import discord
import discord_tools.message
import discord_tools.pixiv_link_extractor
import pixiv.pixiv_api as pixiv_api
logging.basicConfig(
format="[%(asctime)s] [%(levelname)8s] %(name)s: %(message)s", level=logging.INFO
)
REFRESH_TOKEN = os.getenv("PIXIV_REFRESH_TOKEN")
if REFRESH_TOKEN is None:
logging.fatal("Pixiv refresh token is missing, please set PIXIV_REFRESH_TOKEN")
exit(1)
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
if DISCORD_TOKEN is None:
logging.fatal("Discord token is missing, please set DISCORD_TOKEN")
exit(1)
intents = discord.Intents.default()
intents.message_content = True
class MyClient(discord.Client):
def __init__(self, *, intents: discord.Intents):
super().__init__(intents=intents)
self.tree = discord.app_commands.CommandTree(self)
async def setup_hook(self):
await self.tree.sync()
client = MyClient(intents=intents)
@client.event
async def on_ready():
logging.info(f"We have logged in as {client.user}")
@client.tree.command()
@discord.app_commands.describe(
url="Pixiv art url",
)
async def pixivprev(interaction: discord.Interaction, url: str):
"""Create pixiv preview"""
(result, match) = discord_tools.pixiv_link_extractor.check_pixiv_url(url)
if result and match is not None:
await interaction.response.defer()
with TemporaryDirectory() as tmp_dir:
loop = asyncio.get_running_loop()
data = await loop.run_in_executor(
None,
pixiv_api.download_pixiv_images,
int(match.group("id")),
tmp_dir,
REFRESH_TOKEN,
)
if data is None:
await interaction.response.send_message(
"Fail to extract pixiv image", ephemeral=True
)
return
(title, author) = data
files = os.listdir(tmp_dir)
files.sort()
await discord_tools.message.send_command_reply(
interaction,
files,
tmp_dir,
True,
title=title,
art_author=author,
url=url,
author=interaction.user,
)
else:
await interaction.response.send_message("Invalid pixiv url", ephemeral=True)
@client.tree.context_menu(name="Create pixiv preview")
async def pixiv_preview(interaction: discord.Interaction, message: discord.Message):
(result, muted, match) = discord_tools.pixiv_link_extractor.should_process(message)
if result and match is not None:
await interaction.response.defer()
with TemporaryDirectory() as tmp_dir:
loop = asyncio.get_running_loop()
data = await loop.run_in_executor(
None,
pixiv_api.download_pixiv_images,
int(match.group("id")),
tmp_dir,
REFRESH_TOKEN,
)
if data is None:
await interaction.response.send_message(
"Fail to extract pixiv image", ephemeral=True
)
return
files = os.listdir(tmp_dir)
files.sort()
(title, author) = data
await discord_tools.message.send_command_reply(
interaction=interaction,
files=files,
tmp_dir=tmp_dir,
muted=muted,
title=title,
art_author=author,
url=match.group("url"),
author=message.author,
)
else:
await interaction.response.send_message(
"Can't find any valid pixiv link.", ephemeral=True
)
@client.event
async def on_guild_join(guild: discord.Guild):
logging.info(f"Joined new guild: {guild.name}")
@client.event
async def on_message(message: discord.Message):
if message.author == client.user:
return
(result, muted, match) = discord_tools.pixiv_link_extractor.should_process(message)
if result and match is not None:
with TemporaryDirectory() as tmp_dir:
async with message.channel.typing():
loop = asyncio.get_running_loop()
data = await loop.run_in_executor(
None,
pixiv_api.download_pixiv_images,
int(match.group("id")),
tmp_dir,
REFRESH_TOKEN,
)
if data is None:
return
(title, author) = data
files = os.listdir(tmp_dir)
files.sort()
# await send_message.send_message_with_embed(
# message, files, title, tmp_dir, match.group("url")
# )
await discord_tools.message.send_message(
message, files, tmp_dir, muted, title, author
)
client.run(DISCORD_TOKEN)

0
src/pixiv/__init__.py Normal file
View File

80
src/pixiv/pixiv_api.py Normal file
View File

@ -0,0 +1,80 @@
import logging
import os
import threading
from queue import Queue
from threading import Thread
from typing import List, Tuple, Union
import pixivpy3
cpu_count = os.cpu_count()
max_thread_num = cpu_count * 2 if cpu_count is not None else 4
if max_thread_num > 10:
max_thread_num = 10
def download_pixiv_images(
illust_id: int,
dest_folder: str,
refresh_token: str,
):
api = pixivpy3.AppPixivAPI()
api.auth(refresh_token=refresh_token)
# get origin url
json_result = api.illust_detail(illust_id)
illust = json_result.illust
if not illust["visible"]:
logging.info("Can't be viewed, return None")
return None
pages = illust["meta_pages"]
if len(pages) > 0:
logging.info(f"Dowloading mutiple images to {dest_folder} ({len(pages)})")
if max_thread_num > len(pages):
num_threads = len(pages)
else:
num_threads = max_thread_num
logging.info(f"Starting {num_threads} thread(s)")
workers: List[Thread] = []
q: Queue[Union[Tuple[str, str, pixivpy3.AppPixivAPI], None]] = Queue()
for i in range(num_threads):
worker = Thread(target=download_thread, args=(q,))
worker.setDaemon(True)
worker.start()
workers.append(worker)
for page in pages:
url = page["image_urls"]["original"]
q.put((url, dest_folder, api))
q.join()
# Send end signal to all threads
for i in range(num_threads):
q.put(None)
# Wait for them to finish
for worker in workers:
worker.join()
else:
logging.info(f"Dowloading single image to {dest_folder}")
api.download(
url=illust["meta_single_page"]["original_image_url"], path=dest_folder
)
logging.info("Download finished !")
return (illust["title"], f"{illust['user']['name']} ({illust['user']['account']})")
def download_thread(q: Queue[Union[Tuple[str, str, pixivpy3.AppPixivAPI], None]]):
thread_name = threading.currentThread().getName()
while True:
data = q.get()
if data is None:
logging.debug(f"[{thread_name}] - Bye bye")
q.task_done()
break
(url, dest_folder, api) = data
logging.debug(f"[{thread_name}] - Downloading {url}...")
api.download(url=url, path=dest_folder)
print(f"[{thread_name}] - ... Done")
q.task_done()