From 9da7adda9228d545c1f36795f76f6659d095edcc Mon Sep 17 00:00:00 2001 From: Dispatcharr Date: Sat, 22 Feb 2025 20:43:55 -0600 Subject: [PATCH] Pre Alpha v4 Added login page Added login/logout buttons Added m3u settings Added stream profiles to channels and streams Added ability to add individual stream outside of m3u file Added ability to add youtube live links as a stream source Deleted migrations Deleted pycache folders Changed HDHR to get ip dynamically --- .gitignore | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 123 -> 0 bytes .../__pycache__/admin.cpython-310.pyc | Bin 792 -> 0 bytes .../__pycache__/api_urls.cpython-310.pyc | Bin 756 -> 0 bytes .../__pycache__/api_views.cpython-310.pyc | Bin 4582 -> 0 bytes .../accounts/__pycache__/apps.cpython-310.pyc | Bin 458 -> 0 bytes .../__pycache__/forms.cpython-310.pyc | Bin 2117 -> 0 bytes .../__pycache__/models.cpython-310.pyc | Bin 1332 -> 0 bytes .../__pycache__/serializers.cpython-310.pyc | Bin 1529 -> 0 bytes .../accounts/__pycache__/urls.cpython-310.pyc | Bin 748 -> 0 bytes .../__pycache__/views.cpython-310.pyc | Bin 4578 -> 0 bytes apps/accounts/migrations/0001_initial.py | 47 -- .../__pycache__/0001_initial.cpython-310.pyc | Bin 2484 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 134 -> 0 bytes apps/accounts/urls.py | 11 + apps/api/__pycache__/urls.cpython-310.pyc | Bin 1256 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 123 -> 0 bytes .../__pycache__/admin.cpython-310.pyc | Bin 1115 -> 0 bytes .../__pycache__/api_urls.cpython-310.pyc | Bin 741 -> 0 bytes .../__pycache__/api_views.cpython-310.pyc | Bin 4977 -> 0 bytes .../channels/__pycache__/apps.cpython-310.pyc | Bin 460 -> 0 bytes .../dashboard_urls.cpython-310.pyc | Bin 341 -> 0 bytes .../dashboard_views.cpython-310.pyc | Bin 405 -> 0 bytes .../__pycache__/forms.cpython-310.pyc | Bin 1145 -> 0 bytes .../__pycache__/models.cpython-310.pyc | Bin 3594 -> 0 bytes .../__pycache__/serializers.cpython-310.pyc | Bin 1679 -> 0 bytes .../__pycache__/signals.cpython-310.pyc | Bin 122 -> 0 bytes .../__pycache__/tasks.cpython-310.pyc | Bin 120 -> 0 bytes .../channels/__pycache__/urls.cpython-310.pyc | Bin 390 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 772 -> 0 bytes .../__pycache__/views.cpython-310.pyc | Bin 1801 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 134 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 143 -> 0 bytes .../remove_duplicates.cpython-310.pyc | Bin 886 -> 0 bytes apps/channels/migrations/0001_initial.py | 63 -- .../__pycache__/0001_initial.cpython-310.pyc | Bin 2193 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 134 -> 0 bytes apps/channels/models.py | 9 +- apps/channels/serializers.py | 12 +- apps/channels/views.py | 5 +- .../__pycache__/__init__.cpython-310.pyc | Bin 114 -> 0 bytes .../__pycache__/admin.cpython-310.pyc | Bin 155 -> 0 bytes .../__pycache__/apps.cpython-310.pyc | Bin 409 -> 0 bytes .../__pycache__/models.cpython-310.pyc | Bin 1818 -> 0 bytes .../__pycache__/urls.cpython-310.pyc | Bin 419 -> 0 bytes .../__pycache__/views.cpython-310.pyc | Bin 2499 -> 0 bytes apps/dashboard/migrations/0001_initial.py | 46 -- .../__pycache__/0001_initial.cpython-310.pyc | Bin 2079 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 135 -> 0 bytes apps/epg/__pycache__/__init__.cpython-310.pyc | Bin 118 -> 0 bytes apps/epg/__pycache__/admin.cpython-310.pyc | Bin 1070 -> 0 bytes apps/epg/__pycache__/api_urls.cpython-310.pyc | Bin 631 -> 0 bytes .../epg/__pycache__/api_views.cpython-310.pyc | Bin 2620 -> 0 bytes apps/epg/__pycache__/apps.cpython-310.pyc | Bin 432 -> 0 bytes .../dashboard_urls.cpython-310.pyc | Bin 322 -> 0 bytes .../dashboard_views.cpython-310.pyc | Bin 1385 -> 0 bytes apps/epg/__pycache__/models.cpython-310.pyc | Bin 1442 -> 0 bytes .../__pycache__/serializers.cpython-310.pyc | Bin 1295 -> 0 bytes apps/epg/__pycache__/tasks.cpython-310.pyc | Bin 3389 -> 0 bytes apps/epg/__pycache__/urls.cpython-310.pyc | Bin 302 -> 0 bytes apps/epg/__pycache__/views.cpython-310.pyc | Bin 1375 -> 0 bytes apps/epg/migrations/0001_initial.py | 38 -- .../__pycache__/0001_initial.cpython-310.pyc | Bin 1297 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 129 -> 0 bytes .../hdhr/__pycache__/__init__.cpython-310.pyc | Bin 119 -> 0 bytes apps/hdhr/__pycache__/admin.cpython-310.pyc | Bin 467 -> 0 bytes .../hdhr/__pycache__/api_urls.cpython-310.pyc | Bin 823 -> 0 bytes .../__pycache__/api_views.cpython-310.pyc | Bin 4695 -> 0 bytes apps/hdhr/__pycache__/apps.cpython-310.pyc | Bin 612 -> 0 bytes apps/hdhr/__pycache__/models.cpython-310.pyc | Bin 656 -> 0 bytes .../__pycache__/serializers.cpython-310.pyc | Bin 699 -> 0 bytes apps/hdhr/__pycache__/ssdp.cpython-310.pyc | Bin 2301 -> 0 bytes apps/hdhr/__pycache__/urls.cpython-310.pyc | Bin 815 -> 0 bytes apps/hdhr/__pycache__/views.cpython-310.pyc | Bin 4691 -> 0 bytes apps/hdhr/migrations/0001_initial.py | 23 - .../__pycache__/0001_initial.cpython-310.pyc | Bin 786 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 130 -> 0 bytes apps/hdhr/ssdp.py | 42 +- apps/m3u/__pycache__/__init__.cpython-310.pyc | Bin 118 -> 0 bytes apps/m3u/__pycache__/admin.cpython-310.pyc | Bin 2226 -> 0 bytes apps/m3u/__pycache__/api_urls.cpython-310.pyc | Bin 756 -> 0 bytes .../m3u/__pycache__/api_views.cpython-310.pyc | Bin 2778 -> 0 bytes apps/m3u/__pycache__/apps.cpython-310.pyc | Bin 581 -> 0 bytes .../dashboard_urls.cpython-310.pyc | Bin 305 -> 0 bytes .../dashboard_views.cpython-310.pyc | Bin 1582 -> 0 bytes apps/m3u/__pycache__/forms.cpython-310.pyc | Bin 1889 -> 0 bytes apps/m3u/__pycache__/models.cpython-310.pyc | Bin 5052 -> 0 bytes .../__pycache__/serializers.cpython-310.pyc | Bin 1535 -> 0 bytes apps/m3u/__pycache__/signals.cpython-310.pyc | Bin 714 -> 0 bytes apps/m3u/__pycache__/tasks.cpython-310.pyc | Bin 7467 -> 0 bytes apps/m3u/__pycache__/urls.cpython-310.pyc | Bin 285 -> 0 bytes apps/m3u/__pycache__/views.cpython-310.pyc | Bin 1572 -> 0 bytes apps/m3u/migrations/0001_initial.py | 50 -- ..._m3uaccount_user_agent_delete_useragent.py | 23 - .../__pycache__/0001_initial.cpython-310.pyc | Bin 2304 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 129 -> 0 bytes core/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 189 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 229 -> 0 bytes .../__pycache__/celery.cpython-310.pyc | Bin 390 -> 0 bytes .../__pycache__/celery.cpython-312.pyc | Bin 580 -> 0 bytes .../__pycache__/settings.cpython-310.pyc | Bin 2712 -> 0 bytes dispatcharr/__pycache__/urls.cpython-310.pyc | Bin 1686 -> 0 bytes dispatcharr/__pycache__/wsgi.cpython-310.pyc | Bin 351 -> 0 bytes dispatcharr/settings.py | 2 +- dispatcharr/urls.py | 2 +- docker/docker-compose.yml | 15 +- templates/base.html | 14 +- templates/channels/channels.html | 563 +++++++----------- templates/channels/modals/add_stream.html | 41 ++ templates/channels/modals/edit_channel.html | 165 +++-- templates/channels/modals/edit_stream.html | 42 ++ templates/login.html | 46 +- templates/m3u/m3u.html | 266 ++++++--- 114 files changed, 702 insertions(+), 825 deletions(-) delete mode 100644 apps/accounts/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/accounts/__pycache__/admin.cpython-310.pyc delete mode 100644 apps/accounts/__pycache__/api_urls.cpython-310.pyc delete mode 100644 apps/accounts/__pycache__/api_views.cpython-310.pyc delete mode 100644 apps/accounts/__pycache__/apps.cpython-310.pyc delete mode 100644 apps/accounts/__pycache__/forms.cpython-310.pyc delete mode 100644 apps/accounts/__pycache__/models.cpython-310.pyc delete mode 100644 apps/accounts/__pycache__/serializers.cpython-310.pyc delete mode 100644 apps/accounts/__pycache__/urls.cpython-310.pyc delete mode 100644 apps/accounts/__pycache__/views.cpython-310.pyc delete mode 100644 apps/accounts/migrations/0001_initial.py delete mode 100644 apps/accounts/migrations/__pycache__/0001_initial.cpython-310.pyc delete mode 100644 apps/accounts/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 apps/accounts/urls.py delete mode 100644 apps/api/__pycache__/urls.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/admin.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/api_urls.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/api_views.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/apps.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/dashboard_urls.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/dashboard_views.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/forms.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/models.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/serializers.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/signals.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/tasks.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/urls.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/utils.cpython-310.pyc delete mode 100644 apps/channels/__pycache__/views.cpython-310.pyc delete mode 100644 apps/channels/management/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/channels/management/commands/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/channels/management/commands/__pycache__/remove_duplicates.cpython-310.pyc delete mode 100644 apps/channels/migrations/0001_initial.py delete mode 100644 apps/channels/migrations/__pycache__/0001_initial.cpython-310.pyc delete mode 100644 apps/channels/migrations/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/dashboard/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/dashboard/__pycache__/admin.cpython-310.pyc delete mode 100644 apps/dashboard/__pycache__/apps.cpython-310.pyc delete mode 100644 apps/dashboard/__pycache__/models.cpython-310.pyc delete mode 100644 apps/dashboard/__pycache__/urls.cpython-310.pyc delete mode 100644 apps/dashboard/__pycache__/views.cpython-310.pyc delete mode 100644 apps/dashboard/migrations/0001_initial.py delete mode 100644 apps/dashboard/migrations/__pycache__/0001_initial.cpython-310.pyc delete mode 100644 apps/dashboard/migrations/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/admin.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/api_urls.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/api_views.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/apps.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/dashboard_urls.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/dashboard_views.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/models.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/serializers.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/tasks.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/urls.cpython-310.pyc delete mode 100644 apps/epg/__pycache__/views.cpython-310.pyc delete mode 100644 apps/epg/migrations/0001_initial.py delete mode 100644 apps/epg/migrations/__pycache__/0001_initial.cpython-310.pyc delete mode 100644 apps/epg/migrations/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/admin.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/api_urls.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/api_views.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/apps.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/models.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/serializers.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/ssdp.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/urls.cpython-310.pyc delete mode 100644 apps/hdhr/__pycache__/views.cpython-310.pyc delete mode 100644 apps/hdhr/migrations/0001_initial.py delete mode 100644 apps/hdhr/migrations/__pycache__/0001_initial.cpython-310.pyc delete mode 100644 apps/hdhr/migrations/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/__init__.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/admin.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/api_urls.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/api_views.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/apps.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/dashboard_urls.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/dashboard_views.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/forms.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/models.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/serializers.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/signals.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/tasks.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/urls.cpython-310.pyc delete mode 100644 apps/m3u/__pycache__/views.cpython-310.pyc delete mode 100644 apps/m3u/migrations/0001_initial.py delete mode 100644 apps/m3u/migrations/0004_alter_m3uaccount_user_agent_delete_useragent.py delete mode 100644 apps/m3u/migrations/__pycache__/0001_initial.cpython-310.pyc delete mode 100644 apps/m3u/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 core/migrations/__init__.py delete mode 100644 dispatcharr/__pycache__/__init__.cpython-310.pyc delete mode 100644 dispatcharr/__pycache__/__init__.cpython-312.pyc delete mode 100644 dispatcharr/__pycache__/celery.cpython-310.pyc delete mode 100644 dispatcharr/__pycache__/celery.cpython-312.pyc delete mode 100644 dispatcharr/__pycache__/settings.cpython-310.pyc delete mode 100644 dispatcharr/__pycache__/urls.cpython-310.pyc delete mode 100644 dispatcharr/__pycache__/wsgi.cpython-310.pyc create mode 100644 templates/channels/modals/add_stream.html create mode 100644 templates/channels/modals/edit_stream.html diff --git a/.gitignore b/.gitignore index 9f2e8485..38411563 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .DS_Store __pycache__/ +**/__pycache__/ +*.pyc diff --git a/apps/accounts/__pycache__/__init__.cpython-310.pyc b/apps/accounts/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index fba7b6800a452a357c246ed5d16309a31c8539e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmd1j<>g`kg2|CR=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2BwKe3HGXV(}1^}ul7z+RZ diff --git a/apps/accounts/__pycache__/admin.cpython-310.pyc b/apps/accounts/__pycache__/admin.cpython-310.pyc deleted file mode 100644 index e675cba8dd2eb793b55eee15db44dfa412a7ef51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 792 zcmZuvv5wR*5VezR*2!hL)m0ocwA<|c074*&6U_+;(YUe9+6i9lIM~i1u08&O=C-8f zZ(Krkzkr0qID4!PiHSUVZ#-kanbp-k?==3pb(_jx#Qd>Q`B;-g@a?Boga$XUAc}DPv-{c%NUSv`s3$Z-++K z5S55xfoLYM$V9Gin}Os^%qCO z>${z5---2!jTKM2(oc-#9hoOWoa~ej s(oHwV!mA)-J@$w2p`U$cr&H0>{Un~H7vq=U8nna>d?Y);4LQMo019>6wEzGB diff --git a/apps/accounts/__pycache__/api_urls.cpython-310.pyc b/apps/accounts/__pycache__/api_urls.cpython-310.pyc deleted file mode 100644 index 5a5f1f20395f588c879352a4701fec599dcefaeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 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 F_#ep6N`C+V diff --git a/apps/accounts/__pycache__/apps.cpython-310.pyc b/apps/accounts/__pycache__/apps.cpython-310.pyc deleted file mode 100644 index 391fb1a0ef396f4517b5e71c11926c051c913dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmYjOy-ve05VqqKh5j%g20%jUgp?(H0fZWmVC%x>#d33Q2uk7*CrEUKk@u*065hcp z6R*I;IcY^t`p)`(|~YjbChg?MgdzRetiTFEwVgv1$Q<%U?_*3v!m_pTyO0;LRb4w-CHA!+2E?*_}aasaUV1$ GC*B{cKXVfR diff --git a/apps/accounts/__pycache__/forms.cpython-310.pyc b/apps/accounts/__pycache__/forms.cpython-310.pyc deleted file mode 100644 index d099d2806185b8edc6de84cc7593c083b5039ad5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2117 zcmaJ?OK;mo5Z)!16e&@%L~%#wB-OAdt{&+P1DX1>|aWw+ZV@IC+guhGaSWf+eIhtysqCR zJmBFY!b9PnxN!t_n|HwO2s-Yrp58C-f-m9r@*(e^<)nFwj^XS6EhnSOIsQxN!)vx|~6*?8J%NJa|m@DQ5mCj607BBXI=4*k)Yy=_wLt~FSaG86w zzUZ>SuBg&JGr_55=|IUo8HFe-9F#*|Zlfd1heQ+4CmIi*htCCB8{v43qPhC6_~pOrWuA#0te*+LpH&C8Pfe@b z8;h*c#!aO(Yug7R`*pAU{hp98d%jmK;h|VI8=&bnp=UzM^YASoAL0_5NC;X7hF%7N zbq}ZmiTE#j{u)#0oohaP6&(kh$xy zMq4oS)m}%`M-KG53x~3!-o>G|!40#m-2t2%641lGe-(g_;b4V8s&`Oabn7Lkv7Fdy z>NX0rhW*afb1+Et5ej5YW!Ha-+Gi-fL}6iBbiwD~eIJJIfv6#10D}K=#aHN?s|Y@k zEf{(T;!OZ>_X&%ET!FCKHDNW-Fze|6WqI5O%JPA-BHn^J1|~wz_>t$8#pkGlJ@|pG zt?sicU>Q%QdqN)d8cuE2%|(2Uq3S}!z)LqS-_h`q!t{+NiZqv|lftdZsHUY}Rx@^E z4;2!{wOD10&akAA&223a|&RK7RBdy(2@;8YkSKEx2TjR_!jm8&wq#iAvID~L?U42=I1QCE30eK|D)v2 AaR2}S diff --git a/apps/accounts/__pycache__/models.cpython-310.pyc b/apps/accounts/__pycache__/models.cpython-310.pyc deleted file mode 100644 index 50473ff1de9c62408c334a08c36b6b297b0db9dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1332 zcmZuxO^?$s5VaFG?RMMU1ubZWIOGPsbol`Y0gG5bVp;KV$;EPGw@q=AVmk;bZgAZz zS3sQjOFkiS;x8Z}G2;}71de9nNyhe@H!rD%!#;uW^~3ww=a`Uh7_^vc(r<8I>f9B+X*Q79Ewy2(I`n&bkoyB!j3U6NtBD zSN7hKtS`4@AMV?7TMpnpkVAm9;~Ad3e$`K59M#rU%e00kX@HncE0f+S>`J(NE{qw6 zwEN{;nZnt0Y9Ra0LX@-WicQ<4q^?SZlxT&6a)eH&h0@Zd#WXFIl1esvJsriqE7erg z+WF2zi}JZ=Wv%u40-RWuK-2iBnH-y{US%Cb2h^D^@ZbkVY2lRQrC6$*!lT~<=V(V@ zHUamBEC^IgPoM!k+ys|=p`KZ#r(cK}Le7uNhhnutvxg$jtGaaduxZwK_1bqihi-9x z4)=_}C3HPN{>GaZ{~*AmfBt2he@C-VLDtzWWC^3O(RH zfXQ#%E?UG3_6B5sMsH&k(fahiRjmHV*ro#HJS&w%MPP-Y98p3%SB2RW+$xG@+W{}< zm^tcXdwA!qEe+Cd5TWl@lZDEi^~to*PMQC5u#0uJ)?b2^frtaP-v2{HE8%1`^gSLV z#kucu4hpEXg86{+7q!r+9Ed;;vdTF(*k!-<;K`$tyC`zcWRbgUC|(LD49}}_TFm_J zLs7ndTA>eF+0I7boBo(xEbBbF3+PafEr;zi_!B_07s2%iqkD|eC|t?UUeb#PNys@F zC4NhW4|6Oh4Zcg87~nWlOva*i^KqkX6XWK{Xjt7kHGl|8>RoSGxPc#4_@D-KkM2jm E0P?d|6#xJL diff --git a/apps/accounts/__pycache__/serializers.cpython-310.pyc b/apps/accounts/__pycache__/serializers.cpython-310.pyc deleted file mode 100644 index 042d2c65fbb2473727c8a254fc7bf76209318748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1529 zcma)+J9E=O5XbMN)5Eg!zzKl_hJjLz!v|oPRHR^%$q;DNXcXUJWF*VElZJ8H(59y3 z(eYLI2-i}jPQ%c^?#Zzo+ZoWz?VR>byLbEhuZoqGfWY(X)92m~n~N$ZX54eadVSF;b? zr9Sr#OazH2Cy@m?DYqb}b#6sAw;>wBIebz}aEwYCn!~8pk?_><^{N!AjNeM=?hl20 zFO3#(+&lil>XJNDpp_1Xb8{*;7iI>TIIs%7HT{xgUG Wzmn(ppH$f2EwTxoZ4^7{JzT-p_HhR-{+fM~tokM4%j|TJ}#P4*| zw|kV7h3VEU=&CTLXli4FY_nbzO? zx-@!%HEVoxCQmeAITso)xN7v573##M7%lM7x?iy$Mtj7j-=G6BAsq!-+pfpj#t<85 z$gwq`t)H1SMaqyAk8U(pIRG1>2z(XfV*3Os`o;8f%1!3}S&GSNnsndVlt`=gn+;x8 njp|EyMbBnlph;NFpK{@PPQnu|9KpSRLXeI9n8%K|pHKe-^Elo~ diff --git a/apps/accounts/__pycache__/views.cpython-310.pyc b/apps/accounts/__pycache__/views.cpython-310.pyc deleted file mode 100644 index b6546ca32b76f31e827bf6ad93a826baa6bfd3f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4578 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 F{0|5kNMZm0 diff --git a/apps/accounts/migrations/0001_initial.py b/apps/accounts/migrations/0001_initial.py deleted file mode 100644 index e38e8750..00000000 --- a/apps/accounts/migrations/0001_initial.py +++ /dev/null @@ -1,47 +0,0 @@ -# Generated by Django 4.2.2 on 2025-02-18 16:33 - -import django.contrib.auth.models -import django.contrib.auth.validators -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), - ('channels', '__first__'), - ] - - operations = [ - migrations.CreateModel( - name='User', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('avatar_config', models.JSONField(blank=True, default=dict, null=True)), - ('channel_groups', models.ManyToManyField(blank=True, related_name='users', to='channels.channelgroup')), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), - ], - options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, - }, - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], - ), - ] diff --git a/apps/accounts/migrations/__pycache__/0001_initial.cpython-310.pyc b/apps/accounts/migrations/__pycache__/0001_initial.cpython-310.pyc deleted file mode 100644 index dcae8be136326ffb0e7e9fb17425cce5b28d1d1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2484 zcmZuz&2t+y6!)&z_S$hinxtu33M`aDP1|)^C{QS!^n)@mZDDA`!IvGyPhQJiYh6ih znmsWC*IYSqXph_({uo`kkRw-SXnB&>Nf^4Gm8GZmrQiEl<@58c3O<{^|CVmFE0sUY z;^-6LViR9^9S5j@msNV6{rBy^pH;^}FBsQ)HP7wWd)}87s6y~l1p*q38b4Nh4e%aR zI<hs;S=#Xl+!7 z0BW=`3c9xHe^?E1a zbBx(_-Mlx8)kBP2K&EQgJG-%Q>2g9cMMW}|I1HGOD&b^IlQDUkWR$0Bi0om1NI1vv z>Sj_hB|6wb5$!X$qy4XLcLLo;rFqg9lqd>%ZX(#2h~4B7-PKKGWh7$-)$J!#Z0C|% zGdi3QDR*)K`#)fk*qk~rEEbTYTNy#0vOHzHu=B{yJ5^oV&Io^`13t|%$J=Hyk<$qk z<}}5(x2a?)M{i`LhD71OWMsCYA(0WuvItqnOiGi%(GF9?e5xY)bds??Q`v5WzM%rf zQxv7+xL7(+9!W*iRH7FRpaU|^lx_}bHc1qHs+=>Sv1G8+^(kkMr?lwYaMq0_=h2J> zok7@O7mYKiWL(_&jy|3;K_QMVUD=2be?j^fCmH1;8qggo;^;0_hH@bSmNJD0;t*|i z$H#cmSiJll=;e>SMr^#Tm+cy@*q5f%n! z2T`AJ6X%F=mAkkR7&9J8rf6KWt%foNx``?g9QK43^p!eiQI{Cs45DosDVL-e;K)hF z(H569qx~{V7?%nI66J#k+Zt6S2S~r4PdP?M*PW1_L(FJ0${D9n*hS&pe#o7 zkKZSUSVd?ynm37s~2NQjt$5QrApY$l~~{=;Cr>w@Y!|7Bn+;=E}%dxvo3$ zf;>bJ-P|E(Gk%+9IZv?=@;Ew3L#%+5s{d62Hg%4wkvF2GKQtg6uzG}jGGDka#q zs2N008-?pzob^%vR@r{OpVhW*ePPPdDX2{q!+strG*IN6>MGB7bo1*6-`sZ$0WgGT z@gCv34|6j*@|;nNOM{4R^7=ulio_BB=Y`s=wqdQfG%xP&LR>Ef;^ViQgE-gp(mVH?!Vav!#B;9RVZmqd$QJcG{KJUqRd-9sZf YyyjBmI^KOM(p=F(KlGNo&|9ni3*6oodjJ3c diff --git a/apps/accounts/migrations/__pycache__/__init__.cpython-310.pyc b/apps/accounts/migrations/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index b3b901b38492d17670224db770d534724bcca6f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmd1j<>g`k0*7r|(n0iN5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HfequoZ2p8)o zCMV~Y=9Lud=VqoCC6;97=N0S6$7kkcmc+;F6;$5hu*uC&Da}c>0~t}w1SD7(02g8$ Av;Y7A diff --git a/apps/accounts/urls.py b/apps/accounts/urls.py new file mode 100644 index 00000000..c276f6c4 --- /dev/null +++ b/apps/accounts/urls.py @@ -0,0 +1,11 @@ +from django.urls import path +from django.contrib.auth import views as auth_views + +app_name = 'accounts' + +urlpatterns = [ + # Login view using Django's built-in authentication + path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'), + # Logout view using Django's built-in authentication + path('logout/', auth_views.LogoutView.as_view(next_page='accounts:login'), name='logout'), +] diff --git a/apps/api/__pycache__/urls.cpython-310.pyc b/apps/api/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index bafa77377b7828aaac168ee882781ba5ba50304f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1256 zcmYjRO^@3)5EUg^lE2p8?Z(NbA930=jax)Qk(`Pm$fCUjD2f7YF1iSchL*LVM1iE% zSY3Pe59zu8hS!{O>McNW>QF1MSA^(!&*L{w!;$%PI#nC=K1?L3&#U`=4YbK)r_a7=ADfzRM{Xa8*@zJquHcW>}L#Ak5-27iwD3;6N| ze}(t~EN}2bI=wi8uhH{2I~yKhRR>kS?bydX`(4jIL3Y-01XhO2gLn?#|7op$cyGG1 zvb9^MYNP$4%2)$*Mf5DEDv{ZSmT7WX&@ECvuW6Om1%|;nV|;sFU1+Bm7t33z?cPGM=Rjy$sM|!SwKTg+HQ|H16FhE$PbB163$S^$h4bZJ0_f zsgP(ykAcce6t!`s=UtVAuMG{ z#)G;@tDJ|Xfx<=)!of`+fmkP3smwz&n^L%j4ECfLAdK$|Dpj%;*yAl1Z^Of}N#S+* z*pb8>fp%Y2Yp(rY_NV^a^&siqP4@z5e_Ng`kg2|CR=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2BwKe3HGXV(}1^}mU7xw@F diff --git a/apps/channels/__pycache__/admin.cpython-310.pyc b/apps/channels/__pycache__/admin.cpython-310.pyc deleted file mode 100644 index 69427cf9e0895b76b2bf4ad3f65f46cac3a0bc45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1115 zcmZ`&J8#rL5Z?9se0PD62nE8M$_2?EKqx3hM8P%b+^ih$-o=q$%-Vs_h93fDY9xNl zwp0;iIx1$?xjZCdX+G~fc4qv|xS394hR=sTKNr7T#(tA>^YKyHLD63jB$K>k6;C;5 z(vfcIRBq~4Ug}kT>T{;}_dvNn_#Ts<^uICbD}EH7x~Dvitk1K)K!)fGuY4ox^Q|wE zBlMx=@?I?CeU^;Ru{uk*@iSQ!^*JZaHNk!dDyvMmdzjU=D$V5bum?@w=5*)gL$`KN zE}kGLmU78bNAlE_PU=ZF^`(~v(#Lv%84s!7Q@JEGP9cp~XO%MXf^v)DocFqGD$zq} z?&UpzsylI9sLu+tnHE}fkkvYGq>?7?TbXrAimXc<7-I*pf{?gC1AqwuSrh(s{N_4# zb{3jQ*m6RcScs~TeW~y~5#m#ymDC7nWuZGE3*DC4i5XjMUX+~zGu0}C{7}pbRZ4B5 z2Bd;bUmak3lPjI*oh~&?vl$_YS>6@LNIV|PrfIQrGtr0re2z3A8_Go8@xn5c zc<>C1!gGQb1TPVg;-~mZ*KVaAIE7afz=1Ym2KN!KIT=om$hL_<(}KrK?at5E>lkut zxi~JDgG=R_)!l(wyPg9d+>U>i_^?W;9}uh&P#Snha5bbG4ZTJO*>!+G6TxYaZI+DF z6?v4^i)Jft>JEwnaL{f7Vye_YV+8uCfo_@z)B+a=#}I#{0Na$EtNmu1^M4JP=nATyPbOSS2DsUmym+J`*v7;Z-U_2xTPsolnUY z$G~N>hXaV@U=I%=k;5KSnL_+!^p(hw9N+mXD#kEImdP_B#&WVG(}R1gluSL#>b$wM z(Yib@S_xBX(^I&}+oJhUwGHTd>cRq>E*lNG`nZOhB{X*Q`Z6y|D0cX;$8U7i*1N;w zS8Z{93I#OKWt*4p-#Vv#_}|kfnq3k<@0g8^%vRFau-jm5{46(6<_c`Ma!O{C_TjTF zwowl^M`x%#lUwoGj&gI;ny^$u2ZT-BkK|js@X`8O_is;=EpGpRiY>LzfXb!<~tpao@@EysopZn=aRK4Xd?5 z78~Ven{EfFicf@RrLoMF@SW&Kj>DNhPZmhxmRan&M6}La;Jm)I{JE-RTfhtVj^-H6 Tgbe9p%6RBaXg?YII|}{*%&^<} diff --git a/apps/channels/__pycache__/api_views.cpython-310.pyc b/apps/channels/__pycache__/api_views.cpython-310.pyc deleted file mode 100644 index 39513b0202667342ccf0a471889d59b2553207c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4977 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 Gzwlq5%>IY~ z=VXj~Sm^QJF0B`rPZh%|3+Ko=v%QsL32p5^b!Uw*X1t4T<4gON K+J2Ewj+|dl<8#UY diff --git a/apps/channels/__pycache__/dashboard_urls.cpython-310.pyc b/apps/channels/__pycache__/dashboard_urls.cpython-310.pyc deleted file mode 100644 index dc0e3c9096bfecbbf7f27a36158928414cf8c897..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmZWlOHRWu5cMx@AStL_Z~`{jG!kosH~|u3mrZ0CE1|NT$WB2Vf;+I~O5U>S71+Q` zC8|n{G*5oE-@IoJi^VC!x)&c^!5RA^a$FgbTkLp+01UWgjyIe$5Fo8^vXQt}jWQfE zBR3h$VE!&U-pn9>VAaVEb*$n^je6>LXhGy0bnG7o9iV-AHm|W+J@wjqV`F5I4XYQ(bDqy31H>|h8#vpKTps+z9q+E|3wbZfx3soONwPdy)-%@_<2H0A2LobT-hb1q$5@$01`30iCU7r8| diff --git a/apps/channels/__pycache__/dashboard_views.cpython-310.pyc b/apps/channels/__pycache__/dashboard_views.cpython-310.pyc deleted file mode 100644 index 527d588ae6305515d2a7bae88724dc4be48f5874..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmY*Uy-ve05VoD4R#jUub!0;#OY#B;A+dL1%M!V|9)I6EK^TX~tTJWf_5BqW}I zsdrTo<)r)n{M~1}Sj-sOXZl`!WB#D#)B;3-3RL*U zwmc72bjOnT3(;)H#~5^{G$edn8e2780s3KRK&z4y;%HRUp<8rEdOUl@Q(J*lV*Roz zYuR<$xa_w`Yu_3Wh(zWIacbvx3}T%8Tx7EE$^Y<~lCIuZ395K(^pi{b=W*pcXxX~r z|1Kg8#5@x)#k5YM@l4&zuCl4CE%drd!8#h5&U| z3z1E&%cEMt4jHEj4IOSl9eeZQw9eJ7SjCzZaV|z(SNlXwr{$x84OF;H%h$LP34frY3Vn30@oEwYOmQ^a^{K0bRas?C3(qhnwau>KHXQtzNI!8I_#`we3IvI{C{=$h8tH?Mtz& zQYpB0vUm(sHAKExts@hhwQB8Kef3|fAxogipO5uO%EvQB=ty`R+>sgsj#1N-wJ6K*ho{Py!X*@vBM{N$^SDS#X;57=w@R81GLu|0eITJ`ip*4uav5+*l_t@w)kFl!JW6GJPT*MiA?Y~Cx zgh%-#O&&;@N{H$^cc0uF4$~sZhopb@se;)=%l-!VINeu$t`Xlnt>zi zFRTAD0vFOMuVBB}@ga5!zAhS|o|a+Phn1jtL8}Fx=30(wgYV!x#5XX@74Ti|@#Y~5 zR?uJNE!|(!#)!j-i3v_FU;TuU*W5t8NnNT4OUuL&f{E) zXgc4i`*=POGbu8WDSJ}HQ7(9xL{l+$i&>mTJli<3RITiXd8#$bF$`ml zm~`>lKK>;r5a32do`y;K$tC}j_9j|(1LUm#xf$5p8nd9nZP>6fZ0=pywzz)O!s>RS!cTvxo)yUKoB{L@}L$xTiwyrJ2y0YUL~!&f-Ew zv2s(%g@k{O4EY8Y)a2`%8_{e=E!!CGM@a(MZurw)X=%5E;NVY}00SCU1cm z(pi@e^-Z+D?lX%J5fi zoQ_kyXD5F;4kujIwkNUBvjz1y9Y%3Dfim4C2Kxm*+@=``6|UhiNs>#3 zplI1d%l-qhG=#9ew2}2I!a8uuLj_gzU8)LH#dHO*4k(ioPZgno@1AIaqgr4EE%0q# z2kmGbm!onWI>`CuoXdH-7x)$Ms~ABwVNLg2yp7Cn2I~v%isr70YcGu8I`8roxaMf>tj}SV4 zd%^h{uztQj$^6AIe^10|GS2)w?e{7Ymj&ZAiAz0KZC}K*Fc;5q*~RDW`K^Z|e^(ab z9Y0RfSq6##^eF&uXT3i5L2i-11)1MIQAL39bUK+Yi&o~3P@P86BuvHxJ7GAi@Z&*5Uy`5c!O(!;y*MdbziC$0xDtTRBB zYc0+lCdG75NYz~O+B7h>kLBj=rNK%qe}3JMV$@>(+!xO#8A|XZSr}8Xey=8fjZvza z?j49>p2@r5?<#lU$C~^N1{`yc zT{u(U*_s6q!a4}9X4M*x8MmN-HWA%a*WjI(^J1s z>}wrPcKwJJq0HtQEe7Y=+S-Gjr)vBlO2%oQ@0BoLU+_a*Zu*FQF{A%AnU46NO?SXP zZa4k%`d8k2Dm(N~NF!QR7bUxdBVkRi^eQAO_g&0_i|QZAa2fg1L$UO%uGxLFTUr14 E_qOypasU7T diff --git a/apps/channels/__pycache__/serializers.cpython-310.pyc b/apps/channels/__pycache__/serializers.cpython-310.pyc deleted file mode 100644 index 3040d19ba846d073e45f91f289b626ddd4fab3d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1679 zcma)6OK;pZ5GM6nNxK`ni^gf1zS5#7_R#py9)rR_fcOx^2p5IA_w6zV<3V^Q#~WsxS*V+h;P6;lE6ViXTPK{j7(UNcPauTUuhY z#4JJ!IqlJM_=S-1d!vGS}sq0`rcO&9~8E3o5T{@4>UYu9dcfrLqrAH!JAm z=I7&N56Ah}C=|=MWSNI?x%4ou_uR{T>0`{mZZ8}kUWB~j%Uk*SYQvZEvtWw;Uh^!J z9(wZ6ZeI3u@3Ct0@z8puv_YL$%K9B>n--mEn@W)0uYT)9UKCANw>H+zv~lLBJ(&tT zmFlL*wV0Gz*{z}jP<1O#N_C2rvBT1c7V_E@ja1SOCzEQXreX%lsMe<4Oy;eUB1e5n zMG|y{gK=bI;Zz}PDn!-DPAk+0LL7IwrcFWsfo?-w#8O9-QfX=4F!%ELSjE;SIDGQQg_>j?ci>T*j6jhDm;o*?e~EsrB3rm*@-EVh^$O@o}eMPAwRj zrh`J+^c2cgE%wKtj=K_+ymIXo%^<;RBb`Rn`TzlQ#&xvy2%7dLUgb_<6a_j z4cH;N`wXyur)_Jn$AimFL$JCl0~N*YJb|*xVg5+X|5Tbt{g4O=1hnlnPmfg58tdm; z!>@GmlVth{SAW4_Mkr#IdI68Q=l0V|pXjAUS@z#&qtk>v$XAM_>5r{6UYqA^Hs1mwXhCZtWx=0ec9J8~^|S diff --git a/apps/channels/__pycache__/signals.cpython-310.pyc b/apps/channels/__pycache__/signals.cpython-310.pyc deleted file mode 100644 index 6bae3b1a3eddcb1a29dd3b296e5d7e1fa284385b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmd1j<>g`k0-KrB(n0iN5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HlequoZ2p8)o oXC&t3rREgt7iXsDCFT_C6;$5hu*uC&Da}c>18FN}0un3?0Et}}ssI20 diff --git a/apps/channels/__pycache__/tasks.cpython-310.pyc b/apps/channels/__pycache__/tasks.cpython-310.pyc deleted file mode 100644 index a7552b169405847dac4e06b272810572399a8209..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmd1j<>g`kg2-!A)0u$uV-N=!FakLaKwQiMBvKfH88jLFRx%WUgb~CqY5l~40uV0N nPtHip%S+8E)-Opc&Mwv~sJz8tlbfGXnv-e=(o_txg@pkCd72kE diff --git a/apps/channels/__pycache__/urls.cpython-310.pyc b/apps/channels/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index 1c295bf8aa0823df3e404a8ac610e064f8bff005..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390 zcmZWkJ5B>J5cO|&on#}epg`gV+hi|*5JhU5NEB`&!&tkZ{mI^d$Q^P9prqzDZmA+} zKpMtD0VGD6(LB$a_r~3HIwlxTA8+M`67n9v--r=hV7fULAV6!*L2E1ksSG*BQ zAQmbz6e7c);}-%kBpZ%c8UZ5oB~uBE79<~UQHkW#i(U`a7EMXc{PAM2MmKZqs_RZ$ zxVkkD{^X|8ZEI?`gv0yt9tY~^|6ncMUcnVA`|f_1f?2B@vmPDxipyO33Eb(n>}D%l zJInA69|d)11@<-y4^sF2GOYSUyS=xcARR9sjBVX3v1#Cj@_AYyIixFoY=ZQxfAsRK W>0nix^YC34=qbslV3|m{+8}~WNEN<1F}d^BsF@pM7XTzei)-*ovoGQ%{?1D7o!|&l9AJW5xckFyk?G%DUeGCVxwnQ(oJ#wcIo<0y)i@P)XT|IRH1Yqj zyoU9Izgf53Wt%W;GH@{~xJ|3Dt8dG%d_nE98)UakThCGNb|Yt>y-%F(&*r+T%~Spjj=wx55mKaLGyMhlzoAM1 diff --git a/apps/channels/__pycache__/views.cpython-310.pyc b/apps/channels/__pycache__/views.cpython-310.pyc deleted file mode 100644 index a485b7a5885c558c78a9901abf4e26911e20a193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1801 zcmb7F-HIeN6i%vAKi$*a)3~d%?v85-g0w=9H-d`D!ng{1F$)eT)=g1UN&i{Z)tjW| zr|Fh~nJaO`2UuYjyxD7?!dJ-UdNue4f~)7Gdd6Px#xyx~lAM#AeCIpqvfXYHXy5+r%OZ}8SR;VnVW+%tMc;|{E~dFPyfzR5TD zNw0ee5s@A>?5nXjf^X}ADyLrxH7ln|z_?ooJt}#^MOMmGmlEbWc{v`p89}>$oEEcOM9)tj^DB$z zr$0wZpTO)P*hYg=M)e-bx?~u^RfANL5c)&t>Rk|;Oz0Dc2cyAAxc}5&GVSs}vjsb& zW6DF`xNso0=ALoJT(-c=xRuOJGpm#?i^S?fSyr^s-U_3%9!+5IG&k-V( z4n)tB$So6;2NRKLW&Fc5uY{5=&a!;0bk74*kq=CO84*ewmdYVmetTrUfwJ(cXGFdM zPJiCnNoOTN&ClRwgK5DjkZ;-(UpU@|8|? zrHm(}Eamto*vi7)YZ^9znlfHqrX13HQ1TO-Q~4_H< zyak5xbriQz+(Gd+iW?x}CR{85Lo6{W?4h-|3#*3BN~O0zQ`;ay=Fk>>g*uQ|=r0^M z{Hwzv8lF0T&u`WDeyN)J=)TwUO_*4|CW&b#Nm24D7ofM2d5k4=$4L}EPzpGSYA%`5zPLdD&JjE z-TKU5yJr5C(jVy}mjUeBqczt5hHin}y0T2J9}`=%?_hZNY&1RjK796iUDM)|bUG~i zwyY#BnvK=eNb6Z$yj!c8N{@5ZzkXnqWN3ePwVIVvEyoA_w9=z>BYd39_WC(%t9^Wr zCI0Q0?#e`sN~yC-D~YHZA5sW~UlS1%Vq;&+l)b&Zc=$=3?oTlx3c1)KEnv~==QN!r Ky-A%r9r_Q$GSeLZ diff --git a/apps/channels/management/__pycache__/__init__.cpython-310.pyc b/apps/channels/management/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 4ef9a27dfc1b60fd8e26a123ea08b7bfd8f991a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmd1j<>g`kg4!dK(?RrO5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HfequoZ2p8)o zXC&t3rREgt=O*SQrl;nn=9TEj$7kkcmc+;F6;$5hu*uC&Da}c>0~t}w1SD7(03*^I AssI20 diff --git a/apps/channels/management/commands/__pycache__/__init__.cpython-310.pyc b/apps/channels/management/commands/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index a912ad38d16b6b4c47bcccc820ee25d748918573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmd1j<>g`kg4!dK(?RrO5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HKequoZ2p8)o zXC&t3rREgt=O*SQrl;nn=9TCt=jQ@>DaHEn@tJv6}R0s}8i_k(r9Ds6&_L58Fjoo&OlN8%w)oMAh zzrYD0wMTx25Ac-}zrcxc(u#6mqvR@lyH#>!Gi+k5-){8^q?b!l>UW#2qloPp~T0D)4>QR;D=67F$wgHp;Vl=2~2 zn}7BAg^5bLuBGSLn_+vcVhZ)IVq2J&u4b9k04AO&+cecI4vK zgQU)Lq4lJeavAbQ2>+iFry`CH6buj9PIWOCxzW~d+Gq*Lw?Ui12HNndHrBsVmqu7$ zo23-Clbnx6FOwvqmTDmF9 diff --git a/apps/channels/migrations/0001_initial.py b/apps/channels/migrations/0001_initial.py deleted file mode 100644 index fa790d6a..00000000 --- a/apps/channels/migrations/0001_initial.py +++ /dev/null @@ -1,63 +0,0 @@ -# Generated by Django 4.2.2 on 2025-02-18 16:33 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('m3u', '__first__'), - ] - - operations = [ - migrations.CreateModel( - name='ChannelGroup', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, unique=True)), - ], - ), - migrations.CreateModel( - name='Stream', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(default='Default Stream', max_length=255)), - ('url', models.URLField()), - ('custom_url', models.URLField(blank=True, max_length=2000, null=True)), - ('logo_url', models.URLField(blank=True, max_length=2000, null=True)), - ('tvg_id', models.CharField(blank=True, max_length=255, null=True)), - ('local_file', models.FileField(blank=True, null=True, upload_to='uploads/')), - ('current_viewers', models.PositiveIntegerField(default=0)), - ('is_transcoded', models.BooleanField(default=False)), - ('ffmpeg_preset', models.CharField(blank=True, max_length=50, null=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('group_name', models.CharField(blank=True, max_length=255, null=True)), - ('m3u_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='streams', to='m3u.m3uaccount')), - ], - options={ - 'verbose_name': 'Stream', - 'verbose_name_plural': 'Streams', - 'ordering': ['-updated_at'], - }, - ), - migrations.CreateModel( - name='Channel', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('channel_number', models.IntegerField()), - ('channel_name', models.CharField(max_length=255)), - ('logo_url', models.URLField(blank=True, max_length=2000, null=True)), - ('logo_file', models.ImageField(blank=True, null=True, upload_to='logos/')), - ('tvg_id', models.CharField(blank=True, max_length=255, null=True)), - ('tvg_name', models.CharField(blank=True, max_length=255, null=True)), - ('is_active', models.BooleanField(default=True)), - ('is_looping', models.BooleanField(default=False, help_text='If True, loops local file(s).')), - ('shuffle_mode', models.BooleanField(default=False, help_text='If True, randomize streams for failover.')), - ('channel_group', models.ForeignKey(blank=True, help_text='Channel group this channel belongs to.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='channels', to='channels.channelgroup')), - ('streams', models.ManyToManyField(blank=True, related_name='channels', to='channels.stream')), - ], - ), - ] diff --git a/apps/channels/migrations/__pycache__/0001_initial.cpython-310.pyc b/apps/channels/migrations/__pycache__/0001_initial.cpython-310.pyc deleted file mode 100644 index 314ba3c061b929a01b2481e4deba9d1e312b3e69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2193 zcmaJ?&2!sC6xWw+S+N~AO_~O15p8K>XzjG6K%tbjNz=*Db_z)^z6ix{t;m(M>aLVF zzQWc20S7p8XZSlf?~UP<69+gkL(AKhoP-I3G`sWO+xM~W_ulT(X4BE|+xYpX;9OJF zev{16&qC%74&KEHG|(e0*86&F^bK9|Mr8J_2O5}QeXD^*^iky-vtI#YQ|nar(MIbS z!imFx`B_L4E~+sF67k0axpwqhMCJ|-e!r=ke7LVd?d3| za1%a(PbXEx?L4k8;`&Xv1)oV=gNCeZVD?YLZS1elMg7sVv9_?y%=mgP>Yg_Y8P7aV zG*)-~Bq7lQM)On{A*>5yW36L}hM#BD8!+N$1jJ0r!q{hf-ZQc%>YT99kHRq#ja|aF zDJNdy$3$3i-Un<@)zJP+FCs~h?TBiggwJ!*F<1*1MRgdG2(ZsLGxQ&iTWe(K=TYVs z{Qm30Lk$WsYfB?DXOVCQInQY9Aszlw!#Jj>Y)5|btkAKNJc@)J(SS-7QO$M(F9hL4 zbl^vrbVSB>o<`IM-s_m`G&*KW(tEv-dKne7gPbvvWZrH_UJ%BaF1Mqz1*z8zxtB3N z;R8IPAezHroRYvx8Q~<`za~|jJOv4w=Vu*V*b2vlz7S3zF)omr!7_OMU_kRE6E&`2 z;NuobyEw{)PUYwZY2x9fKr#fKkw^tlpc}a5S^*p%&s;eY++=uLY2xJ38hL4yGaoUc z46uqxfGEhCusNw(qiJyi)ylRItwGTrUXsV#go(xhkEKRXRB7r8aD{GFlDsEuiM-lh z9TD>fS-4AtgJeW$ieblRHiqsN%gJR|N;u9~Ay@iX=AABfih{eoL!#8n$jeML_)b0? zM#Phs<9PYN9E$-o#%6R&7~LUd?$8e-iivkcbGl;%|M+5=nX6bg+X=Z_YPj1ZqDjEr zjCO@x3i)_pN_9&@S$3*Lac)TPWDBuNa$1&C2dDAufmyMyX}cY0Jnk$B+fyLnL3BKs zSdRJOq4d1xxgSaRkgJ7BnBjR74In8=fFy&EaE32{CT3RE0evLj3ua15<6aot#iP3} zkC>>h?)a=A?WbQoEQRZcazV~Np&Xs>l8q!I0V!1*_b82spA zBwyf7P=%471XLKXEo{}D_fO!NyKDDF<6mB#jo1%LC-&z3E${KuhY!WO zqH-?6IW#5ZL-?b{o=809^w*W1pQdu~-W1v1;hWi8Sy{R2l}L5dJtiMzydX6GHBPo> z8HQ=Swkn1`Z?tvemG#Q16||$zm48cbAtlFI-T1?38@i=ie_Ov>i&E23D}`=LZ{zQx zrtzos%KlYF>r_R(z@rP>syszSmJWp7;$81fkzx;UZ_4&C&w~0A7leJQ=!o0$0^(Ji K+J>#4GXDW;g@&jA diff --git a/apps/channels/migrations/__pycache__/__init__.cpython-310.pyc b/apps/channels/migrations/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index ee1d2c20250531d62443055b7b36be2dc1c25c76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmd1j<>g`k0?%z*(n0iN5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HfequoZ2p8)o zXC&t3rREgt=VqoCC6;97=N0S6$7kkcmc+;F6;$5hu*uC&Da}c>0~t}w1SD7(02n(Q AsQ>@~ diff --git a/apps/channels/models.py b/apps/channels/models.py index dc4c38d7..fdeba659 100644 --- a/apps/channels/models.py +++ b/apps/channels/models.py @@ -24,10 +24,15 @@ class Stream(models.Model): local_file = models.FileField(upload_to='uploads/', blank=True, null=True) current_viewers = models.PositiveIntegerField(default=0) is_transcoded = models.BooleanField(default=False) - ffmpeg_preset = models.CharField(max_length=50, blank=True, null=True) updated_at = models.DateTimeField(auto_now=True) group_name = models.CharField(max_length=255, blank=True, null=True) - + stream_profile = models.ForeignKey( + StreamProfile, + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name='streams' + ) class Meta: # If you use m3u_account, you might do unique_together = ('name','custom_url','m3u_account') verbose_name = "Stream" diff --git a/apps/channels/serializers.py b/apps/channels/serializers.py index 62e00082..9e53abe7 100644 --- a/apps/channels/serializers.py +++ b/apps/channels/serializers.py @@ -1,10 +1,17 @@ from rest_framework import serializers from .models import Stream, Channel, ChannelGroup +from core.models import StreamProfile # # Stream # class StreamSerializer(serializers.ModelSerializer): + stream_profile_id = serializers.PrimaryKeyRelatedField( + queryset=StreamProfile.objects.all(), + source='stream_profile', + allow_null=True, + required=False + ) class Meta: model = Stream fields = [ @@ -18,9 +25,9 @@ class StreamSerializer(serializers.ModelSerializer): 'local_file', 'current_viewers', 'is_transcoded', - 'ffmpeg_preset', 'updated_at', 'group_name', + 'stream_profile_id', ] @@ -61,5 +68,6 @@ class ChannelSerializer(serializers.ModelSerializer): 'channel_group_id', 'tvg_id', 'tvg_name', - 'streams' + 'streams', + 'stream_profile_id', ] diff --git a/apps/channels/views.py b/apps/channels/views.py index b834d712..2292a128 100644 --- a/apps/channels/views.py +++ b/apps/channels/views.py @@ -38,7 +38,4 @@ class StreamDashboardView(View): @login_required def channels_dashboard_view(request): - """ - Example “dashboard” style view for Channels - """ - return render(request, 'channels/channels.html') + return render(request, 'channels/channels.html') \ No newline at end of file diff --git a/apps/dashboard/__pycache__/__init__.cpython-310.pyc b/apps/dashboard/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 40688b81e8db63068a5846e4536bd9a84fae7243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmd1j<>g`kg0!OEbP)X*L?8o3AjbiSi&=m~3PUi1CZpdpIA_!pPXNm jsvjSpnU`4-AFo$Xd5gm)H$SB`C)Ez5yqF0{urL4suxk`m diff --git a/apps/dashboard/__pycache__/admin.cpython-310.pyc b/apps/dashboard/__pycache__/admin.cpython-310.pyc deleted file mode 100644 index a9c8d7c42bcbec0c28f53fdd0ec19d9cdaa7664d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmd1j<>g`kg67yM=}JKQF^Gc(44TX@fuanW zjJH@5Q*tx&{4|-O_)@YG^V0M6lJoOQiZYXmKnAR2C}IXuVB(jMequp^esX?MsyFjVA1KHcxNB&ChCntv%QZgZT7X%0>N~lC81l$4!C|>}j5zjIU zFkC>=`=%*KgzrzAW@hVEk>7FU&;%tDayKF{kO>50i%epWg(yiS^zqELX2;*0+UyEmiQ7dzKGEI5dOL|P=l0H7Ut zZI=%2wOi+I`ENRN?WBL9cfIxlsMx9<>Ii&~-}eSYzO+=g;Q9UM-^RZH^_ONApAs<7 z;FY_uP>b4;72C+Rt*T`y39UxesqybOUG8LK!`#ynwY9@b2YH4oQO|H?;3~8XzY6H8z}0A#)-G*SFK}av*8i|+gElW+ z)BstNE*brj(c8wh1-jM^ez~xx%d|aqXvf&MZ(usW*XWAzw=&0f=_=sY48A*;_2@dt zHjHd_F59GcKz7&2){LKf#!nCE4>_&_eO=v#L2Vh-<^p}kSd@+YF3|U``mqI^?%aLT ztNVs4{jVbr=73MHdWaI`J8T<)S(y{v=D~ z;9_}@Nii6P$zU{!Q#PLIYj)IslvgoMNX#(K>lnig$|6lSF@BqosL%)puzBqOCh{_5 z5k(Ej1k`H`^O_35{DLPeufBQxU4dxNCxs(E<~S2kzWR#GP=#mgn?$iOn|tc%>H0kJ zGa;ZrER|p+mS~M+isK@CJQAj4f0{SH;5=d^DS~uZLWYnoWy5T&BT2L={ebBjB&MNY zzQP&gs>}F@DkV~$b3xJ0ZL5?L#jYcxjav|shIqoJsHGLPlK{g9%Q!3P+(& zv=@mQ=WG~oKG7{lT|dn*iI`AW1rRIXFuPvNVlJk)G=$@onjcu z1UhkbF8t|xOFV=_XqLab1Cpi#p9?l9{_-EEQ{jSIzj6di)oM8{yJa`+lI_@K{r=PR z+HQM+Z+lJmT3hly;I64AAhZwo!QNUxw<;~WZJU@!{Zd||rz9Ek$8=a+74J}giH!O> a?Sgs)+2z&Gii`F+e2^@uZ(`HxIsXCi{s+1M diff --git a/apps/dashboard/__pycache__/urls.cpython-310.pyc b/apps/dashboard/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index 42c33a85679d8b2d3c849a026b63f4badb1fb02f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmYjMOHRWu5Vd2cO`5bU$_|Nr7Bm+?2yp;}#Lk<@Xsk3SKiO#!y#ohf&27A8L$82@ z)ES_kk>=^W(VJg4olY3W<=01f#~J%1aT;S3x0vn$0T}R_HC%DdAOKMZjZmVIN;aVi zu_o2Xa0rb638OcGd~75{|2#G!Oo*34jUjntS-QokEaP7GdRT7p0G0_q1MQYiowiV{ zEA!%~&J07uPO^qX+b$eSFaVcV4R-vx)bOxsUdAGuM5UAKX{eovV|TRJhL~ zpTM(j%Wko`0dx# znKB`N;o{}XgvA0383QoFXiO5?q7-c-HWIUCYTJyh#BSM%({d8G?MB7*R~y( zl5(p|2{)O;+(%?UTNSW9=4-nOc8Qg>U1OCc(x~pj8_5nW9Kln@MS~W#I9rXIRh7Ui(hZFjf`d8&%qMkG`>h}#KIGO<-mq+GS5tQ}_ERB<7}gR`Ur4-&8{-^eWe zmdj3-N*+>t*XY86;P@Pd{2icoK|$iocuf0L(E;fjxv_3A^Aus$6N}lfGWS=`w$(S4 z1-q==TDO@y+U0EDs zs=^D`f;8o^JXChJ3QjLz%%R_SL=m)JH4A`n`zIeU+VewQ7DZaqbP-4sj{Tq6>%|fB-9?fG`?@QGRbKcafB?0*AL1||sXKf#6L;H6 z1S>01Sk!`0MH{?5+R!_(|H6YSY63kVXI69v2gKDX?aU=*_KEv z|Hl20cT|+6h20U*C<1dT+-!NBhe{UCN)$u$6q6mnbwdC_<3NE&pQqh~3$P1YlThFx zH%f(z6y^}*TjN(QTwKC=`fyThtX1KL8MN$urO#vtb=+Lr&sdij zLzR~S46{TXT8D9*)~Ka_C#m<)cs}Dg)G?g@JlBAK4fr|#R$TEZJani*v86G7tqa&( z3L2Er0kmDiSnO3LR|>cwb$x{a8yZx60MpSB_jl?DF-3{HOQyIA)1h}(@jeXw&OgEE z-9D;C$^fk~4`~o8l66RttlT`RMXQAQztFw|a|vb_<}%Ela@O5-k5yO|^v)k?iw}x1 z)Rxk|wph9Uw4}8KR4aG2!g&4i9ipmvc|ey4C|!B014>r`rJG<=piq?ojVSKX+E#f` z8Se#!gB2Mppw&%GgLUYzusOyGCSJpR#}Q5-oI*hP zIA~RI4we|Tm<8xvjFGqp-OBucSI9m4&e#{mRh_EP?$hpf$27?!!AcI3lwhg5dso= z7}ZU*zC!pK0UKW6K@}FpCO*dX;nEb-uP6o{wM2#(22vTxJViazqaLjpBMLiX3L}jT z>iy%@YR^5R_5$_+)x|A%e6cZ6OtSSLUCo+uEfXs2DyfyJI5WD9+9IOmX3$k@O~%6v zG%OQRSnzn^bYxdW@sZ-SX7G#99DmxHNygv{H~~=35B> diff --git a/apps/dashboard/migrations/0001_initial.py b/apps/dashboard/migrations/0001_initial.py deleted file mode 100644 index c1e3065f..00000000 --- a/apps/dashboard/migrations/0001_initial.py +++ /dev/null @@ -1,46 +0,0 @@ -# Generated by Django 4.2.2 on 2025-02-18 16:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Settings', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('server_name', models.CharField(default='Dispatcharr', max_length=255)), - ('time_zone', models.CharField(default='UTC', max_length=50)), - ('default_logo_url', models.URLField(blank=True, null=True)), - ('max_concurrent_streams', models.PositiveIntegerField(default=10)), - ('auto_backup_frequency', models.CharField(choices=[('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly')], default='weekly', max_length=50)), - ('enable_debug_logs', models.BooleanField(default=False)), - ('schedules_direct_username', models.CharField(blank=True, max_length=255, null=True)), - ('schedules_direct_password', models.CharField(blank=True, max_length=255, null=True)), - ('schedules_direct_update_frequency', models.CharField(choices=[('12h', 'Every 12 Hours'), ('daily', 'Daily')], default='daily', max_length=50)), - ('schedules_direct_api_key', models.CharField(blank=True, max_length=255, null=True)), - ('transcoding_bitrate', models.PositiveIntegerField(default=2000)), - ('transcoding_audio_codec', models.CharField(choices=[('aac', 'AAC'), ('mp3', 'MP3')], default='aac', max_length=50)), - ('transcoding_resolution', models.CharField(choices=[('720p', '720p'), ('1080p', '1080p')], default='1080p', max_length=50)), - ('failover_behavior', models.CharField(choices=[('sequential', 'Sequential'), ('random', 'Random')], default='sequential', max_length=50)), - ('stream_health_check_frequency', models.PositiveIntegerField(default=5)), - ('email_notifications', models.BooleanField(default=False)), - ('webhook_url', models.URLField(blank=True, null=True)), - ('cpu_alert_threshold', models.PositiveIntegerField(default=90)), - ('memory_alert_threshold', models.PositiveIntegerField(default=90)), - ('hdhr_integration', models.BooleanField(default=True)), - ('custom_api_endpoints', models.JSONField(blank=True, null=True)), - ('backup_path', models.CharField(default='backups/', max_length=255)), - ('backup_frequency', models.CharField(choices=[('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly')], default='weekly', max_length=50)), - ('ffmpeg_path', models.CharField(default='/usr/bin/ffmpeg', max_length=255)), - ('custom_transcoding_flags', models.TextField(blank=True, null=True)), - ('celery_worker_concurrency', models.PositiveIntegerField(default=4)), - ], - ), - ] diff --git a/apps/dashboard/migrations/__pycache__/0001_initial.cpython-310.pyc b/apps/dashboard/migrations/__pycache__/0001_initial.cpython-310.pyc deleted file mode 100644 index 7560958f67f718a433a6f2b8419af984d73581aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2079 zcmZWqOLrSJ6rP9Qb`rNq-4}(FN5KVRCk0xdl%@%Va!BcES~$lW9eJ)iGx5x5D$TTY zwy@2gVAnl|-@#g24h!#Cv!GnbgJYV}kw)Kr>*`A4OG^z4Kla2QHNMt!{aWvR2nojX3lL%|f0?Rf##U zNP3#J_^l(jja~j_V;I)J25aDeJ#c+%P-5kSigv-O2Q{#x!Yi3-2MdJEvYX)c4^7 zq<%Q3ZWw#L!d@TIaon4T7FWJyWUm#nAN>z~Y&7kH_X(n#eGsoFlvvM}+bazePPoO`?7 zl4{XB+RA{wa>x^=+{cf0rdueh+Jz*ExX(#0BGfJqBbtm= zDaoTqb+iSKCtfZDOEMxe3^kTheXhE;SkXq#m^BQkH_lTs66{IN5^vIVU!X0ZVKh3{B^7`PqF|>)xFt7T+*gpRrLZMdQ2K0qOBdBVhJ5ai~t+vz7AQc z^U@0#lV(!DEm>HOqukA{;BfgX zO#Nhib8Gz@o(m~1Xdf4~`Ew_1&@?nVxta-@NRI>VJ{g9HG8X<`MV+&Y9GXLjwSYH? zhlz11^_084y`$%GdQG`|53Y%;+EZsyOEAf!Twg;dSh~K|Pel)f5R^CjHxTu8gnCe? zMz{@Jm(Gv{^l8WiN;Ra}unbF0HTLIod;(!JN{{C}a`H``xyx5pz}vQ4K=y zrNDBG2l^kp($6j;Vwr}CO+SQp-GX+ieVndJDdH0zE$n! REbF)M6}F^~tL=2$e*yiFeeM7N diff --git a/apps/dashboard/migrations/__pycache__/__init__.cpython-310.pyc b/apps/dashboard/migrations/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 5597ce8aa07721f11cd55538184df965d1479384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmd1j<>g`kg4AtW(n0iN5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HPequoZ2p8+8 zBo=2RlIYq;;_lhPbtkwwF8+^%mgG@7yw1` B9U=e# diff --git a/apps/epg/__pycache__/__init__.cpython-310.pyc b/apps/epg/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 7fd7f4d577e8b083c33507a542396239062501d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmd1j<>g`kg2|CR=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2B!Ke31jS5VrU4e3!dRE`*Pi07)b* zNJ%-RLY`8S#h`ML)$V{7essjAVR8WUS~sxePBU@3pq5wI#9#HaJ<@m}Ey} z+P?@*9LfH8t;kqjd&V01v+)Bg*y2UqV30zyPG1VI86L?%~+Lrqj7 zdXfP$*$0sZez?@TlPL1B)2>i{GgnSzr)gEGLb&r>Xz2&mrN#-TK|`i0*{yoZTjn0n z;P-Fd+&)H`GA!QBz%|x=AEw;|_(- zDrqKg$7}(ht`?nd(u>EdS?%1-qCilhu_o`q*G{K7l?|g*DhE27j$*M&;0h&~Sq{XlqN^_Dt*PU*SD_+O_jDtc1n< OhGYZcZ&4OMqJIF6AOSM~ diff --git a/apps/epg/__pycache__/api_urls.cpython-310.pyc b/apps/epg/__pycache__/api_urls.cpython-310.pyc deleted file mode 100644 index 94081ce440ea52cf43b33ee190d55240f085957d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmYjO&2H2%5VjL<>})n^kWfV*VGrycxgZ1*sOkl+Sc!u#k*TL4CEi4KLe;%;uEZm> zN6x&Bublb_a6pW+1>wk_=9~HEC*v;9=LC=b`MrJ|5%MFD|4)MCC0_RxK@&||VyL7h zk`WC&YGcDBLp#>2otZ=?hD&aQ6eg7^`e$+u>Pl4J}vV3%pQ;}ulS+9nVo;SPmcGR$>K7S1t zYHWvh-8g`~r$NSi`DSyv?M8bJ?;E(H>#`tImE}+36RZWg(cVzNtRrP@IF3Pt1BwzkQ4#^hiVcUkjE3p3P|Qi10)UV!j7x3o+nLMH`V$YS=iQE zi)U~{tz}BDO>@eUm`jI?Nc6b$o+WgjQ^8xh^d3{*EpkqQckgaJ`W{rk&OYLIdt#5~ zB8ekG35e$Te$;ML7Dhc$ggoA(S%im*F3qEE0<0&JjP{EhZIzHGG!@aAj(!-@-C{+X zMVTz!-+HiJ^jJ(mIyaPVgNsp`^eL0`WBo)37VC`eGRpTt+HHp<5>bp7JUP z+>S*efe87#1@mFI&z0|dvsIN|80Jw%!%&vPFe^weMZOw_PkT{1)VN_tiZ~2e4ZMPI z{m`MY;L?oJRC-T)lpR1SSRIvhK8`{drxEAOMR5as$P&)Mi-DN(Q;l5(l_Gzw+=#ke zocspF2ACvN8D8xkuzA=u3-cA$g{N71S;wj5Zww%7z-9JA&~yhW#@MhX z*kB7t7LhC=nL%<1$ug1^B0f+h4B^?Tj8$Z#J*W_)%(5qlRMJo^ni-Z|B!l|}i% zsUa7}zzYfGF-y7#LRo?eQ02-uV-t>y28Isbwhfs4Yal{rT? z0tp#S@!^rqZURQw046r>{Rjz~k(Gx#J6qxU+FJPSS1ngsaCBF?j6zj$0VfNVMS^_- zTZ4w!r|B~qD*rLsxdw-}W}x;itE zLV+YA!5p&pKtGLFOy3xnB>e>LU#Qe!XtRgxQct&Ezq}|H)G)Tv~~3z^}>At3Up#B{mvl$sM~B^mo<0*M7Rrm zl0SSJ&&XYFG`g?ll|#0zANz AKL7v# diff --git a/apps/epg/__pycache__/apps.cpython-310.pyc b/apps/epg/__pycache__/apps.cpython-310.pyc deleted file mode 100644 index f55b3d51759bf9a2f38f77964ab868ffcbc50efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmYjO%}N6?5KcB*+5UMD1usIci?DqGkyfcaSp;wEA*4RUBO=U=!S~$5756KFk-M-{kB|h|UDnjSzqV&sfe=&e@zn0OFm2(ELrL z0fhG~?)+dCi@EPkt-UUb)!IB#WM4Qs6I6GKpjpa+VK+|&1ZfB&?X*n3JF}*x*q*_Y zDomNcGRaHOnMRwY w1Qw9G2q9u24|&9!=pq)rzk3L^RRM8P?LTX4^)cq7i}tdYv@b{BFkr{QA6%qokN^Mx diff --git a/apps/epg/__pycache__/dashboard_urls.cpython-310.pyc b/apps/epg/__pycache__/dashboard_urls.cpython-310.pyc deleted file mode 100644 index 660cf0db4bc7d5a38cbeae6a5ba2ddc3bc186872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322 zcmd1j<>g`kg4Q3i(~kh@#~=AImJaxK(lV~ z!xhGt0nI5cVgZSABo-9JgEZY@Pb>yY+~Nl60Xm^1wJ5K6B|{MpP#Ku`C9e-u48q0w pKsV?k%mZ1XS5SG2!zMRBr8Fni4&?Y^P=N6;@G!D42{3c~2LPb!SZDwM diff --git a/apps/epg/__pycache__/dashboard_views.cpython-310.pyc b/apps/epg/__pycache__/dashboard_views.cpython-310.pyc deleted file mode 100644 index b7c2d708bd863e2a7db6ffc8a02fb74c91c56f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1385 zcmZWpOOMn>5bpNd9uFD8vdRNRNKp>nCj zZRlfnQQ!|$f(c%+n&+I8?Nm-@(BAt$)%7At@I%@%cm0BW(g9<$;0vE(UVev zROh_g6#x9>{O=$N;3(z2Wi~=K68@^ztT<|kI?Z8pDw6kzey)$;~X@BF< z*(c7iuLI$4{6#qDA`sz;GiEy4a6;x{{T$K3`;*a!!Sg#$<;#@>EybPR=Xz$YJ^%I5 zFIu--_cMI9SC`9I#uKG3@6iy-eYs9$JKaMW&U9VnJ+un2I6)Sha3)KH7>qlWT7?+8 z37Z!SInn4Ut4c-aQj`O#Ps&AwaCjiAeG{rKBIA{63MM!>vVFKc-XuuR7X0^2eT7>; z+};}aJ4 zwDX#sx*KE#dGLsb6Ml>gocd=>eUE)`#yHcV@Q{^A`0t!cUP2L}FBUQSk}X&06FrfB z^kn^!qNr65RmLr1&oak^u$oLHfOVYzZ6{3ty3{MUmpSSi^q4>@)hL+1#e7~59xM+r zYsKv?!o!PIzFn0i>I=Guuu?wl_FG#F#FmNXP}tp+0EhAld*9-87N{GvZHLrNQoE!q zyI+z;Jay`8w2ap_py?tYH9$HN9^tox-*vve`57&=ew6tpDvD)U%c3wzQPhoCRb;0{ z@p4sG-Awm@?=CO=|J91pfL;VtTM>(R8d~2d>zh<8%H^~f+PqOzjApQP!K_hwveIC) z)%3RR8Pq2FEQO($o{X4An)mS*gyt@~$hbJBf!I zz2*}DGjPmT(v?%bLJz>xt`jma)sEhOz0tn+d#bwK7{NOJ=-1h&E<%4=<@N#_dI(z| z0^x{bi58e*Y-J+J!l6zhJJMZv)Whg8;x6~zBJK%1_kVV102ZGIUSD$4u+>$SqhoksN2f}O7Y>aqY&3K_iUaxm2*OvZ4W9jdYpIrS7H=d@%#Ea~V zNm0(~Q{%77;`K^g?Sd~QDgb7J{In`^p)ZN?PGnZTGH$t&GIbiaN+3pcZ9J5TicEJDc{$93R+O7A*a<r6L+?(WJwG0f*!0DC z#D?EJdomnNl+9`)Xt#P)2+7qJ=(MAog0uR3DNG1uZhXdBDM^EDS+G~)+$7&tl@wXo z`l3R!EU$|+E)BSes*=H|h+3FL37OS`H#JxGmr~rIW2!o!{0|N`qJhH$5G)*ifmsHQ zffL{axbvG2w{efwr2pmG>3`LKhtt$CUR~5um{`}Ds+k>86N-{IlG=uJ|1Gku?Z>bi zygb0`tFNLN))s5duVMi+@B2h4@Pztns-2bXyZNuVxp-y ztJ|J;xX`&OmUU5;rh5PtnZo^A9DQyNd|}CZ;qVD~tyA}aglGpK(8D2o00iqhN+T2T zc~;J<0Y7PPnQZh`T}Z7Qh@!i8a0WN6Yo|xqr_*>(?c>&yh(R(9}|MWqS9Zs+A2 RJG9z9$O!^4;vMH+?;mWtRHOg^ diff --git a/apps/epg/__pycache__/serializers.cpython-310.pyc b/apps/epg/__pycache__/serializers.cpython-310.pyc deleted file mode 100644 index 74dc4861206dda48295665b0380c690d0d0cf6ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1295 zcmZ`(J8#=C5avq{JI>2_G!4=ppbqvQD2f0{6eE-5uJ!Kp_^gNGq zF@t@nVz4i}VKG-6_7rYwfp@mpbqNkGqlUZRYrtt9ixEKnqOqqKfbr|SXTW+Vx=JG7 zu~a!RNpcP6tNWMLRjD1Hn#=`BnaWFjj9L6QeuIWt}SI=sA-1tj+CFK zNjCdpJm|=I@KI;ZKTmb0>~CVWAzHh?2mPch(QIFrqkiLRd*ziA*qjf^_vk_*Xos3z zm<}Rg))8a_-6lE=KLXEYI~WVVVH+0p5t1&gBTJXK;N&%=J#eD=5Al=01=h^OK5)d9 z0FDH36etg_)pwh7@*4~xBM$@T2z~@+55Rq;V`4h!$F%lL(OY0h5rAWZh?y2-85DcO zT`-)9s1amNSe>0aUVI!kj*O>uDsWL<7BI*8iwn$fnB z=kU(;m%?0{dNaQkw>9+%P-pQr%DFe^!1m_fQNeEg1Yg2qd$km6{O6AB!Z%P1&+0Ay QW-JP#LpIX__p-7zAN!-{)n@M-*C4TH%-5Ul; z7>8E(hfy5C?hh+TRWQzyT3ol5VAx0+aU)rX7i>EmHj~A8ku$|*Br9LBXFOh#RayIr z#mllT8+f0Q3$ls#S-B{e@IEK~4c1;h!unX77u9U1tCj4SZua1aQ=cfJTX%l5kxq0^ z6~P^yZtHG>FM}I9-O)%5U+^L{{X|XEky^*sq3jw(9YsV^s-fwUW23vHtlKmFbkw8C zj(-9Qh3N*K>@x_%27DkSmtvpKSk7*;Kc1cOoDUr7JP`V&U)VJu_X#-d3>U?uu4hT4gY=wtekl z9Yv7dAK;s;@VELyqcnnJqtG#XV^vhQlzkLk(Q)OdT1!k(>;_lo9xIUV$NXnmAtSreimLSC`|kc+1-*XPmMqoX?hRiV)5 zHlpvrGM!LNb2g8vplBXAhe##k9w2f9|B%mw2@b+T_UBE`a&Ztz=a3`vH)oEisxpwFjP}JWu&oMGk6Ph0GPOY+EAV9vXBypQql(MW*VxC{s@WRuVFq@_+i;8vLvA_w{2nZwyg>z5Y^sQT3r+UTaS%0*>^5yN{ZT?|p zOQ*@oOL2XreWnPtdN@%T^3~Z^rf?>Dh&1Zd%bJPt|X5>D*4k37xhrGrsqQU83;SFfQS%U5g@yhoE zFaJIdzZL&}_rHw`KM>(l@yhyn4P=Y(cLFj)AbT$P45TF;BpgGk3F-b-09GKgoaaJ% z(%*Mx4j^NphqrskW^V2RX49FMdj~=W1SJ{fK8>FRc5HAmHq68M*wBuRjCbGzvR@$8 zBNGfl%;W=dd{zO(nt(zui1xlbhRA6MJ-ocj@(43lw%MV;3fi-3UPT+#;!w~roorxDe;=NT=%k~}_3xrnw@AEG znu(G&K^1WT(jY~@3&ZsNH|S#HxbUsqw1uy%d6qu(`xww}76Ag-d7$?66>|S05~~n} zOL4RGps!Kq3GDTUWd2Uc5GU)LS5}KxO9lF;H0oz0J|gikM0?SKKDKj$sPv~~`8h;f zf9+%n2TlEp(r~i?&4X-*yF z|266$ex%3N=O<7MJ3w`&>*1foMO+O5I%+!?8R$bmbEQWX)L+N8K_&CH3vvi>1G>wGvp!vF-MiXKuD0Z6>+|ca z+t*tgak*2^?o_YChuxaKL)z~l+Cozn=?xNZxw$s&#>0<~**@8Ddi+a7Pj8g`kg8jcXr|$yNk3k${zzXCz0CBMikVs)jVa#F3WsG8EWJqC3Va{R7WsYJ7 zvRR^7QW;ZNQ<)dAE(G#Y*m{}M8Kc-z*n=4~IbH&FGH5d1Vkt;0$#}^K;Rv_}xVt14 zXC&n(7Nvw`rj|$XrWT~fr@(}&xZq5Eklwt++*ChJ_FLR3S&4b+`Ff>AImJaxK(lVK zmH~Aa7qNiY9Ek-5@gSwQ*b|H6K@zvPfhvI(m!uZu6|ZC{;sz=M6Td|Dfr>%6SRZJ! kKFC15g34PQHo5sJr8%i~Acq!%0*8lzhmnOzfSKbz09}nx4gdfE diff --git a/apps/epg/__pycache__/views.cpython-310.pyc b/apps/epg/__pycache__/views.cpython-310.pyc deleted file mode 100644 index 29350587281518f73a3038a37c5cb9bc9b0a668a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmZWp&2AJ&5bmD;nVp3d7>gt*iWKEA2i7kTMH~`H5G;sA2^vKj4cqPg@yyQ9)oY8@ z`UF=?JOBs#m~)PKg1kasbMiSiPO0iy8wYw+)zx4BRex1AO~0QoZ2!LdbNZLZ*grJ5 z+7M&+P~dk|f(c%+n&+I8?Nm z!sg{dPBcPgRjCLeMLD4Qq+C=;hX=CSH=*i0GG3{sV1k1q+lSlZO@iUslK%%&U*Ogc zyL)BZk^s51cZf{FuzjrtI2oe=CF6i6Jmoj|E?@6_%KH%g{EU0@&vM_Q@d@{P+IhoH z-3`V9+4qS36Ml@mpZaG^eTRK;#yHcV@GusU@ZUR^(FjF^SS(`1l5K<#6FrfBM6&)! zk=Lq+D&v-?=b2+dSWPApzyjxg+es6EF7*oTXO8*`5fezI8U^!rn8oYCFUv#BRq@T1 z*Wtw~->%9Mb)D`Zu9Q!^{nnNM#mGc+DC}+u`=PuNv#)VF3)D^8wnOR`sa;YwrnkwW z=yd8!w2ap_py?tYHNbErJi>1WzZ-mg>$9-X`cdYas3?|YEsMe=MNv0mRgs+*#j90W zbu--qzP-Hg|5qzY19}lqMMW&)X=t%g);FnGl*?%|w0Wbb1kGRz!K_hwveIC4)bzIS z3@gNPk?$%jo?>62cSnsn7<2}wu+G0#e5%UIJ4gjS@!#(MOXgUpV`2*tiLt5c{v20 z(5ff2fdwqL<}6}!9&x5I&+W*0Zh;NXTMHayv(9gJ)B%2IjXReVV~x2A=OU9yBg&#y z?z{xd>sP6McJmq#ctWebq7AKxffaFJkqta!k%OI?tFxdt^MTRb0T;ZbbHc$VE`Wfz zaLEaG4emid<1m0*h8q$Wnz-8ruNfa^qV6nhiW(8qC67;*?1X17++A{$^V9#$dC$ZL zu&%w~KB3-?w||D-yZ-MMJ^B2D^#%D1@YZZN^JceaYw#s}1sghZn=9kd9r&75`$h%( zE4hwHJU^W#MM09O-qzOE!&nre5lOCsX9v#@%Y{r)aRGaZzt|l+s+TO9GEOBX4T9=c zQp^*19>2zO71SsxP+XwuouWK0YmAFzj>^&d<$IFd^eQ=vb1brEs@z2(-YigcYm+B# z&MPFB&e=R~PA`IA_g^0UvhnjzFNqu0=@em+V;zH#m^K%q!xgi!YnYAggBO>hHj9@| zOOawNhlG{Akhy;Eah?>fshmZgD=(>pE_-atd*ovr<+}C`L>(t-BTjM5lm~c{Eb?Z| zr5+&Vo(RmLR^EXuY3Amt(}*S~&o)yRuui3@^en2dZW7tVjUWwtETFZhG^4ljtM(Q3 z#c#!-Kxo(^3`~x{Mf)aR$&~|%#$=^_u}}?BFVMjguGQR zdw>-cfJG`u6Rr=^-7!7f*I$dYHPd@4vTf?_o<5-pcBYAJO`lrOTD_-bnPXC1yBy(J z)0+KVD)5L7+QM+Jlqj;|M;Z$kW=WBiio>z;&55)&-p=;n&i3vz6_yoVf4hHJ@(~qc zwyOu5Nmc1pZ(@~ge*D5WZ%*l?I+ywv;?b(VrOme-&TZ$t)8TByhit@#Y>f>VzjFR{ zx|$mh6ViR(aQ;6ge(b8Ct#bm$Mxa)c^$+Bv{jW?`Cy?LiQg!Z+MYq;t;*|e=+mjy{ Op_=}D){y(`uKgc&D0{8| diff --git a/apps/epg/migrations/__pycache__/__init__.cpython-310.pyc b/apps/epg/migrations/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 178f55972b9d3c679f34b760c9e66dfbbeb4acc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmd1j<>g`kf}Cwz(n0iN5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HDequoZ2p8+8 v7NqOvW~LVg`kg2|CR=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2BsKe3GGXV(}1^_l@7EJ&E diff --git a/apps/hdhr/__pycache__/admin.cpython-310.pyc b/apps/hdhr/__pycache__/admin.cpython-310.pyc deleted file mode 100644 index 7c447de01dd74cc4e65059152ff8dd0d11f55db5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmYjNJ5Iwu5Z&=7F(wXla0NF>OMy_3B9Vp^(79O|&yqM=e^}c{slyfML89R#++ka) zT!D(&b&-rTZ)ZmD&1b793K`i~{l5C4_tzxH=2J2wZ>|WCAxKt00>IEgS2~58xWEK_ zc*6aJJBA+mZw!3_8-M5SAQ|A`k;TJ3saXu#PqE0$J@i?)m@gjY;x*4iW(db-C^Pcr zoItPykR=X6;-W(hU43@Y-kP3Nik?+2N|ak(riIWaXgl*9^=aFcLh-EX%61uhI^dSV zxehrmD(s}7c*OZjmr5fxnarD(W8Ty<-F`C_(H<85E~aT+8*ip-T&tM`7F=u zY#?BPV=K#en2d3gmaA%#Rb{L4C*=@94`{NGjWTQ?_O^K7pPP))561RN^ zICAC%cn)7V?IW-!>?DO0?(qct79VT8wn+@J$~Jn2NK79r z(e&g--2zPwX;o>xkxo{u@`l0`%V+_YX_MFIWm5yc!P?E1qtnId`2u#?3f^aMwS-y@ z7nxXHsGlT-Isbhy!{2KhB3YX9sq&p&OpiRBSHFl+$FV!&#b? z4sDZ)eW2mf4yiKTi&Q|7GT8h7&dtf-ejw#%X&;I95$&s;ZADo~_W<`n-d5ex#O}a; z-2D^L7T?*Tdz?z!7B>6Da?@U+mcj|WOfH?69qy_DSrkS>RHCe*N`lZvi)fl93g ztGGf)OV{xO@kcs_7Pk-QDu~`a%p8vywJBywH;ukCli~h@W7~u#Fgp MW{Bhdvu+38Uoz(O%K!iX diff --git a/apps/hdhr/__pycache__/api_views.cpython-310.pyc b/apps/hdhr/__pycache__/api_views.cpython-310.pyc deleted file mode 100644 index 28cb58dcdda1fa974aa32071337ae08d329cd825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4695 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 diff --git a/apps/hdhr/__pycache__/serializers.cpython-310.pyc b/apps/hdhr/__pycache__/serializers.cpython-310.pyc deleted file mode 100644 index 6a51d0ee9fabd8f501e7451312d68cd266f7f43f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 699 zcmZvay-ve05PKcLC7eI&si7sV;EsGWP+%}M(Vke+>h4(;WB}PS+mp7qjd{Ku8VVXi@1yrd-I}qZric^~`gtCueTs)Mi@y3ZvL4Od{L2s?T zj{EU!W<~d>Fjf7HvG-L%?`Dz*$_T$vB JfCTh_eFIM~rnvwB diff --git a/apps/hdhr/__pycache__/ssdp.cpython-310.pyc b/apps/hdhr/__pycache__/ssdp.cpython-310.pyc deleted file mode 100644 index 0b2fb71a35de2c7120eb11a8f513d4ef889d07a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2301 zcmb_d-EJF26yBNr@p|obLWok83fK!I>Z)<k}J4{7eJBhOWuO#*h{#|8$kFeXT~vYp>V~n&Y8cnGduHr=bOm3Ed`#RfB5#` z$E>3KBpRhPLeNm@&r8%tvW@$g;J!-KzDBgZPIS*8Mn6L`#Qa+6nGiYhDdOr>g4{$Avt6l^Ft{;8x3u%*XTZMbgNE1NMeushaO|FRN2|K%xLbK_BJ(9n+v zO?7`5CA6rfnmDY~T%2U8i7CHV*b3lxv9{sGv9M&m{UjlADSn>XqB2-~QxJH+0}iWL z)qame8qR!A`e2Pvn(N55@!tU_gG*5J((7a_6;{?cehQESuc;Q5r zPp=g-lhRI*a2h)M5t}n=cfHrx>ejY_T2IF`;R$e!T=I;R&IR4wK+#~sCR7*E3_6s_ zl`i#Za7>A_=yG;)edOawEL8%#(7%YjR+gmQ7%QOpHyI|G3oV3_Z<2i?XV{71ds zO|>UMNYa9!`(Sr($8FZOdM>a-v?U<`I{#R#!yuOxW{auym<1u1hh9|KTcS%N9{1Ri z2occE-P>Yh4(3oE1ZD3*S0W--@d_#+j045%5ea;6IDB53T)iB=;Vk6Awzk_M zJ(<|h1akF1W#S(K@qeg8OQ^$j+iJPJsw2{?>J5QQ{~{Mmq|dqdTUT=LT)i#HIEt-)w&EmQ)8X1Vza#|Eyu!}4MRNhys7Ban?`NNHTesS!pz*ncj$ z^>;!oOLcg%fP}IeFiUbB90&x`UPyaYC^E(`AQZV3VA~q95dMRG2*E{^nvfzq2oDk; z+OIt#;Uw$sK?URi#Tr2#;`m7A8o@;U22XWyZ^$0wwVn*zLgGf!&r~4@#DJS6Gg<9H zeq8b=f%^_FKe$1%mCf7p8_yNHhL8i$TZ4FX6or$k@)lY|JBgS9(mx8F6qQ;1RR(rQn;2 U3Cf_U+T4(d&1Ey6U(Mq`0S%=rvH$=8 diff --git a/apps/hdhr/__pycache__/urls.cpython-310.pyc b/apps/hdhr/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index 1a6ade767c4bda1071b2f7792aad47aa6b4fa364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 815 zcmY*Xy^hmB5MKYpzj5LuM;a(-C{mD=Gzfu|;*bu6E)qi9SibCB;^2*=T{{P9sqYOa zprqyn=y`)}sqPi7V#jviZms=1-^}dH?93KX6cD|BfBm_7ViEEO$=!w4mwL-z8W>?l zPPjo0Zc@`gZsr!ZsjX#;*?EUM)Zs35xko+jQ=bPk;2{mQy+gZTe<3u2Xwzd3ILu|< zwPg@6m=7TfSa@w|xqC;B!2Q<$PFSzC^}(xo-0}hVH6ONo1VPPDkgpsXL#(q6o)H?e z2MaP8-{@PAiK*;eTCSCwZI^k)U}C6f4wq?_m*+)Qg19lz%~6BX`RVx__Sq8NXK=NE zQuXJVTo!u}uim{zor=z~EmXTB9W``Ore!6M%9HRL^m zh8%{?Kaq9ujV-#T(`oC%rk{9DTRGA4+sROcY?E$R#k3N+6sB&V&<~2Ju>e^nmqHhG zRfvyMQFmAh8;u>jvlI?`y9geFkAN>vgc_8W?siFiA*VU4JOQgr>Om$XzaSi=t@9%2lH+wn{X!7XRltQk5?cb}E_oENOh;RQ}yKGG1AuJPEgO~;IluGKZ- J_Oow${$H(1@pS+I diff --git a/apps/hdhr/__pycache__/views.cpython-310.pyc b/apps/hdhr/__pycache__/views.cpython-310.pyc deleted file mode 100644 index ab3e4c084d335d0007941cb1023b66beaec31c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4691 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 D1ewq| diff --git a/apps/hdhr/migrations/0001_initial.py b/apps/hdhr/migrations/0001_initial.py deleted file mode 100644 index 74153d0a..00000000 --- a/apps/hdhr/migrations/0001_initial.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.2 on 2025-02-18 16:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='HDHRDevice', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('friendly_name', models.CharField(default='Dispatcharr HDHomeRun', max_length=100)), - ('device_id', models.CharField(max_length=32, unique=True)), - ('tuner_count', models.PositiveIntegerField(default=3)), - ], - ), - ] diff --git a/apps/hdhr/migrations/__pycache__/0001_initial.cpython-310.pyc b/apps/hdhr/migrations/__pycache__/0001_initial.cpython-310.pyc deleted file mode 100644 index 83bd9d859471e445a650c3dda275abc1642602d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmYjPO>Yx15VgJAB)i$P0Se++I3VTHw0DFGjY@lHg$k#=SZ-#raoDeVcPr8>T=PRX za6|kUUpeJ3AOy_1MXgse>t{dty&1b03_?bu{_#EeCK&tKg8RcKa6nPLpacwf$}%4F zOvHk-w+sY$Ul@4E7v5(t_P~G7MjLD5vXQW1rW2!TUF4PRWCdVaP1~*eBOq`Lh#2GleNjQWp7_RtC zBtAS?iG;^}ct{2x+2HiQvkx{ro*bV~@Jdh73JphAoJ>Z(jZ{+?a%xc32)17uohh@F zA8~1e3XN8&zD65ep}8n3l)1{#4rWGU4(Zat>&Fvam8zc3l`%V{Qe=4E+W?#qsbRh2Xl9Fkw$tSLvO(Lgn;eat7ENBSy_UeursG-PIq1wZ zrcj-YBHNSBg_JgwlDgldNb^X_%SNRwnNU~fx~5WW1Xz-D%%>VFLob2Z{-LY=w7oae zYT4+GPF_=2j#>>H98z63)9rUfMdw`MNnT@ux2s`M;_dZ+W#$>3;L@+rSe0cP)p!nb zGroHzg`kf|6}p(n0iN5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HjequoZ2p8*T wq+}H7=VqoCC6;97=N0S6$7kkcmc+;F6;$5hu*uC&Da}c>18Fa20un3?0H`_}DgXcg diff --git a/apps/hdhr/ssdp.py b/apps/hdhr/ssdp.py index 012004f2..660d9c2f 100644 --- a/apps/hdhr/ssdp.py +++ b/apps/hdhr/ssdp.py @@ -1,23 +1,29 @@ +import os import socket import threading import time +from django.conf import settings # SSDP Multicast Address and Port SSDP_MULTICAST = "239.255.255.250" SSDP_PORT = 1900 -# Server Information DEVICE_TYPE = "urn:schemas-upnp-org:device:MediaServer:1" -SERVER_IP = "10.0.0.107" # Replace with your server's IP address SERVER_PORT = 8000 -def ssdp_response(addr): - """Send an SSDP response to a specific address.""" +def get_host_ip(): + try: + # This relies on "host.docker.internal" being mapped to the host’s gateway IP. + return socket.gethostbyname("host.docker.internal") + except Exception: + return "127.0.0.1" + +def ssdp_response(addr, host_ip): response = ( f"HTTP/1.1 200 OK\r\n" f"CACHE-CONTROL: max-age=1800\r\n" f"EXT:\r\n" - f"LOCATION: http://{SERVER_IP}:{SERVER_PORT}/hdhr/device.xml\r\n" + f"LOCATION: http://{host_ip}:{SERVER_PORT}/hdhr/device.xml\r\n" f"SERVER: Dispatcharr/1.0 UPnP/1.0 HDHomeRun/1.0\r\n" f"ST: {DEVICE_TYPE}\r\n" f"USN: uuid:device1-1::{DEVICE_TYPE}\r\n" @@ -27,25 +33,22 @@ def ssdp_response(addr): sock.sendto(response.encode("utf-8"), addr) sock.close() -def ssdp_listener(): - """Listen for SSDP M-SEARCH requests and respond.""" +def ssdp_listener(host_ip): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((SSDP_MULTICAST, SSDP_PORT)) - while True: data, addr = sock.recvfrom(1024) if b"M-SEARCH" in data and DEVICE_TYPE.encode("utf-8") in data: print(f"Received M-SEARCH from {addr}") - ssdp_response(addr) + ssdp_response(addr, host_ip) -def ssdp_broadcaster(): - """Broadcast SSDP NOTIFY messages periodically.""" +def ssdp_broadcaster(host_ip): notify = ( f"NOTIFY * HTTP/1.1\r\n" f"HOST: {SSDP_MULTICAST}:{SSDP_PORT}\r\n" f"CACHE-CONTROL: max-age=1800\r\n" - f"LOCATION: http://{SERVER_IP}:{SERVER_PORT}/hdhr/device.xml\r\n" + f"LOCATION: http://{host_ip}:{SERVER_PORT}/hdhr/device.xml\r\n" f"SERVER: Dispatcharr/1.0 UPnP/1.0 HDHomeRun/1.0\r\n" f"NT: {DEVICE_TYPE}\r\n" f"NTS: ssdp:alive\r\n" @@ -54,19 +57,12 @@ def ssdp_broadcaster(): ) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) - while True: sock.sendto(notify.encode("utf-8"), (SSDP_MULTICAST, SSDP_PORT)) time.sleep(30) -from django.conf import settings - def start_ssdp(): - """Start SSDP services.""" - global SERVER_IP - # Dynamically get the IP address of the server - SERVER_IP = settings.SERVER_IP or "127.0.0.1" # Default to localhost if not set - threading.Thread(target=ssdp_listener, daemon=True).start() - threading.Thread(target=ssdp_broadcaster, daemon=True).start() - print(f"SSDP services started on {SERVER_IP}.") - + host_ip = get_host_ip() + threading.Thread(target=ssdp_listener, args=(host_ip,), daemon=True).start() + threading.Thread(target=ssdp_broadcaster, args=(host_ip,), daemon=True).start() + print(f"SSDP services started on {host_ip}.") diff --git a/apps/m3u/__pycache__/__init__.cpython-310.pyc b/apps/m3u/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 7d908857bf1c9476d8b5721cb3bf38d7a6919787..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmd1j<>g`kg2|CR=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2B!Ke3OF z;7E*9$*tSeNvS&j=E|gU?JiZmJ(3dj@NsUrxV^{j_wDVK-ELr^4gdLjIQA^-U;0>V zE0+Q-f@3p>W<8C#17umz{KuCXv2N+EH+wt zA6?yo5LU>z723iH8=QqMw?mIRVUsuDgR8Hd?)h_(rG=0UteMcM{pnGY_L;7B2EO*A zsEBhBMLLM0yySI8dMAor)NwYoNN{3l7e+6eO(KxGRoSj&5 z3G0mb@5A+YJf^PJ^No7lK(sbKl0Ie-yNVLPw;GIoJ~QK&fN(J9K281wVh#jAZ~#IB zAh^OCGJ=A;Lp$`j$D6OMumy@+Q6So*4hOAo7&ioh@U9u_nz0_g_S(W&k1qkpWdr1l zsBOciuN#Dh4wRuPs%54-Gkr+B>2@9;Myiq`&XsPZDvFaTeJS)xJ|=Wu*9p-(JCkoW3De$`wi8G8F`%1Lyr_k$w2wb|q(pTw zHoCqaqrW32mh8#xi*a4zZ*uG5DXEtud9Um8E)D>TkBqDGb9~7!NSxlsDcGN3jJg~^ zOzvKE=Zb{d8C;VsT0z%Uwjp#UOH~!|RE@LvNVm-wQh};kSBY3A2jE|1T$wwqo2jWw zN;fImvQUO{y{ryOiEYk^k%W@=rn4krCylRXF&NEc%?hmKj7e)$5u2)rhdSchUL&vr z7C1d7X;y-Mu3cGN7i$V{puoDI-qSrGg!Dpa(~{7@mEWl6R}l5y*rMuaEOb|jp*W1j zafRuHZi>SstGO81as%hfA0Y-z{xJRf9)CN7<^^cwS2Xi$65l{*zm#0av=}b%c!t4u zm~tC^UP%oGsH8Oh{-~+KoU5b^mDJP#y|nNqP2**zD(wv1D;*^tuk`FE7`{X|cbeFN zS2TuXLb)Bq#jspU%A%6#-jwv^*i| z14wLGBmRJ|@Rrql0xS^MX)D!Hj(qODKKJ-hMNvp_{QC1F`)LvK+mPeoB6*6x`i8&> zrv(v|QDHHQ8g3P~aF~O0n>)ooxXcwE^MucQ5wJjnEX3S^4Z-Fd*X&o-N?Et~f_+^nI|F@|2`1r{A5 zvo*+TkS}G`)`!^i0=5#=rCI;>m5J&H`_MWsvjUD1wm5CIpYGbIZiw_`&(N6vAyrVO z0<^d7+o~=!6+6;Js&9UhneM6^9n;R2I~OZvM3X&3QO5{&^F#V9FPkU(mPyXfS8R4v zpQzsPo5fTQ`BhqG)v}d^lK3Quv=Q`u+-j3-C5qlu^5YV{;Q1)&m}HRFd2)>>prm;) z(lg*22n?7fhP$upq~D~wTdUD}mMc`zUaI=#dWc=|+Avls?HCK+iJTh^1Apf$6fwVA qp?RF-iK$uEpR|7_D&7`wZmv~5M2N|VKBA80S~2ZEJEqRR@!&sRgx~l8 diff --git a/apps/m3u/__pycache__/api_views.cpython-310.pyc b/apps/m3u/__pycache__/api_views.cpython-310.pyc deleted file mode 100644 index 806ad1771fef1dfb56bdd0ce5910a701eae00c1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2778 zcma)8OLG%P5Z+m>q}9W=o_=A&@<>1=5d_HNkV@e)&s5=}u*qR_nA+@&+!|30<1RFqpweXhg&%k?8^eV>8S|mTPG}6K12Fo71`#<|Es+wVn+NQPC}G zJr|auvRl@AKAel@-FdCs;X+h#D_Spv)u`syKrgaVSdSWRBWk+MXwhBNSUFsZmfhuO z#a)S3-Bpdvg{Pu5cP(0X*NJi0VDoI@mBAJ`**pC*goA92}_dy<2m z-*|ZcdoTfY;lA7$B)hzq1iqJW22fo-_qts!s5eMrD*as^dH7M>=RL0ZFVjp5IDmYn@6ZcU+^rRFygllk!D3B74F@m`~FoXkBTKu(o z#q0O6%PZg^Py(u{)b8(#MX2ii!y-k3UE?RZP&C09+*6r^aO|CnAM#E|GX$L@ zmS7RFjA8}FDvEg&r%ZMdO;%ueX1^jY ziJN6PpmR}GAB~a-Sv`6yhM(?;0G|cvq)DWC4BP`AC&4p5L+RmX6Kii`A9tJ+%-{VE z2OKsrDaMNjy&wtjMLIB5bCNuiap{YokBOuTkmmYHlUsfU78p0w@#>qV+(VhNn{q0h82 zgTzMw122}+^K9$4b&4IWNxa7a#8=L9Mvw3`H-?udrnA&|kFB@}+YZ+;I_YD1oF4)& zwB_ST#|`x?bWH%f7ZTuw`Id|+@WTAbV3}Va15zqL7627;K!x)3X2bgN{n`RUB-$W= z1a;J}pukNv1;kaHvc%^ITmzws>EUU>#C1fSiO^xeczq3B$Gw*BgQVx&a}r_rEjF5WKMtA*7ZQ3 zcd^pWOdS=MQMqyFnds1cPj=gbBnYKIaw>Za3LA$Nw&(S_aa-=jBJl@_6!25eP^A>! zO_ILAileG2;>Uuw^=}JNLOci6lEdOy6h~D7UsY8)s(@10#8Gv?*HvW`Pd<^O*y$`T zKfpE8cU@OBT_eN=ToVbT-8dCC2Qi(r_BW$y{Vf4V;#*uX%4GJhK^mk&YF5pz*%iAn F_YWggyY2u0 diff --git a/apps/m3u/__pycache__/apps.cpython-310.pyc b/apps/m3u/__pycache__/apps.cpython-310.pyc deleted file mode 100644 index 37c3edfff1ba8ec554bd462e6edc9d06a4516cfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmYjOy-ve05VrHvrX~Cc!H87GEa}h{A)pdWbU`dxEVt)ILCz0xgG41J`V8<4JP0r0 zm5Eni;x3e`XWhx?JAdDOcDcLTXK0`AZ|Ny#?2D3Z^DwzUHvg`kf-PN})0YG3#~=u_>CC&C&I3~m7HDo}B)C7_@j7yNb&nv!w zc~EmbZCTEE*~&ttNQOC< zXuTZ(GeJ5AQg?u9GNUh@SLDLe?uw$%l~>VA7ks(PWt?utM@7Q~SLx%!Pg6V=S6Zc~ ztxWZlrw}n^+mNFxo2M2kWmW3?-Ds+7k!nCd6q=`tN>8n2vBm*B=;GRVnSjZ`*395v zzR^@ePlk}X3EPtyFSRmmA%w(Z4t?V(E>2CjNz!8Z^HCPdQi;g zND9LoTpb|)8bDK{`MGf?TsWqsdFUqBG|e zMUZFS%x6(WR^CtadwSvPVCBz31pY?{OZme2f{ckrbaehcB^LoD%YhDjEy%_ZDV}V7EBorBig#l1WZk^j$)E0p!AfhdD|#1Z{t?) z@T}x>U4gNyv>b+VAC~0}WCLVxpq7UXm-PXHZDSeAZRj<7(<;qdrO~OqERLVho7ABm z(qE1n{kiX@H2T*0dwKhRoq?7|(2!A{jf%j>I*A`C7g<2O39~ztS&dKaS bEymFYYg9gj+7pFPBqX8RFQTy<)3@nAW&)g; diff --git a/apps/m3u/__pycache__/forms.cpython-310.pyc b/apps/m3u/__pycache__/forms.cpython-310.pyc deleted file mode 100644 index edab18ed8a21275ddd136570147dd245f3f074f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1889 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 Wzb3AbT;du)4Hj;*x?aCFcjbTB|K*wh diff --git a/apps/m3u/__pycache__/serializers.cpython-310.pyc b/apps/m3u/__pycache__/serializers.cpython-310.pyc deleted file mode 100644 index c8362f78d53cc170b0e25f81827b6b4bf6885074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1535 zcma)6J8#rL5Z?9k?7Jgyd60yMt^w&Nk|Hfap&>L$6KLG5tlPbl!9JT^JLJ-amfwJc zM3I)Cvn^HXbX3f&@1>jzR@%|*?09B&zHgj&yCH$~``3^0dz+9ycvxKy9FAeD2m~jb zrX-^grG#7DPOZ$2?97Rr%#B=1P6&6n`;Bl{&`;jA9rDtF?62 zJl*a}I$=l77<%@TMlQD?k$tt>km%r4l<~mPR>F0AWZuTgX(4o1im|w4MO?yjC)yX6 z!?fb!Y~bk@W0N=&jOmcEEaz2PY>gw zz^x9mqv~*_@dw3JJ6Kfn&*Qj3rCp8bO?SeHd8U z$>PaW2U5hG<&$)}R?i$*89+S%;9gUf8o^NFENKVZuR~}jkdsw1)!nK{^Oy_H09~Ow zv#T)@SGTkHlBp6Z$dnEe#o}R^TtI*!m`eC2E_GNHe6IU7Llm&!9t;wDCm*5cp;#cj zf&&6*Ja*8-z&Y^m$3YGobmWVIZnAX2AXgih~XFttmiVA8N}o>sHvfy$ov0jC%#uM+bJL8 zxvBRr;lf<*p$DGM2BCf+g(}%d0%^YH^0UNOY0pfpsu9Jxkywo0IK^RJ_NWHQ6oBEH Zvg+3B`uFe#f2Il<+96xCXZKn=;Xg1jRkr{D diff --git a/apps/m3u/__pycache__/signals.cpython-310.pyc b/apps/m3u/__pycache__/signals.cpython-310.pyc deleted file mode 100644 index 3dec154774179329a68e7e777a3371b634befe45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 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 XOEa{hKAucvQ)vzA)N)X1JzMxcQaGD3 diff --git a/apps/m3u/__pycache__/urls.cpython-310.pyc b/apps/m3u/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index b4de8e9b72ce5092931b1651c60bf6f15ad86ba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmd1j<>g`kf=$0Rr_Tk_k3k${zzXCz0CBMakVs)jVa#F3WsG8EWJqC3Va{R7WsYKI zWJqO9VM%3Pz_O4bg*An(mpPp=iZz8jm_d`{B~TZGCgUxZg2a-Hmy8gOfUj|=OJZ?G zQhs7lN?2xU`7O>A7&nSH*SItu&IM`BOUzC6(`38FosyN9m!7XzT9i{|Uy9tIvp0cMW>04;w?#{d8T diff --git a/apps/m3u/__pycache__/views.cpython-310.pyc b/apps/m3u/__pycache__/views.cpython-310.pyc deleted file mode 100644 index 5c0ba1193c0a6e67edb55bdf1559c6a4cdaa7e0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1572 zcmZWpOOG5i5Vre0J-wSDB!Hp_b;M~dvxi8W5DF5jph)bZ3=h$lR&U!o(-U|1#C9{g zqgjNsxd!nAI3yAm&PevZ!ab=e*XQZ$!{JZ zzv5zd1h9Ajq*lNfVN{TsW|X4r2&Z;4*UGN&YCrR>?1`Wbv(U=Ei0WR}vvMHfx}Wu} z9Ev1MxX*hmV!h`MNa0#~NLbAJ&j{;t_tL$jmo(dB;g}4QSC9c2QWHqtFfKvzKCk!! z=0VN%v}HNtWh)Ea;@Q4vCsmV6{qxrdUCtUA=f`XPLu|J^8TmOZ01S_&Qkmvk>9_-oXMscfKHF;t?I4ze~wQK*@5T1Lo`AD!8N-Wx-k} zAYT#|UIbqU&t(^7H-zDOIs*hT&t^ux0`;+Z}gA0OFz zq*Y_fw?Q*KY1#R;`tlxDep|n_dzPxMEV)vroe<~uhK_M6X2KeFiV1)93t$6n9w=St zP8pv|*~;oWO30C|$}l$GOtp>iMO!dsJd9|oEfX*`!8(db9)Z$huI6o{xV()=y~DGT z&vgaHuF`TC%6-_DH;@gGy@pyIwprE(2)6BHD7T^4>~*U&ZB(bo)g#c4PV${Rh@^nVSFr diff --git a/apps/m3u/migrations/0001_initial.py b/apps/m3u/migrations/0001_initial.py deleted file mode 100644 index b6c96e95..00000000 --- a/apps/m3u/migrations/0001_initial.py +++ /dev/null @@ -1,50 +0,0 @@ -# Generated by Django 4.2.2 on 2025-02-18 16:34 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='M3UAccount', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(help_text='Unique name for this M3U account', max_length=255, unique=True)), - ('server_url', models.URLField(blank=True, help_text='The base URL of the M3U server (optional if a file is uploaded)', null=True)), - ('uploaded_file', models.FileField(blank=True, null=True, upload_to='m3u_uploads/')), - ('max_streams', models.PositiveIntegerField(default=0, help_text='Maximum number of concurrent streams (0 for unlimited)')), - ('is_active', models.BooleanField(default=True, help_text='Set to false to deactivate this M3U account')), - ('created_at', models.DateTimeField(auto_now_add=True, help_text='Time when this account was created')), - ('updated_at', models.DateTimeField(auto_now=True, help_text='Time when this account was last updated')), - ], - ), - migrations.CreateModel( - name='ServerGroup', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(help_text='Unique name for this server group.', max_length=100, unique=True)), - ], - ), - migrations.CreateModel( - name='M3UFilter', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('filter_type', models.CharField(choices=[('group', 'Group Title'), ('name', 'Stream Name')], default='group', help_text='Filter based on either group title or stream name.', max_length=50)), - ('regex_pattern', models.CharField(help_text='A regex pattern to match streams or groups.', max_length=200)), - ('exclude', models.BooleanField(default=True, help_text='If True, matching items are excluded; if False, only matches are included.')), - ('m3u_account', models.ForeignKey(help_text='The M3U account this filter is applied to.', on_delete=django.db.models.deletion.CASCADE, related_name='filters', to='m3u.m3uaccount')), - ], - ), - migrations.AddField( - model_name='m3uaccount', - name='server_group', - field=models.ForeignKey(blank=True, help_text='The server group this M3U account belongs to', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='m3u_accounts', to='m3u.servergroup'), - ), - ] diff --git a/apps/m3u/migrations/0004_alter_m3uaccount_user_agent_delete_useragent.py b/apps/m3u/migrations/0004_alter_m3uaccount_user_agent_delete_useragent.py deleted file mode 100644 index 4dbf71b2..00000000 --- a/apps/m3u/migrations/0004_alter_m3uaccount_user_agent_delete_useragent.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.1.6 on 2025-02-21 14:58 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('core', '0001_initial'), - ('m3u', '0003_m3uaccount_user_agent'), - ] - - operations = [ - migrations.AlterField( - model_name='m3uaccount', - name='user_agent', - field=models.ForeignKey(blank=True, help_text='The User-Agent associated with this M3U account.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='m3u_accounts', to='core.useragent'), - ), - migrations.DeleteModel( - name='UserAgent', - ), - ] diff --git a/apps/m3u/migrations/__pycache__/0001_initial.cpython-310.pyc b/apps/m3u/migrations/__pycache__/0001_initial.cpython-310.pyc deleted file mode 100644 index 1a5e9cb474c0048a1d857e456b28ba2c9cd4cacc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304 zcmaJ@TXP#V6y9C0?{<===?w~qaB18GCvBlz+M!L;rWBeCLy{N2?8rXyTCTk7YIoaY z2cF74Iq9k<&J2cMsQ|1Esnbez95 zaq{tzxQ!#};sg%3!kM@|cjEOtSJR#-_5Aw|l)(SR0iU_!^3SDS8N3~*Q$9i+r{k%{ zgol!*JdP4onZ&?EvOUmyC!bj)ZsSOPbRCB|Jr|sw2X3zvIz6A2#})9P#H!;OxcK@| zhRUHo^q`8oI@F+!+{R%EIZfm=kZR#*8_o=Jnn<}Y3v-5Z3OOy9htsfd=%LOTq}#ZE zwxG`;J%jXlxM23*D(JW2qNc+dymRQ8sNQ`;RPO;n8z!pIJJxvrwHk})p$;FwhbZ|G zd<>Uh$(*la_?KZBR!k(HAgv?q7Ll$ZJqv4WZhUH79nX(X!xgv+*R*a}E_^P)r|_AP zbKyF;$FgVObNB+jJgmT1ho#W(orN1%x0|ZI^`cfsPnhh-2@4`RVanHYPWB@HIAcT;WEe}5 zj(9@Q3!&D{(SHboPD#~AOiY86?Wc$!x*rG@h3QCDGNZ2==myOPnH2f0-4P>wnlQ5W z!$T4e(Izt{tqfU;ry71#5I!W747p$gon})JQ((|RZ{@zA(IYv7zA?~D2-SYE9ccNy zHMy1rmX)k_N^%}0ED(IAtO zMJXvn$1-vigY??2=78OPLLM_rg0+Vb+$|e^nld6ez!QUV~ zm@@QMHez|x7$mzq705L%^X85z3E4)>$wgh3tJa1A4Ujk@j3Z_wF*Zo5l?h_g*2iGA zdvp~Q5&G4^DCPr}$a6@WlSzGfskUSx+YhER#h{{md7T&rDHys?6PgZ2$3;i`#$D1q z`a_%cP8h4Q{ej4U<=;LSl3kgx6|2mnkRU)N389jaLI`eXTyJVPtl(M1ft6)eh)2c} zbP=5h;iBmIW!*C;+Rj44rc^fvolXU3fMIu4)v}X(1}$`P6h=C}#Ya7k0=(8)iY+gh zFiR4Wg4(>oaD1Q602*Bbt<+abpxBW zl$Z5tSx+lEyCu9u^tZ>{MHY!=gT(F5IaLb`I|x)G2v95&4A-q7c$`t8Pl8mHM?A%g zO|^hcSp+N^a72NJ##M8}+=N@&fh=iG>kbds@s8ZoU|02x5tVjX!z-#_A_kdVE_@#+ zX#5F#5T%HsLbP=!js>HUm1*C_yz1t&WMeayjEB*8c;!}LOrtPX9`ses6asHMRoz(M z*;v1OPu11|tWs^~-fpnH_wb==#8Xy$lz(;PrcRTd{#jbZ!t0T&Vun{=e!5rJ*4C~B zMGm^t1F8QTRB-K^!RWp`ie25u4OP2oYx=dml9LKf Kb6(9oTlybMlET6O diff --git a/apps/m3u/migrations/__pycache__/__init__.cpython-310.pyc b/apps/m3u/migrations/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 14452674f18d457cc7c55a08ed4bb4effa203176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmd1j<>g`kg4%6c(n0iN5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HDequoZ2p8+; v8kg$lW~LVg`k0==l7^eiC#7{oyaOhAqU5EqL8i4=wu#vF!R#waF6h7_hK<`m{&22GZi zj6f+(##_vZ1qDEgD>*eMwWu;4$n(==iDH9ri$DeyF$0NP?D6r5IXUt1D;bJdL4qLS zmyAA8y?#n&aY159az>FM BDcb-5 diff --git a/dispatcharr/__pycache__/__init__.cpython-312.pyc b/dispatcharr/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0992e2c725870d88355a7f21be85569d543d2fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmX@j%ge<81bR_D=~+PfF^B^LOi;#W5g=naLkdF*V-7a44;8qhF=!? zp~b01#rip^sroLd#n~nK1^OZgTWG~_XiU9!5uR4PO diff --git a/dispatcharr/__pycache__/celery.cpython-310.pyc b/dispatcharr/__pycache__/celery.cpython-310.pyc deleted file mode 100644 index ccd5c7aac4551bd0c2451251b9bab64c9077a832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390 zcmYjL!A`jyO&cEt#Y^Ba~nyP*T}d zd4*T^_5ZSZ#nyV4ndIwKTwyrZO#lx!ahrI!4g3oSj%|Mc diff --git a/dispatcharr/__pycache__/celery.cpython-312.pyc b/dispatcharr/__pycache__/celery.cpython-312.pyc deleted file mode 100644 index f7f540d627af839f3ab7dc70bb482007ece3ff6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmYjNK}#D!6n?XttV!C?66#j*7v#{aCl5u0)}+BUiD2|#pe);+mzZ_4v&?LSc(SMV z;JyE#P|_dJ|IkaM5p_TiJoP4cD-=50xUTOo?|W~)_q}iCXR%lS6?>iI-d~lk<06U7 z9k~6fz!#uEi4UDPYd#rh9gP5jXC(AAd-)V6i0U*m)@Bs}4N#-mF`3n!EM~o8!b~$Y z=-l^QI;B`o(%S@$?*M@jDd&I3RjW*-v5r3Skuydp4)`aw^~M-RG+;yFQ&Ra_QyU*1!U^;)C0wX0U-180Cr#Km$>YD`GO z{lAmz%7dK4;GoZ0APZ`gV%Hh^k<^_ql%-g(-?O`%4Q%$oLpPEoXBaWH++_#I?Z^@P z;v3w?kNLA=?Fi(;@)4~niv5U%Ry8%>ZdwmaTQdula3pi914f5FuJMwRiT_%>Q^$=? z2)Ty*B`jWn_Nnl(a0c@yFh4OXljS#4s9zY5KfnKFEFJ0Rpr3(x0_NoTiysRUFsJbP MzIO@>{HfCW2j;Pq%K!iX diff --git a/dispatcharr/__pycache__/settings.cpython-310.pyc b/dispatcharr/__pycache__/settings.cpython-310.pyc deleted file mode 100644 index d72035b361e1aa15b897fb3a175b5953b23d507f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2712 zcma(T+j7%JR8kaMPU6G~2?P?#{bFdOFm!-2Os9&iBrdk)k(8wDi$?KoYz0{|TA38R z_BVI{-um3X**^BEf6!q%&?8w+jiJ+8BkkF9+jCzB#o`PHzv(}J?ff>&ala><@t*{n z@8P94d5*&z<~c`PCcPj`4!=x{jqjz=@F z=3$-15}LyWlEX7=T!+UZo(0O>JKp7S@wEsNMLdt@@d8@FCA>(uu}1&H(vqn)>{Ex!ne_7Tt-*2v+v-$fW1ntqHFkTbRBP? z8^9@pmP=Sc>v$90#JtIs@BNWPuvzAr*m9ySx@c&vx?0ifhGrkstX*5R4Na}vrdBaD z%VPYU@*{XUhQz8e>ZP`e!r{D@}TcGvNJ;?a0MrDBJ64+AH}nH=eN;zCO4;%=BB zd-n&Bhw#XL<@kLDY@cCXk5;@uTQfpV0W+1d$R- z-N65x&;x?g0f`Hf5|I%$3K90=yP z9V+Z0j&2+L5BxE~YePXhi2CFFy44zEn)GxO-*Jh?Fy>=Y55C~3=eD08JMHJL-;saZ zPGYb36N~7WTnW3h??g~{VJHtms5~Xp6p>!vb0Q)if(qheDrbahT3}X2rmQgHq--fI zp`RkV9|mo(F$if{jBihB{G3b13E#0(s49&EwTWoghKvX=X?3tRuq!A4*o)TKB zX&&fCmF1wlLJ~0nAG(iLIIf&yIjy-ycOr;s z-S-_zp{23?((zoJx-IWf5~@)$eg+XS-Ja_?Nnh^|If5`Qe>x6i+U}B`Lm_=3f!QcS z2L)z|i*HP@hER$mBq5c5F!iR9?c$ApW!nma6Y3m#L~YeZ>}9wus@k@?SGR1lva2;z zyHbZhq16%AfUIkVW(@I~8BY^`V?f!|o>hq@g{HGjVY5RZ9dZ!i6dM;67|Hga?*$H~ z3Ys0;ji=ug3xJ)<74h6J+wSW z?RZ_NlE)A3Km1nNj7!Q$7-${WSKjjqo9+R-6X%t5RpOa@n{x8p+k9BQ#e{&eJhXq; za}PrSa?B*#PMooAmWPN2-b=!AeHhMugrqIi)ROXNGs7#*eyTlV(^YM2Z-*7tdR;%z zs&-N|CY!G{O$$(ffSxhgOrut<*0lrG(Ab=z>sI1RMQ?7if~7U!+O#y2l@83ETEbti zRn(-tP)VJ@usrc!x?$k6sSea~p{iPHVwTBP)jha!N5yOJtMwWXb;CsS&^ea9Z9t7f zBRplry4u{?Q+G7GqE|IApavH<(xDF|=m5KR?@^QG639Z}sRfo)5^LFP1}EmT(r~j~ zt0!%l42MEPtJc(%Q%pk2#N)vA!SfWI3N4MQ3vAWx?V47vvW3*{r1k6um{Si|lQgVk zi3ih@8Xb+HLS2W3P0v^wf(B?ev`QLJQ~)jeps3dRg$tj6p7is6U4faTjAjE2dWDiG zf?I*g{Z~wS0);s6$anD1kE6%%k+?a&B#7|jcuA0!#W_KgcmZJHqxhHjQ7nnPFeUJF t=_3F|d=J*B$+y`++U5MikW{hnS%( znAk)%?mc(z%$-Y$bvlj$*Y7ufg~v@r`A3rb zR~N_&xWyl;qF@E9REbrjsuF8di*=;O1~N*n(?)C}v&06qVjI~dZqR1zAg9D8ZN+WW zF0n;BaTj$aF4~R3{!kc&t{M(??!L~yTyo(>;y`}b>2K*sWXWO%#67PfW5q`Y#4S^rvk5>F+ z;Gf`6SNsX^&+z9fJ|dg5UHk=9;mf6lzp67Hmez4?b!+R_V0}>9RQy!hLWkJIobAE= z5P!4OwiUDw_!0k`?3bR$z=qQEo%B?;m0H^Hvv-QTN8i4er!`WGhL7VY8EJ))`q{Lw zq9mYmOu%Ccl4Vg63c#kw{45Fpwa*BSI0>>}BC-J9N(ql6AtIJYVJ{?^CxR)7eebGL zSS%%ppGJA_BodG$nEIR#kKUdl?doZM0APq&Fpo(hbFgGMVSIQ`nm?IlSt_2p?qabR zhm3`ki~|;=BdGo~!?DJ-l3D~c#;UL+7i5+QeJBz{ar zX3@x^j1tttWa7_h=3Nmk_fxbm5dn`n4rJB&3ag&-9Li{>^Gl#; z{jM%vKz$*ID3p8y`(k>@e2$;55GsEcQQ5;EwcB;(N~ z*I-?6-jz`nn(JWU#(gtrC%gd`w0##nDYrPT-Vbg{@1XX|{ukqrB!ou+x8zh^PDJKS zIGo#p@n5+u^6}>x@ux%A5qE{N69s+ zw_Lt;h2@J17$VA`qvVc|wTQB*H;<4b0TdZ<(fsM<$?1`IarU}!DtPwh&3Vy+h`K37 z(KvbeKrM-IfA@t}I z348VAD|m9^DFZXZ&&+&3j2w@B1hLEBsxRo@o#=-P;u=z4Kw&6D3^P*W3`2KnvT-s8 zBaYYZ`+&J@@IgR1uP7TblA>_9KldNgco7t`DMb~OQUy%tHaEpnu2j$}x#oq5{2!pB zB*b=7aYJ8pC1~EZwJ35UWMfZfw>L?=r0IOMS|o8w@0YWOyZL_7gGHJfBbrKwp7khY zvY^xwsk0Nd&YMa`g;YH1(29VW^?36v6u^BrWW3C`wXugi*H5GlVDZ2Fo=ssg?b%H` cQq=D3=yD_3w&qtDmUZ_{7mb`Fd`x`&2Zmi@%m4rY diff --git a/dispatcharr/settings.py b/dispatcharr/settings.py index 67b6b1a1..ee9db5c8 100644 --- a/dispatcharr/settings.py +++ b/dispatcharr/settings.py @@ -108,4 +108,4 @@ MEDIA_ROOT = BASE_DIR / 'media' MEDIA_URL = '/media/' -SERVER_IP = "10.0.0.107" +#SERVER_IP = "10.0.0.107" diff --git a/dispatcharr/urls.py b/dispatcharr/urls.py index 85c3fdf4..b12f91cd 100644 --- a/dispatcharr/urls.py +++ b/dispatcharr/urls.py @@ -28,7 +28,7 @@ urlpatterns = [ path('api/', include(('apps.api.urls', 'api'), namespace='api')), path('admin/', admin.site.urls), - #path('accounts/', include(('apps.accounts.urls', 'accounts'), namespace='accounts')), + path('accounts/', include(('apps.accounts.urls', 'accounts'), namespace='accounts')), #path('streams/', include(('apps.streams.urls', 'streams'), namespace='streams')), #path('hdhr/', include(('apps.hdhr.urls', 'hdhr'), namespace='hdhr')), path('m3u/', include(('apps.m3u.urls', 'm3u'), namespace='m3u')), diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 36ade6df..df7ded16 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -11,6 +11,8 @@ services: - redis volumes: - ../:/app + extra_hosts: + - "host.docker.internal:host-gateway" environment: - POSTGRES_HOST=db - POSTGRES_DB=dispatcharr @@ -29,6 +31,8 @@ services: - redis volumes: - ../:/app + extra_hosts: + - "host.docker.internal:host-gateway" environment: - POSTGRES_HOST=localhost - POSTGRES_DB=dispatcharr @@ -56,16 +60,5 @@ services: image: redis:latest container_name: dispatcharr_redis - - # You can add an Nginx or Traefik service here for SSL - # nginx: - # image: nginx:alpine - # container_name: dispatcharr_nginx - # ports: - # - "80:80" - # - "443:443" - # depends_on: - # - web - volumes: postgres_data: diff --git a/templates/base.html b/templates/base.html index 4d5557ca..e4fd3fc3 100755 --- a/templates/base.html +++ b/templates/base.html @@ -39,10 +39,20 @@