Files
VoiceVault/backend/__pycache__/api_routes.cpython-314.pyc

176 lines
40 KiB
Plaintext
Raw Normal View History

2026-02-14 22:57:24 -07:00
+
2026-02-15 11:21:29 -07:00
u<0E>iYx<00><00>Da<00>Ritj0tRt^RIt^RIt^RIt^RIt^RIHt^RIt^RI t ^RI
H t ^RI H t Ht^RIt^RIHt^RIHt^RI
HtHtHt^RIHtHt^R IHt^R
IHtHtHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+H,t,H-t-H.t.H/t/H0t0H1t1H2t2H3t3H4t4H5t5H6t6H7t7H/t/H%t%]!4]!R ]8R R 7t9]!]Pt!RR44t;];PyRRR70Rjmt=]Pt!RR4t>]Pt!RR4t?]Pt!RR4t@]Pt!R]Pt!RR44tARsB]^kRRltCRkRRlltDRR ltER!R"ltFR#R$ltGR%R&ltH]9P<39>R'4R(4tJ]9P<39>R)4R*4tL]9P<39>R+4R,4tM]9P<39>R-4R.4tN]9P<39>R/4R0R1l4tO]9P<39>R24R34tP]9P<39>R44R54tQ]9P<39>R64R7R8l4tR]9P<39>R94R:4tS]9P<39>R94R;4tT]9P<39>R<4R=R>l4tU]9P<39>R<4R?R@l4tW]9P<39>RA4RBRCl4tX]9P<39>RD4RERFl4tY]9P<39>RG4RHRIl4tZ]9P<39>RG4RJRKl4t[]9P<39>RL4RMRNl4t]]9P<39>RL4RORPl4t^]9P<39>RQ4RRRSl4t_]9P<39>RQ4RTRUl4t`]9P<39>RV4RWRXl4ta]9P<39>RV4RYRZl4tb]9P<39>R[4R\4tc]9P<39>R[4R]4td]9P<39>R^4R_R`l4te]9P<39>Ra4RbRcl4tf]9P<39>R<4RdRel4th]9P<39>Rf4RgRhl4tiR#)lz}
2026-02-14 22:57:24 -07:00
Flask API routes aligned with TitanForge/schema.sql.
Includes auth, upload+transcription, history, and RAG search workflow.
N)<01>Path)<01> send_file)<02>Dict<63>Any)<01> load_dotenv<6E><01> WhisperModel)<03> Blueprint<6E>jsonify<66>request)<02>check_password_hash<73>generate_password_hash)<01>secure_filename)<1D>add_archive_file<6C> add_audit_log<6F>add_rag_chunks<6B>create_audio_post<73> create_user<65>get_archive_metadata<74>get_original_audio_url<72>get_archive_rights<74>get_audio_post_by_id<69>get_post_bundle<6C>get_user_by_email<69>get_user_by_id<69>list_archive_files<65>list_audio_posts<74>list_audit_logs<67>list_rag_chunks<6B>list_user_history<72>search_rag_chunks<6B>update_audio_post<73>upload_storage_object<63>upsert_archive_metadata<74>upsert_archive_rights<74>delete_rag_chunks<6B>delete_archive_files<65>delete_metadata<74> delete_rights<74>delete_audio_postr!r<00>apiz/api)<01>
url_prefix<EFBFBD>BACKEND_UPLOAD_DIR<49>uploadsT)<02>parents<74>exist_ok<6F> WHISPER_MODEL<45>base<73>WHISPER_DEVICE<43>cpu<70>WHISPER_COMPUTE_TYPE<50>int8<74>SUPABASE_BUCKET<45>SUPABASE_ARCHIVE_BUCKET<45>archivesc<00>$<00>V^8<>dQhR\/#)<02><00>returnr)<01>formats"<22>6/Users/mannpatel/Work/TitanForge/backend/api_routes.py<70> __annotate__r>Bs<00><00><1A><1A> <0C><1A>c<00>R<00>\f\\\\R7s\#)N)<02>device<63> compute_type)<05>_whisper_modelrr0r2r4<00>r?r=<00>_modelrEBs#<00><00><15><1D>%<25> <19>!<21>-<2D>
2026-02-14 22:57:24 -07:00
<EFBFBD><0E>
<1A>r?c<00>0<00>V^8<>dQhR\R\/#)r:<00>message<67>status)<02>str<74>int)r<s"r=r>r>Ms<00><00>/<2F>/<2F>C<EFBFBD>/<2F><13>/r?c<00> <00>\RV/4V3#)<01>error)r
)rGrHs&&r=<00>_errorrMMs<00><00> <12>G<EFBFBD>W<EFBFBD>%<25> &<26><06> .<2E>.r?c<00>0<00>V^8<>dQhR\R\/#)r:<00>filenamer;)rI<00>bool)r<s"r=r>r>Qs<00><00>J<01>J<01>C<EFBFBD>J<01>D<EFBFBD>Jr?c<00>p<00>RV9dR#VPR^4^,P4\9#)<02>.F)<03>rsplit<69>lower<65>ALLOWED_MEDIA_EXTENSIONS)rOs&r=<00> _allowed_filerVQs2<00><00>
<EFBFBD>(<28><1A><14> <13>?<3F>?<3F>3<EFBFBD><01> "<22>1<EFBFBD> %<25> +<2B> +<2B> -<2D>1I<31> I<>Ir?c<00>0<00>V^8<>dQhR\R\/#)r:<00>pathr;)rrI)r<s"r=r>r>Ws<00><00><19><19>$<24><19>3<EFBFBD>r?c<00>0<00>\P!4pVPR4;_uu_4pVPR4pV'gMVP V4K.RRR4VP 4# +'giTP 4#;i)<03>rbNi)<06>hashlib<69>sha256<35>open<65>read<61>update<74> hexdigest)rX<00>h<>f<>chunks& r=<00>_sha256rdWsh<00><00><0F><0E><0E><18>A<EFBFBD> <0A><19><19>4<EFBFBD><1F><1F>A<EFBFBD><12><15>F<EFBFBD>F<EFBFBD>;<3B>'<27>E<EFBFBD><18><15> <0A>H<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>
2026-02-14 22:57:24 -07:00
<19> <0A>;<3B>;<3B>=<3D><18>
<19><1F> <0A>;<3B>;<3B>=<3D><18>s <00>/A6<05>6 B c<00><<00>V^8<>dQhR\R\R\/#)r:<00>transcript_text<78>titler;)rI)r<s"r=r>r>bs!<00><00><06><06>3<EFBFBD><06>s<EFBFBD><06>s<EFBFBD>r?c<00><00>RV RV R2#)zaYou are an archive assistant. Use the following transcribed audio as source context. Post title: z.
2026-02-14 22:57:24 -07:00
Transcript:
z4
Answer user questions grounded in this transcript.rD)rfrgs&&r=<00> _build_promptribs&<00><00> <17><1C>g<EFBFBD><18> <1A>
<1B>=<3D> =<3D>r?c<00>t<00>V^8<>dQhR\\\3,R\\\3,/#)r:<00>postr;)rrIr)r<s"r=r>r>js*<00><00><10><10><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E><10>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD>r?c<04><><00>VPR4R8Xd$\VR,RR7pVR,VR&V#V# T#;i)z%Add signed audio URL to post if readyrH<00>ready<64>post_id<69><00><01>
2026-02-15 00:24:49 -07:00
expires_in<EFBFBD>
signed_url<EFBFBD> audio_url)<02>getr)rk<00>
audio_datas& r=<00>_add_audio_urlrvjsQ<00><00> <0B>x<EFBFBD>x<EFBFBD><08><19>W<EFBFBD>$<24> <11>/<2F><04>Y<EFBFBD><0F>D<EFBFBD>Q<>J<EFBFBD> *<2A><<3C> 8<>D<EFBFBD><1B> <1D> <10>K<EFBFBD>4<EFBFBD>K<EFBFBD><4B> <11> <10> <0F>K<EFBFBD>s <00> <<00>Az/healthc
<00>@<00>\RRR\R\R\/4#)rH<00>ok<6F> whisper_model<65>whisper_device<63>whisper_compute_type)r
r0r2r4rDr?r=<00>healthr|vs)<00><00> <12><10>$<24><17><1D><18>.<2E><1E> 4<> <06> <07>r?z/auth/registerc<00><00>\P!RRR7;'g/pVPR4;'gRP4P 4pVPR4;'gRpV'd V'g \ RR4#\ V4pV'd \ RR 4#\RVR
2026-02-14 22:57:24 -07:00
\V4R VPR 4R VPR 4R VPR 4/4p\RVR,RRR\P!RV/4/4\RRVR,RVR,R VPR 4//4^<5E>3# \d p\ \T4R4uRp?#Rp?ii;i)TF<54><02>force<63>silent<6E>email<69><00>password<72>$'email' and 'password' are required.<2E><>z#User already exists for this email.i<><00> password_hash<73> display_name<6D>
avatar_url<EFBFBD>bio<69>user_id<69>actionz user.register<65>details<6C>user<65><72>N)r <00>get_jsonrt<00>striprTrMrrr r<00>json<6F>dumpsr
<00> ExceptionrI)<06>payloadr<64>r<><00>existingr<67><00>es r=<00> api_registerr<72><00>sk<00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD> <14>[<5B>[<5B><17> !<21> '<27> '<27>R<EFBFBD> .<2E> .<2E> 0<> 6<> 6<> 8<>E<EFBFBD><16>{<7B>{<7B>:<3A>&<26>,<2C>,<2C>"<22>H<EFBFBD> <10><08><15><<3C>c<EFBFBD>B<>B<> <20><15>'<27>H<EFBFBD><0F><15>;<3B>S<EFBFBD>A<>A<>#<23><1A><17><15><1F>!7<><08>!A<><1E><07> <0B> <0B>N<EFBFBD> ;<3B><1C>g<EFBFBD>k<EFBFBD>k<EFBFBD>,<2C>7<><15>w<EFBFBD>{<7B>{<7B>5<EFBFBD>)<29>  <0E>
2026-02-14 22:57:24 -07:00
<EFBFBD><04> <16>y<EFBFBD>$<24>y<EFBFBD>/<2F>8<EFBFBD>_<EFBFBD>i<EFBFBD>Y]<5D>Yc<59>Yc<59>el<65>ns<6E>dt<64>Yu<59>v<>w<><16> <12><19>4<EFBFBD> <09>?<3F><17><14>g<EFBFBD><1D><1E><04><08><08><1E> 8<><0E>
<EFBFBD> <0B> <10> <10> <10><> <15>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s<00>1B*E<00> F<03>'F<03>;F<03>Fz /auth/loginc<00><><00>\P!RRR7;'g/pVPR4;'gRP4P 4pVPR4;'gRpV'd V'g \ RR4#\ V4pV'g \ RR 4#\VR
,V4'g \ RR 4#\R VR ,R R R\P!RV/4/4\RR VR ,RVR,RVPR4RVPR4RVPR4//4#)TFr~r<>r<>r<>r<>r<>zInvalid credentials.i<>r<>r<>r<>z
user.loginr<6E>r<>r<>r<>r<>) r r<>rtr<>rTrMrr rr<>r<>r
)r<>r<>r<>r<>s r=<00> api_loginr<6E><00>s)<00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD> <14>[<5B>[<5B><17> !<21> '<27> '<27>R<EFBFBD> .<2E> .<2E> 0<> 6<> 6<> 8<>E<EFBFBD><16>{<7B>{<7B>:<3A>&<26>,<2C>,<2C>"<22>H<EFBFBD> <10><08><15><<3C>c<EFBFBD>B<>B<> <1C>U<EFBFBD> #<23>D<EFBFBD> <0F><15>,<2C>c<EFBFBD>2<>2<> <1E>t<EFBFBD>O<EFBFBD>4<>h<EFBFBD> ?<3F> ?<3F><15>,<2C>c<EFBFBD>2<>2<><11>9<EFBFBD>d<EFBFBD>9<EFBFBD>o<EFBFBD>x<EFBFBD><1C>y<EFBFBD>RV<52>R\<5C>R\<5C>^e<>gl<67>]m<>Rn<52>o<>p<> <12> <12><19>4<EFBFBD> <09>?<3F><17><14>g<EFBFBD><1D><1E><04><08><08><1E> 8<><1C>d<EFBFBD>h<EFBFBD>h<EFBFBD>|<7C>4<><15>t<EFBFBD>x<EFBFBD>x<EFBFBD><05><EFBFBD> <0E>
2026-02-14 22:57:24 -07:00
<EFBFBD>
<06>
r?z /posts/uploadc<00><> <00>R\P9d \RR4#\PR,pVP'g \RR4#\ VP4'g \RR4#\P
2026-02-14 22:57:24 -07:00
P R4p\P
P R4;'gRP4p\P
P R4p\P
P R 4;'gR
P4P4p\P
2026-02-15 00:07:07 -07:00
P R 4;'gR P4P4pVR=9d \R R4#\V4p\T4pT'g \RR4#\\P!44p\!TP4p RT RT 2p
T RT RT 2p \"T RT 2, p TP%T 4Rp \'RTRTRTR TRRR TRT
/4p \T R,4p\)T 4pT P+R4;_uu_4p\-\.T TP14TP2;'gRRR7RRR4\5TRRR \. RT 2R!TP2R"T P74P8R#T/4\;4P=\T 44wpp.p.pTF<>pTP>P4pT'gK'TPAT4TPAR$\CTPD4R%\CTPF4R&TR'TPHe\CTPH4MRR(R/4K<> R)PKT4P4p\MTT4pT'd \OTT4\QT\RPT!R*TR+\WT4R,T R T/44\5TRR-R T
R.2R!R/R"\WTPYR044R#\ZP\!TPYR044P_4/4\aTRR1/4\cRTRTR2R3R4\RPT!R TRT
/4/4\eRTR TRR1R5\. RT 2R6TR*TR7\WT4/4^<5E>3# \\3d\RR4u#i;i +'giELx;i \fd<>pT 'dxT P R4'da\a\T R,4RR8/4\cR\T R,4RTR2R9R4\RPT!R:\T4/4/4\R;T 2R<4uRp?#Rp?ii;i)><3E>filezMissing 'file' in form-data.r<>zFilename is empty.zUnsupported media extension.r<>rgzUntitled recording<6E> description<6F>
visibility<EFBFBD>private<74>language<67>en<65>+'visibility' must be 'private' or 'public'.z-'user_id' is required and must be an integer.<2E>User not found.<2E><>zarchive/<2F>/z
/original/<2F>_NrH<00>
processing<EFBFBD>storage_prefixrnrZzapplication/octet-streamF)<05>bucket<65> object_path<74>content<6E> content_type<70>upsert<72>role<6C>original_audiorXr<><00>
size_bytesr\<00> start_sec<65>end_sec<65>text<78>
2026-02-14 22:57:24 -07:00
confidence<EFBFBD> embedding<6E> <20>prompt<70>transcript_length_chars<72> source_file<6C>transcript_txtz/transcript.txtz
text/plainzutf-8rmr<>zpost.upload.transcribedr<64><00>
audio_pathrf<00>rag_chunk_count<6E>failedzpost.upload.failedrLzUpload/transcription failed: r<>><00>publicr<63>)4r <00>filesrMrOrV<00>formrtr<>rTrJ<00> TypeError<6F>
ValueErrorrrI<00>uuid<69>uuid4r<00>
UPLOAD_DIR<EFBFBD>saverrdr]r"<00>ARCHIVE_BUCKETr^<00>mimetyper<00>stat<61>st_sizerE<00>
transcriber<EFBFBD><00>append<6E>float<61>start<72>end<6E> avg_logprob<6F>joinrirr#r<>r<><00>len<65>encoder[r\r`r!rr
r<>)<1A>media<69> user_id_rawrgr<>r<>r<>r<>r<><00> post_uuid<69> safe_namer<65><00>storage_object_path<74>
saved_path<EFBFBD> created_postrn<00> media_sha<68>
media_file<EFBFBD>segments<74>_info<66>rag_rows<77>transcript_parts<74>seg<65> segment_textrf<00> prompt_textr<74>s r=<00>api_upload_postr<74><00>si<00><00> <0A>W<EFBFBD>]<5D>]<5D>"<22><15>4<>c<EFBFBD>:<3A>:<3A> <13>M<EFBFBD>M<EFBFBD>&<26> !<21>E<EFBFBD> <10>><3E>><3E>><3E><15>*<2A>C<EFBFBD>0<>0<> <18><15><1E><1E> (<28> (<28><15>4<>c<EFBFBD>:<3A>:<3A><19>,<2C>,<2C>"<22>"<22>9<EFBFBD>-<2D>K<EFBFBD> <14>\<5C>\<5C> <1D> <1D>g<EFBFBD> &<26> ><3E> ><3E>*><3E> E<> E<> G<>E<EFBFBD><19>,<2C>,<2C>"<22>"<22>=<3D>1<>K<EFBFBD><19>,<2C>,<2C>"<22>"<22><<3C>0<>=<3D>=<3D>I<EFBFBD>D<>D<>F<>L<>L<>N<>J<EFBFBD><17> <0C> <0C> <20> <20><1A>,<2C>4<>4<><04>;<3B>;<3B>=<3D>C<>C<>E<>H<EFBFBD><11>.<2E>.<2E><15>C<>S<EFBFBD>I<>I<>L<01><15>k<EFBFBD>"<22><07> <1A>'<27> "<22>D<EFBFBD> <0F><15>'<27><13>-<2D>-<2D><13>D<EFBFBD>J<EFBFBD>J<EFBFBD>L<EFBFBD>!<21>I<EFBFBD><1F><05><0E><0E>/<2F>I<EFBFBD><1F><07>y<EFBFBD><01>)<29><1B>5<>N<EFBFBD>$<24>I<EFBFBD>Q<EFBFBD>y<EFBFBD>k<EFBFBD><1A>I<EFBFBD>;<3B>G<><17><1B><19> <0B>1<EFBFBD>Y<EFBFBD>K<EFBFBD>8<>8<>J<EFBFBD> <09>J<EFBFBD>J<EFBFBD>z<EFBFBD><1A><17>L<EFBFBD>r@<01>(<28><19>7<EFBFBD><17><15><1D>{<7B><1C>j<EFBFBD><18>,<2C><1A>H<EFBFBD> <20>.<2E> <0E>
2026-02-14 22:57:24 -07:00

2026-02-15 00:07:07 -07:00
<EFBFBD> <0C><16>l<EFBFBD>9<EFBFBD>-<2D>.<2E><07><1B>J<EFBFBD>'<27> <09> <17>_<EFBFBD>_<EFBFBD>T<EFBFBD> "<22> "<22>j<EFBFBD> !<21>%<25>/<2F>"<22><0F><0F>)<29>"<22>^<5E>^<5E>I<>I<>/I<><1C>  <0E>#<23> <19> <13><16>(<28><16>><3E>*<2A>!<21>,?<3F>+@<40>A<><1E><05><0E><0E><1C>j<EFBFBD>o<EFBFBD>o<EFBFBD>/<2F>7<>7<><18>)<29>  <0E>
2026-02-14 22:57:24 -07:00
<EFBFBD>!<21>(<28>-<2D>-<2D>c<EFBFBD>*<2A>o<EFBFBD>><3E><0F><08>%<25><15><08><1D><18><1B>C<EFBFBD><1E>8<EFBFBD>8<EFBFBD>><3E>><3E>+<2B>L<EFBFBD><1F><18> <1C> #<23> #<23>L<EFBFBD> 1<> <14>O<EFBFBD>O<EFBFBD><1F><15>s<EFBFBD>y<EFBFBD>y<EFBFBD>!1<><1D>u<EFBFBD>S<EFBFBD>W<EFBFBD>W<EFBFBD>~<7E><1A>L<EFBFBD> <20>C<EFBFBD>O<EFBFBD>O<EFBFBD><W<>%<25><03><0F><0F>"8<>]a<><1F><14> <12> <0E> <1C><1E>(<28>(<28>#3<>4<>:<3A>:<3A><<3C><0F>#<23>O<EFBFBD>U<EFBFBD>;<3B> <0B> <13> <1A>7<EFBFBD>H<EFBFBD> -<2D><1F> <13> <10>J<EFBFBD>J<EFBFBD><1C>k<EFBFBD>-<2D>s<EFBFBD>?<3F>/C<>!<21>9<EFBFBD><1E><08> <12> <0E>
<EFBFBD> <19> <13><16>(<28><16>><3E>*<2A>/<2F>:<3A><1E> <0C><1C>c<EFBFBD>/<2F>"8<>"8<><17>"A<>B<><18>'<27>.<2E>.<2E><1F>)?<3F>)?<3F><07>)H<>I<>S<>S<>U<>  <0E>
<EFBFBD> <1A>'<27>H<EFBFBD>g<EFBFBD>#6<>7<><15><19>7<EFBFBD><19>7<EFBFBD><18>3<><19>4<EFBFBD>:<3A>:<3A>|<7C>Z<EFBFBD>AQ<41>Sa<53>&b<>c<>  <0E>
2026-02-15 00:07:07 -07:00
<EFBFBD><17><19>7<EFBFBD><1C>j<EFBFBD><18>'<27><1C><1E> 0<><01>2E<32>1F<31>G<>!<21>?<3F><18>+<2B>!<21>3<EFBFBD>x<EFBFBD>=<3D> <0E>
2026-02-14 22:57:24 -07:00

<EFBFBD> <0F>
<0F>
<0F><>W <16>z<EFBFBD> "<22>L<01><15>E<>s<EFBFBD>K<>K<>L<01><><#<23> "<22> "<22><>p <15> @<01> <17>L<EFBFBD>,<2C>,<2C>Y<EFBFBD>7<>7<> <1D>c<EFBFBD>,<2C>y<EFBFBD>"9<>:<3A>X<EFBFBD>x<EFBFBD><P<> Q<> <19><1D>s<EFBFBD><<3C> <09>#:<3A>;<3B><1D>w<EFBFBD><1C>2<><1D>t<EFBFBD>z<EFBFBD>z<EFBFBD>7<EFBFBD>C<EFBFBD><01>F<EFBFBD>*;<3B><<3C> <12> <0E><16>5<>a<EFBFBD>S<EFBFBD>9<>3<EFBFBD>?<3F>?<3F><> @<01>sQ<00> S8<00>&AT/<00>57T<05>,I T/<00>8T<03>T<03> T, <09>& T/<00>/ W<03>:W <03>A.W <03>W<03> Wz/users/<int:user_id>/historyc<00>$<00>V^8<>dQhR\/#<00>r:r<><00>rJ)r<s"r=r>r>cs<00><00>#<23>#<23>c<EFBFBD>#r?c <00>Z<00>\PPR^\R7p\PPR^\R7p\ WVR7p\ RVRVR\ \^V4^d4/4# \d p\\T4R4uRp?#Rp?ii;i)<07>page<67><02>default<6C>type<70>limit<69>r<>r<><00>historyr<79>N) r <00>argsrtrJrr
<00>min<69>maxr<78>rMrI)r<>r<>r<><00>postsr<73>s& r=<00>api_user_historyr<79>bs<><00><00> <12><<3C><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<>D<EFBFBD> <13>L<EFBFBD>L<EFBFBD> <1C> <1C>W<EFBFBD>b<EFBFBD>s<EFBFBD> <1C> ;<3B>E<EFBFBD>#<23>!<21>'<27>E<EFBFBD>B<><05><16> <09>5<EFBFBD>&<26>$<24><07><13>S<EFBFBD><11>E<EFBFBD>]<5D>TW<54>AX<41>Y<>Z<>Z<><5A> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s<00>1B<00> B*<03> B%<03>B*<03>%B*z /rag/searchc <00>b<00>\PPR4;'gRP4p\PPR\R7p\PPR^\R7p\PPR^\R7pV'g \ RR4#V'g \ R R4#\ WW#R
7p\R VRVR\\^V4^d4/4# \d p\ \T4R 4uR p?#R p?ii;i)<0E>qr<71>r<><00>r<>r<>r<>r<>z'user_id' is required.r<>z'q' is required.)r<><00>
query_textr<EFBFBD>r<><00>resultsr<73>N) r r<>rtr<>rJrMr r
r<>r<>r<>rI)r<>r<>r<>r<><00>rowsr<73>s r=<00>api_rag_searchr<68>ns<><00><00><19>,<2C>,<2C>"<22>"<22>3<EFBFBD>'<27>-<2D>-<2D>2<EFBFBD>4<>4<>6<>J<EFBFBD><15>l<EFBFBD>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>G<EFBFBD> <12><<3C><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<>D<EFBFBD> <13>L<EFBFBD>L<EFBFBD> <1C> <1C>W<EFBFBD>b<EFBFBD>s<EFBFBD> <1C> ;<3B>E<EFBFBD> <12><15>.<2E><03>4<>4<> <15><15>(<28>#<23>.<2E>.<2E>#<23> <20><17>d<EFBFBD>`<60><04><16> <09>4<EFBFBD><16><14>w<EFBFBD><03>C<EFBFBD><01>5<EFBFBD>M<EFBFBD>SV<53>@W<>X<>Y<>Y<><59> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s<00>1D<00> D.<03>D)<03>#D.<03>)D.z/usersc<00><00>\P!RRR7;'g/p\\V44^<5E>3# \d p\ \ T4R4uRp?#Rp?i\d p\ \ T4R4uRp?#Rp?ii;i<01>TFr~r<>Nr<4E>)r r<>r
rr<>rMrIr<><00>r<>r<>s r=<00>api_create_userr<72><00>sq<00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD>#<23><16>{<7B>7<EFBFBD>+<2B>,<2C>c<EFBFBD>1<>1<><31> <15>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23><>3<00>:<00> B <03>A<03>B <03> B <03>,B <03>-B<03>B <03>B z/users/<int:user_id>c<00>$<00>V^8<>dQhR\/#r<>r<>)r<s"r=r>r><00>s<00><00><19><19>#<23>r?c<00>V<00>\V4pV'g \RR4#\V4#)r<>r<>)rrMr
)r<>r<>s& r=<00> api_get_userr<00>s'<00><00> <19>'<27> "<22>D<EFBFBD> <0F><15>'<27><13>-<2D>-<2D> <12>4<EFBFBD>=<3D>r?z/postsc<00><00>\P!RRR7;'g/p\\V44^<5E>3# \d p\ \ T4R4uRp?#Rp?i\d p\ \ T4R4uRp?#Rp?ii;ir<>)r r<>r
rr<>rMrIr<>r<>s r=<00>api_create_postr<00>sr<00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD>#<23><16>(<28><17>1<>2<>C<EFBFBD>7<>7<><37> <15>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>r<EFBFBD>c <00><00>\PPR^\R7p\PPR^\R7p\PPR4p\PPR\R7p\ WVR7pV'd@VUu.uF2qUPR4R8XgVPR4V8XgK0VNK4 ppM(VUu.uFqUPR4R8XgKVNK ppVUu.uFp\ V4NK pp\ R VRVR\\^V4^d4/4#uupiuupiuupi \d p\\T4R
4uR p?#R p?ii;i) r<>r<>r<>r<><00>current_user_idr<64>)r<>r<>r<>r<>r<>r<>r<>N) r r<>rtrJrrvr
2026-02-15 11:21:29 -07:00
r<>r<>r<>rMrI)r<>r<>r<>rr<><00>prkr<>s r=<00>api_list_postsr<00>sJ<00><00> <12><<3C><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<>D<EFBFBD> <13>L<EFBFBD>L<EFBFBD> <1C> <1C>W<EFBFBD>b<EFBFBD>s<EFBFBD> <1C> ;<3B>E<EFBFBD><18><1C><1C>!<21>!<21>,<2C>/<2F>J<EFBFBD><1D>l<EFBFBD>l<EFBFBD>&<26>&<26>'8<>s<EFBFBD>&<26>C<>O<EFBFBD>#<23><1F>T<EFBFBD>:<3A>N<><04> <1B>#<23>n<>t<EFBFBD>!<21>u<EFBFBD>u<EFBFBD>\<5C>':<3A>h<EFBFBD>'F<>!<21>%<25>%<25>PY<50>JZ<4A>^m<>Jm<4A>A<EFBFBD>A<EFBFBD>t<EFBFBD>D<EFBFBD>n<>D<EFBFBD>#<23>G<>t<EFBFBD>!<21>u<EFBFBD>u<EFBFBD>\<5C>':<3A>h<EFBFBD>'F<>A<EFBFBD>A<EFBFBD>t<EFBFBD>D<EFBFBD>G<>26<32>6<><14><14><0E>t<EFBFBD>$<24><14><04>6<><16><07><14>v<EFBFBD>t<EFBFBD>W<EFBFBD>c<EFBFBD>#<23>a<EFBFBD><15>-<2D>QT<51>>U<>V<>W<>W<><57>o<01><>G<><47>7<><37> <15>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>sT<00>E<00>+-E <04>E <04>#E<00>*E<04>E<04> E<00>E<04>&&E<00> E<00> F<03>'F<03>;F<03>Fz/posts/<int:post_id>c<00>$<00>V^8<>dQhR\/#<00>r:rnr<>)r<s"r=r>r><00>s<00><00><18><18>#<23>r?c<00>l<00>\V4pV'g \RR4#\V4p\V4#<00><02>Post not found.r<>)rrMrvr
<00>rn<00>rows& r=<00> api_get_postr<00>s3<00><00>
2026-02-14 22:57:24 -07:00
<1E>w<EFBFBD>
2026-02-15 11:21:29 -07:00
'<27>C<EFBFBD> <0E><15>'<27><13>-<2D>-<2D> <19><13>
<1D>C<EFBFBD> <12>3<EFBFBD><<3C>r?c<00>$<00>V^8<>dQhR\/#r
r<>)r<s"r=r>r><00>s<00><00>#<23>#<23>C<EFBFBD>#r?c<00><><00>\P!RRR7;'g/p\W4pV'g \RR4#\ V4# \
d p\\ T4R4uRp?#Rp?ii;i)TFr~r r<>r<>N)r r<>r!rMr
2026-02-15 11:21:29 -07:00
r<>rI)rnr<>rr<>s& r=<00>api_patch_postr<00>sg<00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD>#<23><1F><07>1<><03><12><19>+<2B>S<EFBFBD>1<> 1<><16>s<EFBFBD>|<7C><1B><> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s#<00>A<00>
A<00> A8<03>A3<03>-A8<03>3A8z/posts/<int:post_id>/bundlec<00>$<00>V^8<>dQhR\/#r
2026-02-15 11:21:29 -07:00
r<>)r<s"r=r>r><00>s<00><00><1B><1B>S<EFBFBD>r?c<00>V<00>\V4pV'g \RR4#\V4#r )rrMr
)rn<00>bundles& r=<00>api_post_bundler<00>s'<00><00> <1C>W<EFBFBD> %<25>F<EFBFBD> <11><15>'<27><13>-<2D>-<2D> <12>6<EFBFBD>?<3F>r?z/posts/<int:post_id>/audio-urlc<00>$<00>V^8<>dQhR\/#r
r<>)r<s"r=r>r><00>s<00><00>#<23>#<23><03>#r?c<04>R<00>\V4pV'g \RR4#VPR4pVPR4p\PPR\
2026-02-15 00:07:07 -07:00
R7p\PPRR\
R7p\ \^<V4R 4pVR
8XdWC8wd \R R 4#\WR 7p\V4# \d p\\T4R4uRp?#Rp?i\d p\\T4R4uRp?#Rp?ii;i)zt
Get signed URL for original audio/video so users can play it.
Private posts require owner user_id in query params.
r r<>r<>r<>r<>rqror<>i<>Qr<>z,Not authorized to access this private audio.<2E><>)rnrqNr<4E>) rrMrtr r<>rJr<>r<>rr
2026-02-15 11:21:29 -07:00
r<>rIr<>)rnrr<><00>owner_id<69> requester_idrq<00>resultr<74>s& r=<00>api_post_audio_urlr<00>s<><00><00> <1F>w<EFBFBD>
'<27>C<EFBFBD> <0E><15>'<27><13>-<2D>-<2D><14><17><17><1C>&<26>J<EFBFBD><12>w<EFBFBD>w<EFBFBD>y<EFBFBD>!<21>H<EFBFBD><1A><<3C><<3C>#<23>#<23>I<EFBFBD>C<EFBFBD>#<23>8<>L<EFBFBD><18><1C><1C>!<21>!<21>,<2C><04>3<EFBFBD>!<21>G<>J<EFBFBD><14>S<EFBFBD><12>Z<EFBFBD>(<28>%<25>0<>J<EFBFBD><11>Y<EFBFBD><1E><<3C>#;<3B><15>D<>c<EFBFBD>J<>J<>#<23>'<27><07>O<><06><16>v<EFBFBD><EFBFBD><1E><> <15>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s6<00>=C<00> D&<03>C9<03>3D&<03>9 D&<03>D&<03>D!<03>D&<03>!D&z/posts/<int:post_id>/filesc<00>$<00>V^8<>dQhR\/#r
2026-02-15 11:21:29 -07:00
r<>)r<s"r=r>r><00>s<00><00>#<23>#<23>#<23>#r?c<00><00>\P!RRR7;'g/p\\W44^<5E>3# \d p\ \ T4R4uRp?#Rp?i\d p\ \ T4R4uRp?#Rp?ii;ir<>)r r<>r
rr<>rMrIr<><00>rnr<>r<>s& r=<00> api_add_filer"<00>sr<00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD>#<23><16>'<27><07>9<>:<3A>C<EFBFBD>?<3F>?<3F><> <15>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>r<EFBFBD>c<00>$<00>V^8<>dQhR\/#r
r<>)r<s"r=r>r>s<00><00>#<23>#<23>C<EFBFBD>#r?c<00><><00>\R\V4/4# \d p\\ T4R4uRp?#Rp?ii;i)r<>r<>N)r
rr<>rMrI)rnr<>s& r=<00>api_list_filesr%s><00><00>#<23><16><07>!3<>G<EFBFBD>!<<3C>=<3D>><3E>><3E><> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s<00><00> A<03>=<03>A<03>Az/posts/<int:post_id>/metadatac<00>$<00>V^8<>dQhR\/#r
r<>)r<s"r=r>r> s<00><00> #<23> #<23>c<EFBFBD> #r?c<00> <00>\P!RRR7;'g/pVPR4pVf \RR4#\ \ W44# \ d p\\T4R4uRp?#Rp?ii;i)TFr~<00>metadataNz'metadata' is required.r<>r<>)r r<>rtrMr
r#r<>rI)rnr<>r(r<>s& r=<00>api_put_metadatar)
su<00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD><16>{<7B>{<7B>:<3A>&<26>H<EFBFBD><0F><17><15>/<2F><13>5<>5<>#<23><16>.<2E>w<EFBFBD>A<>B<>B<><42> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s<00>A<00> B<03>$A><03>8B<03>>Bc<00>$<00>V^8<>dQhR\/#r
r<>)r<s"r=r>r>s<00><00><18><18>c<EFBFBD>r?c<00>V<00>\V4pV'g \RR4#\V4#)zMetadata not found.r<>)rrMr
rs& r=<00>api_get_metadatar,s'<00><00>
2026-02-14 22:57:24 -07:00
<1E>w<EFBFBD>
'<27>C<EFBFBD> <0E><15>+<2B>S<EFBFBD>1<>1<> <12>3<EFBFBD><<3C>r?z/posts/<int:post_id>/rightsc<00>$<00>V^8<>dQhR\/#r
2026-02-15 11:21:29 -07:00
r<>)r<s"r=r>r> s<00><00>#<23>#<23>C<EFBFBD>#r?c<00><><00>\P!RRR7;'g/p\\W44# \d p\ \ T4R4uRp?#Rp?ii;i)TFr~r<>N)r r<>r
r$r<>rMrIr!s& r=<00>api_put_rightsr/sS<00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD>#<23><16>,<2C>W<EFBFBD>><3E>?<3F>?<3F><> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s<00>8<00> A"<03>A<03>A"<03>A"c<00>$<00>V^8<>dQhR\/#r
r<>)r<s"r=r>r>)s<00><00><18><18>C<EFBFBD>r?c<00>V<00>\V4pV'g \RR4#\V4#)zRights not found.r<>)rrMr
rs& r=<00>api_get_rightsr2(s'<00><00>
2026-02-14 22:57:24 -07:00
<1C>W<EFBFBD>
%<25>C<EFBFBD> <0E><15>)<29>3<EFBFBD>/<2F>/<2F> <12>3<EFBFBD><<3C>r?z/posts/<int:post_id>/chunksc<00>$<00>V^8<>dQhR\/#r
2026-02-15 11:21:29 -07:00
r<>)r<s"r=r>r>1s<00><00> #<23> #<23>C<EFBFBD> #r?c<00>R<00>\P!RRR7;'g/pVPR4p\V\4'g \ RR4#\ W4p\R\V4RV/4^<5E>3# \d p\ \T4R4uRp?#Rp?ii;i) TFr~<00>chunksz'chunks' must be a list.r<><00>insertedr<64>N) r r<>rt<00>
isinstance<EFBFBD>listrMrr
2026-02-15 11:21:29 -07:00
r<>r<>rI)rnr<>r5r<>r<>s& r=<00>api_add_chunksr90s<><00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD> <14>[<5B>[<5B><18> "<22>F<EFBFBD> <15>f<EFBFBD>d<EFBFBD> #<23> #<23><15>0<>#<23>6<>6<>#<23><1D>g<EFBFBD>.<2E><04><16>
<EFBFBD>C<EFBFBD><04>I<EFBFBD>x<EFBFBD><14>><3E>?<3F><13>D<>D<><44> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s<00>$A<<00>< B&<03>B!<03>B&<03>!B&c<00>$<00>V^8<>dQhR\/#r
2026-02-15 11:21:29 -07:00
r<>)r<s"r=r>r>@<00><00><00>#<23>#<23>C<EFBFBD>#r?c <00>&<00>\PPR^\R7p\PPR^<5E>\R7p\ R\ WVR7/4# \ d p\\T4R4uRp?#Rp?ii;i)r<>r<>r<>r5r<>r<>N) r r<>rtrJr
rr<>rMrI<00>rnr<>r<>r<>s& r=<00>api_get_chunksr>?su<00><00> <12><<3C><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<>D<EFBFBD> <13>L<EFBFBD>L<EFBFBD> <1C> <1C>W<EFBFBD>c<EFBFBD><03> <1C> <<3C>E<EFBFBD>#<23><16><08>/<2F>'<27>E<EFBFBD>"R<>S<>T<>T<><54> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23><><00>A&<00>& B<03>1B <03>B<03> Bz/auditc<00><00>\P!RRR7;'g/p\\V44^<5E>3# \d p\ \ T4R4uRp?#Rp?i\d p\ \ T4R4uRp?#Rp?ii;ir<>)r r<>r
rr<>rMrIr<>r<>s r=<00>api_create_auditrAJsq<00><00><15><1E><1E>T<EFBFBD>%<25>8<>><3E>><3E>B<EFBFBD>G<EFBFBD>#<23><16>}<7D>W<EFBFBD>-<2D>.<2E><03>3<>3<><33> <15>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>r<EFBFBD>c
2026-02-14 22:57:24 -07:00
<00><><00>\PPR\R7p\PPR\R7p\PPR^\R7p\PPR^d\R7p\ R\ WW#R7/4# \ d p\\T4R4uR p?#R p?ii;i)
rnr<>r<>r<>r<>r<><00>logs)rnr<>r<>r<>r<>N<> r r<>rtrJr
2026-02-15 11:21:29 -07:00
rr<>rMrI)rnr<>r<>r<>r<>s r=<00>api_list_auditrEUs<><00><00><15>l<EFBFBD>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>G<EFBFBD><15>l<EFBFBD>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>G<EFBFBD> <12><<3C><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<>D<EFBFBD> <13>L<EFBFBD>L<EFBFBD> <1C> <1C>W<EFBFBD>c<EFBFBD><03> <1C> <<3C>E<EFBFBD>#<23><16><06><0F><07>W[<5B> i<>j<>k<>k<><6B> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s<00>B0<00>0 C<03>;C<03>C<03>Cz/posts/<int:post_id>/auditc<00>$<00>V^8<>dQhR\/#r
r<>)r<s"r=r>r>cr;r?c <00>&<00>\PPR^\R7p\PPR^d\R7p\ R\ WVR7/4# \ d p\\T4R4uRp?#Rp?ii;i)r<>r<>r<>rC)rnr<>r<>r<>NrDr=s& r=<00>api_post_auditrHbsv<00><00> <12><<3C><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<>D<EFBFBD> <13>L<EFBFBD>L<EFBFBD> <1C> <1C>W<EFBFBD>c<EFBFBD><03> <1C> <<3C>E<EFBFBD>#<23><16><06><0F><07>RW<52> X<>Y<>Z<>Z<><5A> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>r?z/posts/<int:post_id>/downloadc<00>$<00>V^8<>dQhR\/#r
r<>)r<s"r=r>r>ns<00><00>hC<01>hC<01>3<EFBFBD>hCr?c<04><><00>\V4pV'g \RR4#\V4p\V4p\P
!4p\ P!VR\ P4;_uu_4pV'EdhVPR4'EdP\VR,\4'd\P!VR,4MVR,pRpRV9dXVR,pVPR4p \V 4^8<>d.V ^,PR4^,P!4pR VPR 4R
VPR
4R VPR R 4R VPR4RVPR4RVPR4/p
VP#R\P$!V
^R74V'dVP#RV4VF<>p V PR4R8XgK\+VRR7p V PR4pV'd<>\,P!V^R7pVP.^<5E>8XdAV R,PR4R9,pVP#RV 2VP04K<>\)RVP. 24K<>K<> \3V^R!R"7pV'dTR#P5VUu.uF%pR$VR%,R& R'VR(,R& R)VR*, 2NK' up4pVP#R+V4RRR4TP7^4RP5R-TPR R.444P!4pTP9R/R04R1,p\;TR2R3T R0T R42R57# \&dp \)RT 24Rp ? EL<>Rp ? ii;i \&dp \)R T 24Rp ? EK<>Rp ? ii;iuupi \&dp \)R,T 24Rp ? L<>Rp ? ii;i +'giEL;i \&dEp \)R6T 24^RIpTP?4\R7\T 4 2R84uRp ? #Rp ? ii;i):zg
Download post as a ZIP file containing:
- Original audio file
- Transcript as text
- Metadata as JSON
zPost not foundr<64><00>wr(r<>r<>z Transcript:
z
Answer user questionsrgr<>r<>r<><00>transcript_lengthr<68><00>
created_atr<EFBFBD>z metadata.json)<01>indentztranscript.txtzError adding metadata: Nr<4E>r<>i,rprr)<01>timeoutrXr<>zaudio/zFailed to download audio: HTTP zError adding audio file: i<>r<>z
<EFBFBD>[r<>z.2fzs - r<>zs]
r<EFBFBD>ztranscript_timestamped.txtzError adding chunks: c3<00>b"<00>TF%qP4'g
2026-02-15 11:21:29 -07:00
VR9gK!Vx<00>K' R#5i)r<>N)r<><00>-r<>)<01>isalnum)<02>.0<EFBFBD>cs& r=<00> <genexpr><3E> download_post.<locals>.<genexpr><3E>s%<00><00><00>l<>(D<>1<EFBFBD> <09> <09> <0B> <0B>WX<57>\k<>Wk<57>Q<EFBFBD>Q<EFBFBD>(D<>s<00>/<01>
/<01>archiver<65>r<>:N<>2Nzapplication/zipTz.zip)r<><00> as_attachment<6E> download_namezDownload error: zFailed to create download: r<><00><><EFBFBD><EFBFBD><EFBFBD>) rrMrr<00>io<69>BytesIO<49>zipfile<6C>ZipFile<6C> ZIP_DEFLATEDrtr7rIr<><00>loads<64>splitr<74>r<><00>writestrr<72>r<><00>printr<00>requests<74> status_coder<65>rr<><00>seek<65>replacer<00> traceback<63> print_exc)rnrkr<><00> metadata_row<6F>
zip_buffer<EFBFBD>zipf<70> metadata_dictrfr<><00>match<63>clean_metadatar<61><00> file_info<66>audio_url_datarr<00>response<73>original_filenamer5rc<00> chunks_text<78>
2026-02-15 11:21:29 -07:00
safe_titlerjs& r=<00> download_postrxms<00><00>aC<01>#<23>G<EFBFBD>,<2C><04><13><19>*<2A>C<EFBFBD>0<> 0<>#<23>7<EFBFBD>+<2B><05>+<2B>G<EFBFBD>4<> <0C><18>Z<EFBFBD>Z<EFBFBD>\<5C>
<EFBFBD> <14>_<EFBFBD>_<EFBFBD>Z<EFBFBD><13>g<EFBFBD>.B<>.B<> C<> C<>t<EFBFBD><1B>|<7C> <0C> 0<> 0<><1A> <<3C> <<3C>9<>LV<4C>Wc<57>dn<64>Wo<57>qt<71>Lu<4C>Lu<4C>D<EFBFBD>J<EFBFBD>J<EFBFBD>|<7C>J<EFBFBD>/G<>$H<>|H<02>IS<02>|T<02>M<EFBFBD>')<29>O<EFBFBD><1F>=<3D>0<>!.<2E>x<EFBFBD>!8<><06> &<26> <0C> <0C>_<EFBFBD> =<3D><05><1E>u<EFBFBD>:<3A><01>><3E>.3<EFBFBD>A<EFBFBD>h<EFBFBD>n<EFBFBD>n<EFBFBD>=X<>.Y<>Z[<5B>.\<5C>.b<>.b<>.d<>O<EFBFBD> <20><14><18><18>'<27>!2<>%<25>t<EFBFBD>x<EFBFBD>x<EFBFBD> <0A>'><3E>"<22>M<EFBFBD>$5<>$5<>j<EFBFBD>$<24>$G<>+<2B>]<5D>-><3E>-><3E>?X<>-Y<>$<24>d<EFBFBD>h<EFBFBD>h<EFBFBD>|<7C>&<<3C>$<24>d<EFBFBD>h<EFBFBD>h<EFBFBD>|<7C>&<<3C> &<16>N<EFBFBD><19>M<EFBFBD>M<EFBFBD>/<2F>4<EFBFBD>:<3A>:<3A>n<EFBFBD>UV<55>3W<33>X<>'<27><1C> <0A> <0A>&6<><0F>H<> #<23> <09><1C>=<3D>=<3D><16>(<28>,<<3C><<3C>?<3F>)?<3F><07>TW<54>)X<><0E>%3<>%7<>%7<> <0C>%E<>
<EFBFBD>%<25>'/<2F>|<7C>|<7C>J<EFBFBD><02>'K<>H<EFBFBD>'<27>3<>3<>s<EFBFBD>:<3A>4=<3D>f<EFBFBD>4E<34>4K<34>4K<34>C<EFBFBD>4P<34>QS<51>4T<34> 1<> $<24> <0A> <0A><06>7H<37>6I<36>.J<>H<EFBFBD>L\<5C>L\<5C> ]<5D> %<25>(G<><08>H\<5C>H\<5C>G]<5D>&^<5E> _<>&<26>#<23>* 3<>(<28><17>q<EFBFBD><04>E<><06><19>"(<28>+<2B>+<2B>%+<2B>/<16>%+<2B>E<EFBFBD><1C>E<EFBFBD>+<2B>.<2E>s<EFBFBD>3<>4<EFBFBD><05>i<EFBFBD>8H<38><13>7M<37>T<EFBFBD>RW<52>X^<5E>R_<52>Q`<60>a<>%+<2B>/<16>#<17>K<EFBFBD><19>M<EFBFBD>M<EFBFBD>"><3E> <0B>L<>}D<01>F <13><0F><0F><01><1A><18>W<EFBFBD>W<EFBFBD>l<><04><08><08><17>)<29>(D<>l<>l<>r<>r<>t<>
<EFBFBD><1F>'<27>'<27><03>S<EFBFBD>1<>#<23>6<>
<EFBFBD><18> <16>&<26><1E>'<27>L<EFBFBD><01>'<27><19>$<24>7<> 
<EFBFBD>
<EFBFBD><EFBFBD>W!<21>9<><19>3<>A<EFBFBD>3<EFBFBD>7<>8<>8<><38>9<><39>*%<25>?<3F><1D> 9<>!<21><13>=<3D>><3E>><3E><>?<3F><>/<16><>
<1D> 3<><15>-<2D>a<EFBFBD>S<EFBFBD>1<>2<>2<><32> 3<><33>D<01> C<> C<><43>` <15>C<01> <0A> <20><11><03>$<24>%<25><18><11><1B><1B><1D><15>3<>C<EFBFBD><01>F<EFBFBD>8<EFBFBD><<3C>c<EFBFBD>B<>B<><42> C<01>s<EFBFBD><00>P+<00>AP+<00>:!P<05>D;N<04>N<04>+P<05> B O<06>P<05>O<06>0P<05>7%O1<04>+O, <0C>O1<04> A<P+<00> O<07>(N<<07>6P<05><O<07>P<05> O) <09>O$ <09>P<05>$O) <09>)P<05>,O1<04>1 P<07><P<07>
P<05>P<07>P<05> P( <09>" P+<00>+ Q:<03>69Q5<03>/Q:<03>5Q:c<00>$<00>V^8<>dQhR\/#r
2026-02-15 11:21:29 -07:00
r<>)r<s"r=r>r>_s<00><00>?<3F>?<3F>S<EFBFBD>?r?c<00>T<00>\PPR\R7pV'g \ RR4#\ V4pV'g \ RR4#VPR4V8wd \ RR4#\ RVRR R
2026-02-15 10:47:03 -07:00
\P!R VR VPR 4/4/4\V4\V4\V4\V4\V4\R RRV/4# \d#p\ R\!T4 2R4uRp?#Rp?ii;i)r<>r<><00>('user_id' is required for authorization.r<>r r<>z.You don't have permission to delete this post.rr<>z post.deletedr<64><00>deleted_post_idrgrGzPost deleted successfullyrnzFailed to delete post: r<>N)r r<>rtrJrMrrr<>r<>r%r&r'r(r)r
2026-02-15 11:21:29 -07:00
r<>rI)rnr<>rkr<>s& r=<00>api_delete_postr}^s <00><00><15>l<EFBFBD>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>G<EFBFBD> <12><15>@<40>#<23>F<>F<> <1F><07> (<28>D<EFBFBD> <0F><15>'<27><13>-<2D>-<2D> <0B>x<EFBFBD>x<EFBFBD> <09><1A>g<EFBFBD>%<25><15>F<><03>L<>L<>?<3F><15> <15>w<EFBFBD> <14>n<EFBFBD> <15>t<EFBFBD>z<EFBFBD>z<EFBFBD>#4<>g<EFBFBD>w<EFBFBD><04><08><08>QX<51>HY<48>"Z<>[<5B>
2026-02-15 10:47:03 -07:00
<EFBFBD> <0B> <1A>'<27>"<22><1C>W<EFBFBD>%<25><17><07> <20><15>g<EFBFBD><1E><19>'<27>"<22><16> <09>#><3E> <09>7<EFBFBD>S<>T<>T<><54> <14>?<3F><15>/<2F><03>A<EFBFBD><06>x<EFBFBD>8<>#<23>><3E>><3E><>?<3F>s<00><A=C:<00>: D'<03>D"<03>D'<03>"D'z/posts/<int:post_id>/editc<00>$<00>V^8<>dQhR\/#r
2026-02-15 11:21:29 -07:00
r<>)r<s"r=r>r>~s<00><00>&?<3F>&?<3F>3<EFBFBD>&?r?c<00><><00>\P!RR7;'g/pVPR4pV'g \RR4#\ V4pV'g \RR4#VPR4V8wd \RR4#/pR V9d:VR ,;'gR
P 4pV'g \R R4#WTR &R V9d VR ,VR &R V9dGVR ,;'gR
P 4P 4pVR9d \RR4#WdR &V'g \RR4#\W4p\RVRVRRR\P!R\VP44/4/4\V4# \d#p\R\T4 2R4uRp?#Rp?ii;i)T)rr<>r{r<>r r<>z,You don't have permission to edit this post.rrgr<>zTitle cannot be empty.r<>r<>r<>zNo valid fields to update.rnr<>z post.editedr<64><00>changeszFailed to update post: r<>N>r<>r<>)r r<>rtrMrr<>rTr!rr<>r<>r8<00>keysr
2026-02-15 11:21:29 -07:00
r<>rI) rnr<>r<>rk<00>updatesrgr<><00> updated_postr<74>s & r=<00> api_edit_postr<74>}s<><00><00><15><1E><1E>T<EFBFBD>*<2A>0<>0<>b<EFBFBD>G<EFBFBD><15>k<EFBFBD>k<EFBFBD>)<29>$<24>G<EFBFBD> <12><15>@<40>#<23>F<>F<> <1F><07> (<28>D<EFBFBD> <0F><15>'<27><13>-<2D>-<2D> <0B>x<EFBFBD>x<EFBFBD> <09><1A>g<EFBFBD>%<25><15>D<>c<EFBFBD>J<>J<><10>G<EFBFBD><0E>'<27><19><18><17>!<21>'<27>'<27>R<EFBFBD>.<2E>.<2E>0<><05><14><19>2<>C<EFBFBD>8<> 8<> <20><07><18><14><07><1F>!(<28><1D>!7<><07> <0A><1E><13>w<EFBFBD><1E><1D>l<EFBFBD>+<2B>1<>1<>r<EFBFBD>8<>8<>:<3A>@<40>@<40>B<>
<EFBFBD> <15>2<> 2<><19>G<><13>M<> M<> *<2A> <0C><1D> <12><15>2<>C<EFBFBD>8<>8<>
?<3F>(<28><17>:<3A> <0C><15> <15>w<EFBFBD> <15>w<EFBFBD> <14>m<EFBFBD> <15>t<EFBFBD>z<EFBFBD>z<EFBFBD>9<EFBFBD>d<EFBFBD>7<EFBFBD><<3C><<3C>><3E>.B<>"C<>D<> 
2026-02-15 10:47:03 -07:00
<EFBFBD> <0B> <17>|<7C>$<24>$<24><> <14>?<3F><15>/<2F><03>A<EFBFBD><06>x<EFBFBD>8<>#<23>><3E>><3E><>?<3F>s<00>?AF<00> G<03> F=<03>7G<03>=Gc<00>N<00>V^8<>dQh/^\9d\R,;R&#)r:NrC)<02>__conditional_annotations__r)r<s"r=r>r>s%<00><00><04><04>|+<2B>*<2A> <0C>t<EFBFBD>#<23>*<2A>}r?> <00>m4a<34>mkv<6B>mov<6F>mp3<70>mp4<70>ogg<67>wav<61>flac<61>webm)r<>)kr<6B><00>__doc__r[r<><00>osr<73><00>pathlibrr]r_<00>flaskr<00>typingrrrf<00>dotenvr<00>faster_whisperrr r
r <00>werkzeug.securityr r <00>werkzeug.utilsr<00>
2026-02-15 10:47:03 -07:00
db_queriesrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)<00>__name__r*<00>getenvr<76><00>mkdirrUr0r2r4r<>rCrErMrVrdrirvrtr|rkr<>r<>r<>r<>r<>r<>rrrr<00>patchrrrr"r%<00>putr)r,r/r2r9r>rArErHrx<00>deleter}r<>r>)r<>s@r=<00><module>r<>sl<00><><01><04>
<0F> <0B> <09> <0B><18> <09><0E><1B><1C><0F><1E>'<27>-<2D>-<2D>I<>*<2A><02><02><02><02><02><02><02><02>8 <0C> <0A><0F><05>x<EFBFBD>F<EFBFBD>3<><03> <11>"<22>)<29>)<29>0<>)<29><<3C> =<3D>
2026-02-14 22:57:24 -07:00
<EFBFBD>
2026-02-15 00:24:49 -07:00
<EFBFBD><10><10><14><04><10>-<2D>\<5C><18><12> <09> <09>/<2F>6<EFBFBD>2<> <0A><13><19><19>+<2B>U<EFBFBD>3<><0E><19>y<EFBFBD>y<EFBFBD>!7<><16>@<40><14><13><19><19>,<2C>b<EFBFBD>i<EFBFBD>i<EFBFBD>8Q<38>S]<5D>.^<5E>_<><0E>&*<2A><0E>*<2A><1A>/<2F>J<01> <19><06><10><05><17><17><19><13><07><14><07><05><18><18>
2026-02-15 11:21:29 -07:00
<1A><1B>#<23><1C>#<23>D<05><18><18>-<2D><18><06><19><06>@<05><18><18>/<2F><1A>V@<01><1B>V@<01>v<05><17><17> '<27>(<28>#<23>)<29>#<23><05><17><17><1D><17>#<23><18>#<23>(<05><18><18>(<28><13>#<23><14>#<23><05><17><17> <1F> <20><19>!<21><19><05><18><18>(<28><13>#<23><14>#<23><05><17><17><18><12>#<23><13>#<23>0<05><17><17> <1F> <20><18>!<21><18><05><19><19> !<21>"<22>#<23>#<23>#<23><05><17><17> &<26>'<27><1B>(<28><1B><05><17><17> )<29>*<2A>#<23>+<2B>#<23>6<05><18><18>
2026-02-14 22:57:24 -07:00
&<26>'<27>#<23>(<28>#<23><05><17><17> %<25>&<26>#<23>'<27>#<23><05><17><17> (<28>)<29> #<23>*<2A> #<23><05><17><17> (<28>)<29><18>*<2A><18><05><17><17> &<26>'<27>#<23>(<28>#<23><05><17><17> &<26>'<27><18>(<28><18><05><18><18>
2026-02-15 10:47:03 -07:00
'<27>(<28> #<23>)<29> #<23><05><17><17> &<26>'<27>#<23>(<28>#<23><05><18><18>(<28><13>#<23><14>#<23><05><17><17><18><12> #<23><13> #<23><05><17><17> %<25>&<26>#<23>'<27>#<23><05><17><17> (<28>)<29>hC<01>*<2A>hC<01>`<05><1A><1A> "<22>#<23>?<3F>$<24>?<3F><<05><17><17> $<24>%<25>&?<3F>&<26>&?r?