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

166 lines
36 KiB
Plaintext
Raw Normal View History

2026-02-14 21:46:48 -07:00
<EFBFBD>
2026-02-15 01:21:05 -07:00
,<2C><>i<EFBFBD>R<00><00>* <00>UdZddlZddlZddlZddlZddlZddlmZddlm Z m
2026-02-14 21:46:48 -07:00
Z
2026-02-15 01:21:05 -07:00
ddl m Z ddl mZddlmZmZmZddlmZmZdd lmZdd
lmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/e <0C><00>ed e0d <0C> <0A><00>Z1eej2dd<0F><00><00><00>Z3e3<65>4dd<10><11><00>hd<12>Z5ej2dd<14><00>Z6ej2dd<16><00>Z7ej2dd<18><00>Z8ej2dej2dd<1B><00><00><00>Z9da:edze;d<defd<1E>Z<d]d e=d!e>fd"<22>Z?d#e=de@fd$<24>ZAd%ede=fd&<26>ZBd'e=d(e=de=fd)<29>ZCd*eDe=e fdeDe=e ffd+<2B>ZEd^d-e=d.e>de
eFfd/<2F>ZGe1<65>Hd0<64><00>d1<64><00><00>ZIe1<65>Jd2<64><00>d3<64><00><00>ZKe1<65>Jd4<64><00>d5<64><00><00>ZLe1<65>Jd6<64><00>d7<64><00><00>ZMe1<65>Hd8<64><00>d9e>fd:<3A><04><00>ZNe1<65>Hd;<3B><00>d<<3C><00><00>ZOe1<65>Jd=<3D><00>d><3E><00><00>ZPe1<65>Hd?<3F><00>d9e>fd@<40><04><00>ZQe1<65>JdA<64><00>dB<64><00><00>ZRe1<65>HdA<64><00>dC<64><00><00>ZSe1<65>HdD<64><00>dEe>fdF<64><04><00>ZTe1<65>UdD<64><00>dEe>fdG<64><04><00>ZVe1<65>HdH<64><00>dEe>fdI<64><04><00>ZWe1<65>HdJ<64><00>dEe>fdK<64><04><00>ZXe1<65>JdL<64><00>dEe>fdM<64><04><00>ZYe1<65>HdL<64><00>dEe>fdN<64><04><00>ZZe1<65>[dO<64><00>dEe>fdP<64><04><00>Z\e1<65>HdO<64><00>dEe>fdQ<64><04><00>Z]e1<65>[dR<64><00>dEe>fdS<64><04><00>Z^e1<65>HdR<64><00>dEe>fdT<64><04><00>Z_e1<65>JdU<64><00>dEe>fdV<64><04><00>Z`e1<65>HdU<64><00>dEe>fdW<64><04><00>Zae1<65>JdX<64><00>dY<64><00><00>Zbe1<65>HdX<64><00>dZ<64><00><00>Zce1<65>Hd[<5B><00>dEe>fd\<5C><04><00>ZddS)_z}
2026-02-14 21:46:48 -07:00
Flask API routes aligned with TitanForge/schema.sql.
2026-02-14 22:04:39 -07:00
Includes auth, upload+transcription, history, and RAG search workflow.
2026-02-15 01:21:05 -07:00
<EFBFBD>N)<01>Path)<02>Any<6E>List)<01> load_dotenv)<01> WhisperModel)<03> Blueprint<6E>jsonify<66>request)<02>check_password_hash<73>generate_password_hash)<01>secure_filename)<17>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>search_rag_chunks_vector<6F>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> <00>m4a<34>mkv<6B>mov<6F>mp3<70>mp4<70>ogg<67>wav<61>flac<61>webm<62> WHISPER_MODEL<45>base<73>WHISPER_DEVICE<43>cpu<70>WHISPER_COMPUTE_TYPE<50>int8<74>SUPABASE_BUCKET<45>SUPABASE_ARCHIVE_BUCKET<45>archives<65>_whisper_model<65>returnc<00>`<00>t<00>!tttt<00><01><00>atS)N)<02>device<63> compute_type)r=rr4r6r8<00><00><00>VC:\Users\Gk230\OneDrive\Desktop\My_DOCS\Calgary_Hacks\TitanForge\backend\api_routes.py<70>_modelrE>s-<00><00><15><1D>%<25> <19>!<21>-<2D>
2026-02-14 22:04:39 -07:00
<EFBFBD>
<EFBFBD>
<EFBFBD><0E>
2026-02-15 01:21:05 -07:00
<1A>rC<00><><00>message<67>statusc<00>(<00>td|i<01><00>|fS)N<>error)r )rGrHs rD<00>_errorrKIs<00><00> <12>G<EFBFBD>W<EFBFBD>%<25> &<26> &<26><06> .<2E>.rC<00>filenamec<00>x<00>d|vrdS|<00>dd<03><00>d<00><00><00>tvS)N<>.F<>)<03>rsplit<69>lower<65>ALLOWED_MEDIA_EXTENSIONS)rLs rD<00> _allowed_filerSMs=<00><00>
<EFBFBD>(<28><1A><1A><14>u<EFBFBD> <13>?<3F>?<3F>3<EFBFBD><01> "<22> "<22>1<EFBFBD> %<25> +<2B> +<2B> -<2D> -<2D>1I<31> I<>IrC<00>pathc<00>
<00>tj<00><00>}|<00>d<01><00>5} |<02>d<03><00>}|sn|<01>|<03><00><00>. ddd<00><00>n #1swxYwY|<01><00><00>S)N<>rbTi)<06>hashlib<69>sha256<35>open<65>read<61>update<74> hexdigest)rT<00>h<>f<>chunks rD<00>_sha256r`Ss<><00><00><0F><0E><18><18>A<EFBFBD> <0A><19><19>4<EFBFBD><1F><1F><1C>A<EFBFBD> <1C><15>F<EFBFBD>F<EFBFBD>;<3B>'<27>'<27>E<EFBFBD><18> <16><15> <0A>H<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>  <1C><16> <1C><1C><1C><1C><1C><1C><1C><1C><1C><1C><1C><><EFBFBD><EFBFBD><1C><1C><1C><1C> <0A>;<3B>;<3B>=<3D>=<3D>s<00>0A&<03>&A*<07>-A*<07>transcript_text<78>titlec<00><00>d|<01>d|<00>d<03>S)NzaYou are an archive assistant. Use the following transcribed audio as source context. Post title: z.
2026-02-14 22:04:39 -07:00
Transcript:
z4
2026-02-15 01:21:05 -07:00
Answer user questions grounded in this transcript.rB)rarbs rD<00> _build_promptrd^s-<00><00> =<3D><1C> =<3D> =<3D> <1B> =<3D> =<3D> =<3D>rC<00>postc<00><><00>|<00>d<01><00>dkr+ t|dd<04><05><00>}|d|d<n#YnxYw|S)z%Add signed audio URL to post if readyrH<00>ready<64>post_id<69>)<01>
expires_in<EFBFBD>
signed_url<EFBFBD> audio_url)<02>getr)re<00>
audio_datas rD<00>_add_audio_urlrofsY<00><00> <0B>x<EFBFBD>x<EFBFBD><08><19><19>W<EFBFBD>$<24>$<24> <11>/<2F><04>Y<EFBFBD><0F>D<EFBFBD>Q<>Q<>Q<>J<EFBFBD> *<2A><<3C> 8<>D<EFBFBD><1B> <1D> <1D><> <11> <10>D<EFBFBD><44><EFBFBD><EFBFBD> <0F>Ks <00>"><00>A<03><00>text<78>
dimensionsc<00><00> <09>dg|z}tjd|<00><00><00><00><00>}|s|S|D]<5D>}tj|<04>d<03><00><00><00><00><00><00>}t<00>|dd<05>d<06><00>|z}|ddzdkrd nd
}d |d d z d zz}||xx||zz cc<<00><>td<0E>|D<00><00><00><00>dz<00> <09> dkr<0E> fd<10>|D<00><00>}|S)zs
Free deterministic embedding fallback (offline).
Replace with model-based embeddings later if needed.
gz [A-Za-z0-9']+<2B>utf-8N<38><00>bigrOrg<00>?g<00><><EFBFBD>g<00>o@g<00>?c3<00> K<00>|] }||zV<00><00>
dS)NrB<00><02>.0<EFBFBD>vs rD<00> <genexpr>z#_local_embedding.<locals>.<genexpr><3E>s&<00><00><00><00>%<25>%<25><11>q<EFBFBD>1<EFBFBD>u<EFBFBD>%<25>%<25>%<25>%<25>%<25>%rCg<00>?c<00><00><01>g|]}|<01>z <00><02>SrBrB)rzr{<00>norms <20>rD<00>
<listcomp>z$_local_embedding.<locals>.<listcomp><3E>s<00><><00>+<2B>+<2B>+<2B>q<EFBFBD>!<21>d<EFBFBD>(<28>+<2B>+<2B>+rC)
<EFBFBD>re<72>findallrQrWrX<00>encode<64>digest<73>int<6E>
from_bytes<EFBFBD>sum)
rqrr<00>vector<6F>tokens<6E>tokenr<6E><00>idx<64>sign<67>weightr~s
@rD<00>_local_embeddingr<67>qs%<00><><00>
<12>U<EFBFBD>Z<EFBFBD> <1F>F<EFBFBD> <0F>Z<EFBFBD>(<28>$<24>*<2A>*<2A>,<2C>,<2C> 7<> 7<>F<EFBFBD> <11><16><15> <0A><17>%<25>%<25><05><18><1E><05> <0C> <0C>W<EFBFBD> 5<> 5<>6<>6<>=<3D>=<3D>?<3F>?<3F><06><11>n<EFBFBD>n<EFBFBD>V<EFBFBD>B<EFBFBD>Q<EFBFBD>B<EFBFBD>Z<EFBFBD><15>/<2F>/<2F>*<2A><<3C><03><1D>a<EFBFBD>y<EFBFBD>1<EFBFBD>}<7D><11>*<2A>*<2A>s<EFBFBD>s<EFBFBD><04><04><14><06>q<EFBFBD> <09>E<EFBFBD>)<29>T<EFBFBD>1<>1<><06><0E>s<EFBFBD> <0B> <0B> <0B>t<EFBFBD>f<EFBFBD>}<7D>$<24> <0B> <0B> <0B> <0B> <0E>%<25>%<25>f<EFBFBD>%<25>%<25>%<25> %<25> %<25><13> ,<2C>D<EFBFBD> <0B>a<EFBFBD>x<EFBFBD>x<EFBFBD>+<2B>+<2B>+<2B>+<2B>F<EFBFBD>+<2B>+<2B>+<2B><06> <11>MrCz/healthc<00>H<00>tdtttd<02><04><00>S)N<>ok)rH<00> whisper_model<65>whisper_device<63>whisper_compute_type)r r4r6r8rBrCrD<00>healthr<68><00>s*<00><00> <12><16>&<26>(<28> 4<> <06><06> <07> <07>rCz/auth/registerc <00>&<00>tjdd<02><03><00>pi}|<00>d<04><00>pd<05><00><00><00><00><00>}|<00>d<06><00>pd}|r|st dd<08><00>St |<01><00>}|rt d d
<EFBFBD><00>S t|t|<02><00>|<00>d <0B><00>|<00>d <0C><00>|<00>d <0A><00>d<0E><05><00>}t|ddtj d|i<01><00>d<11><03><00>td|d|d|<04>d <0B><00>d<13>i<01><00>dfS#t$r'}t t|<05><00>d<15><00>cYd}~Sd}~wwxYw)NTF<54><02>force<63>silent<6E>email<69><00>password<72>$'email' and 'password' are required.rFz#User already exists for this email.i<><00> display_name<6D>
avatar_url<EFBFBD>bio)r<><00> password_hashr<68>r<>r<><00>user_idz user.register<65>r<><00>action<6F>details<6C>user)r<>r<>r<><00><><00><>)r
<00>get_jsonrm<00>striprQrKrrr r<00>json<6F>dumpsr <00> Exception<6F>str)<06>payloadr<64>r<><00>existingr<67><00>es rD<00> api_registerr<72><00>s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD> <14>[<5B>[<5B><17> !<21> !<21> '<27>R<EFBFBD> .<2E> .<2E> 0<> 0<> 6<> 6<> 8<> 8<>E<EFBFBD><16>{<7B>{<7B>:<3A>&<26>&<26>,<2C>"<22>H<EFBFBD> <10>C<01><08>C<01><15><<3C>c<EFBFBD>B<>B<>B<> <20><15>'<27>'<27>H<EFBFBD><0F>B<01><15>;<3B>S<EFBFBD>A<>A<>A<>#<23><1A><1E>!7<><08>!A<>!A<> '<27> <0B> <0B>N<EFBFBD> ;<3B> ;<3B>%<25>k<EFBFBD>k<EFBFBD>,<2C>7<>7<><1E>{<7B>{<7B>5<EFBFBD>)<29>)<29>  <0E> <0E>
2026-02-14 22:04:39 -07:00
<EFBFBD>
<EFBFBD><04> <16>$<24>y<EFBFBD>/<2F>_<EFBFBD>Y]<5D>Yc<59>el<65>ns<6E>dt<64>Yu<59>Yu<59>v<>v<>w<>w<>w<><16> <12><1F> <09>?<3F><1D>g<EFBFBD><1D> $<24><08><08><1E> 8<> 8<><0E><0E>
<EFBFBD> <0B> <0B> <10> <10> <10><> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>!B=E<00>
F<03>)F <03>F<03> Fz /auth/loginc
<00><><00>tjdd<02><03><00>pi}|<00>d<04><00>pd<05><00><00><00><00><00>}|<00>d<06><00>pd}|r|st dd<08><00>St |<01><00>}|st d d
<EFBFBD><00>St|d |<02><00>st d d
<EFBFBD><00>St|d d tj
2026-02-15 01:21:05 -07:00
d|i<01><00>d<0E><03><00>td|d |d|<03>d<10><00>|<03>d<11><00>|<03>d<12><00>d<13>i<01><00>S)NTFr<46>r<>r<>r<>r<>rFzInvalid credentials.i<>r<>r<>z
user.loginr<6E>r<>r<>r<>r<>)r<>r<>r<>r<>r<>) r
r<>rmr<>rQrKrr rr<>r<>r )r<>r<>r<>r<>s rD<00> api_loginr<6E><00>s\<00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD> <14>[<5B>[<5B><17> !<21> !<21> '<27>R<EFBFBD> .<2E> .<2E> 0<> 0<> 6<> 6<> 8<> 8<>E<EFBFBD><16>{<7B>{<7B>:<3A>&<26>&<26>,<2C>"<22>H<EFBFBD> <10>C<01><08>C<01><15><<3C>c<EFBFBD>B<>B<>B<> <1C>U<EFBFBD> #<23> #<23>D<EFBFBD> <0F>3<><15>,<2C>c<EFBFBD>2<>2<>2<> <1E>t<EFBFBD>O<EFBFBD>4<>h<EFBFBD> ?<3F> ?<3F>3<><15>,<2C>c<EFBFBD>2<>2<>2<><11>d<EFBFBD>9<EFBFBD>o<EFBFBD><1C>RV<52>R\<5C>^e<>gl<67>]m<>Rn<52>Rn<52>o<>o<>p<>p<>p<> <12> <12><1F> <09>?<3F><1D>g<EFBFBD><1D> $<24><08><08><1E> 8<> 8<>"<22>h<EFBFBD>h<EFBFBD>|<7C>4<>4<><1B>x<EFBFBD>x<EFBFBD><05><EFBFBD><EFBFBD> <0E><0E>
2026-02-14 22:04:39 -07:00
<EFBFBD>
<06>
<06>
2026-02-15 01:21:05 -07:00
rCz /posts/uploadc <00><> <00>dtjvrtdd<03><00>Stjd}|jstdd<03><00>St |j<00><00>stdd<03><00>Stj<00>d<06><00>}tj<00>d<07><00>pd<08><00><00>}tj<00>d <09><00>}tj<00>d
2026-02-14 22:04:39 -07:00
<EFBFBD><00>pd <0B><00><00><00><00><00>}tj<00>d <0C><00>pd <0A><00><00><00><00><00>}|dvrtdd<03><00>S t|<01><00>}n'#ttf$rtdd<03><00>cYSwxYwt|<06><00>}|stdd<12><00>Sttj<00><00><00><00>}t!|j<00><00>} d|<06>d|<08><00>}
|<06>d|<08>d| <09><00>} t"|<08>d| <09><00>z } |<00>| <0C><00>d} t'||||d||
2026-02-15 01:21:05 -07:00
d<18><07><00>} t| d<00><00>}t)| <0C><00>}| <0C>d<1A><00>5}t-t.| |<10><00><00>|jpdd<1C><1D><00>ddd<00><00>n #1swxYwYt5|dt.<00>d| <0B><00>|j| <0C><00><00>j|d<1F><05><00>t;<00><00><00>t| <0C><00><00><00>\}}g}g}|D]<5D>}|j<00><00><00>}|s<01>|<14> |<16><00>|<13> tC|j"<00><00>tC|j#<00><00>||j$<00>tC|j$<00><00>ndtK|<16><00>d <20><05><00><00><>d!<21>&|<14><00><00><00><00>}tO||<02><00>}|rtQ||<13><00>tS|tUj+|tY|<17><00>| |d"<22><04><00><00><00>t5|d#|
<EFBFBD>d$<24>d%tY|<17>-d&<26><00><00><00>t]j/|<17>-d&<26><00><00><00><00>0<00><00>d<1F><05><00>tc|d'd(i<01><00>te||d)tUj+||
d*<2A><02><00>d+<2B><04><00>tg||d(t.<00>d| <0B><00>||tY|<13><00>d,<2C><07><00>d-fS#th$r<>}| r<>| <0A>d<19><00>rmtct| d<00><00>d'd.i<01><00>tet| d<00><00>|d/tUj+d0t|<19><00>i<01><00>d+<2B><04><00>td1|<19><00>d2<64><00>cYd}~Sd}~wwxYw)3N<33>filezMissing 'file' in form-data.rFzFilename is empty.zUnsupported media extension.r<>rbzUntitled recording<6E> description<6F>
visibility<EFBFBD>private<74>language<67>en><00>publicr<63>z+'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>_<>
2026-02-15 01:21:05 -07:00
processing)r<>rbr<>r<>rHr<><00>storage_prefixrhrVzapplication/octet-streamF)<05>bucket<65> object_path<74>content<6E> content_type<70>upsert<72>original_audio)<05>rolerTr<><00>
size_bytesrX)<05> start_sec<65>end_secrq<00>
confidence<EFBFBD> embedding<6E> )<04>prompt<70>transcript_length_chars<72> source_filer<65><00>transcript_txtz/transcript.txtz
text/plainrtrHrgzpost.upload.transcribed)r<>r<>)rhr<>r<>r<>)rhr<>rH<00>
audio_pathrar<><00>rag_chunk_countr<74><00>failedzpost.upload.failedrJzUpload/transcription failed: r<>)5r
<00>filesrKrLrS<00>formrmr<>rQr<><00> TypeError<6F>
ValueErrorrr<><00>uuid<69>uuid4r <00>
UPLOAD_DIR<EFBFBD>saverr`rYr"<00>ARCHIVE_BUCKETrZ<00>mimetyper<00>stat<61>st_sizerE<00>
transcriberq<00>append<6E>float<61>start<72>end<6E> avg_logprobr<62><00>joinrdrr#r<>r<><00>lenr<6E>rWrXr\r!rr r<>)<1A>media<69> user_id_rawrbr<>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_textra<00> prompt_textr<74>s rD<00>api_upload_postr<74><00>s<><00><00> <0A>W<EFBFBD>]<5D>"<22>"<22><15>4<>c<EFBFBD>:<3A>:<3A>:<3A> <13>M<EFBFBD>&<26> !<21>E<EFBFBD> <10>><3E>1<><15>*<2A>C<EFBFBD>0<>0<>0<> <18><15><1E> (<28> (<28>;<3B><15>4<>c<EFBFBD>:<3A>:<3A>:<3A><19>,<2C>"<22>"<22>9<EFBFBD>-<2D>-<2D>K<EFBFBD> <14>\<5C> <1D> <1D>g<EFBFBD> &<26> &<26> ><3E>*><3E> E<> E<> G<> G<>E<EFBFBD><19>,<2C>"<22>"<22>=<3D>1<>1<>K<EFBFBD><19>,<2C>"<22>"<22><<3C>0<>0<>=<3D>I<EFBFBD>D<>D<>F<>F<>L<>L<>N<>N<>J<EFBFBD><17> <0C> <20> <20><1A>,<2C>,<2C>4<><04>;<3B>;<3B>=<3D>=<3D>C<>C<>E<>E<>H<EFBFBD><11>.<2E>.<2E>.<2E><15>C<>S<EFBFBD>I<>I<>I<>L<01><15>k<EFBFBD>"<22>"<22><07><07><> <15>z<EFBFBD> "<22>L<01>L<01>L<01><15>E<>s<EFBFBD>K<>K<>K<>K<>K<>L<01><><EFBFBD><EFBFBD> <1A>'<27> "<22> "<22>D<EFBFBD> <0F>.<2E><15>'<27><13>-<2D>-<2D>-<2D><13>D<EFBFBD>J<EFBFBD>L<EFBFBD>L<EFBFBD>!<21>!<21>I<EFBFBD><1F><05><0E>/<2F>/<2F>I<EFBFBD>5<><07>5<>5<>)<29>5<>5<>N<EFBFBD>$<24>G<>G<>y<EFBFBD>G<>G<>I<EFBFBD>G<>G<><17><1B><19>8<>8<>Y<EFBFBD>8<>8<>8<>J<EFBFBD> <09>J<EFBFBD>J<EFBFBD>z<EFBFBD><1A><1A><1A><17>L<EFBFBD>r@<01>(<28>"<22><1E>*<2A>(<28>&<26>$<24>"0<> <0E> <0E>
2026-02-14 22:04:39 -07:00

<EFBFBD>

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

<EFBFBD>

<EFBFBD> <0F>
<0F>
2026-02-15 01:21:05 -07:00
<0F><> <15> @<01> @<01> @<01> <17> <0E>L<EFBFBD>,<2C>,<2C>Y<EFBFBD>7<>7<> <0E> <1D>c<EFBFBD>,<2C>y<EFBFBD>"9<>:<3A>:<3A>X<EFBFBD>x<EFBFBD><P<> Q<> Q<> Q<> <19>"<22><<3C> <09>#:<3A>;<3B>;<3B>&<26>2<>#<23>z<EFBFBD>7<EFBFBD>C<EFBFBD><01>F<EFBFBD>F<EFBFBD>*;<3B><<3C><<3C> <12><12> <0E> <0E> <0E><16>9<>a<EFBFBD>9<>9<>3<EFBFBD>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F><><EFBFBD><EFBFBD><EFBFBD> @<01><><EFBFBD>sW<00><F <00> !F0<03>/F0<03>AU<00>3K<03> U<00>K<07>U<00>K<07>I(U<00>
W,<03> BW'<03>!W,<03>'W,z/users/<int:user_id>/historyr<79>c
2026-02-14 22:04:39 -07:00
<00><><00>tj<00>ddt<00><03><00>}tj<00>ddt<00><03><00>} t |||<02><06><00>}t ||t td|<02><00>d<07><00>d<08><03><00>S#t$r'}tt|<04><00>d <09><00>cYd}~Sd}~wwxYw)
2026-02-15 01:21:05 -07:00
N<EFBFBD>pagerO<00><02>default<6C>type<70>limit<69><00>r<>r<><00>d)<03>historyr<79>r<>r<>) r
<00>argsrmr<>rr <00>min<69>maxr<78>rKr<>)r<>r<>r<><00>postsr<73>s rD<00>api_user_historyrus<><00><00> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>b<EFBFBD>s<EFBFBD> <1C> ;<3B> ;<3B>E<EFBFBD>#<23>!<21>'<27><04>E<EFBFBD>B<>B<>B<><05><16>5<EFBFBD>$<24><13>S<EFBFBD><11>E<EFBFBD>]<5D>]<5D>TW<54>AX<41>AX<41>Y<>Y<>Z<>Z<>Z<><5A> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>AB<00>
C<03>B=<03>7C<03>=Cz /rag/searchc <00><00>tj<00>d<01><00>pd<02><00><00>}tj<00>dt<00><04><00>}tj<00>d<05><00>}tj<00>ddt<00><08><00>}tj<00>d d
t<00><08><00>}|st d d <0C><00>S |r<> t j|<02><00>}t|t<00><00>st d d <0C><00>Sd<0E>|D<00><00>}n #t$rt dd <0C><00>cYSwxYwt|||<04><10><00>}t|dttd|<04><00>d<12><00>d<13><03><00>S|st dd <0C><00>St||||<04><15><00>}t|d|ttd|<04><00>d<12><00>d<17><04><00>S#t$r'}t t!|<08><00>d<18><00>cYd}~Sd}~wwxYw)N<>qr<71>r<><00>r<><00>query_embeddingr<67>rOr<>r<><00>z'user_id' is required.rFz''query_embedding' must be a JSON array.c<00>,<00>g|]}t|<01><00><00><02>SrB)r<>rys rDrz"api_rag_search.<locals>.<listcomp><3E>s<00><00>"<<3C>"<<3C>"<<3C><01>5<EFBFBD><11>8<EFBFBD>8<EFBFBD>"<<3C>"<<3C>"<rCz1Invalid 'query_embedding'. Example: [0.1,0.2,...])r<>r r<>r<>r)<03>results<74>moder<65>z7'q' is required when 'query_embedding' is not provided.)r<><00>
query_textr<EFBFBD>r<>rq)rrr<>r<>r<>)r
rrmr<>r<>rKr<><00>loads<64>
isinstance<EFBFBD>listr<74>r r rrrr<>) rr<><00>query_embedding_rawr<77>r<><00>parsedr <00>rowsr<73>s rD<00>api_rag_searchr<00>s+<00><00><19>,<2C>"<22>"<22>3<EFBFBD>'<27>'<27>-<2D>2<EFBFBD>4<>4<>6<>6<>J<EFBFBD><15>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>3<>G<EFBFBD>!<21>,<2C>*<2A>*<2A>+<<3C>=<3D>=<3D><17> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>b<EFBFBD>s<EFBFBD> <1C> ;<3B> ;<3B>E<EFBFBD> <12>5<><15>.<2E><03>4<>4<>4<>#<23> <1E>
b<01> X<01><1D><1A>$7<>8<>8<><06>!<21>&<26>$<24>/<2F>/<2F>R<01>!<21>"K<>S<EFBFBD>Q<>Q<>Q<>"<<3C>"<<3C>V<EFBFBD>"<<3C>"<<3C>"<<3C><0F><0F><><1C> X<01> X<01> X<01><1D>Q<>SV<53>W<>W<>W<>W<>W<> X<01><><EFBFBD><EFBFBD>,<2C>G<EFBFBD>_<EFBFBD>di<64>j<>j<>j<>D<EFBFBD><1A>t<EFBFBD>X<EFBFBD><03>C<EFBFBD>PQ<50>SX<53>M<EFBFBD>M<EFBFBD>[^<5E>H_<48>H_<48>`<60>`<60>a<>a<> a<><19> Z<01><19>S<>UX<55>Y<>Y<> Y<> <20><17>Z<EFBFBD>d<EFBFBD>Z_<5A>`<60>`<60>`<60><04><16>4<EFBFBD><16><14>PS<50>TW<54>XY<58>[`<60>Ta<54>Ta<54>cf<63>Pg<50>Pg<50>h<>h<>i<>i<>i<><69> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>sV<00>G<00>8D#<00> D#<00>"G<00>#E<03>=G<00>?E<03>AG<00>G<00>AG<00>
H
<03>#H<03>?H
<03>H
z/usersc<00>6<00>tjdd<02><03><00>pi} tt|<00><00><00><00>dfS#t$r'}t t |<01><00>d<05><00>cYd}~Sd}~wt$r'}t t |<01><00>d<06><00>cYd}~Sd}~wwxYw<01>NTFr<46>r<>rFr<>)r
r<>r rr<>rKr<>r<><00>r<>r<>s rD<00>api_create_userr<00>s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>{<7B>7<EFBFBD>+<2B>+<2B>,<2C>,<2C>c<EFBFBD>1<>1<><31> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD><EFBFBD>-<00>8<00>
B<03>A$<03>B<03>$ B<03>1B<03> B<03>Bz/users/<int:user_id>c<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>S)Nr<4E>r<>)rrKr )r<>r<>s rD<00> api_get_userr<00>s4<00><00> <19>'<27> "<22> "<22>D<EFBFBD> <0F>.<2E><15>'<27><13>-<2D>-<2D>-<2D> <12>4<EFBFBD>=<3D>=<3D>rCz/postsc<00>6<00>tjdd<02><03><00>pi} tt|<00><00><00><00>dfS#t$r'}t t |<01><00>d<05><00>cYd}~Sd}~wt$r'}t t |<01><00>d<06><00>cYd}~Sd}~wwxYwr)r
r<>r rr<>rKr<>r<>rs rD<00>api_create_postr!<00>s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>(<28><17>1<>1<>2<>2<>C<EFBFBD>7<>7<><37> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>rc
<00>h<00><05>tj<00>ddt<00><03><00>}tj<00>ddt<00><03><00>}tj<00>d<06><00>}tj<00>dt<00><08><00><00> t |||<02> <09><00>}<03>r<0F>fd
<EFBFBD>|D<00><00>}n d <0B>|D<00><00>}d <0C>|D<00><00>}t ||t td|<01><00>d <0A><00>d<0E><03><00>S#t$r'}tt|<04><00>d<0F><00>cYd}~Sd}~wwxYw)Nr<4E>rOr<>r<>rr<><00>current_user_idr )r<>r<>r<>c<00>x<00><01>g|]6}|<01>d<00><00>dks|<01>d<02><00><00>k<00>4|<01><02>7S)r<>r<>r<><00>rm)rz<00>pr#s <20>rDrz"api_list_posts.<locals>.<listcomp><3E>sG<00><><00>n<>n<>n<>!<21>q<EFBFBD>u<EFBFBD>u<EFBFBD>\<5C>':<3A>':<3A>h<EFBFBD>'F<>'F<>!<21>%<25>%<25>PY<50>JZ<4A>JZ<4A>^m<>Jm<4A>Jm<4A>A<EFBFBD>Jm<4A>Jm<4A>JmrCc<00>D<00>g|]}|<01>d<00><00>dk<00>|<01><02>S)r<>r<>r%)rzr&s rDrz"api_list_posts.<locals>.<listcomp><3E>s.<00><00>G<>G<>G<>!<21>q<EFBFBD>u<EFBFBD>u<EFBFBD>\<5C>':<3A>':<3A>h<EFBFBD>'F<>'F<>A<EFBFBD>'F<>'F<>'FrCc<00>,<00>g|]}t|<01><00><00><02>SrB)ro)rzres rDrz"api_list_posts.<locals>.<listcomp><3E>s <00><00>6<>6<>6<><14><0E>t<EFBFBD>$<24>$<24>6<>6<>6rCr)rr<>r<>r<>) r
rrmr<>rr rrr<>rKr<>)r<>r<>r<>rr<>r#s @rD<00>api_list_postsr)<00>sA<00><><00> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>b<EFBFBD>s<EFBFBD> <1C> ;<3B> ;<3B>E<EFBFBD><18><1C>!<21>!<21>,<2C>/<2F>/<2F>J<EFBFBD><1D>l<EFBFBD>&<26>&<26>'8<>s<EFBFBD>&<26>C<>C<>O<EFBFBD>#<23><1F>T<EFBFBD><15>:<3A>N<>N<>N<><04> <1B> H<01>n<>n<>n<>n<>t<EFBFBD>n<>n<>n<>D<EFBFBD>D<EFBFBD>G<>G<>t<EFBFBD>G<>G<>G<>D<EFBFBD>7<>6<><14>6<>6<>6<><04><16><14>t<EFBFBD>c<EFBFBD>#<23>a<EFBFBD><15>-<2D>-<2D>QT<51>>U<>>U<>V<>V<>W<>W<>W<><57> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>A)D<00>
D1<03>
D,<03>&D1<03>,D1z/posts/<int:post_id>rhc<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>S<00>N<>Post not found.r<>)rrKr <00>rh<00>rows rD<00> api_get_postr/<00>s4<00><00>
2026-02-14 21:46:48 -07:00
<1E>w<EFBFBD>
'<27>
2026-02-15 01:21:05 -07:00
'<27>C<EFBFBD> <0E>.<2E><15>'<27><13>-<2D>-<2D>-<2D> <12>3<EFBFBD><<3C><<3C>rCc<00><><00>tjdd<02><03><00>pi} t||<01><00>}|stdd<05><00>St |<02><00>S#t
$r'}tt |<03><00>d<06><00>cYd}~Sd}~wwxYw)NTFr<46>r,r<>r<>)r
r<>r!rKr r<>r<>)rhr<>r.r<>s rD<00>api_patch_postr1<00>s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><1F><07><17>1<>1<><03><12> 2<><19>+<2B>S<EFBFBD>1<>1<> 1<><16>s<EFBFBD>|<7C>|<7C><1B><> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s"<00>!A <00>A <00>
A<<03>A7<03>1A<<03>7A<z/posts/<int:post_id>/bundlec<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>Sr+)rrKr )rh<00>bundles rD<00>api_post_bundler4<00>s4<00><00> <1C>W<EFBFBD> %<25> %<25>F<EFBFBD> <11>.<2E><15>'<27><13>-<2D>-<2D>-<2D> <12>6<EFBFBD>?<3F>?<3F>rCz/posts/<int:post_id>/audio-urlc<00><><00>t|<00><00>}|stdd<02><00>S|<01>d<03><00>}|<01>d<04><00>}tj<00>dt
<00><05><00>}tj<00>ddt
<00><08><00>}t td |<05><00>d
<EFBFBD><00>}|d kr||krtd d <0A><00>S t||<05><0E><00>}t|<06><00>S#t$r'}tt|<07><00>d<02><00>cYd}~Sd}~wt$r'}tt|<07><00>d<10><00>cYd}~Sd}~wwxYw)z<>
Get signed URL for original audio/video so users can play it.
Private posts require owner user_id in query params.
2026-02-15 01:21:05 -07:00
r,r<>r<>r<>r rjrir<><00><i<>Qr<>z,Not authorized to access this private audio.i<>)rhrjNr<4E>) rrKrmr
rr<>rrrr r<>r<>r<>)rhr.r<><00>owner_id<69> requester_idrj<00>resultr<74>s rD<00>api_post_audio_urlr:<00>sc<00><00> <1F>w<EFBFBD>
'<27>
'<27>C<EFBFBD> <0E>.<2E><15>'<27><13>-<2D>-<2D>-<2D><14><17><17><1C>&<26>&<26>J<EFBFBD><12>w<EFBFBD>w<EFBFBD>y<EFBFBD>!<21>!<21>H<EFBFBD><1A><<3C>#<23>#<23>I<EFBFBD>C<EFBFBD>#<23>8<>8<>L<EFBFBD><18><1C>!<21>!<21>,<2C><04>3<EFBFBD>!<21>G<>G<>J<EFBFBD><14>S<EFBFBD><12>Z<EFBFBD>(<28>(<28>%<25>0<>0<>J<EFBFBD><11>Y<EFBFBD><1E><1E><<3C>8<EFBFBD>#;<3B>#;<3B><15>D<>c<EFBFBD>J<>J<>J<>#<23>'<27><07>J<EFBFBD>O<>O<>O<><06><16>v<EFBFBD><EFBFBD><EFBFBD><1E><> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s0<00>C4<00>4
2026-02-15 01:21:05 -07:00
E<03>>D <03>E<03> E<03>-E<03> E<03>Ez/posts/<int:post_id>/filesc<00>8<00>tjdd<02><03><00>pi} tt||<01><00><00><00>dfS#t$r'}t t |<02><00>d<05><00>cYd}~Sd}~wt$r'}t t |<02><00>d<06><00>cYd}~Sd}~wwxYwr)r
r<>r rr<>rKr<>r<><00>rhr<>r<>s rD<00> api_add_filer=s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>'<27><07><17>9<>9<>:<3A>:<3A>C<EFBFBD>?<3F>?<3F><> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s-<00>9<00>
B<03>A%<03>B<03>% B<03>2B<03>B<03>Bc<00><><00> tdt|<00><00>i<01><00>S#t$r'}tt |<01><00>d<02><00>cYd}~Sd}~wwxYw)Nr<4E>r<>)r rr<>rKr<>)rhr<>s rD<00>api_list_filesr?sg<00><00>#<23><16><07>!3<>G<EFBFBD>!<<3C>!<<3C>=<3D>><3E>><3E>><3E><> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00> <00>
A<03>A <03>A<03> Az/posts/<int:post_id>/metadatac<00>$<00>tjdd<02><03><00>pi}|<01>d<04><00>}|<02>tdd<06><00>S t t ||<02><00><00><00>S#t $r'}tt|<03><00>d<07><00>cYd}~Sd}~wwxYw)NTFr<46><00>metadataz'metadata' is required.rFr<>)r
r<>rmrKr r#r<>r<>)rhr<>rAr<>s rD<00>api_put_metadatarB's<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD><16>{<7B>{<7B>:<3A>&<26>&<26>H<EFBFBD><0F><17><15>/<2F><13>5<>5<>5<>#<23><16>.<2E>w<EFBFBD><08>A<>A<>B<>B<>B<><42> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>A<00>
2026-02-14 21:46:48 -07:00
B<03>(B
<03>B<03>
2026-02-15 01:21:05 -07:00
Bc<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>S)NzMetadata not found.r<>)rrKr r-s rD<00>api_get_metadatarD4s4<00><00>
2026-02-14 21:46:48 -07:00
<1E>w<EFBFBD>
'<27>
2026-02-15 01:21:05 -07:00
'<27>C<EFBFBD> <0E>2<><15>+<2B>S<EFBFBD>1<>1<>1<> <12>3<EFBFBD><<3C><<3C>rCz/posts/<int:post_id>/rightsc<00><><00>tjdd<02><03><00>pi} tt||<01><00><00><00>S#t$r'}t t |<02><00>d<04><00>cYd}~Sd}~wwxYw)NTFr<46>r<>)r
r<>r r$r<>rKr<>r<s rD<00>api_put_rightsrF<s~<00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>,<2C>W<EFBFBD>g<EFBFBD>><3E>><3E>?<3F>?<3F>?<3F><> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>7<00>
A(<03>A#<03>A(<03>#A(c<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>S)NzRights not found.r<>)rrKr r-s rD<00>api_get_rightsrHEs4<00><00>
2026-02-14 21:46:48 -07:00
<1C>W<EFBFBD>
%<25>
2026-02-15 01:21:05 -07:00
%<25>C<EFBFBD> <0E>0<><15>)<29>3<EFBFBD>/<2F>/<2F>/<2F> <12>3<EFBFBD><<3C><<3C>rCz/posts/<int:post_id>/chunksc<00>r<00>tjdd<02><03><00>pi}|<01>d<04><00>}t|t<00><00>st dd<06><00>S t ||<02><00>}tt|<03><00>|d<07><02><00>dfS#t$r'}t t|<04><00>d <09><00>cYd}~Sd}~wwxYw)
NTFr<EFBFBD><00>chunksz'chunks' must be a list.rF)<02>insertedrJr<>r<>) r
r<>rmrrrKrr r<>r<>r<>)rhr<>rJrr<>s rD<00>api_add_chunksrLMs<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD> <14>[<5B>[<5B><18> "<22> "<22>F<EFBFBD> <15>f<EFBFBD>d<EFBFBD> #<23> #<23>7<><15>0<>#<23>6<>6<>6<>#<23><1D>g<EFBFBD>v<EFBFBD>.<2E>.<2E><04><16>C<EFBFBD><04>I<EFBFBD>I<EFBFBD><14>><3E>><3E>?<3F>?<3F><13>D<>D<><44> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>0B<00>
B6<03>B1<03>+B6<03>1B6c<00>J<00>tj<00>ddt<00><03><00>}tj<00>ddt<00><03><00>} t dt |||<02><07><00>i<01><00>S#t $r'}tt|<03><00>d<08><00>cYd}~Sd}~wwxYw) Nr<4E>rOr<>r<><00><>rJrr<>) r
rrmr<>r rr<>rKr<><00>rhr<>r<>r<>s rD<00>api_get_chunksrP\s<><00><00> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>c<EFBFBD><03> <1C> <<3C> <<3C>E<EFBFBD>#<23><16><08>/<2F>'<27><04>E<EFBFBD>"R<>"R<>"R<>S<>T<>T<>T<><54> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD><EFBFBD><00> A1<00>1
B"<03>;B<03>B"<03>B"z/auditc<00>6<00>tjdd<02><03><00>pi} tt|<00><00><00><00>dfS#t$r'}t t |<01><00>d<05><00>cYd}~Sd}~wt$r'}t t |<01><00>d<06><00>cYd}~Sd}~wwxYwr)r
r<>r rr<>rKr<>r<>rs rD<00>api_create_auditrSgs<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>}<7D>W<EFBFBD>-<2D>-<2D>.<2E>.<2E><03>3<>3<><33> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>rc <00><><00>tj<00>dt<00><02><00>}tj<00>dt<00><02><00>}tj<00>ddt<00><06><00>}tj<00>ddt<00><06><00>} t d t ||||<03>
<EFBFBD><00>i<01><00>S#t $r'}tt|<04><00>d <0B><00>cYd}~Sd}~wwxYw) Nrhr r<>r<>rOr<>r<>r<00>logs)rhr<>r<>r<>r<><00> r
rrmr<>r rr<>rKr<>)rhr<>r<>r<>r<>s rD<00>api_list_auditrWrs<><00><00><15>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>3<>G<EFBFBD><15>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>3<>G<EFBFBD> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>c<EFBFBD><03> <1C> <<3C> <<3C>E<EFBFBD>#<23><16><06><0F><07><17>W[<5B>ch<63> i<> i<> i<>j<>k<>k<>k<><6B> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>!B><00>>
C/<03>C*<03>$C/<03>*C/z/posts/<int:post_id>/auditc<00>J<00>tj<00>ddt<00><03><00>}tj<00>ddt<00><03><00>} t dt |||<02><07><00>i<01><00>S#t $r'}tt|<03><00>d<08><00>cYd}~Sd}~wwxYw) Nr<4E>rOr<>r<>rrU)rhr<>r<>r<>rVrOs rD<00>api_post_auditrYs<><00><00> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>c<EFBFBD><03> <1C> <<3C> <<3C>E<EFBFBD>#<23><16><06><0F><07>d<EFBFBD>RW<52> X<> X<> X<>Y<>Z<>Z<>Z<><5A> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>rQ)rF)rp)e<>__doc__rWr<><00>osr<73>r<><00>pathlibr<00>typingrr<00>dotenvr<00>faster_whisperr<00>flaskrr r
<00>werkzeug.securityr r <00>werkzeug.utilsr <00>
db_queriesrrrrrrrrrrrrrrrrrrr r!r"r#r$<00>__name__r%<00>getenvr<76><00>mkdirrRr4r6r8r<>r=<00>__annotations__rEr<>r<>rK<00>boolrSr`rd<00>dictror<>r<>rmr<>rer<>r<>r<>rrrrr!r)r/<00>patchr1r4r:r=r?<00>putrBrDrFrHrLrPrSrWrYrBrCrD<00><module>rls<><00><01><04><04><04>
<0F><0E><0E><0E> <0B> <0B> <0B> <0B> <09> <09> <09> <09> <0B> <0B> <0B> <0B> <09> <09> <09> <09><18><18><18><18><18><18><1C><1C><1C><1C><1C><1C><1C><1C><1E><1E><1E><1E><1E><1E>'<27>'<27>'<27>'<27>'<27>'<27>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>I<>I<>I<>I<>I<>I<>I<>I<>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02>4 <0C> <0B> <0A> <0A> <0A><0F>i<EFBFBD><05>x<EFBFBD>F<EFBFBD>3<>3<>3<><03> <11>T<EFBFBD>)<29>"<22>)<29>0<>)<29><<3C><<3C> =<3D> =<3D>
2026-02-14 22:04:39 -07:00
<EFBFBD>
2026-02-15 01:21:05 -07:00
<EFBFBD><10><10><14><04><10>-<2D>-<2D>-<2D>\<5C>\<5C>\<5C><18><19><02> <09>/<2F>6<EFBFBD>2<>2<> <0A><1A><12><19>+<2B>U<EFBFBD>3<>3<><0E> <20>r<EFBFBD>y<EFBFBD>!7<><16>@<40>@<40><14><1A><12><19>,<2C>i<EFBFBD>b<EFBFBD>i<EFBFBD>8Q<38>S]<5D>.^<5E>.^<5E>_<>_<><0E>&*<2A><0E> <0C>t<EFBFBD>#<23>*<2A>*<2A>*<2A><1A> <0C><1A><1A><1A><1A>/<2F>/<2F>C<EFBFBD>/<2F><13>/<2F>/<2F>/<2F>/<2F>J<01>C<EFBFBD>J<01>D<EFBFBD>J<01>J<01>J<01>J<01> <19>$<24><19>3<EFBFBD><19><19><19><19><06>3<EFBFBD><06>s<EFBFBD><06>s<EFBFBD><06><06><06><06><10><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E><10>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD><10><10><10><10><12><12>3<EFBFBD><12>C<EFBFBD><12>4<EFBFBD><05>;<3B><12><12><12><12>0<05><17><17><19><13><13><07><07><14><13><07><05><18><18>
<1A><1B><1B>#<23>#<23><1C><1B>#<23>D<05><18><18>-<2D><18><18><06><06><19><18><06>@<05><18><18>/<2F><1A><1A>V@<01>V@<01><1B><1A>V@<01>v<05><17><17> '<27>(<28>(<28>#<23>c<EFBFBD>#<23>#<23>#<23>)<29>(<28>#<23><05><17><17><1D><17><17>#<23>#<23><18><17>#<23>D<05><18><18>(<28><13><13>#<23>#<23><14><13>#<23><05><17><17> <1F> <20> <20><19>#<23><19><19><19>!<21> <20><19><05><18><18>(<28><13><13>#<23>#<23><14><13>#<23><05><17><17><18><12><12>#<23>#<23><13><12>#<23>0<05><17><17> <1F> <20> <20><18>#<23><18><18><18>!<21> <20><18><05><19><19> !<21>"<22>"<22>#<23>C<EFBFBD>#<23>#<23>#<23>#<23>"<22>#<23><05><17><17> &<26>'<27>'<27><1B>S<EFBFBD><1B><1B><1B>(<28>'<27><1B><05><17><17> )<29>*<2A>*<2A>#<23><03>#<23>#<23>#<23>+<2B>*<2A>#<23>6<05><18><18>
2026-02-14 22:04:39 -07:00
&<26>'<27>'<27>#<23>#<23>#<23>#<23>#<23>(<28>'<27>#<23><05><17><17> %<25>&<26>&<26>#<23>C<EFBFBD>#<23>#<23>#<23>'<27>&<26>#<23><05><17><17> (<28>)<29>)<29> #<23>c<EFBFBD> #<23> #<23> #<23>*<2A>)<29> #<23><05><17><17> (<28>)<29>)<29><18>c<EFBFBD><18><18><18>*<2A>)<29><18><05><17><17> &<26>'<27>'<27>#<23>C<EFBFBD>#<23>#<23>#<23>(<28>'<27>#<23><05><17><17> &<26>'<27>'<27><18>C<EFBFBD><18><18><18>(<28>'<27><18><05><18><18>
2026-02-15 01:21:05 -07:00
'<27>(<28>(<28> #<23>C<EFBFBD> #<23> #<23> #<23>)<29>(<28> #<23><05><17><17> &<26>'<27>'<27>#<23>C<EFBFBD>#<23>#<23>#<23>(<28>'<27>#<23><05><18><18>(<28><13><13>#<23>#<23><14><13>#<23><05><17><17><18><12><12> #<23> #<23><13><12> #<23><05><17><17> %<25>&<26>&<26>#<23>C<EFBFBD>#<23>#<23>#<23>'<27>&<26>#<23>#<23>#rC