unity-scope-guayadeque-0.1+13.10.20130927.1/0000755000015700001700000000000012221263645020462 5ustar pbuserpbgroup00000000000000unity-scope-guayadeque-0.1+13.10.20130927.1/po/0000755000015700001700000000000012221263645021100 5ustar pbuserpbgroup00000000000000unity-scope-guayadeque-0.1+13.10.20130927.1/po/POTFILES.in0000644000015700001700000000013512221263400022641 0ustar pbuserpbgroup00000000000000[encoding: UTF-8] src/unity_guayadeque_daemon.py [type: gettext/ini]data/guayadeque.scope.in unity-scope-guayadeque-0.1+13.10.20130927.1/po/unity-scope-guayadeque.pot0000644000015700001700000000224712221263400026225 0ustar pbuserpbgroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #: ../src/unity_guayadeque_daemon.py:40 #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-02-21 01:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/unity_guayadeque_daemon.py:38 ../data/guayadeque.scope.in.h:4 msgid "Search Guayadeque" msgstr "" #: ../src/unity_guayadeque_daemon.py:39 msgid "Sorry, there are no Guayadeque results that match your search." msgstr "" #: ../src/unity_guayadeque_daemon.py:49 msgid "Songs" msgstr "" #: ../src/unity_guayadeque_daemon.py:53 msgid "Albums" msgstr "" #: ../data/guayadeque.scope.in.h:1 msgid "guayadeque;" msgstr "" #: ../data/guayadeque.scope.in.h:2 msgid "Guayadeque" msgstr "" #: ../data/guayadeque.scope.in.h:3 msgid "Find Guayadeque items" msgstr "" unity-scope-guayadeque-0.1+13.10.20130927.1/MANIFEST.in0000644000015700001700000000007612221263400022210 0ustar pbuserpbgroup00000000000000include MANIFEST.in include src/* include data/* include po/* unity-scope-guayadeque-0.1+13.10.20130927.1/tests/0000755000015700001700000000000012221263645021624 5ustar pbuserpbgroup00000000000000unity-scope-guayadeque-0.1+13.10.20130927.1/tests/__init__.py0000644000015700001700000000000012221263400023710 0ustar pbuserpbgroup00000000000000unity-scope-guayadeque-0.1+13.10.20130927.1/tests/data/0000755000015700001700000000000012221263645022535 5ustar pbuserpbgroup00000000000000unity-scope-guayadeque-0.1+13.10.20130927.1/tests/data/Collection/0000755000015700001700000000000012221263645024630 5ustar pbuserpbgroup00000000000000unity-scope-guayadeque-0.1+13.10.20130927.1/tests/data/Collection/guayadeque.db0000644000015700001700000055000012221263400027256 0ustar pbuserpbgroup00000000000000SQLite format 3@ (-t(-'  Rq& S / R = K-  LampostsRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/11. Lamposts.mp3mp3 fM^p.ԁ< /K?  Just Like Mr BennRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/08. Just Like Mr Benn.mp3mp3f M]A<%; 1KA   Rocky Took a LoverRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/03. Rocky Took a Lover.mp3mp3fM]O=": %K5  Bad Skin DayRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/05. Bad Skin Day.mp3mp3fcM]Va9 K'  FlameRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/02. Flame.mp3mp3fM\88 )K9  Bigger Than MeRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/07. Bigger Than Me.mp3mp3fM\87 -K=  He Said She SaidRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/04. He Said She Said.mp3mp3fM\@E6 !K1  TrampolineRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/10. Trampoline.mp3mp3 f M\Fj5 #K3   ReacharoundRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/01. Reacharound.mp3mp3fM\ON.-4 =KM  My First Born for a SongRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/09. My First Born for a Song.mp3mp3 fDM\O= 3 K+  NatalieRockHBell X1@Bell X1SCrosbyfFlockf/home/mark/Music/Bell X1/Flock/06. Natalie.mp3mp3fM\9&k  covers songs  k kmf ]dlM/home/mark/Music/Bell X1/Flock/cover.jpg$xrU|SsO׏ۤ$vcCxфF㏺;1BFDE1ۊ<݁jx9k1ܓ߮Wk~ܡޘ/}M?J^xX蕾hYy^I@YQ7t:[viPKڀ_s磽ჰ^ދLPc㚿.yOzސGoMKݑxQ1w百~\BߎZOt߀ԄuEb␷wU.z[lbDn2昽7Q֏?gsP׏T7䘽3~Ԁ|~`?w+w٧ކ*|h!wuj*|댷Mlr蓸dㇰtkJX䖼X`g0zZ㠿Fm䈱H l֎kD⡼`gA0|jC板?H,x8x臸a9x+yF2Q䋳zLL靽sU3ᙶZ5~脲WJ㖹胲6X㘺rYޓyWy}C)w䙼+v6~䐺0wG{hp=r2~r:~wBnf↮U∳ڠЅ^?4{,y]sF3~qYj,x3y׈<=PTD:և䐳4mHّ䍸.~M刳E2~xCox>⡾-{b衿=K嚼5={ZxrC撸ޫE壾xuOH6p/~?i~qY\?GA@CEHUCRGv_q"xretTDF[pk5猶*ngLL䔽`Mc[ s8|M_Xh& 0viX@0!Trampoline1Rocky Took a Lover#Reacharound Natalie=My First Born for a Song Lamposts/Just Like Mr Benn-He Said She Said Flame)Bigger Than Me%Bad Skin Day jQ8 fBell X1Flock fBell X1Flock fBell X1Flock fBell X1Flock fBell X1Flock fBell X1Flock fBell X1Flock fBell X1Flock fBell X1Flock fBell X1Flock fBell X1Flock ftf SCrosby SCrosby SCrosby SCrosby SCrosby SCrosby SCrosby SCrosby SCrosby SCrosby SCrosby [yj[HBell X1HBell X1HBell X1HBell X1HBell X1HBell X1HBell X1HBell X1HBell X1HBell X1HBell X1 [yj[@Bell X1@Bell X1@Bell X1@Bell X1@Bell X1@Bell X1@Bell X1@Bell X1@Bell X1@Bell X1@Bell X1 || Rock Rock Rock Rock Rock Rock Rock Rock Rock Rock Rock fffffffffff cD         ON O      mp3mp3mp3mp3mp3mp3mp3mp3mp3mp3mp3 uqM)u#  RockCrosbyBell X1Flockf #  RockCrosbyBell X1Flockf #  RockCrosbyBell X1Flockf #  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf"   RockCrosbyBell X1Flockf uqM)u#  RockCrosbyBell X1Flockf #  RockCrosbyBell X1Flockf #  RockCrosbyBell X1Flockf #  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf#  RockCrosbyBell X1Flockf"   RockCrosbyBell X1Flockf fG(  CrosbyBell X1Flockf  CrosbyBell X1Flockf  CrosbyBell X1Flockf  CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf  CrosbyBell X1Flockf fG(  CrosbyBell X1Flockf  CrosbyBell X1Flockf  CrosbyBell X1Flockf  CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf CrosbyBell X1Flockf  CrosbyBell X1Flockf qYA) Bell X1Flockf  Bell X1Flockf  Bell X1Flockf  Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf  Bell X1Flockf qYA) Bell X1Flockf  Bell X1Flockf  Bell X1Flockf  Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf  Bell X1Flockf qYA) Bell X1Flockf  Bell X1Flockf  Bell X1Flockf  Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf  Bell X1Flockf qYA) Bell X1Flockf  Bell X1Flockf  Bell X1Flockf  Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf Bell X1Flockf  Bell X1Flockf QqaQ Flockf  Flockf  Flockf  Flockf Flockf Flockf Flockf Flockf Flockf Flockf  Flockf QqaQ Flockf  Flockf  Flockf  Flockf Flockf Flockf Flockf Flockf Flockf Flockf  Flockf   f   f   f   f  f  f  f  f  f  f  f  ; D   WYtablesongssongsCREATE TABLE songs( song_id INTEGER PRIMARY KEY AUTOINCREMENT, song_name VARCHAR COLLATE NOCASE, song_genreid INTEGER, song_genre VARCHAR COLLATE NOCASE, song_artistid INTEGER, song_artist VARCHAR COLLATE NOCASE, song_albumartistid INTEGER, song_albumartist VARCHAR COLLATE NOCASE, song_composerid INTEGER, song_composer VARCHAR COLLATE NOCASE, song_albumid INTEGER, song_album VARCHAR COLLATE NOCASE, song_pathid INTEGER, song_path VARCHAR, song_filename VARCHAR, song_format VARCHAR(8) COLLATE NOCASE, song_disk VARCHAR COLLATE NOCASE, song_number INTEGER(3), song_year INTEGER(4), song_comment VARCHAR COLLATE NOCASE, song_coverid INTEGER, song_offset INTEGER, song_length INTEGER, song_bitrate INTEGER, song_rating INTEGER DEFAULT -1, song_playcount INTEGER DEFAULT 0, song_addedtime INTEGER, song_lastplay INTEGER, song_filesize INTEGER , song_albumsku VARCHAR, song_coverlink VARCHAR)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)4CtablecoverscoversCREATE TABLE covers( cover_id INTEGER PRIMARY KEY AUTOINCREMENT, cover_path VARCHAR(1024), cover_thumb BLOB, cover_midsize BLOB, cover_hash VARCHAR( 32 ) )Jmindexsong_namesongsCREATE INDEX song_name on songs( song_name ASC )%Uindexsong_albumidsongsCREATE INDEX song_albumid on songs( song_albumid,song_artist,song_year DESC, song_album, song_disk )h+indexsong_composeridsongsCREATE INDEX song_composerid on songs( song_composerid, song_composer )`'indexsong_artistidsongsCREATE INDEX song_artistid on songs( song_artistid, song_artist )t1-indexsong_albumartistidsongs CREATE INDEX song_albumartistid on songs( song_albumartistid, song_albumartist )\ % indexsong_genreidsongs CREATE INDEX song_genreid on songs( song_genreid, song_genre )P #uindexsong_pathidsongs CREATE INDEX song_pathid on songs( song_pathid ASC )P #uindexsong_lengthsongs CREATE INDEX song_length on songs( song_length ASC )S %yindexsong_bitratesongs CREATE INDEX song_bitrate on songs( song_bitrate ASC )P #uindexsong_ratingsongsCREATE INDEX song_rating on songs( song_rating ASC )   f   f   f   f  f  f  f  f  f  f  f Q  S : n  @-S6h"1indexsong_path_filenamesongs%CREATE INDEX song_path_filename ON songs( song_path, song_filename )!3iindexsong_addedtime_descsongs$CREATE INDEX song_addedtime_desc ON songs( song_addedtime DESC,song_album,song_disk,song_albumid,song_number ) )Uindexsong_addedtimesongs#CREATE INDEX song_addedtime ON songs( song_addedtime,song_album,song_disk,song_albumid,song_number ))Uindexsong_year_descsongs"CREATE INDEX song_year_desc ON songs( song_year DESC,song_album,song_disk,song_albumid,song_number )uAindexsong_yearsongs!CREATE INDEX song_year ON songs( song_year,song_album,song_disk,song_albumid,song_number )Z)indexsong_playcountsongsCREATE INDEX song_playcount on songs( song_playcount ASC )V'}indexsong_lastplaysongsCREATE INDEX song_lastplay on songs( song_lastplay ASC )L#mindexsong_numbersongsCREATE INDEX song_number ON songs( song_number )P#uindexsong_formatsongsCREATE INDEX song_format ON songs( song_format ASC )!yindexsong_genresongsCREATE INDEX song_genre ON songs( song_genre,song_composer,song_artist,song_album,song_disk,song_albumid,song_number )!+ indexsong_genre_descsongsCREATE INDEX song_genre_desc ON songs( song_genre DESC,song_composer,song_artist,song_album,song_disk,song_albumid,song_number ) 'iindexsong_composersongsCREATE INDEX song_composer ON songs( song_composer,song_artist,song_album,song_disk,song_albumid,song_number )1}indexsong_composer_descsongsCREATE INDEX song_composer_desc ON songs( song_composer DESC,song_artist,song_album,song_disk,song_albumid,song_number ){#Iindexsong_artistsongsCREATE INDEX song_artist ON songs( song_artist,song_album,song_disk,song_albumid,song_number ) -]indexsong_artist_descsongsCREATE INDEX song_artist_desc ON songs( song_artist DESC,song_album,song_disk,song_albumid,song_number ) -]indexsong_albumartistsongsCREATE INDEX song_albumartist ON songs( song_albumartist,song_album,song_disk,song_albumid,song_number )7qindexsong_albumartist_descsongsCREATE INDEX song_albumartist_desc ON songs( song_albumartist DESC,song_album,song_disk,song_albumid,song_number )m!/indexsong_albumsongsCREATE INDEX song_album ON songs( song_album,song_disk,song_albumid,song_number )|+Cindexsong_album_descsongsCREATE INDEX song_album_desc ON songs( song_album DESC,song_disk,song_albumid,song_number )`indexsong_disksongsCREATE INDEX song_disk ON songs( song_disk,song_albumid,song_number )o)+indexsong_disk_descsongsCREATE INDEX song_disk_desc ON songs( song_disk DESC,song_albumid,song_number ) 0|iVC0 Flockf  Flockf  Flockf  Flockf Flockf Flockf Flockf Flockf Flockf Flockf  Flockf 0|iVC0 Flockf  Flockf  Flockf  Flockf Flockf Flockf Flockf Flockf Flockf Flockf  Flockf nYD/ M^Flockf  M]Flockf M]Flockf M]Flockf M\Flockf  M\Flockf  M\Flockf M\Flockf M\Flockf M\Flockf  M\Flockf nYD/ M\Flockf  M\Flockf  M\Flockf M\Flockf M\Flockf M\Flockf  M\Flockf M]Flockf M]Flockf M]Flockf M^Flockf  xTk, x5K-/home/mark/Music/Bell X1/Flock/11. Lamposts.mp37K1/home/mark/Music/Bell X1/Flock/10. Trampoline.mp3EKM/home/mark/Music/Bell X1/Flock/09. My First Born for a Song.mp3>K?/home/mark/Music/Bell X1/Flock/08. Just Like Mr Benn.mp3;K9/home/mark/Music/Bell X1/Flock/07. Bigger Than Me.mp34K+/home/mark/Music/Bell X1/Flock/06. Natalie.mp39K5/home/mark/Music/Bell X1/Flock/05. Bad Skin Day.mp3=K=/home/mark/Music/Bell X1/Flock/04. He Said She Said.mp3?KA/home/mark/Music/Bell X1/Flock/03. Rocky Took a Lover.mp32K'/home/mark/Music/Bell X1/Flock/02. Flame.mp38K3/home/mark/Music/Bell X1/Flock/01. Reacharound.mp3'ROg+5r/~Ocf4s o)y hhu1f]BHJ(yq~gm o lljgiflLig jgg jfffl jf ifgTmg$vDP'ys!x hlih!xj j$sZ锹hgue d=W萶nh jigjlR懲: l l nns/{8s i3{鎹 f i(yaꖼqf(wP舴፳z=xm艭܄|a]C5U^qK晼nۆ~gL j噻z blouCw国ey!ke4}v~@sjbNnZn60{폼fh쏽;NdB9㈱JE\ߎܓ^Iyx3t0uE&r?:_^|&t3|2|(w{zPa!x}CJeNچ~OfI,|㈴Ꞽᔸ`W8~ᖶdXᙻbYx2yCKGxהӒJKBls0|ha@}J:|aQ圿ڑOA?敻;ߘ,{]݆C=৻掵5Cp/{M施Q1|4jS(y]g0}]\Vmr4\]3~lnW]yLۨ֔g@ࢼgb⇲\9rFL劺ceX4~_hz5YUP݆nEZ拹@2}wad:=刹Ull`痾ꕾ1u`loV(x=[fOQ?)vmEp|_wncomFm؁`?e'zKf@nAㇶ⟶膲g,zޫߠⅶ@jE恱Mw@VP\,xJ犴ٕWh3ܘ抵K+}hێQO8~7TGR4|뗽3RrZZ5}V@|MDQa4~V؅R܀0zG@7CD/}׃Rh~Ky>|mDxm3|ሰY_zE, kfĨ.z;˽tᒻzՌuht(n ju+~ڬۛ@!zjeǴ'u;pޔsً}dnA?Kfft,lFеiݜqxߍWxxeƻVݑ{Ҏ_(tpRgwH{Euڡᕺy8~i2um-y,}'yc}٘`_1pCxԽ,gU:pٌ`,mk-(tpW62vw:3OH)hyϝF2|rdI|ت٨ñ4kFU5"zgߴS0OR䆲7{F]mV7.s~8-GQ,loʛG3u eFwְø/i>R7%x劸Y˼>p7rۘ.r*{HRM♼b_&qibWpuߙlJS5i@t=t؆j{ZdD(r;rߋIu(i?UR凱ω(UҶFx5oܓ,t$wIZJdc%rk̿fSmuѢoLR6iOa剱d.zREg;0h{vhdh/oW.l胳?wMmgp~B{1taJQ)m.wOݖRSPTE0(vRw.w%wCOMRTe㋶e6{L;A[UZ}#hHT?W>hdkj`l5qcJSJehhj;{$k`EV2v4yWګNzHxߠ#nsI[Xчޔg[ff if0cXllׇsTQ+xe↷OsFr╻ry㖻ކ\MYD-vN䛽_/p=RG}qk暿ߋU۱KxLvٙ'k!qGYY܉ޜfa!k[yf5}hSrf΍kMQ1|fug?6x㍷J8KI.jrⅵ=idjghHiKxĬ6lDQ;3w݃L?YYz8k㏴=~\rb97tP4|HJ2nl䄷O+{!wkgerjIuݩï4gCUA)y꘿c*uk;Y)s*.hnҥUu^'o*z hiih'}#kJ;ul)j's3!mEqfnZ݋ܨZ7wF}'nnJ}܉7x5z4raen=x\$gڸ:r큹&k4zG}]=&mnLք-|!o&lQ2po8xx)rcCc瀶گ'nqVnrwAtㅮO0qq9{z(p\d/peS)tq⎺Xln%uEoᒳ"]'sebo,pX*u.v=wKEfzhc"k$hQnSG'vdL唺OEdnQor`a%vjW6}~ޗp?m1i5u6wGbښӅK~;*tUU(tu e91yYfgh'u-F)w_}BWI[_c兰ۚݖlb^VR:{ph5|:?#yPU/jc d>;iD!dh)q0zH3z^x〪1u*v.6:^߅狿lg d*|%irmW1zwG}킹]uY@~F$t't=5b_2)zg/}:mԃs^{8v̨0`᛿;v/|!tGC+y7|'l9*s:^4kGOGzwY9~Geq%pmQ3w֨*c7v/}"vLj3xKچi4~En9fKJ{L~i0w6dq=h㙹ފOg2iK/lɋNGm^&qJul1{6 foHo섳Rh=hJ*jҍ̃[CcL:o]A%ppXaۙgJfL;nvC|+tnf݁˃UCgE7qoD}'vo[`ڬTErݡ^"tX؄ঽa.t,gjNylXb5m<,eRF"q⟽㝾\&tPFwwg8Jdギ&nqS?|Ө/_.s0pZd:{0w _d<<4|kGH|Mtwj9Hgڃ+mnSFziHꜾ:x5Xdp榿e1}W/y|TfrgZU^4yshMEf/it,j;6;,~cpIeQ5|8L+kHa=w_a6nl j85|B hh=s䆸T%obfd#q3~Fe= cnDJgkig*sW+h{md!x%s)nZS0}:F+oJX0icsil6})lYx5{dN g1ۀhha\ f1v+r bd_ iq;h;v f4{\ebadce e|Fleq+"lFIfg?$ri%t섷 dfgceJdf/zi앿QّXTi j#u6zN=}߅gfr a ^wh6|dgl5j jqz+w ghfi@gbdhfhe7'p ehilm. taejhdgk[ eghg$zX炵b\ھ+jbpx"a^푾%t;&y&u*l׃@vMe lRfe:{4sff>Ikdfmvgfgffi,9 hjifh0wgeikiihhabdfhiiehhhj8"qccgfm+uggfgiio@`딾 eK:{X4;*{u銼Av=nn#iY e!}l kih gjjikifgiikiiffffiA1|hijeg i igeiigfjhefggggfhhhhjhhdfhe.{ cigeg m= fgY[qh݆"o c0t3t؍_i9!tgQ>.}:c8~y0 ivvkmjjpimkhfeijgh fdb%jAKV hikegifoeggf h {dfhfgeee dfl4}-hehfhfn egifg+zHcde h= ifgA>c a!hQ^Ѿ"gT.{.}fM&zolTxcgu ijkkigiighighjegf fg(oHud gjkfggh!{effeh?afed bc(lA~ho gqggihl gekgg znhcde fg c a*nB~c玶q!y,'|qFhdh h0}ehdhjge upegg jge dd k2uZ儴Dgijfgg i2efedaM`"o2xN}[b!ikfr g iglgg l jcb d2{!j>~nskf l lffe`bb j5dcaxmh fP\ eeg\!g9zk䓷#n hgggehlA c d fi;s썶ގIcrjjfi l liih heg.rO,u egumjgklfdrV ggjcgg fZ_(kHzpkiebc$v4tdH}i攼3vflmjge hg `h2w^䇳ffxskklydh1}i hee0v f+pYؔݼro j ec'jP+#hhjjefkJr햺׼gg g&ijk nef0zc#k@}ḑIvq={W恱`g*rKvپܾ0ygiA i ipj(lHzݓҌڼ٧݊ܽںɣ7geD;v[₮tؿֲȭ>uVf앾ں޶ܷ׽̖Z)kcݷܿʢ׸Դؿߜ؊kfbቲ_4tE5yd5zJ`ddP} e0u銹 dM;vLdG[d!f{y[4}%sda|hF}(o[RؚpfO4 k d0}ome搵s dhdf琸 `j莻 _P9} l6veecdi]7trQhK>Cv(m]숽n&p$ic,ߖ2o1x51e_D+zaFc e_f a"d揻`:|S g%kHi fe c2{f+x3.s`ਸ5m i(t?~]Q,uqB5nݰbGqؓ苷]"uW釴a9{6gPFꖽ]L-xmA:pिծJr|/t/hvJCތZ@y-zkM7v]{ّj<}Beᅰ/noRT0tsk fj'nb]F,y&}u=|!k;ckCnmfjet_%q+}t=UaG#|.&s6s"l>%ifc&hꖸsinh o+~&v:HѡBt4S(g*kcuF3 fdf4!fdن;tD4)y*ls٤zLp3M(g+ockyjb4q"i`ӈ?xD1&}!ofbG4t8-|y҇_5p8xLy hbf e;y7p0m]s;-y1nSR_ኳdaJ5o7+yp؄c8q:nY}giid:p5h]y䒾=0y.qWm=~_r;c~剸lgdgi0pwٯݑ>H쌼,siPdn;\p4d脫ڽ>{$|mi_|㔴㑻AGٕ-o$u1}FiQFs^ieek(6߃ZT|уيυ/tRقk,z-q^ޘ2j*v*}>|gLFwExL)|mg؇/oT^O=lF}j䛶cikfeCNe蜿l9x2xZOv[RBaJf⚾ؓb[ePhbyp;w@x-u%g脼Xܖ2p4pgklkj[ bߨDq&j(x1p뒹F&xl煸_ێ5v5r獷p?_|怴 d fYe"a쌹8xg#uc퍿鏼0x-tὁnl,v igh iatjjVddk$|j/kXӽڍי}֐Ҟڂ5q#l&|j떿/w+rKw&hfjhW^beVwvn]de䆷Oc;rL*kdۤ|C> hegfp*nkQεq8nc!p@㍵nf0~=mڞuWieӧ]_Te8rR0}g `頾ݨq5'|.HOeiplSδr8peu<ߝP<~pAܱHv*r*80{EĦXwu6u-k ifk&~kFUڸẃf7x7."ps=mhh8}Btޤ^0s^ڇx煷>3rڑL1|DQ9wbH$ws&lgi hKyڠJ~@}Y>urZsvepH[cdRrpah hG mpiXn`\c^bT'nbkрlbj`Ey:w@-z*q{呴9z+x;8yNLzmd[twк!bhJZacI~b7}Efn"fp h fLk``bdbT*tfjLq:yrv(p90.uWriAS$we凶C&wq[OYobAkG*qd`]B~|DDacY&t2}q=jI_gPIGi1upo/u=0'p]jV"uLO-kRSg-}MTs_B#qE$q_ablC}e?脽選$l0x*z1{akb@V1e]$t|XJOj`G!g@ hcvfCؚvD|:)v6zL-t57~H8u^ddމロ˾cjNTdZFtPGHfWX_iqVbЎֿ\PaZP$phi슽@}9xې<2~MNE㑿gZ"v+thcgLxӘW6}Q> qݵ?q?qeޕ摾\7~6lߘIw.oYw݋k푿>{5tԌA0|OHC㏿䈵_Cl1oCv7nj j3ݎY9|XD p;N>%u9ٸGv*o.|C<>:wՓװY|q/y(zl#k+H|ēX3zC7"pHb0t嘺K.zkg֞}re&l痾nn[Kf+pg!y5{cb)xNzjMZUٹhtRb/pC)}lf܎Z~\0z29ỷLcEйm-qd%w3}89376b5c53a4aa1158f16ea196c48557unity-scope-guayadeque-0.1+13.10.20130927.1/tests/data/mock_guayadeque_fail0000644000015700001700000000000612221263400026577 0ustar pbuserpbgroup00000000000000 unity-scope-guayadeque-0.1+13.10.20130927.1/tests/test_guayadeque.py0000644000015700001700000000425212221263400025357 0ustar pbuserpbgroup00000000000000#! /usr/bin/python3 # -*- coding: utf-8 -*- from gi.repository import Unity from unittest import TestCase import imp class ResultSet(Unity.ResultSet): def __init__(self): Unity.ResultSet.__init__(self) self.results = [] def do_add_result(self, result): self.results.append({'uri':result.uri, 'title':result.title, 'comment':result.comment, 'icon':result.icon_hint}) class ScopeTestCase(TestCase): def init_scope(self, scope_path): self.scope_module = imp.load_source('scope', scope_path) self.scope = self.scope_module.load_scope() def perform_query(self, query, filter_set = Unity.FilterSet.new()): result_set = ResultSet() ctx = Unity.SearchContext.create(query, 0, filter_set, {}, result_set, None) s = self.scope.create_search_for_query(ctx) s.run() return result_set class TestGuayadeque(ScopeTestCase): def setUp(self): self.init_scope('src/unity_guayadeque_daemon.py') def tearDown(self): self.scope = None self.scope_module = None def test_guayadeque_search(self): self.scope_module.GUAYADEQUE_DBFILE = 'tests/data/' expected_results = ["/home/mark/Music/Bell X1/Flock/01. Reacharound.mp3", "Reacharound", "album://Bell X1/Flock", "Flock"] results = [] for s in ['flock']: result_set = self.perform_query(s) results.append(result_set.results[0]['uri']) results.append(result_set.results[0]['title']) results.append(result_set.results[1]['uri']) results.append(result_set.results[1]['title']) self.assertEqual(results, expected_results) def test_guayadeque_failing_search(self): self.scope_module.GUAYADEQUE_DBFILE = 'tests/data/mock_guayadeque_fail' for s in ['upnriitnyt']: result_set = self.perform_query(s) self.assertEqual(len(result_set.results), 0) if __name__ == '__main__': unittest.main() unity-scope-guayadeque-0.1+13.10.20130927.1/src/0000755000015700001700000000000012221263645021251 5ustar pbuserpbgroup00000000000000unity-scope-guayadeque-0.1+13.10.20130927.1/src/unity_guayadeque_daemon.py0000644000015700001700000003450312221263400026522 0ustar pbuserpbgroup00000000000000#! /usr/bin/python3 # -*- coding: utf-8 -*- # Copyright(C) 2013 Mark Tully # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . from gi.repository import GLib, Gio from gi.repository import Unity import gettext import urllib.parse import dbus import hashlib import unicodedata import os import shutil import sqlite3 APP_NAME = 'unity-scope-guayadeque' LOCAL_PATH = '/usr/share/locale/' gettext.bindtextdomain(APP_NAME, LOCAL_PATH) gettext.textdomain(APP_NAME) _ = gettext.gettext GROUP_NAME = 'com.canonical.Unity.Scope.Music.Guayadeque' UNIQUE_PATH = '/com/canonical/unity/scope/music/guayadeque' SEARCH_HINT = _('Search Guayadeque') NO_RESULTS_HINT = _('Sorry, there are no Guayadeque results that match your search.') PROVIDER_CREDITS = _('') SVG_DIR = '/usr/share/icons/unity-icon-theme/places/svg/' PROVIDER_ICON = SVG_DIR + 'service-guayadeque.svg' DEFAULT_RESULT_ICON = SVG_DIR + 'result-guayadeque.svg' DEFAULT_RESULT_MIMETYPE = 'taglib/mp3' DEFAULT_RESULT_TYPE = Unity.ResultType.PERSONAL GUAYADEQUE_DBFILE = os.getenv("HOME") + "/.guayadeque/Collections" c1 = {'id': 'songs', 'name': _('Songs'), 'icon': SVG_DIR + 'group-installed.svg', 'renderer': Unity.CategoryRenderer.VERTICAL_TILE} c2 = {'id': 'albums', 'name': _('Albums'), 'icon': SVG_DIR + 'group-installed.svg', 'renderer': Unity.CategoryRenderer.VERTICAL_TILE} CATEGORIES = [c1, c2] FILTERS = [] m1 = {'id': 'album', 'type': 's', 'field': Unity.SchemaFieldType.OPTIONAL} m2 = {'id': 'artist', 'type': 's', 'field': Unity.SchemaFieldType.OPTIONAL} m3 = {'id': 'genre', 'type': 's', 'field': Unity.SchemaFieldType.OPTIONAL} m4 = {'id': 'year', 'type': 'i', 'field': Unity.SchemaFieldType.OPTIONAL} m5 = {'id': 'track_length', 'type': 'i', 'field': Unity.SchemaFieldType.OPTIONAL} m6 = {'id': 'track_number', 'type': 'i', 'field': Unity.SchemaFieldType.OPTIONAL} EXTRA_METADATA = [m1, m2, m3, m4, m5, m6] SEARCH_SQL = '''SELECT songs.song_name, songs.song_path, songs.song_filename, songs.song_artist, songs.song_album, songs.song_albumartist, covers.cover_path, songs.song_year, songs.song_genre, songs.song_number, songs.song_length FROM songs, covers WHERE songs.song_coverid = covers.cover_id AND (songs.song_name LIKE '%%%s%%' OR songs.song_album like '%%%s%%' OR songs.song_artist LIKE '%%%s%%') ORDER BY song_number''' ALBUM_SQL = '''SELECT songs.song_name, songs.song_path, songs.song_filename, songs.song_artist, songs.song_album, songs.song_albumartist, covers.cover_path, songs.song_year, songs.song_genre, songs.song_number, songs.song_length FROM songs, covers WHERE songs.song_coverid = covers.cover_id AND (songs.song_album like '%%%s%%' AND songs.song_artist LIKE '%%%s%%') ORDER BY song_number''' def get_music_from_guayadeque(query): """Parses Guayadeque's collections into a form we can use""" tracks = [] # Copy guayadeque's database to a backup so we can run searches on that rather than the main database for collection in os.listdir(GUAYADEQUE_DBFILE): collection_tracks = [] guayadeque_dbfile = GUAYADEQUE_DBFILE + "/" + collection + "/guayadeque.db" if not os.path.exists(guayadeque_dbfile): continue guayadeque_backupfile = GUAYADEQUE_DBFILE + "/" + collection + "/guayadeque-scope-backup.db" # Only make a backup of guayadeque's database if the database has been modified since # the last backup copy was made (or if the backup doesn't exist) if os.path.exists(guayadeque_backupfile): if os.path.getmtime(guayadeque_dbfile) > os.path.getmtime(guayadeque_backupfile): shutil.copy2(guayadeque_dbfile, guayadeque_backupfile) else: shutil.copy2(guayadeque_dbfile, guayadeque_backupfile) # Grab all the data we need from the backup conn = sqlite3.connect(guayadeque_backupfile) cursor = conn.cursor() cursor.execute(query) collection_tracks = cursor.fetchall() cursor.close() for track in collection_tracks: tracks.append(track) return tracks def get_album_art(track): """Finds album art for the selected album """ if not track[6] is None: return track[6] # If that fails, thumbnail any embedded album art and use that hashname = unicodedata.normalize("NFKD", unicode(track[4])) + "\t" + unicodedata.normalize("NFKD", unicode(track[3])) file_hash = hashlib.md5(hashname).hexdigest() tb_filename = os.path.join(os.path.expanduser("~/.cache/media-art"), ("album-" + file_hash)) + ".jpg" if os.path.exists(tb_filename): return tb_filename else: try: from mutagen import File audio = File(track[1]) if "APIC:" in audio: artwork = audio.tags["APIC:"].data if not os.path.exists(os.path.expanduser("~/.cache/media-art")): os.makedirs(os.path.expanduser("~/.cache/media-art")) with open(tb_filename, "wb") as img: img.write(artwork) return tb_filename else: return "audio-x-generic" except: # Otherwise, return a generic audio icon return "audio-x-generic" def search(search, filters): ''' Search for help documents matching the search string ''' results = [] tracks = get_music_from_guayadeque(SEARCH_SQL % (search, search, search)) albumresults = [] for track in tracks: title = "" if track[0] is None else track[0] uri = "" if track[1] is None else track[1] + track[2] artist = "" if track[2] is None else track[3] album = "" if track[3] is None else track[4] albumartist = "" if track[5] is None else track[5] year = 0 if track[7] is None else track[7] genre = "" if track[8] is None else track[8] track_length = 0 if track[10] is None else track[10] track_number = 0 if track[9] is None else track[9] try: albumart = get_album_art(track) except: albumart = "" albumuri = "album://" + albumartist + "/" + album results.append({'uri': uri, 'icon': albumart, 'category': 0, 'title': title, 'album': GLib.Variant('s', album), 'artist': GLib.Variant('s', artist), 'genre': GLib.Variant('s', genre), 'year': GLib.Variant('i', year), 'track_length': GLib.Variant('i', track_length), 'track_number': GLib.Variant('i', track_number)}) if album not in albumresults: results.append({'uri': albumuri, 'icon': albumart, 'category': 1, 'title': album, 'album': GLib.Variant('s', album), 'artist': GLib.Variant('s', artist), 'genre': GLib.Variant('s', genre), 'year': GLib.Variant('i', year), 'track_length': GLib.Variant('i', track_length), 'track_number': GLib.Variant('i', track_number)}) albumresults.append(album) return results class Preview(Unity.ResultPreviewer): def do_run(self): album = self.result.metadata['album'].get_string() artist = self.result.metadata['artist'].get_string() preview = Unity.MusicPreview.new(self.result.title, '', None) preview.props.image_source_uri = 'file://%s' % self.result.icon_hint preview.props.subtitle = self.result.metadata['artist'].get_string() if self.result.uri.startswith("album://"): tracks = get_music_from_guayadeque(ALBUM_SQL % (album, artist)) for track in tracks: track = Unity.TrackMetadata.full('file://%s%s' % (track[1], track[2]), track[9], track[0], track[3], track[4], track[10]) preview.add_track(track) else: track = Unity.TrackMetadata.full('file://%s' % self.result.uri, self.result.metadata['track_number'].get_int32(), self.result.title, self.result.metadata['artist'].get_string(), self.result.metadata['album'].get_string(), self.result.metadata['track_length'].get_int32()) preview.add_track(track) view_action = Unity.PreviewAction.new("play", _("Play"), None) preview.add_action(view_action) show_action = Unity.PreviewAction.new("show", _("Show in Folder"), None) preview.add_action(show_action) return preview # Classes below this point establish communication # with Unity, you probably shouldn't modify them. class MySearch(Unity.ScopeSearchBase): def __init__(self, search_context): super(MySearch, self).__init__() self.set_search_context(search_context) def do_run(self): ''' Adds results to the model ''' try: result_set = self.search_context.result_set for i in search(self.search_context.search_query, self.search_context.filter_state): if not 'uri' in i or not i['uri'] or i['uri'] == '': continue if not 'icon' in i or not i['icon'] or i['icon'] == '': i['icon'] = DEFAULT_RESULT_ICON if not 'mimetype' in i or not i['mimetype'] or i['mimetype'] == '': i['mimetype'] = DEFAULT_RESULT_MIMETYPE if not 'result_type' in i or not i['result_type'] or i['result_type'] == '': i['result_type'] = DEFAULT_RESULT_TYPE if not 'category' in i or not i['category'] or i['category'] == '': i['category'] = 0 if not 'title' in i or not i['title']: i['title'] = '' if not 'comment' in i or not i['comment']: i['comment'] = '' if not 'dnd_uri' in i or not i['dnd_uri'] or i['dnd_uri'] == '': i['dnd_uri'] = i['uri'] i['provider_credits'] = GLib.Variant('s', PROVIDER_CREDITS) result_set.add_result(**i) except Exception as error: print(error) class Scope(Unity.AbstractScope): def __init__(self): Unity.AbstractScope.__init__(self) def do_get_search_hint(self): return SEARCH_HINT def do_get_schema(self): ''' Adds specific metadata fields ''' schema = Unity.Schema.new() if EXTRA_METADATA: for m in EXTRA_METADATA: schema.add_field(m['id'], m['type'], m['field']) #FIXME should be REQUIRED for credits schema.add_field('provider_credits', 's', Unity.SchemaFieldType.OPTIONAL) return schema def do_get_categories(self): ''' Adds categories ''' cs = Unity.CategorySet.new() if CATEGORIES: for c in CATEGORIES: cat = Unity.Category.new(c['id'], c['name'], Gio.ThemedIcon.new(c['icon']), c['renderer']) cs.add(cat) return cs def do_get_filters(self): ''' Adds filters ''' fs = Unity.FilterSet.new() #if FILTERS: # return fs def do_get_group_name(self): return GROUP_NAME def do_get_unique_name(self): return UNIQUE_PATH def do_create_search_for_query(self, search_context): se = MySearch(search_context) return se def do_activate(self, result, metadata, id): album = result.metadata['album'].get_string() artist = result.metadata['artist'].get_string() if id == 'show': if result.uri.startswith("album://"): tracks = get_music_from_guayadeque(ALBUM_SQL % (album, artist)) filename = tracks[0][1].decode('utf-8') else: filename = result.uri dirname = os.path.dirname(filename) os.system("xdg-open '%s'" % str(dirname)) else: albumtracks = '' if result.uri.startswith('album://'): tracks = get_music_from_guayadeque(ALBUM_SQL % (album, artist)) for track in tracks: albumtracks = albumtracks + ' \'%s\'' % (urllib.parse.unquote(str(track[1]) + str(track[2]))) else: albumtracks = '\'%s\'' % result.uri print(albumtracks) os.system('guayadeque %s' % albumtracks) try: session_bus = dbus.SessionBus() player = session_bus.get_object('org.mpris.guayadeque', '/Player') iface = dbus.Interface(player, dbus_interface='org.freedesktop.MediaPlayer') iface.Play() except Exception as e: print('Error playing file: ' % e) return Unity.ActivationResponse(handled=Unity.HandledType.HIDE_DASH, goto_uri=None) def do_create_previewer(self, result, metadata): rp = Preview() rp.set_scope_result(result) rp.set_search_metadata(metadata) return rp def load_scope(): return Scope() unity-scope-guayadeque-0.1+13.10.20130927.1/src/__init__.py0000644000015700001700000000000012221263400023335 0ustar pbuserpbgroup00000000000000unity-scope-guayadeque-0.1+13.10.20130927.1/setup.py0000644000015700001700000000160712221263400022165 0ustar pbuserpbgroup00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' Setup file for yelp dash plugin ''' from distutils.core import setup from DistUtilsExtra.command import build_extra from DistUtilsExtra.command import build_i18n setup(name='unity-scope-guayadeque', version='0.1', author='Mark Tully', author_email='markjtully@gmail.com', url='http://launchpad.net/ubuntu-scopes', license='GNU General Public License (GPL)', data_files=[('share/dbus-1/services', ['data/unity-scope-guayadeque.service']), #('share/icons/unity-icon-theme/places/svg', ['data/icons/service-guayadeque.svg']), ('share/unity-scopes/guayadeque', ['src/unity_guayadeque_daemon.py']), ('share/unity-scopes/guayadeque', ['src/__init__.py']), ], cmdclass={'build': build_extra.build_extra, 'build_i18n': build_i18n.build_i18n, }) unity-scope-guayadeque-0.1+13.10.20130927.1/setup.cfg0000644000015700001700000000021212221263400022263 0ustar pbuserpbgroup00000000000000[build] i18n=True [build_i18n] domain=unity-scope-guayadeque desktop_files=[('share/unity/scopes/music', ('data/guayadeque.scope.in',))] unity-scope-guayadeque-0.1+13.10.20130927.1/data/0000755000015700001700000000000012221263645021373 5ustar pbuserpbgroup00000000000000unity-scope-guayadeque-0.1+13.10.20130927.1/data/guayadeque.scope.in0000644000015700001700000000146612221263400025161 0ustar pbuserpbgroup00000000000000[Scope] DBusName=com.canonical.Unity.Scope.Music.Guayadeque DBusPath=/com/canonical/unity/scope/music/guayadeque Icon=/usr/share/unity/icons/lens-nav-music.svg QueryBinary=guayadeque _Keywords=guayadeque; RequiredMetadata= OptionalMetadata=album[s];artist[s];genre[s];year[i];track_length[i];track_number[i] Loader=/usr/share/unity-scopes/guayadeque/unity_guayadeque_daemon.py Module=guayadeque.unity_guayadeque_daemon ModuleType=python3 RemoteContent=false Type=music _Name=Guayadeque _Description=This is an Ubuntu search plugin that enables information from Guayadeque to be searched and displayed in the Dash underneath the Music header. If you do not wish to search this content source, you can disable this search plugin. _SearchHint=Search Guayadeque [Desktop Entry] X-Ubuntu-Gettext-Domain=unity-scope-guayadeque unity-scope-guayadeque-0.1+13.10.20130927.1/data/unity-scope-guayadeque.service0000644000015700001700000000023512221263400027351 0ustar pbuserpbgroup00000000000000[D-BUS Service] Name=com.canonical.Unity.Scope.Music.Guayadeque Exec=/usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s music/guayadeque.scope unity-scope-guayadeque-0.1+13.10.20130927.1/data/icons/0000755000015700001700000000000012221263645022506 5ustar pbuserpbgroup00000000000000