Voeg .gitignore toe en verwijder .lh folder uit repository - .lh folder toegevoegd aan .gitignore (Local History van Cursor/VSCode) - Alle .lh bestanden verwijderd uit git repository - Standaard .gitignore items toegevoegd voor Python, IDE, OS bestanden

This commit is contained in:
filoor 2025-05-28 07:32:40 +02:00
parent ca06ebb93d
commit 95bc835711
30 changed files with 63 additions and 786 deletions

63
.gitignore vendored Normal file
View File

@ -0,0 +1,63 @@
# Local History folder (cursor/vscode extension)
.lh/
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# Virtual environments
venv/
env/
ENV/
env.bak/
venv.bak/
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# OS
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Logs
*.log
logs/
# Temporary files
*.tmp
*.temp
# Settings (mogelijk gevoelige informatie)
# Uncomment als je settings.json niet wilt committen:
# adhan-webapp/settings.json
# Docker
.dockerignore

View File

@ -1,6 +0,0 @@
# list file to not track by the local-history extension. comment line starts with a '#' character
# each line describe a regular expression pattern (search for 'Javascript regex')
# it will relate to the workspace directory root. for example:
# '.*\.txt' ignores any file with 'txt' extension
# '/test/.*' ignores all the files under the 'test' directory
# '.*/test/.*' ignores all the files under any 'test' directory (even under sub-folders)

File diff suppressed because one or more lines are too long

View File

@ -1,30 +0,0 @@
{
"sourceFile": "adhan-webapp/Dockerfile",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 3,
"patches": [
{
"date": 1748182920273,
"content": "Index: \n===================================================================\n--- \n+++ \n"
},
{
"date": 1748183154468,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -10,10 +10,7 @@\n \n # Kopieer de rest van de bestanden\n COPY . .\n \n-# Voeg cache-control headers toe aan statische bestanden\n-RUN echo \"location /static/ { add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; }\" > /etc/nginx/conf.d/static.conf\n-\n EXPOSE 80\n \n CMD [\"python\", \"app.py\"]\n"
},
{
"date": 1748183197708,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,1 +1,20 @@\n-\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\\ No newline at end of file\n+FROM python:3.11-slim\n+\n+WORKDIR /app\n+\n+# Installeer alleen de benodigde packages\n+RUN pip install --no-cache-dir flask requests\n+\n+# Kopieer de applicatie bestanden\n+COPY . .\n+\n+# Maak de benodigde directories aan\n+RUN mkdir -p /app/static/clips\n+\n+# Stel de juiste permissies in\n+RUN chmod -R 755 /app\n+\n+EXPOSE 80\n+\n+# Start de applicatie\n+CMD [\"python\", \"app.py\"]\n"
},
{
"date": 1748199351044,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,1 +1,20 @@\n-\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\\ No newline at end of file\n+FROM python:3.11-slim\n+\n+WORKDIR /app\n+\n+# Installeer alleen de benodigde packages\n+RUN pip install --no-cache-dir flask requests\n+\n+# Kopieer de applicatie bestanden\n+COPY . .\n+\n+# Maak de benodigde directories aan\n+RUN mkdir -p /app/static/clips\n+\n+# Stel de juiste permissies in\n+RUN chmod -R 755 /app\n+\n+EXPOSE 80\n+\n+# Start de applicatie\n+CMD [\"python\", \"start_all.py\"]\n"
}
],
"date": 1748182920273,
"name": "Commit-0",
"content": "FROM python:3.11-slim\n\nWORKDIR /app\n\nRUN pip install flask requests\n\n# Kopieer eerst alleen de requirements om caching te optimaliseren\nCOPY requirements.txt .\nRUN pip install -r requirements.txt\n\n# Kopieer de rest van de bestanden\nCOPY . .\n\n# Voeg cache-control headers toe aan statische bestanden\nRUN echo \"location /static/ { add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; }\" > /etc/nginx/conf.d/static.conf\n\nEXPOSE 80\n\nCMD [\"python\", \"app.py\"]\n"
}
]
}

View File

