From d9e8d9a9150c7597640755606d37146083fa0555 Mon Sep 17 00:00:00 2001 From: filoor Date: Tue, 27 May 2025 15:29:42 +0200 Subject: [PATCH] feat(gebedstijden): voeg gebedstijd offsets en UI aanpassingen toe Gebedstijd offsets zijn toegevoegd waarmee gebruikers tijdaanpassingen kunnen maken aan de tijden verkregen van de VUMG API. Dit biedt meer flexibiliteit door de mogelijkheid te geven om minuten toe te voegen of af te trekken van elke specifieke gebedstijd (Fajr, Zuhr, Asr, Maghrib, Isha). Het template voor instellingen is aangepast om deze nieuwe offset functionaliteit op een gebruiksvriendelijke manier toegankelijk te maken. Ook zijn er kleine correcties uitgevoerd om de seconden correct uit de gebedstijden te halen voor een betere verwerking. --- .lh/adhan-webapp/settings.json.json | 6 +- .lh/adhan-webapp/test_offsets.py.json | 22 ++++ adhan-webapp/__pycache__/app.cpython-311.pyc | Bin 0 -> 27769 bytes adhan-webapp/adhan_cron.py | 53 ++++++++- adhan-webapp/app.py | 112 +++++++++++++++++-- adhan-webapp/done | 4 + adhan-webapp/settings.json | 15 ++- adhan-webapp/static/hadiths.json | 40 +++++++ adhan-webapp/templates/settings.html | 60 ++++++++++ 9 files changed, 289 insertions(+), 23 deletions(-) create mode 100644 .lh/adhan-webapp/test_offsets.py.json create mode 100644 adhan-webapp/__pycache__/app.cpython-311.pyc diff --git a/.lh/adhan-webapp/settings.json.json b/.lh/adhan-webapp/settings.json.json index f258d79..73519e2 100644 --- a/.lh/adhan-webapp/settings.json.json +++ b/.lh/adhan-webapp/settings.json.json @@ -3,7 +3,7 @@ "activeCommit": 0, "commits": [ { - "activePatchIndex": 2, + "activePatchIndex": 3, "patches": [ { "date": 1748201503324, @@ -16,6 +16,10 @@ { "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, diff --git a/.lh/adhan-webapp/test_offsets.py.json b/.lh/adhan-webapp/test_offsets.py.json new file mode 100644 index 0000000..f697938 --- /dev/null +++ b/.lh/adhan-webapp/test_offsets.py.json @@ -0,0 +1,22 @@ +{ + "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}\") " + } + ] +} \ No newline at end of file diff --git a/adhan-webapp/__pycache__/app.cpython-311.pyc b/adhan-webapp/__pycache__/app.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..592f5f0e1b8fdb9c8c3d46b57088b70fe4193a65 GIT binary patch literal 27769 zcmd6Q32+-%nqD_<;vhf*ybpmCFHk&1owOvIw@%8IG?p#P%YoP+2?+$~1}Mo`P|J0B zc4$Ynrd`^YH7nO3&diwhXx8$SC#%WsCX(!#(M2R;-DU8ZzIAvhhf>QoAxwm5Ys=w9Z2fSVtt zJh)SKPf^s7zRhw7`rMQR!b&N{KqPlQ84{LjdJ0aELXK)K2`Hiq->VFvegQOr#1=Jm$_3;!3J6< z6oJ+Y#h{x7J7|O80BzjxYbnWlE2V3`mZlBkmI>uT#iZ(5W$v34s@9~@ykQ#EdHL6@ ziQBSa+*;($ugQJWniO0crr^xWy>3n1)(zv<=f&N;ChnFE<2I~Y^2RkOv~8F|Q(o@P zYvQ(V7`J8J++Ax@=-4oY*1X)etclyXVcfQLb8lahLf3{VbmZmUxh8J6$0l^0W4uMI zKssAfy*c|TbPHRr_2hoL;Lxh$?C09{DFt@v6WU>)J9sW(6+M2zBaVeU(=$GI$dk~E zo)>04!BD~=dIYcN84o4wL4+Bb5ChX=icdg%F`+*j4EVhhFNzpZxY2j{gh4>`kaybS z;uCx;NWqBcnGA?tw|_i60w65$Ao_jY27+c*7_$R!Roo->u?N?~~1C*#*!(}uthZt zl4G9x#8kU0vQOq;^atq$jl;RbB zd@2;03HEk&Ubt|fy}{h~*t;x?g#A& z6cF4mCbZ)|?@Tak>E6AyqkG4$j;@aG?rr19D18{u>1IOahMQA`ESYB! zm7vc655bUe=kkX~#3|S)4$?Meo(ZNbw>jgErqE)hP;ljzIj@wKOzgaJ6=t3Y)-1Oz zjF!o*(IZM%lohl1s%}mlQ6J|vb0PXxlScz5HqL26_S8Mzu05jpL+&kAZZ6=34*Zoc zS}Gv5an-Y&P&TKzqydj)*9-gw?xOlx?gH;B5AWLVcKbrk3m$L{uYV#SPNTzmoPinV z`9MH)3LfXAN8uH-BEsO_7Z|4?3Ei|OBzngaD!kHcjCa&(S-fzlS88^-@Ydgj2#+!miRauv4RQpq$iZHiEeMuGlmz% z*w-u?ns`w{3-*FK8pqMlA&d=SPoiMx;C%b5vj16LUTlJN3=j*>f?wPqO=DyKlh|H`wkO>h2oqB*SLeusLSf9JiLe zHuvh>E5CF3cNR3i)^XK!QAc#*d)3Pma@}^RYKL64W2JIaR1dO_AW0fn=!aqe;43=2o zj_chZI3>eQ*|0Na*!iGpQ@pY^UbPjOlfzMg^lX$KBL(DIpL~g9Rg2_t4c4NKUm9o~ zXy-m^Hx5>-KiXM2Sf>8Ch==>*GA(G%xS&IDHZGLowXks^Yb4Dc7jikqc5b8bA(F?z z1U|#3=J-$n@=G3P>8oK!gwIWVT!mRP{_+tU@waX+sJWn0I1$f1%klUVfP}#L%&GJ^ z4xFzJV+eh-$pZ*VwJzsV3mQRtRmC_SH>bKpsE}Q=IG%14AW0dq*X_$b;3vQHyxZ?o zLZL7F20c!Jc?;l-eLkOi$~lEjJ?+7;?(}&*6H^|~M93NTp7n!aPI~-Efr0`cdVIuB zC!H4pV4XCq`iOk+>~4Nf*XSE zT?{2OXGHKTLqbD*G-2M~H+bO0{^Mg$f{TdT&^BPX0k@FQiEh6Tm`>=%rvlz_kGK<$ z#9bgRb%LJ|_tEWRAVK2la53PAjNZEJc6NCRsMgmQAai zs-QL6y;53v#T(^c_g(Qtcgv;i3nMG`iYt4gWs=<`+g+<#gknK6#%$z9HqyMnoEjr|4cTP>yi8uhJxJlwZ6TF~`7?xj@6MGmRs zY`POiv!Gq-DF7dJ`{a?^^~9-cV3?K8y5Mf(bOin!iy=M{GNp2QRKAR%WI?{OX~31w zP`)m6@VnN4qG~XrY*3_%@awS#Kp<|8zr_0?@S|&nAqZd^lf0l6bXNhoT>4Q4BxV~> z)BIsR!x~c4fL`aP#H14iCj$ZhIm~RthnO~DM%CRhJ=25!raRB(TnTMB;P(VEr(Y-g#G1Cz`HAjNP*k0;$_FK7I^^ShE`qmCJ+_%-5e!c#-UQKQzPi_-)TaEqO z)we5(`@7V)yR>lUOkU~RW`nK@l&1R-D|6HM#xRtrBiwmDsG(^VCjO-nE}HJkh?PF* z+shpuk3+m1;m@Y~d+y{UO8Koh@nw2<64F3bu`7gi*6OZB7jJ*Um#N{KI+Za`Mo8?L0JJArE~-7ttrV zrzN6|=*}^qG^2%Ee~!JwIfLJvc@oHZ5;2JF8@?HQRU5qDHQ$q93F95+zQ^MbI&Bbt z&%K2%!io)CbJu{e6GK6$?7HrLfnIs9GXij;?9rOkny23DRrbzsoQ@_T}O0+U@AlcEs=zb3AI0PAz=uH#0i>hCe$=lDu72)*uz35%;U2n zq=_LWViKRF$j?z^Ys!Dx>xX~`Ok62c>efW%N!=K{!7=tYNL2;+QjX+Y3+#R@m6}p< z(TiZC_yykv?||e@Qy0rUS9P4hv9v3u-%M<>HG1jBGqL6&=BDXXXNOl zn8EeHzG-pSl|8TTyRz?|z4flWb$O>`?~(02^M~Wbm2bAa(Y7?VJSi3Lkc)TBABx+` z-!#8rUV3i1S+Z@FZCmFL0CtsCF11C)Wj-p(m90|g7P)lG@)@bL>nAML{)z`0bYVFf}++H7@zH9G^*-u>mojX-`cb-@_2yifNYM7W~G-dO`e=My+!gQR=IK4k$X8Y9Ara0eMGw+#GB*Y} zF#1qW@+gRB!=~QtU0vHd87^ZS;ay&=M>{3-)1K)w5QahU5(rF>0@Q_T*GPJf2mFCx zJB!@wbg4yXq`|n3``qps1_KkiL!Q}l9>2>dcH@!4X3WQrjvhTeMuMFKPl`R{&!%lU z$jzXFfJ8eWhCD(-4aSp&@pK6_Lq*k{1z#R1v}d4niQ%q}{$!SbEtPtJ?Sd(;&)uhmRE=lnM{Zg$EbZaf9ieq57_& zS~AqihT52+Hf}9`?c%E!UkP6hFKFVn;stHIq=EoqHzNx}aY$$iz!<=SEbs$a)WvNj zjE_7WJt)_7O13W9))iwX0mtr7tR;UizSQ{o*(+xyYn^PZiy7(^X^Tp`9mysMLw{SB zUx*cM#VHwjWJ6EP&=a?Aiz%mJTP*ivNKlLTa46!Gerta*ce~iwzejz$x}<-n`gS)@ z?wwlDoQ_K~80u=DE66TeEs^QAx!sO+Pa162973L01VVOh{rQ}b*FEMS!Y8qYpcC{0 zkedKRMp#8C6s%Xxb85jR6bZ$Goe6zQg|e%9bXxUSVG`)zRi{zfIqjToBauHLlROs0 zU#^a5ezWOArI9t$gu0BrZg#+(HJdz3st|VMsxYE7xUMD+{>FaSe_<*^X@Ov!Lx{g!UdxF!`!_v@rmgH%lZcFc4gnJPdC=A1K! zNI{i6gxZLCJvJz8nllQ{ITL2Qb#vxRX3TimHNyrYd_)y7Mob%if%Um8S=f9P%+%Eo z-Z=uv7AXNB>Iz)&_?#&Xs2f^FCd%6HJu7-4D+|p|J2T3Ju&J@n*(f+0`<;!?h7FBE zd*gI_pV_IM%QhCYF)4*}h?lTd#`=v@$m zWScSSgg$UC6adFg82o|rikCs~j5C+ZoX{U+xxAP#3@f=n$9BXmj!z}DeM&Az05mlR zXZ;?cz84d^K9)r=CiB3E;fBP`J(-76jsMgcf9L+o@qc-L z;r`3BC2RbDh^N1I|J7Og%Hr3M);sa{@4u22=l(0R)B*CJCF8~4RkHmcel5N{OXxcO zVf?4@WlB}KMakm-irrFS;~(B%pz_R;?lpe>{sPPC{!57SKGGtAZ`v2tx)y&IZ_{vO z7BW$&h7#K2?g_UTwj6Vx@shN(@4^MQFLQeWQW$U8dT@5yEx0q!vpiUcg!Y*Gtouw@ ze|*Z_e8%lh=#RN61|0BFk{q0xr39YxHVf{luqAnmZ~d%$>LKs^lmOins|r>LKfLBnHBlF)k5*Px6OJ-{3gDU*0Up?T2*ZI*T##tKsjHTx_>fiad?7J9LW zluUM+z#cr}GI^R=o?|Qp2*;E=Bm`BL$3H2OjwxYGmJX3pQVF~3iI7vaVC zh%k8=4d4nSN>XK(WuaLXm4T_e#2W}j$S7Edp%BV{WAWv-S2`|t%nx8*QCjil={HVC z+oh5&xuk1;G!75n8@_0-RN5hzcFZ4LHE@oa<<=V);zi}rlIs9ErP0*WM`En`L`5 z&ER%3@``>zy>KjE(R{C>^KM1wb@laQQpGO0V%I|9LSfuqbI-o{u6?s)Z*s~xej37pG&ZW!fV`|os1yAI1+jwqh7Cr`;wjwRh?6AR{e#pbKEvC;{g z%bhn`<=%sLo|1Y;<<_H$XYAN%`ItNDE}d8~EtnKhpqg-CiZC#^{d!%ja63-PutPTN zh#7Xo%Lb7{={Aa$`eP_ikBD%fovU2&s@8aUL%gg$US9QG^LNbAlTvxRT;9HF(wXr> z6r$AyiP_!W)z1y?=04tS9NMh@nYwhSR{gVDE!+?J&K$f*eS+b|4?%OySn`kuq=a)k zekw0Fr^ZhcqIk(8FRV7(bR+MXE|kU<`34MgdSIw56qHfWWvkY5$N4!!#PC&&BQUu% zMAOJCRc^ZGmQTo%3IbgftUr+?beoGXHw>x$${}@MIi&t8hcx7e6bi0tb4@bN(xAtV z+?I%Dq1jXj7;qT#+TRFVou&B9gv?D1xV?zscGH|WVvZP-@3!wYRFQ&+1_%^5R4}0p)&6FnU1ugGpxw$j zOK5Y(M=(b$xnBt>jG@c1T(U5o4z3x5D_G_VLycLn3mN7u#B2t0qX?`QH6Sz!9Ls*MQkRxc|@M?}UvojPYFTmMOK!5~h-3eV%k^D>Y(F&e3vy`K^poFy|c zJpGL$BP24($V>9TiTFcGQsaZ98R|B-5BNEuIp=vXm;oUoiNah~r39Ih8dpC4W+bV`Nwa$)`a$cnAzb?X)D{DD=C zQ#-^nfz4aHq{0Tdu;Cw&&n(qlo?FlW#*|dNx&Mv*OQ#|0b@a%N9+7`0w6lgf6>WxLlz!B|Pq0A#`ZYa3@RyXqT zV{}p~?2rpPP{7KjdzEc>E8C>X4!IKMqWS_1;vlaaTo_zzh+FN8tXoRs)y~BN zh1g0KwX1sg{o2S?)GVF8SJQR3rc0{XD%Wh4%6sJUp6h*b`HqDHE3odt(~i3}9a2q~ zj4IH61SJeE9!Bg(4|!9QsV;tzC^jngn&o8W>W?&p129S zq(Rv*7+Z5PJOTaU5Kn+Y$C(cD^8+iU%B4N=#tu3+)yL~w;w{_abz9;MZSl>m@LaVQ zn7cmXK)xVCHbh+vVBAs-l?<12KQA{9?@|A}-Zs2b{qvn#xF1?NF`W!~d_Gv5!r((a zGIS!LdGhG-6J+QM8X=omihK8k)UBh(gvt{UHU;BuVSrT-F)KN$(UnXDN>B-k0fUqVD&Lu043*eI> zcVMIxl$17zp~+YOA_l9^hIwcKRlvP6N?^ob_1Z9oE?;eo7>}sm`fo9s)xKFZHm`Z3 z=0~(~mhCReU|}J%#Au=Ntdt9LYY9UZbvE!hn+8#U5Ku8+v*n5%$$D))TQ|RH16#ME z_3MrAe=)QvQ?7io83=eeA;T%S~CM-q$c;xKo4{Tz^)}z69BtSbB3IhDp^WZ z5yN`%8N@SOGF*NEP!HD(#0!z=BzXvV>yeIgq4v}>^pG07E$Fze)&2l5;D-bS*a5(| zX*9={gG4w~ozEvg-sC3H8K3W9=I|^+K7mmqBtMzuf58$+(eneb`+VvD`)v{ab=Bog z6hRf%kf{*p1^0Pct^n*Aynyutu=-PVbcw@AAc(#PjKRbg4~=^W>5K=aXZD35W6g{Y z9ecyKM+JS}YF`XYDJGDJ_%xA|M4lz`9FfBypArcAl%|B@DI%wd93eug>jZy6d>+?# z`Gk%zkw26ufSw$xZkR!d=kVmAPEp1^)OC_yr}$HfJ4VC@GD|jAtKa?opEysD!6gMD zLrRjJ0^0(WiO#UG%}J{{W`mHbQScl;g%clp2kV2OvS-N!~P!Dqyxi0kc#%@xKtE z4}~n*(XNW=Kte-RO{ix@UxH6+38{;x!7BTn66Wl0Nc>v__^B*oDm>{6t^)@};HHyZTL^arIi)15?>sJFo7EnIO)x z6zp0a{jemwXs$=tBg)c!r+^}TXaA3UCy%$rvlwtVmK^(whxFFa75x(9Wxuz-yz;pF(xqA14 zVX;gyRIJpsz?R)7*F6Rg(x`p{i`w?6U9vRF782bRv@aK}m~EF2EKWuF<+_-;O)|I1 z<~BH>CoO1aK^TE;T|ql+>$3eaPctq8sOyD-?QGdw%~#uErY0cKg8lp_m2JzO} z${h=b;^oe0nOyDyQnu^|G$y*JiI+}%->it`t`92Ln}$2p@)J)dWp&RAiepi|s?rqg z=U2*|FuXqw8D04{seBtC`C{LSqas#$>c%z@oOinae6Qk?9M8#)=VI*qa;40PQX_?I z%3=;v%we22yOpct7?B+#u{CEBqazKtV6$Q?U$RQp7TMYoGqijHto}G5^QNwNT@xl6 z=9bSmkS~akh_NNuicawJ`tlK-`WHIQh*AFw3lDmyxa)vg^-Hz!K%4fLmXZU_+Fv$n z;SQUyYR=oKOnP%5Il*xT$q9Ho8j@$j@%$klBLzR|QYrIfVzgM`MzhuIMQuhBA0+49 zU*cIcMyDV_9Z0p)6H8O^;*M7yzx;SiQ>iRzD_|v`hUHRDxe3m)a{nz-$zM$Hf203~ zUONXuV)BrN%z)!r@%DfZ><3wtygt9mclITmC48(GoMzQJ&AI5N4C2mm+^k^Ix|0Bo= z;1hjtc6{6u42loo@vchzJ6sZ4Sfm8RPrpDTyDSOI1TDjbP%F9UmUJ&{=_Cz_c_SgS zZBA%{9?vdgBGiutXr0JQLSWclC4b(8d~7A8(~`M5ZnnHO{Oa&x_bUf3AAoRTeO6AP4!(NumBW`0 zFC1PqAwiZZBcD ztfkTIFxq?JgB>3tcrQ-L`j~8e?8fn!^@*4v|4i~!#D^=`kLG@9-+-FC#r0M8H>qz| znsIZxNz>n|zul@PcRNq+4hP&Hsf`1>)E`-#13l`G+Ie#KXhFkf#($FQ%W_x{u^+~Q z{@+<=cq=4`PC)CK0Bk#zm5sE5C$(^omixHJL$d&h=|z0twv;jZ_P}kM=#N;N=Hts=HuLG^b_rW)B)6Vucv)wijB6o$93>6r)fEcRAu(Q62XF<3Bsjts)F!VN~>Si^P! ztM5}wVQ6)}cnAd@4p;Tj;+S+SX5KLAInQQ!;@=~P_X@s<6XC+#aAB(xCgoWRY{P}A zT?c5U80>_3CL5U`G7Sc?QG)md(h~m{$f(OC(ux?7L&9v9CejQ~d=dl}N8lCW-_ZS2 zMABoBs77d)Mj3;QaHr}*OL-L21Nx?Do~2B&jBHlM+C(fw_&xXqc@T_2I_ugo2;%x@ z-gsuow|rPC*)5msUNC~8l$KvPNyZ4@Z(Tl{@?NnPUB2+zrB^R4!ETZayb0@{=2z^M z(b?F}6S1mq;FRo7%l4;Z&pa2ilLX)sYbk{L@v?zsW2|gIIpg-O=)su13+Jj{Lt=f9 z&p3_E^aT;z7MQ+-C|(hk|Nk6B8qiQL^>h6-SbtMNw8l74tiIjs9I&WA((`bCWYL0# zb)8IElfxXaCykQ!xil+HPDkfd?(cVU8(z)Ss7SO`n zdLs+ad<48U z2R&Xx8`d(LJFs}!+=0c*X6P|h+KwPe-`?o&8PIVb>5Kzg)gRf)2igH|wQz@v6pTk7 zVY~9BFqMlVHE*$jy>*rWXx)7l(QUGXYfYEnRCXKAT%|dy8-gB0SC1ZjlR3!J(s*Pxc$}rji z>u5+ElstqgR=;Z6O946(HFDGCLOvK0ZHnmDH%Ve~YqRr1{5%ke_~$Sb*itz{51f7* z8C@ENhbpw%qw?9bc9)xHIse`e3Hp-B!2mwRMraT=5R; z-@;-IQ5DhoY2T;KYkONxss^D!XpCk}5wdEO_Z^^ZR6sjw#T!|~v8@jv6j^jn{jcKg#ibW4nuS&XlK_sToY z!J+45Aa6zy0gtGIQ_$d+#m#iE6p@FHt zT7s@rl}s4!vHJjt?1JI45t_S^)`;d)qDR@Uh&D57bFv8-n>4{>%Z^z26DNjF*c{1A zReFI4ffek!s7MaV!4sPFJV&N z=NOs2C3T4GosQE(OHvvMb=fRbjD@UHW63#RFr$uCRuO+rQLyAUFf&F9G6PK&$;I|Y zQYLW(SZNZMbtF}0?2{W)J~^=grF;Ru;PV(9X-3CsZS#ldZ&kB*?c}bs^3AC?rm(?W zDOSwNrCkfAlxfw|(NmJ6OLlZE6ntWLzW(@?#}^Dp&Fpw>&#QZwMAFnGlfFh?uKrzP7q z*|v>V?$t2+_O|P0sbsHQvUkC_QnWd`Un**si`o}-53q3&S6)#28Igs-Rh8ZH*n_Ge zS}Zt(^M*sYf-V|XY~@$XOV40+o~>K5b<4JHIN~Rqd6k_R3Xz7qNi13TE-kJ$LOuUz(z0eB4nNeM)jP zEgoU2p@|zpta1Y9oh`~W_FU3Ka!ksO$rw8yIO^{?Tz4I=1hW2WtH)uP5sM8=RuSDS6UwKUzxO^N$Aej&SL*fvMQjQ(??qF@M9)-0Axq^ zPaS!nnHFMaJxzszSqcW}HPDuaoI+WSy)vf;Bvt1v3WxPF26`o%yvn%zM*3~Bb}?LVx7M86k#}*h{Wv5Z`$TC&t12ds238Pr~0HfG7Q$AO9xOpv% zVk_E{HZ)GGQKJoLJy|e^>~t8ofhdmp1UA(r9|AXG8NTp@F5riuswZKgW$9Z0A_X6k*g;v5uS68PQG=i07yL^Q z!VXRX45`6?{V}_=e8I#9=Hh}wQ0Eb)p}EL%h<{Ks^8HAxW&|hfB-j;n(Wnfk#v6TD z;V)I~ldJaS4W|V~9zO1DdB^g$K+E#2>1 z-m_fy-#jC=9FSWM+-o^zizluC)Mwf>-S&*oU0Uo z#Z|g^D5{YhjWI_fP|3E(VngG1o{^8Zaiz0Gz?lp}gD)FFsdhYSrOT5=TMRQXC@x*pA~6A!-~Qz zH6R6M)*p`6Gu6mr=3jF-O79L5{EZJsB^!y*^Ho!@D&4<^Wp0|&Wiv?(Su{`@BRa7C zJgE;`IAogBUD93l3GA9-jX7)=vZw5QMDZh$KwFKh$JWIX;-H&4rTFm%3Qh9;s>%cBIYYw|r42W-s>~EqAdMl0$NIV9VKDX1W?T~FdVr$M6``bx#1_<#P_bVIuQP1+6v}LcnWpAu( zL^si{Z)aJxEiaY@-;{w6F*X!`K+@Sv@uu)^}kWcl>=yie=i)bt*ves2Qxq zcl9K+%tlJ2qO%N{8L?vOOJB00cxGy9hE*6$VQT6@dP-6xZ1u`^^G_78CGljIp)Aoy z5lB`tHkMFhkD-LcJwdoFX^q8p^=JD=!;=KVOz+L4F0_+{$fPWK_n9Euq7q4wu6}Gx zJVrtLi7*w^-;j$zDP}H1!=BQ+nH=aM-7-Uxd*mYfV)08NWQ-;1h>-0F(~B#rD3Yfz zV8psAYiewOH0u}1z9jQ19vb#c2ZULlXP-EN2ROOlAq~gDP?qQ8Trl?a&p1~X`#NWw ztBK{Fan2D-opEkcEcbk%GtGMz_Wy3+<-oievJjP4=8IQVY98BMf_$dtRQ9xw8IQkR z@lr+1)FAPVGT*qW;`u=WL!cD2DdVT(itJbPY=@;|S5JO->^o!2$!$DuJR`La%k9Hb z&4^qxa%YoddsenRJ8y|I%K_RPuK()DcaMJO=yLzHk@t_jcl5@7sclGZ8;aQbLYDGVNnXW&c>TG-{w^T{7=l zRhfA*njlKyTQh#usR;Wd9?4YF*8uPfLIJDNKF0LdP$luzGQuEWEd{KlfHi5KOu*{s z`REiCp;P8NF+X5MAW9LsGJZ{|BJ7fQhm3DgRm(%{1wsK!(mqe58X;z?T`pZ_wd now: @@ -256,6 +299,13 @@ def instellingen(): settings['night_start'] = settings.get('night_start', '20:00') settings['day_start'] = settings.get('day_start', '07:00') settings['volume'] = settings['volume_day'] + + # Gebedstijd offsets + settings['fajr_offset'] = int(request.form.get('fajr_offset', 0)) + settings['zuhr_offset'] = int(request.form.get('zuhr_offset', 0)) + settings['asr_offset'] = int(request.form.get('asr_offset', 0)) + settings['maghrib_offset'] = int(request.form.get('maghrib_offset', 0)) + settings['isha_offset'] = int(request.form.get('isha_offset', 0)) settings['zones'] = request.form.getlist('zones') settings['audio_clip'] = request.form['audio_clip'] @@ -345,12 +395,15 @@ def debug(): data = res.json()[0] gebedstijden = { - "Fajr": data.get("fajr_jamah", "00:00"), - "Zuhr": data.get("zuhr_jamah", "00:00"), - "Asr": data.get("asr_jamah", "00:00"), - "Maghrib": data.get("maghrib_jamah", "00:00"), - "Isha": data.get("isha_jamah", "00:00") + "Fajr": data.get("fajr_jamah", "00:00")[:5], # Haal seconden weg + "Zuhr": data.get("zuhr_jamah", "00:00")[:5], # Haal seconden weg + "Asr": data.get("asr_jamah", "00:00")[:5], # Haal seconden weg + "Maghrib": data.get("maghrib_jamah", "00:00")[:5], # Haal seconden weg + "Isha": data.get("isha_jamah", "00:00")[:5] # Haal seconden weg } + + # Pas offsets toe op gebedstijden + gebedstijden = apply_prayer_offsets(gebedstijden, settings) except Exception as e: print("❌ Fout bij ophalen gebedstijden voor debug:", e) # Fallback tijden voor testing @@ -361,6 +414,9 @@ def debug(): "Maghrib": "17:30", "Isha": "19:00" } + + # Pas ook offsets toe op fallback tijden + gebedstijden = apply_prayer_offsets(gebedstijden, settings) return render_template('debug.html', gebedstijden=gebedstijden, @@ -502,7 +558,41 @@ def sonos_stop(): @app.route('/quran') def quran(): """Quran speler pagina""" - return render_template('quran.html') + settings = load_settings() + gebedstijden = {} + + try: + res = requests.get(VUMG_API) + res.raise_for_status() + data = res.json()[0] + + gebedstijden = { + "Fajr": data.get("fajr_jamah", "00:00")[:5], # Haal seconden weg + "Zuhr": data.get("zuhr_jamah", "00:00")[:5], # Haal seconden weg + "Asr": data.get("asr_jamah", "00:00")[:5], # Haal seconden weg + "Maghrib": data.get("maghrib_jamah", "00:00")[:5], # Haal seconden weg + "Isha": data.get("isha_jamah", "00:00")[:5] # Haal seconden weg + } + + # Pas offsets toe op gebedstijden + gebedstijden = apply_prayer_offsets(gebedstijden, settings) + except Exception as e: + print("❌ Fout bij ophalen gebedstijden voor quran pagina:", e) + # Fallback tijden + gebedstijden = { + "Fajr": "06:00", + "Zuhr": "12:30", + "Asr": "15:00", + "Maghrib": "17:30", + "Isha": "19:00" + } + + # Pas ook offsets toe op fallback tijden + gebedstijden = apply_prayer_offsets(gebedstijden, settings) + + return render_template('quran.html', + gebedstijden=gebedstijden, + settings=settings) if __name__ == '__main__': app.run(host='0.0.0.0', port=80) \ No newline at end of file diff --git a/adhan-webapp/done b/adhan-webapp/done index d430401..12436d6 100644 --- a/adhan-webapp/done +++ b/adhan-webapp/done @@ -1,3 +1,7 @@ Mon May 26 16:08:33 CEST 2025: Hadith auto-update functionaliteit toegevoegd - JavaScript code toegevoegd om elke 30 seconden een nieuwe hadith op te halen via /api/hadith endpoint Mon May 26 16:19:32 CEST 2025: Instellingen pagina design aangepast - Hetzelfde design als rest van applicatie met theme ondersteuning, Material Icons en consistente styling Mon May 26 18:17:57 CEST 2025: Tijdzone probleem opgelost - Container gebruikt nu Nederlandse tijd (18:17), volgende test bij Maghrib om 21:45 +2025-05-27 11:55:10 - Oude volume regel verwijderd uit settings.json - alleen volume_day en volume_night behouden +2025-05-27 14:07:15 - Gebedstijd offsets toegevoegd - kan nu minuten toevoegen/afhalen van VUMG tijden +2025-05-27 14:16:04 - Offset bug gerepareerd - seconden weggehaald van VUMG API tijden zodat parsing correct werkt +2025-05-27 14:24:39 - Quran pagina gerepareerd - gebedstijden variabele toegevoegd aan template diff --git a/adhan-webapp/settings.json b/adhan-webapp/settings.json index c05ea89..575a11b 100644 --- a/adhan-webapp/settings.json +++ b/adhan-webapp/settings.json @@ -1,13 +1,18 @@ { - "volume": 15, - "volume_day": 15, - "volume_night": 8, - "night_start": "00:00", + "volume_day": 10, + "volume_night": 4, + "night_start": "23:50", "day_start": "07:00", + "fajr_offset": 30, + "zuhr_offset": 0, + "asr_offset": 0, + "maghrib_offset": 0, + "isha_offset": 0, "zones": [ "Keuken", "Slaapkamer" ], "audio_clip": "adhan1.mp3", - "mute": false + "mute": false, + "volume": 10 } \ No newline at end of file diff --git a/adhan-webapp/static/hadiths.json b/adhan-webapp/static/hadiths.json index 807bf82..de52884 100644 --- a/adhan-webapp/static/hadiths.json +++ b/adhan-webapp/static/hadiths.json @@ -99,6 +99,46 @@ { "text": "Allah zal voor degene die Hem vreest een uitweg maken en hem voorzien van waar hij het niet verwacht.", "bron": "Koran 65:2-3" + }, + { + "text": "Wie een weg bewandelt om kennis te zoeken, Allah zal voor hem een weg naar het Paradijs vergemakkelijken.", + "bron": "Sahih Muslim" + }, + { + "text": "Degene die een moslim verlost van een wereldse zorg, Allah zal hem verlossen van een zorg op de Dag des Oordeels.", + "bron": "Sahih Muslim" + }, + { + "text": "Allah strekt Zijn Hand uit in de nacht zodat de zondaar overdag zich kan bekeren, en Hij strekt Zijn Hand uit overdag zodat de zondaar in de nacht zich kan bekeren.", + "bron": "Sahih Muslim" + }, + { + "text": "Voorwaar, met moeilijkheid komt verlichting.", + "bron": "Koran 94:6" + }, + { + "text": "Wie het pad van vergiffenis bewandelt, Allah zal hem vergeven.", + "bron": "Sahih al-Bukhari" + }, + { + "text": "Allah is mooi en houdt van schoonheid.", + "bron": "Sahih Muslim" + }, + { + "text": "Niemand van jullie gelooft werkelijk totdat hij voor zijn broeder wenst wat hij voor zichzelf wenst.", + "bron": "Sahih al-Bukhari & Muslim" + }, + { + "text": "Wanneer Allah van een dienaar houdt, roept Hij Djibriel en zegt: β€˜Voorwaar, Ik houd van die-en-die, houd daarom ook van hem.’", + "bron": "Sahih al-Bukhari" + }, + { + "text": "Een moslim is de broeder van een moslim. Hij doet hem geen onrecht aan en laat hem niet in de steek.", + "bron": "Sahih al-Bukhari & Muslim" + }, + { + "text": "Zeg het goede of zwijg.", + "bron": "Sahih al-Bukhari" } ] } \ No newline at end of file diff --git a/adhan-webapp/templates/settings.html b/adhan-webapp/templates/settings.html index 0d30147..846bfeb 100644 --- a/adhan-webapp/templates/settings.html +++ b/adhan-webapp/templates/settings.html @@ -121,6 +121,66 @@ +
+ +

+ Voeg minuten toe (+) of haal af (-) van de VUMG gebedstijden. Bijvoorbeeld: +30 voor 30 minuten later, -15 voor 15 minuten eerder. +

+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ +
+
+