From 83aa28b815d862cf2a4fda177c4bef87cd0f6590 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristoffer=20Gr=C3=B6nlund?= Date: Sat, 9 Jan 2010 14:36:18 +0100 Subject: [PATCH] Removed source code from this repository to avoid confusion --- AUTHORS | 13 - COPYING | 675 --------------------------------- ICONS_LICENSE | 14 - Makefile | 71 ---- README.md | 44 +-- data/26x26/jamaendo.png | Bin 1691 -> 0 bytes data/40x40/jamaendo.png | Bin 2889 -> 0 bytes data/64x64/jamaendo.png | Bin 4080 -> 0 bytes data/album.png | Bin 22699 -> 0 bytes data/bg.png | Bin 40421 -> 0 bytes data/bg.xcf | Bin 147066 -> 0 bytes data/icon_artist.png | Bin 1686 -> 0 bytes data/icon_download.png | Bin 293 -> 0 bytes data/icon_favorite.png | Bin 617 -> 0 bytes data/icon_license.png | Bin 951 -> 0 bytes data/jamaendo-26.base64 | 40 -- data/jamaendo.desktop | 10 - data/jamaendo.png | Bin 1691 -> 0 bytes data/jamaendo.xcf | Bin 135940 -> 0 bytes data/logo_2600_710.png | Bin 49942 -> 0 bytes debian/changelog | 32 -- debian/compat | 1 - debian/control | 55 --- debian/copyright | 29 -- debian/jamaendo.menu | 6 - debian/optify | 2 - debian/postinst | 16 - debian/pycompat | 1 - debian/rules | 71 ---- helldon/__init__.py | 170 --------- jamaendo/__init__.py | 55 --- jamaendo/api.py | 952 ----------------------------------------------- jamaui/__init__.py | 42 --- jamaui/albumlist.py | 337 ----------------- jamaui/colors.py | 81 ---- jamaui/console.py | 95 ----- jamaui/draw.py | 23 -- jamaui/favorites.py | 135 ------- jamaui/featured.py | 163 -------- jamaui/fetcher.py | 82 ---- jamaui/listbox.py | 77 ---- jamaui/ossohelper.py | 139 ------- jamaui/player.py | 446 ---------------------- jamaui/playerwindow.py | 388 ------------------- jamaui/playlists.py | 187 ---------- jamaui/postoffice.py | 68 ---- jamaui/radios.py | 80 ---- jamaui/refresh.py | 91 ----- jamaui/search.py | 179 --------- jamaui/settings.py | 121 ------ jamaui/showalbum.py | 219 ----------- jamaui/showartist.py | 246 ------------ jamaui/showplaylist.py | 164 -------- jamaui/songposition.py | 104 ------ jamaui/ui.py | 297 --------------- jamaui/util.py | 58 --- scripts/jamaendo | 23 -- scripts/player | 18 - setup.py | 56 --- tests/testicle | 111 ------ welcome | 1 - 61 files changed, 4 insertions(+), 6284 deletions(-) delete mode 100644 AUTHORS delete mode 100644 COPYING delete mode 100644 ICONS_LICENSE delete mode 100644 Makefile delete mode 100644 data/26x26/jamaendo.png delete mode 100644 data/40x40/jamaendo.png delete mode 100644 data/64x64/jamaendo.png delete mode 100644 data/album.png delete mode 100644 data/bg.png delete mode 100644 data/bg.xcf delete mode 100644 data/icon_artist.png delete mode 100644 data/icon_download.png delete mode 100644 data/icon_favorite.png delete mode 100644 data/icon_license.png delete mode 100644 data/jamaendo-26.base64 delete mode 100644 data/jamaendo.desktop delete mode 100644 data/jamaendo.png delete mode 100644 data/jamaendo.xcf delete mode 100644 data/logo_2600_710.png delete mode 100644 debian/changelog delete mode 100644 debian/compat delete mode 100644 debian/control delete mode 100644 debian/copyright delete mode 100644 debian/jamaendo.menu delete mode 100644 debian/optify delete mode 100644 debian/postinst delete mode 100644 debian/pycompat delete mode 100755 debian/rules delete mode 100644 helldon/__init__.py delete mode 100644 jamaendo/__init__.py delete mode 100644 jamaendo/api.py delete mode 100644 jamaui/__init__.py delete mode 100644 jamaui/albumlist.py delete mode 100644 jamaui/colors.py delete mode 100644 jamaui/console.py delete mode 100644 jamaui/draw.py delete mode 100644 jamaui/favorites.py delete mode 100644 jamaui/featured.py delete mode 100644 jamaui/fetcher.py delete mode 100644 jamaui/listbox.py delete mode 100644 jamaui/ossohelper.py delete mode 100644 jamaui/player.py delete mode 100644 jamaui/playerwindow.py delete mode 100644 jamaui/playlists.py delete mode 100644 jamaui/postoffice.py delete mode 100644 jamaui/radios.py delete mode 100644 jamaui/refresh.py delete mode 100644 jamaui/search.py delete mode 100644 jamaui/settings.py delete mode 100644 jamaui/showalbum.py delete mode 100644 jamaui/showartist.py delete mode 100644 jamaui/showplaylist.py delete mode 100644 jamaui/songposition.py delete mode 100644 jamaui/ui.py delete mode 100644 jamaui/util.py delete mode 100755 scripts/jamaendo delete mode 100755 scripts/player delete mode 100644 setup.py delete mode 100644 tests/__init__.py delete mode 100755 tests/testicle delete mode 100644 welcome diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index b02d8c1..0000000 --- a/AUTHORS +++ /dev/null @@ -1,13 +0,0 @@ -Written by: - -Kristoffer Grönlund - -Some icons by Joseph Wain, under a Creative Commons Attribution license: -See more at http://glyphish.com/ -and http://creativecommons.org/licenses/by/3.0/us/ - -Based on Panucci, by The Panucci Audiobook and Podcast Player Project: - -Thomas Perl -Nick -Matthew Taylor diff --git a/COPYING b/COPYING deleted file mode 100644 index 10926e8..0000000 --- a/COPYING +++ /dev/null @@ -1,675 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY 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 . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - diff --git a/ICONS_LICENSE b/ICONS_LICENSE deleted file mode 100644 index 5fa3c99..0000000 --- a/ICONS_LICENSE +++ /dev/null @@ -1,14 +0,0 @@ -Created by Joseph Wain (see http://penandthink.com) at and probably downloaded from http://glyphish.com - -This work is licensed under the Creative Commons Attribution 3.0 United States License. To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/us/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. - -You are free to share it and to remix it remix under the following conditions: - -* You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). -* For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to http://creativecommons.org/licenses/by/3.0/us/ -* Any of the above conditions can be waived if you get permission from the copyright holder (send me an email!). -* Apart from the remix rights granted under this license, nothing in this license impairs or restricts the author's moral rights. - -ATTRIBUTION -- a note reading "icons by Joseph Wain / glyphish.com" or similar, plus a link back to glyphish.com from your app's website, is the preferred form of attribution. Also acceptable would be, like, a link from within your iPhone application, or from the iTunes store page, but those aren't as useful to other people. If none of these work for you, please contact hello@glyphish.com and we can work something out. - -USE WITHOUT ATTRIBUTION -- If attribution is not possible, workable or desirable for your application, contact hello@glyphish.com for commercial non-attributed licensing terms. \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index b48fe15..0000000 --- a/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# - -PREFIX ?= /usr -DESTDIR ?= / - -JAMAENDOBIN = scripts/jamaendo -JAMAENDOVERSION = `grep -m 1 VERSION jamaui/ui.py | cut -d "'" -f 2` -#MESSAGESPOT = data/messages.pot - - -PYTHON ?= /usr/bin/python2.5 - -all: - @echo "Possible make targets:" - @echo " install - install the package" - @echo " clean - remove the build files" - @echo " distclean - remove build files + dist target" - -install: python-install post-install install-schemas - -python-install: - $(PYTHON) setup.py install --optimize 2 --root=$(DESTDIR) --prefix=$(PREFIX) - -post-install: - gtk-update-icon-cache -f -i $(DESTDIR)$(PREFIX)/share/icons/hicolor/ - update-desktop-database $(DESTDIR)$(PREFIX)/share/applications/ - -clean: - rm -rf build - rm -f jamaendo/*.pyc jamaendo/*.pyo - rm -f jamaui/*.pyc jamaui/*.pyo -# make -C data/po clean - -distclean: clean - rm -rf dist - -# See: http://wiki.maemo.org/Uploading_to_Extras#Debian_tooling -build-package: - dpkg-buildpackage -rfakeroot -sa -kkristoffer.gronlund@purplescout.se -i -I.git - -#messagespot: -# xgettext -k_ --from-code utf-8 --language Python \ -# -o $(MESSAGESPOT) scripts/jamaendo jamaendo/*.py jamaui/*.py -# sed -i \ -# -e 's/SOME DESCRIPTIVE TITLE/Jamaendo translation template/g' \ -# -e 's/THE PACKAGE'"'"'S COPYRIGHT HOLDER/Jamaendo Contributors/g' \ -# -e 's/YEAR/2010/g' \ -# -e 's/FIRST AUTHOR /Nick Nobody /g' \ -# -e 's/PACKAGE VERSION/Jamaendo '$(JAMAENDOVERSION)'/g' \ -# -e 's/-Bugs-To: /-Bugs-To: kegie+jamaendo@ovi.com/g' \ -# -e 's/PACKAGE/Jamaendo/g' $(MESSAGESPOT) - -#gen_gettext: messagespot -# make -C data/po generators -# make -C data/po update diff --git a/README.md b/README.md index ec9365f..ef65470 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,8 @@ -# Jamaendo +# Source code -A media player for the Nokia N900 and other Maemo 5 (Fremantle) phones. +> Where did all the source code go? -[Jamaendo][jamaendo] plays music from the music catalog of [JAMENDO][jamendo]. +The main development branch was moved to github, at -JAMENDO is an online platform that distributes musical works under -Creative Commons licenses. + http://github.com/krig/jamaendo -Jamaendo is written by Kristoffer Grönlund. - -## Panucci - -[Jamaendo][jamaendo] is based on [Panucci][panucci], an audiobook and podcast player for -Maemo. Panucci is written by - - [jamendo]: http://www.jamendo.com/ "Jamendo" - [jamaendo]: http://jamaendo.garage.maemo.org/ "Jamaendo" - [panucci]: http://panucci.garage.maemo.org/ "Panucci" - -## Installation - -To build the packages, you need a scratchbox environment set up. See -the Nokia/Maemo documentation for information on how to do this. To -build the package, go to the Jamaendo source directory and type - - make build-package - -This will (hopefully) generate a .deb file for you to install on your -Maemo 5 device. - -## Optification - -If you're running a newer release of the Fremantle platform, this step -may not (I hope not!) be necessary, but either way: The package that -the build process produces is not entirely optified. It is compatible -with the `maemo-optify` tool, however. All you need to do is run -`maemo-optify-deb` on the generated .deb file. - -## License - -The backend code that speaks to jamendo.com is in the jamaendo module. This module is licensed under a modified New BSD License (modified to remove attribution clauses). See `jamaendo/api.py` for details. - -The code that implements the UI and the rest of the application is licensed under a GPL v3 license. diff --git a/data/26x26/jamaendo.png b/data/26x26/jamaendo.png deleted file mode 100644 index 8fb2a167bfbca098ace898295e04d44f5a7eb545..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1691 zcmV;M24wk(P)Px#24YJ`L;!67B>-*=ZNS$6000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igGv z3^@~djqW@E000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000H{NklLRZB`jMWo`SX_Y3fQ0pckb{gATZ@s%--`4A0pL71hL*m4B z5(RjGdHw4@-#4FT<{S7Qgx-S%U@LVX@OnwZKElc z7-#wte&9ZkuU!G806eCucdF|3s@e=RBl12}Zv%Z8m|XEEBr4k#c4hjSqX3faYZl-R zRe4;5#6|Y1^G2*^ED7#j-F52S6>?i-5n3=zBeO%_sB)%`>{e6!GMJd4av@6=_?Dvk zd=G4|EC;?XBDX9_sgM`T|F}Qa_2XFAOS3Ex#3O(qfJZq(4IwHi62cGOc@p$j)wE| znf#i!UVLkZF{W(OeVcys+TPdhN}Wn|gIG1K6|ZjS{zK3>CvL|SmKte6p~nU`F9QL^ zwSu)zj-CE$!}!V9zh2B2+nkb9AtEMJ8OpA1uFA~K%-xjF&aXQ3>qB*uBe@y`aTndd z>?^bP1j9WqtnD0j)RcnY0fd3Amcp&?X)V!Ar1raq^0|Ct_FT4mex|U-vPBAWg?Mr> z*?IQF+ue?FL#}bjjpyPUHg_ECxV!zOa8O{?Xr8e2XY0=L?td~kV#3UWNS zs%O5TJv9)Hg&&GmN6R9sBEjrv_M`nz9lmpRayDcKY#h&_zM(F+;r0zD&Kw_VG3t4a z>tKv=MWSy4Ez9_?wN=J&Om^zbLaFHY2mD@bqV}D(&bEIZ*?*+j z@f>W=kJy&$8aFUHJX&?&PX{+H7E8r+DpOfoU;EsqPj7r1*Sq<=J{Of5w{gueMJ@t~ zmYUbpCDmZuLb2c*I6Tlfczm#BYH})u591m~<8|>ALL~EUX7#cDV_hPsKN!e|qoMj@ z`jH!aXvcCO;HZtq3#z(Pkf5TdSM*l~pKVXv(9=IWIMSWV=E4Ypj*qnW&(9UghfWQx zw=5aha_^@Orc>$4d_G^{xBc^Fn8=-ja1^nSq@6S-84dLr_iWFBp(M&()H<4ZMR zm1i~Z$=?l6+&eilS&COT)C{+GtREatjz>m@N9to$v2*R6?L$OyDPj@AIMc_NJ^jti z#^in?;x%4!27Lozvt)W3e5ia$kzWc#&$AFkf@#~X>n(5l{Zn@6{R@OCQ9_u(m!olkMav()8)>p2FL*;ie%+H zk(fXNG!Eih;YSAONBB<7_r?Y;v-0#qP3wSNz*a8E_+La`;dz0d)$AGj$5oG$i3c02 zfgTar3Ho6W|G#-GI0COL`di@7wR@5i*F3i-9&EG)Vk+Ds$mfBNq0}MxR%G`OQmPyk lVK4BqqPf~VNtgdu{0q9#$dsmj6Wjm*002ovPDHLkV1jQ#9d`f# diff --git a/data/40x40/jamaendo.png b/data/40x40/jamaendo.png deleted file mode 100644 index 2f8c072145e59927988f3b5d1d6ebcfc0ed7f725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2889 zcmV-P3%2x$P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igGv z5e)$);9Q^p000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000W4Nkl#?uI722`RJ|%GlURr;{R6okGW2U>qh@aYiaQQ<18% z(^7s!v_kojP<|w}SlU4g|Da7!sgxNgR%=_(R;bn@l~R(BU+lfRf#B}md*5@;^Z3X6 z-X$9n%cT6}cy`X+nLGEK^F80^InR$T{QvmLh8)kL&h}LdkA?5x>H9yBfCS{jfcaqv z?znJ~_Fgj(fFMty{4FAn5qKVmxQvr+9cCAhSx=T4XqES#T3Xgdzws=aW1!wb#}SUich9|Cduwq4J&egQ&q}Gen&b z>Pg5?Om&9V4R3hEpqnMCtlAK=HEE!U8xHHoKwJZKwJ?~3RQv%1U@eB-Fd6D zcdTaF675;?p*sH7J|~(f%7hjFhZGND7EhX{Vh>nI{lliRywOFBOxRt zWJGHh04gJoZFu~bI}fb?%6C**mmLmt_sHnbiZAEP`7uLPLBCS^{Xnm;pZ?VwK6b^* zHG4d#7C9C3m=qjUR2Q}w%jP5lvpU|1fT}~V$K~BqQBfpRXSsIC+9k>?6|+=6OV?)T z=IK^Hb=zClZlmWj)3bSouFdd<@+9wh_xwJyRMN$?hlL&%y14c~{^ieHMhN*f$cQ-L zm_s%vn-i1&lBUcDk_p)ygZg2JgBS$=0>GvJdI_fe4Hhbr^shFFt%JEOeV^Ifw;nz3 z(z7ln6bsLr$+Oe5d6r(DrSCoZ*87{6(xgmVTaxxRy7WOS2z?Ij8-J%1`M#o{ITIYm z45C5GTvTM^9MsXnL!y8L0m=V3_^Mj?qx*Y?eB{Z?=YDp_+O1a&>ClyiVQv_9ZcA)d z02fCPx~Y5NNB{i~0JwAQ-Cxa`@lZej4|(0>fssF3Ix>ywVTlO9g>3%*!r`4_f(y6} z0*?ck$$g7=!ixa>&XbpO``WGCzV`Me?K#O4;!=Zi!`+vfSYM zR2x9RK}0B}eBaie-L_cJ-*mI{+y(dAUJFKc{paw8-T2p+p-BDb(o{?JxrN1gH<3EA zOJS%Og&HL1wzuC(dU^c*WbwjavA&}wvL~|VS;J1qPJza=b1W%}^*~(^4baxCx3GQTE zz|2%p$G|WgM*&B0d;<4}TX>JXOI|W(xf{Y=68}5ROV4?Pd z$pb4dSg@dv=SUfhpmzS1->Z|#b#J?#QUs$0WMYM3QCtuevS+%vl21PM$H&gk_pE{# zAq7ZM&kWMISRtA3f{&@xh{c-_qcAc&xu~Dha&o2>406P<&S3LG%b#-Ua?Ekud?Cs+ zE)Hfm^#i*0jBDpwmw}I7|MYc@c^x81bRMYAF~AW0zxEa|1$68&iXDm&4H zY&z}~54ndw6awnuKG8ads_5dGH2nireOj7#=`MvC>&Y7D`Y!i3=Rms(XkTQz$V{eQ@PD3tBeTDy?0W`ySf- zgPQ@^a^@W;<1*}Gd$0WdM_(G4?~1ox(Zq(Pp)uprKfJYWFFw1H;o<5(Eb5slD%t7^ zyKcyYLg7%?>*V5pvEr(y2UvoOU3<*;}5^EdHgj4o49!u{>9aIjV#6K=|=Abaux6xP*VzT zlA$Q5b|%~D-lMji?VH9JSzbOvv^Nu-oNAvO6tO`egr;Gy`{G@wd=2GU(0wQeo5p&uKwcBxc`PF-mtt?Djw}R1?L(^1#BDs$A*=iL- z24ceDs)8OSfgC9wd86eRU_RHh4-Rgcqk6WW^Fo%efALeviIy zs~ZI%3+_J0!n}>-)xy@1L#2*!wRF;aQOZ?v$>79p_QV8LY`wSRdEN n34UMuP`+0XMz7h!|GDu$qwFT2qUW4000000NkvXXu0mjfSmcU| diff --git a/data/64x64/jamaendo.png b/data/64x64/jamaendo.png deleted file mode 100644 index 1afa270f024d9f99f35fc262733acbf64480b22f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4080 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 diff --git a/data/icon_download.png b/data/icon_download.png deleted file mode 100644 index bbf77eafcc72a219b875d09a4c13ace6eb999c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv+!3H9yAL9p7jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>M`nZJ|8D`Cq01C2~c>21s-(qBDU=xv1N$>#*E%kJ946!(! z>=Wjrc}@Jn`o{^+9waLW*ZleW@n)~T`7a4|Nxy#{osI?{9>4GR_qk%w(Fg?1Gn@N6 z8@m!dNF8hPH+t)%rM&Bg&g7f_+vl0PcO>?l*x0Q5je{}eug?)TYsKabRg)u_H?B-p z3R5)vPeg`>}DB#FvlXkEfq0iYe+*dZQ$! gItN?0jFOq|D`zE?sDKnF8;y85}Sb4q9e03$DK1^@s6 diff --git a/data/icon_favorite.png b/data/icon_favorite.png deleted file mode 100644 index d1c70694548ccb1c1a69f8deb83eee0fa5652512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^5+4XY|G%(xz|M%z6&hO7VLN~I$3n`nehdV6CmoG z(agW|8`~N>8;>POM11)0x|w;4(VvIc+1Y2v)z@#D5GH2x?_Y}Ip3 ze_mgwYC{2|Ff%jr;ivu6h4=sc`K>Xkt^W7tw_rZVSu;Syy4qdeoM!m`SjM#7iN#dM z;@h)~C#Q~U^BvG_`1PnwVfF=QK{G-2FtsqgqS(4mcTb*CeJiv+xgw^$rQ%?%ecvxQkYiKdfhIz`ry$sTPMwKJ>EEdYIxHP4%@Hq zmOQ?-JUf5EX~X2p1%E$(<^Qwhk9Ph4-@1y&6w@45MC|+bvg%1&`s?_F$>}Ojc3HIk zV38J_{qx3?zCD(ccDy)vi1o)8W8qB?9<_Ii-%gjuhu8Bbx0pxT yH89q%WMEWwT>O^@2%g`YUwr3B4s+m7Hiicor@ZH|XE6iQ0fVQjpUXO@geCyC@(m0C diff --git a/data/icon_license.png b/data/icon_license.png deleted file mode 100644 index 7311dd82a7ab90d4d8093948d4f0cb316d697b31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951 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 diff --git a/data/jamaendo.xcf b/data/jamaendo.xcf deleted file mode 100644 index 207b2a2ae66267bacd73f000d19c884bddbafe55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135940 zcmdqKX^>o5dL5SczV~vg9b2Op&h&5wKmoO&HuO-#p)A`B(UM68!y%iYkQ~x*I5Qk_ z8Yom1_N7pTeJP-@6@UUzXw$Y#nqFv%CaH}QB~czyrb8qxQX*w8R?I%V0k!1%(&wD- zzATJINAS1%y}a+fZ@V`WS$V%a-?`ae_~P4>Zyx{b=imJN7r*qmTrTH+0FS?j4*%=J z!#Olt@hJXBi@6*h_-`8?F&=q5c7#6dwp)N)*B20W=(C63e*1F=XCTi}x#d5e`rKz` zKKEm99{b|VkH7f?f9Z#Qn3`Uhe(~+keBpCLUzqyhk5L9|m+PONIq{{>y*Yj8OJDr4 zz2*MTf8n!-zI15n&3;{mroQl_pLug+ctrpGDV@=v+6&ho{Zm{s{hR;a9l9Q$p8U*b zzj*KqZ;obTL3rX%69(DPk%M2HdGm`0Kl|gKo2LJv&wqaUb2IG;()-^RndCcN`8tIE z+~3RPei<*x=`ZKpxt*C5*L!$;fCpdQ;%D9*9v=SqD7rb%2LJJ&hyP41Jc^-D+fwM` zk}HQk!e%DL=9`qUO2p*rrqksp;;D0Z_EliU0pAVgEuCVpHVn&Xya` z(v@e!Y?5cym1oaZR-UayD{oNXpEW4(E6r!TaVw5e_bgheL4dROSsm6Z&+-tZG^7q4 z$ELWFK1DAtzg5_o4_f!EK!dF`h*#XxwM+*SxxT&B`fDH)x(bji2UWm^Z`dX=4T2xUH2*^7P#&PoF$_`t%9HFceHyp1w|R_cVDD zJ&m5EPoG3jG(wSL|8x}|?ZZ8-(i;Nzq-K#ipVS{edGh#a`Duf8m;qyKc~W`&HF~&0HMvMYP7hkNm^*(L?tz|HwUj&d@p(z}8bUmL^aw32{i8fxat~)ae&Q{6AjYHc zR{g+RZyk86^R4OuTn-#~tMFEXy@CwV18+s>B(kIj1fGqvo;%>*sxiQUw}Ng>K`fNF zptx~im`z`qhbWi=0=T#Q0SVZN-fBYV4&*Vi!=pkA4ivL%;W?}4lFOgMe_}7!tj=4)h&x6PV5f=QM$dICJv{DzrZ^L7BR| zaTA_a&P@G8q98#~E)iqHj1MathpvcSSk>gs{$97=$$o1V)%ESZJ~lIOIUHVDrjkmR~nSR!f~Q!Tp;3= zx)!aNYf8sT{V7)_`EkkO(&c2w;b`BrQqu?jN@-;S9V`TJ20Lo@WfdW8HNk?i#nzH47Z^FDPgn9V^H|T|x&5ho;<<)!3Blq5 zk(wy1W+mwJTu7ciNnqIVWVxVq#YV>O~_2N#e6 zR+R?qu^wSU6l;w^x0~t+3k^QyvsH*|%jN>JJyT*3tRT^H%~pqqi_kVKI!&x8-WDG& z7fuTjEW5EJaFw+9tMt-=2FuRl1?~>u)17?O18F-+7QdZNjAhcNwYCp9$aK(Ml7hOtg5_ zdk_OePdoJHSB3>=m;JSvnck6n-)k7Z@*ziSzyCu*rrfDue+z3NV|oHZ{rM+6TJ0n@Wt5^a;d7`h