@ -1,18 +0,0 @@
{
"sourceFile": "adhan-webapp/README.md",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 0,
"patches": [
{
"date": 1748203692581,
"content": "Index: \n===================================================================\n--- \n+++ \n"
}
],
"date": 1748203692581,
"name": "Commit-0",
"content": "# Adhaan Gebedstijden Display\n\nEen moderne, islamitische gebedstijden display applicatie met automatische adhaan, weersinformatie en Sonos integratie.\n\n## ✨ Nieuwe Functies\n\n### 🌤️ Weersinformatie\n- Actuele temperatuur en weersomstandigheden\n- Automatische updates elke 10 minuten\n- Nederlandse weerbeschrijvingen\n- Windsnelheid en luchtvochtigheid\n\n### 🎵 Uitgebreide Audio Opties\n- Meerdere adhaan-stijlen beschikbaar\n- Audio preview functie in instellingen\n- Verbeterde instellingen interface\n- Test functionaliteit voor Sonos\n\n## 🚀 Installatie\n\n### 1. OpenWeatherMap API Key verkrijgen\n\n1. Ga naar [OpenWeatherMap](https://openweathermap.org/api)\n2. Maak een gratis account aan\n3. Verkrijg je API key (1000 gratis calls per dag)\n\n### 2. Configuratie\n\nBewerk `config.py` en vervang `YOUR_API_KEY_HERE` met je OpenWeatherMap API key:\n\n```python\nOPENWEATHER_API_KEY = 'jouw_api_key_hier'\n```\n\nOptioneel kun je ook de locatie aanpassen:\n\n```python\nWEATHER_LOCATION = 'Amsterdam,NL' # Vervang met jouw stad\n```\n\n### 3. Docker opstarten\n\n```bash\ndocker-compose up -d\n```\n\n## 📱 Gebruik\n\n### Hoofdscherm\n- **Links**: Huidige tijd, datum en countdown naar volgende gebed\n- **Rechts**: Hadith, gebedstijden en weersinformatie\n- **Knoppen**: Dark/light mode, instellingen, mute\n\n### Instellingen\n- **Volume**: Sonos volume instelling (0-100)\n- **Zones**: Selecteer welke Sonos speakers gebruikt worden\n- **Audio**: Kies adhaan-stijl met preview functie\n- **Test**: Test audio op Sonos of lokaal\n\n## 🎵 Audio Bestanden Toevoegen\n\n1. Plaats MP3 bestanden in `static/clips/`\n2. Bestanden worden automatisch beschikbaar in instellingen\n3. Aanbevolen: max 5MB per bestand\n\n## 🔧 API Endpoints\n\n- `GET /api/weather` - Actuele weerdata\n- `GET /api/hadith` - Willekeurige hadith\n- `POST /api/mute` - Toggle mute status\n- `POST /api/test-audio` - Test audio bestand\n\n## 🌍 Functies\n\n- ✅ Automatische adhaan op gebedstijden\n- ✅ Sonos integratie met meerdere zones\n- ✅ Nederlandse hadiths die automatisch wisselen\n- ✅ Dark/light theme toggle\n- ✅ Mute functionaliteit\n- ✅ Responsive design\n- ✅ Weersinformatie met automatische updates\n- ✅ Meerdere adhaan-stijlen met preview\n- ✅ Moderne, islamitische UI\n\n## 🛠️ Technische Details\n\n- **Backend**: Flask (Python)\n- **Frontend**: HTML5, CSS3, JavaScript\n- **Audio**: MP3 ondersteuning\n- **API's**: VUMG (gebedstijden), OpenWeatherMap (weer), Sonos\n- **Deployment**: Docker + TrueNAS\n\n## 📝 Changelog\n\n### v2.0 - Nieuwe Functies\n- Weersinformatie toegevoegd\n- Meerdere adhaan-stijlen\n- Audio preview functie\n- Verbeterde instellingen interface\n- API endpoints voor dynamische updates\n- Configuratie bestand voor eenvoudige setup\n\n### v1.0 - Basis Functionaliteit\n- ✅ Gebedstijden display\n- ✅ Automatische adhaan\n- ✅ Sonos integratie\n- ✅ Hadith rotatie\n- ✅ Dark/light theme "
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,22 +0,0 @@
{
"sourceFile": "adhan-webapp/config.py",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 1,
"patches": [
{
"date": 1748203602606,
"content": "Index: \n===================================================================\n--- \n+++ \n"
},
{
"date": 1748203978113,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,9 +1,9 @@\n # Configuratie bestand voor de Adhaan applicatie\n \n # OpenWeatherMap API configuratie\n # Verkrijg een gratis API key op: https://openweathermap.org/api\n-OPENWEATHER_API_KEY = 'YOUR_API_KEY_HERE'\n+OPENWEATHER_API_KEY = '99caf7628fd7197acd71df3fc2cafbdb'\n \n # Locatie voor weersinformatie\n WEATHER_LOCATION = 'Amsterdam,NL'\n \n"
}
],
"date": 1748203602606,
"name": "Commit-0",
"content": "# Configuratie bestand voor de Adhaan applicatie\n\n# OpenWeatherMap API configuratie\n# Verkrijg een gratis API key op: https://openweathermap.org/api\nOPENWEATHER_API_KEY = 'YOUR_API_KEY_HERE'\n\n# Locatie voor weersinformatie\nWEATHER_LOCATION = 'Amsterdam,NL'\n\n# Sonos API configuratie\nSONOS_API_IP = '192.168.0.114'\n\n# VUMG API voor gebedstijden\nVUMG_API_URL = 'https://www.vumg.nl/?rest_route=/dpt/v1/prayertime&filter=today'\n\n# Bestandspaden\nimport os\nBASE_DIR = os.path.dirname(os.path.abspath(__file__))\nSETTINGS_PATH = os.path.join(BASE_DIR, 'settings.json')\nHADITHS_PATH = os.path.join(BASE_DIR, 'static', 'hadiths.json')\nCLIPS_PATH = os.path.join(BASE_DIR, 'static', 'clips') "
}
]
}

View File

@ -1,18 +0,0 @@
{
"sourceFile": "adhan-webapp/requirements.txt",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 0,
"patches": [
{
"date": 1748204335831,
"content": "Index: \n===================================================================\n--- \n+++ \n"
}
],
"date": 1748204335831,
"name": "Commit-0",
"content": "Flask==3.0.0\nrequests==2.31.0\nhijridate==2.5.0 "
}
]
}

View File

@ -1,30 +0,0 @@
{
"sourceFile": "adhan-webapp/settings.json",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 3,
"patches": [
{
"date": 1748201503324,
"content": "Index: \n===================================================================\n--- \n+++ \n"
},
{
"date": 1748275757237,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,8 +1,9 @@\n {\n- \"volume\": 20,\n+ \"volume\": 15,\n \"zones\": [\n- \"Keuken\"\n+ \"Keuken\",\n+ \"Slaapkamer\"\n ],\n \"audio_clip\": \"adhan1.mp3\",\n \"mute\": false\n }\n\\ No newline at end of file\n"
},
{
"date": 1748276087388,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,1 +1,9 @@\n-\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\\ No newline at end of file\n+{\n+ \"volume\": 15,\n+ \"zones\": [\n+ \"Keuken\",\n+ \"Slaapkamer\"\n+ ],\n+ \"audio_clip\": \"adhan1.mp3\",\n+ \"mute\": false\n+}\n\\ No newline at end of file\n"
},
{
"date": 1748339667206,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,8 +1,8 @@\n {\n \"volume\": 15,\n \"volume_day\": 15,\n- \"volume_night\": 8,\n+ \"volume_night\": 4,\n \"night_start\": \"00:00\",\n \"day_start\": \"07:00\",\n \"zones\": [\n \"Keuken\",\n"
}
],
"date": 1748201503324,
"name": "Commit-0",
"content": "{\n \"volume\": 20,\n \"zones\": [\n \"Keuken\"\n ],\n \"audio_clip\": \"adhan1.mp3\",\n \"mute\": false\n}"
}
]
}

View File

@ -1,18 +0,0 @@
{
"sourceFile": "adhan-webapp/start_all.py",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 0,
"patches": [
{
"date": 1748199344007,
"content": "Index: \n===================================================================\n--- \n+++ \n"
}
],
"date": 1748199344007,
"name": "Commit-0",
"content": "import subprocess\nimport sys\nimport time\n\n# Start Flask-app\nflask_proc = subprocess.Popen([sys.executable, 'app.py'])\n\n# Start adhan_cron.py elke minuut in een loop\ntry:\n while True:\n cron_proc = subprocess.Popen([sys.executable, 'adhan_cron.py'])\n cron_proc.wait()\n time.sleep(60)\nexcept KeyboardInterrupt:\n flask_proc.terminate()\n sys.exit(0) "
}
]
}

View File

