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

104 lines
31 KiB
Plaintext
Raw Normal View History

2026-02-14 22:57:24 -07:00
+
2026-02-15 00:07:07 -07:00
Gp<47>i<EFBFBD>I<00><00><>a<00>R`tZ0tRt^RIt^RIt^RIt^RIt^RIHt^RIH t ^RI
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
R 7t-]!]P\!R R 44t/]/PaRRR70Ramt1]P\!RR4t2]P\!RR4t3]P\!RR4t4]P\!R]P\!RR44t5Rs6]^kRRlt7RbRRllt8RRlt9RR lt:R!R"lt;]-PyR#4R$4t=]-P}R%4R&4t?]-P}R'4R(4t@]-P}R)4R*4tA]-PyR+4R,R-l4tB]-PyR.4R/4tC]-P}R04R14tD]-PyR24R3R4l4tE]-P}R54R64tF]-PyR54R74tG]-PyR84R9R:l4tH]-P<>R84R;R<l4tJ]-PyR=4R>R?l4tK]-PyR@4RARBl4tL]-P}RC4RDREl4tM]-PyRC4RFRGl4tN]-P<>RH4RIRJl4tP]-PyRH4RKRLl4tQ]-P<>RM4RNROl4tR]-PyRM4RPRQl4tS]-P}RR4RSRTl4tT]-PyRR4RURVl4tU]-P}RW4RX4tV]-PyRW4RY4tW]-PyRZ4R[R\l4tX]-PyR]4R^R_l4tYR#)cz}
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>
<1B>=<3D> =<3D>r7z/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>healthrges)<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:07:07 -07:00
avatar_url<EFBFBD>bio<69>user_id<69>actionz user.register<65>details<6C>user<65><72>N)r<00>get_json<6F>get<65>striprLrErrr
r <00>json<6F>dumpsr<00> ExceptionrA)<06>payloadrlrn<00>existingrx<00>es r5<00> api_registerr<72>qsk<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:07:07 -07:00
,V4'g \ RR 4#\R VR ,R R R\P!RV/4/4\RR VR ,RVR,RVPR4RVPR4RVPR4//4#)TFrirlrmrnrorpzInvalid credentials.i<>rqrurvz
user.loginrwrxrrrsrt) rrzr{r|rLrErr r r}r~r)r<>rlrnrxs 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
/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.rpzFilename is empty.zUnsupported media extension.rur_zUntitled recording<6E> description<6F>
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>
processing<EFBFBD>storage_prefix<69>post_idrRzapplication/octet-streamF)<05>bucket<65> object_path<74>content<6E> content_type<70>upsert<72>role<6C>original_audiorPr<><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:07:07 -07:00
text/plainzutf-8<>readyrvzpost.upload.transcribedrw<00>
audio_pathr^<00>rag_chunk_count<6E>failedzpost.upload.failedrDzUpload/transcription failed: ry><00>publicr<63>)4r<00>filesrErGrN<00>formr{r|rLrB<00> TypeError<6F>
ValueErrorrrA<00>uuid<69>uuid4r <00>
UPLOAD_DIR<EFBFBD>saverr\rUr<00>ARCHIVE_BUCKETrV<00>mimetyper <00>stat<61>st_sizer=<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<>rurx<00> post_uuid<69> safe_namer<65><00>storage_object_path<74>
saved_path<EFBFBD> created_postr<74><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:07:07 -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>r2ru<00>rB)r4s"r5r6r6Rs<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>historyryN) r<00>argsr{rBrr<00>min<69>maxrrErA)rur<>r<><00>postsr<73>s& r5<00>api_user_historyr<79>Qs<><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>qrmru<00>r<>r<>r<>r<>z'user_id' is required.rpz'q' is required.)ru<00>
query_textr<EFBFBD>r<><00>resultsryN) rr<>r{r|rBrErrr<>r<>rrA)r<>rur<>r<><00>rowsr<73>s r5<00>api_rag_searchr<68>]s<><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>TFrirpNry)rrzrrr<>rErAr<00>r<>r<>s r5<00>api_create_userr<72>rsq<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~s<00><00><19><19>#<23>r7c<00>V<00>\V4pV'g \RR4#\V4#)r<>r<>)rrEr)rurxs& r5<00> api_get_userr<72>}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<>)rrzrrr<>rErArr<>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\ WW#R7p\ RVRVR\ \^V4^d4/4# \d p\\T4R4uR p?#R p?ii;i)
r<EFBFBD>r<>r<>r<>rur<>)r<>r<>r<>rur<>ryN) rr<>r{rBrrr<>r<>rrErA)r<>r<>r<>rur<>r<>s r5<00>api_list_postsr<73><00>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><18><1C><1C>!<21>!<21>,<2C>/<2F>J<EFBFBD><15>l<EFBFBD>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>G<EFBFBD>#<23><1F>T<EFBFBD>:<3A>_<><04><16><07><14>v<EFBFBD>t<EFBFBD>W<EFBFBD>c<EFBFBD>#<23>a<EFBFBD><15>-<2D>QT<51>>U<>V<>W<>W<><57> <14>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><>#<23>s<00>1C<00> C.<03>C)<03>#C.<03>)C.z/posts/<int:post_id>c<00>$<00>V^8<>dQhR\/#<00>r2r<>r<>)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>r<><00>rows& r5<00> api_get_postr<74><00>s'<00><00>
2026-02-14 22:57:24 -07:00
<1E>w<EFBFBD>
2026-02-15 00:07:07 -07:00
'<27>C<EFBFBD> <0E><15>'<27><13>-<2D>-<2D> <12>3<EFBFBD><<3C>r7c<00>$<00>V^8<>dQhR\/#r<>r<>)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)TFrir<>r<>ryN)rrzrrErrrA)r<>r<>r<>r<>s& r5<00>api_patch_postr<74><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<>r<>)r4s"r5r6r6<00>s<00><00><1B><1B>S<EFBFBD>r7c<00>V<00>\V4pV'g \RR4#\V4#r<>)rrEr)r<><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\/#r<>r<>)r4s"r5r6r6<00>s<00><00>#<23>#<23><03>#r7c<04>R<00>\V4pV'g \RR4#VPR4pVPR4p\PPR\
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<EFBFBD>r<>r<>rur<><00>
expires_in<EFBFBD>r<>i<>Qr<>z,Not authorized to access this private audio.i<>)r<>rNry) rrEr{rr<>rBr<>r<>rrr<>rAr)r<>r<>r<><00>owner_id<69> requester_idr<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\/#r<>r<>)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<>)rrzrr r<>rErAr<00>r<>r<>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\/#r<>r<>)r4s"r5r6r6<00>s<00><00>#<23>#<23>C<EFBFBD>#r7c<00><><00>\R\V4/4# \d p\\ T4R4uRp?#Rp?ii;i)r<>ryN)rrrrErA)r<>r<>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\/#r<>r<>)r4s"r5r6r6<00>s<00><00> #<23> #<23>c<EFBFBD> #r7c<00> <00>\P!RRR7;'g/pVPR4pVf \RR4#\ \ W44# \ d p\\T4R4uRp?#Rp?ii;i)TFri<00>metadataNz'metadata' is required.rpry)rrzr{rErr rrA)r<>r<>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\/#r<>r<>)r4s"r5r6r6<00>s<00><00><18><18>c<EFBFBD>r7c<00>V<00>\V4pV'g \RR4#\V4#)zMetadata not found.r<>)rrErr<>s& r5<00>api_get_metadatar<00>s'<00><00>
2026-02-14 22:57:24 -07:00
<1E>w<EFBFBD>
2026-02-15 00:07:07 -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\/#r<>r<>)r4s"r5r6r6<00>s<00><00>#<23>#<23>C<EFBFBD>#r7c<00><><00>\P!RRR7;'g/p\\W44# \d p\ \ T4R4uRp?#Rp?ii;i)TFriryN)rrzrr!rrErAr s& r5<00>api_put_rightsr<00>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<>)r4s"r5r6r6s<00><00><18><18>C<EFBFBD>r7c<00>V<00>\V4pV'g \RR4#\V4#)zRights not found.r<>)rrErr<>s& r5<00>api_get_rightsrs'<00><00>
2026-02-14 22:57:24 -07:00
<1C>W<EFBFBD>
2026-02-15 00:07:07 -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\/#r<>r<>)r4s"r5r6r6s<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) TFri<00>chunksz'chunks' must be a list.rp<00>insertedryN) rrzr{<00>
isinstance<EFBFBD>listrErrr<>rrA)r<>r<>r!r<>r<>s& r5<00>api_add_chunksr%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\/#r<>r<>)r4s"r5r6r6<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<>ryN) rr<>r{rBrrrrErA<00>r<>r<>r<>r<>s& r5<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<>)rrzrr r<>rErArr<>s r5<00>api_create_auditr-)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:07:07 -07:00
r<EFBFBD>r<>rur<>r<>r<><00>logs)r<>rur<>r<>ryN<> rr<>r{rBrrrrErA)r<>rur<>r<>r<>s r5<00>api_list_auditr14s<><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<>)r4s"r5r6r6Br'r7c <00>&<00>\PPR^\R7p\PPR^d\R7p\ R\ WVR7/4# \ d p\\T4R4uRp?#Rp?ii;i)r<>r<>r<>r/)r<>r<>r<>ryNr0r)s& r5<00>api_post_auditr4Asv<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>/audioc<00>$<00>V^8<>dQhR\/#r<>r<>)r4s"r5r6r6Ls<00><00><<3C><<3C>s<EFBFBD><r7c<04>l<00>\PPRR\R7p\ WR7p\ V4# \ d p\\T4R4uRp?#Rp?i\d p\\T4R4uRp?#Rp?i\dp\RT 2R4uRp?#Rp?ii;i) z/
Get a signed URL for the original audio file.
rrr<>)rr<>NryzFailed to get audio URL: ) rr<>r{rBrrr<>rErA<00> RuntimeErrorr)r<>r<00>
audio_datar<EFBFBD>s& r5<00>api_get_audio_urlr9Ks<><00><00>
<19><1C><1C>!<21>!<21>,<2C><04>3<EFBFBD>!<21>G<>J<EFBFBD><<3C>+<2B>G<EFBFBD>K<>
<EFBFBD><16>z<EFBFBD>"<22>"<22><> <15>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><> <17>#<23><15>c<EFBFBD>!<21>f<EFBFBD>c<EFBFBD>"<22>"<22><> <14><<3C><15>1<>!<21><13>5<>s<EFBFBD>;<3B>;<3B><><<3C>sK<00>?<00> B3<03>
A$<03>B3<03>$ B3<03>1B3<03>2B <03>B3<03> B3<03>B3<03>B.<03>(B3<03>.B3c<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)rp)[r;<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:07:07 -07:00
db_queriesr r rrrrrrrrrrrrrrrrrrr r!<00>__name__r"<00>getenvr<76><00>mkdirrMr(r*r,r<>r;r=rErNr\rar{rg<00>postr<74>r<>r<>r<>r<>r<>r<>r<>r<>r<><00>patchr<68>rr
rr<00>putrrrrr%r*r-r1r4r9r6)r;s@r5<00><module>rTs <00><><01><04>
<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:07:07 -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><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>
2026-02-14 22:57:24 -07:00
#<23><13>
2026-02-15 00:07:07 -07:00
#<23><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:07:07 -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> %<25>&<26><<3C>'<27><r7