From 7dcbce11eee36b72ad47e38bc0fca0a9f2a4dc24 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Wed, 24 Feb 2010 01:50:21 +0100 Subject: [PATCH] Default cover art for coverless podcasts Makes the subscription list look way better. Improvement ideas for the "all episodes" icon are welcome. The SVG source file is included. --- bin/gpodder | 3 + data/images/podcast-0.png | Bin 0 -> 1951 bytes data/images/podcast-1.png | Bin 0 -> 1866 bytes data/images/podcast-2.png | Bin 0 -> 1952 bytes data/images/podcast-3.png | Bin 0 -> 1938 bytes data/images/podcast-4.png | Bin 0 -> 1699 bytes data/images/podcast-all.png | Bin 0 -> 2141 bytes data/images/podcast-source.svg | 1068 ++++++++++++++++++++++++++++++++++++++++ setup.py | 2 +- src/gpodder/__init__.py | 1 + src/gpodder/config.py | 2 - src/gpodder/gtkui/model.py | 8 +- src/gpodder/gtkui/services.py | 23 +- src/gpodder/gui.py | 2 +- src/gpodder/launcher.py | 2 + 15 files changed, 1091 insertions(+), 20 deletions(-) create mode 100644 data/images/podcast-0.png create mode 100644 data/images/podcast-1.png create mode 100644 data/images/podcast-2.png create mode 100644 data/images/podcast-3.png create mode 100644 data/images/podcast-4.png create mode 100644 data/images/podcast-all.png create mode 100644 data/images/podcast-source.svg diff --git a/bin/gpodder b/bin/gpodder index 020402d0..1cda1d44 100755 --- a/bin/gpodder +++ b/bin/gpodder @@ -62,6 +62,7 @@ if __name__ == '__main__': locale_dir = os.path.join(prefix, 'share', 'locale') ui_folder = os.path.join(prefix, 'share', 'gpodder', 'ui') credits_file = os.path.join(prefix, 'share', 'gpodder', 'credits.txt') + images_folder = os.path.join(prefix, 'share', 'gpodder') icon_file = os.path.join(prefix, 'share', 'icons', 'hicolor', 'scalable', 'apps', 'gpodder.svg') # The existence of this file tells us we're running on Maemo @@ -76,6 +77,7 @@ if __name__ == '__main__': locale_dir = os.path.join(data_dir, 'locale') ui_folder = os.path.join(data_dir, 'ui') credits_file = os.path.join(data_dir, 'credits.txt') + images_folder = os.path.join(data_dir, 'images') icon_file = os.path.join(data_dir, 'gpodder.svg') # Set up the path to translation files @@ -89,6 +91,7 @@ if __name__ == '__main__': # Set up paths to folder with GtkBuilder files and gpodder.svg gpodder.ui_folders.append(ui_folder) gpodder.credits_file = credits_file + gpodder.images_folder = images_folder gpodder.icon_file = icon_file s_usage = 'usage: %%prog [options]\n\n%s' % ( __doc__.strip() ) diff --git a/data/images/podcast-0.png b/data/images/podcast-0.png new file mode 100644 index 0000000000000000000000000000000000000000..95c65ee63a6510b98a245ce3c7677e1d8fd33ba3 GIT binary patch literal 1951 zcwPaY2VnS#P)B ziSi**rBopbv?&e=b({byH5h|!Y!e%=!H<2-&g{(GerQ=(cGfo3K##Q2-gE!w+~3@p zIrq+tkWzBR8r!typrL+O2wH5@ZIBX$+h9WA1r2pjN;+)Q-F3d*dB4ynrKGV<(*hyo zXI0gaCm#F3b|V&B&b-P6C_=j(e0b7fJUvQ(e;<3Ee#uNtrk~AQ-jB|=JC2Z2a@T{w zXEtxU@0&ZH*r8{f2^=Sn=XrpfG5Oq>Kv5JlRm0F~*t2_Y?(Kuecb`3Ie_t$XRh#E8 zh`zOF|F4XsHHzyvw+YJMR8=7oTEJtEe#e|hBwN+`Re|4p>&Y*#jZ}xo=j}TR2Oy_}!LZ^ukOG5XuIJAZ#>o|Sp z5iBn~S8V?oV=j^i6dFR!ED3&uL93Hq^9ZiY&qeC;OW9bymrMCRQf>lUW@nX56#-)U zCR(b#f}vF3G?XLF!vC@}*lWI3)Ye3Zy1)wRgH6;1;%FjRc7TXl&qt$Q=mm=pSx$N|lbtj5663MW2k`b$mmEn)ksNe6KYh`!~DL298e7|ph(!I!# z^}g?oRTi+?r%dC6-)JrI`w=}y_C3& z=6gukXUbvR*oL%Ht!26K0Ik(KSrvYepa>WB4_haBH}!&VEer^Qb&=1YiU1OiapyeU z*+bL9-7w(QAeCkMMp~=C&f?ITqP{6-m}9Azab@Y|Bcj%`Oy5Y4`8O_DC&*t@PUaNw zifJOqnu^Nd}HGJW^|=$)?<_f{J{DrWBIeQTDltb7S=^Ri?}A; zh}}hh?r7ix00=1&qS_)FLhG3yi23U40xMWm@o`S3|4h;y zCFPECDtmx0EqI|MW_5TQoymP9@@HoRoYg6|yc7w$hxbx1(v^7)M_RtRhEOw_(79k8 zXUZAIkrwS!zw=QFTBAE>GxUvJgB}iN%{MtP{!@nSlfIg*HQytuEiSarnTLI~F=G>9 zrDn!4|9grh{kfwE1PU4wi6wnMJ z7QMoULd}K#tUJ!3iCrae0)-8cM~i&D=HU`uqkjLiyP|0Um+2eWQvGezYZ6qdb$qh+ z8N%wkg0DOK24~H`m&C`7)}pd=F4tb72?(8r(1x1>TpfPM*Ka6Mmg}2}eD6&C!B@95 zw64$|vW{bWnG#*OvNa=Mg*v}%P=#7s)E>+C`j(#M#?=Gyq{Dj0%{^a|R-j{oufm~;a-|v8~pXs!l@By5D z2FosWmX~7R=oe{=euJf-K zf#*q2L8u_zqRxzanFHfbPMhG0ozA|_>Fn#%YC2Q<=}hgPF_$7#r1TI1PYD|8;6x@t zMDu_6xf52U)iIG7BWS3Dij;Kp_xG~Uxcg3X6|7!wqOb29QqrN=rn_s;Q!kkdLo2D( z<123k6Vwa_fIe zfM{SLjg>9L!W(&R_ugFZsljLa-pubSd5Qk`4?l0jVsUCJ>QTgPdC89_Jti^<`ulr% l?x`0`U!q^J|Hsb|{|1VC?8mQ^?{feE002ovPDHLkV1h^3wF3YE literal 0 HcwPel00001 diff --git a/data/images/podcast-1.png b/data/images/podcast-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a2969069dd47d4e80b26322c1091f797443dc786 GIT binary patch literal 1866 zcwPZY2etT#P)4oMj?a6YM2>$}EuPxcvO*d>Gv+V(%CWwjh= zYz(cfsuCsT<%p%A0}L=WGQxlR`%U|qGfAa&TgvnP@vbpS7-RUel>e%&tZX^>^wWj5 zDc*4INi zjS7cxKl%tgFmUTZfdvC*DG)$z-HNQMLw)%r=?_1|3=iKTw2Xcm;7wT;^1%m@+qU6$ zcH(~U0cK+2mW0j=sKR0Fu`xtxY33>^0o$Gi8iG6ToE^}obQ&)l z#tVl*2<-Li2{bif)zsuP7lnlsw6u^ubqe>BPv$po- z6HZeTRz-#1&awzR^94dI2usLswzo=kRV z((k{Ijz$SS|2zZ&*};S$xMvR&ufB>N9L$D`#WFQi>zo`5+K^f+SK>VO7@@<53GUvF znD!|ERChPY)>h2Oh|gDqLIn5kM-&ufz~XWA)vKAWk_T?VfKy%;a>ot|UwH+&V@Fn( z?(1WstqoEszgtBGPE!*)5X>7#axG|@_y?#Bx=4MhSPGAxV%=kFTBS*0Axd(gg+Uy5vY$V;$f%oH&a{|um z6PtJ(@8U%!+S^GTKaNQxa@xuIdh87wGWj(;45<{UH{bLd3PEt+zWEHj@Ela1eMaKY zA=Fo2Opd+)pNa;`#7ef>NE^C+-$ zC&e8dgbp93u(g%qlP8gzHcj@MSd59INBxdM5P0_4tS0sO=RPx8S2tO>7Yr!t>L_Sw z0mqpdx4fLt%P(i;j(g?|s;kTI|G)!TwJ{eU!65eL&5Hwc9)CP%yC^9^-hY2qTk806 zzuk%z$lBT|z@DDWPGu%Qb@k!^XPaTxZMS9Jdq4e@b7_;?woNngGCP);v2MS8ae&?r zKjd}t^=XZF<%-Wv+;vyheXdnW+;PX^0MqZh5@PAjJKn609tbZ z=3VMcJWhPyK7xDqA~$cwBoe63PEs8mIqkjgzsJnX+Zi)dU%Ted!x^P(ro=ArP98jH zrGEYyFGo#V4$1OzoYkxOQ(K$1LQ+Ozu^4u7@p5xb$|@=%Habd3%7|s){N+f*I4f5! z-GSw75&~z{DlSK(#=vAhl+}p zzdrR;p_CGLa1d{NeAeFzw^WveU0jT_Y8A@!IC|<-;=;f{<_LKDA-XL@%l?Lj(7M&D zMQLd%Vu{|SF@{(y#+AN4^Tye;Nza(afBYNbe<{)6W7KQe+yDRo07*qoM6N<$ Eg4k4vzyJUM literal 0 HcwPel00001 diff --git a/data/images/podcast-2.png b/data/images/podcast-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f0df6644f910c3463b2ad80b538779941943005d GIT binary patch literal 1952 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 YFD^(M$n_=yod5s;07*qoM6N<$f>6qljQ{`u literal 0 HcwPel00001 diff --git a/data/images/podcast-4.png b/data/images/podcast-4.png new file mode 100644 index 0000000000000000000000000000000000000000..d611281da62150e1deb70a0a54c0ff225993e1b4 GIT binary patch literal 1699 zcwPac23+}xP)|eP45L zCX=^GF-@x`>7*){%nX_spCF;M9~(h!A_x^piV87;6va}o#1A4>KlmjhHlUy=MM0rT zi)oojOHCkYomQebKlv2L_-T;g5b&ZTkk)KXH8W?TY{>MB7co0#n&+Zg`C zBjvDOK4=1KPwd)vGzYai4hNuq6eMKVzN5Lo+7kw3Air*xyc^(J=Eumd?-h^%<6OAi zX11YJ?le}*lsRnrJvbL`H>esB3;3u?Qg;Ln0QEoss>XKGn8H^f*a|ueeg^fk;3v?= z>k$42&`zPZ)j9$K%~6yMU^XDvUD?lo7SZ}^(71?(BcP2t1lY->fMoh0(}!potv-iV zUj)M2O9$NgRwi9Y?m^7jlSsPnwxn!Ya|zwPz1H*~`G+yx-vs;KTg#;-u0OOLr`T7X zMS@KrYr(9AU?XDh0hZXGgDsdfUqeg3LF+FspUsyL4O?WL*I@V-8om_`mMoIm38_6u z>OPQMhhU534}-l6Ek8@Fgmr`~f_odx#v3v%$Fz#pFF^eQDj6jE2_$n6B$FtY%mE0t zqQ%po)x}f0aqv?yf9Ey0RH4=yTKO}6<_Bo)ES*M4?E8@X7ob(B+VglcyqpLJi;Q5b zP&eK{8yCT~?b%vH%fCbG7chlKK=N_O)NaTfLMwl~Ax=@91~&zZ9P4hrP}_Tv+~=CR zN%bsRdx=Qh3;%_m{Sl^c6oR|rsj{B}cNwjpNBs==NzkS1=JLyo*?@FCgjxG7B)yNw z)cI-r+)vQPYl)%K^>FityLMA>D+6pru0!&Nk;0cjvI~A~prvQPjU^DKoBHK+vtq#O zeWvcitT`Sj4QLHF_tW`;+ph0L(tB?m(3j4jr88*t1qlBQTI-x8*o^5uhGNn13fg!R z>gVw@KP2hYBZV)~@u_aJ&JT&7KJmG(l`YF^+pza#J^jqBIH_-a|#AIT3V7ecR z-e>U{lFEq5A6^nJ0*ISzE^K#o{u%@KKXBvClHjL7%iylyr@xDz`&r^SP%l8Gy?)t^5gJI+NJezQ%m{S0tXmGXqQZvjm_Z*-vA-zm8e+D3bnA z6tet#wDCqf%HD%y4=gy`INBJA>(YI<0%$Nj-@|l2hGaj9DxGu1UQg%=(o9O70Mn{%|}Xe;Bbl798P!@#SB~4(ka&3 zD;-)KTK{`oAO15Tdt2vzGC{L$F+L0;UNuA{%Bt1p=8senFTOYk?s7a+d1+Be|h6y0hd_f8}MxB1HO>+TE zp-nTJ0KJ(;?J7ZFM=j`3Y5LOLJzEZlhVgTp)`rm9P$E=B*BD8xb?rBCGjDnl?4mUO zyn+rH7lx-s&J9*nQ%I_R$>4X|B-Mv%z{t5@R9qOI5>@4;U)rbEZ`pnP0|SreggP2t z0zZ!G>U;tg3FcobdQnX?GW>LPlRCDu??|q&u2*bk8_myh@4Tso tgtaRar!MKpxziQz!`4T1dAI)!@qcs>o9}A4gqi>V002ovPDHLkV1f|HCxZY0 literal 0 HcwPel00001 diff --git a/data/images/podcast-all.png b/data/images/podcast-all.png new file mode 100644 index 0000000000000000000000000000000000000000..16cd66f41f51628dafa1c6dfc274d1ae2da75b22 GIT binary patch literal 2141 zcwPZr2%`6iP)d-2ZC&JacA#&w0*s&Y5azYHE~o=g#q8)avRgy2{E*o;`a; zDwR5Io(yTVS{^@sj1C}~OtQYde%eeKDlRStKsaTN6ZJpfzm+cAgwyF{cXt;_k_d%D ztgWq)OeTNnp;c8?m`o-lNg@)7AW0HCJ3GG@P^Z%&iXyqWxs;TY(A3mKI2>kTV&cRT zpOce=&1S=9v#Dd7o108ePb16nKLX6U#j-4;C`!hd*=)w?baGPOlq3mBl1Qi1>X^l1 zp}V^qhr{uY0JC~P`w;|z zyu3V$i;JnOtVFBT($LUAad9zIQ&S`oi4y^{da$#zla`hiEEWsP%gYQ54B+?s)p@ho zOmlPdk+ycbovNxTEEWs0EHghp&&Q7++1lCy_Pp8B(sCjk9OFTw(TK@p!fvKqtulRgE+S}U^1OdC<&hqjy;cz&^)?_kKUS1ABI-SPtcH{MW851h;2L95jsvIPhP0&1o>Hc_WiDLftz zLqkKVM~jMzC@d^wVq!uCFDfcJ(moc8F*!NO+}xZBSy54eBuOkTE&_Y;n3I#E+N`gy z6AFdY-&p}mOG|M&opg71lT0T0^y!m2*WBDpGMOYAjRJdKJh;s|osP!FMlN5zjL~Rh zadA=gDENH7jPYXu>+9rYtCiZ?S^!)w*WL>S0h7r@G#XX&WL{n#9*^hHVLKLZKga>qQyUu_ z89)bHw1ZV69*?Wn`;{XWi>c2v8jYmWY4y1}oi1yI$(m-y$H%Fwt3#3`d_Etrmw@;C zG_6)kC=^1HBs3aLMy(A7gG^3NqSxyQ1On=~$K%0ZFd)k^i9~{li3!YRGuzwS*)XyL z#^Z6meEE_wCd)FTqoWyPV`F1S+V98QK`kvUkxHcqg+c^_!6U2CF9ZH=?e6Xp3WeC* z+{~!aCn+nS!{HznixG)LGUD-9R9IMuD2jx`VS>RR;c%F6IQ&Z<`(?oD>T310%Cbx( z5@B(15lNDcecA#bQX3#Magp@pzn)k`i_9%$YMd91a`~2le&!^!N9lxX6RjR##X5dGqGYLnq1S z^AQXNiAJOB?Cg-6n~NX_SS%K-Rx4hwmz9+j{C+GX8{=3S{%X$0uExJ@HMIw>F?RFyw0ve45MNzQXY%DA+Aj>l8 zbQ+`4$nD#=DJv_(Y&LV}&K+L9e0iidtX3<@WRjVg8D?f?7#bR)tE-Fl_I7e|a=3Nt z7Ww)4jEsz&=s}&LC@6|@C{gzI_L7^MOC%Cuc6OH0(NSK#dd0I? z7cUNd0<^Za($>~SJRWCtb(O)vL57Bgn46oUx3?Fo)k;T42X42UA3uH^3wYvJoylaP zqoadIj~-E4TFU3opBWq+1ooPQ&d$!PwtBsu>gsA9K72@fdpm1uYrKB_nw^~;1VNyu zrw6T8d+htQm6er$I-O3nTI_3nex5)efTAcA78YVK7-(v0VtIL)`T2Pq4hKe~kFDq8Cz(tl2m&1)9T~Rqc$~$>MMg$Oc>er3D=RC&UUOSkR>suS z6iZ7>0JOKaqtj)t7g+&yIvouS4V09W;PH6q@9zhoprC-Rt}epiu-fMxOe^~;EiI+K zzMk#vZTkB9)Gm5|TgS)8_W%STYd?7`;2(ed!QH!edGO$Y3OPGF3!o<9{Qx(aOc||v zd3iba@89R%y?flaaf3u6!Mk_wfW40`o6VMyW{z6miGT-DOq-Da~9kH^)|hJ&_$SJurR8XDr-wQFo{ZZbbV59|ehEEZEC*4NjGMx$y1 z_jwmz1D;>buvuEkJ$hQdU-W$~Z^M=kxIwpnPbz T7D%DC00000NkvXXu0mjfW;F0M literal 0 HcwPel00001 diff --git a/data/images/podcast-source.svg b/data/images/podcast-source.svg new file mode 100644 index 00000000..c3d80b13 --- /dev/null +++ b/data/images/podcast-source.svg @@ -0,0 +1,1068 @@ + + + + + gPodder podcast cover art + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Thomas Perl <thp@thpinfo.com> + + + gPodder podcast cover art + 2010-02-24 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/setup.py b/setup.py index 40b27feb..e98863f5 100644 --- a/setup.py +++ b/setup.py @@ -58,7 +58,7 @@ inst_share_ui = glob.glob('data/ui/*.ui') inst_share_ui_desktop = glob.glob('data/ui/desktop/*.ui') inst_share_ui_maemo = glob.glob('data/ui/maemo/*.ui') inst_share_ui_frmntl = glob.glob('data/ui/frmntl/*.ui') -inst_share_gpodder = [ 'data/credits.txt' ] +inst_share_gpodder = [ 'data/credits.txt' ] + glob.glob('data/images/*.png') inst_desktop = [ 'data/gpodder.desktop' ] inst_desktop_maemo = [ 'data/maemo/gpodder.desktop' ] inst_share_dbus_services = ['data/org.gpodder.service'] diff --git a/src/gpodder/__init__.py b/src/gpodder/__init__.py index 7588804e..3b6df5d1 100644 --- a/src/gpodder/__init__.py +++ b/src/gpodder/__init__.py @@ -116,6 +116,7 @@ del SOCKET_TIMEOUT ui_folders = [] credits_file = None icon_file = None +images_folder = None # Episode states used in the database STATE_NORMAL, STATE_DOWNLOADED, STATE_DELETED = range(3) diff --git a/src/gpodder/config.py b/src/gpodder/config.py index 82521dda..85b19a56 100644 --- a/src/gpodder/config.py +++ b/src/gpodder/config.py @@ -184,8 +184,6 @@ gPodderSettings = { ("The name of the coverart file accepted by the user's FS-based player.")), 'custom_player_coverart_format' : (str, 'JPEG', ("The image format accepted by the user's FS-based player.")), - 'podcast_list_icon_size': (int, 32, - ("The width of the icon used in the podcast channel list.")), 'cmd_all_downloads_complete': (str, '', ("The path to a command that gets run after all downloads are completed.")), 'cmd_download_complete': (str, '', diff --git a/src/gpodder/gtkui/model.py b/src/gpodder/gtkui/model.py index fa89ad3a..6db618ef 100644 --- a/src/gpodder/gtkui/model.py +++ b/src/gpodder/gtkui/model.py @@ -414,7 +414,7 @@ class PodcastChannelProxy(object): self.id = None self._save_dir_size_set = False self.save_dir_size = 0L - self.icon = None + self.cover_file = os.path.join(gpodder.images_folder, 'podcast-all.png') def __getattribute__(self, name): try: @@ -453,7 +453,7 @@ class PodcastListModel(gtk.ListStore): def row_separator_func(cls, model, iter): return model.get_value(iter, cls.C_SEPARATOR) - def __init__(self, max_image_side, cover_downloader): + def __init__(self, cover_downloader): gtk.ListStore.__init__(self, str, str, str, gtk.gdk.Pixbuf, \ object, gtk.gdk.Pixbuf, str, bool, bool, bool, bool, bool, bool) @@ -467,7 +467,7 @@ class PodcastListModel(gtk.ListStore): if gpodder.ui.fremantle: self._max_image_side = 64 else: - self._max_image_side = max_image_side + self._max_image_side = 40 self._cover_downloader = cover_downloader def _filter_visible_func(self, model, iter): @@ -604,7 +604,7 @@ class PodcastListModel(gtk.ListStore): self.set(iter, \ self.C_URL, all_episodes.url, \ self.C_CHANNEL, all_episodes, \ - self.C_COVER, all_episodes.icon, \ + self.C_COVER, self._get_cover_image(all_episodes), \ self.C_SEPARATOR, False) self.update_by_iter(iter) diff --git a/src/gpodder/gtkui/services.py b/src/gpodder/gtkui/services.py index a00ecb95..6e831840 100644 --- a/src/gpodder/gtkui/services.py +++ b/src/gpodder/gtkui/services.py @@ -135,12 +135,15 @@ class CoverDownloader(ObservableService): self.remove_cover(channel) self.request_cover(channel, custom_url) + def get_default_cover(self, channel): + # "randomly" choose a cover based on the podcast title + basename = 'podcast-%d.png' % (hash(channel.title)%5) + filename = os.path.join(gpodder.images_folder, basename) + return gtk.gdk.pixbuf_new_from_file(filename) + def __get_cover(self, channel, url, async=False, avoid_downloading=False): if not async and avoid_downloading and not os.path.exists(channel.cover_file): - return (channel.url, None) - - loader = gtk.gdk.PixbufLoader() - pixbuf = None + return (channel.url, self.get_default_cover(channel)) if not os.path.exists(channel.cover_file): if url is None: @@ -181,16 +184,12 @@ class CoverDownloader(ObservableService): if os.path.exists(channel.cover_file): try: - loader.write(open(channel.cover_file, 'rb').read()) - loader.close() - pixbuf = loader.get_pixbuf() + pixbuf = gtk.gdk.pixbuf_new_from_file(channel.cover_file) except: log('Data error while loading %s', channel.cover_file, sender=self) - else: - try: - loader.close() - except: - pass + + if pixbuf is None: + pixbuf = self.get_default_cover(channel) if async: self.notify('cover-available', channel.url, pixbuf) diff --git a/src/gpodder/gui.py b/src/gpodder/gui.py index 353f0993..e18b61eb 100644 --- a/src/gpodder/gui.py +++ b/src/gpodder/gui.py @@ -272,7 +272,7 @@ class gPodder(BuilderWidget, dbus.service.Object): self.cover_downloader = CoverDownloader() # Generate list models for podcasts and their episodes - self.podcast_list_model = PodcastListModel(self.config.podcast_list_icon_size, self.cover_downloader) + self.podcast_list_model = PodcastListModel(self.cover_downloader) self.cover_downloader.register('cover-available', self.cover_download_finished) self.cover_downloader.register('cover-removed', self.cover_file_removed) diff --git a/src/gpodder/launcher.py b/src/gpodder/launcher.py index 4374172d..84ff3fc7 100644 --- a/src/gpodder/launcher.py +++ b/src/gpodder/launcher.py @@ -42,6 +42,7 @@ if __name__ == '__main__': locale_dir = os.path.join(data_dir, 'locale') ui_folder = os.path.join(data_dir, 'ui') credits_file = os.path.join(data_dir, 'credits.txt') + images_folder = os.path.join(data_dir, 'images') icon_file = os.path.join(data_dir, 'gpodder.svg') # Set up the path to translation files @@ -61,6 +62,7 @@ if __name__ == '__main__': gpodder.ui_folders.append(os.path.join(ui_folder, 'desktop')) gpodder.icon_file = icon_file gpodder.credits_file = credits_file + gpodder.images_folder = images_folder gpodder.ui.desktop = True # Portable version support -- 2.11.4.GIT