@ -1,18 +0,0 @@
{
"sourceFile": "adhan-webapp/static/README-KLEUREN.md",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 0,
"patches": [
{
"date": 1748410011936,
"content": "Index: \n===================================================================\n--- \n+++ \n"
}
],
"date": 1748410011936,
"name": "Commit-0",
"content": "# Kleurenschema Adhan App\n\n## Overzicht\nAlle kleuren in de Adhan app worden nu centraal beheerd via het bestand `colors.css`. Dit maakt het gemakkelijk om het hele kleurenschema van de app aan te passen door slechts één bestand te wijzigen.\n\n## Hoofdkleuren\nDe app gebruikt vier hoofdkleuren die je kunt aanpassen:\n\n### 1. Blauw (Primair)\n- `--primary-blue: #1e3c72` - Donkerblauw voor achtergronden\n- `--secondary-blue: #2a5298` - Lichterblauw voor gradiënten\n- `--accent-blue: #2563eb` - Helderblauw voor accenten\n\n### 2. Goud\n- `--gold: #d4af37` - Goudkleur voor speciale accenten\n\n### 3. Basis kleuren\n- `--white: #ffffff` - Wit\n- `--black: #000000` - Zwart\n- `--dark-gray: #111111` - Donkergrijs\n- `--light-gray: #f7fafc` - Lichtgrijs\n\n## Hoe kleuren aanpassen?\n\n### Stap 1: Open colors.css\nBewerk het bestand: `adhan-webapp/static/colors.css`\n\n### Stap 2: Wijzig de hoofdkleuren\nVerander de waarden in de `:root` sectie:\n\n```css\n:root {\n /* Hoofdkleuren - PAS DEZE AAN */\n --primary-blue: #1e3c72; /* Verander naar jouw donkere kleur */\n --secondary-blue: #2a5298; /* Verander naar jouw lichte kleur */\n --accent-blue: #2563eb; /* Verander naar jouw accent kleur */\n --gold: #d4af37; /* Verander naar jouw goud/accent kleur */\n \n /* Basis kleuren - meestal niet nodig om aan te passen */\n --white: #ffffff;\n --black: #000000;\n --dark-gray: #111111;\n --light-gray: #f7fafc;\n}\n```\n\n### Stap 3: Sla op en herlaad\nNa het opslaan van `colors.css` worden alle kleuren automatisch bijgewerkt in:\n- Hoofdpagina (`index.html`)\n- Adzkaar pagina (`adzkaar.html`)\n- Quran speler (`quran.html`)\n- Instellingen (`settings.html`)\n- Debug pagina (`debug.html`)\n\n## Voorbeelden van kleurenschema's\n\n### Groen thema\n```css\n--primary-blue: #1e4d3c;\n--secondary-blue: #2a8052;\n--accent-blue: #25eb63;\n--gold: #d4af37;\n```\n\n### Paars thema\n```css\n--primary-blue: #4c1e72;\n--secondary-blue: #6a2a98;\n--accent-blue: #8b25eb;\n--gold: #d4af37;\n```\n\n### Rood thema\n```css\n--primary-blue: #721e1e;\n--secondary-blue: #982a2a;\n--accent-blue: #eb2525;\n--gold: #d4af37;\n```\n\n## Geavanceerde aanpassingen\n\n### Transparante varianten\nDe app gebruikt automatisch transparante versies van de kleuren. Deze worden automatisch gegenereerd, maar je kunt ze ook handmatig aanpassen:\n\n```css\n--white-10: rgba(255, 255, 255, 0.1); /* 10% transparant wit */\n--white-20: rgba(255, 255, 255, 0.2); /* 20% transparant wit */\n--black-30: rgba(0, 0, 0, 0.3); /* 30% transparant zwart */\n```\n\n### Gradiënten\nDe hoofdgradiënt wordt automatisch gegenereerd uit de primaire kleuren:\n\n```css\n--primary-gradient: linear-gradient(135deg, var(--primary-blue) 0%, var(--secondary-blue) 100%);\n```\n\n## Bestanden die het kleurenschema gebruiken\n\n1. **colors.css** - Centraal kleurenbestand (HOOFDBESTAND OM AAN TE PASSEN)\n2. **style.css** - Importeert colors.css en gebruikt de variabelen\n3. **quran.css** - Importeert colors.css voor Quran specifieke styling\n4. **adzkaar.html** - Gebruikt de kleurvariabelen in inline CSS\n\n## Tips\n\n1. **Test altijd beide thema's**: Controleer zowel de lichte als donkere modus na wijzigingen\n2. **Gebruik kleurcontrast tools**: Zorg ervoor dat tekst goed leesbaar blijft\n3. **Maak een backup**: Kopieer `colors.css` voordat je grote wijzigingen maakt\n4. **Consistentie**: Gebruik dezelfde kleurfamilie voor een professionele uitstraling\n\n## Problemen oplossen\n\nAls kleuren niet worden bijgewerkt:\n1. Controleer of `colors.css` correct wordt geïmporteerd\n2. Ververs de browser cache (Ctrl+F5 of Cmd+Shift+R)\n3. Controleer de browser console voor CSS fouten\n4. Zorg ervoor dat CSS variabelen correct zijn geschreven (met `--` prefix) "
}
]
}

View File

@ -1,18 +0,0 @@
{
"sourceFile": "adhan-webapp/static/clips/README.md",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 0,
"patches": [
{
"date": 1748203518364,
"content": "Index: \n===================================================================\n--- \n+++ \n"
}
],
"date": 1748203518364,
"name": "Commit-0",
"content": "# Adhaan Audio Bestanden\n\nDeze directory bevat verschillende adhaan audio bestanden voor de gebedstijden applicatie.\n\n## Beschikbare Adhaan Stijlen:\n\n1. **adhan1.mp3** - Klassieke adhaan (origineel)\n2. **adhan_mekka.mp3** - Mekka stijl adhaan\n3. **adhan_medina.mp3** - Medina stijl adhaan\n4. **adhan_kort.mp3** - Korte versie adhaan\n5. **adhan_traditioneel.mp3** - Traditionele Nederlandse moskee stijl\n\n## Gebruik:\n\nDe gebruiker kan in de instellingen kiezen welke adhaan-stijl gebruikt wordt.\nAlle bestanden moeten in MP3 formaat zijn voor compatibiliteit met de browser en Sonos systemen.\n\n## Toevoegen van nieuwe bestanden:\n\n1. Plaats het MP3 bestand in deze directory\n2. Het bestand wordt automatisch beschikbaar in de instellingen\n3. Zorg ervoor dat het bestand niet te groot is (max 5MB aanbevolen) "
}
]
}

View File

