From 6b5fc032b3a6e1ad2dbdbb6fca8748e35b34cad5 Mon Sep 17 00:00:00 2001 From: Andrew Flegg Date: Sun, 8 Aug 2010 09:53:45 +0100 Subject: [PATCH] Start of maemo.org service: http://hermes.garage.maemo.org/mo-list.csv will be regularly updated with the latest extract, generated using mo2csv.php. The service will then fetch that CSV file and see if any contacts match. --- mo2csv.php | 52 +++++++ package/share/account-maemoorg.png | Bin 0 -> 1891 bytes .../org/maemo/hermes/engine/maemoorg/provider.py | 32 +++++ .../org/maemo/hermes/engine/maemoorg/service.py | 145 ++++++++++++++++++++ www/mo-list.csv | 84 ++++++++++++ 5 files changed, 313 insertions(+) create mode 100644 mo2csv.php create mode 100644 package/share/account-maemoorg.png create mode 100644 package/src/org/maemo/hermes/engine/maemoorg/__init__.py create mode 100644 package/src/org/maemo/hermes/engine/maemoorg/provider.py create mode 100644 package/src/org/maemo/hermes/engine/maemoorg/service.py create mode 100644 www/mo-list.csv diff --git a/mo2csv.php b/mo2csv.php new file mode 100644 index 0000000..7751b4c --- /dev/null +++ b/mo2csv.php @@ -0,0 +1,52 @@ + 2010. + * Released under the Artistic Licence. + */ + +$BASE_URL = 'http://maemo.org/profile/list/?org_openpsa_qbpager_net_nehmer_account_list_page='; + +for ($i = 1; $i < 250; $i++) { + $url = $BASE_URL.$i; + + $doc = new DOMDocument(); + @$doc->loadHTMLFile($url); + + $table = $doc->getElementsByTagName('tbody'); + $rows = $table->item(0)->childNodes; + + if (!is_null($rows)) { + foreach ($rows as $row) { + $columns = $row->childNodes; + + if (!is_null($columns)) { + $img = $columns->item(0)->getElementsByTagName('img')->item(0); + $img_url = $img->getAttribute('src'); + $img_url = $img_url == 'http://static.maemo.org/style_maemo2009/img/profile/default-icon.png' ? '' : $img_url; + + $element = $columns->item(2)->getElementsByTagName('a')->item(0); + $username = $element->nodeValue; + $user_url = $element->getAttribute('href'); + + $fullname = trim($columns->item(4)->nodeValue); + + $title = trim($columns->item(6)->nodeValue); + + $karma = intval(trim($columns->item(8)->nodeValue)); + + if ($fullname || $img_url) + echo "$username,$fullname,http://maemo.org$user_url,$title,$karma,$img_url\n"; + } + } + } +} +?> + diff --git a/package/share/account-maemoorg.png b/package/share/account-maemoorg.png new file mode 100644 index 0000000000000000000000000000000000000000..4e63c264084850d27de6a5912b07e207c2d4f34a GIT binary patch literal 1891 zcmV-p2b}ncP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igb$ z2^=T85o+`R000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000KQNkl85E{G~Ms%XU~ZBPibi$ZvsR|q)7xNQvhg~y&5k3BQ?%=n%z=Ksh441*F{ zj&$`u&OOh2?s;IX6#!LrRCS-K9#_@0s;aeCeXxNK|NRm1X;nRLt=*@p4uCHkRZUoH z59>12Fz^^Yu)Zw5UPo)~VQXyyPYb6`_(Pcn;UNMW;_EdDDB*~z?gNgp463RkBK{LV zX#kIc_jv*m*zyAd?5`7!x3LjJR2!nc5bqgO5wHyV#S6H&ud1(vM^t6}xW0X_ctU0+ zpwR<@1MbpBj2{&bifR=vs!COX;DLJtQtx5^U)|p2zyV=7CZvv0LwYx;xeqg`6zNo& zTt1H=w6?a8NF-=)Us2;$5%IVxf(3CZrWVs^_BL7=2fKhY#i3;l675BtrV0c`w1{FHP$MX^{Cfac~VO~eyy+_Zt`o_&^hJhmL=o?}G}sunwO0!IFb z&YVLRXGFAwI;|>CbV1jPnDswJVjC*wqgKRPYej@)a+(t-|G}+Ww5JkBMEfq|#~q?6V<;hHg_REU;li z58r?3dvtVk2!PFxsr}>^=$&`LD$=(Y9efo@^IQe&)nnG;f{w;Rx+=1gbHBnqB6!_@OSuUKv$b2rxGh4Rs;!CecTk|wa zmky{M`7<~n}2iJ8U2+U9@#JY7~p;#(1IyS+0GLKuDWL@@coY5m#31NC(#cX{G)7P?+ z7A7lspqjnp;W<8-cUHujS+V^`FmRS)@)~Ag3eDd`B2OV5yU@Y}m}U^Ety5}2LLdg* zNaYAxTUu~kS97@>*=$xDl*DQw5fNQnT;$5NL7oVAYG3ag5-Pq^ zKY_JBtXLV$tg0Zcsx3ol7Mj~t+*UDdZ3&IXW90LBhKK)6sZqu`Boss3sCo+t#lUTa!mE+aZ;R94-{0Tf-cE9Qn$giQ?%%&pI+H<+p}bU}p$lL&HE5Wx^fZPc7-cj_^ zH_^;6v~NIqUqhnn#8p*|Mx*TA^8%{M(9mrL1}-r)bemW#rUGQMSu(S;0QB^9vwQbW zKL5`M7cO4ZaFfME*1*=^A`*qWe?iASL}$)oBHgN?2wKdbbHh+vKoY&k=7X43yAjZu zVwB0ua{067ZAN5mHQ#v)3l=)m9RV5s5 zp<`u-u3EK99LGG+4^-%_ia3??E=;J+To-a9P|kxJf#`ZQZCgc}R(K><5c7B%lBxl9 z4T;vaMaw(`3`|XP5pYLcr(0FhqpfM-Jny02mg>J+;Z+uhRIM{WCeSWRU5BKNTJAuK zR$q7{d_BGQUsToie8vD5e8D23A`(nQ5A`!23Mnz>wo>OpA$V9hy5Y7W;peb^|PFP$of+FfI$t1(}v@Dz!NnSbA$IU#CyEb d9`Bm*{J%HufENy7d1wFt002ovPDHLkV1l8 2010. + Released under the Artistic Licence.""" + + + # ----------------------------------------------------------------------- + def get_name(self): + """Return the display name of this service. An icon, of with the lower-case, + all-alphabetic version of this name is expected to be provided.""" + + return 'maemo.org' + + + # ----------------------------------------------------------------------- + def has_preferences(self): + """Whether or not this provider has any preferences. If it does not, + open_preferences must NOT be called; as the behaviour is undetermined.""" + + return False + + + # ----------------------------------------------------------------------- + def service(self, gui_callback): + """Return the service backend""" + + return org.maemo.hermes.engine.maemoorg.service.Service() diff --git a/package/src/org/maemo/hermes/engine/maemoorg/service.py b/package/src/org/maemo/hermes/engine/maemoorg/service.py new file mode 100644 index 0000000..1fc91c2 --- /dev/null +++ b/package/src/org/maemo/hermes/engine/maemoorg/service.py @@ -0,0 +1,145 @@ +import urllib +import csv +import org.maemo.hermes.engine.service +from org.maemo.hermes.engine.friend import Friend + +class Service(org.maemo.hermes.engine.service.Service): + """maemo.org backend for Hermes. + + Copyright (c) Andrew Flegg 2010. + Released under the Artistic Licence.""" + + #_account_url = "http://hermes.garage.maemo.org/mo-list.csv" + _account_url = "file:///home/andrew/src/scratchbox/hermes/www/mo-list.csv" + + # ----------------------------------------------------------------------- + def __init__(self): + """Initialise the maemo.org service.""" + + org.maemo.hermes.engine.service.Service.__init__(self, "maemo.org") + + self._api_email = api_email + self._api_key = api_key + + self._address_to_contact = {} + self._hash_to_address = {} + self._hash_has_gravatar = {} + + self._friends_by_contact = {} + self._contacts_by_friend = {} + + + # ----------------------------------------------------------------------- + def pre_process_contact(self, contact): + """Extracts addresses from the contact.""" + + for address in contact.get_emails(): + self._address_to_contact[address] = contact + + + # ----------------------------------------------------------------------- + def process_friends(self): + self._lookup_addresses() + + + # ----------------------------------------------------------------------- + def process_contact(self, contact): + """On first call (with a contact missing a photo), go get data from + Gravatar's servers.""" + + if not self._has_photo(contact): + for address in contact.get_emails(): + hash = self._get_hash_for_address(address) + if (self._hash_has_gravatar.has_key(hash) and self._hash_has_gravatar[hash]): + friend = Friend(contact.get_name()) + friend.set_photo_url(self._get_url_for_email_hash(hash)) + self._register_match(contact, friend) + return friend + + return None + + + # ----------------------------------------------------------------------- + def get_unmatched_friends(self): + """Will always return empty list - Gravatar only reacts on e-mail + addresses from existing contacts.""" + + return [] + + + # ----------------------------------------------------------------------- + def _get_friends(self): + return self._contacts_by_friend.keys() + + + # ----------------------------------------------------------------------- + def _get_contacts_with_match(self): + """Returns a dict with Contact objects as keys and Friend objects as + values""" + + return self._friends_by_contact + + + # ----------------------------------------------------------------------- + def _register_match(self, contact, friend): + friend.set_contact(contact) + self._friends_by_contact[contact] = friend + self._contacts_by_friend[friend] = contact + + # ----------------------------------------------------------------------- + # FIXME + def _has_photo(self, contact): + return False + + + # ----------------------------------------------------------------------- + def _lookup_addresses(self): + """Constructs hashes for address_to_contact, makes call to the Gravatar.com service and updates + self._hash_has_gravatar""" + + addresses = self._address_to_contact.keys() + if len(addresses) == 0: + self._set_hash_information({}) + else: + args = { "apikey" : self._api_key} + hashes = self._construct_hashes(addresses) + args["hashes"] = list(hashes) + url = self._api_url + self._set_hash_information(self._get_hash_info_from_server(args, url)) + + + # ----------------------------------------------------------------------- + def _get_hash_info_from_server(self, args, url): + """Makes the actual XML-RPC call - override this for testing""" + + service = xmlrpclib.ServerProxy(url) + return service.grav.exists(args) + + + # ----------------------------------------------------------------------- + def _set_hash_information(self, hash_info): + self._hash_has_gravatar = hash_info + + + # ----------------------------------------------------------------------- + def _get_url_for_email_hash(self, hash, default="404", size="128"): + """Assembles the URL to a gravatar, based on a hash of an e-mail address""" + + return self._image_url_base + urllib.urlencode({'gravatar_id':hash, 'd':default, 'size':size}) + + + # ----------------------------------------------------------------------- + def _construct_hashes(self, addresses): + """Creates hashes for all addresses specified, returning a set of hashes""" + + result = set() + for address in addresses: + hash = self._get_hash_for_address(address) + self._hash_to_address[hash] = address + result.add(hash) + + return result + + # ----------------------------------------------------------------------- + def _get_hash_for_address(self, address): + return hashlib.md5(address.lower()).hexdigest() diff --git a/www/mo-list.csv b/www/mo-list.csv new file mode 100644 index 0000000..109e62d --- /dev/null +++ b/www/mo-list.csv @@ -0,0 +1,84 @@ +sjgadsby,Stephen Gadsby,http://maemo.org/profile/view/sjgadsby,Millersville University of Pennsylvania,2923,http://static.maemo.org/static/6/6a34a030755811df923a53c3563510b210b2_avatar_thumbnail +qgil,Quim Gil,http://maemo.org/profile/view/qgil,Nokia,2421,http://static.maemo.org/static/2/2dcbe7667e1111dc81ab39741aafcf71cf71_avatar_thumbnail +qwerty12,Faheem Pervez,http://maemo.org/profile/view/qwerty12,,2132,http://static.maemo.org/static/1/12bcc9f8582c11dea7ce8340060c27df27df_avatar_thumbnail +jaffa,Andrew Flegg,http://maemo.org/profile/view/jaffa,,1916,http://static.maemo.org/static/9/988b4396359711de95556b28d6d0d919d919_avatar_thumbnail +yerga,Daniel Martín Yerga,http://maemo.org/profile/view/yerga,,1703,http://static.maemo.org/static/9/92063890ba4f11deae2ddbb945d05ee15ee1_avatar_thumbnail +thp,Thomas Perl,http://maemo.org/profile/view/thp,,1543,http://static.maemo.org/static/8/808f3c50735011df8631c7d306f47e897e89_avatar_thumbnail +texrat,Randall Arnold,http://maemo.org/profile/view/texrat,,1501,http://static.maemo.org/static/7/7f18c9be8a4811de90fbf38186316ea36ea3_avatar_thumbnail +generalantilles,Ryan Abel,http://maemo.org/profile/view/generalantilles,,1478,http://static.maemo.org/static/3/3a6a13284c3611ddaf0029d80a2ba8e6a8e6_avatar_thumbnail +fms,Marat Fayzullin,http://maemo.org/profile/view/fms,,1441, +vdvsx,Valério Valério,http://maemo.org/profile/view/vdvsx,,1395,http://static.maemo.org/static/4/4f4205ae786311dd8af0695670d3a77fa77f_avatar_thumbnail +timsamoff,Tim Samoff,http://maemo.org/profile/view/timsamoff,,1389,http://static.maemo.org/static/d/db692e08ae8211de9b967384a8b3a02ca02c_avatar_thumbnail +framstag,Tim Teulings,http://maemo.org/profile/view/framstag,,1342,http://static.maemo.org/static/2/2561bce8857a11dc971b33d91d2666496649_avatar_thumbnail +krisse,,http://maemo.org/profile/view/krisse,,1187,http://static.maemo.org/static/8/8081371ab32d11de8618e9cab2eefdb8fdb8_avatar_thumbnail +qole,alan bruce,http://maemo.org/profile/view/qole,,1157,http://static.maemo.org/static/b/bb7cdee6176011de842b71ab8f46c71cc71c_avatar_thumbnail +thoughtfix,Daniel Gentleman,http://maemo.org/profile/view/thoughtfix,ThoughtFix LLC,1131, +achipa,Attila Csipa,http://maemo.org/profile/view/achipa,,1131,http://static.maemo.org/static/6/650bb35e376f11df948bfd3e5433b60eb60e_avatar_thumbnail +andre,Andre Klapper,http://maemo.org/profile/view/andre,Openismus,1115,http://static.maemo.org/static/1/1edcf906182211dd8d37532f1b4a8e8b8e8b_avatar_thumbnail +khertan,Benoît HERVIER,http://maemo.org/profile/view/khertan,,1105,http://static.maemo.org/static/2/2768cc925d4811ddbde0bda2bf596c3e6c3e_avatar_thumbnail +d-iivil,Ricky Tournee,http://maemo.org/profile/view/d-iivil,IVK Music Finland LTD,1091,http://static.maemo.org/static/7/750a64b6f90411dea6bf7f8b15c1b3e4b3e4_avatar_thumbnail +dneary,Dave Neary,http://maemo.org/profile/view/dneary,Neary Consulting,1083,http://static.maemo.org/static/5/5711668a114d11dda48baff2827838c438c4_avatar_thumbnail +wazd,Andrew Zhilin,http://maemo.org/profile/view/wazd,,1016,http://static.maemo.org/static/2/2ec4fa36d35c11dcab97379d0297a79ca79c_avatar_thumbnail +pycage,Martin Grimme,http://maemo.org/profile/view/pycage,Lintegra,1006, +stskeeps,,http://maemo.org/profile/view/stskeeps,,981,http://static.maemo.org/static/0/014f4d8c804311de9f8dc5801585b947b947_avatar_thumbnail +thenokiablog,Mark Guim,http://maemo.org/profile/view/thenokiablog,thenokiablog.com,941,http://static.maemo.org/static/d/d4dcf1309ccd11deb66353262e963da33da3_avatar_thumbnail +bergie,Henri Bergius,http://maemo.org/profile/view/bergie,Nemein,880,http://static.maemo.org/static/4/4b074d42b71f11dcb27f5742efd5491f491f_avatar_thumbnail +gcobb,Graham Cobb,http://maemo.org/profile/view/gcobb,,853,http://static.maemo.org/static/c/c33b9ad2f13611dda52989eb3232a2bda2bd_avatar_thumbnail +konttori,Urho Konttori,http://maemo.org/profile/view/konttori,Nokia,839,http://static.maemo.org/static/7/7a9507e6d7a911de8f5d178171f3761c761c_avatar_thumbnail +rsuplido,Reggie Suplido,http://maemo.org/profile/view/rsuplido,talk.maemo.org / Maemo Talk,815,http://static.maemo.org/static/3/342024b285d311dea175957af82c60116011_avatar_thumbnail +twaelti,Tom Waelti,http://maemo.org/profile/view/twaelti,IT (Consulting / eGov / Healthcare),805,http://static.maemo.org/static/7/7edbfbea960211de93ab9f3957e3bf18bf18_avatar_thumbnail +tanner,Tom Tanner,http://maemo.org/profile/view/tanner,,793, +torpedo48,Emanuele Cassioli,http://maemo.org/profile/view/torpedo48,,781,http://static.maemo.org/static/a/a7c8a48cf16411de90acbf007a03ddd3ddd3_avatar_thumbnail +epage,Ed Page,http://maemo.org/profile/view/epage,,774,http://static.maemo.org/static/7/753a3db47a8a11df96bc378a6db74ba04ba0_avatar_thumbnail +xfade,Niels Breet,http://maemo.org/profile/view/xfade,,765,http://static.maemo.org/static/9/9e238eb20adc11ddb88a312c2707ea5fea5f_avatar_thumbnail +anidel,Aniello Del Sorbo,http://maemo.org/profile/view/anidel,Orbis UK Ltd,757,http://static.maemo.org/static/3/3f9c5846850711de9a89ef1e31faaf53af53_avatar_thumbnail +ossi1967,Oskar Welzl,http://maemo.org/profile/view/ossi1967,,752,http://static.maemo.org/static/4/41c73bee3b4311deb1083941606690469046_avatar_thumbnail +ossipena,Timo P,http://maemo.org/profile/view/ossipena,,727,http://static.maemo.org/static/b/b27bc738d80a11de99cc9b421d260fbb0fbb_avatar_thumbnail +venomrush,Venomrush .,http://maemo.org/profile/view/venomrush,Experian,719,http://static.maemo.org/static/c/c4d05796c69411de8a6c73ed5e7055e055e0_avatar_thumbnail +zerojay,Jason Carter,http://maemo.org/profile/view/zerojay,Longtail Studios/Ubisoft,711,http://static.maemo.org/static/5/5a14b6947d8111dc86c7a952e067af62af62_avatar_thumbnail +lcuk,Gary Birkett,http://maemo.org/profile/view/lcuk,,690,http://static.maemo.org/static/e/e2e5db22b9b411dd8d1cf7cd4adee3e5e3e5_avatar_thumbnail +baloo,Jamie Bennett,http://maemo.org/profile/view/baloo,Canonical,690,http://static.maemo.org/static/b/b093e98c4a9811dea499cf6c3639adb6adb6_avatar_thumbnail +javispedro,Javier S. Pedro,http://maemo.org/profile/view/javispedro,,686, +bundyo,Kamen Bundev,http://maemo.org/profile/view/bundyo,,667, +lbt,David Greaves,http://maemo.org/profile/view/lbt,Freelance (Nomovok/Nokia),642,http://static.maemo.org/static/7/7dd73f90593311deb0750f2a8ad578c678c6_avatar_thumbnail +fanoush,Frantisek Dufka,http://maemo.org/profile/view/fanoush,,637, +fiferboy,Andrew Olmsted,http://maemo.org/profile/view/fiferboy,,636,http://static.maemo.org/static/8/8f5c49bec1e211de823abf3688c523ee23ee_avatar_thumbnail +flandry,David Falkayn,http://maemo.org/profile/view/flandry,MIT,635, +harbaum,Till Harbaum,http://maemo.org/profile/view/harbaum,,633,http://static.maemo.org/static/2/2fbbc1eeb1b911deb10d63e482e060286028_avatar_thumbnail +pvanhoof,Philip Van Hoof,http://maemo.org/profile/view/pvanhoof,Codeminded BVBA,628,http://static.maemo.org/static/c/c25dcf3c866011dca542bdd6e6dd43f443f4_avatar_thumbnail +smoku,Tomasz Sterna,http://maemo.org/profile/view/smoku,Opera Software ASA,627,http://static.maemo.org/static/c/cd5eee4a4afb11df8edd73a7af2316041604_avatar_thumbnail +ed_,Ed Bartosh,http://maemo.org/profile/view/ed_,,620,http://static.maemo.org/static/6/6ca672bcc18f11debb51271a894520422042_avatar_thumbnail +rcadden,,http://maemo.org/profile/view/rcadden,,619,http://static.maemo.org/static/0/0a7008a47fe411dca00525ced532d5add5ad_avatar_thumbnail +palmsolo,Matthew Miller,http://maemo.org/profile/view/palmsolo,,604,http://static.maemo.org/static/5/56a861b4c1b711dea4181323065f28b428b4_avatar_thumbnail +revdkathy,Kathy Smith,http://maemo.org/profile/view/revdkathy,,599,http://static.maemo.org/static/d/d6542544fe0a11deb3558bda3a03bb84bb84_avatar_thumbnail +archebyte,Mustali Dalal,http://maemo.org/profile/view/archebyte,,598,http://static.maemo.org/static/a/ae69976af4b111de80477102bcf82d4b2d4b_avatar_thumbnail +tekojo,Tero Kojo,http://maemo.org/profile/view/tekojo,Nokia,596,http://static.maemo.org/static/d/d8e317c0a5f411deb62b4f27cd8ea5b5a5b5_avatar_thumbnail +danielwilms,,http://maemo.org/profile/view/danielwilms,,588,http://static.maemo.org/static/7/79feedce0d5111de9be7b760f761f264f264_avatar_thumbnail +frals,Nick Leppänen Larsson,http://maemo.org/profile/view/frals,,588,http://static.maemo.org/static/8/8f09d712fbf611deb44d7126d0ab743c743c_avatar_thumbnail +ukki,Janne Mäkinen,http://maemo.org/profile/view/ukki,,584, +mikecy,mike choy,http://maemo.org/profile/view/mikecy,,578, +jeremiah,Jeremiah Foster,http://maemo.org/profile/view/jeremiah,,574,http://static.maemo.org/static/3/32c5ce40f6aa11ddb40eb5b60e6273597359_avatar_thumbnail +eipi,Sanjeev Visvanatha,http://maemo.org/profile/view/eipi,,573,http://static.maemo.org/static/3/3c0be54c7bdf11de955d91b7b227decfdecf_avatar_thumbnail +agarcia,Alberto Garcia,http://maemo.org/profile/view/agarcia,Igalia,569,http://static.maemo.org/static/6/6edd0a72865a11dcb22fc723b92a51875187_avatar_thumbnail +andrewfblack,Andrew Black,http://maemo.org/profile/view/andrewfblack,,563, +mohammad7410,Mohammad Abu-Garbeyyeh,http://maemo.org/profile/view/mohammad7410,,563, +kulve,Tuomas Kulve,http://maemo.org/profile/view/kulve,Movial,562, +tomaszd,Tomasz Dominikowski,http://maemo.org/profile/view/tomaszd,,555,http://static.maemo.org/static/2/2952fb86cfd911de9290d34442a842f342f3_avatar_thumbnail +murrayc,Murray Cumming,http://maemo.org/profile/view/murrayc,Openismus GmbH,555,http://static.maemo.org/static/6/6053b3fe7d7f11dc8c0d1b14c29c12a412a4_avatar_thumbnail +andy80,Andrea Grandi,http://maemo.org/profile/view/andy80,,544,http://static.maemo.org/static/c/cdfd24107d7c11dcb4adcfc3a0cd29d029d0_avatar_thumbnail +w00t,Robin Burchell,http://maemo.org/profile/view/w00t,Collabora,544,http://static.maemo.org/static/7/7c1ffca46f0e11dfaa21936864a4ae46ae46_avatar_thumbnail +penguinbait,,http://maemo.org/profile/view/penguinbait,,539,http://static.maemo.org/static/3/375a5c9a384611deb8c4392d4c08b420b420_avatar_thumbnail +aisu,Tyler Longwell,http://maemo.org/profile/view/aisu,,527,http://static.maemo.org/static/5/5ab5ffd8133411ddb240c1c7cae3ae58ae58_avatar_thumbnail +hrw,Marcin Juszkiewicz,http://maemo.org/profile/view/hrw,,521,http://static.maemo.org/static/7/7761ee34d00a11dcb425cf0a1de6fc93fc93_avatar_thumbnail +zeenix,Zeeshan Ali,http://maemo.org/profile/view/zeenix,Nokia Oyj,520,http://static.maemo.org/static/d/da5c3510ae8b11debade03419792fbd2fbd2_avatar_thumbnail +mgedmin,Marius Gedminas,http://maemo.org/profile/view/mgedmin,Programmers of Vilnius,518,http://static.maemo.org/static/7/787b4f3e54e611dda758cf4febec1e581e58_avatar_thumbnail +florian,Florian Boor,http://maemo.org/profile/view/florian,kernel concepts,514,http://static.maemo.org/static/2/2a0181a2081f11dd8a6f2bd97c10349e349e_avatar_thumbnail +lardman,Simon Pickering,http://maemo.org/profile/view/lardman,,511,http://static.maemo.org/static/2/2c58e8c47d7c11dcaacecb2f1df197889788_avatar_thumbnail +lucianomw,Luciano Wolf,http://maemo.org/profile/view/lucianomw,,506,http://static.maemo.org/static/d/d3e55cfc521011dea15f31b9fcf463ec63ec_avatar_thumbnail +conny,Cornelius Hald,http://maemo.org/profile/view/conny,,502, +brentdc,Brent Chiodo,http://maemo.org/profile/view/brentdc,,490, +matan,Matan Ziv-Av,http://maemo.org/profile/view/matan,,488, +etrunko,Eduardo Lima,http://maemo.org/profile/view/etrunko,openBossa/INdT,484,http://static.maemo.org/static/e/ef3e446c7dc011dc9eef192ff3eda51ea51e_avatar_thumbnail +benson,Benson Mitchell,http://maemo.org/profile/view/benson,,479, +vaibhavsharma,Vaibhav Sharma,http://maemo.org/profile/view/vaibhavsharma,TheMeeGoBlog.com,477,http://static.maemo.org/static/4/44b73d9c0f1711df9f55dd618a7a7ff97ff9_avatar_thumbnail +rmoravcik,,http://maemo.org/profile/view/rmoravcik,,475,http://static.maemo.org/static/8/8b862b36b9e311dea0e83f065f1cd9b8d9b8_avatar_thumbnail -- 1.7.9.5