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

96 lines
31 KiB
Plaintext
Raw Normal View History

2026-02-14 22:57:24 -07:00
+
2026-02-15 00:24:49 -07:00
<00>r<EFBFBD>iVJ<00><00>Xa<00>R_tZ0tRt^RIt^RIt^RIt^RIt^RIHt^RIH t ^RI
2026-02-15 00:07:07 -07:00
H t ^RI H t HtHt^RIHtHt^RIHt^RIHtHtHtHtHtHtHtHtHtHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+] !4] !R ],R
2026-02-15 00:24:49 -07:00
R 7t-]!]P\!R R 44t/]/PaRRR70R`mt1]P\!RR4t2]P\!RR4t3]P\!RR4t4]P\!R]P\!RR44t5Rs6]^kRRlt7RaRRllt8RRlt9RR lt:R!R"lt;R#R$lt<]-P{R%4R&4t>]-PR'4R(4t@]-PR)4R*4tA]-PR+4R,4tB]-P{R-4R.R/l4tC]-P{R04R14tD]-PR24R34tE]-P{R44R5R6l4tF]-PR74R84tG]-P{R74R94tH]-P{R:4R;R<l4tI]-P<>R:4R=R>l4tK]-P{R?4R@RAl4tL]-P{RB4RCRDl4tM]-PRE4RFRGl4tN]-P{RE4RHRIl4tO]-P<>RJ4RKRLl4tQ]-P{RJ4RMRNl4tR]-P<>RO4RPRQl4tS]-P{RO4RRRSl4tT]-PRT4RURVl4tU]-P{RT4RWRXl4tV]-PRY4RZ4tW]-P{RY4R[4tX]-P{R\4R]R^l4tYR#)bz}
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.
2026-02-15 00:07:07 -07:00
N)<01>Path)<01> load_dotenv<6E><01> WhisperModel)<03> Blueprint<6E>jsonify<66>request)<02>check_password_hash<73>generate_password_hash)<01>secure_filename)<16>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>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>0/home/mann/Work/TitanForge/backend/api_routes.py<70> __annotate__r6;s<00><00><1A><1A> <0C><1A>c<00>R<00>\f\\\\R7s\#)N)<02>device<63> compute_type)<05>_whisper_modelrr(r*r,<00>r7r5<00>_modelr=;s#<00><00><15><1D>%<25> <19>!<21>-<2D>
2026-02-14 22:57:24 -07:00
<EFBFBD><0E>
2026-02-15 00:07:07 -07:00
<1A>r7c<00>0<00>V^8<>dQhR\R\/#)r2<00>message<67>status)<02>str<74>int)r4s"r5r6r6Fs<00><00>/<2F>/<2F>C<EFBFBD>/<2F><13>/r7c<00> <00>\RV/4V3#)<01>error)r)r?r@s&&r5<00>_errorrEFs<00><00> <12>G<EFBFBD>W<EFBFBD>%<25> &<26><06> .<2E>.r7c<00>0<00>V^8<>dQhR\R\/#)r2<00>filenamer3)rA<00>bool)r4s"r5r6r6Js<00><00>J<01>J<01>C<EFBFBD>J<01>D<EFBFBD>Jr7c<00>p<00>RV9dR#VPR^4^,P4\9#)<02>.F)<03>rsplit<69>lower<65>ALLOWED_MEDIA_EXTENSIONS)rGs&r5<00> _allowed_filerNJs2<00><00>
<EFBFBD>(<28><1A><14> <13>?<3F>?<3F>3<EFBFBD><01> "<22>1<EFBFBD> %<25> +<2B> +<2B> -<2D>1I<31> I<>Ir7c<00>0<00>V^8<>dQhR\R\/#)r2<00>pathr3)rrA)r4s"r5r6r6Ps<00><00><19><19>$<24><19>3<EFBFBD>r7c<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)rP<00>h<>f<>chunks& r5<00>_sha256r\Psh<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>
2026-02-15 00:07:07 -07:00
<19><1F> <0A>;<3B>;<3B>=<3D><18>s <00>/A6<05>6 B c<00><<00>V^8<>dQhR\R\R\/#)r2<00>transcript_text<78>titler3)rA)r4s"r5r6r6[s!<00><00><06><06>3<EFBFBD><06>s<EFBFBD><06>s<EFBFBD>r7c<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
2026-02-15 00:07:07 -07:00
Answer user questions grounded in this transcript.r<)r^r_s&&r5<00> _build_promptra[s&<00><00> <17><1C>g<EFBFBD><18> <1A>
2026-02-15 00:24:49 -07:00
<1B>=<3D> =<3D>r7c<00>t<00>V^8<>dQhR\\\3,R\\\3,/#)r2<00>postr3)<03>DictrA<00>Any)r4s"r5r6r6cs*<00><00><10><10><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E><10>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD>r7c<04><><00>VPR4R8Xd$\VR,RR7pVR,VR&V#V# T#;i)z%Add signed audio URL to post if readyr@<00>ready<64>post_id<69>)<01>
expires_in<EFBFBD>
signed_url<EFBFBD> audio_url)<02>getr)rc<00>
audio_datas& r5<00>_add_audio_urlrocsQ<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#)r@<00>ok<6F> whisper_model<65>whisper_device<63>whisper_compute_type)rr(r*r,r<r7r5<00>healthruos)<00><00> <12><10>$<24><17><1D><18>.<2E><1E> 4<> <06> <07>r7z/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>
2026-02-15 00:24:49 -07:00
avatar_url<EFBFBD>bio<69>user_id<69>actionz user.register<65>details<6C>user<65><72>N)r<00>get_jsonrm<00>striprLrErrr
r <00>json<6F>dumpsr<00> ExceptionrA)<06>payloadrzr|<00>existingr<67><00>es r5<00> api_registerr<72>{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
2026-02-15 00:24:49 -07:00
,V4'g \ RR 4#\R VR ,R R R\P!RV/4/4\RR VR ,RVR,RVPR4RVPR4RVPR4//4#)TFrwrzr{r|r}r~zInvalid credentials.i<>rr<>r<>z
user.loginr<6E>r<>r<>r<>r<>) rr<>rmr<>rLrErr r r<>r<>r)r<>rzr|r<>s r5<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>
2026-02-15 00:07:07 -07:00
r7z /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
2026-02-15 00:24:49 -07:00
/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<>r_zUntitled recording<6E> description<6F>
2026-02-15 00:07:07 -07:00
visibility<EFBFBD>private<74>language<67>enz+'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>_Nr@<00>
2026-02-15 00:24:49 -07:00
processing<EFBFBD>storage_prefixrhrRzapplication/octet-streamF)<05>bucket<65> object_path<74>content<6E> content_type<70>upsert<72>role<6C>original_audiorPr<><00>
2026-02-15 00:07:07 -07:00
size_bytesrT<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
2026-02-15 00:24:49 -07:00
text/plainzutf-8rgr<>zpost.upload.transcribedr<64><00>
audio_pathr^<00>rag_chunk_count<6E>failedzpost.upload.failedrDzUpload/transcription failed: r<>><00>publicr<63>)4r<00>filesrErGrN<00>formrmr<>rLrB<00> TypeError<6F>
2026-02-15 00:07:07 -07:00
ValueErrorrrA<00>uuid<69>uuid4r <00>
UPLOAD_DIR<EFBFBD>saverr\rUr<00>ARCHIVE_BUCKETrV<00>mimetyper <00>stat<61>st_sizer=<00>
2026-02-15 00:24:49 -07:00
transcriber<EFBFBD><00>append<6E>float<61>start<72>end<6E> avg_logprob<6F>joinrarr r<>r<><00>len<65>encoderSrTrXrr rr<>)<1A>media<69> user_id_rawr_r<>r<>r<>r<>r<><00> post_uuid<69> safe_namer<65><00>storage_object_path<74>
saved_path<EFBFBD> created_postrh<00> media_sha<68>
media_file<EFBFBD>segments<74>_info<66>rag_rows<77>transcript_parts<74>seg<65> segment_textr^<00> prompt_textr<74>s r5<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>
2026-02-15 00:24:49 -07:00
<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>r2r<><00>rB)r4s"r5r6r6\s<00><00>#<23>#<23>c<EFBFBD>#r7c <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>argsrmrBrr<00>min<69>maxr<78>rErA)r<>r<>r<><00>postsr<73>s& r5<00>api_user_historyr<79>[s<><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{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) rr<>rmr<>rBrErrr<>r<>r<>rA)r<>r<>r<>r<><00>rowsr<73>s r5<00>api_rag_searchr<68>gs<><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>TFrwr~Nr<4E>)rr<>rrr<>rErAr<><00>r<>r<>s r5<00>api_create_userr<72>|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<>)r4s"r5r6r6<00>s<00><00><19><19>#<23>r7c<00>V<00>\V4pV'g \RR4#\V4#)r<>r<>)rrEr)r<>r<>s& r5<00> api_get_userr<72><00>s'<00><00> <19>'<27> "<22>D<EFBFBD> <0F><15>'<27><13>-<2D>-<2D> <12>4<EFBFBD>=<3D>r7z/postsc<00><00>\P!RRR7;'g/p\\V44^<5E>3# \d p\ \ T4R4uRp?#Rp?i\d p\ \ T4R4uRp?#Rp?ii;ir<>)rr<>rrr<>rErAr<>r<>s r5<00>api_create_postr<74><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) rr<>rmrBrrorr<>r<>r<>rErA)r<>r<>r<>r<>r<><00>prcr<>s r5<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>r2rhr<>)r4s"r5r6r6<00>s<00><00><18><18>#<23>r7c<00>V<00>\V4pV'g \RR4#\V4#<00><02>Post not found.r<>)rrEr<00>rh<00>rows& r5<00> api_get_postr<00>s'<00><00>
2026-02-14 22:57:24 -07:00
<1E>w<EFBFBD>
2026-02-15 00:24:49 -07:00
'<27>C<EFBFBD> <0E><15>'<27><13>-<2D>-<2D> <12>3<EFBFBD><<3C>r7c<00>$<00>V^8<>dQhR\/#rr<>)r4s"r5r6r6<00>s<00><00>#<23>#<23>C<EFBFBD>#r7c<00><><00>\P!RRR7;'g/p\W4pV'g \RR4#\ V4# \
d p\\ T4R4uRp?#Rp?ii;i)TFrwrr<>r<>N)rr<>rrErr<>rA)rhr<>rr<>s& r5<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\/#rr<>)r4s"r5r6r6<00>s<00><00><1B><1B>S<EFBFBD>r7c<00>V<00>\V4pV'g \RR4#\V4#r)rrEr)rh<00>bundles& r5<00>api_post_bundler<00>s'<00><00> <1C>W<EFBFBD> %<25>F<EFBFBD> <11><15>'<27><13>-<2D>-<2D> <12>6<EFBFBD>?<3F>r7z/posts/<int:post_id>/audio-urlc<00>$<00>V^8<>dQhR\/#rr<>)r4s"r5r6r6<00>s<00><00>#<23>#<23><03>#r7c<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.
2026-02-15 00:24:49 -07:00
rr<>r<>r<>r<>rjrir<>i<>Qr<>z,Not authorized to access this private audio.i<>)rhrjNr<4E>) rrErmrr<>rBr<>r<>rrr<>rAr<>)rhrr<><00>owner_id<69> requester_idrj<00>resultr<74>s& r5<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\/#rr<>)r4s"r5r6r6<00>s<00><00>#<23>#<23>#<23>#r7c<00><00>\P!RRR7;'g/p\\W44^<5E>3# \d p\ \ T4R4uRp?#Rp?i\d p\ \ T4R4uRp?#Rp?ii;ir<>)rr<>rr r<>rErAr<><00>rhr<>r<>s& r5<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\/#rr<>)r4s"r5r6r6<00>s<00><00>#<23>#<23>C<EFBFBD>#r7c<00><><00>\R\V4/4# \d p\\ T4R4uRp?#Rp?ii;i)r<>r<>N)rrr<>rErA)rhr<>s& r5<00>api_list_filesr<00>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\/#rr<>)r4s"r5r6r6s<00><00> #<23> #<23>c<EFBFBD> #r7c<00> <00>\P!RRR7;'g/pVPR4pVf \RR4#\ \ W44# \ d p\\T4R4uRp?#Rp?ii;i)TFrw<00>metadataNz'metadata' is required.r~r<>)rr<>rmrErr r<>rA)rhr<>rr<>s& r5<00>api_put_metadatar <00>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\/#rr<>)r4s"r5r6r6 s<00><00><18><18>c<EFBFBD>r7c<00>V<00>\V4pV'g \RR4#\V4#)zMetadata not found.r<>)rrErrs& r5<00>api_get_metadatar# s'<00><00>
2026-02-14 22:57:24 -07:00
<1E>w<EFBFBD>
2026-02-15 00:24:49 -07:00
'<27>C<EFBFBD> <0E><15>+<2B>S<EFBFBD>1<>1<> <12>3<EFBFBD><<3C>r7z/posts/<int:post_id>/rightsc<00>$<00>V^8<>dQhR\/#rr<>)r4s"r5r6r6s<00><00>#<23>#<23>C<EFBFBD>#r7c<00><><00>\P!RRR7;'g/p\\W44# \d p\ \ T4R4uRp?#Rp?ii;i)TFrwr<>N)rr<>rr!r<>rErArs& r5<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\/#rr<>)r4s"r5r6r6s<00><00><18><18>C<EFBFBD>r7c<00>V<00>\V4pV'g \RR4#\V4#)zRights not found.r<>)rrErrs& r5<00>api_get_rightsr)s'<00><00>
2026-02-14 22:57:24 -07:00
<1C>W<EFBFBD>
2026-02-15 00:24:49 -07:00
%<25>C<EFBFBD> <0E><15>)<29>3<EFBFBD>/<2F>/<2F> <12>3<EFBFBD><<3C>r7z/posts/<int:post_id>/chunksc<00>$<00>V^8<>dQhR\/#rr<>)r4s"r5r6r6&s<00><00> #<23> #<23>C<EFBFBD> #r7c<00>R<00>\P!RRR7;'g/pVPR4p\V\4'g \ RR4#\ W4p\R\V4RV/4^<5E>3# \d p\ \T4R4uRp?#Rp?ii;i) TFrw<00>chunksz'chunks' must be a list.r~<00>insertedr<64>N) rr<>rm<00>
isinstance<EFBFBD>listrErrr<>r<>rA)rhr<>r,r<>r<>s& r5<00>api_add_chunksr0%s<><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\/#rr<>)r4s"r5r6r65<00><00><00>#<23>#<23>C<EFBFBD>#r7c <00>&<00>\PPR^\R7p\PPR^<5E>\R7p\ R\ WVR7/4# \ d p\\T4R4uRp?#Rp?ii;i)r<>r<>r<>r,r<>r<>N) rr<>rmrBrrr<>rErA<00>rhr<>r<>r<>s& r5<00>api_get_chunksr54su<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<>)rr<>rr r<>rErAr<>r<>s r5<00>api_create_auditr8?sq<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)
2026-02-15 00:24:49 -07:00
rhr<>r<>r<>r<>r<><00>logs)rhr<>r<>r<>r<>N<> rr<>rmrBrrr<>rErA)rhr<>r<>r<>r<>s r5<00>api_list_auditr<Js<><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\/#rr<>)r4s"r5r6r6Xr2r7c <00>&<00>\PPR^\R7p\PPR^d\R7p\ R\ WVR7/4# \ d p\\T4R4uRp?#Rp?ii;i)r<>r<>r<>r:)rhr<>r<>r<>Nr;r4s& r5<00>api_post_auditr?Wsv<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>r6c<00>N<00>V^8<>dQh/^\9d\R,;R&#)r2Nr;)<02>__conditional_annotations__r)r4s"r5r6r6s%<00><00><04><04>n+<2B>*<2A> <0C>t<EFBFBD>#<23>*<2A>or7> <00>m4a<34>mkv<6B>mov<6F>mp3<70>mp4<70>ogg<67>wav<61>flac<61>webm)r~)[rA<00>__doc__rSr<><00>osr<73><00>pathlibr<00>dotenvr<00>faster_whisperr<00>flaskrrr<00>werkzeug.securityr r
2026-02-14 22:57:24 -07:00
<00>werkzeug.utilsr <00>
2026-02-15 00:24:49 -07:00
db_queriesr r rrrrrrrrrrrrrrrrrrr r!<00>__name__r"<00>getenvr<76><00>mkdirrMr(r*r,r<>r;r=rErNr\rarormrurcr<>r<>r<>r<>r<>r<>r<>r<>rr<00>patchr rrrr<00>putr r#r&r)r0r5r8r<r?r6)rAs@r5<00><module>rYs<><00><><01><04>
2026-02-15 00:07:07 -07:00
<0F> <0B> <09> <0B><18><1E>'<27>-<2D>-<2D>I<>*<2A><02><02><02><02><02><02>2 <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>
<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 00:24:49 -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>#r7