@ -1,18 +0,0 @@
{
"sourceFile": "adhan-webapp/static/colors.css",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 0,
"patches": [
{
"date": 1748409896896,
"content": "Index: \n===================================================================\n--- \n+++ \n"
}
],
"date": 1748409896896,
"name": "Commit-0",
"content": "/* Centraal Kleurenschema voor Adhan App */\n:root {\n /* Hoofdkleuren */\n --primary-blue: #1e3c72;\n --secondary-blue: #2a5298;\n --accent-blue: #2563eb;\n --gold: #d4af37;\n --white: #ffffff;\n --black: #000000;\n --dark-gray: #111111;\n --light-gray: #f7fafc;\n \n /* Gradient achtergronden */\n --primary-gradient: linear-gradient(135deg, var(--primary-blue) 0%, var(--secondary-blue) 100%);\n --gold-gradient: linear-gradient(135deg, var(--gold) 0%, #f4e17a 100%);\n \n /* Transparante varianten */\n --white-10: rgba(255, 255, 255, 0.1);\n --white-15: rgba(255, 255, 255, 0.15);\n --white-20: rgba(255, 255, 255, 0.2);\n --white-30: rgba(255, 255, 255, 0.3);\n --black-30: rgba(0, 0, 0, 0.3);\n --black-50: rgba(0, 0, 0, 0.5);\n \n /* Tekst kleuren */\n --text-primary-light: #222222;\n --text-primary-dark: #ffffff;\n --text-secondary-light: #666666;\n --text-secondary-dark: #bbbbbb;\n --text-muted-light: #c0c6d0;\n --text-muted-dark: #e0e6ed;\n \n /* Achtergrond kleuren */\n --bg-light: var(--light-gray);\n --bg-dark: var(--dark-gray);\n --panel-bg-light: var(--white);\n --panel-bg-dark: rgba(24, 24, 24, 0.8);\n \n /* Border kleuren */\n --border-light: #e0e6ed;\n --border-dark: var(--white-20);\n \n /* Accent kleuren voor verschillende states */\n --active-bg-light: #fffbe6;\n --active-bg-dark: rgba(234, 179, 8, 0.08);\n --hover-bg-light: rgba(212, 175, 55, 0.1);\n --hover-bg-dark: var(--white-10);\n \n /* Schaduwen */\n --shadow-light: 0 8px 32px 0 rgba(0, 0, 0, 0.25);\n --shadow-dark: 0 8px 32px 0 rgba(0, 0, 0, 0.5);\n --text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.3);\n --text-shadow-strong: 2px 2px 8px var(--black);\n}\n\n/* Light theme variabelen */\nhtml.light {\n --bg: var(--bg-light);\n --text: var(--text-primary-light);\n --text-secondary: var(--text-secondary-light);\n --text-muted: var(--text-muted-light);\n --panel-bg: var(--panel-bg-light);\n --panel-text: var(--text-primary-light);\n --accent: var(--accent-blue);\n --accent-color: var(--gold);\n --border-color: var(--border-light);\n --active-bg: var(--active-bg-light);\n --hover-bg: var(--hover-bg-light);\n --shadow: var(--shadow-light);\n}\n\n/* Dark theme variabelen */\nhtml.dark, body.dark {\n --bg: var(--bg-dark);\n --text: var(--text-primary-dark);\n --text-secondary: var(--text-secondary-dark);\n --text-muted: var(--text-muted-dark);\n --panel-bg: var(--panel-bg-dark);\n --panel-text: var(--text-primary-dark);\n --accent: var(--white);\n --accent-color: var(--gold);\n --border-color: var(--border-dark);\n --active-bg: var(--active-bg-dark);\n --hover-bg: var(--hover-bg-dark);\n --shadow: var(--shadow-dark);\n} "
}
]
}

View File

