pax_global_header################################################################## #################0000666#0000000#0000000#00000000064#13407400542#0014511#g######### ################################################################################### ########ustar#00root############################root############################000 0000#0000000####################################################################### ################################################################################### ##############52 comment=9ab7287cabd2d2a3708d758d47c209b7722a29 ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### #############################################scr!bd"donloader" 1$1$1%############################################################################0 000775#0000000#0000000#00000000000#13407400542#0015113#5########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################scr! bd"donloader" 1$1$1%$g!t!gnore##################################################################0 000664#0000000#0000000#00000000170#13407400542#0017101#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################%&$t xt %&$pd %&$'pg %&$'peg %&$png &$p(c __p(cache__% $cache% scr!bd_donloader$egg"!no% bu!ld% d!st% $p(test_cache% ################################################################################### ################################################################################### ################################################################################### ################################################################################### ############################################################scr!bd"donloader" 1$1$1%$tra)!s$(ml#################################################################0 000664#0000000#0000000#00000000225#13407400542#0017223#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################d!st * xen!al language* p(thon sudo* re+u!red p(thon* " ,3$4, " ,3$5, " ,3$6, " ,3$7, !nstall* p!p !nstall "e $
scr!pt* p(thon "m p(test test ################################################################################### ################################################################################### ################################################################################### ################################################################################### ###############################scr!bd"donloader" 1$1$1%-./#####################################################################0 000664#0000000#0000000#00000002060#13407400542#0016116#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################. -!cense /op(r!ght c 2016 !t!e alhotra erm!ss!on !s hereb( granted: ree o charge: to an( person obta!n!ng a cop( o th!s sotare and assoc!ated documentat!on !les the ,otare,: to deal !n the otare !thout restr!ct!on: !nclud!ng !thout l!m!tat!on the r!ghts to use: cop(: mod!(: merge: publ!sh: d!str!bute: subl!cense: and%or sell cop!es o the otare: and to perm!t persons to hom the otare !s urn!shed to do so: sub'ect to the ollo!ng cond!t!ons* he abo)e cop(r!ght not!ce and th!s perm!ss!on not!ce shall be !ncluded !n all cop!es or substant!al port!ons o the otare$ ; <>? . <@.AA ,? .,: >.;??C < ?C D.A: E < .-.A: ./-BA.F GB < -..A < ; >??. < /;??G.-.C: . < ? ?./B-? B< ?A <..F$ . < @ ;?-- ; ?B;< < /<C.F; ;<-A G -.?G- < ?C /-?.: A??F < <; -.?G.-.C: >;; . ? ?/.< < /<?/: < < <;>.: ?..F <: .; ; <>? < ; B < <; A?-.F . ; <>?$ ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### #################################################scr!bd"donloader" 1$1$1%?A$rst##################################################################0 000664#0000000#0000000#00000006137#13407400542#0016611#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################cr! bd"Aonloader ================= H(! @ers!onH HGu!ld tatusH . also ound an onl!ne ser)!ce https*%%dlscr!b$com% created b( Ir! ongI_$ .t doesnJt use th!s scr!pt as some people seem to th!nK$ h!s p(thon scr!pt allos donload!ng o cr!bd documents$ .t does not matter ! the pages are blurred or re+u!re authent!cat!on: th!s scr!pt !ll st!ll do !ts 'ob$ here are to t(pes o documents on cr!bd*
" "
Aocuments made up us!ng a collect!on o !mages and ?ctual documents here the text can be selected: cop!ed etc$
h!s scr!pt taes a d!erent approach to both o them* "
Aocuments cons!st!ng o a collect!on o !mages !s stra!ghtorard and th!s scr!pt !ll s!mpl( donload the !ndu)!dual !mages h!ch can be comb!ned to II$pdII b( pass!ng II""pdII opt!on to the tool$ !mple$
"
?ctual documents here the text can be selected are hard to tacle$ . e eed such a document to th!s tool: onl( the text present !n document !ll be donloaded$ cr!bd seems to use 'a)ascr!pt to someho comb!ne text and !mages$ o ar: . ha)enJt been able to comb!ne them !th (thon !n a a( the( loo l!e the or!g!nal document$
.nstallat!on """""""""""" ae sure (ouJre us!ng (thon 3 (thon 2 !s not supported b( a e dependenc!es$ hen run these commands* ** L p!p !nstall scr!bd"donloader or !nstall the de)elopment )ers!on !th* ** L p(thon setup$p( !nstall Bsage """"" ** usage* scr!bdl M"hN M"!N M"pN BAonload documents and boos rom scr!bd$com pos!t!onal arguments* Bscr!bd url to donload opt!onal arguments* "h: ""help sho th!s help message and ex!t "!: ""!mages donload url made up o !mages "p: ""pd con)ert to pd &!x* !magemag!c xamples """""""" Aonload!ng text rom document conta!n!ng selectable text* ** L scr!bdl https*%%$scr!bd$com%document%55949937%33"trateg!es"o">ar ext !ll be sa)ed s!de b( s!de !n a II$mdII !le !n the current or!ng d!rector(
Aonload document conta!n!ng !magesO use the II""!magesII opt!on the tool cannot !gure out th!s on !ts on* ** L scr!bdl "! http*%%scr!bd$com%doc%17142797%/ase"!n"o!nt .mages !ll be sa)ed !n the current or!ng d!rector( .t can no also donload complete boos b( m!m!c!ng !tsel as a prem!um userK h!s !ll generate an II$mdII !le !n the current or!ng d!rector(* ** L scr!bdl https*%%$scr!bd$com%read%189087235%/oness!ons"o"a"/ast!ng" A!rector";elp"?ctors"-and"?n("ole"!th"ecrets"rom".ns!de"the"?ud!t!on"oom ass II""pdII opt!on to con)ert the generated output to a A$ A!scla!mer """""""""" Aonload!ng boos rom cr!bd or ree ma(be proh!b!ted$ h!s tool !s meant or educat!onal purposes onl($ lease support the authors b( bu(!ng the!r t!tles$ -!cense """"""" IIhe . -!censeII $$ H(! @ers!onH !mage** https*%%!mg$sh!elds$!o%p(p!%)%scr!bd"donloader$s)g *target* https*%%p(p!$org%pro'ect%scr!bd"donloader $$ HGu!ld tatusH !mage** https*%%tra)!s"c!$org%r!t!e%scr!bd"donloader$s)gP branch=master *target* https*%%tra)!s"c!$org%r!t!e%scr!bd"donloader $$ _r! ong* ma!lto*dlscr!bQgma!l$com ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ##scr!bd"donloader" 1$1$1%scr!bdl%####################################################################0 000775#0000000#0000000#00000000000#13407400542#0016535#5########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################scr! bd"donloader" 1$1$1%scr!bdl%__!n!t__$p(#########################################################0 000664#0000000#0000000#00000000342#13407400542#0020645#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################rom $)ers!on !mport __)ers!on__ rom $donloader !mport Aonloader rom $document !mport cr!bdextualAocument
rom $document !mport cr!bd.mageAocument rom $boo !mport cr!bdGoo rom $pd_con)erter !mport /on)ertoA ################################################################################### ################################################################################### ################################################################################### #####################################scr!bd"donloader" 1$1$1%scr!bdl%base$p(#############################################################0 000664#0000000#0000000#00000000520#13407400542#0020016#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################rom abc !mport ?G/eta: abstractmethod !mport s!x
Qs!x$add_metaclass?G/eta class cr!bdGase* ,,, ?n ?bstract Gase /lass or cr!bd boos and documents$ ,,,
Qabstractmethod de get_contentsel* ,,, ?n abstract method or etch!ng content o cr!bd boo or document$ ,,, pass ################################################################################### ################################################################################### ##########scr!bd"donloader" 1$1$1%scr!bdl%boo$p(#############################################################0 000664#0000000#0000000#00000013106#13407400542#0020042#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################!mpo rt re+uests !mport 'son !mport os !mport shut!l rom $base !mport cr!bdGase
class cr!bdGoocr!bdGase* ,,, ? class or donload!ng boos o cr!bd$
arameters """""""""" url * IstrI ? str!ng conta!n!ng cr!bd boo B-$ ,,, de __!n!t__sel: url* sel$url = url
sel$boo_!d = strsel$get_!d
de _extract_textsel: content: chapter: toen* ,,, xtracts text g!)en a bloc o ra html$ ,,, ords = MN or ord !n contentM,ords,N* ! ord$get,brea_map,: one* ords$appendordM,brea_map,NM,text,N el! ord$get,text,: one* ords$appendordM,text,N el! ord$get,t(pe,: one == ,!mage,* !mage_url = sel$_ormat_!mage_urlchapter: ordM,src,N: toen str!ng_text = sel$_process_!mage_textord: !mage_url ords$appendstr!ng_text else* ords R= sel$_extract_textord: chapter: toen return ords de get_contentsel* ,,, rocess!ng text and !mage extract!on$ ,,, toen = sel$_get_toen !lename = sel$boo_!d R ,$md, chapter = 1 h!le rue* response = sel$etch_responsechapter: toen ! response$status_code == 403* toen = sel$_get_toen response = sel$etch_responsechapter: toen
! response$status_code == 403* pr!nt,o more content be!ng exposed b( cr!bdK, brea tr(* 'son_response = 'son$loadsresponse$text except @aluerror* pr!nt,/ompleted donload!ng booK, brea sel$_extract_text_blocs'son_response: chapter: toen: !lename chapter R= 1 return !lename de etch_responsesel: chapter: toen* url = sel$_ormat_content_urlchapter: toen response = re+uests$geturl return response de _extract_text_blocssel: response_d!ct: chapter: toen: !lename* ,,,
xtracts small blocs o ra boo text and !mage B-s and r!tes them to a !le$ ,,, or bloc !n response_d!ctM,blocs,N* ! blocM,t(pe,N == ,text,* str!ng_text = , ,$'o!nsel$_extract_textbloc: chapter: toen R ,SnSn, el! blocM,t(pe,N == ,!mage,* !mage_url = sel$_ormat_!mage_urlchapter: blocM,src,N: toen str!ng_text = sel$_process_!mage_textbloc: !mage_url
! blocM,t(pe,N !n ,text,: ,!mage,* pr!ntstr!ng_text sel$sa)e_textstr!ng_text: !lename de _process_!mage_textsel: bloc: !mage_url* !mage_name = blocM,src,N$replace,!mages%,: ,, !mage_path = os$path$'o!nsel$boo_!d: !mage_name sel$_donload_!mage!mage_url: !mage_path str!ng_text = ,KMTUNTUSnSn,$ormat!mage_name: !mage_path return str!ng_text
de _donload_!magesel: url: path* tr(* os$maed!rsos$path$d!rnamepath except <rror* pass response = re+uests$geturl: stream=rue !th openpath: ,b, as out_!le* shut!l$cop(!leob'response$ra: out_!le de _extract_!mage_path_rom_urlsel: url* !mage_name = url$spl!t,%,M"1N$spl!t,Ptoen=,M0N return os$path$'o!nsel$boo_!d: !mage_name
de _ormat_content_urlsel: chapter: toen* ,,, Fenerates a str!ng h!ch po!nts to a B- conta!n!ng the ra boo text$ ,,, unormatted_url = ,https*%%$scr!bd$com%scepub%TU%chapters%TU%, ,contents$'sonP toen=TU, return unormatted_url$ormatsel$boo_!d: chapter: toen de _ormat_!mage_urlsel: chapter: !mage: toen* ,,, Fenerates a str!ng h!ch po!nts to an !mage B-$ ,,, unormatted_url = ,https*%%$scr!bd$com%scepub%TU%chapters%TU%, ,TUP toen=TU, return unormatted_url$ormatsel$boo_!d: chapter: !mage: toen de get_!dsel* ,,, xtracts the boo .A$ ,,,
spl!ts = sel$url$spl!t,%, or spl!t !n spl!ts* tr(* boo_!d = !ntspl!t except @aluerror* cont!nue return boo_!d
de _get_toensel* ,,, etches a un!+uel( generated toen or the current sess!on$ ,,, headers = T ,E"/"oen,* ,';?V%-'+W?exVt?/g>!0h!%s>;!5pE@?;/s/3FXocFc;cBhX%>dRC(C0t;%Y@%h/9uE2l.'o!g32@'<?Fm<52.FC2xXm.2C!<V!-/WC3(Xl90b2tlb! .6.mxFVB.YDYhrC4x@25V>>43a33d!93amd>o)nG-e5'd;33B)bFc9.!!c!.6.'1A2'1< A?!-/W3b3WE2l.'o('Y'2Y.s.n?!<'1A.5YV4As.mxhc3cm@hdEo.'oxVY'.5g VZ3AZ3A""434750b7295b3b626754547c2e1e568da3e86,: ,_scr!bd_exp!re,* ,1543629580,: U data = ,data, toen_url = ,https*%%$scr!bd$com%read2% TU%access_toen,$ormatsel$boo_!d toen = re+uests$posttoen_url: headers=headers: coo!es=coo!es: data=data return 'son$loadstoen$textM,response,N de sa)e_textsel: str!ng_text: !lename* ,,, >r!tes text to the passed !le$ ,,, !th open!lename: ,a, as * $r!testr!ng_text ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ###########################scr!bd"donloader" 1$1$1%scr!bdl%command_l!ne$p(#####################################################0 000664#0000000#0000000#00000002216#13407400542#0021535#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################!mpo rt argparse rom $donloader !mport Aonloader
de get_arguments* ,,, arses arguments o the command"l!ne$
,,, parser = argparse$?rgumentarser descr!pt!on=,Aonload documents and boos rom scr!bd$com, parser$add_argument,url,: meta)ar=,B-,: t(pe=str: help=,scr!bd url to donload, parser$add_argument ,"!,: ,""!mages,: help=,donload url made up o !mages,: act!on=,store_true,: deault=alse: parser$add_argument ,"p,: ,""pd,: help=,con)ert to pd &!x* !magemag!c,: act!on=,store_true,: deault=alse: return parser$parse_args
de _command_l!ne* ,,, h!s unct!on that gets executed hen called )!a command"l!ne$ ,,, args = get_arguments url = args$url pd = args$pd !mages = args$!mages scr!bd_l!n = Aonloaderurl donloaded_content = scr!bd_l!n$donload!s_!mage_document=!mages ! pd* pr!nt,Sn/on)ert!ng to TU$$,$ormatdonloaded_content$pd_path donloaded_content$to_pd
! __name__ == ,__ma!n__,* _command_l!ne ################################################################################### ################################################################################### ################################################################################### ################################################################################### ######################################scr!bd"donloader" 1$1$1%scr!bdl%document$p(#########################################################0 000664#0000000#0000000#00000014102#13407400542#0020723#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################rom bs4 !mport Geaut!uloup !mport re+uests !mport shut!l !mport os
rom abc !mport abstractmethod rom $base !mport cr!bdGase rom $ !mport !nternals
class cr!bdAocumentcr!bdGase* ,,, ? base class or donload!ng documents o cr!bd$
arameters """""""""" url * IstrI ? str!ng conta!n!ng cr!bd document B-$ ,,, de __!n!t__sel: url* sel$url = url response = re+uests$geturl sel$soup = Geaut!uloupresponse$text: ,html$parser, de get_t!tlesel* ,,, crapes the t!tle o the cr!bd document$ ,,, t!tle = sel$soup$!nd,t!tle,$get_text return !nternals$san!t!Ye_t!tlet!tle
de _extract_all_'sonp_urlssel* ,,, xtracts all B-s end!ng !th J$'sonpJ b( pars!ng the ;- code$ ,,, 's_text = sel$soup$!nd_all,scr!pt,: t(pe=,text%'a)ascr!pt, 'sonp_urls = MN or open!ng !n 's_text* or !nner_open!ng !n open!ng* 'sonp = sel$_extract_'sonp_url!nner_open!ng ! 'sonp* 'sonp_urls$append'sonp return 'sonp_urls de _extract_'sonp_urlsel: !nner_open!ng* ,,, xtracts B-s end!ng !th J$'sonpJ$ hese B-s conta!n the ra document text$ ,,, port!on1 = !nner_open!ng$!nd,https*%%,
! port!on1 == "1* 'sonp = one else* port!on2 = !nner_open!ng$!nd,$'sonp, 'sonp = !nner_open!ngMport!on1 * port!on2 R 6N return 'sonp
Qabstractmethod de get_contentsel* ,,,
?n abstract method h!ch !ll etch the actual content ound !n the J$'sonpJ B-s$ ,,, pass
class cr!bdextualAocumentcr!bdAocument* ,,, ? class or donload!ng textual documents o cr!bd$ ,,, de get_contentsel* ,,, Fenerates the !lename and processes the text extract!on to th!s !le$ ,,, t!tle = sel$get_t!tle 'sonp_urls = sel$_extract_all_'sonp_urls pr!nt,xtract!ng text to , R t!tle R ,$mdSn, !lename = t!tle R ,$md, sel$text_extractor'sonp_urls: !lename return !lename de get_t!tlesel* ,,, crapes the t!tle o the cr!bd document$ ,,, t!tle = sel$soup$!nd,t!tle,$get_text return !nternals$san!t!Ye_t!tlet!tle de text_extractorsel: 'sonp_urls: !lename* ,,, a)es text rom e)er( J$'sonpJ B-$ ,,, or 'sonp_url !n 'sonp_urls* sel$sa)e_text'sonp_url: !lename de sa)e_textsel: 'sonp: !lename* ,,, aes a F re+uest to the J$'sonpJ B- and sa)es the text to the passed !le$ ,,, response = re+uests$get'sonp$text page_no = responseM11*12N
response_head = response $replace,!ndo$page, R page_no R J_callbacM,J: ,, $replace,SSn,: ,, $replace,SS,: ,, $replaceJ,NOJ: ,, soup_content = Geaut!uloupresponse_head: ,html$parser, or x !n soup_content$!nd_all,span,: T,class,* ,a,U* xtext = !nternals$!x_encod!ngx$get_text pr!ntxtext
extract!on = xtext R ,SnSn, !th open!lename: ,a, as eed* eed$r!teextract!on
class cr!bd.mageAocumentcr!bdAocument* ,,, ? class or donload!ng !mage documents o cr!bd$ ,,, de get_contentsel* ,,, rocesses the !mage extract!on$ ,,, t!tle = sel$get_t!tle 'sonp_urls = sel$_extract_all_'sonp_urls # somet!mes !mages embedded d!rectl( !n html as ell return sel$!mage_extractor'sonp_urls: t!tle de get_t!tlesel* ,,, crapes the t!tle o the cr!bd document$ ,,, t!tle = sel$soup$!nd,t!tle,$get_text return !nternals$san!t!Ye_t!tlet!tle de !mage_extractorsel: 'sonp_urls: !n!t!al_!lename* ,,, unct!on or donload!ng !mages o J$'sonpJ B-s to !lenames$ ,,, donloaded_!mages = sel$_html_!mage_extractor!n!t!al_!lename ound = lendonloaded_!mages [ 0 or 'sonp_url !n 'sonp_urls* !lename = ,TU_TU$'pg,$ormat!n!t!al_!lename: lendonloaded_!mages R 1 sel$sa)e_!mage'sonp_url: !lename: ound donloaded_!mages$append!lename return donloaded_!mages de _html_!mage_extractorsel: !n!t!al_!lename* ,,, xtracts !mages that are d!rectl( embedded !n the or!g!nal ;- page$ ,,, donloaded_!mages = MN abs!mg = sel$soup$!nd_all,!mg,: T,class,* ,abs!mg,U: src=rue or !mg !n abs!mg* !lename = ,TU_TU$'pg,$ormat!n!t!al_!lename: lendonloaded_!mages R 1 sel$sa)e_!mage!mgM,src,N: !lename: ound=alse donloaded_!mages$append!lename return donloaded_!mages de con)ert_to_!mage_urlsel: url: ound* ,,, Fets the !mage B- correspond!ng to the J$'sonpJ B-$ ,,,
! url$ends!th,$'sonp,* replacement = url$replace,%pages%,: ,%!mages%, ! ound* replacement = replacement$replace,$'sonp,: ,%000$'pg, else* replacement = replacement$replace,$'sonp,: ,$'pg, else* replacement = url return replacement
de sa)e_!magesel: 'sonp_url: !magename: ound=alse* ,,, !ps donload!ng ! the !mage !s alread( donloaded: other!se donloads !t locall($ ,,, pr!nt,Aonload!ng , R !magename alread(_present = os$l!std!r,$, ! !magename !n alread(_present* return
url = sel$con)ert_to_!mage_url'sonp_url: ound response = re+uests$geturl: stream=rue !th open!magename: ,b, as out_!le* shut!l$cop(!leob'response$ra: out_!le ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ###############################scr!bd"donloader" 1$1$1%scr!bdl%donloader$p(#######################################################0 000664#0000000#0000000#00000004465#13407400542#0021256#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################rom bs4 !mport Geaut!uloup !mport re+uests rom $document !mport cr!bdextualAocument rom $document !mport cr!bd.mageAocument rom $boo !mport cr!bdGoo rom $pd_con)erter !mport /on)ertoA
class Aonloader* ,,, ? helper class or donload!ng boos and documents o cr!bd$
arameters """""""""" url * IstrI ? str!ng conta!n!ng path to a cr!bd B,,, de __!n!t__sel: url* sel$url = url
sel$_!s_boo = sel$!s_boo
de donloadsel: !s_!mage_document=one* ,,, Aonloads boos and documents rom cr!bd$ eturns an ob'ect o I/on)ertoAI class$ ,,, ! sel$_!s_boo* content = sel$_donload_boo else* ! !s_!mage_document !s one* ra!se (perror ,he !nput B- po!nts to a document$ Cou must spec!( , ,hether !t !s an !mage document or a textual document , ,!n the I!mage_documentI parameter$, content = sel$_donload_document!s_!mage_document return content de _donload_boosel* ,,, Aonloads boos o cr!bd$ eturns an ob'ect o I/on)ertoAI class$ ,,, boo = cr!bdGoosel$url md_path = boo$get_content pd_path = ,TU$pd,$ormatboo$get_!d return /on)ertoAmd_path: pd_path
de _donload_documentsel: !mage_document* ,,, Aonloads textual and !mage documents o cr!bd$ eturns an ob'ect o I/on)ertoAI class$ ,,, ! !mage_document* document = cr!bd.mageAocumentsel$url else* document = cr!bdextualAocumentsel$url content_path = document$get_content pd_path = ,TU$pd,$ormatdocument$get_t!tle return /on)ertoAcontent_path: pd_path
de !s_boosel* ,,, /hecs hether the passed B- po!nts to a cr!bd boo or a cr!bd document ,,, response = re+uests$getsel$url soup = Geaut!uloupresponse$text: ,html$parser, content_class = soup$!nd,bod(,M,class,N matches_!th_boo = content_classM0N == ,autogen_class_)!es_la(outs_boo_eb, return matches_!th_boo ################################################################################### ################################################################################### #####################################scr!bd"donloader" 1$1$1%scr!bdl%!nternals$p(########################################################0
000664#0000000#0000000#00000001105#13407400542#0021103#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################!mpo rt s(s
de !x_encod!ng+uer(* ,,, ncod!ng !xes or (thon 2 and (thon 3 cross"compat!b!lt($ ,,, ! s(s$)ers!on_!no [ 3: 0* return +uer( else* return +uer($encode,ut"8,
de san!t!Ye_t!tlet!tle* ,,, emo)e orb!dden characters rom t!tle that !ll pre)ent >!ndos rom creat!ng d!rector($ ?lso change J J to J_J to preser)e pre)!ous beha)!or$ ,,, orb!dden_chars = J &,%S\[*H:J replace_char = ,_, or ch !n orb!dden_chars* t!tle = t!tle$replacech: replace_char return t!tle ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ############################scr!bd"donloader" 1$1$1%scr!bdl%pd_con)erter$p(####################################################0 000664#0000000#0000000#00000002434#13407400542#0021752#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################rom md2pd$core !mport md2pd !mport !mg2pd !mport os
class /on)ertoA* ,,, ? class or con)ert!ng donload!ng boos and documents to A$
arameters """""""""" !nput_content * IstrI: Il!stI ? str!ng conta!n!ng path to a s!ngle mardon !le or a l!st conta!n!ng paths to man( !mages$ output_content * IstrI
de to_pdsel* ,,, /on)erts to A depend!ng upon the t(pe o content: !$e$ !mages or mardon$ ,,, ! !s!nstancesel$!nput_content: l!st* sel$_!mages_to_pd else* sel$_mardon_to_pd
de _mardon_to_pdsel* ,,, /on)erts mardon to A$ ,,, md2pdsel$pd_path: md_!le_path=sel$!nput_content: base_url=os$getcd
de _!mages_to_pdsel* ,,, /on)erts !mages to A$ ,,, !th opensel$pd_path: ,b, as * open_!mages = Mopen!mg: ,rb, or !mg !n sel$!nput_contentN pd_!mages = !mg2pd$con)ertopen_!mages $r!tepd_!mages ################################################################################### ################################################################################### ##############################################################scr!bd"donloader" 1$1$1%scr!bdl%)ers!on$p(##########################################################0 000664#0000000#0000000#00000000026#13407400542#0020572#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################__)e rs!on__ = ,1$1$1, ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ###########################################################################scr!bd" donloader" 1$1$1%setup$p(####################################################################0 000664#0000000#0000000#00000002151#13407400542#0016624#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ################################################################################K%u sr%b!n%en) p(thon rom setuptools !mport setup: !nd_pacages
!mport os # __)ers!on__ comes !nto namespace rom here !th openos$path$'o!n,scr!bdl,: ,)ers!on$p(, as )ers!on_!le* exec)ers!on_!le$read !th open,?A$rst,: ,r, as * long_descr!pt!on = $read setupname=Jscr!bd"donloaderJ: )ers!on=__)ers!on__: descr!pt!on=JAonload documents%text rom scr!bd$comJ: long_descr!pt!on=long_descr!pt!on: author=J!t!e alhotraJ: author_ema!l=Jr!t!emalhotra123Qgma!l$comJ: pacages = !nd_pacages: entr(_po!nts=T Jconsole_scr!ptsJ* M Jscr!bdl = scr!bdl$command_l!ne*_command_l!neJ: N U: url=Jhttps*%%$g!thub$com%r!t!e%scr!bd"donloaderJ: e(ords=MJscr!bd"donloaderJ: JdocumentsJ: Jcommand"l!neJ: Jp(thonJN: l!cense=J.J: donload_url=Jhttps*%%g!thub$com%r!t!e%scr!bd"donloader%arch!)e%)J R __)ers!on__ R J$tar$gYJ: class!!ers=MN: !nstall_re+u!res=M Jre+uestsJ: JGeaut!uloup4J: J!mg2pdJ: Jmd2pdJ N ################################################################################### ################################################################################### ################################################################################### ################################################################################### ###########################################################################scr!bd" donloader" 1$1$1%test%#######################################################################0 000775#0000000#0000000#00000000000#13407400542#0016072#5########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################scr! bd"donloader" 1$1$1%test%test_base$p(###########################################################0 000664#0000000#0000000#00000000337#13407400542#0020420#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################rom scr!bdl$base !mport cr!bdGase !mport p(test
class est<)err!decr!bdGasecr!bdGase*
de get_contentsel* pass
de test_abstract_class* !th p(test$ra!ses(perror* x = cr!bdGase ################################################################################### ################################################################################### ################################################################################### ########################################scr!bd"donloader" 1$1$1%test%test_donload$p(#######################################################0 000664#0000000#0000000#00000002651#13407400542#0021316#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################rom scr!bdl$donloader !mport Aonloader !mport os !mport p(test
Qp(test$!xture de cd_to_tmpd!rtmpd!r* os$chd!rstrtmpd!r
de test_boo_donloadcd_to_tmpd!r: mone(patch* boo_url = ,https*%%$scr!bd$com%read%262694921%?ct!ng"he"!rst"!x"-essons, boo_donloader = Aonloaderboo_url # >e donJt ant to clutter stdout !th boo contents ! th!s test a!ls mone(patch$setattr,bu!lt!ns$pr!nt,: lambda x* one md_boo = boo_donloader$donload assert os$path$gets!Yemd_boo$!nput_content !n range120000: 160000 md_boo$to_pd assert os$path$gets!Yemd_boo$pd_path !n range350000: 400000
de test_text_document_donloadcd_to_tmpd!r* text_doc_url = ,https*%%$scr!bd$com%document%96882378%rademar"-!cense" ?greement, text_donloader = Aonloadertext_doc_url md_doc = text_donloader$donload!s_!mage_document=alse assert os$path$gets!Yemd_doc$!nput_content !n range1000: 2000 md_doc$to_pd assert os$path$gets!Yemd_doc$pd_path !n range20000: 31000
de test_!mg_document_donloadcd_to_tmpd!r* !mg_doc_url = ,https*%%$scr!bd$com%doc%136711944%!gnature"cann!ng"and" @er!!cat!on"!n"!nacle, !mg_donloader = Aonloader!mg_doc_url !mgs = !mg_donloader$donload!s_!mage_document=rue assert len!mgs$!nput_content == 2 !mgs$to_pd assert os$path$gets!Ye!mgs$pd_path !n range140000: 150000 ################################################################################### ####scr!bd"donloader" 1$1$1%test%test_!nternals$p(######################################################0
000664#0000000#0000000#00000000764#13407400542#0021511#0########################### #########################################################################ustar#00ro ot############################root############################0000000#0000000###### ################################################################################### ###############################################################################rom scr!bdl$!nternals !mport san!t!Ye_t!tle rom scr!bdl !mport !nternals !mport p(test
?..X_.-__?G- = M ,good_t!tle,: ,good_t!tle,: ,&bla,: ,_bla,: ,&&ree_as_!n_\reedom[&&,: ,__ree_as_!n__reedom___,: ,troller&S,%S\[*Hhaha'o'o,: ,troller_________haha_'o'o,: N Qp(test$mar$parametr!Ye,!nput_str: expected_str,: ?..X_.-__?G- de test_san!t!Ye_t!tle!nput_str: expected_str* assert !nternals$san!t!Ye_t!tle!nput_str == expected_str ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ###################################################################################
################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ###################################################################################
################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### ################################################################################### #