From 05a566c275e9621e164ddc51a42116692272e49e Mon Sep 17 00:00:00 2001 From: ingkebil Date: Tue, 1 Apr 2014 23:26:35 +0200 Subject: [PATCH] Added OPML support to the user_profile dialog --- resources/images/opml.png | Bin 0 -> 20577 bytes src/calibre/gui2/dialogs/user_profiles.py | 62 +++++++++++++-- src/calibre/gui2/dialogs/user_profiles.ui | 11 +++ src/calibre/utils/opml.py | 87 ++++++++++++++++++++++ 4 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 resources/images/opml.png create mode 100644 src/calibre/utils/opml.py diff --git a/resources/images/opml.png b/resources/images/opml.png new file mode 100644 index 0000000000000000000000000000000000000000..f4457d0b517480c9be8590f7f7ddfa0684d60237 GIT binary patch literal 20577 zcmV*rKt#WZP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^l0 z6(I!wk#cAN03ZNKL_t(|+U>n}d>z%9KK{Jt-m7NGMefF3a>F*5X8IB!Kq$7UAt3~t z1hSjm?52HFcatr@WWU)>vYXv}mn55lMM4rt0!U6Egz5mM+r~Dok{j*~+mbBlmU(}F z%*?$rbI&<*=IV}QK=b+Nb9KwKGv_(a+h1T{8`uW6fo)(L*xsAlKmF6d7z}JD%|`E( z3!QQ6&nhxKq9($0Lv7LzD1ZWe0EwHRjt;_Cgf6oG@Vd2jz zh{VUi^hpNKA|hgj0D*`Z4D#WE0j75lBMxklh=z$l40|nPX6KavVg|?}W@gZOBECn6 z%+EGIe0Szu37E!(OVQf0#QuL#(^Pydfk28zGXDq9>%jKzR1C=TC&iTw zAK1Y9GZ-xZKh)Z?WE%iXThxRt&5PgJfN5CR1Y&Cng!mDduW)F?4-i&dQ7wSM&TBP* zDgY?}2@G(}yMR`Z1CRmG4WJ7^2Y}sC z=NSA^GtX?BngPzxswF23qYI0ItTyIm|wN6W;vIUH!~3i3BW{PBL9%-&Z+yI;l8$&)){lt^N|7TnC$EN&un|K^D6s|=b5+*WP;@4 zntMLW(R0?>3vGT8Eg**h{IIQM@n81~!!#~xLTmG4G%jo!3F2p%X|}6(`E-==0A_gf z6Y`5&)Wg702JN&!#~3UC5~K%1uU@&Z!g*&ZMPR5>U-PTF2P_ByrB0k9-Q<*mianq) z-6s?bI&mz2JP%kP`F-%*kN`=LBYKhlm|n&a05$^H?TG(A&6$arR)cUwTl3;Wjf<9| zwRuV3F-*gvrPB%YDuW06)=3611i)zyyTA_?7WU1EjalFbKp6)>UPoovtIJd(Dp;JI zgJ9|Ht9KNIZguuDi|2uxOiGTCSyZ0|MP81`NF8Wgi`<=fryDP z7@*A!i8bd{hvI6)9QEMThz$_C`rFa`;GjUS6VZPG4#s$lxt`!|eXuzpDpV2-NW(i)iidk53+@P4} zEbtEEJJhgifFHG7j5w%WEHVx8VRTbmpiF6<2v6dbD9t(|iDESh%#j4AZz^=}Z>b zV9!C1+*k?V0!PW`0{WQrAmxnFVDM!&vb! zwXA0kk)>i5RvbTUrH9^}?p5k7cb=+PiOa)e#d;NaR(R5z`*k{t4lLf^bHE8|apC;T zh2JKeg}tt@k3C(9nd#Z73+}4{fVo%PS2|#}KVrw>2ur*O@HmIeD6d$Z<39pBjz@YW z3+!dvzoHXmbfS`pMMnn~5$0tsg9yknG03*~xjq&Onm(1QvgV#u)+15uwP(s(?u+;3 z5QBlqK0$Gb0~V}2Xdw62tGxFn1`v&oSU4tm-If8zsAG^yc?<#e-*^(%^8m2+i91RI z%=CiZ@@*!bP5DvrSRve-at4jM81zyO)XCu{;wYYDnefOmKsbXWNNrT0GBAq*ROAB- z7hBa>0|rt|N`(7Fyk=we>MT*s(_#C_lyKqIC%704BzYeMEKA<2j-g_^qGLEr6HE^w zXYN*b4nfQWI-_CX(*J9#ANQ7~!!#~jI+cmq$SdwKfb(HT6??BE%b*u?wwJyXutYKK zO7$Er&@w2*yRTt2D%C>gXBO$ihek&*@#stTHS*qbh?rHXWiHHnuhUCN!8EExMMw++ zszoOsN<(VLZaaXNeBU{9oF}!mEZG?eFq3ci1(Lb03Z{xZ1Rn1D*<1jlQLt4q13dt} zma{$gg5m*-_BEj3s~%9;#0&$I!u!wpSC2!o93dqkj8McZQJtJX862b%u$Y1Y2sa3* zj-k9>&j;+0m4#%%+6OzFCU0D0fapL~Ma3y6daUfWmXCysWDN`M!}f=72UEr0`@mv3 zCc04tu;l$gYjSq%SDauG5>qa5!78E>w}j?%of0YnuOZ@Gfmuk+YC5N9M2BUNSqK_W zeV8a3*+I$y1z%#i57S|QaDxCVOwmx7p7R6Zv8(4jw}Jb%oQ1#MdppDgjOy-5e`Qelwl@a`Kx5Ay5|Hy$-F355|^`8y>8v-bczTh;ScVW@bT%LeB=)F;y&C7_-PMqZ|lx@ai}T$+bQQJ7|;g z=7OHeo}NML|M&^ZNa;^ir+>?gRQ?bIJK~u9PD!zoLB{~Z1r}9k3^{D3W0oi}V5G4E z>Glz#@Z7u;M`*-26K2uuledP60JESM=PL)Z1eNu$Wtj|^hC-MnzjAxQf?}}1!!lOT z937b3whf@Fr?T=_p*qa;g+E7*tW$}3EtBItaDyr5`$aKoXNXs_j&4PLtFs7a<_Ly1 z#3m-=gP&Q@>kyXEm0qGVu}5t)VWpDK$C9Xt-~yoneP8G>-j&2_-{$~}ct5L<9Ped# zgEbipiwScmM;lvze@8J+r!V*=Hn)5f#P}GK6QSdt;B>ziA2|lSkpl~|!|}t|LH3<6 zWEPU>EO|dm--5*zf$}-zI=vxcup)!O%&>@IfnhoSyPvc3Fx+`T5m+gdSrE1l`+Y1y zW>NY?LYT%Rhe^jQ9`~bma2N=cHB# zFfbj%Fto)al*NQugvJ!l9({#L&Lq0mtmD9R-&X>d06T*dPE9oMrvZF<^R`uT%r`7- z`ZN)L&#p)4e0Lt~Vim3^mS%|Oa$v!FQ7lTzFv1jUE;z@C`-NHD#4leMhGZf#Gjhzx zS{4|<=pi*2H*^rj4Xwr4VS_Mk=pdXjtQMyXtHp@gY7DKZz@W+sm~O|qdT_L>2m6no zz@B5B*nPAEdyaKt?{WKe&+$$i?(9NB2qY5@pn`@G6SFcT%)${wC}@;?6Vo$P&g6h{ z?*)s=tM~t^z#4ye^eZ{UH;L%;`Jc<$kdNT(IE~E@c4!4Iq zc?cTOMJR%rNMms+7g&T{J*Y(2)%v;4J$zL z-c*N?9fJb;N^iizumdqGJ?C_5;I*TWyF&OnfFJp$PvZ?uV2ft~SVceuK!hxSi(prF zanH~V(95~vJoIwBhA|5`9usm2%)-pbSQgUR9OjH4fwLP%jy!T*nUuy!_ z)($(WIhh~M9)RZ&B{#J;-(I+k#zjrHfpLHSlR=I+=H}oFI|7;ZSjDwqTk{N|7 zfjX8F2Ht&XB(fccWC`K;JnT^xL`bCsK6vhQ{LK~fFub;^Ux3k@ZQb5OxM#&0Jlnbp zS+-y~ac|_Bi-jmQ8%MEx0cN2rVfvJSKe*G*6EO!#7+BZ=MpXdBFTyV6HO7R6v|f8#M*`cOe&uk7W^*b5zE|d1b`ida})S_01x`6Z{wn+?F_2TOG0NMpKi;ZLEm$H;rGWXnDVANJt;Nn>m z@UORCfV%1mJ9;%QCB8T6I#(nTIA_9W%%3<0Uw+@&_~K(PVEuu^=+5SB;Dk9G8EU6y zn7D?3Ia?-%$=HGvK=Qs1hQxT^TY=*w0SpCj%zp4>|NaU9zf3xma{+mylE)Md$V8yG zEj#s7XzCb4v#Ju;}|hmT%zDn<>iDLljXXs0uBQmd!b55aFf zat*c|I*NZ={u-8T+=jZ!RKYy0GBu+&I!rL;M^XGw7y1(Q)pE!|c;1h7L^CJ-p6$?M z8!!Z#=ew@qo(o6-VxLo$GStDS@rP(ljS6Ndd*w@bvK8!hXXj5Ji+}ylMHoN4&d(@# zZ*ShkV%mtI_{mN0$IEZ+!~gg6D|qw3VI+v;j%!^dm{5a_C$B~(W+8@Gck6*Sb=hA5 z$@Z6@k++gDc!ceCAVSJffLwE)MZnvZJkSpYD+s|L@k_xhs^j-kJj+@ZCXA@V5AS+E zW}Y(4R`TB?I!bT+JLgUqgNJUv7R$Ho#wVMf&M!LB=MU&(*os6uPnM)gV(}{KBoVWE zV{T3d&Qs-}qj0UG0e~78F0BO63L?8sU={4@8m@ul1Vg-L+W8e2%05=MNDx5?ydkZ%8?&N62A{YiimWurQu%Z_Pc^5L$TW6RUnVf}5BM0M; zU%fF8miLk}UvB-TGMU7GU3&>0TYNq0s!~pRuVh|O*!=M3-%HHKsyS9pu(+?ez|E$- zQ;Cv-6BUAi1be4iGB7}0oDU3@PR>XbDczJ}NnaL(04XR2{{{kr@O`(zlDq5sRc? zcIv)5caaDh<~^&hP@vsNrwFFAMl7!1|va)2S2v}SDZG<G;|8S0EvTlT$>+I)m!HDzv3klCFARioVlZ@4sYA8jE5orYK6>GANZ= z3V0NjI0j?XkQzMo^_x+ZN}hCLn9M4d&f0}7(pkI6MQ2Y22Rgd2zx@PGWU}bWWRbHh zR3sCqOeQe6ssf{HYcR5|2Gz+#{`2Zo63IXs@yTQbbU}0egt2J;@OAj`Zyv{qOvX+T zDJ9;k9AGf<&GZT|VXWfw&Ibyr>8i#=O>>s4E*2Q0hSp%&m##-uDtS^(mSAGp%AE)B z=eAvVW&3^{Inj;dJ!y2NGdSS@hup{q1o{Daj2Qq>ol2snB8fp2DGaWzz}UK4oIhy{ zE}1$WjU$Hod?Y8sSh%2>J!&|9_n~XB;1|n~wXEo%(J>7A1}p$T(-t%hW8#e<8U?`4 zw4954ZZ~bTTY`rMMMC4fk6IAiuuSVI^|g5F>$lip87C2wbZ4^Id#n?$?L2^GYq#R5 z%{##iR3rtGLiiK2WcO!W%9Wk|sEkZ5huX>%uAMmr*UX%ZS)=MPZg4FU;^bOD*6u%y z4?pl2y0f`((DZePOa<()es_%50yvoe$$n;<5shJ#L6HGwQS~*6nlcQzRfLIAkxJl! z&t3;1`ZsXW%Or<8y728MUdMB7yYcpk9&~53AR<(!l7%WeWv!lXmr<&8>Y6b#mTlOE zmJQobTbaV}nkw8hrxAa7?p&l2;-p}jxub{UHy^qNS2r~yB@*Vkgvz1W8-_uMS-B*J z*`#9_MU&SkuTk|H0_v(Oue!_ZoqBxX5fr*qmW97ep_VR^FFqD2mYq{86-&PnI%q!3Ho^| zVW;Jnoni71Pg038mMSuZNt3lK+;i9E7(1-CUmm*moZorkbu_)S9^IK77>ps+mGW^4 zYo;331Xj9_qBA3V_SA$XjKKicImmeZq}6kwVq9%gl~P|LVR}F zbEt8QHPTg{p%1*(J}il)O$8RiV<$@ji`OA30zD;TEZ>^5EPU%D7h`_on0~W{b*8iU z^{bokKg-|1;m&SUCKJvAPvM4&sI9%F)$>VS21%8q^X>EuHK9!3G-qW93obQ?H6Ww(`;sfZ4nq;F-#H@6cbpO z7$3WAE^a<|TEF=|9$M9kv%c|5{M(;iLwk2R4;JNw7l_v5GH4tLYmXPUpCrVd1fjOF z0y~ek9Z$ut1)&8sfJjNwC(v$!d=CwM z&MaBBFlXWjeD#L;eYOg+$I-TC_aWT=)5q}H2cNYo>NCpMO5CI!cu_%cP4#>zbi=^$ zT}C|6*@a7f@>_iVvFC84tEXQUqTk+eEk+Ki?wy%g2cl9_0(!?V0R_JgnPtS_YW(W& zuI;lG&=yZ@Q2b!|8@S<~Wq5h}exy=Kf2)adwe}9OxUMftZ`*YTz$=JQlT4y{V;j!? z;ji#y+s-~4XLs?dtw`ZpS6_g1E>|24Pzo4&lWf*&!1!wIQgPy!FwuEXay;3Io(#Tm z>xHOHCD0e8DO_28*W2y5;Rh}FzmL6&L_*}-jl_|qA z9a(-1B0^FK-1W$l`1GU8aUzrPu|V8oere-)eDTt=kj+`8GYj{US<1&SgU5PJWe~u#t#LF%{*&Ob=?+L7a>!2OdA}DVFRIcJGmMEE7 zSk5d_+jYzK5h34e>m)lpafHB6R=$a^Jn=&8h5$GA?i<&gXNzVQ%b7)$Y!+k^85_yc zmdloL8HQ?=C8HEGGcnSZgRW%Tz zh|J;z3rNi@6r!`}bQpw41lnVI%C<72CYi#6Z?@uVPrVeoPQwgbK79ff%$^cHhuLu6 znwpu*qx45)n22Cu2P{m4`r0adWzqaT@dJGJf#q1Y=dhhZE1+&A9tX2P0v4I2E9jdE zV+GZd6`E@*I)=B#G3BdK3MTyQ_4WA9^DAQo4LNNQKX=&~NC^=w?O4S|CPo3o#W1Et zDGXnU80>V~_~xw_#!CBck%mwG>KQz~eg~35N4cnT4JHnM{P9OctNK@-z%` z`;Wx*5SDM=g|D})K#~X+c?!ly%5;QTcBs;lCSew#VJj0q42Sq($dFmQ*QJ?o)u|*t zv+Oza<4tp@LJsY7qes4S-LV=eCeU* zQISm8jiO}C5*8e(TG_+&1S(jad=baGaH*p>W`H~k3*+fU>R zE*gd1dl>)-ucD(0wv>+sO;-T)HA4Y@>zHAao6@2o5g`IpT!u#h;j8)P9^{bn( zqHQlkLiin$tYL{LVwU!^KrV}pxmaNy=8*Hq+I5GSo>i?TB7~s`CfxJl8tiZHjMWYB z?HeybXHUi~=#oS9@c@vB3$d={Q~JZ$MyBr+F^esN<>!bXNq2 zBh4I^hWEkFZ@toTdCkf?QA8&axXj{Bg>`;&BAvxIZn-d4QS37hJd3@@JJrl$Vh)bN zEHGpigfNR?7NvC2QijuTp^bM~6C*(19wI-92yY#2$8X-)63e3J9&^EIQ|yJ;gbfUs zQnmK=ompAx$n-Fa7c9;`r;e}3v@t_t6UW}zbr6rO-+_u`LLD#(jfq&*D|5d903ZNK zL_t(UWEK?e8A8aJMfU_K!h0FhK&QjF09I6L@vg+O5EI#o?tCYh@ZZn95!<52%(!gk z_&h5Zo0lby%sjKOr%G5X3=`(K3|zE*9ZtwefLYu@xcc-dzEz~00}KE^`16`VxAdqi z(VKk$xkHjQ);FE562?FyUgkQhB2`z`=7Y~NmNxNqp<{Qm?eyHz048>3u}~f zQ)UTsP%6Lke88G#2t!dvH8&W@G4T60x5xHOZ#c8T7O!>Jrjdm5!3-QxdFho7qh*+a zL(&J90N^qfW8oR`6q93SY}$VWtp|_UwS^<;9~zy7LKO8V%t9f|qGBUbi$qdp@%nt2 z%t29dpd;hQE7rxP%cK$lr;i_@zb2M23jkpSzyd@rNM2SQhV!oyW(fc;oz3Cn@0$~w zy!+^z+wGt|7%+>e=%r*OmV56_LRrdT9aEaTT``Q!x(Jujazes}TMr$>A2;lX4K!y? z8foXrAY|fuOSo}h4GA)8EWwwu@O{_d;xLOPgqm4A3*4~UO3WEQA~sp~7cXyAhp^~E zT||f|D%E#9l_*Vg7LS9G!N@VACzr#CbOznIECdm%QV9qm^kj25kD9 zfXl}$2EH1y2vw;hzW2=P*cQXHCXYgnx!AfFU=FsNVX{0ri^_jv$S}!X!7Bee7zDE0 z6b6|^$VH)9E*tFq911_iSO#V{dJ#1#%ihTXt+ z#>io~adsmvoHP#8h7ZYC`ez1m%-C}HZ9KnY4<1_IiY{wtdB7Y#G zN_2CQgJzAZSK1MJyZz7d)u{5em?)*jvC%%lpIR(5%#~Lq>`c$|Cyd37a~g4Z!vwqP zV?YOUCs_)>+|eU2ck~E+a{g)9-*Ey@ZrzCo*KNV8yZ57}A_;Om_Ce2VsbG;=-E;ws zl6^aSGFY?w5GD?*E4zL=qOKa_h7Q8P_AUsJ94sDdSP@u);$#HnzjU**!*S#dbqTX5 zX;*HjWLzZBI~xMc+X%|r&4(EwrlX;Pbr4OEJ5WyBv{d63o{*tDfjl)k#=#QL{F7l2Z?OJ<%@l!@tO7UBrZ5}VQwH(rnZL6i~d3o{s&#W;1` z@K_YWRl5!%>sA^uVHOxNOR&bVtRT1~sFI116av4z^#l0wC1)d9rWShMy2Sr@$+`I2 zUz`KBJaxmu+B}rIC0;;eBenx;mv7k}%ffhW!)Tv4R%8K_F^greP?VEld|)YoS=_C@ zt{Ro8L@cSTPi@*+$e;vD2$+Pv)dZ3Lxa^qVK6d78{BYrA zg+4W=ed)_#ZdRC=D?|c+Si3zIKU+mIf#G%4a%N!-vxMDyxfsR^79b>3QRDctz?eIJ zcx(#)%iH&bJ12FSlSKiVni|I{@3N=B_x-ni0OwB}8*8~+SC4%E)Cu_NU!09hHWw`i zzFg+zfFm<01lH_27|Z<%L8z~()H91L2vfyCMxABuBW!l+uq}y zIM$OcFrO-dCuIv0gJAlgR`}F zXVBiAF8lo^h)_SMGM{EHWfqmAU8ZxDlVP;X;ysc<>aqpf2NTEk`p*4@Zo#s_Qq_N! zna?=_vv9HLxS@Us{`vBA`=u4$U!OY{L#r#pd##iTlCToP&HltYXIvej7^=qRz4rLz_eb#%uv4kK!-U~!1K-hzj{ctwv7=V8nFU{}JmOJ;6`c!9CMXtja@MkJZ@26kIpiAi`SzZ07g<#om2B*} zp|ejJm7lQG&n$E5=z4!elu}EkMrqeA3Di7#BA)Kdl}S-3+8GR}lrf8?F+Z0zML9}+ zVb+*x1&~OHSR61G+mXMKnZ={0dCY?Hfu(RAX2ytN{ieIfKr?0NVDlXKau@|9i`duM#t*5* z$+XQKJED+C7bjShHNXhn>0B)LmK4HYMMiZGI@XC;XDOOUCbJxcS)T%*%;G6>UR{xl<=)ac%NG-?G$Drt zTSf@L6p@y2T?b&DS=n=;Su38#qJpRZ7!@-L&&8NB3lJ%bvJcwYN7`~$KZM8xR`u#s zA|AlF)nimvF%`3fWnPwrVSorBC2Cg6u@%eUC51pTA@nBXU?s|OF^lJYdr$hL0?eV# z?tf|@%44F+~1*NUA7n=#bGH+!7jU5S=RzW#VnqE^4IH> z8s2j(9?$QLk@a>pkuYW{wOx0Z4g+A--h;^GtbR8uGc(@Ydn8}&Q7Ng$0QM(5NT7GJ@2biDO9JDvD9xk-j((z z%#lX7>SghZXbfXoGF8Sbo{kEx>37|pL$OSf`4h(=oy&Q`_(Q7alY!0>rKu_d6-j}6 zSFT4om+N=2?7`Kog=k(`)fbbr}YsRmmjCBDpNz2fmq1mT}J1 zQL)^kWij6F=+T$WlGP;xdR6%{TA3vgqT6_?qX(JAJHd|kWY7_lzvA*~6CF{I!u1cC zt`g>lF<>hq!oH49+|}}AUX|)Aun-Zx`S`2o$>#cpSv+RubT)@;=S_}9KkG{8aHzej zSkc#c`hoC7va*O|8h`{>X!e+pNfNU|jz@mOzPDqUFsF?ffs_!%8K5dwAn4n53j^zz zHnTo!sp2rfV@myya8?M(&o^$&ng>}R zZNT#YQbOR_ZM$*hy^rAky;NYEs1wT7RTzx#JiQVZeeXATVe4Ky@YJLoA1TDI-sbpw zUM*%!9yu7}hSkPmT7PZJfkMgMQq0P_YM61DmDy7b(+3s`D9M^k#g23uuk73(o3G-I zGiRFVAF3=$3b_xN4#T3j@v3JPPm;i)&Tf3?&nq$QyZ7Pet2SbPM;E%YW(ihZnJo6V zcj3n`y@{FM{008!`88IPxL&^nxT$|%ejISj*VsxT;(L}w<0gB{)2 zc;IcU-hB`|kF;aY@lJI0WRVbrBnkC{R(4cI@51=CV6lf_&iLWDVER~;6nhe~ZUexo ztp^JhG86s8lxvl|tDn`A=Z$t^pP$ytSJm1R^6r_>L@ym2G(@>~1- z6N@y)44Dq2vWEG-cQVJAj3*v}kfH?ASqs~bv}5a$<9KSzTgc_?+5~P4sQ~4{K|~;i zU;GNIf>Q3+5U>ykcV9kRGEilBt^hjIIjr4w7^$RCrz4YuSqS0!PFX}UPk277n8iTf zkxkA75nkT0H#Sr24{x{(S<5nSqN;1cDizlPH{Xj@Trivb>?6-iL1XlKK<;!BL80jirMhwtgzBQhhD`v*f zs!H5?+H@zj3~EtHr^8T)&H@zI@U`NZn4zy>HIK`DP0R(uAi*vR`-KH(Vo+5oHr@0` zkFE7fB)zSC8Mg400vNCNK61rN8E8BqB#*A&5sP`*ePExMKgS+7Q|p+fBEOGW*rUw# zfqoGARauk*(d&{aEM?>Y3mBL^emL&D^wijt{nc9!;>hvtg2Imw-317*)*n%a2?dNR zhEZruVi*T#de7Q+%^?mN*=jq09p4E6Qm09h6GpAO5%kac=*3 z`MGGQAL_457R3)!#4IFdmU67(fO%Mo4h$6HX9$bb)g+aX2Q1`(WzK{VxcZEEbQkxS zEiZ4itz)LamSM~iYvoIw5@`Y!uO-d%y%2=f!$;A2=xBU#Rsg>E7iZZl6J{M##gh4g z=3-pMEd#LV%AkhH?=qms3RwU}No7H1ag7jl)fM>pr>^jc!sTX{7lrccK8v!>csGn0IM-%9LUtgEv?v!b!# zDjuaEcyHQ*n}FGXA@fyuEiY*7yp+#gdj{&ND`I(W?tJ)a(~B5XmDE?SGyy{|D_@#B zK!mxNW!%~u1)b){FRzPrg<@v>$JLi$^02|``zR94+*zXVvse%3+I-kb zsslv`sMsrpdB!S}wQ%{I30Qo|tXQ*4SG66)p<`Y08e~x&mnH$4WdV#17-7t!-G@OS zyxrA)aNR;4kO5cu9Tmmq6d1yi#!x5ZQFFYka-JS3Ag2Q7Lr@yp39s%ul|K~iRM zw)PWgeC_7>IB)ux*qcVJ+kO~pw;#4k-I`S1C+OqpRFZ+@KFecPR!J(d9xTdgnI2{d z6a*&_y0bZa>9Oa1t4v%g*w-&P7Z*($hfFS4ocLv;fLkzXy9Nclq%-F#~MEKVSUbB1KsA`O_n z^!*Q;wqtL5C*s_Q>?q)-8?MBnnGJR~-XPne9 zI)lG|d_|uW!Xp6xan;3m|I~>{XLAL~tkhN9)DmTdOyE-6fh9MtMcJ3{$DYuyvMc>z%%W;yBx4p;F+FDz zSELg7&lgsry(isgHH!bwg=gZ+7oUX$sL=o2Bz#4-iia_RtoVcpSS;wP=a=y6P8{#E z$Yw1JuCB!IzHlwBJZ)m1h+#y8*Ea9Re?7FixFSrLeqvbp(hC+}|6i+|fDthF+WW#@ z*e(d3H@%SFj}tiF!Okvx?$PIB4VejA&+a~Z4j%mQH6Sl&NHS4%tGHTI9~hfTXE^s@#xHC z>yj z--@M=ueZzmLd_ES&vaogfqmKQcnzu*s`tJ2!)o*?N#n&h5-v@Dn<^3*YWa3_eNnBsF}sPB@zN}9c#zm zKe?h$n-sZ|X2Q@~{O5v;@$1_@fT2~D`FN_b=EcMT7WOj>!FJG*ld>R)FyoYASoQ7O z@c9L2qAI5L;JWc;1{Qp+1sx|c;mi^oAwP)bmX=8k=eP6OS5#ewC-!nLHw96I&StBNyhU^ExLMn4~3E7rrfPn$C z05-D(&Bmr}B3NQTkPKKdA@JQ7R$|78p}4YfQlCC#_dH2KxMtR5Tr+Dje!X%NzW>5n z96WvkIg6cJqVj`9<)kBo1`^uL!e9%itVm!&eI35}q4RNOpwUr(faUwmZ=mJHt*EI? zg|`Y1Q~nV!#>&6~1z2FN^qW_{R2IPVw8!&$Wy6@or2MMH|C34xeEQMlc<95|Vb;ic z^!4VQSRXob25vm95nB!&#gA9KiC?eWg35%jWpUGL`6v-AI-iZZ$}%IJ&7mfh#K$h5 zjhoMF#MIG4`h`(~VEN_KoAAAdR{6ogy=RuZkHu5i$B0=B8HT1UXd1@E8$o0*IU@ng z^&G6*0%@_c zZX}!rQUo#!=g?(phOiMcBbT#37(KWKlSb6x*7K+1#`z8X3XPHtp|_dcdOdavSureccqaM0?CAcKuD^yae|j!QZ|#d zkj~~XzP=W>%%6tq&YX->hSg$dO=Y>Owf1^^o_})>?*5Obkj+`q>LVL~iP*n(8#9Y* zey%SUU@Qazj!4ZcVIo{9Oru~cCPr;V3d?R=hzUdL`h5je0SEwg9BIc(TlZn*&I8!> zb_Wi3bmLf8500NmqoXH-T#lU;l8RP8c65+bLZGgy0z;}RFtoZ7!|SRrWyD~dGj%l1 zpEd@=230A~e=>~4iuHSO`?nsqvoyV6K}3MSkXdw{$bySJI}9^d4;V8mnGP($CQ4yV zReQ-S-eV9EI?@?j{flNid*@9UQB#eRWeZN$N%eJ@R9}Z%&z=U08JV1goMjii-?WikOE;iMBVhSpSK((u7$1?kBGmPb}>#bKT?J|P}9p`WiNsuV-{VzZW9kbg)j>c+NC%@ zTAqF@cRlhHe!hC+yK)k~Q-I>K-PfC5#8-a00tAH^rb=~?nc4$IN6Bk82K1$HO*_by zMI_XNs@_RvPIVlNJEywuVX+ThSAET&ZHC?k;2<~e+;a_DEB=F#xE%?ZTk7Mug&UciE_D%=OYnuA&TXw%KulB+Uu!M+c z91z2lbH;+&*{M<`+|PpkW;OwgB@u~Cny3QNy!H%#16dQMadZ}Yl_0ebgMkW>!0WpX z;_{z7jJ5j?5=0n;E5>!4s3nTar+&0%5F@9|ZqrN)40R(@7F zbgT=Dzx@RM<^EStRgpAnQ67<5jHMA>@T=;at|}b#O60tFV-~P1VF5WVRG+fLV7zxI zBqoI3w7OG;^XqCHdkdXKX`gM`07;U-uU2iwncw>r*6%-}W88r)0;@29XV>h)1)u#5 zUf!_JZl$NIl&|_s!z?7zX>{R4GK-fbF$h3%%$mUOd{`h0Byve+?jfQ~VMz`kL*TpzvcG~b6PkJ*;bQTl+%lU0m2psQDH;_G!vbf8uzJMSmL(YiGWi4a zK-1e1;Y_14X!Xqbh(VDbFWq%w=5ZWu8kn`1Pu+lqPL{S}^R-BoZa4d^x+kQBzJ zvpb8XCpO@mzx_2{-*f;88!l!ISY>8qmg^Q27JeV8mlD|k01wGYL_t)>G%{vUFbxAh z$`;9df{hO_=-K@6ojKR6yp;(JJp07US44Uz7o+4_WXfeC1np zc6Sw^y{1IVwxXTr$>8n>p2Fn%!T8R?i!kq$kv<>7z~&i7CqV0w6>a#=Z&zaPkxo=3 zMd|TiDo3|0@k_-dy7ysLvB2lV0FQw`X7af6KH)AJ)C$Kg00vfp`HFlQq=Nv4dJriz z6FtmYCVMX=EEBArPab9|wb_s=ubvBuUfT~J$8|qihMVU#;;%27i|M0=`9zQRy69yw z6VAbg?60k^F!BmHlF_Wb*GI{l-ah~4^2Ln`~SR#5o z4;W%R!$e=qU)Wv%(}N(PaGeDP3ck>ZaNg?qYz`LLAXt)D$$rFys#F5MU$+f^T)zXe zMi0Y(-+T!s46A!jg2ugPBEpO7_u{KdU&P)coyg^^f)moDVUcd(3OWx}DaBR@W9XQM zCFfCrr4m4Op!xAW_;S7&*0XuQWQBMtY2^xq_PU(E3KYz^g3Y|DDio`9o8B^uj!6uQ zQn(@YIg9be?!!3$yT8GrIa6@UnbUB|v{QVJ&v!e3I=VA>di5^c`=|AIWz&8Ps!D>` zqtu(E3P%jAlroF13~m^+a0s(_n1|sg`w7o?CjfL87I$W#E|Gi2H^mzkHf;g8F+VVK z0gUqe!UB-7!kH#0c7-ubn9iaD1x0)Xl*Ot278=eM-l$F{@r5hS#7EDa`K}h#y3<+w z`)^j_{%1FVExQJrw5O!Z0jO$!7qYMWsD;kKNE)#$j9H*yH28mK%>{V0$ArBfz&h`A z{>O@>Qdm`RHbAp|>{|*Px!DC%`a@9`!Y1K|FU$Yw)Gb$1ZpN^;O_!ahC zBGfo$3Yd?>Si;0QX23Me0HpvP>*<5z&V7&MLri}t5~3OwHC;i>j~B|L0JtQ;kroQp zvM?WusuGMqpxc+bKdA>qp|}^VB&zRK18QjoT5%l~GqPF6RdXid)0dr&S>xhPP6seHaH1^h&B9Os zNUFn7`AQ0vTD!~SJIQM{XQ3yX!}y`Kn0-n;=1mxh3meDc>?xzQleVux(w)v?#m0SD zv3?KM?L30@I}hXS<2|TIiGsCDr(>vAaT61=gpqvJ^TU3x(q*E&*NAbP0{8-t{z3qD z0eI6jCo?ms3&7O2=EeJq489Eum%c)vbL>J^Afy1iFM#|U0~Qw-zX+=_=4BR@_ugdU zny^qQdQK_E1oU*CbYeaDb=QkscK-IqSBpNxs39|E*squEeqkv(furqQG* zGdmUhrvg?(ApGW8xK)zexabwF%}XwndPo`<;a_>Y=pPoZAuLlC5n zL@Mr=#)z*$YAHUO5-U?O7*@`%9AjCGx~d9{sIA6`x+)AGRE4oa2VvrfI!qc-htWf7 zFnmxI>g%ddT@jv|)ZUfG;r4DE>FCCuBc0fBupK)O9LIrUT{zs{jYG$}ark%_y3$!B zNFb4L^7~aHm!TCavU5@f7I?z*p(uj{#q(C_Fs9WkCE(#Iz`8iVbcX@F5x8XLGuv90 ztdi+4Xlq`K#zjpVz&tarr_=*DE2v1ZzgC&bsj2hcn|3Mg&15bYgOusonCIc9K< zVX^(k7Tcr^LS<5*sv?Ob31qT4bfj2>%))7&E1Vvk!l`>!QuUQ6ED@Di5aMHr z>b(!EjH#h` zL}eEAQVgR&{=Lc!Y$9%<_sl{J@CXMi-bH@D!!WMzg_w!yzX0UH67-g!@#_BuTX=w& zyYumm0>FAlu4B(kNszxWqAL7_B+WYF1dB=QZSJKw7Ito+xO%>uF=z$E0IxaQ$$ihi zQsMt13!u*AYX$THMzpYdnMG38B~4X`FfX1Oq!a`4ph%qoN#{J*MFapqC1A}9?3)3w zA>cXzbur?4m)3D`P zWf|U7z33}FLYT#bB}z%?(mf|CzF&|5vzXKe(}njF%p%s^N;4LKM!UKtc~yvZ09%TV zvc9c(@x2X;nh*+@O_hV(3;GJXC1YICY?b5CVUL|qkf*;u(8tnC1wTr6VVMWt)cp}= z`!DgD{C!zMR(g)8e}qk5GCZGY1Vn^uH7ZuYX6!6on4-gkieBui zYR`>c>?GofMQ83F0%I~ed?nyOq8arR(Y6(bgi*X#8T7b zES0_ksPo=c!I6NvwYSU)=S~Fm4>%y1MpUE-jDpzl5F#!OU(YtvRaiK;`O z1h0KR={qD#04sBlWaxtC5y6nO^%Wi!Q1BBDSXTS?bGi)Sk+$X~H@ML*y#kCMJWDq+ z(+nSIvamyEMkpvU+mB%BgW$`erflBxM$t(SxaP2^Y$$Y%Qo`Sia&=m6aeR7m6 zO!ELII8ieS#lANlcN5*Ew>dKs>mAF$Qi@n)x=+-7O+xV_nw3MD#gu8HGE3kb3@1Ea z02l)BJb)9Dtj(Oq8YaA8VFIDGwRy?3sPkV$`EldId$D!xzW|KWiLuf*9Kta7z$=F zH3REFX<~|IfYJaD2lyPoI!gi;;mpC83B(UGG~D z+#5UfDF4iotc6m@V4VqY9YEQ@H78)_vaEm|_vmk>VuyS) z?rLjUatoL-eZjpY0j5_BlQ%gpTzWA;O-ww6yskReIW-QzWP5dx4k86uC+qy53(;rF zkqQu%S%S)LxtXODeFvIxGTj$tU=~0hU>TOU<}9RKc zgMw2Y9oOyWquY;QSEW4S=qZQcuUP57j+Fp^skLRvlkVIs$5z(*Ka+2`7uz4c)3K;E z-2m_}L8wAdO!J<())Ci6OCGptA`EPOvc=s1giN0`!%mam=2*XE^QcgCrwfc*TU!<{ z1AxYBe~Q*We7wBZT<*;cF=$xy(;7nZZh$|@pc&+^hT&%&$EJ?K4u}Q;sCHyo(ML~k zVC$dFtHX9XEONrpP1*q*^UM){0K6T-W@{=N0KNxV`bpa#7I&AERbmH>+(5AOA~4;@ z#FM~8L`;tNt9XqG%Gh3OnoHwiV4l6BH_Q3UctFwvd5U|0cij3%AYx|TPDHo2HZOj$ zFR>l#Hf_;TY-wKN>N>NC_;O~tk-(S2q$(s2FwA>`VM3-tzMvuVQ%v+QF`jB|S-jDf zYL=qSnPcyGz<9SAH!Q`bhYL5>xNzw$4BQFeTq3FjqXNV!cBCould not create recipe. Error:
%s')%str(err)).exec_() + return + profile = src + if self._model.has_title(title): + if question_dialog(self, _('Replace recipe?'), + _('A custom recipe named %s already exists. Do you want to ' + 'replace it?')%title): + self._model.replace_by_title(title, profile) + else: + return + else: + self.model.add(title, profile) + nr+=1 + self.clear() + + msg_box = MessageBox(MessageBox.INFO, "Finished", "OPML to Recipe conversion complete", parent=self, + show_copy_button=False) + msg_box.exec_() + def populate_options(self, profile): self.oldest_article.setValue(profile.oldest_article) self.max_articles.setValue(profile.max_articles_per_feed) diff --git a/src/calibre/gui2/dialogs/user_profiles.ui b/src/calibre/gui2/dialogs/user_profiles.ui index 1e29477e6c..bde6f7e187 100644 --- a/src/calibre/gui2/dialogs/user_profiles.ui +++ b/src/calibre/gui2/dialogs/user_profiles.ui @@ -135,6 +135,17 @@ + + + + &Import from OPML files + + + + :/images/opml.png:/images/opml.png + + + diff --git a/src/calibre/utils/opml.py b/src/calibre/utils/opml.py new file mode 100644 index 0000000000..12a95cb889 --- /dev/null +++ b/src/calibre/utils/opml.py @@ -0,0 +1,87 @@ +__license__ = 'GPL 3' +__copyright__ = '2014, Kenny Billiau Could not create recipe. Error:
%s')%str(err)).exec_() + nr+=1 + + #recipe_model.add(title, src) + + + def options_to_profile(self, recipe): + classname = 'BasicUserRecipe'+str(recipe.get('nr'))+str(int(time.time())) + title = recipe.get('title').strip() + if not title: + title = classname + oldest_article = self.oldest_article + max_articles = self.max_articles + feeds = recipe.get('feeds') + + src = '''\ +class %(classname)s(%(base_class)s): + title = %(title)s + oldest_article = %(oldest_article)d + max_articles_per_feed = %(max_articles)d + auto_cleanup = True + + feeds = %(feeds)s +'''%dict(classname=classname, title=repr(title), + feeds=repr(feeds), oldest_article=oldest_article, + max_articles=max_articles, + base_class='AutomaticNewsRecipe') + return src, title + +if __name__ == '__main__': + opml = OPML(); + opml.load('/media/sf_Kenny/Downloads/feedly.opml') + outlines = opml.parse() + print(len(opml.outlines)) + opml.import_recipes(outlines) +