@ -1,38 +0,0 @@
{
"sourceFile": "adhan-webapp/static/countdown.js",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 5,
"patches": [
{
"date": 1748182675995,
"content": "Index: \n===================================================================\n--- \n+++ \n"
},
{
"date": 1748202535810,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -3,20 +3,57 @@\n const timeStr = now.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n document.getElementById(\"current-time\").textContent = timeStr;\n }\n \n-function startCountdown(targetTimeStr) {\n+// Gebedstijden ophalen uit een globale variabele (wordt in de template gezet)\n+let prayerTimes = window.prayerTimes || [];\n+let prayerNames = window.prayerNames || [];\n+let currentPrayerIndex = 0;\n+\n+function startCountdowns(times, names) {\n+ prayerTimes = times;\n+ prayerNames = names;\n+ currentPrayerIndex = getNextPrayerIndex();\n+ startCountdown(prayerTimes[currentPrayerIndex], prayerNames[currentPrayerIndex]);\n+}\n+\n+function getNextPrayerIndex() {\n+ const now = new Date();\n+ for (let i = 0; i < prayerTimes.length; i++) {\n+ const [h, m] = prayerTimes[i].split(\":\");\n+ const t = new Date();\n+ t.setHours(parseInt(h));\n+ t.setMinutes(parseInt(m));\n+ t.setSeconds(0);\n+ if (t > now) return i;\n+ }\n+ return 0; // fallback: eerste gebed\n+}\n+\n+function startCountdown(targetTimeStr, prayerName) {\n const parts = targetTimeStr.split(\":\");\n- const target = new Date();\n+ let target = new Date();\n target.setHours(parseInt(parts[0]));\n target.setMinutes(parseInt(parts[1]));\n- target.setSeconds(parseInt(parts[2]) || 0);\n+ target.setSeconds(0);\n \n+ document.querySelector('.huidig-gebed .naam').textContent = prayerName;\n+\n function update() {\n const now = new Date();\n let diff = Math.floor((target - now) / 1000);\n \n- if (diff < 0) diff = 0;\n+ if (diff <= 0) {\n+ // Speel adhaan af via browser\n+ const audio = document.getElementById('adhanAudio');\n+ if (audio) audio.play();\n+ // Ga naar volgende gebed\n+ currentPrayerIndex = (currentPrayerIndex + 1) % prayerTimes.length;\n+ const nextTime = prayerTimes[currentPrayerIndex];\n+ const nextName = prayerNames[currentPrayerIndex];\n+ startCountdown(nextTime, nextName);\n+ return;\n+ }\n \n const h = String(Math.floor(diff / 3600)).padStart(2, '0');\n const m = String(Math.floor((diff % 3600) / 60)).padStart(2, '0');\n const s = String(diff % 60).padStart(2, '0');\n@@ -24,9 +61,10 @@\n document.getElementById(\"countdown\").textContent = `${h}:${m}:${s}`;\n }\n \n update();\n- setInterval(update, 1000);\n+ window._countdownInterval && clearInterval(window._countdownInterval);\n+ window._countdownInterval = setInterval(update, 1000);\n }\n \n function setupThemeToggle() {\n const toggleBtn = document.getElementById(\"themeToggle\");\n"
},
{
"date": 1748204399019,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,10 +1,30 @@\n function updateCurrentTime() {\n const now = new Date();\n const timeStr = now.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n document.getElementById(\"current-time\").textContent = timeStr;\n+ \n+ // Update datum informatie elke minuut\n+ updateDateInfo();\n }\n \n+function updateDateInfo() {\n+ fetch('/api/date-info')\n+ .then(response => response.json())\n+ .then(data => {\n+ const gregorianElement = document.querySelector('.gregorian-datum');\n+ const hijriArabicElement = document.querySelector('.hijri-datum-arabic');\n+ const hijriDutchElement = document.querySelector('.hijri-datum-dutch');\n+ \n+ if (gregorianElement) gregorianElement.textContent = data.gregorian_full;\n+ if (hijriArabicElement) hijriArabicElement.textContent = data.hijri_arabic;\n+ if (hijriDutchElement) hijriDutchElement.textContent = data.hijri_dutch;\n+ })\n+ .catch(error => {\n+ console.log('Fout bij bijwerken datum:', error);\n+ });\n+}\n+\n // Gebedstijden ophalen uit een globale variabele (wordt in de template gezet)\n let prayerTimes = window.prayerTimes || [];\n let prayerNames = window.prayerNames || [];\n let currentPrayerIndex = 0;\n"
},
{
"date": 1748396047266,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -27,37 +27,52 @@\n // Gebedstijden ophalen uit een globale variabele (wordt in de template gezet)\n let prayerTimes = window.prayerTimes || [];\n let prayerNames = window.prayerNames || [];\n let currentPrayerIndex = 0;\n+let isNextDayPrayer = false;\n \n function startCountdowns(times, names) {\n prayerTimes = times;\n prayerNames = names;\n- currentPrayerIndex = getNextPrayerIndex();\n- startCountdown(prayerTimes[currentPrayerIndex], prayerNames[currentPrayerIndex]);\n+ const nextPrayer = getNextPrayer();\n+ currentPrayerIndex = nextPrayer.index;\n+ isNextDayPrayer = nextPrayer.isNextDay;\n+ startCountdown(prayerTimes[currentPrayerIndex], prayerNames[currentPrayerIndex], isNextDayPrayer);\n }\n \n-function getNextPrayerIndex() {\n+function getNextPrayer() {\n const now = new Date();\n+ const currentTime = now.getHours() * 60 + now.getMinutes(); // Huidige tijd in minuten\n+ \n+ // Zoek naar volgende gebed vandaag\n for (let i = 0; i < prayerTimes.length; i++) {\n const [h, m] = prayerTimes[i].split(\":\");\n- const t = new Date();\n- t.setHours(parseInt(h));\n- t.setMinutes(parseInt(m));\n- t.setSeconds(0);\n- if (t > now) return i;\n+ const prayerTimeMinutes = parseInt(h) * 60 + parseInt(m);\n+ \n+ if (prayerTimeMinutes > currentTime) {\n+ return { index: i, isNextDay: false };\n+ }\n }\n- return 0; // fallback: eerste gebed\n+ \n+ // Alle gebeden van vandaag zijn voorbij, volgende is eerste gebed van morgen\n+ return { index: 0, isNextDay: true };\n }\n \n-function startCountdown(targetTimeStr, prayerName) {\n+function startCountdown(targetTimeStr, prayerName, isNextDay = false) {\n const parts = targetTimeStr.split(\":\");\n let target = new Date();\n target.setHours(parseInt(parts[0]));\n target.setMinutes(parseInt(parts[1]));\n target.setSeconds(0);\n+ \n+ // Als het volgende gebed morgen is, voeg een dag toe\n+ if (isNextDay) {\n+ target.setDate(target.getDate() + 1);\n+ }\n \n- document.querySelector('.huidig-gebed .naam').textContent = prayerName;\n+ // Update de naam met \"morgen\" indicator als nodig\n+ const displayName = isNextDay ? `${prayerName} (morgen)` : prayerName;\n+ document.querySelector('.huidig-gebed .naam').textContent = displayName;\n \n function update() {\n const now = new Date();\n let diff = Math.floor((target - now) / 1000);\n@@ -65,16 +80,40 @@\n if (diff <= 0) {\n // Speel adhaan af via browser\n const audio = document.getElementById('adhanAudio');\n if (audio) audio.play();\n+ \n // Ga naar volgende gebed\n- currentPrayerIndex = (currentPrayerIndex + 1) % prayerTimes.length;\n- const nextTime = prayerTimes[currentPrayerIndex];\n- const nextName = prayerNames[currentPrayerIndex];\n- startCountdown(nextTime, nextName);\n+ if (isNextDayPrayer) {\n+ // We waren aan het wachten op het eerste gebed van de nieuwe dag\n+ // Nu gaan we naar het tweede gebed van vandaag (nieuwe dag)\n+ currentPrayerIndex = 1;\n+ isNextDayPrayer = false;\n+ \n+ if (currentPrayerIndex < prayerTimes.length) {\n+ startCountdown(prayerTimes[currentPrayerIndex], prayerNames[currentPrayerIndex], false);\n+ } else {\n+ // Dit zou niet moeten gebeuren, maar veiligheidshalve\n+ currentPrayerIndex = 0;\n+ isNextDayPrayer = true;\n+ startCountdown(prayerTimes[currentPrayerIndex], prayerNames[currentPrayerIndex], true);\n+ }\n+ } else {\n+ // Normaal doorgang naar volgende gebed\n+ currentPrayerIndex++;\n+ \n+ if (currentPrayerIndex >= prayerTimes.length) {\n+ // Alle gebeden van vandaag zijn klaar, ga naar eerste gebed van morgen\n+ currentPrayerIndex = 0;\n+ isNextDayPrayer = true;\n+ }\n+ \n+ startCountdown(prayerTimes[currentPrayerIndex], prayerNames[currentPrayerIndex], isNextDayPrayer);\n+ }\n return;\n }\n \n+ // Toon countdown\n const h = String(Math.floor(diff / 3600)).padStart(2, '0');\n const m = String(Math.floor((diff % 3600) / 60)).padStart(2, '0');\n const s = String(diff % 60).padStart(2, '0');\n \n"
},
{
"date": 1748396926416,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -81,8 +81,13 @@\n // Speel adhaan af via browser\n const audio = document.getElementById('adhanAudio');\n if (audio) audio.play();\n \n+ // Trigger Adzkaar scherm na 3 seconden (geef adhaan tijd om te starten)\n+ setTimeout(() => {\n+ triggerAdzkaarScreen(displayName);\n+ }, 3000);\n+ \n // Ga naar volgende gebed\n if (isNextDayPrayer) {\n // We waren aan het wachten op het eerste gebed van de nieuwe dag\n // Nu gaan we naar het tweede gebed van vandaag (nieuwe dag)\n"
},
{
"date": 1748396942157,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -146,4 +146,37 @@\n const current = html.className === 'light' ? 'dark' : 'light';\n applyTheme(current);\n });\n }\n+\n+function triggerAdzkaarScreen(prayerName) {\n+ // Check eerst of Adzkaar is ingeschakeld via API\n+ fetch('/api/trigger-adzkaar', {\n+ method: 'POST',\n+ headers: { 'Content-Type': 'application/json' }\n+ })\n+ .then(response => response.json())\n+ .then(data => {\n+ if (data.success) {\n+ console.log(`📿 Adzkaar scherm wordt getoond na ${prayerName}`);\n+ \n+ // Open Adzkaar scherm in fullscreen\n+ // In kiosk mode proberen we een nieuw venster te openen\n+ const adzkaarWindow = window.open(\n+ data.url, \n+ 'adzkaar', \n+ 'fullscreen=yes,scrollbars=no,resizable=no,toolbar=no,menubar=no,status=no'\n+ );\n+ \n+ // Als window.open niet werkt (bijv. popup blocker), navigeer naar de pagina\n+ if (!adzkaarWindow) {\n+ console.log('📿 Popup geblokkeerd, navigeren naar Adzkaar pagina...');\n+ window.location.href = data.url;\n+ }\n+ } else {\n+ console.log(`📿 Adzkaar niet getoond: ${data.error}`);\n+ }\n+ })\n+ .catch(error => {\n+ console.log(`❌ Fout bij Adzkaar trigger: ${error.message}`);\n+ });\n+}\n"
}
],
"date": 1748182675995,
"name": "Commit-0",
"content": "function updateCurrentTime() {\n const now = new Date();\n const timeStr = now.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n document.getElementById(\"current-time\").textContent = timeStr;\n}\n\nfunction startCountdown(targetTimeStr) {\n const parts = targetTimeStr.split(\":\");\n const target = new Date();\n target.setHours(parseInt(parts[0]));\n target.setMinutes(parseInt(parts[1]));\n target.setSeconds(parseInt(parts[2]) || 0);\n\n function update() {\n const now = new Date();\n let diff = Math.floor((target - now) / 1000);\n\n if (diff < 0) diff = 0;\n\n const h = String(Math.floor(diff / 3600)).padStart(2, '0');\n const m = String(Math.floor((diff % 3600) / 60)).padStart(2, '0');\n const s = String(diff % 60).padStart(2, '0');\n\n document.getElementById(\"countdown\").textContent = `${h}:${m}:${s}`;\n }\n\n update();\n setInterval(update, 1000);\n}\n\nfunction setupThemeToggle() {\n const toggleBtn = document.getElementById(\"themeToggle\");\n const html = document.documentElement;\n\n function applyTheme(theme) {\n html.className = theme;\n localStorage.setItem('theme', theme);\n }\n\n const saved = localStorage.getItem('theme') || 'light';\n applyTheme(saved);\n\n toggleBtn.addEventListener(\"click\", () => {\n const current = html.className === 'light' ? 'dark' : 'light';\n applyTheme(current);\n });\n}\n"
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,22 +0,0 @@
{
"sourceFile": "adhan-webapp/test_offsets.py",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 1,
"patches": [
{
"date": 1748347843183,
"content": "Index: \n===================================================================\n--- \n+++ \n"
},
{
"date": 1748347851222,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -1,71 +1,1 @@\n-#!/usr/bin/env python3\n-\n-import json\n-import sys\n-from datetime import datetime, timedelta\n-\n-def apply_prayer_offsets(gebedstijden, settings):\n- \"\"\"Pas offsets toe op gebedstijden\"\"\"\n- offsets = {\n- 'Fajr': settings.get('fajr_offset', 0),\n- 'Zuhr': settings.get('zuhr_offset', 0),\n- 'Asr': settings.get('asr_offset', 0),\n- 'Maghrib': settings.get('maghrib_offset', 0),\n- 'Isha': settings.get('isha_offset', 0)\n- }\n- \n- adjusted_times = {}\n- \n- for prayer, original_time in gebedstijden.items():\n- offset_minutes = offsets.get(prayer, 0)\n- \n- if offset_minutes == 0:\n- adjusted_times[prayer] = original_time\n- continue\n- \n- try:\n- # Parse de originele tijd\n- time_obj = datetime.strptime(original_time, '%H:%M')\n- \n- # Voeg offset toe\n- adjusted_time = time_obj + timedelta(minutes=offset_minutes)\n- \n- # Converteer terug naar string\n- adjusted_times[prayer] = adjusted_time.strftime('%H:%M')\n- \n- if offset_minutes != 0:\n- print(f\"📅 {prayer}: {original_time} → {adjusted_times[prayer]} ({offset_minutes:+d} min)\")\n- \n- except Exception as e:\n- print(f\"⚠️ Fout bij aanpassen {prayer} tijd: {e}\")\n- adjusted_times[prayer] = original_time\n- \n- return adjusted_times\n-\n-# Test de functie\n-if __name__ == \"__main__\":\n- # Laad settings\n- with open('settings.json') as f:\n- settings = json.load(f)\n- \n- # Test gebedstijden (zoals van VUMG API)\n- test_gebedstijden = {\n- \"Fajr\": \"05:30\",\n- \"Zuhr\": \"12:45\", \n- \"Asr\": \"15:20\",\n- \"Maghrib\": \"17:55\",\n- \"Isha\": \"19:30\"\n- }\n- \n- print(\"=== OFFSET TEST ===\")\n- print(\"Originele tijden:\")\n- for prayer, time in test_gebedstijden.items():\n- offset = settings.get(f'{prayer.lower()}_offset', 0)\n- print(f\" {prayer}: {time} (offset: {offset:+d} min)\")\n- \n- print(\"\\nAangepaste tijden:\")\n- adjusted = apply_prayer_offsets(test_gebedstijden, settings)\n- \n- print(\"\\nResultaat:\")\n- for prayer, time in adjusted.items():\n- print(f\" {prayer}: {time}\") \n\\ No newline at end of file\n+ \n\\ No newline at end of file\n"
}
],
"date": 1748347843183,
"name": "Commit-0",
"content": "#!/usr/bin/env python3\n\nimport json\nimport sys\nfrom datetime import datetime, timedelta\n\ndef apply_prayer_offsets(gebedstijden, settings):\n \"\"\"Pas offsets toe op gebedstijden\"\"\"\n offsets = {\n 'Fajr': settings.get('fajr_offset', 0),\n 'Zuhr': settings.get('zuhr_offset', 0),\n 'Asr': settings.get('asr_offset', 0),\n 'Maghrib': settings.get('maghrib_offset', 0),\n 'Isha': settings.get('isha_offset', 0)\n }\n \n adjusted_times = {}\n \n for prayer, original_time in gebedstijden.items():\n offset_minutes = offsets.get(prayer, 0)\n \n if offset_minutes == 0:\n adjusted_times[prayer] = original_time\n continue\n \n try:\n # Parse de originele tijd\n time_obj = datetime.strptime(original_time, '%H:%M')\n \n # Voeg offset toe\n adjusted_time = time_obj + timedelta(minutes=offset_minutes)\n \n # Converteer terug naar string\n adjusted_times[prayer] = adjusted_time.strftime('%H:%M')\n \n if offset_minutes != 0:\n print(f\"📅 {prayer}: {original_time} → {adjusted_times[prayer]} ({offset_minutes:+d} min)\")\n \n except Exception as e:\n print(f\"⚠️ Fout bij aanpassen {prayer} tijd: {e}\")\n adjusted_times[prayer] = original_time\n \n return adjusted_times\n\n# Test de functie\nif __name__ == \"__main__\":\n # Laad settings\n with open('settings.json') as f:\n settings = json.load(f)\n \n # Test gebedstijden (zoals van VUMG API)\n test_gebedstijden = {\n \"Fajr\": \"05:30\",\n \"Zuhr\": \"12:45\", \n \"Asr\": \"15:20\",\n \"Maghrib\": \"17:55\",\n \"Isha\": \"19:30\"\n }\n \n print(\"=== OFFSET TEST ===\")\n print(\"Originele tijden:\")\n for prayer, time in test_gebedstijden.items():\n offset = settings.get(f'{prayer.lower()}_offset', 0)\n print(f\" {prayer}: {time} (offset: {offset:+d} min)\")\n \n print(\"\\nAangepaste tijden:\")\n adjusted = apply_prayer_offsets(test_gebedstijden, settings)\n \n print(\"\\nResultaat:\")\n for prayer, time in adjusted.items():\n print(f\" {prayer}: {time}\") "
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,18 +0,0 @@
{
"sourceFile": "pi-setup-desktop.sh",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 0,
"patches": [
{
"date": 1748378426079,
"content": "Index: \n===================================================================\n--- \n+++ \n"
}
],
"date": 1748378426079,
"name": "Commit-0",
"content": "#!/bin/bash\n\necho \"🍓 Adhaan Desktop Kiosk Setup\"\necho \"=============================\"\n\n# Zorg dat Docker en Docker Compose er zijn\necho \"🐳 Docker controleren...\"\nif ! command -v docker &> /dev/null; then\n echo \"Docker installeren...\"\n curl -fsSL https://get.docker.com -o get-docker.sh\n sudo sh get-docker.sh\n sudo usermod -aG docker $USER\n rm get-docker.sh\nfi\n\nif ! command -v docker-compose &> /dev/null; then\n echo \"Docker Compose installeren...\"\n sudo apt install -y docker-compose\nfi\n\n# Zorg dat Chromium er is\necho \"🌐 Browser controleren...\"\nsudo apt install -y chromium-browser\n\n# Maak kiosk script voor DESKTOP gebruik\necho \"📝 Desktop kiosk script aanmaken...\"\ncat > /home/$USER/kiosk.sh << 'KIOSK_EOF'\n#!/bin/bash\n# Wacht tot desktop volledig geladen is\nsleep 15\n\necho \"Starting Adhaan Kiosk...\"\n\n# Start Docker containers\ncd /home/pi/adhan\necho \"Starting Docker containers...\"\ndocker-compose -f docker-compose-pi.yml up -d\n\n# Wacht tot containers draaien\nsleep 10\n\n# Sluit eventuele andere browsers\npkill -f chromium-browser 2>/dev/null || true\n\n# Start browser in kiosk mode\necho \"Starting browser...\"\nDISPLAY=:0 chromium-browser \\\n --kiosk \\\n --start-maximized \\\n --noerrdialogs \\\n --disable-infobars \\\n --no-first-run \\\n --disable-session-crashed-bubble \\\n --disable-restore-session-state \\\n --disable-web-security \\\n --disable-features=VizDisplayCompositor \\\n http://localhost:5090 &\n\necho \"Kiosk started!\"\nKIOSK_EOF\n\nchmod +x /home/$USER/kiosk.sh\n\n# Configureer DESKTOP autostart (niet openbox!)\necho \"⚙️ Desktop autostart configureren...\"\nmkdir -p ~/.config/autostart\n\ncat > ~/.config/autostart/adhaan-kiosk.desktop << 'AUTOSTART_EOF'\n[Desktop Entry]\nType=Application\nName=Adhaan Kiosk\nComment=Start Adhaan in fullscreen\nExec=/home/pi/kiosk.sh\nHidden=false\nNoDisplay=false\nX-GNOME-Autostart-enabled=true\nStartupNotify=false\nTerminal=false\nAUTOSTART_EOF\n\nchmod +x ~/.config/autostart/adhaan-kiosk.desktop\n\n# Zorg voor DESKTOP autologin (niet console!)\necho \"👤 Desktop autologin configureren...\"\nsudo raspi-config nonint do_boot_behaviour B4\n\n# Zorg dat we naar DESKTOP booten (niet console!)\necho \"🖥️ Desktop boot configureren...\"\nsudo systemctl set-default graphical.target\nsudo systemctl unmask lightdm 2>/dev/null || true\nsudo systemctl enable lightdm\n\n# Verwijder eventuele console configuraties\nsudo rm -f /etc/systemd/system/getty@tty1.service.d/override.conf 2>/dev/null || true\nsudo rm -f /etc/systemd/system/adhan-docker.service 2>/dev/null || true\n\n# Schakel power management uit voor kiosk\necho \"⚡ Power management uitschakelen...\"\ncat > ~/.config/autostart/disable-power-management.desktop << 'POWER_EOF'\n[Desktop Entry]\nType=Application\nName=Disable Power Management\nExec=sh -c 'xset -dpms; xset s noblank; xset s off'\nHidden=false\nNoDisplay=false\nX-GNOME-Autostart-enabled=true\nStartupNotify=false\nTerminal=false\nPOWER_EOF\n\n# Test Docker setup\necho \"🧪 Docker setup testen...\"\ncd /home/$USER/adhan\nif docker-compose -f docker-compose-pi.yml config > /dev/null 2>&1; then\n echo \"✅ Docker configuratie OK\"\nelse\n echo \"❌ Docker configuratie probleem\"\nfi\n\necho \"\"\necho \"✅ Desktop kiosk setup voltooid!\"\necho \"\"\necho \"📋 Volgende stappen:\"\necho \"1. Test handmatig: ~/kiosk.sh\"\necho \"2. Als het werkt: sudo reboot\"\necho \"3. Pi start naar DESKTOP en opent automatisch kiosk\"\necho \"\"\necho \"🔧 Handmatige bediening:\"\necho \"- Alt+F4: Sluit browser (terug naar desktop)\"\necho \"- ~/kiosk.sh: Start kiosk opnieuw\"\necho \"- Desktop blijft beschikbaar!\"\necho \"\"\necho \"🎯 Belangrijke verschillen met origineel script:\"\necho \"- Behoudt Desktop functionaliteit\"\necho \"- Gebruikt desktop autostart (niet console)\"\necho \"- Lightdm blijft enabled\"\necho \"- Geen complexe boot configuraties\"\n"
}
]
}

View File

@ -1,22 +0,0 @@
{
"sourceFile": "pi-setup.sh",
"activeCommit": 0,
"commits": [
{
"activePatchIndex": 1,
"patches": [
{
"date": 1748356106533,
"content": "Index: \n===================================================================\n--- \n+++ \n"
},
{
"date": 1748358378475,
"content": "Index: \n===================================================================\n--- \n+++ \n@@ -91,12 +91,35 @@\n if ! grep -q \"startx\" ~/.bash_profile 2>/dev/null; then\n echo '[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && startx -- -nocursor' >> ~/.bash_profile\n fi\n \n-# Configureer automatische login\n+# Configureer automatische login (VERBETERD)\n echo \"👤 Automatische login configureren...\"\n sudo raspi-config nonint do_boot_behaviour B4\n \n+# Extra: Schakel splash screen uit voor snellere boot\n+echo \"🚀 Boot optimalisaties...\"\n+sudo raspi-config nonint do_boot_splash 1\n+\n+# Extra: Schakel wachtwoord login uit voor console (optioneel)\n+echo \"🔒 Console login optimaliseren...\"\n+sudo raspi-config nonint do_boot_behaviour B2\n+\n+# Schakel lightdm greeter uit (geen login scherm)\n+echo \"🖥️ Login scherm uitschakelen...\"\n+sudo systemctl set-default multi-user.target\n+sudo systemctl disable lightdm\n+\n+# Configureer automatische startx zonder login manager\n+cat > /tmp/getty-override.conf << 'EOF'\n+[Service]\n+ExecStart=\n+ExecStart=-/sbin/agetty --autologin USER_PLACEHOLDER --noclear %I $TERM\n+EOF\n+\n+sed \"s/USER_PLACEHOLDER/$USER/g\" /tmp/getty-override.conf | sudo tee /etc/systemd/system/getty@tty1.service.d/override.conf > /dev/null\n+sudo mkdir -p /etc/systemd/system/getty@tty1.service.d/\n+\n # Maak systemd service voor Docker\n echo \"🔄 Docker service configureren...\"\n cat > /tmp/adhan-docker.service << 'EOF'\n [Unit]\n@@ -122,12 +145,17 @@\n echo \"✅ Setup voltooid!\"\n echo \"\"\n echo \"📋 Volgende stappen:\"\n echo \"1. Herstart de Pi: sudo reboot\"\n-echo \"2. De Pi start automatisch in kiosk mode\"\n+echo \"2. De Pi start automatisch ZONDER login scherm\"\n echo \"3. Docker containers starten automatisch\"\n-echo \"4. Webpagina opent automatisch op http://localhost:5090\"\n+echo \"4. Webpagina opent automatisch fullscreen\"\n echo \"\"\n echo \"🔧 Handmatige bediening:\"\n echo \"- Alt+F4: Sluit browser\"\n\\ No newline at end of file\n echo \"- Ctrl+Alt+T: Open terminal\"\n-echo \"- sudo systemctl status adhan-docker: Check Docker status\" \n+echo \"- sudo systemctl status adhan-docker: Check Docker status\"\n+echo \"\"\n+echo \"⚠️ BELANGRIJK:\"\n+echo \"- Geen login scherm meer na herstart\"\n+echo \"- SSH blijft beschikbaar voor remote toegang\"\n+echo \"- Voor lokale terminal: Ctrl+Alt+F2\" \n\\ No newline at end of file\n"
}
],
"date": 1748356106533,
"name": "Commit-0",
"content": "#!/bin/bash\n\necho \"🍓 Adhaan Raspberry Pi Kiosk Setup\"\necho \"==================================\"\n\n# Update systeem\necho \"📦 Systeem bijwerken...\"\nsudo apt update -y\nsudo apt upgrade -y\n\n# Installeer Docker\necho \"🐳 Docker installeren...\"\ncurl -fsSL https://get.docker.com -o get-docker.sh\nsudo sh get-docker.sh\nsudo usermod -aG docker $USER\nrm get-docker.sh\n\n# Installeer Docker Compose\necho \"🔧 Docker Compose installeren...\"\nsudo apt install -y docker-compose\n\n# Installeer GUI componenten voor kiosk mode\necho \"🖥️ GUI componenten installeren...\"\nsudo apt install -y --no-install-recommends \\\n xserver-xorg \\\n x11-xserver-utils \\\n xinit \\\n openbox \\\n chromium-browser \\\n unclutter\n\n# Maak kiosk script\necho \"📝 Kiosk script aanmaken...\"\ncat > /home/$USER/kiosk.sh << 'EOF'\n#!/bin/bash\nsleep 5\n/usr/bin/chromium-browser \\\n --kiosk \\\n --start-maximized \\\n --noerrdialogs \\\n --disable-infobars \\\n --disable-session-crashed-bubble \\\n --disable-restore-session-state \\\n --disable-background-timer-throttling \\\n --disable-backgrounding-occluded-windows \\\n --disable-renderer-backgrounding \\\n --disable-features=TranslateUI \\\n --disable-ipc-flooding-protection \\\n --enable-features=OverlayScrollbar \\\n --no-first-run \\\n --fast \\\n --fast-start \\\n --disable-default-apps \\\n --disable-popup-blocking \\\n --disable-prompt-on-repost \\\n --disable-hang-monitor \\\n --disable-background-networking \\\n --aggressive-cache-discard \\\n --memory-pressure-off \\\n --max_old_space_size=100 \\\n --force-device-scale-factor=1 \\\n http://localhost:5090 &\nEOF\n\nchmod +x /home/$USER/kiosk.sh\n\n# Configureer autostart\necho \"⚙️ Autostart configureren...\"\nsudo mkdir -p /etc/xdg/openbox\ncat > /tmp/autostart << 'EOF'\n# Schakel power management uit\nxset -dpms\nxset s noblank\nxset s off\n\n# Verberg cursor na 3 seconden\nunclutter -idle 3 -root &\n\n# Verwijder crash berichten\nsed -i 's/\"exited_cleanly\":false/\"exited_cleanly\":true/' ~/.config/chromium/'Local State' 2>/dev/null || true\nsed -i 's/\"exited_cleanly\":false/\"exited_cleanly\":true/; s/\"exit_type\":\"[^\"]\\+\"/\"exit_type\":\"Normal\"/' ~/.config/chromium/Default/Preferences 2>/dev/null || true\n\n# Start kiosk\n/home/USER_PLACEHOLDER/kiosk.sh\nEOF\n\nsed \"s/USER_PLACEHOLDER/$USER/g\" /tmp/autostart | sudo tee /etc/xdg/openbox/autostart > /dev/null\n\n# Configureer automatische X start\necho \"🚀 Automatische X start configureren...\"\nif ! grep -q \"startx\" ~/.bash_profile 2>/dev/null; then\n echo '[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && startx -- -nocursor' >> ~/.bash_profile\nfi\n\n# Configureer automatische login\necho \"👤 Automatische login configureren...\"\nsudo raspi-config nonint do_boot_behaviour B4\n\n# Maak systemd service voor Docker\necho \"🔄 Docker service configureren...\"\ncat > /tmp/adhan-docker.service << 'EOF'\n[Unit]\nDescription=Adhaan Docker Services\nRequires=docker.service\nAfter=docker.service\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nWorkingDirectory=/home/USER_PLACEHOLDER/adhan\nExecStart=/usr/bin/docker-compose -f docker-compose-pi.yml up -d\nExecStop=/usr/bin/docker-compose -f docker-compose-pi.yml down\nTimeoutStartSec=0\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsed \"s/USER_PLACEHOLDER/$USER/g\" /tmp/adhan-docker.service | sudo tee /etc/systemd/system/adhan-docker.service > /dev/null\nsudo systemctl enable adhan-docker.service\n\necho \"✅ Setup voltooid!\"\necho \"\"\necho \"📋 Volgende stappen:\"\necho \"1. Herstart de Pi: sudo reboot\"\necho \"2. De Pi start automatisch in kiosk mode\"\necho \"3. Docker containers starten automatisch\"\necho \"4. Webpagina opent automatisch op http://localhost:5090\"\necho \"\"\necho \"🔧 Handmatige bediening:\"\necho \"- Alt+F4: Sluit browser\"\necho \"- Ctrl+Alt+T: Open terminal\"\necho \"- sudo systemctl status adhan-docker: Check Docker status\" "
}
]
}