Files
gommi_downloader_manager/__pycache__/mod_queue.cpython-314.pyc

101 lines
24 KiB
Plaintext
Raw Normal View History

+
<00><>[i<>@<00><00><><00>Rt^RIt^RIt^RIt^RIt^RIHt^RIHtHtH t H
t
H t ^RI H t ^RIHtHt^RIHtHt^RIHtHtHtHt!RR ]] 4t!R
R ]4t!R R 4tR#)u9
gommi_download_manager - 다운로드 큐 관리 모듈
N)<01>datetime)<05>Optional<61>Dict<63>Any<6E>List<73>Callable)<01>Enum)<02>render_template<74>jsonify)<02>F<>socketio)<04>P<>PluginModuleBase<73>default_route_socketio_module<6C>ToolUtilc<00>2<00>]tRt^tRtRtRtRtRtRt Rt
Rt R #)
<EFBFBD>DownloadStatus<75>pending<6E>
extracting<EFBFBD> downloading<6E>paused<65> completed<65>error<6F> cancelled<65>N) <0C>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__<5F>PENDING<4E>
EXTRACTING<EFBFBD> DOWNLOADING<4E>PAUSED<45> COMPLETED<45>ERROR<4F> CANCELLED<45>__static_attributes__r<00><00>P/Volumes/WD/Users/Work/python/ff_dev_plugins/gommi_download_manager/mod_queue.pyrrs%<00><00><17>G<EFBFBD><1D>J<EFBFBD><1F>K<EFBFBD> <15>F<EFBFBD><1B>I<EFBFBD> <13>E<EFBFBD><1B>Ir'rc<00>\aa<01>]tRt^toRtRRRRRRRR R
R R R RRRRRRRR/
t/t]P!4t V3RlV3Rllt
V3RlRlt V3RlRlt ] R)V3RlRll4t] V3RlRl4t] V3RlR l4t] V3R!lR"l4tV3R#lR$ltV3R%lR&ltV3R'ltR(tVtV;t#)*<2A> ModuleQueueu다운로드 큐 관리 모듈<EBAAA8> aria2c_path<74>aria2c<32>aria2c_connections<6E>16<31> ffmpeg_path<74>ffmpeg<65> yt_dlp_path<74><00> save_pathz{PATH_DATA}/download<61> temp_pathz{PATH_DATA}/download_tmp<6D>max_concurrent<6E>3<>max_download_rate<74>0<>
auto_retry<EFBFBD>true<75> max_retryc<00>$<<01>V^8<>dQhRS[RR/#)<04>r <00>returnN)r)<02>format<61> __classdict__s"<22>r(<00> __annotate__<5F>ModuleQueue.__annotate__0s<00><><00>=<3D>=<3D>#<23>=<3D>$<24>=r'c<08>N<<01>\\V` VRRR7\VRR7R#)<06>queue<75>list)<02>name<6D>
first_menuz/queue)<01>attachN)<04>superr*<00>__init__r)<03>selfr <00> __class__s&&<26>r(rJ<00>ModuleQueue.__init__0s#<00><><00> <0A>k<EFBFBD>4<EFBFBD>)<29>!<21>'<27>f<EFBFBD>)<29>M<>%<25>d<EFBFBD>8<EFBFBD><r'c<00>,<<01>V^8<>dQhRS[RS[RS[/#)r=<00> page_name<6D>reqr><00><02>strr)r?r@s"<22>r(rArB5s'<00><><00> e<01> e<01>c<EFBFBD> e<01><03> e<01><03> er'c  <0C><><00>\PPRV 24\PP 4pVP
VR&\P VR&\PR,VR&\\P RVP
RV R2VR7# \d<>p\PPR\T4 24\PP\P!44\R \P R
TP
R
T 2R 7uR p?#R p?ii;i) u메뉴 페이지 렌더링zPage Request: <20> module_name<6D> package_name<6D> path_data<74>_z.html)<01>arg<72>
Exception:z sample.html<6D>/)<01>titleN)r <00>logger<65>debug<75> ModelSetting<6E>to_dictrFrUr <00>configr <00> ExceptionrrR<00> traceback<63>
format_exc)rKrOrPrX<00>es&&& r(<00> process_menu<6E>ModuleQueue.process_menu5s<><00><00> <09><08><08><0E><0E><1E> <09>{<7B>3<>4<><0F>n<EFBFBD>n<EFBFBD>$<24>$<24>&<26><03> e<01>!%<25><19><19>C<EFBFBD> <0A> <1E>"#<23>.<2E>.<2E>C<EFBFBD><0E> <1F> <20>x<EFBFBD>x<EFBFBD> <0B>4<>C<EFBFBD> <0B> <1C>"<22>a<EFBFBD>n<EFBFBD>n<EFBFBD>%5<>Q<EFBFBD>t<EFBFBD>y<EFBFBD>y<EFBFBD>k<EFBFBD><11>9<EFBFBD>+<2B>U<EFBFBD>#S<>Y\<5C>]<5D> ]<5D><><18> e<01> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>Z<EFBFBD><03>A<EFBFBD><06>x<EFBFBD>0<> 1<> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>9<EFBFBD>/<2F>/<2F>1<> 2<>"<22>=<3D>1<EFBFBD>><3E>><3E>:J<>!<21>D<EFBFBD>I<EFBFBD>I<EFBFBD>;<3B>VW<56>Xa<58>Wb<57>8c<38>d<> d<><64> e<01>s <00>A)B,<00>, E <03>7B E<03>E <03>E c<00>,<<01>V^8<>dQhRS[RS[RS[/#)r=<00>commandrPr>rQ)r?r@s"<22>r(rArBCs"<00><><00><<1C><<1C>C<EFBFBD><<1C>c<EFBFBD><<1C>c<EFBFBD><r'c <0C><><00>RR/pVR8Xd<>VPR,pVPPR4;'g4\P!\P
PR44pVPPR4pVP WEV4pV'dVP4MRVR&EMOVR 8XdiVPP4Uu.uFq<>P4NK p p\PPR
\V 4 R 24W<>R&EM<>VR 8XdLVPR ,p
W<EFBFBD>P9d'VPV
,P4RVR&EM<>VR8XdGVPR ,p
W<EFBFBD>P9d"VPV
,P4EMAVR8XdFVPR ,p
W<EFBFBD>P9d"VPV
,P!4M<>VR8Xd<>\#VPP44Fp V P4K VPP%4\&P(P+4;_uu_4^RIHp \&P0P2P5V 4P74\&P0P2P94RRR4RTR&\EV4#uupi +'giL%;i \:d-p \PP=RT 24Rp ? LZRp ? ii;i \:d{p \PP=R\?T 4 24\PP=\@PB!44RTR&\?T 4TR&Rp ? L<>Rp ? ii;i)uAJAX 명령 처리<ECB298>ret<65>success<73>add<64>urlr3<00>filenameN<65>datarEzList Command: z items<6D>cancel<65>idu&다운로드가 취소되었습니다.<2E>msg<73>pause<73>resume<6D>reset<65><01>ModelDownloadItemzDB Clear Error: u 목록을 초기화했습니다.rYr)#<23>form<72>getr<00> make_pathr r^<00> add_download<61>as_dict<63>
_downloads<EFBFBD>values<65>
get_statusr\r]<00>lenrprsrtrE<00>clearr <00>app<70> app_context<78>modelrw<00>db<64>session<6F>query<72>delete<74>commitrarrRrbrcr
)rKrhrPrjrmr3rn<00>item<65>d<>items<6D> download_id<69>taskrwrds&&& r(<00> process_ajax<61>ModuleQueue.process_ajaxCs<><00><00><15>i<EFBFBD> <20><03>6 <20><16>%<25><1F><19>h<EFBFBD>h<EFBFBD>u<EFBFBD>o<EFBFBD><03><1F>H<EFBFBD>H<EFBFBD>L<EFBFBD>L<EFBFBD><1B>5<>l<>l<><18>9K<39>9K<39>A<EFBFBD>N<EFBFBD>N<EFBFBD>L^<5E>L^<5E>_j<5F>Lk<4C>9l<39> <09><1E>8<EFBFBD>8<EFBFBD><<3C><<3C>
<EFBFBD>3<><08><1B>(<28>(<28><13><18>B<><04>04<30>d<EFBFBD>l<EFBFBD>l<EFBFBD>n<EFBFBD>$<24><03>F<EFBFBD> <0B><18>F<EFBFBD>"<22>15<31><1F><1F>1G<31>1G<31>1I<31>J<>1I<31>A<EFBFBD><1C><1C><1E>1I<31><05>J<><11><08><08><0E><0E><1E><03>E<EFBFBD>
<EFBFBD>|<7C>6<EFBFBD>B<>C<>#<23>F<EFBFBD> <0B><18>H<EFBFBD>$<24>!<21>h<EFBFBD>h<EFBFBD>t<EFBFBD>n<EFBFBD> <0B><1E>/<2F>/<2F>1<><18>O<EFBFBD>O<EFBFBD>K<EFBFBD>0<>7<>7<>9<>!I<>C<EFBFBD><05>J<EFBFBD><4A><18>G<EFBFBD>#<23>!<21>h<EFBFBD>h<EFBFBD>t<EFBFBD>n<EFBFBD> <0B><1E>/<2F>/<2F>1<><18>O<EFBFBD>O<EFBFBD>K<EFBFBD>0<>6<>6<>8<><38><18>H<EFBFBD>$<24>!<21>h<EFBFBD>h<EFBFBD>t<EFBFBD>n<EFBFBD> <0B><1E>/<2F>/<2F>1<><18>O<EFBFBD>O<EFBFBD>K<EFBFBD>0<>7<>7<>9<><39><18>G<EFBFBD>#<23> <20><14><1F><1F>!7<>!7<>!9<>:<3A>D<EFBFBD><18>K<EFBFBD>K<EFBFBD>M<EFBFBD>;<3B><14><0F><0F>%<25>%<25>'<27>;<3B><1A><15><15>*<2A>*<2A>,<2C>,<2C><<3C><19><04><04> <0C> <0C>*<2A>*<2A>+<<3C>=<3D>D<>D<>F<><19><04><04> <0C> <0C>+<2B>+<2B>-<2D>-<2D>@<01><03>E<EFBFBD>
<EFBFBD><17>s<EFBFBD>|<7C><1B><>YK<01>:-<2D>,<2C><>!<21>;<3B><15>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>%5<>a<EFBFBD>S<EFBFBD>#9<>:<3A>:<3A><>;<3B><>
<19> <20> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>Z<EFBFBD><03>A<EFBFBD><06>x<EFBFBD>0<> 1<> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>9<EFBFBD>/<2F>/<2F>1<> 2<> <20>C<EFBFBD><05>J<EFBFBD><1C>Q<EFBFBD><16>C<EFBFBD><05>J<EFBFBD><4A>  <20>s<EFBFBD><00>;M.<00>A>M.<00>#M.<00>%L<04>=2M.<00>1AM.<00>A M.<00>A M.<00>AM.<00>8&L4<00>A&L!<05>L4<00> M.<00>M.<00>! L1 <09>,L4<00>0M.<00>1L4<00>4 M+<03>?"M&<03>!M.<00>&M+<03>+M.<00>. O3<03>9A0O.<03>.O3c<00><><<01>V^8<>dQhRS[RS[RS[S[,RS[S[,RS[S[,RS[S[,RS[S[,RS[S[,R S[S[,R
S[R ,/
#) r=rmr3rn<00> source_type<70> caller_plugin<69> callback_id<69> on_progress<73> on_complete<74>on_errorr><00> DownloadTask<73>rRrr)r?r@s"<22>r(rArB<00>s<><00><><00>N<18>N<18> <10>N<18><17>N<18><1B>3<EFBFBD>-<2D> N<18>
<1E>c<EFBFBD>]<5D> N<18>  <20><03>}<7D> N<18><1E>c<EFBFBD>]<5D>N<18><1E>h<EFBFBD>'<27>N<18><1E>h<EFBFBD>'<27>N<18><1B>8<EFBFBD>$<24>N<18>
<12>.<2E> !<21>Nr'c
 <0C><00>V'dVR8XdVPV4p\RRVRVRVRVRVRVRVR VR
V / V
Bp VP;_uu_4W<>PV P&R R R 4T P 4^R IHp V !4p \P!4V n
Wn W-n W=n WMn\P V nW]nWmnV P)4V PV nV # +'giL<>;i \,d`p\.P0P3R T 24\.P0P3\4P6!44R p?R #R p?ii;i)u7
다운로드를 큐에 추가 (외부 플러그인에서 호출)
Args:
url: 다운로드 URL
save_path: 저장 경로
filename: 파일명 (자동 감지 가능)
source_type: 소스 타입 (auto, youtube, ani24, linkkf, anilife, http)
caller_plugin: 호출 플러그인 이름
callback_id: 콜백 식별자
on_progress: 진행률 콜백 (progress, speed, eta)
on_complete: 완료 콜백 (filepath)
on_error: 에러 콜백 (error_message)
**options: 추가 옵션 (headers, cookies 등)
Returns:
DownloadTask 인스턴스
<EFBFBD>autormr3rnr<>r<>r<>r<>r<>r<>Nrvzadd_download error: r)<1C>_detect_source_typer<65><00> _queue_lockr}rq<00>startr<74>rwr<00>now<6F> created_timermr3rnr<>rr<00>statusr<73>r<><00>save<76>db_idrar r\rrbrc)<0F>clsrmr3rnr<>r<>r<>r<>r<>r<><00>optionsr<73>rw<00>db_itemrds&&&&&&&&&&, r(r{<00>ModuleQueue.add_download<61>sl<00><00>@/ <18><1E>+<2B><16>"7<>!<21>5<>5<>c<EFBFBD>:<3A> <0B> <20> <0E><17> <0E>#<23> <0E>"<22> <0E>(<28> <0E>
,<2C> <0E> (<28> <0E>(<28> <0E>(<28> <0E>"<22> <0E><1A> <0E>D<EFBFBD><15><1F><1F><1F>*.<2E><0E><0E>t<EFBFBD>w<EFBFBD>w<EFBFBD>'<27>!<21>
<11>J<EFBFBD>J<EFBFBD>L<EFBFBD> 1<>'<27>)<29>G<EFBFBD>#+<2B><<3C><<3C>><3E>G<EFBFBD> <20><1D>K<EFBFBD> )<29> <1D>'<27> <1C>"-<2D> <1F>+<2B>3<>3<>G<EFBFBD>N<EFBFBD>$1<> !<21>"-<2D> <1F> <13>L<EFBFBD>L<EFBFBD>N<EFBFBD> <20><1A><1A>D<EFBFBD>J<EFBFBD><18>K<EFBFBD>/!<21><1F><>2<19> <18> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>1<>!<21><13>5<> 6<> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>9<EFBFBD>/<2F>/<2F>1<> 2<><17><> <18>s7<00>D<00>A D<00>D<05>,BD<00> D <09>D<00> F<03>%AE?<03>?Fc<00>4<<01>V^8<>dQhRS[RS[R,/#)r=r<>r>r<>)rRr)r?r@s"<22>r(rArB<00>s <00><><00>/<2F>/<2F>s<EFBFBD>/<2F>x<EFBFBD><0E>/G<>/r'c <0C>8<00>VPPV4#)u다운로드 태스크 조회)r}ry)r<>r<>s&&r(<00> get_download<61>ModuleQueue.get_download<61>s<00><00><13>~<7E>~<7E>!<21>!<21>+<2B>.<2E>.r'c<00>.<<01>V^8<>dQhRS[R,/#)r=r>r<>)r)r?r@s"<22>r(rArB<00>s<00><><00>-<2D>-<2D>$<24>~<7E>"6<>-r'c <0C>H<00>\VPP44#)u$모든 다운로드 태스크 조회)rEr}r~)r<>s&r(<00>get_all_downloads<64>ModuleQueue.get_all_downloads<64>s<00><00><14>C<EFBFBD>N<EFBFBD>N<EFBFBD>)<29>)<29>+<2B>,<2C>,r'c<00>&<<01>V^8<>dQhRS[RS[/#)r=rmr>)rR)r?r@s"<22>r(rArB<00>s<00><><00><1A><1A>c<EFBFBD><1A>c<EFBFBD>r'c <0C><><00>VP4pRV9gRV9dR#RV9gRV9dR#RV9dR#RV9dR#VPR4'gR V9dR
#R #) u%URL에서 소스 타입 자동 감지z youtube.comzyoutu.be<62>youtube<62>ani24<32>ohli24<32>linkkf<6B>anilifez.m3u8<75>manifest<73>hls<6C>http)<02>lower<65>endswith)r<>rm<00> url_lowers&& r(r<><00>ModuleQueue._detect_source_type<70>sg<00><00><18>I<EFBFBD>I<EFBFBD>K<EFBFBD> <09> <18>I<EFBFBD> %<25><1A>y<EFBFBD>)@<40><1C> <14> <09> !<21>X<EFBFBD><19>%:<3A><1A> <15><19> "<22><1B> <16>)<29> #<23><1C> <16> <1F> <1F><07> (<28> (<28>J<EFBFBD>)<29>,C<><18>r'c<00><<01>V^8<>dQhRR/#<00>r=r>Nr)r?r@s"<22>r(rArB<00>s<00><><00>,3<>,3<>T<EFBFBD>,3r'c  <0C><><00>\PPR4\PP 4;_uu_4^RIHp\PPPV4PVPP\P\P \P".44P%4pVF<>p\'VP(VP*VP,VP.VP0VP2R7p\VP4Vn VP4VnVP8;'gRVn\PVn W@P:VP4&VP=4K<> \PP\?V4 R24RRR4R# +'giR#;i \@d`p\PPCRT 24\PPC\DPF!44Rp?R#Rp?ii;i)u!플러그인 로드 시 초기화u$gommi_downloader 플러그인 로드rv)rmr3rnr<>r<>r<>r2u.개의 중단된 다운로드 작업 복원됨Nzplugin_load error: )$r r\<00>infor r<>r<>r<>rwr<>r<>r<><00>filterr<72><00>in_rrr!r <00>allr<6C>rmr3rnr<>r<>r<>rqr<>r[r}r<>r<>rarrbrc)rKrwr<>r<>r<>rds& r(<00> plugin_load<61>ModuleQueue.plugin_load<61>s<><00><00> <09><08><08> <0A> <0A><<3C>=<3D>) 3<><12><15><15>"<22>"<22>$<24>$<24>4<><1A><04><04> <0C> <0C>*<2A>*<2A>+<<3C>=<3D>D<>D<>%<25>,<2C>,<2C>0<>0<>&<26>.<2E>.<2E>&<26>2<>2<>&<26>1<>1<>2<16><17><12> <16>#<23>%<25> <16>"<22>D<EFBFBD>'<27> <20>H<EFBFBD>H<EFBFBD>"&<26>.<2E>.<2E>!%<25><1D><1D>$(<28>$4<>$4<>&*<2A>&8<>&8<>$(<28>$4<>$4<> <16>D<EFBFBD>#1<><14><1B><1B>"=<3D>D<EFBFBD>K<EFBFBD>!%<25><17><17>D<EFBFBD>J<EFBFBD>!%<25><1A><1A>!1<>!1<>r<EFBFBD>D<EFBFBD>J<EFBFBD>
#1<>"8<>"8<>D<EFBFBD>K<EFBFBD>/3<>O<EFBFBD>O<EFBFBD>D<EFBFBD>G<EFBFBD>G<EFBFBD>,<2C><18>J<EFBFBD>J<EFBFBD>L<EFBFBD>+"<22>.<12><08><08> <0A> <0A><13>U<EFBFBD><1A> <0C>,Z<>[<5B>\<5C>G%<25>$<24>$<24>$<24><>J<19> 3<> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>0<><11><03>4<> 5<> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>9<EFBFBD>/<2F>/<2F>1<> 2<> 2<><32> 3<>s7<00>&G<<00>FG(<05>G<<00>( G9 <09>3G<<00>9G<<00>< I&<03>AI!<03>!I&c<00><<01>V^8<>dQhRR/#r<>r)r?r@s"<22>r(rArBs<00><><00><1A><1A>t<EFBFBD>r'c <0C>h<00>VPP4FpVP4K R#)u!플러그인 언로드 시 정리N)r}r~rp)rKr<>s& r(<00> plugin_unload<61>ModuleQueue.plugin_unloads$<00><00><19>O<EFBFBD>O<EFBFBD>*<2A>*<2A>,<2C>D<EFBFBD> <10>K<EFBFBD>K<EFBFBD>M<EFBFBD>-r'c<00>:<<01>V^8<>dQh/S[S[R3,;R&#)r=r<>r})rrR)r?r@s"<22>r(rArBs<00><><00><00>"<15>S<EFBFBD>.<2E>(<28>)<29>.<2E>#r'r)NNNNNNN)rrrr<00>__doc__<5F>
db_defaultr}<00> threading<6E>Lockr<6B>rJrer<><00> classmethodr{r<>r<>r<>r<>r<><00>__annotate_func__r&<00>__classdictcell__<5F> __classcell__)rLr@s@@r(r*r*s<><00><><00><00>(<28> <16>x<EFBFBD><1C>d<EFBFBD><15>x<EFBFBD><15>r<EFBFBD><13>+<2B><13>/<2F><18>#<23><1B>S<EFBFBD><14>f<EFBFBD><13>S<EFBFBD> <06>J<EFBFBD>-/<2F>J<EFBFBD><1B>.<2E>.<2E>"<22>K<EFBFBD>=<3D>=<3D>
e<01> e<01><<1C><<1C>@<11>N<18>N<18><11>N<18>`<11>/<2F><11>/<2F><11>-<2D><11>-<2D><11><1A><11><1A>",3<>,3<>\<1A><1A>E<01>r'r*c<00><>a<00>]tRtRtoRt^t]P!4tRV3RlRllt Rt
Rt RV3RlR llt R
t R tR tR tV3RlRltRtVtR#)r<>i%u개별 다운로드 태스크Nc<00><><<01>V^8<>dQhRS[RS[RS[S[,RS[RS[S[,RS[S[,RS[S[,RS[S[,R S[S[,/ #)
r=rmr3rnr<>r<>r<>r<>r<>r<>r<>)r?r@s"<22>r(rA<00>DownloadTask.__annotate__+s<><00><><00>0)<29>0)<29> <10>0)<29><17>0)<29><1B>3<EFBFBD>-<2D> 0)<29>
<19> 0)<29>  <20><03>}<7D> 0)<29><1E>c<EFBFBD>]<5D>0)<29><1E>h<EFBFBD>'<27>0)<29><1E>h<EFBFBD>'<27>0)<29><1B>8<EFBFBD>$<24>0)r'c
 <08>f<00>VP;_uu_4\;P^, unR\\P!44 R\P 2VnRRR4WnW nW0nW@n WPn
W`n W<>n Wpn W<>nW<>n\ P"Vn^VnRVnRVnRVnRVnRVnRVn^Vn^VnRVnRVnRVnRVnR# +'giL<>;i)<06><00>dl_rWNr2F) <20> _counter_lockr<6B><00>_counter<65>int<6E>timerqrmr3rnr<>r<>r<>r<><00> _on_progress<73> _on_complete<74> _on_errorrrr<><00>progress<73>speed<65>eta<74> error_message<67>filepathr[<00> thumbnail<69>duration<6F>filesize<7A>_thread<61> _downloader<65>
_cancelledr<EFBFBD>) rKrmr3rnr<>r<>r<>r<>r<>r<>r<>s &&&&&&&&&&,r(rJ<00>DownloadTask.__init__+s<00><00><12> <1F> <1F> <1F> <18> !<21> !<21>Q<EFBFBD> &<26> !<21><1B>C<EFBFBD><04> <09> <09> <0B>,<2C>-<2D>Q<EFBFBD>|<7C>/D<>/D<>.E<>F<>D<EFBFBD>G<EFBFBD> <20><17><08>"<22><0E> <20> <0A>&<26><18>*<2A><1A>&<26><18><1E> <0C>(<28><19>'<27><19>!<21><0E>%<25>,<2C>,<2C><04> <0B><19><04> <0A><17><04>
<EFBFBD><15><04><08><1F><04><1A><1A><04> <0A><18><04>
<EFBFBD><1B><04><0E><19><04> <0A><19><04> <0A>48<34><04> <0C><1F><04><18><1F><04><0F>$(<28><04>
<EFBFBD>G <20> <1F>s <00>AD <05> D0 c <0C><><00>\P!VPRR7VnVPP 4R#)u다운로드 시작 (비동기)T)<02>target<65>daemonN)r<><00>Thread<61>_runr<6E>r<><00>rKs&r(r<><00>DownloadTask.start]s*<00><00> <20>'<27>'<27>t<EFBFBD>y<EFBFBD>y<EFBFBD><14>F<><04> <0C> <0C> <0C> <0C><1A><1A>r'c  <0C><><00>\PVnVP4^RIHpV!VP 4VnVP'g\RVP 24h\PVnVP4VPP!RRVPRVPRVPRVP/VPBpVP 'd\P"VnM<>VP%R4'db\P&VnVP%RR 4Vn^dVnVP,'dVP-VP(4MY\P.VnVP%R
R 4VnVP2'dVP3VP04VP4R # \d<>p\4P6P9R T 24\4P6P9\:P<!44\P.Tn\?T4TnTP2'dTP3TP04R p?L<>R p?ii;i TP4i;i)u다운로드 실행)<01>get_downloaderu#지원하지 않는 소스 타입: rmr3rn<00>progress_callbackrkr<>r2rz Unknown errorzDownload error: Nr) rr r<><00> _emit_status<75>
downloaderr<EFBFBD>r<>r<>rar!<00>downloadrmr3rn<00>_progress_callbackr<6B>r<>r%ryr#r<>r<>r<>r$r<>r<>r r\rrbrcrR)rKr<><00>resultrds& r(r<><00>DownloadTask._runbs<00><00>. <20>(<28>3<>3<>D<EFBFBD>K<EFBFBD> <10> <1D> <1D> <1F> 3<>-<2D>d<EFBFBD>.><3E>.><3E>?<3F>D<EFBFBD> <1C><17>#<23>#<23>#<23><1F>"E<>d<EFBFBD>FV<46>FV<46>EW<45> X<>Y<>Y<>(<28>4<>4<>D<EFBFBD>K<EFBFBD> <10> <1D> <1D> <1F><1A>%<25>%<25>.<2E>.<2E><0E><18>H<EFBFBD>H<EFBFBD><0E><1E>.<2E>.<2E><0E><1E><1D><1D><0E>#'<27>"9<>"9<> <0E>
<17>,<2C>,<2C> <0E>F<EFBFBD><14><EFBFBD><EFBFBD><EFBFBD>,<2C>6<>6<><04> <0B><17><1A><1A>I<EFBFBD>&<26>&<26>,<2C>6<>6<><04> <0B> &<26>
<EFBFBD>
<EFBFBD>:<3A>r<EFBFBD> :<3A><04> <0A> #<23><04> <0A><17>$<24>$<24>$<24><18>%<25>%<25>d<EFBFBD>m<EFBFBD>m<EFBFBD>4<><34>,<2C>2<>2<><04> <0B>%+<2B>Z<EFBFBD>Z<EFBFBD><07><1F>%I<><04>"<22><17>><3E>><3E>><3E><18>N<EFBFBD>N<EFBFBD>4<EFBFBD>#5<>#5<>6<> <11> <1D> <1D> <1F><><19> 3<> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>-<2D>a<EFBFBD>S<EFBFBD>1<> 2<> <0A>H<EFBFBD>H<EFBFBD>N<EFBFBD>N<EFBFBD>9<EFBFBD>/<2F>/<2F>1<> 2<>(<28>.<2E>.<2E>D<EFBFBD>K<EFBFBD>!$<24>Q<EFBFBD><16>D<EFBFBD> <1E><13>~<7E>~<7E>~<7E><14><0E><0E>t<EFBFBD>1<>1<>2<><32><EFBFBD>  3<><33> <11> <1D> <1D> <1F>s\<00>C8G4<00>;G4<00>J2<00>G4<00>(AG4<00>-G4<00>J2<00> =G4<00>G4<00>4 J/<03>?B&J*<03>%J2<00>*J/<03>/J2<00>2Kc<00>,<<01>V^8<>dQhRS[RS[RS[/#)r=r<>r<>r<>)r<>rR)r?r@s"<22>r(rAr<><00>s"<00><><00> <1C> <1C>3<EFBFBD> <1C>s<EFBFBD> <1C>c<EFBFBD> r'c <0C><><00>WnW nW0nVP'dVPWV4VP 4R#)u진행률 콜백N)r<>r<>r<>r<>r<>)rKr<>r<>r<>s&&&&r(r<><00>DownloadTask._progress_callback<63>s9<00><00> <20> <0A><1A>
<EFBFBD><16><08> <0F> <1C> <1C> <1C> <10> <1D> <1D>h<EFBFBD>s<EFBFBD> 3<> <0C><19><19>r'c <0C><><00>\P!RVP4R\P 2R7R# R#;i)uSocket.IO로 상태 전송<ECA084>download_statusrZ)<01> namespaceN)r <00>emitrr rUr<>s&r(r<><00>DownloadTask._emit_status<75>s9<00><00> <11> <14>M<EFBFBD>M<EFBFBD>!<21><14><0F><0F>!<21><1D>a<EFBFBD>n<EFBFBD>n<EFBFBD>-<2D>.<2E> <0E><>
 <11> <10>s <00>8<<00>Ac <0C><><00>RVnVP'dVPP4\PVnVP 4R#)u다운로드 취소TN)r<>r<>rprr%r<>r<>r<>s&r(rp<00>DownloadTask.cancel<65>s@<00><00><1E><04><0F> <0F> <1B> <1B> <1B> <10> <1C> <1C> #<23> #<23> %<25>$<24>.<2E>.<2E><04> <0B> <0C><19><19>r'c <0C><><00>VP'd7\VPR4'dVPP4\PVnVP 4R#)u다운로드 일시정지rsN)r<><00>hasattrrsrr"r<>r<>r<>s&r(rs<00>DownloadTask.pause<73>sK<00><00> <0F> <1B> <1B> <1B><07><04>(8<>(8<>'<27> B<> B<> <10> <1C> <1C> "<22> "<22> $<24>$<24>+<2B>+<2B><04> <0B> <0C><19><19>r'c <0C><><00>VP'd7\VPR4'dVPP4\PVnVP 4R#)u다운로드 재개rtN)r<>rrtrr!r<>r<>r<>s&r(rt<00>DownloadTask.resume<6D>sK<00><00> <0F> <1B> <1B> <1B><07><04>(8<>(8<>(<28> C<> C<> <10> <1C> <1C> #<23> #<23> %<25>$<24>0<>0<><04> <0B> <0C><19><19>r'c<00>6<<01>V^8<>dQhRS[S[S[3,/#)r=r>)rrRr)r?r@s"<22>r(rAr<><00>s<00><><00>
<EFBFBD>
<EFBFBD>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD>
r'c <0C>n<00>RVPRVPRVPRVPRVPRVP
RVP RVPR VPR
VPR VPR VPR VPRVPRVP/#)u현재 상태 반환rqrmrnr3r<>r<>r<>r<>r<>r[r<>r<>r<>r<>r<>)rqrmrnr3r<>r<>r<>r<>r<>r[r<>r<>r<>r<>r<>r<>s&r(r<00>DownloadTask.get_status<75>s<><00><00> <11>$<24>'<27>'<27> <11>4<EFBFBD>8<EFBFBD>8<EFBFBD> <16><04> <0A> <0A> <17><14><1E><1E> <19>4<EFBFBD>+<2B>+<2B> <14>d<EFBFBD>k<EFBFBD>k<EFBFBD> <16><04> <0A> <0A> <13>T<EFBFBD>Z<EFBFBD>Z<EFBFBD> <11>4<EFBFBD>8<EFBFBD>8<EFBFBD> <13>T<EFBFBD>Z<EFBFBD>Z<EFBFBD> <17><14><1E><1E> <1B>T<EFBFBD>/<2F>/<2F> <16><04> <0A> <0A> <1B>T<EFBFBD>/<2F>/<2F> <19>4<EFBFBD>+<2B>+<2B>
<EFBFBD>
r')r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rnr<>r<>rqr<>r<>r3r<>r<>r<>r<>r[rm)Nr<4E>NNNNN)r2r2)rrrrr<>r<>r<>r<>r<>rJr<>r<>r<>r<>rprsrtrr&r<>)r@s@r(r<>r<>%sW<00><><00><00>'<27><10>H<EFBFBD><1D>N<EFBFBD>N<EFBFBD>$<24>M<EFBFBD>0)<29>0)<29>d<1D>
0 <20>d <1C> <1C> <11><1C><1C><1C>
<EFBFBD>
r'r<>)r<><00>osr<73>r<>rbr<00>typingrrrrr<00>enumr<00>flaskr r
<00> frameworkr r <00>setupr rrrrRrr*r<>rr'r(<00><module>rsZ<00><01><04>
<EFBFBD> <0B><10><10><1D>6<>6<><15>*<2A>!<21>O<>O<><1C>S<EFBFBD>$<24><1C>F<1A>"<22>F<1A>Rm
<EFBFBD>m
r'