{ 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

    IW0LoKMlPBu8d_f&1RG65|+~6WPk~{IgW> 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 diff --git a/debian/changelog b/debian/changelog deleted file mode 100644 index 2f76872..0000000 --- a/debian/changelog +++ /dev/null @@ -1,32 +0,0 @@ -jamaendo (0.2-3) unstable; urgency=low - - * Background loading support - * Fixed missing package dependency - * Playlist removal supported - * Bugfixes and tweaks - - -- Kristoffer Grönlund Sat, 09 Jan 2010 04:39:10 +0100 - -jamaendo (0.2-2) unstable; urgency=low - - * Initial background loading support (search window) - * Fixed log append issue (/tmp is only 1MB) - * Added icon credits in about box - - -- Kristoffer Grönlund Fri, 08 Jan 2010 00:39:20 +0100 - -jamaendo (0.2-1) unstable; urgency=low - - * Second preview - * Images in album/track lists - * Improved 'featured' - now with tags and more - * Using pycurl instead of urllib to fetch - * Various other bugfixes - - -- Kristoffer Gronlund Sun, 3 Jan 2010 22:21:44 +0100 - -jamaendo (0.1-1) unstable; urgency=low - - * First preview - - -- Kristoffer Gronlund Fri, 01 Jan 2010 14:44:08 +0100 diff --git a/debian/compat b/debian/compat deleted file mode 100644 index 7ed6ff8..0000000 --- a/debian/compat +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/debian/control b/debian/control deleted file mode 100644 index b1e0140..0000000 --- a/debian/control +++ /dev/null @@ -1,55 +0,0 @@ -Source: jamaendo -Maintainer: Kristoffer Gronlund -Section: user/multimedia -Priority: optional -Standards-Version: 3.7.3 -Build-Depends: debhelper (>= 5.0.37.2), python2.5-dev -XS-Python-Version: >= 2.5 -XB-Python-Version: ${python:Versions} -XSBC-Bugtracker: http://github.com/krig/jamaendo/issues -Homepage: http://jamaendo.garage.maemo.org/ - -Package: jamaendo -Architecture: all -Depends: ${python:Depends}, python2.5-gtk2, python2.5-gstreamer, python2.5-dbus, python2.5-hildon, python-lxml, python2.5-osso, python-pycurl, python-simplejson -Description: Streaming media player that plays music from jamendo.com -XB-Maemo-Display-Name: Jamaendo Player -XB-Maemo-Icon-26: - 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 - SZf/V/wLutHIlKZ+E9wAAAAASUVORK5CYII= diff --git a/debian/copyright b/debian/copyright deleted file mode 100644 index bc4e00f..0000000 --- a/debian/copyright +++ /dev/null @@ -1,29 +0,0 @@ -This package was debianized by Kristoffer Gronlund on -Fri, 01 Jan 2010 14:44:08 +0100. - -Upstream Website: - http://jamaendo.garage.maemo.org/ - -Upstream Author: - Kristoffer Gronlund - -Copyright: - Copyright (C) 2010 Kristoffer Gronlund - Copyright (C) 2008 Thomas Perl - - -Copyright (c) 2010 Kristoffer Gronlund - -Jamaendo is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Jamaendo is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY 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 Jamaendo. If not, see . - diff --git a/debian/jamaendo.menu b/debian/jamaendo.menu deleted file mode 100644 index a829205..0000000 --- a/debian/jamaendo.menu +++ /dev/null @@ -1,6 +0,0 @@ -?package(jamaendo):\ - needs="X11"\ - section="Apps/Sound"\ - title="Jamaendo"\ - command="jamaendo"\ - icon=/usr/share/jamaendo/jamaendo.png diff --git a/debian/optify b/debian/optify deleted file mode 100644 index 01aeeba..0000000 --- a/debian/optify +++ /dev/null @@ -1,2 +0,0 @@ -none - diff --git a/debian/postinst b/debian/postinst deleted file mode 100644 index 98f4128..0000000 --- a/debian/postinst +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -if [ -x /usr/bin/gtk-update-icon-cache ]; then - /usr/bin/gtk-update-icon-cache -f /usr/share/icons/hicolor -fi - -#if ps -e | grep gconfd-2 > /dev/null; then -# killall gconfd-2 -#fi - -#GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` \ -# gconftool-2 --makefile-install-rule /etc/gconf/schemas/panucci.schemas -#killall gconfd-2 - -#DEBHELPER# - diff --git a/debian/pycompat b/debian/pycompat deleted file mode 100644 index 0cfbf08..0000000 --- a/debian/pycompat +++ /dev/null @@ -1 +0,0 @@ -2 diff --git a/debian/rules b/debian/rules deleted file mode 100755 index 40a190c..0000000 --- a/debian/rules +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -CHANGELOG = debian/changelog -DOCS = #AUTHORS README - -PYTHON = /usr/bin/python2.5 -SETUP = ${PYTHON} setup.py - -DEBPACKAGE = jamaendo -DESTDIR = debian/${DEBPACKAGE} -PREFIX = usr - -configure: configure-stamp -configure-stamp: - dh_testdir - touch configure-stamp -# Add here commands to configure the package. - -build: build-stamp -build-stamp: configure-stamp - dh_testdir - ${SETUP} build - touch build-stamp - -clean: - dh_testdir - dh_testroot - rm -f build-stamp configure-stamp - ${SETUP} clean --all - rm -rf build dist - dh_clean - make clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - ${SETUP} install --no-compile -O2 --root='$(DESTDIR)' --prefix='$(PREFIX)' -# PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) $(MAKE) gen_gettext dbus-service-install copy-schemas - -binary-arch: - -binary-indep: build install - dh_testdir - dh_testroot - dh_installchangelogs $(CHANGELOG) - dh_installdocs $(DOCS) - dh_installmenu - dh_installman - dh_compress - dh_fixperms - dh_python - dh_installdeb - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep - -.PHONY: build clean binary-indep binary-arch binary install configure - diff --git a/helldon/__init__.py b/helldon/__init__.py deleted file mode 100644 index 9f095c6..0000000 --- a/helldon/__init__.py +++ /dev/null @@ -1,170 +0,0 @@ -import gtk -import cairo - -gtk.HILDON_SIZE_AUTO = -1 -gtk.HILDON_SIZE_AUTO_WIDTH = -1 -gtk.HILDON_SIZE_FINGER_HEIGHT = 32 -gtk.HILDON_SIZE_THUMB_HEIGHT = 48 - -BUTTON_ARRANGEMENT_VERTICAL = 1 - -def hildon_gtk_window_set_progress_indicator(wnd, onoff): - pass - -def transparent_expose(widget, event): - bgimg = 'data/bg.png' - if bgimg: - background, mask = gtk.gdk.pixbuf_new_from_file(bgimg).render_pixmap_and_mask() - #self.realize() - widget.window.set_back_pixmap(background, False) - #widget.window.clear() - #cr = widget.window.cairo_create() - #cr.set_operator(cairo.OPERATOR_CLEAR) - # Ugly but we don't have event.region - #region = gtk.gdk.region_rectangle(event.area) - #cr.region(region) - #cr.fill() - return False - -class Program(gtk.Window): - instance = None - - def __init__(self): - gtk.Window.__init__(self, type=gtk.WINDOW_TOPLEVEL) - self.set_app_paintable(True) - self._vbox = gtk.VBox() - self._title = gtk.Label("Jamaendo") - self._title.set_alignment(0.1, 0.5) - self._backbtn = gtk.Button("Quit") - self._backbtn.set_alignment(1.0, 0.5) - self._hbox = gtk.HBox() - self._hbox.pack_start(self._title, True) - self._hbox.pack_start(self._backbtn, False) - self._notebook = gtk.Notebook() - self._notebook.set_size_request(800, 445) - self._notebook.set_show_tabs(False) - self._notebook.set_app_paintable(True) - self._notebook.connect("expose-event", transparent_expose) - self._vbox.pack_start(self._hbox, False) - self._vbox.pack_start(self._notebook, True) - self.add(self._vbox) - self.show_all() - Program.instance = self - self._backbtn.connect('clicked', self.on_back) - - bgimg = 'data/bg.png' - if bgimg: - background, mask = gtk.gdk.pixbuf_new_from_file(bgimg).render_pixmap_and_mask() - self.set_app_paintable(True) - self.realize() - self.window.set_back_pixmap(background, False) - self.window.clear() - - self._stack = [] - - def add_window(self, wnd): - pass - - def push_stackable(self, wnd): - while self._notebook.get_n_pages() > 0: - p = self._notebook.get_nth_page(0) - self._stack.append(p) - self._notebook.remove_page(0) - p.hide() - - idx = self._notebook.append_page(wnd) - self._notebook.set_current_page(idx) - wnd.show_all() - wnd._nb_index = idx - if self._stack: - self._backbtn.set_label("<<<") - else: - self._backbtn.set_label("Quit") - self._notebook.window.clear() - - def popped_stackable(self, wnd=None): - pass - - def pop_stackable(self): - while self._notebook.get_n_pages() > 0: - p = self._notebook.get_nth_page(0) - self._notebook.remove_page(0) - p.hide() - if len(self._stack): - tail = self._stack.pop() - self.push_stackable(tail) - - def on_back(self, *args): - self.pop_stackable() - if self._stack: - self._backbtn.set_label("<<<") - else: - self._backbtn.set_label("Quit") - if self._notebook.get_n_pages() == 0: - gtk.main_quit() - - def size(self): - return len(self._stack)+1 - - def pop(self, sz): - ret = [x for x in self._stack] + [self._notebook.get_nth_page(0)] - while self._stack: - self.pop_stackable() - return ret - - def push_list(self, windows): - for window in windows: - self.push_stackable(window) - - # windows = stack.pop(sz) - # windows.remove(player) - # windows.append(player) - # stack.push_list(windows) - - -class StackableWindow(gtk.EventBox): - def __init__(self): - gtk.EventBox.__init__(self) - self.set_app_paintable(True) - #self.connect("expose-event", transparent_expose) - self._nb_index = 0 - Program.instance.push_stackable(self) - self.connect('destroy', self.on_destroy) - def set_app_menu(self, menu): - pass - - def set_title(self, title): - Program.instance._title.set_text(title)#_notebook.set_tab_label_text(self, title) - - def on_destroy(self, *args): - Program.instance.popped_stackable(self) - - def get_stack(self): - return Program.instance - -class AppMenu(object): - def __init__(self): - pass - - def append(self, widget): - pass - - def show_all(self): - pass - -class GtkButton(gtk.Button): - def __init__(self, size): - gtk.Button.__init__(self) - - -class Button(gtk.Button): - def __init__(self, size, layout): - gtk.Button.__init__(self) - - def set_text(self, title, subtitle): - self.set_label(title) - -class PannableArea(gtk.ScrolledWindow): - def __init__(self): - gtk.ScrolledWindow.__init__(self) - self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) diff --git a/jamaendo/__init__.py b/jamaendo/__init__.py deleted file mode 100644 index 342be29..0000000 --- a/jamaendo/__init__.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010, Kristoffer Gronlund -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of Jamaendo nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -from api import set_cache_dir, \ - JamendoAPIException, \ - Artist, Album, Track, Radio, Tag, \ - get_album_cover, \ - get_album_cover_async, \ - get_images_async, \ - get_artist, \ - get_albums, \ - get_album, \ - get_tracks, \ - get_track, \ - get_radio_tracks, \ - search_artists, \ - search_albums, \ - search_tracks, \ - top_artists, \ - top_albums, \ - top_tracks, \ - top_tags, \ - albums_of_the_week, \ - new_releases, \ - tracks_of_the_week, \ - get_radio, \ - starred_radios, \ - favorite_albums, \ - get_tag_tracks - diff --git a/jamaendo/api.py b/jamaendo/api.py deleted file mode 100644 index 8bc2353..0000000 --- a/jamaendo/api.py +++ /dev/null @@ -1,952 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010, Kristoffer Gronlund -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# An improved, structured jamendo API wrapper for the N900 with cacheing -# Image / cover downloads.. and more? -from __future__ import with_statement -import urllib, threading, os, time, simplejson, re -import logging, hashlib -import pycurl, StringIO - -_CACHEDIR = None -_COVERDIR = None -_GET2 = '''http://api.jamendo.com/get2/''' -_MP3URL = _GET2+'stream/track/redirect/?id=%d&streamencoding=mp31' -_OGGURL = _GET2+'stream/track/redirect/?id=%d&streamencoding=ogg2' -_TORRENTURL = _GET2+'bittorrent/file/redirect/?album_id=%d&type=archive&class=mp32' - -try: - log = logging.getLogger(__name__) -except: - class StdoutLogger(object): - def info(self, s, *args): - print s % (args) - def debug(self, s, *args): - pass#print s % (args) - log = StdoutLogger() - -# These classes can be partially constructed, -# and if asked for a property they don't know, -# makes a query internally to get the full story - -_ARTIST_FIELDS = ['id', 'name', 'image'] -_ALBUM_FIELDS = ['id', 'name', 'image', 'artist_name', 'artist_id', 'license_url'] -_TRACK_FIELDS = ['id', 'name', 'album_image', 'artist_id', 'artist_name', 'album_name', 'album_id', 'numalbum', 'duration'] -_RADIO_FIELDS = ['id', 'name', 'idstr', 'image'] -_TAG_FIELDS = ['id', 'name'] - -_APILOCK = threading.Lock() - -def curlGET(url): - c = pycurl.Curl() - s = StringIO.StringIO() - c.setopt(pycurl.FOLLOWLOCATION, 1) - c.setopt(pycurl.URL, url) - c.setopt(pycurl.WRITEFUNCTION, s.write) - try: - c.perform() - finally: - c.close() - s.seek(0) - return s.read() - -class LazyQuery(object): - def set_from_json(self, json): - for key, value in json.iteritems(): - if key == 'id': - assert(self.ID == int(value)) - else: - if key.endswith('_id'): - value = int(value) - setattr(self, key, value) - - def load(self): - """Not automatic for now, - will have to do artist.load() - - This is filled in further down - in the file - """ - raise NotImplemented - - def _needs_load(self): - return True - - def _set_from(self, other): - raise NotImplemented - - def _needs_load_impl(self, *attrs): - for attr in attrs: - if getattr(self, attr) is None: - return True - return False - - def _set_from_impl(self, other, *attrs): - for attr in attrs: - self._set_if(other, attr) - - def _set_if(self, other, attrname): - if getattr(self, attrname) is None and getattr(other, attrname) is not None: - setattr(self, attrname, getattr(other, attrname)) - - def __repr__(self): - try: - return u"%s(%s)"%(self.__class__.__name__, - u", ".join(("%s:%s"%(k,repr(v))) for k,v in self.__dict__.iteritems() if not k.startswith('_'))) - except UnicodeEncodeError: - #import traceback - #traceback.print_exc() - return u"%s(?)"%(self.__class__.__name__) - -class Artist(LazyQuery): - def __init__(self, ID, json=None): - self.ID = int(ID) - self.name = None - self.image = None - self.albums = None # None means not downloaded - if json: - self.set_from_json(json) - - def _needs_load(self): - return self._needs_load_impl('name', 'albums') - - def _set_from(self, other): - return self._set_from_impl(other, 'name', 'image', 'albums') - - def get_data(self): - return {'name':self.name, 'image':self.image} - -class Album(LazyQuery): - def __init__(self, ID, json=None): - self.ID = int(ID) - self.name = None - self.image = None - self.artist_name = None - self.artist_id = None - self.license_url = None - self.tracks = None # None means not downloaded - if json: - self.set_from_json(json) - - def torrent_url(self): - return _TORRENTURL%(self.ID) - - - def _needs_load(self): - return self._needs_load_impl('name', 'image', 'artist_name', 'artist_id', 'license_url', 'tracks') - - def _set_from(self, other): - return self._set_from_impl(other, 'name', 'image', 'artist_name', 'artist_id', 'license_url', 'tracks') - - def get_data(self): - return {'name':self.name, 'image':self.image, - 'artist_name':self.artist_name, - 'artist_id':self.artist_id, - 'license_url':self.license_url} - -class Track(LazyQuery): - def __init__(self, ID, json=None): - self.ID = int(ID) - self.name = None - self.artist_id = None - self.artist_name = None - self.album_image = None - self.album_name = None - self.album_id = None - self.numalbum = None - self.duration = None - if json: - self.set_from_json(json) - - def mp3_url(self): - return _MP3URL%(self.ID) - - def ogg_url(self): - return _OGGURL%(self.ID) - - def get_data(self): - return {'name':self.name, - 'artist_id':self.artist_id, - 'artist_name':self.artist_name, - 'album_image':self.album_image, - 'album_name':self.album_name, - 'album_id':self.album_id, - 'numalbum':self.numalbum, - 'duration':self.duration} - - def _needs_load(self): - return self._needs_load_impl('name', 'artist_name', 'artist_id', 'album_name', 'album_id', 'numalbum', 'duration') - - def _set_from(self, other): - return self._set_from_impl(other, 'name', 'album_image', 'artist_name', 'artist_id', 'album_name', 'album_id', 'numalbum', 'duration') - -class Radio(LazyQuery): - def __init__(self, ID, json=None): - self.ID = int(ID) - self.name = None - self.idstr = None - self.image = None - if json: - self.set_from_json(json) - - def _needs_load(self): - return self._needs_load_impl('name', 'idstr', 'image') - - def _set_from(self, other): - return self._set_from_impl(other, 'name', 'idstr', 'image') - -class Tag(LazyQuery): - def __init__(self, ID, json=None): - self.ID = int(ID) - self.name = None - if json: - self.set_from_json(json) - - def _needs_load(self): - return self._needs_load_impl('name') - - def _set_from(self, other): - return self._set_from_impl(other, 'name') - -_artists = {} # id -> Artist() -_albums = {} # id -> Album() -_tracks = {} # id -> Track() -_radios = {} # id -> Radio() - - -# cache sizes per session (TODO) -_CACHED_ARTISTS = 100 -_CACHED_ALBUMS = 200 -_CACHED_TRACKS = 500 -_CACHED_RADIOS = 10 -# cache sizes, persistant -_CACHED_COVERS = 2048 - -# TODO: cache queries? - -class Ratelimit(object): - rate_limit = 1.0 # seconds between queries - last_query = time.time() - 1.5 - - @classmethod - def ratelimit(cls): - now = time.time() - if (now - cls.last_query) < cls.rate_limit: - time.sleep(cls.rate_limit - (now - cls.last_query)) - cls.last_query = time.time() - -_ratelimit = Ratelimit.ratelimit - -class Query(object): - def __init__(self): - pass - - def _geturl(self, url): - _ratelimit() - log.info("%s", url) - try: - ret = simplejson.loads(curlGET(url)) - except Exception, e: - return None - return ret - - def __str__(self): - return "#%s" % (self.__class__.__name__) - - def execute(self): - raise NotImplemented - -class CoverFetcher(threading.Thread): - def __init__(self): - threading.Thread.__init__(self) - self.setDaemon(True) - self.cond = threading.Condition() - self.work = [] - - def _retrieve(self, url, fname): - BROKEN = 'http://imgjam.com/radios/default/default.100.png' - if url == BROKEN: - return None - f = open(fname, 'wb') - c = pycurl.Curl() - c.setopt(pycurl.FOLLOWLOCATION, 1) - c.setopt(pycurl.URL, str(url)) - c.setopt(pycurl.WRITEFUNCTION, f.write) - try: - c.perform() - except: - fname = None - finally: - c.close() - f.close() - log.debug("Coverfetch: %s -> %s", url, fname) - return fname - - def _fetch_cover(self, albumid, size): - try: - coverdir = _COVERDIR if _COVERDIR else '/tmp' - to = os.path.join(coverdir, '%d-%d.jpg'%(albumid, size)) - if not os.path.isfile(to): - url = _GET2+'image/album/redirect/?id=%d&imagesize=%d'%(albumid, size) - to = self._retrieve(url, to) - return to - except Exception, e: - return None - - def _fetch_image(self, url): - try: - h = hashlib.md5(url).hexdigest() - coverdir = _COVERDIR if _COVERDIR else '/tmp' - to = os.path.join(coverdir, h+'.jpg') - if not os.path.isfile(to): - to = self._retrieve(url, to) - return to - except Exception, e: - return None - - def request_cover(self, albumid, size, cb): - self.cond.acquire() - self.work.insert(0, (albumid, size, cb)) - self.cond.notify() - self.cond.release() - - def request_images(self, urls, cb): - """cb([(url, image)])""" - self.cond.acquire() - self.work = [('image', url, cb) for url in urls] + self.work - self.cond.notify() - self.cond.release() - - def run(self): - while True: - work = [] - self.cond.acquire() - while True: - work = self.work - if work: - self.work = [] - break - self.cond.wait() - self.cond.release() - - multi = len(work) > 1 - for job in work: - if job[0] == 'image': - self.process_image(job[1], job[2]) - else: - self.process_cover(*job) - - def process_cover(self, albumid, size, cb): - cover = self._fetch_cover(albumid, size) - if cover: - cb(albumid, size, cover) - - def process_image(self, url, cb): - image = self._fetch_image(url) - if image: - cb([(url, image)]) - -class CoverCache(object): - """ - cache and fetch covers - TODO: background thread that - fetches and returns covers, - asynchronously, LIFO - """ - def __init__(self): - self._covers = {} # (albumid, size) -> file - self._images = {} - self._fetcher = CoverFetcher() - self._fetcher.start() - if _COVERDIR and os.path.isdir(_COVERDIR): - self.prime_cache() - - def prime_cache(self): - coverdir = _COVERDIR - covermatch = re.compile(r'(\d+)\-(\d+)\.jpg') - - prev_covers = os.listdir(coverdir) - - if len(prev_covers) > _CACHED_COVERS: - import random - dropn = len(prev_covers) - _CACHED_COVERS - todrop = random.sample(prev_covers, dropn) - log.warning("Deleting from cache: %s", todrop) - for d in todrop: - m = covermatch.match(d) - if m: - try: - os.unlink(os.path.join(coverdir, d)) - except OSError, e: - log.exception('unlinking failed') - - for fil in os.listdir(coverdir): - fl = os.path.join(coverdir, fil) - m = covermatch.match(fil) - if m and os.path.isfile(fl): - self._covers[(int(m.group(1)), int(m.group(2)))] = fl - - def fetch_cover(self, albumid, size): - coverdir = _COVERDIR - if coverdir: - to = os.path.join(coverdir, '%d-%d.jpg'%(albumid, size)) - if not os.path.isfile(to): - url = _GET2+'image/album/redirect/?id=%d&imagesize=%d'%(albumid, size) - urllib.urlretrieve(url, to) - self._covers[(albumid, size)] = to - return to - return None - - def get_cover(self, albumid, size): - cover = self._covers.get((albumid, size), None) - if not cover: - cover = self.fetch_cover(albumid, size) - return cover - - def get_async(self, albumid, size, cb): - cover = self._covers.get((albumid, size), None) - if cover: - cb(albumid, size, cover) - else: - def cb2(albumid, size, cover): - self._covers[(albumid, size)] = cover - cb(albumid, size, cover) - self._fetcher.request_cover(albumid, size, cb2) - - def get_images_async(self, url_list, cb): - found = [] - lookup = [] - for url in url_list: - image = self._images.get(url, None) - if image: - found.append((url, image)) - else: - lookup.append(url) - if found: - cb(found) - - if lookup: - def cb2(results): - for url, image in results: - self._images[url] = image - cb(results) - self._fetcher.request_images(lookup, cb2) - -_cover_cache = CoverCache() - -def set_cache_dir(cachedir): - global _CACHEDIR - global _COVERDIR - _CACHEDIR = cachedir - _COVERDIR = os.path.join(_CACHEDIR, 'covers') - - try: - os.makedirs(_CACHEDIR) - except OSError: - pass - - try: - os.makedirs(_COVERDIR) - except OSError: - pass - - _cover_cache.prime_cache() - -def get_album_cover(albumid, size=100): - with _APILOCK: - return _cover_cache.get_cover(albumid, size) - -def get_album_cover_async(cb, albumid, size=100): - with _APILOCK: - _cover_cache.get_async(albumid, size, cb) - -def get_images_async(cb, url_list): - with _APILOCK: - _cover_cache.get_images_async(url_list, cb) - -class CustomQuery(Query): - def __init__(self, url): - Query.__init__(self) - self.url = url - - def execute(self): - return self._geturl(self.url) - - def __str__(self): - return self.url - -class GetQuery(Query): - queries = { - 'artist' : { - 'url' : _GET2+'+'.join(_ARTIST_FIELDS)+'/artist/json/?', - 'params' : 'artist_id=%d', - 'constructor' : Artist - }, - 'artist_list' : { - 'url' : _GET2+'+'.join(_ALBUM_FIELDS)+'/artist/json/?', - 'params' : 'artist_id=%s', - 'constructor' : Album - }, - 'album' : { - 'url' : _GET2+'+'.join(_ALBUM_FIELDS)+'/album/json/?', - 'params' : 'album_id=%d', - 'constructor' : Album - }, - 'album_list' : { - 'url' : _GET2+'+'.join(_ALBUM_FIELDS)+'/album/json/?', - 'params' : 'album_id=%s', - 'constructor' : Album - }, - 'albums' : { - 'url' : _GET2+'+'.join(_ALBUM_FIELDS)+'/album/json/?', - 'params' : 'artist_id=%d', - 'constructor' : [Album] - }, - 'track' : { - 'url' : _GET2+'+'.join(_TRACK_FIELDS)+'/track/json/track_album+album_artist?', - 'params' : 'id=%d', - 'constructor' : Track - }, - 'track_list' : { - 'url' : _GET2+'+'.join(_TRACK_FIELDS)+'/track/json/track_album+album_artist?', - 'params' : 'id=%s', - 'constructor' : Track - }, - 'tracks' : { - 'url' : _GET2+'+'.join(_TRACK_FIELDS)+'/track/json/track_album+album_artist?', - 'params' : 'order=numalbum_asc&album_id=%d', - 'constructor' : [Track] - }, - 'radio' : { - 'url' : _GET2+'+'.join(_TRACK_FIELDS)+'/track/json/radio_track_inradioplaylist+track_album+album_artist/?', - 'params' : 'order=random_asc&radio_id=%d&n=16', - 'constructor' : [Track] - }, - 'favorite_albums' : { - 'url' : _GET2+'+'.join(_ALBUM_FIELDS)+'/album/json/album_user_starred/?', - 'params' : 'user_idstr=%s', - 'constructor' : [Album] - }, - 'tag' : { - 'url' : _GET2+'+'.join(_TRACK_FIELDS)+'/track/json/track_album+album_artist?', - 'params' : 'tag_id=%d&n=50&order=rating_desc', - 'constructor' : [Track] - }, - } - - def __init__(self, what, ID): - Query.__init__(self) - self.ID = ID - info = GetQuery.queries[what] - self.url = info['url'] - self.params = info['params'] - self.constructor = info['constructor'] - - def construct(self, data): - constructor = self.constructor - if isinstance(constructor, list): - constructor = constructor[0] - if isinstance(data, list): - return [constructor(int(x['id']), json=x) for x in data] - else: - return constructor(int(data['id']), json=data) - - def execute(self): - js = self._geturl(self.url + self.params % (self.ID)) - if not js: - return None - return self.construct(js) - - def __str__(self): - return self.url + self.params % (self.ID) - -class SearchQuery(GetQuery): - def __init__(self, what, query=None, order=None, user=None, count=20): - GetQuery.__init__(self, what, None) - self.query = query - self.order = order - self.count = count - self.user = user - - def execute(self): - params = {} - if self.query: - params['searchquery'] = self.query - if self.order: - params['order'] = self.order - if self.count: - params['n'] = self.count - if self.user: - params['user_idstr'] = self.user - js = self._geturl(self.url + urllib.urlencode(params)) - if not js: - return None - return self.construct(js) - - def __str__(self): - params = {'searchquery':self.query, 'order':self.order, 'n':self.count} - return self.url + urllib.urlencode(params) - -class JamendoAPIException(Exception): - def __init__(self, url): - Exception.__init__(self, url) - -def _update_cache(cache, new_items): - if not isinstance(new_items, list): - new_items = [new_items] - for item in new_items: - old = cache.get(item.ID) - if old: - old._set_from(item) - else: - cache[item.ID] = item - if isinstance(item, Artist) and item.albums: - for album in item.albums: - _update_cache(_albums, album) - elif isinstance(item, Album) and item.tracks: - for track in item.tracks: - _update_cache(_tracks, track) - # enforce cache limits here! - # also, TODO: save/load cache between sessions - # that will require storing a timestamp with - # each item, though.. - # perhaps, - # artists: 1 day - changes often - # albums: 2-5 days - changes less often (?) - # tracks: 1 week - changes rarely, queried often - -def get_artist(artist_id): - """Returns: Artist""" - with _APILOCK: - a = _artists.get(artist_id, None) - if not a: - q = GetQuery('artist', artist_id) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_artists, a) - if isinstance(a, list): - a = a[0] - return a - -def get_artists(artist_ids): - """Returns: [Artist]""" - with _APILOCK: - assert(isinstance(artist_ids, list)) - found = [] - lookup = [] - for artist_id in artist_ids: - a = _artists.get(artist_id, None) - if not a: - lookup.append(artist_id) - else: - found.append(a) - if lookup: - q = GetQuery('artist_list', '+'.join(str(x) for x in lookup)) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_artists, a) - lookup = a - return found + lookup - -def get_album_list(album_ids): - """Returns: [Album]""" - with _APILOCK: - assert(isinstance(album_ids, list)) - found = [] - lookup = [] - for album_id in album_ids: - a = _albums.get(album_id, None) - if not a: - lookup.append(album_id) - else: - found.append(a) - if lookup: - q = GetQuery('album_list', '+'.join(str(x) for x in lookup)) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_albums, a) - lookup = a - return found + lookup - -def get_albums(artist_id): - """Returns: [Album] - Parameter can either be an artist_id or a list of album ids. - """ - if isinstance(artist_id, list): - return get_album_list(artist_id) - with _APILOCK: - a = _artists.get(artist_id, None) - if a and a.albums: - return a.albums - - q = GetQuery('albums', artist_id) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_albums, a) - return a - -def get_album(album_id): - """Returns: Album""" - with _APILOCK: - a = _albums.get(album_id, None) - if not a: - q = GetQuery('album', album_id) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_albums, a) - if isinstance(a, list): - a = a[0] - return a - -def get_track_list(track_ids): - """Returns: [Track]""" - with _APILOCK: - assert(isinstance(track_ids, list)) - found = [] - lookup = [] - for track_id in track_ids: - a = _tracks.get(track_id, None) - if not a: - lookup.append(track_id) - else: - found.append(a) - if lookup: - q = GetQuery('track_list', '+'.join(str(x) for x in lookup)) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_tracks, a) - lookup = a - return found + lookup - -def get_tracks(album_id): - """Returns: [Track] - Parameter can either be an album_id or a list of track ids. - """ - if isinstance(album_id, list): - return get_track_list(album_id) - with _APILOCK: - a = _albums.get(album_id, None) - if a and a.tracks: - return a.tracks - - q = GetQuery('tracks', album_id) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_tracks, a) - return a - -def get_track(track_id): - """Returns: Track""" - with _APILOCK: - a = _tracks.get(track_id, None) - if not a: - q = GetQuery('track', track_id) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_tracks, a) - if isinstance(a, list): - a = a[0] - return a - -def get_radio_tracks(radio_id): - """Returns: [Track]""" - with _APILOCK: - q = GetQuery('radio', radio_id) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_tracks, a) - return a - -#http://api.jamendo.com/get2/id+name/track/plain/?tag_id=327&n=50&order=rating_desc -def get_tag_tracks(tag_id): - """Returns: [Track]""" - with _APILOCK: - q = GetQuery('tag', tag_id) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_tracks, a) - return a - -def search_artists(query): - """Returns: [Artist]""" - with _APILOCK: - q = SearchQuery('artist', query, 'searchweight_desc') - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_artists, a) - return a - -def search_albums(query): - """Returns: [Album]""" - with _APILOCK: - q = SearchQuery('album', query, 'searchweight_desc') - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_albums, a) - return a - -def search_tracks(query): - """Returns: [Track]""" - with _APILOCK: - q = SearchQuery('track', query=query, order='searchweight_desc') - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_tracks, a) - return a - -def albums_of_the_week(): - """Returns: [Album]""" - with _APILOCK: - q = SearchQuery('album', order='ratingweek_desc') - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_albums, a) - return a - -def new_releases(): - """Returns: [Track] (playlist)""" - with _APILOCK: - q = SearchQuery('track', order='releasedate_desc') - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_tracks, a) - return a - -def tracks_of_the_week(): - """Returns: [Track] (playlist)""" - with _APILOCK: - q = SearchQuery('track', order='ratingweek_desc') - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_tracks, a) - return a - -def top_artists(order='rating_desc', count=20): - """Returns: [Artist]""" - with _APILOCK: - q = SearchQuery('artist', order=order, count=count) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_artists, a) - return a - -def top_albums(order='rating_desc', count=20): - """Returns: [Album]""" - with _APILOCK: - q = SearchQuery('album', order=order, count=count) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_albums, a) - return a - -def top_tracks(order='rating_desc', count=20): - """Returns: [Track]""" - with _APILOCK: - q = SearchQuery('track', order=order, count=count) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_tracks, a) - return a - -def get_radio(radio_id): - """Returns: Radio""" - with _APILOCK: - q = CustomQuery(_GET2+"id+name+idstr+image/radio/json?id=%d"%(radio_id)) - js = q.execute() - if not js: - raise JamendoAPIException(str(q)) - if isinstance(js, list): - ks = js[0] - return Radio(radio_id, json=js) - -def starred_radios(): - """Returns: [Radio]""" - with _APILOCK: - q = CustomQuery(_GET2+"id+name+idstr+image/radio/json?order=starred_desc") - js = q.execute() - if not js: - raise JamendoAPIException(str(q)) - return [Radio(int(radio['id']), json=radio) for radio in js] - -def top_tags(count=50, order='rating_desc'): - """Returns: [Tag]""" - with _APILOCK: - q = CustomQuery(_GET2+"id+name/tag/json?n=%d&order=%s"%(count, order)) - js = q.execute() - if not js: - raise JamendoAPIException(str(q)) - return [Tag(int(tag['id']), json=tag) for tag in js] - -def favorite_albums(user): - """Returns: [Album]""" - with _APILOCK: - q = SearchQuery('favorite_albums', user=user, count=20) - a = q.execute() - if not a: - raise JamendoAPIException(str(q)) - _update_cache(_albums, a) - return a - -### Set loader functions for classes - -def _artist_loader(self): - if self._needs_load(): - artist = get_artist(self.ID) - artist.albums = get_albums(self.ID) - self._set_from(artist) -Artist.load = _artist_loader - -def _album_loader(self): - if self._needs_load(): - album = get_album(self.ID) - album.tracks = get_tracks(self.ID) - self._set_from(album) -Album.load = _album_loader - -def _track_loader(self): - track = get_track(self.ID) - self._set_from(track) -Track.load = _track_loader - -def _radio_loader(self): - radio = get_radio(self.ID) - self._set_from(radio) -Radio.load = _radio_loader diff --git a/jamaui/__init__.py b/jamaui/__init__.py deleted file mode 100644 index 483bcd4..0000000 --- a/jamaui/__init__.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# - -import logging -import sys - -LOG_FILENAME = '/tmp/jamaendo.log' -LOG_LEVEL = logging.INFO -LOG_FORMAT = "%(asctime)s %(name)-10s: [%(lineno)4d] %(levelname)-5s %(message)s" - -_rootlogger = logging.getLogger() -_fhandler = logging.FileHandler(LOG_FILENAME, mode='w') -_shandler = logging.StreamHandler() -_formatter = logging.Formatter(LOG_FORMAT) -_fhandler.setFormatter(_formatter) -_shandler.setFormatter(_formatter) - -_rootlogger.addHandler(_fhandler) -_rootlogger.addHandler(_shandler) -_rootlogger.setLevel(LOG_LEVEL) - diff --git a/jamaui/albumlist.py b/jamaui/albumlist.py deleted file mode 100644 index c1dc2ab..0000000 --- a/jamaui/albumlist.py +++ /dev/null @@ -1,337 +0,0 @@ -import os -import gtk -import gobject -try: - import hildon -except: - import helldon as hildon -import jamaendo -import util -import draw -import colors -from postoffice import postoffice -import logging - -log = logging.getLogger(__name__) - -class _BaseList(gtk.TreeView): - """ - TODO: unify the different lists into one - """ - ICON_SIZE = 50 - - def __init__(self): - gtk.TreeView.__init__(self) - self.__store = None - self.default_pixbuf = util.find_resource('album.png') - self.connect('destroy', self.on_destroy) - self.connect('expose-event', self.on_treeview_expose_event) - self.loading_message = "Loading..." - self.empty_message = "Empty." - self._is_loading = True - - def get_pixbuf(self, img): - try: - return gtk.gdk.pixbuf_new_from_file_at_size(img, - self.ICON_SIZE, - self.ICON_SIZE) - except gobject.GError: - log.error("Broken image in cache: %s", img) - try: - os.unlink(img) - except OSError, e: - log.warning("Failed to unlink broken image.") - if img != self.default_pixbuf: - return self.get_default_pixbuf() - else: - return None - - def get_default_pixbuf(self): - if self.default_pixbuf: - return self.get_pixbuf(self.default_pixbuf) - - def on_destroy(self, wnd): - pass - - def set_loading(self, loading): - self._is_loading = loading - self.queue_draw() - - def on_treeview_expose_event(self, treeview, event): - if event.window == treeview.get_bin_window(): - model = treeview.get_model() - if (model is not None and model.get_iter_first() is not None): - return False - - ctx = event.window.cairo_create() - ctx.rectangle(event.area.x, event.area.y, - event.area.width, event.area.height) - ctx.clip() - x, y, width, height, depth = event.window.get_geometry() - - if self._is_loading: - text = self.loading_message - else: - text = self.empty_message - - desc = colors.get_font_desc('LargeSystemFont') - draw.text_box_centered(ctx, treeview, width, height, text, desc) - - return False - -class MusicList(_BaseList): - def __init__(self): - _BaseList.__init__(self) - (self.COL_ICON, self.COL_NAME, self.COL_ID, self.COL_IMAGE) = range(4) - self.__store = gtk.ListStore(gtk.gdk.Pixbuf, str, int, str) - - self.set_model(self.__store) - - icon = gtk.TreeViewColumn('Icon') - self.append_column(icon) - cell = gtk.CellRendererPixbuf() - icon.pack_start(cell, True) - icon.add_attribute(cell, 'pixbuf', self.COL_ICON) - - col = gtk.TreeViewColumn('Name') - self.append_column(col) - cell = gtk.CellRendererText() - col.pack_start(cell, True) - col.add_attribute(cell, 'text', self.COL_NAME) - self.set_search_column(self.COL_NAME) - col.set_sort_column_id(self.COL_NAME) - - postoffice.connect('images', self, self.on_images) - - def get_item_id(self, path): - return self.__store.get(self.__store.get_iter(path), self.COL_ID)[0] - - def on_destroy(self, wnd): - postoffice.disconnect('images', self) - - def on_images(self, images): - for url, image in images: - for row in self.__store: - if row[self.COL_IMAGE] == url: - pb = self.get_pixbuf(image) - if pb: - row[self.COL_ICON] = pb - - def add_items(self, items): - images = [x for x in (self.get_item_image(item) for item in items) if x] - for item in items: - txt = self.get_item_text(item) - self.__store.append([self.get_default_pixbuf(), txt, item.ID, self.get_item_image(item)]) - if images: - postoffice.notify('request-images', images) - - def get_item_text(self, item): - if isinstance(item, jamaendo.Album): - return "%s - %s" % (item.artist_name, item.name) - elif isinstance(item, jamaendo.Track): - return "%s - %s" % (item.artist_name, item.name) - else: - return item.name - - def get_item_image(self, item): - ret = None - if isinstance(item, jamaendo.Track): - ret = item.album_image - elif hasattr(item, 'image'): - ret = item.image - if ret: - ret = ret.replace('1.100.jpg', '1.%d.jpg'%(self.ICON_SIZE)) - return ret - -class AlbumList(_BaseList): - def __init__(self): - _BaseList.__init__(self) - (self.COL_ICON, self.COL_NAME, self.COL_ID) = range(3) - self.__store = gtk.ListStore(gtk.gdk.Pixbuf, str, int) - self.__show_artist = True - - self.set_model(self.__store) - - icon = gtk.TreeViewColumn('Icon') - self.append_column(icon) - cell = gtk.CellRendererPixbuf() - icon.pack_start(cell, True) - icon.add_attribute(cell, 'pixbuf', self.COL_ICON) - - col = gtk.TreeViewColumn('Name') - self.append_column(col) - cell = gtk.CellRendererText() - col.pack_start(cell, True) - col.add_attribute(cell, 'text', self.COL_NAME) - self.set_search_column(self.COL_NAME) - col.set_sort_column_id(self.COL_NAME) - - postoffice.connect('album-cover', self, self.on_album_cover) - - def on_destroy(self, wnd): - _BaseList.on_destroy(self, wnd) - postoffice.disconnect('album-cover', self) - - def on_album_cover(self, albumid, size, cover): - if size == self.ICON_SIZE: - for row in self.__store: - if row[self.COL_ID] == albumid: - row[self.COL_ICON] = self.get_pixbuf(cover) - - def add_album(self, album): - if self.__show_artist: - txt = "%s - %s" % (album.artist_name, album.name) - else: - txt = album.name - self.__store.append([self.get_default_pixbuf(), txt, album.ID]) - postoffice.notify('request-album-cover', album.ID, self.ICON_SIZE) - - def get_album_id(self, path): - return self.__store.get(self.__store.get_iter(path), self.COL_ID)[0] - - def show_artist(self, show): - self.__show_artist = show - -class TrackList(_BaseList): - def __init__(self, numbers = True): - _BaseList.__init__(self) - self.track_numbers = numbers - self.__store = gtk.ListStore(int, str, int) - self.set_model(self.__store) - - if numbers: - col0 = gtk.TreeViewColumn('Num') - self.append_column(col0) - cell0 = gtk.CellRendererText() - col0.pack_start(cell0, True) - col0.add_attribute(cell0, 'text', 0) - - col = gtk.TreeViewColumn('Name') - self.append_column(col) - cell = gtk.CellRendererText() - col.pack_start(cell, True) - col.add_attribute(cell, 'text', 1) - - self.set_search_column(1 if numbers else 0) - col.set_sort_column_id(0) - - def add_track(self, track): - self.__store.append([track.numalbum, track.name, track.ID]) - - def get_track_id(self, path): - treeiter = self.__store.get_iter(path) - _, _, _id = self.__store.get(treeiter, 0, 1, 2) - return _id - - -class PlaylistList(_BaseList): - def __init__(self): - _BaseList.__init__(self) - (self.COL_ICON, self.COL_NAME, self.COL_INFO, self.COL_ID) = range(4) - self.__store = gtk.ListStore(gtk.gdk.Pixbuf, str, str, int) - - self.set_model(self.__store) - - icon = gtk.TreeViewColumn('Icon') - self.append_column(icon) - cell = gtk.CellRendererPixbuf() - icon.pack_start(cell, True) - icon.add_attribute(cell, 'pixbuf', self.COL_ICON) - - col = gtk.TreeViewColumn('Name') - self.append_column(col) - cell = gtk.CellRendererText() - col.pack_start(cell, True) - col.add_attribute(cell, 'text', self.COL_NAME) - - col = gtk.TreeViewColumn('Info') - self.append_column(col) - cell = gtk.CellRendererText() - cell.set_property('xalign', 1.0) - col.pack_start(cell, True) - col.add_attribute(cell, 'text', self.COL_INFO) - - self.set_search_column(self.COL_NAME) - col.set_sort_column_id(self.COL_NAME) - - postoffice.connect('album-cover', self, self.on_album_cover) - - def on_destroy(self, wnd): - _BaseList.on_destroy(self, wnd) - postoffice.disconnect('album-cover', self) - - def on_album_cover(self, albumid, size, cover): - if size == self.ICON_SIZE: - for row in self.__store: - if row[self.COL_ID] == albumid: - row[self.COL_ICON] = self.get_pixbuf(cover) - - def add_playlist(self, name, tracks): - def trackcount(lst): - ln = len(lst) - if ln > 1: - return "(%d tracks)"%(ln) - elif ln == 1: - return "(1 track)" - return "(empty)" - track = tracks[0] if len(tracks) else None - track_album_id = int(track['data']['album_id']) if track else 0 - self.__store.append([self.get_default_pixbuf(), name, trackcount(tracks), track_album_id]) - if track_album_id: - postoffice.notify('request-album-cover', track_album_id, self.ICON_SIZE) - - def get_playlist_name(self, path): - return self.__store.get(self.__store.get_iter(path), self.COL_NAME)[0] - -class RadioList(_BaseList): - def __init__(self): - _BaseList.__init__(self) - (self.COL_ICON, self.COL_NAME, self.COL_ID, self.COL_IMAGE) = range(4) - self.__store = gtk.ListStore(gtk.gdk.Pixbuf, str, int, str) - self.set_model(self.__store) - - icon = gtk.TreeViewColumn('Icon') - self.append_column(icon) - cell = gtk.CellRendererPixbuf() - icon.pack_start(cell, True) - icon.add_attribute(cell, 'pixbuf', self.COL_ICON) - - col = gtk.TreeViewColumn('Name') - self.append_column(col) - cell = gtk.CellRendererText() - col.pack_start(cell, True) - col.add_attribute(cell, 'text', self.COL_NAME) - self.set_search_column(self.COL_NAME) - col.set_sort_column_id(self.COL_NAME) - - postoffice.connect('images', self, self.on_images) - - def on_destroy(self, wnd): - postoffice.disconnect('images', self) - - def add_radios(self, radios): - for radio in radios: - self.__store.append([self.get_default_pixbuf(), self.radio_name(radio), radio.ID, radio.image]) - postoffice.notify('request-images', [radio.image for radio in radios]) - - - def get_radio_id(self, path): - treeiter = self.__store.get_iter(path) - name, _id = self.__store.get(treeiter, self.COL_NAME, self.COL_ID) - return name, _id - - def on_images(self, images): - for url, image in images: - for row in self.__store: - if row[self.COL_IMAGE] == url: - pb = self.get_pixbuf(image) - if pb: - row[self.COL_ICON] = pb - - def radio_name(self, radio): - if radio.idstr: - return radio.idstr.capitalize() - elif radio.name: - return radio.name - else: - return "Radio #%s" % (radio.ID) diff --git a/jamaui/colors.py b/jamaui/colors.py deleted file mode 100644 index 62ab8c9..0000000 --- a/jamaui/colors.py +++ /dev/null @@ -1,81 +0,0 @@ -# hildon colors - -import gtk -try: - import hildon - _using_helldon = False -except: - import helldon as hildon - _using_helldon = True - -# See the Fremantle Master Layout Guide for more information: -# http://tinyurl.com/fremantle-master-layout-guide - -logical_font_names = ( - 'SystemFont', - 'EmpSystemFont', - 'SmallSystemFont', # Used for secondary text in buttons/TreeViews - 'EmpSmallSystemFont', - 'LargeSystemFont', # Used for empty TreeView text - 'X-LargeSystemFont', - 'XX-LargeSystemFont', - 'XXX-LargeSystemFont', - 'HomeSystemFont', -) - -logical_color_names = ( - 'ButtonTextColor', - 'ButtonTextPressedColor', - 'ButtonTextDisabledColor', - 'ActiveTextColor', # Used for Button values, etc.. - 'SecondaryTextColor', # Used for additional/secondary information -) - -def get_font_desc(logicalfontname): - settings = gtk.settings_get_default() - font_style = gtk.rc_get_style_by_paths(settings, logicalfontname, \ - None, None) - if not font_style: - font_style = gtk.rc_get_style_by_paths(settings, - 'GtkButton', 'GtkButton', gtk.Button) - - font_desc = font_style.font_desc - return font_desc - -def get_color(logicalcolorname): - settings = gtk.settings_get_default() - color_style = gtk.rc_get_style_by_paths(settings, 'GtkButton', \ - 'osso-logical-colors', gtk.Button) - - if not color_style: - font_style = gtk.rc_get_style_by_paths(settings, - 'GtkButton', 'GtkButton', gtk.Button) - return color_style.lookup_color(logicalcolorname) - -if _using_helldon: - def font(name): - return "normal" -else: - def font(name): - return get_font_desc(name).to_string() - -if _using_helldon: - def color(name): - return "#333333" -else: - def color(name): - return get_color(name).to_string() - -import sys -current_module = sys.modules[__name__] - -def mk_font_fun(name): - def inner(): - return font(name) - return inner - -for fnt in logical_font_names: - setattr(current_module, fnt.replace('-', ''), mk_font_fun(fnt)) - -for clr in logical_color_names: - setattr(current_module, clr, lambda: color(clr)) diff --git a/jamaui/console.py b/jamaui/console.py deleted file mode 100644 index 56e795c..0000000 --- a/jamaui/console.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -# console interface to jamaui/jamaendo - -# debugging hack - add . to path -import os, sys -local_module_dir = os.path.join(os.path.dirname(sys.argv[0]), '..') -if os.path.isdir(local_module_dir): - sys.path.append(local_module_dir) - -import jamaendo -from jamaui.player import Player, Playlist, the_player -import time -import gobject - -gobject.threads_init() - -import pprint - -pp = pprint.PrettyPrinter(indent=4) - -#pp.pprint(stuff) - -class Console(object): - def run(self): - query = sys.argv[1] - - queries = ['albums_of_the_week', 'artists', 'albums'] - if query in queries: - getattr(self, "query_"+query)() - else: - print "Valid queries: " + ", ".join(queries) - - def query_albums_of_the_week(self): - result = jamaendo.albums_of_the_week() - pp.pprint([(a.ID, a.name) for a in result]) - for a in result: - self.play_album(a) - - def query_artists(self): - result = jamaendo.search_artists(sys.argv[2]) - pp.pprint([(a.ID, a.name) for a in result]) - for a in result: - albums = jamaendo.get_albums(a.ID) - for album in albums: - print "Playing album: %s - %s" % (a.name, album.name) - self.play_album(album) - - def query_albums(self): - result = jamaendo.search_albums(sys.argv[2]) - pp.pprint([(a.ID, a.name) for a in result]) - for a in result: - self.play_album(a) - - def play_tracks(self, tracks): - playlist = Playlist(tracks) - player = the_player - player.play(playlist) - - while player.playing(): - try: - time.sleep(1) - except KeyboardInterrupt: - player.next() - - def play_album(self, album): - if not album.tracks: - album.load() - print "%s - %s" % (album.artist_name, album.name) - if album.tracks: - self.play_tracks(album.tracks) - -if __name__=="__main__": - main() diff --git a/jamaui/draw.py b/jamaui/draw.py deleted file mode 100644 index 400111d..0000000 --- a/jamaui/draw.py +++ /dev/null @@ -1,23 +0,0 @@ -import gtk -import pango - -def text_box_centered(ctx, widget, w_width, w_height, text, font_desc=None): - style = widget.rc_get_style() - text_color = style.text[gtk.STATE_PRELIGHT] - red, green, blue = text_color.red, text_color.green, text_color.blue - text_color = [float(x)/65535. for x in (red, green, blue)] - text_color.append(.5) - - if font_desc is None: - font_desc = style.font_desc - font_desc.set_size(14*pango.SCALE) - - pango_context = widget.create_pango_context() - layout = pango.Layout(pango_context) - layout.set_font_description(font_desc) - layout.set_text(text) - width, height = layout.get_pixel_size() - - ctx.move_to(w_width/2-width/2, w_height/2-height/2) - ctx.set_source_rgba(*text_color) - ctx.show_layout(layout) diff --git a/jamaui/favorites.py b/jamaui/favorites.py deleted file mode 100644 index ef58143..0000000 --- a/jamaui/favorites.py +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -try: - import hildon -except: - import helldon as hildon -import jamaendo -from playerwindow import open_playerwindow -from showartist import ShowArtist -from showalbum import ShowAlbum -from settings import settings -import logging -from fetcher import Fetcher -import itertools - -from albumlist import MusicList - -log = logging.getLogger(__name__) - -def _alist(l, match): - for key, value in l: - if key == match: - return value - return None - -class FavoritesWindow(hildon.StackableWindow): - def __init__(self): - hildon.StackableWindow.__init__(self) - self.set_title("Favorites") - self.connect('destroy', self.on_destroy) - self.fetcher = None - self.idmap = {} - - self.panarea = hildon.PannableArea() - self.favorites = MusicList() - self.favorites.connect('row-activated', self.row_activated) - self.panarea.add(self.favorites) - self.add(self.panarea) - - if not settings.user: - self.favorites.loading_message = """give your username -to the settings dialog -favorites appear -""" - else: - self.favorites.loading_message = """Loading favorites""" - - self.start_favorites_fetcher() - - def on_destroy(self, wnd): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - - def start_favorites_fetcher(self): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - - def gen(): - generated = [] - for item in jamaendo.favorite_albums(settings.user): - generated.append(item.ID) - yield item - fav = [f[1] for f in settings.favorites \ - if isinstance(f, tuple) and \ - len(f) == 2 and \ - f[0] == 'album' and \ - f[1] not in generated] - for item in jamaendo.get_albums(fav): - yield item - - self.fetcher = Fetcher(gen, - self, - on_item = self.on_favorites_result, - on_ok = self.on_favorites_complete, - on_fail = self.on_favorites_complete) - self.fetcher.start() - - def on_favorites_result(self, wnd, item): - if wnd is self: - if item.ID not in self.idmap: - self.idmap[item.ID] = item - self.favorites.add_items([item]) - - def on_favorites_complete(self, wnd, error=None): - if wnd is self: - self.fetcher.stop() - self.fetcher = None - - def get_item_text(self, item): - if isinstance(item, jamaendo.Album): - return "%s - %s" % (item.artist_name, item.name) - elif isinstance(item, jamaendo.Track): - return "%s - %s" % (item.artist_name, item.name) - else: - return item.name - - def row_activated(self, treeview, path, view_column): - _id = self.favorites.get_item_id(path) - item = self.idmap.get(_id) - if item: - self.open_item(item) - - def open_item(self, item): - if isinstance(item, jamaendo.Album): - wnd = ShowAlbum(item) - wnd.show_all() - elif isinstance(item, jamaendo.Artist): - wnd = ShowArtist(item) - wnd.show_all() - elif isinstance(item, jamaendo.Track): - wnd = open_playerwindow() - wnd.play_tracks([item]) diff --git a/jamaui/featured.py b/jamaui/featured.py deleted file mode 100644 index b85ec5a..0000000 --- a/jamaui/featured.py +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import gtk -try: - import hildon -except: - import helldon as hildon -import jamaendo -from playerwindow import open_playerwindow -from showartist import ShowArtist -from showalbum import ShowAlbum -from albumlist import MusicList -from player import Playlist -from fetcher import Fetcher -import logging - -log = logging.getLogger(__name__) - -def _alist(l, match): - for key, value in l: - if key == match: - return value - return None - -class FeaturedWindow(hildon.StackableWindow): - features = ( - ("New releases",jamaendo.new_releases), - ("Top albums today", lambda: jamaendo.top_albums(order='ratingday_desc')), - ("Top tracks today", lambda: jamaendo.top_tracks(order='ratingday_desc')), - ("Albums of the week",jamaendo.albums_of_the_week), - ("Tracks of the week",jamaendo.tracks_of_the_week), - ("Top 50 tags", lambda: jamaendo.top_tags(count=50)), - ("Top 50 artists", lambda: jamaendo.top_artists(count=50)), - ("Top 50 albums", lambda: jamaendo.top_albums(count=50)), - ("Top 50 tracks", lambda: jamaendo.top_tracks(count=50)), - ) - - def __init__(self, feature): - hildon.StackableWindow.__init__(self) - self.set_title(feature) - - self.fetcher = None - self.connect('destroy', self.on_destroy) - self.featurefn = _alist(self.features, feature) - - # Results list - self.panarea = hildon.PannableArea() - self.musiclist = MusicList() - self.musiclist.connect('row-activated', self.row_activated) - self.panarea.add(self.musiclist) - - self.idmap = {} - self.items = [] - - self.add(self.panarea) - - self.create_menu() - - self.start_feature_fetcher() - - def start_feature_fetcher(self): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - self.fetcher = Fetcher(self.featurefn, self, - on_item = self.on_feature_result, - on_ok = self.on_feature_complete, - on_fail = self.on_feature_complete) - self.fetcher.start() - - def on_feature_result(self, wnd, item): - if wnd is self: - self.musiclist.add_items([item]) - self.idmap[item.ID] = item - self.items.append(item) - - def on_feature_complete(self, wnd, error=None): - if wnd is self: - self.fetcher.stop() - self.fetcher = None - - def create_menu(self): - def on_player(*args): - from playerwindow import open_playerwindow - open_playerwindow() - self.menu = hildon.AppMenu() - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Open player") - player.connect("clicked", on_player) - self.menu.append(player) - self.menu.show_all() - self.set_app_menu(self.menu) - - def on_destroy(self, wnd): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - - def row_activated(self, treeview, path, view_column): - _id = self.musiclist.get_item_id(path) - item = self.idmap[_id] - self.open_item(item) - - def open_item(self, item): - if isinstance(item, jamaendo.Album): - wnd = ShowAlbum(item) - wnd.show_all() - elif isinstance(item, jamaendo.Artist): - wnd = ShowArtist(item) - wnd.show_all() - elif isinstance(item, jamaendo.Track): - playlist = Playlist(self.items) - playlist.jump_to(item.ID) - wnd = open_playerwindow() - wnd.play_tracks(playlist) - elif isinstance(item, jamaendo.Tag): - self.start_tag_fetcher(item.ID) - - def start_tag_fetcher(self, item_id): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - self.fetcher = Fetcher(lambda: jamaendo.get_tag_tracks(item_id), - self, - on_item = self.on_tag_result, - on_ok = self.on_tag_complete, - on_fail = self.on_tag_complete) - self.fetcher.taglist = [] - self.fetcher.start() - - def on_tag_result(self, wnd, item): - if wnd is self and hasattr(self.fetcher, 'taglist'): - self.fetcher.taglist.append(item) - - def on_tag_complete(self, wnd, error=None): - if wnd is self: - self.fetcher.stop() - if error is not None and hasattr(self.fetcher, 'taglist'): - wnd = open_playerwindow() - wnd.play_tracks(self.fetcher.taglist) - self.fetcher = None - diff --git a/jamaui/fetcher.py b/jamaui/fetcher.py deleted file mode 100644 index eb1d08d..0000000 --- a/jamaui/fetcher.py +++ /dev/null @@ -1,82 +0,0 @@ -# Background fetcher: -# Takes a generator and a notification identifier as parameter, -# starts a thread, and post a notification whenever data arrives. -# Posts a completion notification when done. -# Terminates if generator fails or encounters an error. - -import threading -from postoffice import postoffice -import jamaendo -import logging - -import gobject -import gtk -import hildon - -log = logging.getLogger(__name__) - -class _Worker(threading.Thread): - def __init__(self, generator, owner): - threading.Thread.__init__(self) - self.setDaemon(True) - self.generator = generator - self.owner = owner - - def _post(self, item): - def idle_fetch(owner, item): - postoffice.notify("fetch", owner, item) - gobject.idle_add(idle_fetch, self.owner, item) - - def _post_ok(self): - def idle_fetch_ok(owner): - postoffice.notify("fetch-ok", owner) - gobject.idle_add(idle_fetch_ok, self.owner) - - def _post_fail(self, e): - def idle_fetch_fail(owner, e): - postoffice.notify("fetch-fail", owner, e) - gobject.idle_add(idle_fetch_fail, self.owner, e) - - def run(self): - try: - for item in self.generator(): - self._post(item) - self._post_ok() - except jamaendo.JamendoAPIException, e: - log.exception("Failed to fetch, id %s" % (self.owner)) - self._post_fail(e) - -class Fetcher(object): - def __init__(self, generator, owner, on_item = None, on_ok = None, on_fail = None): - self.generator = generator - self.owner = owner - self.worker = None - - self.on_item = on_item - self.on_ok = on_ok - self.on_fail = on_fail - - def _on_item_cb(self, i, x): - self.on_item(i, x) - - def _on_ok_cb(self, i): - self.on_ok(i) - if isinstance(self.owner, gtk.Window): - hildon.hildon_gtk_window_set_progress_indicator(self.owner, 0) - - def _on_fail_cb(self, i, e): - self.on_fail(i, e) - if isinstance(self.owner, gtk.Window): - hildon.hildon_gtk_window_set_progress_indicator(self.owner, 0) - - def start(self): - postoffice.connect('fetch', self, self._on_item_cb) - postoffice.connect('fetch-ok', self, self._on_ok_cb) - postoffice.connect('fetch-fail', self, self._on_fail_cb) - if isinstance(self.owner, gtk.Window): - hildon.hildon_gtk_window_set_progress_indicator(self.owner, 1) - self.worker = _Worker(self.generator, self.owner) - self.worker.start() - - def stop(self): - postoffice.disconnect(['fetch', 'fetch-ok', 'fetch-fail'], self) diff --git a/jamaui/listbox.py b/jamaui/listbox.py deleted file mode 100644 index dad31ef..0000000 --- a/jamaui/listbox.py +++ /dev/null @@ -1,77 +0,0 @@ -# what the fuck, GTK -import gtk -try: - import hildon - _using_helldon = False -except: - import helldon as hildon - _using_helldon = True - -class ListBox(gtk.TreeView): - def __init__(self): - gtk.TreeView.__init__(self) - self.store = gtk.ListStore(str) - column = gtk.TreeViewColumn("Text") - textRenderer = gtk.CellRendererText() - column.pack_start(textRenderer, True) - column.set_attributes(textRenderer, text = 0) - self.append_column(column) - self.set_model(self.store) - - def get_text(self, path): - it = self.store.get_iter(path) - if not it: - return None - ret = self.store.get(it, 0) - return ret[0] - - def get_selected_text(self): - model, it = self.get_selection().get_selected() - if not it: - return None - ret = self.store.get(it, 0) - return ret[0] - - def append(self, text): - self.store.append([text]) - - def on_select(self, callback, *args): - def cb(lb, path, col): - ret = self.get_text(path) - if ret: - callback(ret, *args) - self.connect('row-activated', cb) - -class ListDialog(gtk.Dialog): - def __init__(self, title, parent=None): - gtk.Dialog.__init__(self, title, parent if not _using_helldon else None) - self.listbox = ListBox() - panarea = hildon.PannableArea() - panarea.add(self.listbox) - panarea.set_size_request_policy(hildon.SIZE_REQUEST_CHILDREN) - self.vbox.pack_start(panarea, True, True, 0) - - self.selected = None - - def selector(selected, dialog): - if selected: - self.selected = selected - dialog.response(gtk.RESPONSE_OK) - self.listbox.on_select(selector, self) - -class ButtonListDialog(gtk.Dialog): - def __init__(self, title, parent=None): - gtk.Dialog.__init__(self, title, parent if not _using_helldon else None) - self.panarea = hildon.PannableArea() - self.panarea.set_size_request(800, 400) - self.buttons = gtk.VBox(False, 0) - self.panarea.add_with_viewport(self.buttons) - self.vbox.pack_start(self.panarea, True, True, 0) - - def add_button(self, label, clickcb, *args): - btn = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH|gtk.HILDON_SIZE_FINGER_HEIGHT, - hildon.BUTTON_ARRANGEMENT_VERTICAL) - btn.set_label(label) - btn.connect('clicked', clickcb, *args) - self.buttons.pack_start(btn, False, False, 0) - diff --git a/jamaui/ossohelper.py b/jamaui/ossohelper.py deleted file mode 100644 index c7cbde2..0000000 --- a/jamaui/ossohelper.py +++ /dev/null @@ -1,139 +0,0 @@ -# ossohelper.py - Helper to osso functions -# -# Copyright (c) 2008 INdT - Instituto Nokia de Tecnologia -# -# This file is part of carman-python. -# Modified for inclusion in Panucci (June 2009). -# -# carman-python is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# carman-python is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 . - -import os -import logging - -__log = logging.getLogger(__name__) - -try: - import osso - __osso_imported__ = True -except ImportError: - __log.warning('osso module not found - are you running on a desktop?') - __osso_imported__ = False - -DEVICE_STATE_NORMAL = "normal" -OSSO_DEVSTATE_MODE_FILE = "/tmp/.libosso_device_mode_cache" - -__osso_context__ = None -__osso_application__ = None -__osso_device_state__ = None - -def application_init(app_name, app_version): - """ - Osso application init. - """ - - global __osso_context__, __osso_device_state__, __osso_application__ - - if __osso_imported__: - if has_osso(): - __log.warning('osso application was already called. Ignoring...') - return - try: - __osso_context__ = osso.Context(app_name, app_version, False) - except Exception, err: - __log.warning('osso module found but could not be initialized: %s', - err) - __osso_context__ = None - return - - try: - __osso_application__ = osso.Application(__osso_context__) - except Exception, err: - __log.warning('error creating osso application: %s' % err) - __osso_application__ = None - - __log.debug( 'osso application init sent - %s v%s', app_name, - app_version) - __osso_device_state__ = osso.DeviceState(__osso_context__) -# application_init - -def application_exit(): - """ - Osso application exit. - """ - #if __osso_application__ is not None and __osso_context__ is not None: - # try: - # #__osso_application__.close() - # __osso_context__.close() - # except Exception, err: - # __log.warning('application end could not be sent: %s' % err) - # __log.debug('osso application end sent') -# application_exit - -def application_top(app_name): - """ - Osso application top. - """ - if __osso_imported__ and __osso_application__: - try: - __osso_application__.application_top(app_name) - except Exception, err: - __log.warning( "Error calling application top for %s: %s", - app_name, err) - __log.info('osso application top for %s sent', app_name) - -# application_top - -def has_osso(): - """ - Return if the osso module was initialized and all objects were created - without any problem - """ - return __osso_imported__ and not None in ( __osso_context__, - __osso_device_state__, - __osso_application__ ) -# has_osso - -def display_on(): - """ - Turn on the display - """ - if __osso_device_state__ is not None: - __osso_device_state__.display_state_on() - __osso_device_state__.display_blanking_pause() - __log.info('osso display on') -# display_on - -def display_blanking_pause(): - """ - Keep the backlight on. Should be called every 45 seconds. - """ - if __osso_device_state__ is not None: - __osso_device_state__.display_blanking_pause() - __log.debug('osso blanking screen') -#display_blanking_pause - -def get_device_state(): - if __osso_device_state__ is not None: - cache_file_name = OSSO_DEVSTATE_MODE_FILE + "-" + str(os.getuid()) - try: - state = os.readlink(cache_file_name) - except: - state = None - if not state: - __log.debug( "Failure to read device state from %s", - cache_file_name) - state = DEVICE_STATE_NORMAL - return state - else: - return DEVICE_STATE_NORMAL diff --git a/jamaui/player.py b/jamaui/player.py deleted file mode 100644 index 31211eb..0000000 --- a/jamaui/player.py +++ /dev/null @@ -1,446 +0,0 @@ -# Implements playback controls -# Gstreamer stuff mostly snibbed from Panucci -# -# This file is part of Panucci. -# Copyright (c) 2008-2009 The Panucci Audiobook and Podcast Player Project -# -# Panucci is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Panucci is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Panucci. If not, see . -# - -import logging -import pygst -pygst.require('0.10') -import gst -import util -import dbus - -import jamaendo -from settings import settings -from postoffice import postoffice -from fetcher import Fetcher - -log = logging.getLogger(__name__) - -class _Player(object): - """Defines the internal player interface""" - def __init__(self): - pass - def play_url(self, filetype, uri): - raise NotImplemented - def playing(self): - raise NotImplemented - def play_pause_toggle(self): - self.pause() if self.playing() else self.play() - def play(self): - raise NotImplemented - def pause(self): - raise NotImplemented - def stop(self): - raise NotImplemented - def set_eos_callback(self, cb): - raise NotImplemented - -class GStreamer(_Player): - """Wraps GStreamer""" - STATES = { gst.STATE_NULL : 'stopped', - gst.STATE_PAUSED : 'paused', - gst.STATE_PLAYING : 'playing' } - - def __init__(self): - _Player.__init__(self) - self.time_format = gst.Format(gst.FORMAT_TIME) - self.player = None - self.filesrc = None - self.filesrc_property = None - self.volume_control = None - self.volume_multiplier = 1. - self.volume_property = None - self.eos_callback = lambda: self.stop() - postoffice.connect('settings-changed', self, self.on_settings_changed) - - def on_settings_changed(self, key, value): - if key == 'volume': - self._set_volume_level(value) - #postoffice.disconnect(self) - - - def play_url(self, filetype, uri): - if None in (filetype, uri): - self.player = None - return False - - _first = False - if self.player is None: - _first = True - if False: - self._maemo_setup_playbin2_player(uri) - log.debug('Using playbin2 (maemo)') - elif util.platform == 'maemo': - self._maemo_setup_playbin_player() - log.debug('Using playbin (maemo)') - else: - self._setup_playbin_player() - log.debug( 'Using playbin (non-maemo)' ) - - bus = self.player.get_bus() - bus.add_signal_watch() - bus.connect('message', self._on_message) - self._set_volume_level(settings.volume) - - self._set_uri_to_be_played(uri) - - self.play() - return True - - def get_state(self): - if self.player: - state = self.player.get_state()[1] - return self.STATES.get(state, 'none') - return 'none' - - def get_position_duration(self): - try: - pos_int = self.player.query_position(self.time_format, None)[0] - dur_int = self.player.query_duration(self.time_format, None)[0] - except Exception, e: - log.exception('Error getting position') - pos_int = dur_int = 0 - return pos_int, dur_int - - def playing(self): - return self.get_state() == 'playing' - - def play(self): - if self.player: - self.player.set_state(gst.STATE_PLAYING) - - def pause(self): - if self.player: - self.player.set_state(gst.STATE_PAUSED) - - def stop(self, reset = True): - if self.player: - self.player.set_state(gst.STATE_NULL) - if reset: - self.player = None - - def _maemo_setup_playbin2_player(self, url): - self.player = gst.parse_launch("playbin2 uri=%s" % (url,)) - self.filesrc = self.player - self.filesrc_property = 'uri' - self.volume_control = self.player - self.volume_multiplier = 1. - self.volume_property = 'volume' - - def _maemo_setup_playbin_player( self): - self.player = gst.element_factory_make('playbin2', 'player') - self.filesrc = self.player - self.filesrc_property = 'uri' - self.volume_control = self.player - self.volume_multiplier = 1. - self.volume_property = 'volume' - return True - - def _setup_playbin_player( self ): - """ This is for situations where we have a normal (read: non-maemo) - version of gstreamer like on a regular linux distro. """ - self.player = gst.element_factory_make('playbin2', 'player') - self.filesrc = self.player - self.filesrc_property = 'uri' - self.volume_control = self.player - self.volume_multiplier = 10. - self.volume_property = 'volume' - - def _on_decoder_pad_added(self, decoder, src_pad, sink_pad): - # link the decoder's new "src_pad" to "sink_pad" - src_pad.link( sink_pad ) - - def _get_volume_level(self): - if self.volume_control is not None: - vol = self.volume_control.get_property( self.volume_property ) - return vol / float(self.volume_multiplier) - - def _set_volume_level(self, value): - assert 0 <= value <= 1 - - if self.volume_control is not None: - vol = value * float(self.volume_multiplier) - log.debug("Setting volume to %s", vol) - self.volume_control.set_property( self.volume_property, vol ) - - def _set_uri_to_be_played(self, uri): - # Sets the right property depending on the platform of self.filesrc - if self.player is not None: - self.filesrc.set_property(self.filesrc_property, uri) - log.info("%s", uri) - - def _on_message(self, bus, message): - t = message.type - - if t == gst.MESSAGE_EOS: - log.debug("Gstreamer: End of stream") - self.eos_callback() - #elif t == gst.MESSAGE_STATE_CHANGED: - # if (message.src == self.player and - # message.structure['new-state'] == gst.STATE_PLAYING): - # log.debug("gstreamer: state -> playing") - elif t == gst.MESSAGE_ERROR: - err, debug = message.parse_error() - log.critical( 'Error: %s %s', err, debug ) - self.stop() - - def set_eos_callback(self, cb): - self.eos_callback = cb - -if util.platform == 'maemo': - class OssoPlayer(_Player): - """ - A player which uses osso-media-player for playback (Maemo-specific) - """ - - SERVICE_NAME = "com.nokia.osso_media_server" - OBJECT_PATH = "/com/nokia/osso_media_server" - AUDIO_INTERFACE_NAME = "com.nokia.osso_media_server.music" - - def __init__(self): - self._on_eos = lambda: self.stop() - self._state = 'none' - self._audio = self._init_dbus() - self._init_signals() - - def play_url(self, filetype, uri): - self._audio.play_media(uri) - - def playing(self): - return self._state == 'playing' - - def play_pause_toggle(self): - self.pause() if self.playing() else self.play() - - def play(self): - self._audio.play() - - def pause(self): - if self.playing(): - self._audio.pause() - - def stop(self): - self._audio.stop() - - def set_eos_callback(self, cb): - self._on_eos = cb - - - def _init_dbus(self): - session_bus = dbus.SessionBus() - oms_object = session_bus.get_object(self.SERVICE_NAME, - self.OBJECT_PATH, - introspect = False, - follow_name_owner_changes = True) - return dbus.Interface(oms_object, self.AUDIO_INTERFACE_NAME) - - def _init_signals(self): - error_signals = { - "no_media_selected": "No media selected", - "file_not_found": "File not found", - "type_not_found": "Type not found", - "unsupported_type": "Unsupported type", - "gstreamer": "GStreamer Error", - "dsp": "DSP Error", - "device_unavailable": "Device Unavailable", - "corrupted_file": "Corrupted File", - "out_of_memory": "Out of Memory", - "audio_codec_not_supported": "Audio codec not supported" - } - - # Connect status signals - self._audio.connect_to_signal( "state_changed", - self._on_state_changed ) - self._audio.connect_to_signal( "end_of_stream", - lambda x: self._call_eos() ) - - # Connect error signals - for error, msg in error_signals.iteritems(): - self._audio.connect_to_signal(error, lambda *x: self._error(msg)) - - def _error(self, msg): - log.error(msg) - - def _call_eos(self): - self._on_eos() - - def _on_state_changed(self, state): - states = ("playing", "paused", "stopped") - self.__state = state if state in states else 'none' - -# PlayerBackend = OssoPlayer -#else: -PlayerBackend = GStreamer - -class Playlist(object): - def __init__(self, items = []): - self.radio_mode = False - self.radio_id = None - self.radio_name = None - if items is None: - items = [] - for item in items: - assert(isinstance(item, jamaendo.Track)) - self.items = items - self._current = -1 - - def add(self, item): - if isinstance(item, list): - for i in item: - assert(isinstance(i, jamaendo.Track)) - self.items.extend(item) - else: - self.items.append(item) - - def next(self): - if self.has_next(): - self._current = self._current + 1 - return self.items[self._current] - return None - - def prev(self): - if self.has_prev(): - self._current = self._current - 1 - return self.items[self._current] - return None - - def has_next(self): - return self._current < (len(self.items)-1) - - def has_prev(self): - return self._current > 0 - - def current(self): - if self._current >= 0: - return self.items[self._current] - return None - - def jump_to(self, item_id): - for c, i in enumerate(self.items): - if i.ID == item_id: - self._current = c - - def current_index(self): - return self._current - - def size(self): - return len(self.items) - - def __repr__(self): - return "Playlist(%d of %s)"%(self._current, ", ".join([str(item.ID) for item in self.items])) - -class Player(object): - def __init__(self): - self.backend = PlayerBackend() - self.backend.set_eos_callback(self._on_eos) - self.playlist = Playlist() - self.fetcher = None # for refilling the radio - - def get_position_duration(self): - return self.backend.get_position_duration() - - def _play_track(self, track, notify='play'): - self.backend.play_url('mp3', track.mp3_url()) - log.debug("playing %s", track) - postoffice.notify(notify, track) - - def _refill_radio(self): - log.debug("Refilling radio %s", self.playlist) - #self.playlist.add(jamaendo.get_radio_tracks(self.playlist.radio_id)) - self._start_radio_fetcher() - - def _start_radio_fetcher(self): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - self.fetcher = Fetcher(lambda: jamaendo.get_radio_tracks(self.playlist.radio_id), - self, - on_item = self._on_radio_result, - on_ok = self._on_radio_complete, - on_fail = self._on_radio_complete) - self.fetcher.has_no_results = True - self.fetcher.start() - - def _on_radio_result(self, wnd, item): - if wnd is self: - self.playlist.add(item) - if not self.playing(): - if self.fetcher.has_no_results: - self.fetcher.has_no_results = False - entry = self.playlist.next() - self._play_track(entry) - - def _on_radio_complete(self, wnd, error=None): - if wnd is self: - if error: - self.stop() - self.fetcher.stop() - self.fetcher = None - - def play(self, playlist = None): - if playlist: - self.playlist = playlist - elif self.playlist is None: - self.playlist = Playlist() - - if self.playlist.current(): - entry = self.playlist.current() - self._play_track(entry) - elif self.playlist.has_next(): - entry = self.playlist.next() - self._play_track(entry) - elif self.playlist.radio_mode: - self._refill_radio() - #self.play() - - def next(self): - if self.playlist.has_next(): - self.backend.stop(reset=False) - entry = self.playlist.next() - self._play_track(entry, notify='next') - elif self.playlist.radio_mode: - self._refill_radio() - #if self.playlist.has_next(): - # self.next() - #else: - # self.stop() - else: - self.stop() - - def prev(self): - if self.playlist.has_prev(): - self.backend.stop(reset=False) - entry = self.playlist.prev() - self._play_track(entry, 'prev') - - def pause(self): - self.backend.pause() - postoffice.notify('pause', self.playlist.current()) - - def stop(self): - self.backend.stop() - postoffice.notify('stop', self.playlist.current()) - - def playing(self): - return self.backend.playing() - - def _on_eos(self): - self.next() - -the_player = Player() # the player instance diff --git a/jamaui/playerwindow.py b/jamaui/playerwindow.py deleted file mode 100644 index fcf9ff3..0000000 --- a/jamaui/playerwindow.py +++ /dev/null @@ -1,388 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import gtk -import gobject -try: - import hildon -except: - import helldon as hildon -import util -import datetime -import pango -import jamaendo -from settings import settings -from postoffice import postoffice -from player import Playlist, the_player -import logging -import cgi - -from songposition import SongPosition -from listbox import ListDialog -import colors -log = logging.getLogger(__name__) - -class PlayerWindow(hildon.StackableWindow): - instance = None - - def __init__(self): - hildon.StackableWindow.__init__(self) - self.set_title("Jamaendo") - - PlayerWindow.instance = self - - self.connect('destroy', self.on_destroy) - - self.player = the_player - self.playlist = the_player.playlist - - vbox = gtk.VBox(False, 8) - - hbox = gtk.HBox(False) - - self.cover = gtk.Image() - self.set_default_cover() - - vbox2 = gtk.VBox() - - self.playlist_pos = gtk.Label() - self.playlist_pos.set_alignment(1.0,0) - self.track = gtk.Label() - self.track.set_alignment(0,1) - self.track.set_ellipsize(pango.ELLIPSIZE_END) - self.artist = gtk.Label() - self.artist.set_alignment(0,0.5) - self.artist.set_ellipsize(pango.ELLIPSIZE_END) - self.album = gtk.Label() - self.album.set_alignment(0,0) - self.album.set_ellipsize(pango.ELLIPSIZE_END) - self.playtime = gtk.Label() - self.playtime.set_alignment(1,0) - self.playtime.set_ellipsize(pango.ELLIPSIZE_END) - self.progress = SongPosition() - - self.set_labels('', '', '', 0, 0) - - self._position_timer = None - - vbox2.pack_start(self.playlist_pos, False) - vbox2.pack_start(self.track, True) - vbox2.pack_start(self.artist, True) - vbox2.pack_start(self.album, True) - vbox2.pack_start(self.playtime, False, True) - vbox2.pack_start(self.progress, False, True) - - hbox.set_border_width(8) - hbox.pack_start(self.cover, False, True, 8) - hbox.pack_start(vbox2, True, True, 0) - - vbox.pack_start(hbox, True, True, 0) - - btns = gtk.HButtonBox() - btns.set_property('layout-style', gtk.BUTTONBOX_SPREAD) - - vbox.pack_start(btns, False, True, 0) - - self.add_stock_button(btns, gtk.STOCK_MEDIA_PREVIOUS, self.on_prev) - self.add_play_button(btns) - self.add_stock_button(btns, gtk.STOCK_MEDIA_STOP, self.on_stop) - self.add_stock_button(btns, gtk.STOCK_MEDIA_NEXT, self.on_next) - - self.controls = btns - - self.add(vbox) - - postoffice.connect('album-cover', self, self.set_album_cover) - postoffice.connect(['next', 'prev', 'play', 'pause', 'stop'], self, self.on_state_changed) - - self.on_state_changed() - - self.create_menu() - - def create_menu(self): - self.menu = hildon.AppMenu() - - def to_artist(): - from showartist import ShowArtist - try: - hildon.hildon_gtk_window_set_progress_indicator(self, 1) - track = self.playlist.current() - artist = jamaendo.get_artist(int(track.artist_id)) - wnd = ShowArtist(artist) - wnd.show_all() - finally: - hildon.hildon_gtk_window_set_progress_indicator(self, 0) - def to_album(): - from showalbum import ShowAlbum - try: - hildon.hildon_gtk_window_set_progress_indicator(self, 1) - track = self.playlist.current() - album = jamaendo.get_album(int(track.album_id)) - wnd = ShowAlbum(album) - wnd.show_all() - finally: - hildon.hildon_gtk_window_set_progress_indicator(self, 0) - - b = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - b.set_label("Artist") - b.connect("clicked", lambda w: gobject.idle_add(to_artist)) - self.menu.append(b) - - b = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - b.set_label("Album") - b.connect("clicked", lambda w: gobject.idle_add(to_album)) - self.menu.append(b) - - b = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - b.set_label("Add to playlist") - b.connect("clicked", self.on_add_to_playlist) - self.menu.append(b) - - self.menu.show_all() - self.set_app_menu(self.menu) - - def on_state_changed(self, *args): - self.update_state() - self.update_play_button() - - if self.player.playing(): - self.start_position_timer() - else: - self.stop_position_timer() - - - def get_album_id(self): - if self.player.playlist and self.player.playlist.current(): - c = self.player.playlist.current() - if not c.album_id: - c.load() - if c.album_id: - return c.album_id - return None - - def on_destroy(self, wnd): - PlayerWindow.instance = None - self.stop_position_timer() - postoffice.disconnect(['album-cover', 'next', 'prev', 'play', 'stop'], self) - - def add_stock_button(self, btns, stock, cb): - btn = hildon.GtkButton(gtk.HILDON_SIZE_FINGER_HEIGHT) - btn.set_relief(gtk.RELIEF_NONE) - btn.set_focus_on_click(False) - sz = gtk.ICON_SIZE_BUTTON - btn.set_image(gtk.image_new_from_stock(stock, sz)) - btn.connect('clicked', cb) - btns.add(btn) - - def add_play_button(self, btns): - sz = gtk.ICON_SIZE_BUTTON - self.playimg = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, sz) - self.pauseimg = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, sz) - btn = hildon.GtkButton(gtk.HILDON_SIZE_FINGER_HEIGHT) - btn.set_relief(gtk.RELIEF_NONE) - if self.player.playing(): - btn.set_image(self.pauseimg) - btn.set_data('state', 'pause') - else: - btn.set_image(self.playimg) - btn.set_data('state', 'play') - btn.connect('clicked', self.on_play) - btns.add(btn) - self.playbtn = btn - - def update_play_button(self): - if self.player.playing(): - self.playbtn.set_image(self.pauseimg) - self.playbtn.set_data('state', 'pause') - else: - self.playbtn.set_image(self.playimg) - self.playbtn.set_data('state', 'play') - - def set_labels(self, track, artist, album, playlist_pos, playlist_size): - - if self.playlist.radio_mode: - ppstr = 'Radio: %s'%(cgi.escape(self.playlist.radio_name)) - elif playlist_size > 0: - ppstr = 'Track %s of %s'%(int(playlist_pos)+1, playlist_size) - else: - ppstr = "No playlist" - ppstr = '%s'%(colors.SmallSystemFont(), colors.SecondaryTextColor(), ppstr) - self.playlist_pos.set_markup(ppstr) - self.track.set_markup('%s'%(colors.LargeSystemFont(), cgi.escape(track))) - self.artist.set_markup('%s'%(cgi.escape(artist))) - self.album.set_markup('%s'%(colors.SecondaryTextColor(), cgi.escape(album))) - - if not track: - txt = '%s' % \ - (colors.XXLargeSystemFont(), - colors.SecondaryTextColor(), - '00:00' - ) - self.playtime.set_markup(txt) - - def show_banner(self, message, timeout = 2000): - banner = hildon.hildon_banner_show_information(self, '', message) - banner.set_timeout(2000) - - def on_add_to_playlist(self, button, user_data=None): - track = self.player.playlist.current() - from playlists import add_to_playlist - add_to_playlist(self, track) - - def volume_changed_hildon(self, widget): - settings.volume = widget.get_level()/100.0 - - def mute_toggled(self, widget): - if widget.get_mute(): - settings.volume = 0 - else: - settings.volume = widget.get_level()/100.0 - - def on_position_timeout(self): - if the_player.playing(): - self.set_song_position(*the_player.get_position_duration()) - else: - log.debug("position timeout, but not playing") - return True - - def start_position_timer(self): - if self._position_timer is not None: - self.stop_position_timer() - self._position_timer = gobject.timeout_add(1000, self.on_position_timeout) - - def stop_position_timer(self): - if self._position_timer is not None: - gobject.source_remove(self._position_timer) - self._position_timer = None - - def clear_position(self): - self.progress.set_position(0) - - def nanosecs_to_str(self, ns): - time_secs = int(float(ns)/1000000000.0) - if time_secs <= 59: - return "00:%02d"%(time_secs) - time_mins = int(time_secs/60.0) - time_secs -= time_mins*60 - if time_mins <= 59: - return "%02d:%02d"%(time_mins, time_secs) - - time_hrs = int(time_mins/60.0) - time_mins -= time_hrs*60 - return "%d:%02d:%02d"%(time_hrs, time_secs, time_mins) - - def set_song_position(self, time_elapsed, total_time): - value = (float(time_elapsed) / float(total_time)) if total_time else 0 - self.progress.set_position(value) - - - txt = '%s' % \ - (colors.XXLargeSystemFont(), - colors.SecondaryTextColor(), - self.nanosecs_to_str(time_elapsed) - ) - self.playtime.set_markup(txt) - - def set_default_cover(self): - tmp = util.find_resource('album.png') - if tmp: - log.debug("Setting cover to %s", tmp) - self.cover.set_from_file(tmp) - - def update_state(self): - item = self.playlist.current() - if item: - hildon.hildon_gtk_window_set_progress_indicator(self, 0) - if not item.name: - item.load() - self.set_labels(item.name, item.artist_name, item.album_name, - self.playlist.current_index(), self.playlist.size()) - self.set_default_cover() - postoffice.notify('request-album-cover', int(item.album_id), 300) - else: - self.set_labels('', '', '', 0, 0) - self.set_default_cover() - state = bool(item) - for btn in self.controls: - if isinstance(btn, hildon.GtkButton): - btn.set_sensitive(state) - - def set_album_cover(self, albumid, size, cover): - if size == 300: - playing = self.get_album_id() - if playing and albumid and (int(playing) == int(albumid)): - log.debug("Setting cover to %s", cover) - self.cover.set_from_file(cover) - - def play_radio(self, radio_name, radio_id): - playlist = Playlist([]) - playlist.radio_mode = True - playlist.radio_name = radio_name - playlist.radio_id = radio_id - hildon.hildon_gtk_window_set_progress_indicator(self, 1) - self.__play_tracks(playlist) - #log.debug("Playlist current: %s, playing? %s", - # playlist.current_index(), - # self.player.playing()) - - def play_tracks(self, tracks): - self.__play_tracks(tracks) - - def __play_tracks(self, tracks): - self.clear_position() - if isinstance(tracks, Playlist): - self.playlist = tracks - else: - self.playlist = Playlist(tracks) - log.debug("Playing: %s", self.playlist) - self.player.stop() - self.player.play(self.playlist) - - def on_play(self, button): - if not self.player.playing(): - self.player.play(self.playlist) - else: - self.player.pause() - def on_prev(self, button): - self.player.prev() - - def on_next(self, button): - self.player.next() - - def on_stop(self, button): - self.clear_position() - self.player.stop() - -def open_playerwindow(): - if PlayerWindow.instance: - player = PlayerWindow.instance - stack = player.get_stack() - sz = stack.size() - windows = stack.pop(sz) - windows.remove(player) - windows.append(player) - stack.push_list(windows) - else: - player = PlayerWindow() - player.show_all() - return player diff --git a/jamaui/playlists.py b/jamaui/playlists.py deleted file mode 100644 index 6384b1e..0000000 --- a/jamaui/playlists.py +++ /dev/null @@ -1,187 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import gtk -try: - import hildon -except: - import helldon as hildon -import jamaendo -from settings import settings -import logging -from albumlist import PlaylistList -from postoffice import postoffice - -log = logging.getLogger(__name__) - -def _alist(l, match): - for key, value in l: - if key == match: - return value - return None - -def _show_banner(parent, message, timeout = 2000): - banner = hildon.hildon_banner_show_information(parent, '', message) - banner.set_timeout(2000) - -show_banner = _show_banner - -from listbox import ListDialog - -def add_to_playlist(wnd, track): - if not track: - _show_banner(wnd, "Nothing to add") - return - - dialog = ListDialog('Add to playlist', wnd) - for name,_ in settings.playlists.iteritems(): - dialog.listbox.append(name) - dialog.listbox.append("New...") - try: - dialog.show_all() - if dialog.run() == gtk.RESPONSE_OK: - selected_playlist = dialog.selected - if selected_playlist == "New...": - dialog.hide() - selected_playlist = create_new_playlist(wnd) - if track and selected_playlist: - if isinstance(track, (list, tuple)): - for t in track: - settings.add_to_playlist(selected_playlist, {'id':t.ID, 'data':t.get_data()}) - else: - settings.add_to_playlist(selected_playlist, {'id':track.ID, 'data':track.get_data()}) - settings.save() - _show_banner(wnd, "Added to playlist '%s'" % (selected_playlist)) - finally: - dialog.destroy() - -def create_new_playlist(wnd): - dia_name = gtk.Dialog() - dia_name.set_title("New playlist") - dia_name.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK ) - entry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT) - entry.set_placeholder("Enter name") - entry.set_max_length(32) - entry.connect('activate', lambda entry, dialog: dialog.response(gtk.RESPONSE_OK), dia_name) - dia_name.vbox.pack_start(entry, True, True, 0) - dia_name.show_all() - if dia_name.run() != gtk.RESPONSE_OK: - return False - selected_playlist = entry.get_text() - dia_name.destroy() - if selected_playlist == '' or selected_playlist == 'New...': - return False - elif settings.get_playlist(selected_playlist): - _show_banner(wnd, "Playlist '%s' already exists!" % (selected_playlist)) - return False - return selected_playlist - - -class PlaylistsWindow(hildon.StackableWindow): - def __init__(self): - hildon.StackableWindow.__init__(self) - self.set_title("Playlists") - self.connect('destroy', self.on_destroy) - - #self.deltoolbar = hildon.EditToolbar("Choose playlists to delete", "Delete") - #self.set_edit_toolbar(self.deltoolbar) - #self.deltoolbar.connect("button-clicked", self.on_delete_button) - #self.deltoolbar.connect_swapped("arrow-clicked", gtk.widget_destroy, window) - - self.panarea = hildon.PannableArea() - self.playlistlist = PlaylistList() - self.playlistlist.loading_message = "Loading playlists" - self.playlistlist.empty_message = "No playlists found" - self.playlistlist.connect('row-activated', self.row_activated) - self.panarea.add(self.playlistlist) - self.add(self.panarea) - - self.populate() - - self.create_menu() - - postoffice.connect('settings-changed', self, self.settings_changed) - - def on_destroy(self, wnd): - postoffice.disconnect('settings-changed', self) - - def create_menu(self): - def on_player(*args): - from playerwindow import open_playerwindow - open_playerwindow() - self.menu = hildon.AppMenu() - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Open player") - player.connect("clicked", on_player) - self.menu.append(player) - - #player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - #player.set_label("Delete playlists") - #player.connect("clicked", self.on_delete_playlists) - #self.menu.append(player) - - # bah, I haven't decided how I want to do this yet - # lets just hide it for now - #player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - #player.set_label("Manage playlists") - #player.connect("clicked", self.on_manage_playlists) - #self.menu.append(player) - #player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - #player.set_label("Export...") - #player.connect("clicked", self.on_export_playlists) - #self.menu.append(player) - self.menu.show_all() - self.set_app_menu(self.menu) - - def populate(self): - for key, lst in sorted(list(settings.playlists.iteritems())): - self.playlistlist.add_playlist(key, lst) - self.playlistlist.set_loading(False) - - def settings_changed(self, setting, *args): - if setting == 'playlists': - self.playlistlist.set_loading(True) - self.playlistlist.get_model().clear() - self.populate() - - #def on_delete_playlists(self, *args): - # self.deltoolbar.show() - # self.playlistlist.set_hildon_ui_mode(hildon.UI_MODE_EDIT) - - #def on_delete_button(self, btn): - # pass - - #def on_export_playlists(self, *args): - # _show_banner(self, "TODOO") - - - def row_activated(self, treeview, path, view_column): - sel = self.playlistlist.get_playlist_name(path) - pl = settings.get_playlist(sel) - if pl: - from showplaylist import ShowPlaylist - wnd = ShowPlaylist(sel, pl) - wnd.show_all() - #from playerwindow import open_playerwindow - #wnd = open_playerwindow() - #wnd.play_tracks(pl) diff --git a/jamaui/postoffice.py b/jamaui/postoffice.py deleted file mode 100644 index e47cccf..0000000 --- a/jamaui/postoffice.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -# message central - -from __future__ import with_statement -import logging -import threading - -log = logging.getLogger(__name__) - -class PostOffice(object): - - def __init__(self): - self.lock = threading.RLock() - self.tags = {} # tag -> [callback] - - def notify(self, tag, *data): - with self.lock: - #log.info("(%s %s)", tag, " ".join(str(x) for x in data)) - clients = self.tags.get(tag) - if clients: - for ref, client in clients: - client(*data) - - def connect(self, tag, ref, callback): - with self.lock: - if not isinstance(tag, list): - tag = [tag] - for t in tag: - if t not in self.tags: - self.tags[t] = [] - clients = self.tags[t] - if callback not in clients: - clients.append((ref, callback)) - - def disconnect(self, tag, ref): - with self.lock: - if not isinstance(tag, list): - tag = [tag] - for t in tag: - if t not in self.tags: - self.tags[t] = [] - self.tags[t] = [(_ref, cb) for _ref, cb in self.tags[t] if _ref != ref] - -postoffice = PostOffice() - - diff --git a/jamaui/radios.py b/jamaui/radios.py deleted file mode 100644 index ac3e2ed..0000000 --- a/jamaui/radios.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import gtk -try: - import hildon -except: - import helldon as hildon -import jamaendo -from playerwindow import open_playerwindow -from albumlist import RadioList -from fetcher import Fetcher - -class RadiosWindow(hildon.StackableWindow): - def __init__(self): - hildon.StackableWindow.__init__(self) - self.fetcher = None - self.radios = {} - - self.set_title("Radios") - self.connect('destroy', self.on_destroy) - - # Results list - self.panarea = hildon.PannableArea() - self.radiolist = RadioList() - self.radiolist.connect('row-activated', self.row_activated) - self.panarea.add(self.radiolist) - self.add(self.panarea) - - self.start_radio_fetcher() - - def on_destroy(self, wnd): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - - def row_activated(self, treeview, path, view_column): - name, _id = self.radiolist.get_radio_id(path) - wnd = open_playerwindow() - wnd.play_radio(name, _id) - - def start_radio_fetcher(self): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - self.fetcher = Fetcher(jamaendo.starred_radios, self, - on_item = self.on_radio_result, - on_ok = self.on_radio_complete, - on_fail = self.on_radio_complete) - self.fetcher.start() - - def on_radio_result(self, wnd, item): - if wnd is self: - self.radios[item.ID] = item - self.radiolist.add_radios([item]) - - def on_radio_complete(self, wnd, error=None): - if wnd is self: - self.fetcher.stop() - self.fetcher = None diff --git a/jamaui/refresh.py b/jamaui/refresh.py deleted file mode 100644 index ed5fd37..0000000 --- a/jamaui/refresh.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# - -class RefreshDialog(object): - def __init__(self): - self.notebook = gtk.Notebook() - info = gtk.VBox() - info.pack_start(gtk.Label("Downloading complete DB from jamendo.com."), True, False) - info.pack_start(gtk.Label("This will download approximately 8 MB."), True, False) - self.force = hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT) - self.force.set_label("Force refresh") - - info.pack_start(self.force, True, False) - self.notebook.append_page(info) - - pcont = gtk.VBox() - self.progress = gtk.ProgressBar() - pcont.pack_start(self.progress, True, False) - self.notebook.append_page(pcont, - gtk.Label("Updating Database")) - self.progress.set_fraction(0) - self.progress.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT) - self.progress.set_text("Downloading...") - - self.notebook.append_page(gtk.Label("Database refreshed.")) - - self.dialog = hildon.WizardDialog(None, "Refresh", self.notebook) - self.notebook.connect("switch-page", self.on_switch) - self.dialog.set_forward_page_func(self.forward_func) - - self.refresher = None - - def on_complete(self, status): - hildon.hildon_gtk_window_set_progress_indicator(self.dialog, 0) - if status: - self.progress.set_fraction(1) - self.progress.set_text("DB up to date.") - else: - self.progress.set_fraction(0) - self.progress.set_text("Download failed.") - - def on_progress(self, percent): - if percent < 100: - self.progress.set_text("Downloading...") - self.progress.set_fraction(percent/100.0) - - def on_switch(self, notebook, page, num): - if num == 1: - hildon.hildon_gtk_window_set_progress_indicator(self.dialog, 1) - refresh_dump(self.on_complete, self.on_progress, force=self.force.get_active()) - elif self.refresher: - # cancel download - pass - return True - - def forward_func(self, notebook, current, userdata): - #page = notebook.get_nth_page(current) - if current == 0: - return True - else: - return False - - def show_all(self): - self.dialog.show_all() - - def run(self): - self.dialog.run() - - def hide(self): - self.dialog.hide() diff --git a/jamaui/search.py b/jamaui/search.py deleted file mode 100644 index c05794c..0000000 --- a/jamaui/search.py +++ /dev/null @@ -1,179 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import gtk -try: - import hildon -except: - import helldon as hildon -import jamaendo -from playerwindow import open_playerwindow -from showartist import ShowArtist -from showalbum import ShowAlbum -from albumlist import MusicList -from fetcher import Fetcher - -class SearchWindow(hildon.StackableWindow): - def __init__(self): - hildon.StackableWindow.__init__(self) - self.set_title("Search") - self.idmap = {} - - vbox = gtk.VBox(False, 0) - - self.fetcher = None - self.connect('destroy', self.on_destroy) - - # Results list - self.panarea = hildon.PannableArea() - self.musiclist = MusicList() - self.musiclist.loading_message = "Nothing found yet" - self.musiclist.empty_message = "No matching results" - self.musiclist.connect('row-activated', self.row_activated) - self.panarea.add(self.musiclist) - vbox.pack_start(self.panarea, True, True, 0) - - - # Create selector for search mode - self.mode_selector = hildon.TouchSelector(text=True) - - self.mode_selector.append_text("Artists") - self.mode_selector.append_text("Albums") - self.mode_selector.append_text("Tracks") - self.mode = hildon.PickerButton(gtk.HILDON_SIZE_FINGER_HEIGHT, - hildon.BUTTON_ARRANGEMENT_VERTICAL) - self.mode.set_title("Search for") - self.mode.set_selector(self.mode_selector) - self.mode_selector.connect("changed", self.mode_changed) - #vbox.pack_start(self.mode, False) - self.mode.set_active(1) - - - # Search box - hbox = gtk.HBox(False, 0) - self.entry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT) - self.entry.set_placeholder("Search") - self.entry.connect('activate', self.on_search) - btn = hildon.GtkButton(gtk.HILDON_SIZE_FINGER_HEIGHT) - btn.set_label(">>") - btn.connect('clicked', self.on_search) - hbox.pack_start(self.mode, False) - hbox.pack_start(self.entry, True, True, 0) - hbox.pack_start(btn, False) - vbox.pack_start(hbox, False) - self.add(vbox) - - self.create_menu() - - def create_menu(self): - def on_player(*args): - from playerwindow import open_playerwindow - open_playerwindow() - self.menu = hildon.AppMenu() - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Open player") - player.connect("clicked", on_player) - self.menu.append(player) - self.menu.show_all() - self.set_app_menu(self.menu) - - def on_destroy(self, wnd): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - - def mode_changed(self, selector, user_data): - pass - #current_selection = selector.get_current_text() - - def on_search(self, w): - mode = self.mode.get_active() - txt = self.entry.get_text() - self.musiclist.set_loading(False) - self.musiclist.empty_message = "Searching..." - self.musiclist.get_model().clear() - - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - - itemgen = None - if mode == 0: - itemgen = lambda: jamaendo.search_artists(query=txt) - elif mode == 1: - itemgen = lambda: jamaendo.search_albums(query=txt) - elif mode == 2: - itemgen = lambda: jamaendo.search_tracks(query=txt) - else: - return - - self.fetcher = Fetcher(itemgen, self, - on_item = self.on_add_result, - on_ok = self.on_add_complete, - on_fail = self.on_add_complete) - self.fetcher.start() - ''' - try: - if mode == 0: - items = jamaendo.search_artists(query=txt) - elif mode == 1: - items = jamaendo.search_albums(query=txt) - elif mode == 2: - items = jamaendo.search_tracks(query=txt) - - for item in items: - self.idmap[item.ID] = item - - self.musiclist.add_items(items) - except jamaendo.JamaendoAPIException: - # nothing found, force redraw - self.musiclist.queue_draw() - ''' - - def on_add_result(self, wnd, item): - if wnd is self: - self.musiclist.add_items([item]) - self.idmap[item.ID] = item - - def on_add_complete(self, wnd, error=None): - if wnd is self: - self.musiclist.empty_message = "No matching results" - self.musiclist.queue_draw() - self.fetcher.stop() - self.fetcher = None - - def row_activated(self, treeview, path, view_column): - _id = self.musiclist.get_item_id(path) - item = self.idmap[_id] - self.open_item(item) - - def open_item(self, item): - if isinstance(item, jamaendo.Album): - wnd = ShowAlbum(item) - wnd.show_all() - elif isinstance(item, jamaendo.Artist): - wnd = ShowArtist(item) - wnd.show_all() - elif isinstance(item, jamaendo.Track): - wnd = open_playerwindow() - wnd.play_tracks([item]) diff --git a/jamaui/settings.py b/jamaui/settings.py deleted file mode 100644 index db1a6aa..0000000 --- a/jamaui/settings.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import cPickle, os -import logging -import jamaendo -import datetime - -from postoffice import postoffice - -VERSION = 1 -log = logging.getLogger(__name__) - -class Settings(object): - defaults = { - 'volume':0.1, - 'user':None, - 'favorites':set([]), # local favorites - until we can sync back - 'playlists':{}, - } - - def __init__(self): - self.__savename = "/tmp/jamaendo_uisettings" - for k,v in self.defaults.iteritems(): - setattr(self, k, v) - - def __setattr__(self, key, value): - object.__setattr__(self, key, value) - if key in self.defaults.keys(): - postoffice.notify('settings-changed', key, value) - - def set_filename(self, savename): - self.__savename = savename - - def favorite(self, album): - self.favorites.add(('album', album.ID)) - self.save() - postoffice.notify('settings-changed', 'favorites', self.favorites) - - def get_playlist(self, playlist, get_track_objects=True): - entry = self.playlists.get(playlist) - if entry: - if get_track_objects: - return [jamaendo.Track(item['id'], item['data']) for item in entry] - return entry - return None - - def add_to_playlist(self, playlist, track): - if isinstance(track, jamaendo.Track): - track = {'id':track.ID, 'data':track.get_data()} - assert(isinstance(track, dict)) - lst = self.playlists.get(playlist) - if not lst: - lst = [] - self.playlists[playlist] = lst - lst.append(track) - postoffice.notify('settings-changed', 'playlists', self.playlists) - log.debug("playlists is now %s", self.playlists) - - def delete_playlist(self, name): - if name in self.playlists: - del self.playlists[name] - postoffice.notify('settings-changed', 'playlists', self.playlists) - - def load(self): - if not os.path.isfile(self.__savename): - return - try: - f = open(self.__savename) - settings = cPickle.load(f) - f.close() - - if settings['version'] > VERSION: - log.warning("Settings version %s higher than current version (%s)", - settings['version'], VERSION) - - for k in self.defaults.keys(): - if k in settings: - val = settings[k] - if k == 'playlists' and not isinstance(val, dict): - continue - setattr(self, k, val) - log.debug("Loaded settings: %s", settings) - except Exception, e: - log.exception('failed to load settings') - - def save(self): - try: - settings = { - 'version':VERSION, - } - for k in self.defaults.keys(): - settings[k] = getattr(self, k) - f = open(self.__savename, 'w') - cPickle.dump(settings, f) - f.close() - log.debug("Saved settings: %s", settings) - except Exception, e: - log.exception('failed to save settings') - -settings = Settings() diff --git a/jamaui/showalbum.py b/jamaui/showalbum.py deleted file mode 100644 index 7d0eed3..0000000 --- a/jamaui/showalbum.py +++ /dev/null @@ -1,219 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import gtk -import cgi -try: - import hildon -except: - import helldon as hildon -import jamaendo -from player import Playlist -from playerwindow import open_playerwindow -from settings import settings -from postoffice import postoffice -import util -import logging -import thread -import gobject -from albumlist import TrackList -from playlists import add_to_playlist -from fetcher import Fetcher - -import webbrowser - -log = logging.getLogger(__name__) - -class ShowAlbum(hildon.StackableWindow): - def __init__(self, album): - hildon.StackableWindow.__init__(self) - self.set_title(album.artist_name) - self.album = album - self.fetcher = None - - self.connect('destroy', self.on_destroy) - - top_hbox = gtk.HBox() - vbox1 = gtk.VBox() - self.cover = gtk.Image() - tmp = util.find_resource('album.png') - if tmp: - self.cover.set_from_file(tmp) - self.bbox = gtk.HButtonBox() - self.bbox.set_property('layout-style', gtk.BUTTONBOX_SPREAD) - self.goto_artist = self.make_imagebutton('artist', self.on_goto_artist) - self.download = self.make_imagebutton('download', self.on_download) - self.favorite = self.make_imagebutton('favorite', self.on_favorite) - self.license = self.make_imagebutton('license', self.on_license) - - vbox2 = gtk.VBox() - self.albumname = gtk.Label() - self.albumname.set_markup('%s'%(cgi.escape(album.name))) - self.trackarea = hildon.PannableArea() - - self.tracks = TrackList(numbers=True) - self.tracks.connect('row-activated', self.row_activated) - - self.tracklist = [] - #self.tracklist = jamaendo.get_tracks(album.ID) - #for track in self.tracklist: - # self.tracks.add_track(track) - - top_hbox.pack_start(vbox1, False) - top_hbox.pack_start(vbox2, True) - vbox1.pack_start(self.cover, True) - vbox1.pack_start(self.bbox, False) - self.bbox.add(self.goto_artist) - self.bbox.add(self.download) - self.bbox.add(self.favorite) - self.bbox.add(self.license) - vbox2.pack_start(self.albumname, False) - vbox2.pack_start(self.trackarea, True) - self.trackarea.add(self.tracks) - - self.add(top_hbox) - - postoffice.connect('album-cover', self, self.on_album_cover) - postoffice.notify('request-album-cover', self.album.ID, 300) - - self.create_menu() - self.start_track_fetcher() - - def create_menu(self): - def on_player(*args): - from playerwindow import open_playerwindow - open_playerwindow() - self.menu = hildon.AppMenu() - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Open player") - player.connect("clicked", on_player) - self.menu.append(player) - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Add to playlist") - player.connect("clicked", self.on_add_to_playlist) - self.menu.append(player) - self.menu.show_all() - self.set_app_menu(self.menu) - - def on_destroy(self, wnd): - postoffice.disconnect('album-cover', self) - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - - def start_track_fetcher(self): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - self.fetcher = Fetcher(lambda: jamaendo.get_tracks(self.album.ID), self, - on_item = self.on_track_result, - on_ok = self.on_track_complete, - on_fail = self.on_track_complete) - self.fetcher.start() - - def on_track_result(self, wnd, item): - if wnd is self: - self.tracklist.append(item) - self.tracks.add_track(item) - - def on_track_complete(self, wnd, error=None): - if wnd is self: - self.fetcher.stop() - self.fetcher = None - - def on_album_cover(self, albumid, size, cover): - if albumid == self.album.ID and size == 300: - self.cover.set_from_file(cover) - - def on_add_to_playlist(self, button, user_data=None): - add_to_playlist(self, self.tracklist) - - def make_imagebutton(self, name, cb): - btn = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - btn.set_relief(gtk.RELIEF_NONE) - img = util.find_resource('icon_%s.png'%(name)) - if img: - btn.set_image(gtk.image_new_from_file(img)) - else: - btn.set_image(gtk.image_new_from_stock(gtk.STOCK_MEDIA_STOP, gtk.ICON_SIZE_SMALL_TOOLBAR)) - btn.set_border_width(0) - btn.connect('clicked', cb) - return btn - - def on_goto_artist(self, btn): - def threadfun(wnd, artist_id): - try: - artist = jamaendo.get_artist(artist_id) - def oncomplete(wnd, artist): - wnd.open_item(artist) - hildon.hildon_gtk_window_set_progress_indicator(wnd, 0) - gobject.idle_add(oncomplete, wnd, artist) - except: - def onfail(wnd): - hildon.hildon_gtk_window_set_progress_indicator(wnd, 0) - gobject.idle_add(onfail, wnd) - hildon.hildon_gtk_window_set_progress_indicator(self, 1) - thread.start_new_thread(threadfun, (self, int(self.album.artist_id))) - - def on_download(self, btn): - banner = hildon.hildon_banner_show_information(self, '', "Opening in web browser") - banner.set_timeout(2000) - url = self.album.torrent_url() - webbrowser.open_new(url) - - def on_favorite(self, btn): - settings.favorite(self.album) - banner = hildon.hildon_banner_show_information(self, '', "Favorite added") - banner.set_timeout(2000) - - - def on_license(self, btn): - banner = hildon.hildon_banner_show_information(self, '', "Opening in web browser") - banner.set_timeout(2000) - url = self.album.license_url - webbrowser.open_new(url) - - def on_play(self, btn): - self.open_item(self.album) - - def row_activated(self, treeview, path, view_column): - # TODO: wait for all tracks to load - _id = self.tracks.get_track_id(path) - playlist = Playlist(self.tracklist) - playlist.jump_to(_id) - wnd = open_playerwindow() - wnd.play_tracks(playlist) - - def open_item(self, item): - if isinstance(item, jamaendo.Album): - tracks = jamaendo.get_tracks(item.ID) - if tracks: - wnd = open_playerwindow() - wnd.play_tracks(tracks) - elif isinstance(item, jamaendo.Artist): - from showartist import ShowArtist - wnd = ShowArtist(item) - wnd.show_all() - elif isinstance(item, jamaendo.Track): - wnd = open_playerwindow() - wnd.play_tracks([item]) diff --git a/jamaui/showartist.py b/jamaui/showartist.py deleted file mode 100644 index 9b49b4e..0000000 --- a/jamaui/showartist.py +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import os -import gtk -try: - import hildon -except: - import helldon as hildon -import jamaendo -from playerwindow import open_playerwindow -from albumlist import AlbumList -from postoffice import postoffice -import util -import gobject -from playlists import add_to_playlist, show_banner -from fetcher import Fetcher - -import logging - -log = logging.getLogger(__name__) - -class ShowArtist(hildon.StackableWindow): - ICON_SIZE = 200 - - def __init__(self, artist): - hildon.StackableWindow.__init__(self) - self.connect('destroy', self.on_destroy) - self.set_title(artist.name) - self.artist = artist - - self.connect('destroy', self.on_destroy) - self.fetcher = None - - top_hbox = gtk.HBox() - self.image = gtk.Image() - self.default_pixbuf = util.find_resource('album.png') - self.image.set_from_pixbuf(self.get_default_pixbuf()) - - self.panarea = hildon.PannableArea() - vbox = gtk.VBox(False, 0) - - self.albums = AlbumList() - self.albums.loading_message = "No albums" - self.albums.empty_message = "No albums" - self.albums.show_artist(False) - self.albums.connect('row-activated', self.row_activated) - - self.panarea.add(self.albums) - vbox.pack_start(self.panarea, True, True, 0) - #self.add(vbox) - - #imgalign = gtk.Alignment(xalign=0.2, yalign=0.4, xscale=1.0) - #alignment.add(bbox) - - self.image.set_alignment(0.5, 0.0) - - top_hbox.pack_start(self.image, False) - top_hbox.pack_start(vbox) - - self.add(top_hbox) - - self.albumlist = [] - - postoffice.connect('images', self, self.on_images) - - if self.artist.image: - postoffice.notify('request-images', [self.artist.image]) - - self.create_menu() - self.start_album_fetcher() - - def on_destroy(self, wnd): - postoffice.disconnect('images', self) - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - - def start_album_fetcher(self): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - self.fetcher = Fetcher(lambda: jamaendo.get_albums(self.artist.ID), self, - on_item = self.on_album_result, - on_ok = self.on_album_complete, - on_fail = self.on_album_complete) - self.fetcher.start() - - def on_album_result(self, wnd, item): - if wnd is self: - self.albums.add_album(item) - self.albumlist.append(item) - - def on_album_complete(self, wnd, error=None): - if wnd is self: - self.fetcher.stop() - self.fetcher = None - - def create_menu(self): - def on_player(*args): - from playerwindow import open_playerwindow - open_playerwindow() - self.menu = hildon.AppMenu() - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Open player") - player.connect("clicked", on_player) - self.menu.append(player) - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Add to playlist") - player.connect("clicked", self.on_add_to_playlist) - self.menu.append(player) - self.menu.show_all() - self.set_app_menu(self.menu) - - def start_addpl_fetcher(self): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - def fetchgen(): - for album in self.albumlist: - yield jamaendo.get_tracks(album.ID) - raise StopIteration - self.fetcher = Fetcher(fetchgen, self, - on_item = self.on_addpl_result, - on_ok = self.on_addpl_complete, - on_fail = self.on_addpl_complete) - self.fetcher.tracklist = [] - self.fetcher.pdlg = gtk.Dialog("Fetching album tracks", self) - self.fetcher.pbar = gtk.ProgressBar() - self.fetcher.pbar.set_fraction(0) - self.fetcher.pdlg.vbox.add(self.fetcher.pbar) - self.fetcher.pdlg.show_all() - self.fetcher.ppos = 1 - self.fetcher.start() - - def on_addpl_result(self, wnd, items): - if wnd is self: - self.fetcher.tracklist.extend(items) - self.fetcher.ppos += 1 - self.fetcher.pbar.set_fraction(float(self.fetcher.ppos)/float(len(self.albumlist)+1)) - - def on_addpl_complete(self, wnd, error=None): - if wnd is self: - self.fetcher.stop() - self.fetcher.pdlg.destroy() - if self.fetcher.tracklist: - add_to_playlist(self, self.fetcher.tracklist) - self.fetcher = None - - - def on_add_to_playlist(self, button, user_data=None): - if self.albumlist: - self.start_addpl_fetcher() - else: - show_banner(self, "Error when opening track list") - - def get_pixbuf(self, img): - try: - return gtk.gdk.pixbuf_new_from_file_at_size(img, - self.ICON_SIZE, - self.ICON_SIZE) - except gobject.GError: - log.error("Broken image in cache: %s", img) - try: - os.unlink(img) - except OSError, e: - log.warning("Failed to unlink broken image.") - if img != self.default_pixbuf: - return self.get_default_pixbuf() - else: - return None - - def get_default_pixbuf(self): - if self.default_pixbuf: - return self.get_pixbuf(self.default_pixbuf) - - def on_images(self, images): - for url, image in images: - if url == self.artist.image: - pb = self.get_pixbuf(image) - if pb: - self.image.set_from_pixbuf(pb) - - def start_albumplay_fetcher(self, ID): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - def albumgen(): - yield jamaendo.get_album(ID) - raise StopIteration - self.fetcher = Fetcher(albumgen, self, - on_item = self.on_albumplay_result, - on_ok = self.on_albumplay_complete, - on_fail = self.on_albumplay_complete) - self.fetcher.album = None - self.fetcher.start() - - def on_albumplay_result(self, wnd, item): - if wnd is self: - if isinstance(item, list): - self.fetcher.album = item[0] - else: - self.fetcher.album = item - - def on_albumplay_complete(self, wnd, error=None): - if wnd is self: - self.fetcher.stop() - if self.fetcher.album: - self.open_item(self.fetcher.album) - self.fetcher = None - - def row_activated(self, treeview, path, view_column): - _id = self.albums.get_album_id(path) - self.start_albumplay_fetcher(_id) - - def open_item(self, item): - if isinstance(item, jamaendo.Album): - from showalbum import ShowAlbum - wnd = ShowAlbum(item) - wnd.show_all() - elif isinstance(item, jamaendo.Artist): - wnd = ShowArtist(item) - wnd.show_all() - elif isinstance(item, jamaendo.Track): - wnd = open_playerwindow() - wnd.play_tracks([item]) diff --git a/jamaui/showplaylist.py b/jamaui/showplaylist.py deleted file mode 100644 index ed43c5a..0000000 --- a/jamaui/showplaylist.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import gtk -import cgi -try: - import hildon -except: - import helldon as hildon -import jamaendo -from player import Playlist -from playerwindow import open_playerwindow -from settings import settings -from postoffice import postoffice -import util -import logging -import thread -import gobject -from albumlist import TrackList -from fetcher import Fetcher - -import webbrowser - -log = logging.getLogger(__name__) - -class ShowPlaylist(hildon.StackableWindow): - def __init__(self, plname, playlist): - hildon.StackableWindow.__init__(self) - self.set_title(plname) - self.playlist_name = plname - self.playlist = playlist - self.fetcher = None - - self.connect('destroy', self.on_destroy) - - top_hbox = gtk.HBox() - vbox1 = gtk.VBox() - self.cover = gtk.Image() - tmp = util.find_resource('album.png') - if tmp: - self.cover.set_from_file(tmp) - - vbox2 = gtk.VBox() - self.trackarea = hildon.PannableArea() - self.tracks = TrackList(numbers=True) - self.tracks.connect('row-activated', self.row_activated) - self.tracklist = [] - - top_hbox.pack_start(vbox1, False) - top_hbox.pack_start(vbox2, True) - vbox1.pack_start(self.cover, True) - vbox2.pack_start(self.trackarea, True) - self.trackarea.add(self.tracks) - - self.add(top_hbox) - - postoffice.connect('album-cover', self, self.on_album_cover) - if len(self.playlist) > 0: - postoffice.notify('request-album-cover', int(self.playlist[0].album_id), 300) - - self.create_menu() - self.start_track_fetcher() - - def create_menu(self): - def on_player(*args): - from playerwindow import open_playerwindow - open_playerwindow() - self.menu = hildon.AppMenu() - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Open player") - player.connect("clicked", on_player) - self.menu.append(player) - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Delete playlist") - player.connect("clicked", self.on_delete_pl) - self.menu.append(player) - self.menu.show_all() - self.set_app_menu(self.menu) - - def on_destroy(self, wnd): - postoffice.disconnect('album-cover', self) - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - - def start_track_fetcher(self): - if self.fetcher: - self.fetcher.stop() - self.fetcher = None - self.fetcher = Fetcher(lambda: self.playlist, self, - on_item = self.on_track_result, - on_ok = self.on_track_complete, - on_fail = self.on_track_complete) - self.fetcher.start() - - def on_track_result(self, wnd, item): - if wnd is self: - self.tracklist.append(item) - self.tracks.add_track(item) - - def on_track_complete(self, wnd, error=None): - if wnd is self: - self.fetcher.stop() - self.fetcher = None - - def on_delete_pl(self, btn): - note = hildon.hildon_note_new_confirmation(self, "Do you want to delete '%s' ?" % (self.playlist_name)) - response = note.run() - note.destroy() - print response - if response == gtk.RESPONSE_OK: - settings.delete_playlist(self.playlist_name) - settings.save() - self.destroy() - - def on_album_cover(self, albumid, size, cover): - if size == 300: - self.cover.set_from_file(cover) - - def on_play(self, btn): - self.open_item(self.album) - - def row_activated(self, treeview, path, view_column): - # TODO: wait for all tracks to load - _id = self.tracks.get_track_id(path) - pl = Playlist(self.playlist) - pl.jump_to(_id) - wnd = open_playerwindow() - wnd.show_all() - wnd.play_tracks(pl) - - def open_item(self, item): - if isinstance(item, jamaendo.Album): - tracks = jamaendo.get_tracks(item.ID) - if tracks: - wnd = open_playerwindow() - wnd.play_tracks(tracks) - elif isinstance(item, jamaendo.Artist): - from showartist import ShowArtist - wnd = ShowArtist(item) - wnd.show_all() - elif isinstance(item, jamaendo.Track): - wnd = open_playerwindow() - wnd.play_tracks([item]) diff --git a/jamaui/songposition.py b/jamaui/songposition.py deleted file mode 100644 index 67e7a12..0000000 --- a/jamaui/songposition.py +++ /dev/null @@ -1,104 +0,0 @@ -import logging -import gtk -import cairo - -log = logging.getLogger(__name__) - -# shows the current song position (looking a bit nicer than a default widget, hopefully) -class SongPosition(gtk.DrawingArea): - WIDTH = 32.0 - HEIGHT = 16.0 - - def __init__(self): - gtk.DrawingArea.__init__(self) - self.connect('expose-event', self.on_expose) - self.set_size_request(int(self.WIDTH), int(self.HEIGHT)) - self.pos = 0.0 - - orange0 = self.hex_to_flt(0xec, 0xac, 0x1f) - orange1 = self.hex_to_flt(0xea, 0x86, 0x1d) - orange2 = self.hex_to_flt(0xda, 0x76, 0x0d) - orange3 = self.hex_to_flt(0xd0, 0x70, 0x00) - purple0 = self.hex_to_flt(0x81, 0x3e, 0x82) - purple1 = self.hex_to_flt(0x56, 0x2d, 0x5a) - - lightclr = cairo.LinearGradient(0.0, 0.0, 0.0, self.HEIGHT) - lightclr.add_color_stop_rgb(0.0, 1.0, 1.0, 1.0) - lightclr.add_color_stop_rgb(0.1, *orange0) - lightclr.add_color_stop_rgb(0.5, *orange1) - lightclr.add_color_stop_rgb(0.5, *orange2) - lightclr.add_color_stop_rgb(1.0, *orange3) - - darkclr = cairo.LinearGradient(0.0, 0.0, 0.0, self.HEIGHT) - darkclr.add_color_stop_rgb(0.0, 0.5, 0.5, 0.5) - darkclr.add_color_stop_rgb(0.5, 0.0, 0.0, 0.0) - darkclr.add_color_stop_rgb(1.0, 0.25, 0.25, 0.25) - - markerclr = cairo.LinearGradient(0.0, 0.0, 0.0, self.HEIGHT) - markerclr.add_color_stop_rgb(0.0, 1.0, 1.0, 1.0) - markerclr.add_color_stop_rgb(0.5, 1.0, 1.0, 1.0) - markerclr.add_color_stop_rgb(1.0, 1.0, 1.0, 1.0) - - self.lightclr = lightclr - self.darkclr = darkclr - self.markerclr = markerclr - - def on_expose(self, widget, event): - context = self.window.cairo_create() - context.rectangle(event.area.x, event.area.y, - event.area.width, event.area.height) - context.clip() - self.draw(context) - return True - - #ecac1f - light orange - #ea861d - dark orange - - #813e82 - light purple - #562d5a - dark purple - - def hex_to_flt(self, r, g, b): - return float(r)/255.0, float(g)/255.0, float(b)/255.0 - - def draw(self, context): - rect = self.get_allocation() - - - #context.set_source_rgb(1.0, 0.5, 0.0) - lowx = rect.width*self.pos - hix = rect.width*self.pos - - if lowx < 0.0: - lowx = 0.0 - hix = self.WIDTH - elif hix > rect.width: - lowx = rect.width - self.WIDTH - hix = rect.width - - context.rectangle(0, 0, rect.width, rect.height) - context.set_source(self.darkclr) - context.fill() - - if lowx > 0.01: - context.rectangle(0, 0, lowx, rect.height) - context.set_source(self.lightclr) - context.fill() - - context.rectangle(0, 0, rect.width, rect.height) - context.set_source_rgb(0.3, 0.3, 0.3) - context.stroke() - - #context.rectangle(lowx, 0, self.WIDTH, rect.height) - #context.set_source(self.markerclr) - #context.fill() - - def set_position(self, pos): - if pos < 0.0: - pos = 0.0 - elif pos > 1.0: - pos = 1.0 - self.pos = pos - self.invalidate() - - def invalidate(self): - self.queue_draw() diff --git a/jamaui/ui.py b/jamaui/ui.py deleted file mode 100644 index ac1c6a8..0000000 --- a/jamaui/ui.py +++ /dev/null @@ -1,297 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -# Jamaendo jamendo.com API wrapper licensed under the New BSD License; -# see module for details. -# - -import os, sys -import gtk -import gobject -import util -import logging -from settings import settings - -import ossohelper - -gobject.threads_init() - -log = logging.getLogger(__name__) - -VERSION = '0.2' - -try: - import hildon -except: - if util.platform == 'maemo': - log.critical('Using GTK widgets, install "python2.5-hildon" ' - 'for this to work properly.') - else: - log.critical('This ui (probably) only works in maemo') - import helldon as hildon - -from dbus.mainloop.glib import DBusGMainLoop - -DBusGMainLoop(set_as_default=True) - -import jamaendo - -from postoffice import postoffice -from playerwindow import open_playerwindow -from search import SearchWindow -from featured import FeaturedWindow -from radios import RadiosWindow -from favorites import FavoritesWindow -from playlists import PlaylistsWindow -from listbox import ButtonListDialog - -class Jamaui(object): - def __init__(self): - self.app = None - self.menu = None - self.window = None - - def create_window(self): - log.debug("Creating main window...") - self.app = hildon.Program() - self.window = hildon.StackableWindow() - self.app.add_window(self.window) - - self.window.set_title("jamaendo") - - self.window.connect("destroy", self.destroy) - - self.CONFDIR = os.path.expanduser('~/MyDocs/.jamaendo') - jamaendo.set_cache_dir(self.CONFDIR) - settings.set_filename(os.path.join(self.CONFDIR, 'ui_settings')) - settings.load() - - postoffice.connect('request-album-cover', self, self.on_request_cover) - postoffice.connect('request-images', self, self.on_request_images) - log.debug("Created main window.") - - def create_menu(self): - self.menu = hildon.AppMenu() - - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Open player") - player.connect("clicked", self.on_player) - self.menu.append(player) - - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Favorites") - player.connect("clicked", self.on_favorites) - self.menu.append(player) - - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Playlists") - player.connect("clicked", self.on_playlists) - self.menu.append(player) - - player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - player.set_label("Settings") - player.connect("clicked", self.on_settings) - self.menu.append(player) - - menu_about = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) - menu_about.set_label("About") - menu_about.connect("clicked", self.show_about, self.window) - self.menu.append(menu_about) - gtk.about_dialog_set_url_hook(self.open_link, None) - - self.menu.show_all() - self.window.set_app_menu(self.menu) - - - def setup_widgets(self): - bgimg = util.find_resource('bg.png') - if bgimg: - background, mask = gtk.gdk.pixbuf_new_from_file(bgimg).render_pixmap_and_mask() - self.window.realize() - self.window.window.set_back_pixmap(background, False) - - bbox = gtk.HButtonBox() - alignment = gtk.Alignment(xalign=0.2, yalign=0.4, xscale=1.0) - alignment.add(bbox) - bbox.set_property('layout-style', gtk.BUTTONBOX_SPREAD) - self.bbox = bbox - self.window.add(alignment) - - self.add_mainscreen_button("Featured", "Most listened to", self.on_featured) - self.add_mainscreen_button("Radios", "The best in free music", self.on_radios) - self.add_mainscreen_button("Search", "Search for artists/albums", self.on_search) - - self.window.show_all() - - def add_mainscreen_button(self, title, subtitle, callback): - btn = hildon.Button(gtk.HILDON_SIZE_THUMB_HEIGHT, - hildon.BUTTON_ARRANGEMENT_VERTICAL) - btn.set_text(title, subtitle) - btn.set_property('width-request', 225) - btn.connect('clicked', callback) - self.bbox.add(btn) - - def on_request_cover(self, albumid, size): - jamaendo.get_album_cover_async(self.got_album_cover, int(albumid), size) - - def on_request_images(self, urls): - jamaendo.get_images_async(self.got_images, urls) - - def got_album_cover(self, albumid, size, cover): - gtk.gdk.threads_enter() - postoffice.notify('album-cover', albumid, size, cover) - gtk.gdk.threads_leave() - - def got_images(self, images): - gtk.gdk.threads_enter() - postoffice.notify('images', images) - gtk.gdk.threads_leave() - - def destroy(self, widget): - postoffice.disconnect(['request-album-cover', 'request-images'], self) - settings.save() - from player import the_player - if the_player: - the_player.stop() - gtk.main_quit() - - def show_about(self, w, win): - dialog = gtk.AboutDialog() - dialog.set_program_name("jamaendo") - dialog.set_website("http://jamaendo.garage.maemo.org/") - dialog.set_website_label("http://jamaendo.garage.maemo.org/") - dialog.set_version(VERSION) - dialog.set_license("""Copyright (c) 2010, Kristoffer Gronlund -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Jamaendo nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -""") - dialog.set_authors(("Kristoffer Gronlund ", - "Based on Panucci, written by Thomas Perl ", - "Icons by Joseph Wain ")) - dialog.set_comments("""Jamaendo plays music from the music catalog of JAMENDO. - -JAMENDO is an online platform that distributes musical works under Creative Commons licenses.""") - gtk.about_dialog_set_email_hook(self.open_link, dialog) - gtk.about_dialog_set_url_hook(self.open_link, dialog) - dialog.connect( 'response', lambda dlg, response: dlg.destroy()) - for parent in dialog.vbox.get_children(): - for child in parent.get_children(): - if isinstance(child, gtk.Label): - child.set_selectable(False) - child.set_alignment(0.0, 0.5) - dialog.run() - dialog.destroy() - - def open_link(self, d, url, data): - import webbrowser - webbrowser.open_new(url) - - def on_featured(self, button): - dialog = ButtonListDialog('Featured', self.window) - def fn(btn, feature): - self.featuredwnd = FeaturedWindow(feature) - self.featuredwnd.show_all() - dialog.response(gtk.RESPONSE_OK) - for feature, _ in FeaturedWindow.features: - dialog.add_button(feature, fn, feature) - dialog.show_all() - dialog.run() - dialog.destroy() - - def on_radios(self, button): - self.radioswnd = RadiosWindow() - self.radioswnd.show_all() - - def on_search(self, button): - self.searchwnd = SearchWindow() - self.searchwnd.show_all() - - def on_playlists(self, button): - self.playlistswnd = PlaylistsWindow() - self.playlistswnd.show_all() - - def on_settings(self, button): - dialog = gtk.Dialog() - dialog.set_title("Settings") - dialog.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK ) - vbox = dialog.vbox - hboxinner = gtk.HBox() - hboxinner.pack_start(gtk.Label("Username:"), False, False, 0) - entry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT) - entry.set_placeholder("jamendo.com username") - if settings.user: - entry.set_text(settings.user) - hboxinner.pack_start(entry, True, True, 0) - vbox.pack_start(hboxinner, True, True, 0) - dialog.show_all() - result = dialog.run() - val = entry.get_text() - dialog.destroy() - if val and result == gtk.RESPONSE_OK: - settings.user = val - settings.save() - - - def on_favorites(self, button): - self.favoriteswnd = FavoritesWindow() - self.favoriteswnd.show_all() - - def on_player(self, button): - open_playerwindow() - - def run(self): - ossohelper.application_init('org.jamaendo', '0.1') - self.create_window() - self.create_menu() - self.setup_widgets() - self.window.show_all() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() - ossohelper.application_exit() - -if __name__=="__main__": - ui = Jamaui() - ui.run() - diff --git a/jamaui/util.py b/jamaui/util.py deleted file mode 100644 index 3c82f17..0000000 --- a/jamaui/util.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010 Kristoffer Gronlund -# -# Jamaendo is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Jamaendo is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY 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 Jamaendo. If not, see . -# -# Player code heavily based on http://thpinfo.com/2008/panucci/: -# A resuming media player for Podcasts and Audiobooks -# Copyright (c) 2008-05-26 Thomas Perl -# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) -# -import os -import simplejson - -def string_in_file( filepath, string ): - try: - f = open( filepath, 'r' ) - found = f.read().find( string ) != -1 - f.close() - except: - found = False - - return found - -def get_platform(): - if ( os.path.exists('/etc/osso_software_version') or - os.path.exists('/proc/component_version') or - string_in_file('/etc/issue', 'maemo') ): - return 'maemo' - else: - return 'linux' - -platform = get_platform() - -#def jsonprint(x): -# print simplejson.dumps(x, sort_keys=True, indent=4) - -def find_resource(name): - if os.path.isfile(os.path.join('data', name)): - return os.path.join('data', name) - elif os.path.isfile(os.path.join('/opt/jamaendo', name)): - return os.path.join('/opt/jamaendo', name) - elif os.path.isfile(os.path.join('/usr/share/jamaendo', name)): - return os.path.join('/usr/share/jamaendo', name) - else: - return None diff --git a/scripts/jamaendo b/scripts/jamaendo deleted file mode 100755 index debdf19..0000000 --- a/scripts/jamaendo +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env python2.5 - -# Dependencies: - -# python-simplejson -# python-lxml -# python-gst0.10 - - -# debugging hack - add . to path -import os, sys -local_module_dir = os.path.join(os.path.dirname(sys.argv[0]), '..') -if os.path.isdir(local_module_dir): - sys.path = [local_module_dir] + sys.path - -def main(): - from jamaui.ui import Jamaui - player = Jamaui() - - player.run() - -if __name__=="__main__": - main() diff --git a/scripts/player b/scripts/player deleted file mode 100755 index 802bd4d..0000000 --- a/scripts/player +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python - -# debugging hack - add . to path -import os, sys -local_module_dir = os.path.join(os.path.dirname(sys.argv[0]), '..') -if os.path.isdir(local_module_dir): - sys.path.append(local_module_dir) - -def main(): - #from jamaui.ui import JamaUI - #player = JamaUI() - from jamaui.console import Console - player = Console() - - player.run() - -if __name__=="__main__": - main() diff --git a/setup.py b/setup.py deleted file mode 100644 index 0782d26..0000000 --- a/setup.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of Jamaendo. -# Copyright (c) 2010, Kristoffer Gronlund -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of Jamaendo nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -from distutils.core import setup -from glob import glob - -data_files = [ - ('/opt/jamaendo', glob('data/icon_*.png') + ['data/bg.png', 'data/album.png']), - ('share/applications/hildon', ['data/jamaendo.desktop']), - ('share/icons/hicolor/26x26/apps', ['data/26x26/jamaendo.png']), - ('share/icons/hicolor/40x40/apps', ['data/40x40/jamaendo.png']), - ('share/icons/hicolor/scalable/apps', ['data/64x64/jamaendo.png']), -] - -# search for translations and repare to install -#translation_files = [] -#for mofile in glob('data/locale/*/LC_MESSAGES/jamaendo.mo'): -# modir = os.path.dirname(mofile).replace('data', 'share') -# translation_files.append((modir, [mofile])) - -setup( - name = "jamaendo", - version = '0.2', - author = "Kristoffer Gronlund", - author_email = "kristoffer.gronlund@purplescout.se", - url = "http://jamaendo.garage.maemo.org/", - packages = ['jamaendo', 'jamaui'], - scripts = ['scripts/jamaendo'], - data_files = data_files# + translation_files, - ) - diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/testicle b/tests/testicle deleted file mode 100755 index 2a62fa5..0000000 --- a/tests/testicle +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python -# runs tons of test queries against the API, -# sleeping between each and printing the result - -# debugging hack - add . to path -import os, sys -local_module_dir = os.path.join(os.path.dirname(sys.argv[0]), '..') -if os.path.isdir(local_module_dir): - sys.path.append(os.path.abspath(local_module_dir)) - -import time - -import jamaendo as api2 - -class Tests(object): - def XXXtestSearchArtists(self): - result = api2.search_artists('porn') - print "Result:", result - print "Cache:", api2._artists - - def XXXtestSearchAlbums(self): - result = api2.search_albums('porn') - print "Result:", result - print "Cache:", api2._albums - - def XXXtestSearchTracks(self): - result = api2.search_tracks('porn') - print "Result:", result - print "Cache:", api2._tracks - - def XXXtestAlbumsOfTheWeek(self): - result = api2.albums_of_the_week() - print "Result:", result - print "Cache:", api2._albums - - def XXXtestNewReleases(self): - result = api2.new_releases() - print "Result:", result - print "Cache:", api2._tracks - - def XXXtestTracksOfTheWeek(self): - result = api2.tracks_of_the_week() - print "Result:", result - print "Cache:", api2._tracks - - def XXXtestStarredRadios(self): - result = api2.starred_radios() - print "Result:", result - - def XXXtestGetRadio283(self): - result = api2.get_radio(283) - print "Result:", result - - def testGetRadioTracks283(self): - result = api2.get_radio_tracks(283) - print "Result:", result - - def XXXtestGetArtist91(self): - result = api2.get_artist(91) - print "Result:", result - - def XXXtestGetAlbum27865(self): - result = api2.get_album(27865) - print "Result:", result - - def XXXtestGetTrack353341(self): - result = api2.get_track(353341) - print "Result:", result - - def XXXtestGetTracks27865(self): - result = api2.get_tracks(27865) - print "Result:", result - - def XXXtestGetAlbums91(self): - result = api2.get_albums(91) - print "Result:", result - - def XXXtestFavoriteAlbumsKegie(self): - result = api2.favorite_albums('kegie') - print "Result:", result - - def XXXtestGetAlbumCover27865(self): - result = api2.get_album_cover(27865) - print "Result:", result - - def XXXtestGetAlbumCoverAsync27865(self): - self.got_cover = False - def gotit(cover): - print "Got:", cover - self.got_cover = True - api2.get_album_cover_async(gotit, 27865) - while not self.got_cover: - print "Waiting for cover..." - time.sleep(4) - -import traceback - -def main(): - for name in Tests.__dict__.keys(): - if name.startswith('test'): - print "Running %s" % (name) - try: - t = Tests() - getattr(t, name)() - except Exception, e: - traceback.print_exc() - print "Waiting..." - time.sleep(10) - -if __name__=="__main__": - main() diff --git a/welcome b/welcome deleted file mode 100644 index b6cbc2d..0000000 --- a/welcome +++ /dev/null @@ -1 +0,0 @@ -welcome \ No newline at end of file -- 1.7.9.5