mirror of
https://github.com/marvinscham/marvinscham.git
synced 2026-02-05 18:33:13 +01:00
Compare commits
209 Commits
b0dda21306
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d069a6b42e | ||
|
|
85483f09d3 | ||
|
|
7678e43dd2 | ||
|
|
e0502ed0c0 | ||
|
|
5d199d7e49 | ||
|
|
21c51ca1cd | ||
|
|
1f3d598aeb | ||
|
|
e667618aa4 | ||
|
|
4b7187a19a | ||
|
|
4684260066 | ||
|
|
fbc4aee8ac | ||
|
|
155095b35e | ||
|
|
fdeac72d68 | ||
|
|
6e2530a38a | ||
|
|
f4cd22ac0c | ||
|
|
fe1d9ee1fc | ||
|
|
464a6b2e71 | ||
|
|
c431640cd1 | ||
|
|
18daec6404 | ||
|
|
ebeca6e6b1 | ||
|
|
ad6a98800c | ||
|
|
d5f2606fc8 | ||
|
|
ec58bcb542 | ||
|
|
a679456936 | ||
|
|
adcba88590 | ||
|
|
e412a5367c | ||
|
|
c461784f94 | ||
|
|
e89f983169 | ||
|
|
7f89b4b3f3 | ||
|
|
1617d9746c | ||
|
|
6b4962f4fd | ||
|
|
9899061f6d | ||
|
|
3fe20dbbcf | ||
|
|
ff291d1958 | ||
|
|
e52e2601f7 | ||
|
|
033a383161 | ||
|
|
07a8b7c24b | ||
|
|
0690c56450 | ||
|
|
54634723c0 | ||
|
|
cc266cc264 | ||
|
|
367792f933 | ||
|
|
3b122aa476 | ||
|
|
3a061a6353 | ||
|
|
9d1690d8fe | ||
|
|
d25b8dc623 | ||
|
|
164e6789c1 | ||
|
|
c6b7d4c8ea | ||
|
|
598aae3685 | ||
|
|
de475b8600 | ||
|
|
535e4840c0 | ||
|
|
11403f6881 | ||
|
|
84cd04bbe1 | ||
|
|
71d43f0eb5 | ||
|
|
9516fadcad | ||
|
|
158e4e4743 | ||
|
|
71b3060595 | ||
|
|
b7a6dc646c | ||
|
|
eebfe11abf | ||
|
|
e72fad8601 | ||
|
|
4209971b62 | ||
|
|
58f09b2f78 | ||
|
|
3f67b810d9 | ||
|
|
9700c6754e | ||
|
|
d586cb943f | ||
|
|
76b7e14894 | ||
|
|
f84f97cae9 | ||
|
|
e02f6212e3 | ||
|
|
8c17eed374 | ||
|
|
0220133666 | ||
|
|
aea52ec616 | ||
|
|
6745b6f42b | ||
|
|
bc4e2957f0 | ||
|
|
c76273a5f8 | ||
|
|
3ac5cf6d3d | ||
|
|
139eff58d8 | ||
|
|
fb5ad0edb9 | ||
|
|
e9e6254603 | ||
|
|
ab9c00a7e9 | ||
|
|
82a99c5606 | ||
|
|
78c5acee7f | ||
|
|
a438f9864b | ||
|
|
079899a3ea | ||
|
|
7ed502acac | ||
|
|
97acaa7baf | ||
|
|
7543dcb7e9 | ||
|
|
e319b49d72 | ||
|
|
a148b3bbb3 | ||
|
|
5d80445ae2 | ||
|
|
35e347a2b0 | ||
|
|
a9e503968b | ||
|
|
80abff33f5 | ||
|
|
63f75aa0d3 | ||
|
|
3f1da97d38 | ||
|
|
49ca67e2b8 | ||
|
|
f80e719e9d | ||
|
|
1af0a8633f | ||
|
|
ea6d38708c | ||
|
|
7f40b7d599 | ||
|
|
2cd070959c | ||
|
|
7186ab1772 | ||
|
|
edc30c55a0 | ||
|
|
5156b5dd50 | ||
|
|
e462166183 | ||
|
|
6a9df37c05 | ||
|
|
b79ffd2a77 | ||
|
|
9ef5f5d25b | ||
|
|
fd003cc8a8 | ||
|
|
426daa80b3 | ||
|
|
22a045fd17 | ||
|
|
8877780066 | ||
|
|
31e9a66a71 | ||
|
|
b5cbd8bac8 | ||
|
|
42b9ba8b1b | ||
|
|
d0c666cc33 | ||
|
|
4a107ae997 | ||
|
|
ea9f2b5f78 | ||
|
|
9f390b4bc2 | ||
|
|
637ee5bae6 | ||
|
|
55d4806620 | ||
|
|
22376bc4c5 | ||
|
|
0c852b2a2f | ||
|
|
b8cb569755 | ||
|
|
47dffcd4f1 | ||
|
|
989179d856 | ||
|
|
82a25260d3 | ||
|
|
9327da9695 | ||
|
|
8d8fc0c47f | ||
|
|
7611da5f0e | ||
|
|
6faa2376e1 | ||
|
|
35c265623a | ||
|
|
ab4fb613fb | ||
|
|
50c6e079d2 | ||
|
|
001ef26305 | ||
|
|
9d3bf8623a | ||
|
|
3c75812a24 | ||
|
|
0552eb08f0 | ||
|
|
c1fc9cd9bc | ||
|
|
c7de215758 | ||
|
|
4d9064654b | ||
|
|
cfceb12664 | ||
|
|
0c51ce9353 | ||
|
|
e4d3c754bb | ||
|
|
e2947e069c | ||
|
|
644eebb8ac | ||
|
|
47cd265737 | ||
|
|
90e0d85c95 | ||
|
|
eb42340266 | ||
|
|
6484be297e | ||
|
|
86822b79d6 | ||
|
|
ff922ca95c | ||
|
929ffaadf7
|
|||
|
|
912c0f1d64 | ||
|
|
f3af5f3674 | ||
|
|
8f77e43dd9 | ||
|
|
67f1c9fccd | ||
|
|
d7f35008da | ||
|
|
b07006cbbd | ||
|
|
ed5fba4851 | ||
|
|
a635bc9d98 | ||
|
|
57dde26ec6 | ||
|
|
0f0ee6cea9 | ||
|
|
59a69cefa6 | ||
|
|
1ae47c3a6b | ||
|
|
5a9093955c | ||
|
|
0d91434c8e | ||
|
|
76195b1a86 | ||
|
|
31cd1f4b80 | ||
|
|
0e5ed811a6 | ||
|
|
47e3f65a07 | ||
|
|
b00b19f957 | ||
|
|
94bc4faca4 | ||
|
|
74825a0131 | ||
|
|
8262541e06 | ||
|
|
a936388eec | ||
|
|
d13d4ecb3f | ||
|
|
f6fab82932 | ||
|
|
c05bbbc50c | ||
|
|
e620cd63bf | ||
|
|
ee8092232c | ||
|
|
9e08ec6971 | ||
|
|
e25e3f0373 | ||
|
|
a8f4b8a567 | ||
|
|
e791b3cffb | ||
|
|
bf6b6f87ce | ||
|
|
9c5ac4c080 | ||
|
|
e8c4f32b66 | ||
|
|
3de6d1edcf | ||
|
|
0640290c32 | ||
|
|
53da3d1b88 | ||
|
|
843f48ea58 | ||
|
|
71b5cecacf | ||
|
|
94b0082121 | ||
|
|
b71145b201 | ||
|
|
f34ab23769 | ||
|
|
b76f25b0b1 | ||
|
|
5b32c3cdd0 | ||
|
|
b4ab4cfb52 | ||
|
|
c254c71e5c | ||
|
|
33cf3e5d04 | ||
|
|
99fbc15e3b | ||
|
|
13ae9dc920 | ||
|
|
45eaf40ff6 | ||
|
|
caa895f639 | ||
|
|
abc31fcb67 | ||
|
|
e5c83eaa14 | ||
|
|
6e4a21b87e | ||
|
|
0184c608ec | ||
|
|
53bd91c85f | ||
|
42a2d0e4a5
|
9
.github/dependabot.yml
vendored
Normal file
9
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "chore"
|
||||
include: "scope"
|
||||
4
.github/workflows/metrics.yml
vendored
4
.github/workflows/metrics.yml
vendored
@@ -8,10 +8,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.12'
|
||||
|
||||
|
||||
81
README.md
81
README.md
@@ -1,35 +1,43 @@
|
||||
<h1 align="center" style="text-align:center;">Welcome! <img height="28" style="height:1em;display:inline-block;" src="https://raw.githubusercontent.com/marvinscham/marvinscham/main/resources/wave.gif"></h1>
|
||||
<p align="center" style="text-align:center;">I'm Marvin – M.Sc. student, fullstack developer and creator of <a href="https://masterychart.com">Mastery Chart</a>.<br>Located in Baden-Württemberg, Germany <img height="16" style="height:1em;display:inline-block;" src="https://marvinscham.de/assets/img/lang/de.png">.</p>
|
||||
<p align="center" style="text-align:center;">I'm Marvin – Software engineer and creator of <a href="https://masterychart.com">Mastery Chart</a>.<br>Located in Baden-Württemberg, Germany <img height="16" style="height:1em;display:inline-block;" src="https://marvinscham.de/assets/img/lang/de.png">.</p>
|
||||
|
||||
|
||||
<h2>🛠 Tools I use</h2>
|
||||
<h2>🛠 Things I use</h2>
|
||||
<p>
|
||||
<img alt="Linux Mint" style="display:inline-block;" src="https://img.shields.io/badge/-Linux_Mint-86BE43?style=flat-square&logo=linuxmint&logoColor=white" />
|
||||
<img alt="Gitea" style="display:inline-block;" src="https://img.shields.io/badge/-Gitea-609926?style=flat-square&logo=gitea&logoColor=white" />
|
||||
<img alt="Bash" style="display:inline-block;" src="https://img.shields.io/badge/-Bash-4EAA25?style=flat-square&logo=gnubash&logoColor=white" />
|
||||
<img alt="Paperless" style="display:inline-block;" src="https://img.shields.io/badge/-Paperless-17541F?style=flat-square&logo=paperlessngx&logoColor=white" />
|
||||
<img alt="nginx" style="display:inline-block;" src="https://img.shields.io/badge/-nginx-009639?style=flat-square&logo=nginx&logoColor=white" />
|
||||
<img alt="Calibre--Web" style="display:inline-block;" src="https://img.shields.io/badge/-Calibre--Web-45B29D?style=flat-square&logo=calibreweb&logoColor=white" />
|
||||
<img alt="LaTeX" style="display:inline-block;" src="https://img.shields.io/badge/-LaTeX-008080?style=flat-square&logo=latex&logoColor=white" />
|
||||
<img alt="Traefik" style="display:inline-block;" src="https://img.shields.io/badge/-Traefik-24A1C1?style=flat-square&logo=traefikproxy&logoColor=white" />
|
||||
<img alt="Nextcloud" style="display:inline-block;" src="https://img.shields.io/badge/-Nextcloud-0082C9?style=flat-square&logo=nextcloud&logoColor=white" />
|
||||
<img alt="C%2b%2b" style="display:inline-block;" src="https://img.shields.io/badge/-C%2b%2b-00599C?style=flat-square&logo=cplusplus&logoColor=white" />
|
||||
<img alt="Docker" style="display:inline-block;" src="https://img.shields.io/badge/-Docker-2496ED?style=flat-square&logo=Docker&logoColor=white" />
|
||||
<img alt="Python" style="display:inline-block;" src="https://img.shields.io/badge/-Python-3776AB?style=flat-square&logo=python&logoColor=white" />
|
||||
<img alt="SonarQube" style="display:inline-block;" src="https://img.shields.io/badge/-SonarQube-126ED3?style=flat-square&logo=sonarqubeserver&logoColor=white" />
|
||||
<img alt="Adminer" style="display:inline-block;" src="https://img.shields.io/badge/-Adminer-34567C?style=flat-square&logo=adminer&logoColor=white" />
|
||||
<img alt="MariaDB" style="display:inline-block;" src="https://img.shields.io/badge/-MariaDB-1F305F?style=flat-square&logo=mariadb&logoColor=white" />
|
||||
<img alt="Immich" style="display:inline-block;" src="https://img.shields.io/badge/-Immich-4250AF?style=flat-square&logo=immich&logoColor=white" />
|
||||
<img alt="PHP" style="display:inline-block;" src="https://img.shields.io/badge/-PHP-777BB4?style=flat-square&logo=php&logoColor=white" />
|
||||
<img alt="Plausible" style="display:inline-block;" src="https://img.shields.io/badge/-Plausible-5850EC?style=flat-square&logo=plausibleanalytics&logoColor=white" />
|
||||
<img alt="Obsidian" style="display:inline-block;" src="https://img.shields.io/badge/-Obsidian-7C3AED?style=flat-square&logo=obsidian&logoColor=white" />
|
||||
<img alt="CSS" style="display:inline-block;" src="https://img.shields.io/badge/-CSS-663399?style=flat-square&logo=css&logoColor=white" />
|
||||
<img alt="Sass" style="display:inline-block;" src="https://img.shields.io/badge/-Sass-CC6699?style=flat-square&logo=sass&logoColor=white" />
|
||||
<img alt="n8n" style="display:inline-block;" src="https://img.shields.io/badge/-n8n-EA4B71?style=flat-square&logo=n8n&logoColor=white" />
|
||||
<img alt="Chart.js" style="display:inline-block;" src="https://img.shields.io/badge/-Chart.js-FF6384?style=flat-square&logo=chartdotjs&logoColor=white" />
|
||||
<img alt="Riot API" style="display:inline-block;" src="https://img.shields.io/badge/-Riot_API-EB0029?style=flat-square&logo=riotgames&logoColor=white" />
|
||||
<img alt="WireGuard" style="display:inline-block;" src="https://img.shields.io/badge/-WireGuard-88171A?style=flat-square&logo=wireguard&logoColor=white" />
|
||||
<img alt="uBlock" style="display:inline-block;" src="https://img.shields.io/badge/-uBlock-800000?style=flat-square&logo=ublockorigin&logoColor=white" />
|
||||
<img alt="Redis" style="display:inline-block;" src="https://img.shields.io/badge/-Redis-FF4438?style=flat-square&logo=redis&logoColor=white" />
|
||||
<img alt="Authentik" style="display:inline-block;" src="https://img.shields.io/badge/-Authentik-FD4B2D?style=flat-square&logo=authentik&logoColor=white" />
|
||||
<img alt="Git" style="display:inline-block;" src="https://img.shields.io/badge/-Git-F05032?style=flat-square&logo=git&logoColor=white" />
|
||||
<img alt="Cloudflare" style="display:inline-block;" src="https://img.shields.io/badge/-Cloudflare-F38020?style=flat-square&logo=cloudflare&logoColor=white" />
|
||||
<img alt="D3.js" style="display:inline-block;" src="https://img.shields.io/badge/-D3.js-F9A03C?style=flat-square&logo=d3&logoColor=white" />
|
||||
<img alt="JavaScript" style="display:inline-block;" src="https://img.shields.io/badge/-JavaScript-F7DF1E?style=flat-square&logo=javascript&logoColor=white" />
|
||||
<img alt="Gitea" style="display:inline-block;" src="https://img.shields.io/badge/-Gitea-609926?style=flat-square&logo=gitea&logoColor=white" />
|
||||
<img alt="Bash" style="display:inline-block;" src="https://img.shields.io/badge/-Bash-4EAA25?style=flat-square&logo=gnubash&logoColor=white" />
|
||||
<img alt="Paperless" style="display:inline-block;" src="https://img.shields.io/badge/-Paperless-17541F?style=flat-square&logo=paperlessngx&logoColor=white" />
|
||||
<img alt="nginx" style="display:inline-block;" src="https://img.shields.io/badge/-nginx-009639?style=flat-square&logo=nginx&logoColor=white" />
|
||||
<img alt="LaTeX" style="display:inline-block;" src="https://img.shields.io/badge/-LaTeX-008080?style=flat-square&logo=latex&logoColor=white" />
|
||||
<img alt="Tailwind" style="display:inline-block;" src="https://img.shields.io/badge/-Tailwind-06B6D4?style=flat-square&logo=tailwindcss&logoColor=white" />
|
||||
<img alt="SonarQube" style="display:inline-block;" src="https://img.shields.io/badge/-SonarQube-4E9BCD?style=flat-square&logo=sonarqube&logoColor=white" />
|
||||
<img alt="Docker" style="display:inline-block;" src="https://img.shields.io/badge/-Docker-2496ED?style=flat-square&logo=Docker&logoColor=white" />
|
||||
<img alt="Python" style="display:inline-block;" src="https://img.shields.io/badge/-Python-3776AB?style=flat-square&logo=python&logoColor=white" />
|
||||
<img alt="MariaDB" style="display:inline-block;" src="https://img.shields.io/badge/-MariaDB-1F305F?style=flat-square&logo=mariadb&logoColor=white" />
|
||||
<img alt="Immich" style="display:inline-block;" src="https://img.shields.io/badge/-Immich-4250AF?style=flat-square&logo=immich&logoColor=white" />
|
||||
<img alt="Markdown" style="display:inline-block;" src="https://img.shields.io/badge/-Markdown-000000?style=flat-square&logo=markdown&logoColor=white" />
|
||||
<img alt="Django" style="display:inline-block;" src="https://img.shields.io/badge/-Django-092E20?style=flat-square&logo=django&logoColor=white" />
|
||||
<img alt="Ghost" style="display:inline-block;" src="https://img.shields.io/badge/-Ghost-15171A?style=flat-square&logo=ghost&logoColor=white" />
|
||||
<img alt="Markdown" style="display:inline-block;" src="https://img.shields.io/badge/-Markdown-000000?style=flat-square&logo=markdown&logoColor=white" />
|
||||
<img alt="Vaultwarden" style="display:inline-block;" src="https://img.shields.io/badge/-Vaultwarden-000000?style=flat-square&logo=vaultwarden&logoColor=white" />
|
||||
</p>
|
||||
|
||||
<h2>🎁 Open source</h2>
|
||||
@@ -55,42 +63,31 @@
|
||||
<td><img alt="Last Commit" src="https://img.shields.io/github/last-commit/marvinscham/bibtex-oss?style=flat-square&labelColor=343b41"/></td>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
<h2>📊 30-day breakdown</h2>
|
||||
<h2>📊 30-day coding activity</h2>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
winterhalter-hmi 21:39 █████████████████████████████----------- 74%
|
||||
wiha-tool 5:44 ███████--------------------------------- 19%
|
||||
rso-auth 0:51 █--------------------------------------- 2%
|
||||
pdf-annotation-ripper 0:22 ---------------------------------------- 1%
|
||||
Lang hh:mm
|
||||
Python 15:24 █████████████--------------------------- 33%
|
||||
C++ 12:28 ██████████------------------------------ 27%
|
||||
PHP 4:10 ███------------------------------------- 9%
|
||||
YAML 4:06 ███------------------------------------- 9%
|
||||
Markdown 2:19 ██-------------------------------------- 5%
|
||||
Bash 1:33 █--------------------------------------- 3%
|
||||
</pre>
|
||||
|
||||
<pre>
|
||||
C++ 16:27 ██████████████████████------------------ 56%
|
||||
Python 4:28 ██████---------------------------------- 15%
|
||||
Bash 1:34 ██-------------------------------------- 5%
|
||||
Json 1:16 █--------------------------------------- 4%
|
||||
Docker 1:15 █--------------------------------------- 4%
|
||||
Prolog 0:54 █--------------------------------------- 3%
|
||||
</pre>
|
||||
|
||||
<h2>📓 Latest blog posts</h2>
|
||||
<ul>
|
||||
<li><a href="https://blog.marvinscham.de/css-color-filtering-svg/">CSS: Color Filtering SVG images</a></li>
|
||||
<li><a href="https://blog.marvinscham.de/splitting-midi/">Splitting MIDI Controller Input</a></li>
|
||||
<li><a href="https://blog.marvinscham.de/dkim-strato-cloudflare/">(DE) DKIM mit Strato SMTP und Cloudflare DNS</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>👥 Social</h2>
|
||||
|
||||
<p align="center" style="text-align:center;"><a href="https://marvinscham.de" style="display:inline-block;" target="_blank"><img alt="Homepage" src="https://img.shields.io/badge/Homepage-%230d254c.svg?&style=for-the-badge&logo=googlechrome&logoColor=white" /></a>
|
||||
<a href="https://github.vom/marvinscham" style="display:inline-block;" target="_blank"><img alt="GitHub" src="https://img.shields.io/badge/GitHub-%23181717.svg?&style=for-the-badge&logo=github&logoColor=white" /></a>
|
||||
<a href="https://www.linkedin.com/in/marvin-scham-58576216b/" style="display:inline-block;" target="_blank"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-%230A66C2.svg?&style=for-the-badge&logo=linkedin&logoColor=white" /></a>
|
||||
<a href="https://duolingo.com/profile/marvinscham" style="display:inline-block;" target="_blank"><img alt="Duolingo" src="https://img.shields.io/badge/Duolingo-%2358CC02.svg?&style=for-the-badge&logo=duolingo&logoColor=white" /></a>
|
||||
<p align="center" style="text-align:center;"><a href="https://marvinscham.de" style="display:inline-block;" target="_blank"><img alt="Homepage" src="https://img.shields.io/badge/Homepage-%230d254c.svg?&style=for-the-badge&logo=&logoColor=white" /></a>
|
||||
<a href="https://github.vom/marvinscham" style="display:inline-block;" target="_blank"><img alt="GitHub" src="https://img.shields.io/badge/GitHub-%23181717.svg?&style=for-the-badge&logo=&logoColor=white" /></a>
|
||||
<a href="https://www.linkedin.com/in/marvin-scham-58576216b/" style="display:inline-block;" target="_blank"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-%230A66C2.svg?&style=for-the-badge&logo=&logoColor=white" /></a>
|
||||
<a href="https://duolingo.com/profile/marvinscham" style="display:inline-block;" target="_blank"><img alt="Duolingo" src="https://img.shields.io/badge/Duolingo-%2358CC02.svg?&style=for-the-badge&logo=&logoColor=white" /></a>
|
||||
|
||||
</p>
|
||||
|
||||
<hr>
|
||||
|
||||
<p align="center" style="text-align:center;">Last update: Saturday, 16 August 06:29 CEST</p>
|
||||
<p align="center" style="text-align:center;">Last update: Monday, 24 November 05:36 CET</p>
|
||||
<p align="center" style="text-align:center;"><a href="https://github.com/marvinscham/marvinscham/actions/workflows/metrics.yml"><img src="https://github.com/marvinscham/marvinscham/actions/workflows/metrics.yml/badge.svg" alt="Update README" style="display:inline-block;"></a> <img alt="made with ♥" style="display:inline-block;" src="https://img.shields.io/badge/made_with-%E2%99%A5-663399?style=flat&labelColor=%23343B41"></p>
|
||||
@@ -2,20 +2,20 @@
|
||||
import base64
|
||||
import datetime
|
||||
import json
|
||||
from dotenv import load_dotenv
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
import matplotlib.colors as mcolors
|
||||
import os
|
||||
|
||||
import matplotlib.colors as mcolors
|
||||
import pytz
|
||||
import requests
|
||||
from dotenv import load_dotenv
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
load_dotenv()
|
||||
|
||||
# Constants for the progress bar
|
||||
MAX_BAR_LENGTH = 40
|
||||
BAR_CHAR = '█'
|
||||
EMPTY_BAR_CHAR = '-'
|
||||
BAR_CHAR = "█"
|
||||
EMPTY_BAR_CHAR = "-"
|
||||
|
||||
|
||||
def hex_to_rgb(hex_color):
|
||||
@@ -25,7 +25,7 @@ def hex_to_rgb(hex_color):
|
||||
|
||||
def shift_hue(obj, hue_shift):
|
||||
# Shift hue to determine rainbow start
|
||||
hue = mcolors.rgb_to_hsv(hex_to_rgb(obj['color']))[0] + hue_shift
|
||||
hue = mcolors.rgb_to_hsv(hex_to_rgb(obj["color"]))[0] + hue_shift
|
||||
if hue > 1:
|
||||
hue -= 1.0
|
||||
return hue
|
||||
@@ -33,7 +33,7 @@ def shift_hue(obj, hue_shift):
|
||||
|
||||
def calc_darkness_bias(obj, threshold):
|
||||
# Threshold 1: No bias
|
||||
brightness = mcolors.rgb_to_hsv(hex_to_rgb(obj['color']))[2]
|
||||
brightness = mcolors.rgb_to_hsv(hex_to_rgb(obj["color"]))[2]
|
||||
if brightness < threshold:
|
||||
return 2 - brightness
|
||||
else:
|
||||
@@ -41,27 +41,20 @@ def calc_darkness_bias(obj, threshold):
|
||||
|
||||
|
||||
def seconds_to_string(seconds):
|
||||
days = seconds // 86400
|
||||
remaining_seconds = seconds % 86400
|
||||
hours = remaining_seconds // 3600
|
||||
remaining_minutes = (remaining_seconds % 3600) // 60
|
||||
hours = seconds // 3600
|
||||
remaining_minutes = (seconds % 3600) // 60
|
||||
|
||||
time_string = ""
|
||||
if days > 0:
|
||||
time_string += f"{days}:{hours:02}"
|
||||
else:
|
||||
time_string += f"{hours}"
|
||||
time_string = f"{hours}"
|
||||
time_string += f":{remaining_minutes:02}"
|
||||
|
||||
return time_string
|
||||
|
||||
|
||||
resource_dir = os.path.join(os.path.dirname(
|
||||
os.path.abspath(__file__)), "resources")
|
||||
resource_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "resources")
|
||||
env = Environment(loader=FileSystemLoader(resource_dir))
|
||||
|
||||
# Load template
|
||||
template = env.get_template('README.md.jinja')
|
||||
template = env.get_template("README.md.jinja")
|
||||
|
||||
# Load metadata files
|
||||
with open(os.path.join(resource_dir, "technologies.json")) as f:
|
||||
@@ -72,20 +65,22 @@ with open(os.path.join(resource_dir, "socials.json")) as f:
|
||||
socials = json.load(f)
|
||||
|
||||
# Sort to build rainbow
|
||||
hue_shift = 0.35
|
||||
hue_shift = 0.8
|
||||
darkness_bias = 0.2
|
||||
|
||||
technologies = sorted(
|
||||
technologies,
|
||||
key=lambda obj: shift_hue(obj, hue_shift) +
|
||||
calc_darkness_bias(obj, darkness_bias)
|
||||
key=lambda obj: shift_hue(obj, hue_shift) + calc_darkness_bias(obj, darkness_bias),
|
||||
)
|
||||
|
||||
blog_entries = {}
|
||||
try:
|
||||
ghost_base_url = os.getenv("GHOST_URL").rstrip("/")
|
||||
ghost_api_key = os.getenv("GHOST_API_KEY")
|
||||
response = requests.get(
|
||||
f"{os.getenv("GHOST_URL")}/ghost/api/content/posts/?key={os.getenv("GHOST_KEY")}")
|
||||
blog_entries = response.json()['posts'][:3]
|
||||
f"{ghost_base_url}/ghost/api/content/posts/?key={ghost_api_key}"
|
||||
)
|
||||
blog_entries = response.json()["posts"][:3]
|
||||
except Exception as e:
|
||||
print(e)
|
||||
pass
|
||||
@@ -93,11 +88,13 @@ except Exception as e:
|
||||
waka_projects = ""
|
||||
waka_langs = ""
|
||||
try:
|
||||
waka_token = base64.b64encode(
|
||||
os.getenv("WAKAPI_KEY").encode("ascii")).decode("ascii")
|
||||
waka_token = base64.b64encode(os.getenv("WAKAPI_KEY").encode("ascii")).decode(
|
||||
"ascii"
|
||||
)
|
||||
wakapi_base_url = os.getenv("WAKAPI_URL").rstrip("/")
|
||||
response = requests.get(
|
||||
f"{os.getenv("WAKAPI_URL")}/api/summary?interval=30_days",
|
||||
headers={'Authorization': f"Basic {waka_token}"}
|
||||
f"{wakapi_base_url}/api/summary?interval=30_days",
|
||||
headers={"Authorization": f"Basic {waka_token}"},
|
||||
)
|
||||
waka_info = response.json()
|
||||
|
||||
@@ -106,41 +103,49 @@ try:
|
||||
project_list = waka_info["projects"][:4]
|
||||
lang_list = waka_info["languages"][:6]
|
||||
|
||||
max_name_len = max(len(entry["key"]) for entry in project_list)
|
||||
# max_name_len = max(len(entry["key"]) for entry in project_list)
|
||||
max_lang_len = max(len(entry["key"]) for entry in lang_list)
|
||||
max_key_len = max(max_name_len, max_lang_len)
|
||||
# max_key_len = max(max_name_len, max_lang_len)
|
||||
max_key_len = max_lang_len
|
||||
|
||||
max_proj_time_len = max(len(seconds_to_string(
|
||||
entry["total"])) for entry in project_list)
|
||||
# max_proj_time_len = max(
|
||||
# len(seconds_to_string(entry["total"])) for entry in project_list
|
||||
# )
|
||||
max_lang_time_len = max(
|
||||
len(seconds_to_string(entry["total"])) for entry in lang_list)
|
||||
max_total_len = max(max_proj_time_len, max_lang_time_len)
|
||||
len(seconds_to_string(entry["total"])) for entry in lang_list
|
||||
)
|
||||
# max_total_len = max(max_proj_time_len, max_lang_time_len)
|
||||
max_total_len = max_lang_time_len
|
||||
|
||||
waka_projects += "<pre>\n"
|
||||
for project in project_list:
|
||||
filled_length = int(
|
||||
(project["total"] / total_duration) * MAX_BAR_LENGTH)
|
||||
progress_bar = BAR_CHAR * filled_length + \
|
||||
EMPTY_BAR_CHAR * (MAX_BAR_LENGTH - filled_length)
|
||||
percentage_str = str(
|
||||
int((project["total"] / total_duration * 100))) + "%"
|
||||
# waka_projects += "<pre>\n"
|
||||
# for project in project_list:
|
||||
# filled_length = int(
|
||||
# (project["total"] / total_duration) * MAX_BAR_LENGTH)
|
||||
# progress_bar = BAR_CHAR * filled_length + \
|
||||
# EMPTY_BAR_CHAR * (MAX_BAR_LENGTH - filled_length)
|
||||
# percentage_str = str(
|
||||
# int((project["total"] / total_duration * 100))) + "%"
|
||||
|
||||
waka_projects += f"{project['key']:<{max_key_len}} "
|
||||
waka_projects += f"{seconds_to_string(project["total"]):>{
|
||||
max_total_len}} "
|
||||
waka_projects += f"{progress_bar} "
|
||||
waka_projects += f"{percentage_str:>3}\n"
|
||||
waka_projects += "</pre>"
|
||||
# waka_projects += f"{project['key']:<{max_key_len}} "
|
||||
# waka_projects += f"{seconds_to_string(project["total"]):>{
|
||||
# max_total_len}} "
|
||||
# waka_projects += f"{progress_bar} "
|
||||
# waka_projects += f"{percentage_str:>3}\n"
|
||||
# waka_projects += "</pre>"
|
||||
|
||||
waka_langs += "<pre>\n"
|
||||
waka_langs += f"{'Lang':<{max_key_len}} "
|
||||
waka_langs += f"{'hh:mm':>{max_total_len}} \n"
|
||||
for lang in lang_list:
|
||||
filled_length = int((lang["total"] / total_duration) * MAX_BAR_LENGTH)
|
||||
progress_bar = BAR_CHAR * filled_length + \
|
||||
EMPTY_BAR_CHAR * (MAX_BAR_LENGTH - filled_length)
|
||||
progress_bar = BAR_CHAR * filled_length + EMPTY_BAR_CHAR * (
|
||||
MAX_BAR_LENGTH - filled_length
|
||||
)
|
||||
percentage_str = str(int((lang["total"] / total_duration * 100))) + "%"
|
||||
time_string = seconds_to_string(lang["total"])
|
||||
|
||||
waka_langs += f"{lang['key']:<{max_key_len}} "
|
||||
waka_langs += f"{seconds_to_string(lang["total"]):>{max_total_len}} "
|
||||
waka_langs += f"{time_string:>{max_total_len}} "
|
||||
waka_langs += f"{progress_bar} "
|
||||
waka_langs += f"{percentage_str:>3}\n"
|
||||
waka_langs += "</pre>"
|
||||
@@ -157,7 +162,10 @@ try:
|
||||
duolingo_stats = response.json()
|
||||
|
||||
for lang in duolingo_stats["lang_data"]:
|
||||
if duolingo_stats["lang_data"][lang]["learningLanguage"] == duolingo_stats["learning_language"]:
|
||||
if (
|
||||
duolingo_stats["lang_data"][lang]["learningLanguage"]
|
||||
== duolingo_stats["learning_language"]
|
||||
):
|
||||
current_lang = duolingo_stats["lang_data"][lang]["learningLanguageFull"]
|
||||
|
||||
duolingo_stats["current_lang"] = current_lang
|
||||
@@ -165,9 +173,9 @@ except Exception as e:
|
||||
print(e)
|
||||
pass
|
||||
|
||||
berlin_timezone = pytz.timezone('Europe/Berlin')
|
||||
berlin_timezone = pytz.timezone("Europe/Berlin")
|
||||
berlin_time = datetime.datetime.now(berlin_timezone)
|
||||
last_update = berlin_time.strftime('%A, %e %B %H:%M %Z')
|
||||
last_update = berlin_time.strftime("%A, %e %B %H:%M %Z")
|
||||
|
||||
# Variables to pass to the template
|
||||
data = {
|
||||
@@ -177,14 +185,14 @@ data = {
|
||||
"waka_stats": waka_stats,
|
||||
"duolingo_stats": duolingo_stats,
|
||||
"socials": socials,
|
||||
"last_update": last_update
|
||||
"last_update": last_update,
|
||||
}
|
||||
|
||||
# Render the template with data
|
||||
output = template.render(data)
|
||||
|
||||
# Write the output to README.md
|
||||
with open('README.md', 'w', encoding='utf-8') as f:
|
||||
with open("README.md", "w", encoding="utf-8") as f:
|
||||
f.write(output)
|
||||
|
||||
print("README.md generated successfully.")
|
||||
|
||||
5
resources/README.md
Normal file
5
resources/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Resources
|
||||
|
||||
## Logo source for shields.io icons
|
||||
|
||||
> https://simpleicons.org/
|
||||
@@ -1,8 +1,8 @@
|
||||
<h1 align="center" style="text-align:center;">Welcome! <img height="28" style="height:1em;display:inline-block;" src="https://raw.githubusercontent.com/marvinscham/marvinscham/main/resources/wave.gif"></h1>
|
||||
<p align="center" style="text-align:center;">I'm Marvin – M.Sc. student, fullstack developer and creator of <a href="https://masterychart.com">Mastery Chart</a>.<br>Located in Baden-Württemberg, Germany <img height="16" style="height:1em;display:inline-block;" src="https://marvinscham.de/assets/img/lang/de.png">.</p>
|
||||
<p align="center" style="text-align:center;">I'm Marvin – Software engineer and creator of <a href="https://masterychart.com">Mastery Chart</a>.<br>Located in Baden-Württemberg, Germany <img height="16" style="height:1em;display:inline-block;" src="https://marvinscham.de/assets/img/lang/de.png">.</p>
|
||||
{# Derived from https://github.com/thmsgbrt/thmsgbrt #}
|
||||
|
||||
<h2>🛠 Tools I use</h2>
|
||||
<h2>🛠 Things I use</h2>
|
||||
<p>
|
||||
{% for item in technologies -%}
|
||||
<img alt="{{ item['name'] }}" style="display:inline-block;" src="https://img.shields.io/badge/-{{ item["name"] | replace(" ", "_") }}-{{ item['color'] | replace("#", "") }}?style=flat-square&logo={{ item['logo'] or item['name'] | replace(" ", "_") }}&logoColor=white" />
|
||||
@@ -26,7 +26,7 @@
|
||||
</table>
|
||||
|
||||
{%- if waka_stats|length > 1 %}
|
||||
<h2>📊 30-day breakdown</h2>
|
||||
<h2>📊 30-day coding activity</h2>
|
||||
|
||||
{{ waka_stats }}
|
||||
{% endif %}
|
||||
|
||||
@@ -3,24 +3,24 @@
|
||||
"name": "Homepage",
|
||||
"url": "https://marvinscham.de",
|
||||
"color": "#0d254c",
|
||||
"logo": "googlechrome"
|
||||
"logo": ""
|
||||
},
|
||||
{
|
||||
"name": "GitHub",
|
||||
"url": "https://github.vom/marvinscham",
|
||||
"color": "#181717",
|
||||
"logo": "github"
|
||||
"logo": ""
|
||||
},
|
||||
{
|
||||
"name": "LinkedIn",
|
||||
"url": "https://www.linkedin.com/in/marvin-scham-58576216b/",
|
||||
"color": "#0A66C2",
|
||||
"logo": "linkedin"
|
||||
"logo": ""
|
||||
},
|
||||
{
|
||||
"name": "Duolingo",
|
||||
"url": "https://duolingo.com/profile/marvinscham",
|
||||
"color": "#58CC02",
|
||||
"logo": "duolingo"
|
||||
"logo": ""
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
[
|
||||
{ "name": "Adminer", "logo": "adminer", "color": "#34567C" },
|
||||
{ "name": "Authentik", "logo": "authentik", "color": "#FD4B2D" },
|
||||
{ "name": "Bash", "logo": "gnubash", "color": "#4EAA25" },
|
||||
{ "name": "Chart.js", "logo": "chartdotjs", "color": "#FF6384" },
|
||||
{ "name": "Calibre--Web", "logo": "calibreweb", "color": "#45B29D" },
|
||||
{ "name": "Cloudflare", "logo": "cloudflare", "color": "#F38020" },
|
||||
{ "name": "C%2b%2b", "logo": "cplusplus", "color": "#00599C" },
|
||||
{ "name": "CSS", "logo": "css", "color": "#663399" },
|
||||
{ "name": "D3.js", "logo": "d3", "color": "#F9A03C" },
|
||||
{ "name": "Django", "logo": "django", "color": "#092E20" },
|
||||
{ "name": "Docker", "logo": "Docker", "color": "#2496ED" },
|
||||
{ "name": "Ghost", "logo": "ghost", "color": "#15171A" },
|
||||
{ "name": "Git", "logo": "git", "color": "#F05032" },
|
||||
@@ -12,17 +14,23 @@
|
||||
{ "name": "Immich", "logo": "immich", "color": "#4250AF" },
|
||||
{ "name": "JavaScript", "logo": "javascript", "color": "#F7DF1E" },
|
||||
{ "name": "LaTeX", "logo": "latex", "color": "#008080" },
|
||||
{ "name": "Linux Mint", "logo": "linuxmint", "color": "#86BE43" },
|
||||
{ "name": "MariaDB", "logo": "mariadb", "color": "#1F305F" },
|
||||
{ "name": "Markdown", "logo": "markdown", "color": "#000000" },
|
||||
{ "name": "n8n", "logo": "n8n", "color": "#EA4B71" },
|
||||
{ "name": "Nextcloud", "logo": "nextcloud", "color": "#0082C9" },
|
||||
{ "name": "nginx", "logo": "nginx", "color": "#009639" },
|
||||
{ "name": "Obsidian", "logo": "obsidian", "color": "#7C3AED" },
|
||||
{ "name": "Paperless", "logo": "paperlessngx", "color": "#17541F" },
|
||||
{ "name": "PHP", "logo": "php", "color": "#777BB4" },
|
||||
{ "name": "Plausible", "logo": "plausibleanalytics", "color": "#5850EC" },
|
||||
{ "name": "Python", "logo": "python", "color": "#3776AB" },
|
||||
{ "name": "Redis", "logo": "redis", "color": "#FF4438" },
|
||||
{ "name": "Riot API", "logo": "riotgames", "color": "#EB0029" },
|
||||
{ "name": "SonarQube", "logo": "sonarqube", "color": "#4E9BCD" },
|
||||
{ "name": "Tailwind", "logo": "tailwindcss", "color": "#06B6D4" },
|
||||
{ "name": "Sass", "logo": "sass", "color": "#CC6699" },
|
||||
{ "name": "SonarQube", "logo": "sonarqubeserver", "color": "#126ED3" },
|
||||
{ "name": "Traefik", "logo": "traefikproxy", "color": "#24A1C1" },
|
||||
{ "name": "uBlock", "logo": "ublockorigin", "color": "#800000" },
|
||||
{ "name": "Vaultwarden", "logo": "vaultwarden", "color": "#000000" },
|
||||
{ "name": "WireGuard", "logo": "wireguard", "color": "#88171A" }
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user