pax_global_header00006660000000000000000000000064116676056060014527gustar00rootroot0000000000000052 comment=83413c7d1477b62f695c307eedc39942159059d8 bangarang-bangarang/000077500000000000000000000000001166760560600147315ustar00rootroot00000000000000bangarang-bangarang/CMakeLists.txt000066400000000000000000000021011166760560600174630ustar00rootroot00000000000000project(Bangarang) set(WITHTRANSLATIONS YES) find_package(KDE4 4.5.0 REQUIRED) find_package(Nepomuk REQUIRED) include(KDE4Defaults) add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS} "-DDISABLE_NEPOMUK_LEGACY=1") find_package(Taglib REQUIRED) include_directories( ${KDE4_INCLUDES} ${KROSS_INCLUDES} ${NEPOMUK_INCLUDE_DIR} ${QT_QTSCRIPT_INCLUDES} ${SOPRANO_INCLUDE_DIR} ${TAGLIB_INCLUDES} ) add_subdirectory(icons) add_subdirectory(src) if (WITHTRANSLATIONS) find_package(Msgfmt REQUIRED) find_package(Gettext REQUIRED) add_subdirectory(po) endif( WITHTRANSLATIONS) ########### install files ############### install(FILES data/bangarang.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) install(FILES data/bangarang_play_dvd.desktop data/bangarang_play_cd.desktop DESTINATION ${DATA_INSTALL_DIR}/solid/actions) #install(FILES data/genrerc DESTINATION ${DATA_INSTALL_DIR}/bangarang) #install(FILES data/thumbnails/Rock.png DESTINATION ${DATA_INSTALL_DIR}/bangarang/thumbnails/genres) #install(FILES bangarangrc DESTINATION ${CONFIG_INSTALL_DIR}) bangarang-bangarang/COPYING000066400000000000000000001045131166760560600157700ustar00rootroot00000000000000 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 . bangarang-bangarang/COPYING.DOC000066400000000000000000000476631166760560600164100ustar00rootroot00000000000000 GNU Free Documentation License Version 1.2, November 2002 Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. bangarang-bangarang/HACKING000066400000000000000000000001511166760560600157150ustar00rootroot00000000000000See the project page at http://gitorious.org/bangarang for information that might be helpful for hacking.bangarang-bangarang/README000066400000000000000000000007561166760560600156210ustar00rootroot00000000000000Bangarang is a KDE media player. The project, scratches my itch: To have a media – audio and video – player that gets the basics right with a not-overwhelming interface. Why do it? Simple. Because I want to. Nothing more complicated than that. As much as possible, the pillars of KDE and existing KDE infrastructures are/will be used, and constructive feedback provided to the respective projects. Project Page: http://gitorious.org/bangarang Thanks! Andrew Lake jamboarder@gmail.com bangarang-bangarang/TESTING000066400000000000000000000036341166760560600157770ustar00rootroot00000000000000Test Cases ---------- NOTE: These test cases are restricted to implemented functions. Functions that are not yet implemented belong on the target feature list. Test cases for functions are added/updated as they are implemented/fixed. All test cases should be run prior to any release. 1 Media Playback 1.1 Playback control 1.1.1 Play media 1.1.2 Pause playback 1.1.3 Stop playback 1.1.4 Play-Next item in playlist 1.1.5 Play-Previous item in playlist 1.1.6 Play non-sequential item in playlist 1.1.7 Seek to position 1.1.8 Fullscreen 1.2 Hide Controls 1.3 Video Settings 1.4 Remaining time/Elapsed time 1.5 Mute/Volume control 2 Media Browsing 2.1 Select and play single and multiple media items 2.1.1 Song 2.1.2 Audio Stream 2.1.3 Audio Clip 2.1.4 Movie 2.1.5 TV Show 2.1.6 Video Clip 2.1.7 CD 2.1.8 DVD 2.2 Select and play single and multiple categories 2.2.1 Artist 2.2.2 Album 2.2.3 Genre 2.2.4 Series 2.2.5 Season 2.3 Browse categories 2.3.1 Artist 2.3.2 Album 2.3.3 Genre 2.3.4 Series 2.3.5 Season 2.4 Browse highest rated 2.5 Browse frequently played 2.6 Browse recently played 3 Playlist 3.1 Add items 3.2 Remove items 3.3 Rearrange items 3.4 Clear playlist 3.5 Repeat mode 3.6 Shuffle mode 3.7 Drag and drop from Dolphin 4 Saved media lists 4.1 Save selected items 4.2 Save view 4.3 Save current playlist 4.4 Remove saved list 4.5 Add items to saved list 4.6 Remove items from saved list 4.7 Rename saved list 5 Media metadata/library 5.1 Update media item metadata for each media type 5.2 Remove media item metadata for each media type 5.3 Open several music files and verify automatic update of nepomuk metadata 6 Nepomuk disabled 6.1 Verify media playback functions (section 1) 6.2 Verify saved list functions (section 4 - except 4.2) 7 Startup Vectors 7.1 Open media file in Dolphin 7.2 Open media file via command line 7.3 Open CD from Device Notifier 7.4 Open DVD from Device Notifier 7.5 Open Shoutcast url from browser bangarang-bangarang/data/000077500000000000000000000000001166760560600156425ustar00rootroot00000000000000bangarang-bangarang/data/bangarang.desktop000066400000000000000000000015101166760560600211520ustar00rootroot00000000000000[Desktop Entry] Type=Application Version=1.0 Name=Bangarang GenericName=Media Player GenericName[nl]=Mediaspeler GenericName[de]=Medienwiedergabe GenericName[fr]=Lecteur Multimédia GenericName[zh_CN]=媒体播放器 GenericName[lt]=Media grotuvas Icon=bangarang X-DocPath=bangarang/index.html TryExec=bangarang Exec=bangarang %U MimeType=video/ogg;video/x-theora+ogg;video/x-ogm+ogg;video/x-ms-wmv;video/x-ms-asf;video/x-matroska;video/mpeg;video/avi;video/quicktime;video/vnd.rn-realvideo;video/x-flic;video/mp4;video/divx;video/x-msvideo;video/x-wmv;video/x-flv;video/flv;audio/mpeg;audio/mp4;audio/ogg;audio/vorbis;audio/aac;audio/aiff;audio/basic;audio/flac;audio/mp2;audio/mp3;audio/vnd.rn-realaudio;audio/wav;application/ogg;audio/x-flac;audio/x-musepack;audio/m3u;audio/x-mpegurl;audio/x-scpls; Categories=Qt;KDE;AudioVideo;Player; bangarang-bangarang/data/bangarang.svg000066400000000000000000011216051166760560600203110ustar00rootroot00000000000000 image/svg+xml bangarang-bangarang/data/bangarang_play_cd.desktop000066400000000000000000000007241166760560600226530ustar00rootroot00000000000000[Desktop Entry] Name=Play CD with Bangarang Actions=open; Type=Service X-KDE-Action-Custom=true X-KDE-Solid-Predicate=[ OpticalDisc.availableContent == 'Audio' AND StorageVolume.ignored == false ] [Desktop Action open] Exec=bangarang --play-cd %u Icon=bangarang Name=Play CD with Bangarang Name[nl]=CD afspelen met Bangarang Name[de]=CD mit Bangarang wiedergeben Name[fr]=Lire le CD avec Bangarang Name[zh_CN]=使用 Bangarang 播放 CD Name[lt]=Groti CD su Bangarangbangarang-bangarang/data/bangarang_play_dvd.desktop000066400000000000000000000010311166760560600230320ustar00rootroot00000000000000[Desktop Entry] Name="Play DVD with Bangarang" Actions=open; Type=Service X-KDE-Action-Custom=true X-KDE-Solid-Predicate=[ OpticalDisc.availableContent == 'Data|VideoDvd' AND StorageVolume.ignored == false ] [Desktop Action open] Exec=bangarang --play-dvd %u Icon=bangarang Name=Play DVD with Bangarang Name[nl]=DVD afspelen met Bangarang Name[de]=DVD mit Bangarang wiedergeben Name[fr]=Lire le DVD avec Bangarang Name[zh_CN]=使用 Bangarang 播放 DVD Name[lt]=Groti DVD su Bangarang X-Ubuntu-Gettext-Domain=desktop_kdebase-workspace bangarang-bangarang/doxyfile000066400000000000000000001735511166760560600165130ustar00rootroot00000000000000# Doxyfile 1.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Bangarang # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 2.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ./doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = YES # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = YES # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = YES # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = YES # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = YES # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) # there is already a search function so this one should typically # be disabled. SEARCHENGINE = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = *.h # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES bangarang-bangarang/icons/000077500000000000000000000000001166760560600160445ustar00rootroot00000000000000bangarang-bangarang/icons/CMakeLists.txt000066400000000000000000000003521166760560600206040ustar00rootroot00000000000000PROJECT(Bangarang) set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ) FIND_PACKAGE(KDE4 REQUIRED) INCLUDE(KDE4Defaults) ADD_DEFINITIONS( ${QT_DEFINITIONS} ${KDE4_DEFINITIONS} ) kde4_install_icons( ${ICON_INSTALL_DIR} ) bangarang-bangarang/icons/bangarang-svgexport.png000066400000000000000000000603261166760560600225400ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYs l l5tEXtSoftwarewww.inkscape.org< IDATx{mUOuRjX$@p?@%`R&qpRI\qLRbb8?ġp($(-[5oHVK~?Ɯks﹭F]Y{js1o?go}D=Uk_ˬ\|~{|Fld U~1 9G{]Z׵nלsԺsKjƍ/ò,m3'/]CP߼֚ڼ-o?>t=Zk@r1FS ZKִYb%7PN;r)F9йhYÚK)C7|%PjGs{J)(FR>LgܠWC.z9=KNI~.:>sУ}[Vkk4M@:{jgL32Wm圻kw^^Ρ9P(E~Ş@U'QB)r9P(yE4\.~P @.RĠMkZiʠr(6h:F>GT[jq9eAZSI)CNeYyc~sbFgbƷM:˿˿Uk/Qjfn7J'-F5M3  B.r2(ה ((0 PdsOj,jsmFP0c гO?zyc=v|A 3|wm'w@ ?W|wim6.NFvk''ZɉVVm>5))JQr3)T]ƒ3JiDhY9QJ(s4$hY9x&Rno>O|//#9=~F S9^k={ywzIkRBNt-6 pJQG^]}31]__wWEܺhE.b,TscPhUPE X_>( FJ)ۚ 9gbXes|_?3 zbko 7]Nk݇e7 okusa#8T'(\ݺSW:Ʃ?G pf)VJS"a($D jdjPePJŧ>籧!4+2OiW| /G5ŖU9o851q+LZiyMŶqn.+VJ1@#x:G\~GW/7nx CN/)#bbX$kz /RaJJ-d4ϼџ'?~?pN+ /kWl~//x7ߟ_[UNctuoo3{i(-qTn 账R_'?",\)l%DZLxo!K)K)U4zU Æ vE)Eq %:b1-$|J#ܴ;m__7.H_0r)ʉ8Hub, )qGNNt!ONVƢojӫ9 [emwPE{i>~ǰpbF \jC+MJ5t9R܌BzM5 6|_1=pů/|ue.)*ה+DVmcˉ%(y]*Lc Yei;مB"/ƥZ1Bk-|䒉%Z5T2ȻayJ!^bXS5 7JZIhbIPĜ)׋9cINOL(%|_|4jvWs?/ߍ*.#_BLJ%W`%_l,$_vK. 9lW(@B,#? #?JaEJ"dO,h@%s e#/DFiEV>򫱄 HԲ擗jFEfM+!jq%X"VR )yOpZg "|@QFK?7}Y=7Qu/yxS_3gV)z=1eҀ*`)Lɞ{Jm>fR6^lxRJ%mB3\S/G`TcWꆫ$(Hx9^1GbNϒJ+% 5C;~~wum! g~y/I?g^=?לvuǍPNUלi֫披@ uQ- ha#mFf2qiH$b-}IT;Pϡݎ\rIQJ&$1Rc %9\"B Uw~n܍7Nn6xSz_y_|~;Eld[jן*;'4ĩkcQ5 %iК ( 2崭e%+1Zr S4mb-ItхŠhMUҨ"n=q4Ƒd E|Du1'|Dpb&"8l}S(`bksJiT)!j|mO“,'!f p//ϝUv#!GK:+J O5SJrcI45X_#mRQb{Io>ȗ=Y9ˎX"k[%{`kM |($}\ H^J,qG/"kXbd j|g 9eą*,aa UJI933!zqڈt \Gx)'43.Iz8xŋ6dRoAR_kOXW5' ٫^Fi-F" 8VV#QEr'yF ~[j9%M !VzW*5#w=ş'LKp5G3_޽.B 3c-&^ţzs[ b≫iV3JB9[R)ۗH*{F%#'֘I)E"iTebIZQ0 lp\"uP泗Pd-ȚW80b` V[7s` gm aF#1F0Rb"rRvK.ɾkOȱf]*gBsYR3Fgc>YaT"!HZ@Qu!%"0bXs->z8љm4K)EYS >zB]q~_;_Fp)t[ܿJ6%WQ%Zin)T̎LNnH t1><$rmp<|50TN"蓛(; IRD#*j%tQhHZA.K ck]K5*H)OO.| k,>ִMae3y 5qw [+?X9@j׾}rU޴9z`I+ESخke+DJ d^{מ?/s_sWK?%>7 '_0(CHS5C,!pZMST]BMudR*KS$r}TNadq)f Gl^GV6d"kp]=Lk 8,lJ}ch9GV"ČuBK[mDq:urQ'^MIr`B=q(3#1-CM SNbQRp"Y{C=40AU*:9c'vVJVxo hӈYJ)tҜ(S{kx_w≪Z)tf ! Ԟ9Ic1VJDbޤY$B\4~)\+̙Ȕ'zo%2t8J.]ǒV&?BdpbkX9,Br E[/6#%SRQWGxm<#ɩ-N*G=T Um4D"lR[O _Wv>ϣ&Tf"}o:ȉXJJ R2.\G)/TO GPARTw(j[VTU4^0L|Dcj9TzR\MUlwYK\}OߤPs_haDR?3BgﱛX!L)ټT&J_}Ͼ8_>%}nt򄍎e]tg^fùg37b`wXȈaqqcSQ&uRT;D@0@JVmBʕkizݕ6 Zb\7/rm5^mI*Uj^VIWJ!FO:R(+Bܠ kbU ]nk Sb _y7};/`CZXY\Wu&!z׳ 2YGonØ۩Gy[ vOU P!J>&}iMH5IL;5!ּxVִd-D,%-lDOxoLFw ^YD6ILaafU3Eg3djYLꂨ=%,@NꕹLdK)΁LLi~ׯ§Ĕ&v[ \ |" =9!Gvr^nL:s1_K:V ]R̺5,L(akbf:4!5u>61Rj1Gִnrj X"*ɳBNO 9ZfP2h!Y,kcF,d]֡beeash/+=Ye8m"O:C:KZ͞C<KZ15<ܳ1L~'9Y0Ǚ)(%\)?m 9r>F?tNZ-_/D&fL~b Ҙ&,"*RsS*vPEڿr_$TZtXDbȮRl3B 8#1S`u,(eIU6eR2aU'QDkb;ՉW%/"k,!G4cD;6RßW _s~ W tc]&?au=r @ozb9}')+/ŗg qN?%kh.}Չֹ^jd C7 @.D!+1-ԮsI&C@)5εT#a-l\ZQ j!8Vp#'B UH%11EJշ% :O$1j~vp2 9r1_RŽua|ڰ圜 Z3-9^ˁ|Ҋ1-59SB|ֺKfPڠdF-\~n?=r)4@ZmA{_ui!zr.8:NMZڷX1ڴNpěije%U^k.k(EZb MO*rn}m;[n;'z~!zu= ŴN1Й]P8)'ndp)'ˁ\;w:P=-LhҞ?TXN;M8HGpAYmBo$S0-K,NɓJjS%^2V9)HMޡ7=oF12Qyi%ӎ%|uO^)o*~F+žae qr֟fZ'|tc0c7v䜹X;7gY.88y @anfבIQR86 9R%)YdX piŪ6%KZ-ʥKAE{i;,AQSVNtV0C8V bẀӎX:ۚQV| Dn$q0-M9 :bvu,'z үap :EȰ4pdGЦVnӯcѲ̼B |6@Q:m4qZd-DIu%18ICMe֭_ڈ2Ʊ !ꉖAW(CoHobs3=H0B,~AdrY=װJa8 bˁ azBL˄g+~˵5Lgu gXc?5hPX.358mƝ<;U]Qb@m.mZ t[m!U j{.cT2>JVgLk\!Cz̆Nޢ$Kbrk;t/H茸=Uի` 9W_mg;tфQĝtχSESt^\}e&;tGL%.P j F3Q0@:vvG=/*, ޒlOzRJ^<謓?/?4ŭk%)Wzq6I&HZ; JwĴ5926$Cb#qA+`^V:.0꫐b@eEE)rFԀUVƷu]4JmEĕ*.XJ. ZRSюtXэ=K\櫳߇૜gt#d.փRd=1pXbg`xqs2a vm-̵UP}C:b,% ȶIv4#6媫M8,nC%CG'FVl5Q+WH2\LN"M=,| cjWvיgRXĔIxpF'g~e28lI+ukƉw!{ckOoCJ9{) Ha6}U_b,:yqtGJ5TuU1%@Aկr+ю % n`åߜ^0unЌUF\}-,~(Y'۞ \bnd7H)q>73t!FΗs.$ A$F:.5VutOI1=Fn3\$CVg ExA bHG2u9zkQ*to H:b ǿ3mr\=~tO(* эtFruR;:S!~Bkõ:0V[UXBo;vg(X.12v~Q/kO ~˔oln89ա `sG9FdB͋k";w 8J)QEab@!TQr"tJҽ8,tsdU/P$aŚK+4A2U nFRJěwq(ŵtO*F0PX/_ Hlċxodiq]2u#>L RFvmCڔLc, ɸo 'M㔤^D?*Jx%ӵĭK('ѻ:]1՛/xNNt LtJCQ1@Xqlأ KuvdNj} ጗/sO3f7^^`N kxMsc)K%wvJNHJl%\mB:Q;Vٕ3NNVh4S P<>xs2 EwVܼ.z;1U4۞ь3j 1ֈhC41XuZ ccyI&If1Ĵ uX\,-ӏ?8ZiÞ]CG-F#nz5'n]i~iz)=mF'#ct 5u!Z8Vۼ?mO !{S&\X*#WrUzj!0 P1,벥{FqqE 9K0a=@ANl2В):cjy#<Ǹ1(} b 6{\ؔ,Ofkt)EYAXf,Mzi*BZHaE4B!1b'nJcXI)]MB%/xK2{pTJmANHÆ;>G<~(kepc??a&nOn\ONo=}zE oZ5jY 5܎R5]'\K;RάQFN1En79s61_UE8϶aZ`_XdF]c176٤72nn z@Tat;=?g a|x߻5ˁ}T@:ڰc7Z$5.c[j=v ΈC2kiO(!y` 0 tY'1=݇5vKbE+≛)+5kti%-vbɳꩢ!P/=e0I]a"{u2+9,K2=gS~?GAw׸LDr">^]I.c?69&hiQrʷM)sY ;6 ӝ̷dfZ{xV̺-mUݫ0VEk ^޳n\g$eocgDUaDG`0}_mOoQeERĔ&F7ʽ`D nR8  De=nϮa0M{jEPNAa Kc?nk:12(=ı xZї>(A#@-/#R%H%nE#gET;%Z{i< Egϟ f5pc䒮\UɦR7$iHi'Zp e3Ê՛"*Z-Vys%l1u#ebr!Bl7}vD0()d|bW?Kwc:?c6=ag1;Y[0 pyn.z%\S8-_vZPV9YV(bv<]-΍,ZOQ]WOos6pŎ~eZ'1~؏(/-b+k- Qt-)m@E+v +/ojMaSa%VqR ke|;"(\9QNn0FXVUs1*O nL7xꥧxOsxCEVrdq{ VN_~=U"ܼJ91"Pݹx9l83_h4kZkVB*0!XmFp-?V:m!MFgشx}-ЫQH!q1H13DW2ݎNuxy[_sgF3̲.X8pg䒷]/&j`wwZaj -z[1q$NBoe =(͕/S-U/v6~H|+\|^? {?svLP)-Cb^ZtՇA8I$kATIo!K`E-<`ֹS:ÎJ+-TYѥ(E Wc?{@)g|j?)>rJI9m^`FyP||?S~ xxaqM\ 8lȶF_ V֊omZ!uڗ /Kb;;`JpX\,?*>WiTuIeP_._4uNKFjQyDlKg_W/e8\7R  pNqs B| bV1IRu _ks S`"On!r$kZvu 1Е011W_O> Hf}m?}_|YCAt7{^wL,]P++?˹TY_{7y{ݏci>ya\U7Z" s[Aygq2ykdէ}_@Mf>o3O|ro{ף{^}}^:G:|k.OO;6x}#k-r%wgL^8> g?e6:m3<,Wt*,pZ˦Z)v}X*l <104ٵ_,#OpAGt#D*l#ڕɘ0TXJ2 ۻmI\O?dYq@˵015vg;:g(&U rl&?KO]OHAJ{$^0@X"-`ek,c7\6f4=j,QfkȚrBi6@ RDٌQ})0@љEAq#鼝T+r~ 2*pZKgq?d\ ~臎h"sQRqx<;88}s ?f_۽}/-DݷR c7t Ů;a d}5~w5ze\Gn^YdXҒ-ysb9_6cCi]]߁%/$:Gu6$XB0#sy'beIQ(-!k2zq$!N<6$0;=S苜3vÈƗbG!RkK i 8{U|]j7}Qf]o}c4=tP~!njխQ#oLaĺ RDjYSv\jgEw)qV)L[=%i~ءKWI : XPm<'Ҝy7?N Q؍{ҨY*ot%vKOlv; mkq#5 ȫ?&܉ p1@kڙݱ=7:LU锽 =퉱jܔC]Qެa *eckU{&]/J]ǵ>EBFoV\/'nL־)$;ܑ7? 4QX wc`:9|to73 (.}?ً^e3:Ƿ?o|ݝ}i@? n묿.*)# %'{=sUDkdH=hڔOj r,HJh;WI HYzr)Ϻ::Vz˘]?RVtqI&?U0cbWk}laW6PJu TumgE:F5W&pD[׵.c\}_Rfta_.2B-L P1Yj+Mxj PAUe V)6[ޙjv]y3|߽el'Ng$iFJ-DiEHO~CHxC&uC'8"!4N@ v!!ʮΰ;VUNΑ>uwZ{»<#7KQD`IFNJ8xmV?s}® :9J2xmJ!p]IE!@Z)r#g."A5Wfs2qlxIAJ]9. ;_vik[rMhNB,y#n]|P&VIX0_S@W~, IDAT 4/) 14Ԛ\x+{%/pcHeAkiUy  \KLQPeR^xqB[#wSٺP^8SQUk-IqhK20NBڴV&~mǘ%Ot Y``)|Z!5&yEW;oK$uK9CRW9{/(VC0 ĸ:ErEne1o,uӵ#D\ki $piΌy hzQ^t-&Ft]u)O=i403c;Jh6mk:OLp^~s:wM'bԢP&(Z\.^-XAw64Y(- [isOY$4.l]hI y]:G2O9E鱭aR31o7oԌkvr}L?(@8Q:ˈrFJS!,[F8RZy#~.8/xou7ԛB'_M۫J9b؞g?K5$w:蛞wJ 4$KsmJUMv)iGGG4hkʈSm[5\k;Ll g_YMa?CQ$u }/>>{UWWI-fi,/l禜>!qn,D::s儰h @mHayӥ#~o| }MrZq馎|K]qgY{,YʥnQ 9$d2&'ݡ255xNP2GPIh1Jn;SQk\μogdA}8!ަϠr|Oϧŋe`wKܭ>sb?H31X5 Ndz[ѯ|ϿX<BW}Pe.A0n=n|~T~_wKnTv+c[XV L.=sqfX+-vt)3/gi>"-V(J--!aFLQw"̉k\7).7'τePiYcq,1V%P|#s7&׷}߹q! Z/%ךggaaqq}|n/}ޝ,| !l8)ei FsHc 41EB (RsplsA.?\9IRJ-EN+H8fA!o~d 2bWUDND-Eqb]6*;.N1I%YFt[ɘ:qJѫtQzj-m9Lr?D:6gX4akф4RYC߶h SHtA4CwS1>~ l3 Oj[%O@ftMCL3xGy,üc {縰bb7Dx.l(9̦87d"U2mӷ-1{1Y8`f@HhS@%ZΒiDkhY#qLCگ"r;I~,)G881$-t-a(Mkk܏/O_Xk6ReT472锘]ҷ)uMkZB9NP ݆y0OZse?+ c֜'aqTt8aoض2Dh}CL$;G3ôGikdإ#0EJf4㬜BcG| 2qe \v.6k@Wdc@gڦiq_p=۾90`foFwLq~ :O im<#WID6]Gv?<%faBfv2i+O80 X8708Q1(nCVcv:^%86teN)JQ;/hŶyæZᔳ沓Mb ,)2s{5˔fV!%S g:F<sH2PXEԷX@ jOyxm74kq=)/\NB#@4MḰqGVmF4 #a`71Fsmưz8e#o87@d7d7/?2D[39@)xW޸k9P}lT%[ciK%hq{)-dPZr<;l{(E ]a6UevsISiM7FOq6)`=:t޼Ueɯ1t)*98&}'oӻήsav!{ D {1HKPDѥEiE*eU& '% "GkxNV?Lm̈K3.[t}bM9P"ݷ'~+~Es-\\_")kQ5Lun,ZcSδYO$}&ӀVJ$ӊXj}+jøg w>q'Ca䔊C.W}ⓘ}|3q>=NPs7=Huba/O:u]*`U$ d(iz-EhhZsP0jc{XsLB8Bk$ʩaF!(sX1rrԪ2 qӉÉڲ( ǖZB1F ':J4^F{jҘ?;0d_\H|L10/P=Oy}鿏/9UBXgdf=Z#j2N&nơD㷎$f7b[uĔGlcg-}סVLBش= |#o蚖(U*zvj%ob{V]1ZƼk }#AMgTf[1$ҹR Rɫ\QAqUq6ESգ"/bLW/4\YK/6^.O|zQ|409󩻃9m U:IXt6z+8^: FFVi4QG XCnb QB-G;yw=YpRh&IB(WY:I:e+^ӑŐʪ^ûb XJܓP/bt̯ڀZZҕLJ׀'V}@7c/dx^ 31 qRLi@Y6 $nn -nIM 73Ȱb{F4fۡLiO&ҶzJږ'"U53۾;iRX"mi9Nxov=JnL͗g&"}#LD {߶$.^?W@b_zP|S|yxV u7"6Ϛw^xKi-J3 8zJ! 2cy0ĸ j Zb dͭ[3$ոH 2EazF0ZZJWoW3"2yiSJ +`?qApsRpW7c() )EY''UƗ}#˞-+d3ƿ#N89h ^.0o]D̶eD5R免YcTڞK~ޓs!qƊa>heTQũt^yO5$D=^"+V4xCgQEHuEi^2 J8,ʀ(ҌWi_$|1 ~2o 5黡\ LqaG ܤ{nߥRwhmQ"]"/qBڕEFrx'*+'8F > Ӹ8R'La>a0K`uFgQAa,dW Kctdf mOw9*yܻF+G99'8tsq[/ bV.t76ɚ^9aLVW,((2be[LAB(El7j0IϞR"Xk3]=6 aXd ]~qL+ݺ{)'bL94^I)cx݃xu9_E_Db~{~:,N b$TG8B~\E"F8NSm#VRJqΟ*%FVᧈqsqj5˷Wd|xPl "`ڄvHNv?npWYf0 ='8k+Wp͖Pa54Hdѡ~`KYu7C:B0q_q?Xg#ԭ~^q~ #zܫ^7B/IDATvz]Gu{z,F:"ʽF[N;AIENDB`bangarang-bangarang/icons/hi128-app-bangarang-tmdb.png000066400000000000000000002005651166760560600230350ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME- s(~ IDATx@L - IDATdddddddddddd# eeedddddd&-(. eeegggddd/Z8 hhhBBB2.M+ gggddd  %hIlllddd RE:pppddd9BO#oooddd 4\Z qqqOOOddd!jV䩍TTTdddJr<www___ddd hk!vvv IDATddd j9BBBeee W A%%%P@PHhhhSG] bjjj?     :vnkkkH ((( % jf<%%%!  5# sNNN6 LLL&, 9+oooj000!!!8Q-XP׋ (((111OatHHHWf 엶 "EEEcBn $ &-{wEEE@)DDD1]铪0Q!? IDAT8!󴺺 & ( Ų ' >   ...   '  VVV '     )7 IDAT?111TTT.  ' *1.555%$,A"""Jbbb```"p/// @bbbThAo>>>dddbbbA""" 8'. eee333aaa;...+<7 ###"""fffddd J"***841+++&&&ggg444eee!nͩ___Xttthhhfff%HKD틩XXX]Ţ^^^iiifff37L7 νk'''888@ΡZZZiiihhh/0F1 넧UUUR Ɵggghhhiii*9?՘T\\\^eee  '! IDATbCCC)( QQQJΣaYYYy xS[[[cTJJJ eǍ::: `  KKK Z!  !AAAhL  " *߬===:B H & NNNCW' ʗ\%%%222// 5   O۽ MMM,% /    ᬬnnn['8{C IDAT777'''*%   dddk F☘F +++    VVV-+++Y F媪K $$$JJJ<O @ 山O>>>777AN;尰R ʦ 555222GC" ;;;"!!!9ϭtJ IDAT=OIDATNZCmIENDB`bangarang-bangarang/icons/hi128-app-bangarang.png000066400000000000000000000126031166760560600221030ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYsss9`tEXtSoftwarewww.inkscape.org<IDATx]kun\`zJytѿeHPжh܇[ɺcGЅmU03^΃JhTKzw_m:"W-3RGz>T|JeTmuix㷻ox'5PBStg&M 'N Hrt\m6tt4]9ߦk!uƕuzίSw@ROy+S S)= eFBi +(Yj}~:tLDڠMOI\5x:nb>  7]hSMX:.=KXũ;BJOϾߣ%D3@ wX͉rˡbDCCpF͜fD|ho)X-1nxkZ h\MPVL%"8q2͝Mg(j"M/E:K!Ei$9PҖlH0þh}1|XzM@l~ɽiU_09e m s.t[8F ̭7|0Ӹ.2gU TgB+qDņE`~TWv.88 : > U1 :~* 2H< aƯ3L׹~{A%ƒU_`ւ\0!ι9NuDmAB%&A\IB=bb!D:zt?du:|u)w/kհ,,W=4 ]+~3gmJמv3fr~l:Ҝo&DcrV!'$;_yZ#9eoltF/ًo۶cIavkZ.59ex{NiQ60{6t! sH%A ˖>`y (G#D^p Mx뾠NlX\8qF%@Ja:z%(A4+egl'$81&9;A1~e@Zn}TMa*J$<?h5c舚,/Dh ?܍jRBq'$|Ydܟ`4m}\-FW~Y^;?-:{ OYiYoYSJmѹy_ّle,D;K [pNjKCP aNB2M'Ƞ6X`6 ѹD$8#R46UMv3(?\Ʌ,pɘV?d=cbhU~#HH{XXœ>?H<X* &É\VXBSDeʯ-xqwF_n}@WW2ĪT(=B<#)b|qde6<û2{6f}u_F09& I=~IyJ6+T$ /V?^nW.HL)Pǐ^6LQyQBj g|JgKY\%cJff3)cw=LNU`e̿+W[}.{ 6. Qx9 񒇰kHrtڮ,͌l~I=azz"܁358}MU孫5Cx( 6 ` 䮫ݦW8R>DJndØUWݙ@!diʑxK(xd :U[* (!{wo aQǧd2p^9z6f׵#|0ޏ#,:+][Nysl˜_̮k)ṙc;ȷV݄!>|kft\)*H(Vu^Y?6x/+;i!.[6< 9+xOׂJg.+`Eyxń^sANfMg5g`̀lm^tƆq;iC: ѭOYFnNVcfP0 47#Jʕ׿ef_i0: U <Aơ- N-/*oT0,d4O+ ЅAu DALɅC,O~؀S۟/z=Ɉɱpx#>ꞤKO[պ&,@%@Xx!֟{+hryxk7uoe-9= 8A `pp_ۈ0ne K^n1 vTDD:ix?  ؅~ݿ[_`o xqqvKx }X4eT D(>># oult .;2>|پ Kۗ%8}sl~3p<4A:Ka !, wovoΔimKKŰo`+nrtAh#'@ 1}/TLν=C3d\/P'Nf" }X@6@KӶkե"B[-e%DW`A^ ݨ!h*mF.FÉO5@ F4CK 1uF`Rł`PI kN8 Db?`,m@b;~h O&Iq("FIћ g~N F p"&×Fa9iMZuoH|@:%0rHH S >J\-RX*S84HW>o{H;~@ G2O1V`_'\)RBX XP&J#`H|@:MHm `|`@K 1Lԏa@5RhTFP '" PJ ƶ@?m &~,ܕ_|h/3tBkCk0X LiZa|[#dw8%{SϧvşCdMXȐ@P<d]s糨< (a4!hbj{[!  !.F4 BYXTiQf1,jp)zC0>G`(ޜ]w `"kIh0co= rZidCa(yL7?1lLdHȐ0A'4^*œcA4@F"#w>->+ބcd# Nsx`IENDB`bangarang-bangarang/icons/hi16-app-bangarang-lastfm.png000066400000000000000000000022331166760560600233010ustar00rootroot00000000000000PNG  IHDRasRGBbKGD pHYs  tIME/ VIDAT8>6%+`pu[AF, # 8#5!؀u]N5!O?O?7"%-'?1VI(bl F:UH 4: EL~uԁzLT  +/@4즡JNՐ:D&ᷴ25E=<4ˆOSbh纹%} !}֖7!߸  Ϗ$UPA<   "#$&  3c3cnKƕIENDB`bangarang-bangarang/icons/hi16-app-bangarang-tvdb.png000066400000000000000000000011021166760560600227440ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs+IDAT8?hQ?նr͠F!H(åY%.NSZ\ RK@ r*Y)-Z$q4w LBCzOS0%p\ k`B>iٔWUtL& הǾ[OIŅsgg%7VT70-l:D0@6Ĵli#U7d?'fR5iVoHNWV7-[ޗ Zڝ.Xriri~Ut~P(s6 A2 #IENDB`bangarang-bangarang/icons/hi16-app-bangarang.png000066400000000000000000000013221166760560600220130ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs3K#tEXtSoftwarewww.inkscape.org<OIDAT8}KTa{uf6bJ1i#DdrתD$6-$\6!-Pm$T&)IbΧ}m89r~<׈{sBv(!2j]>{'Q|LDܰ ۢT<%Osc>N0:-8E7$oh]7hH portR(PH=,_X~QWGCo Jc)W!k Lϯ27tu K(v6m`Y{#7`]7a}x74=.2\!ci L )$L|(_UXԕBf,2?gx2孥 qHyXJkT\9ЅaOOyeZUW*,U9;XL/U_(Wp`H$F]0#S#H颵W} ?,yrɦWtjpeA/;jDb ѵKF'_vr;B~ 6S 3IENDB`bangarang-bangarang/icons/hi16-status-bangarang-loading-0.png000066400000000000000000000012331166760560600243270ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs tEXtSoftwarewww.inkscape.org<IDAT8?hQ]/w^\ BJš"tRCn( bTR:HqҡCT 6I.EsrIz}{/pL,@)|0_Xۀpt:K)u=\Iq?Bh$L^<%2:˲0 Bx9_5SoIENDB`bangarang-bangarang/icons/hi16-status-bangarang-loading-1.png000066400000000000000000000012301166760560600243250ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs tEXtSoftwarewww.inkscape.org<IDAT8AhQgCv{;oCbdD *^J9עs*!W%x4amcB nDoo?}p8TVyS@Dg^'u],r|iW ع~ 69I4gz C@[ru!" s]79>"&m.֖Ѷm۝::"fMMcb0*,˲r^y! HsM!DSJ9_,5aN9x2Zeַ^vݯ.?hG늮'p^۶9jD,C/)2d_wNכhP|0A>eYu#s0-R©grH)SnUsq!b2N@Ӵ"#h2?w`0T'UU] s_wTU׶mѯLXQUu4M3 (=rp]x0 &I\ޑ L9T6IENDB`bangarang-bangarang/icons/hi16-status-bangarang-loading-2.png000066400000000000000000000012261166760560600243330ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs tEXtSoftwarewww.inkscape.org<IDAT8kA_I:o23d$D1C^<"^z^[Јz )Hы"AA(`Ks4PiLŋn~)>}UW/Oyc9?~BRj@gqV}ɇE )P !/^Y\ ix/YIENDB`bangarang-bangarang/icons/hi16-status-bangarang-loading-3.png000066400000000000000000000012251166760560600243330ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs tEXtSoftwarewww.inkscape.org<IDAT8OhA_J82٘CRl DK)Vl@Dzh(T=@EZA-Clf7ov2zMw}? uw4Tpt:-2jVc#˔&4J49OG祔'mw)ιYPh~帟AX1\Zj*Qrh"1*o Kzg D4[Wgv ok%z~e!IENDB`bangarang-bangarang/icons/hi16-status-bangarang-loading-4.png000066400000000000000000000012351166760560600243350ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs tEXtSoftwarewww.inkscape.org<IDAT8kA_e?q 6t=`K W( =A=9֓QI饇 E#! fɊf$}a{\ "x~ ea5P7`No^xL) d7wZfɆR:8N~vL&uATBH1vD)MxOinqF,˒(6[_ ;-svxgW41IFv]+]Rڡ1pCm߲,+kYLzOo=jrȠ3ğ&=w+!Һ{n07x<Ԡٲgwys(E"47ҕtbضm3a޽bش(,6Btܞq1uL^?b% @5AvcItz'fZ0)|_w<89u4 'mV#jIENDB`bangarang-bangarang/icons/hi16-status-bangarang-loading-5.png000066400000000000000000000012401166760560600243320ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs tEXtSoftwarewww.inkscape.org<IDAT8SMhQ-KҚ%u[JAjO =A xhAz."RCDT( =(r襘r}ovz7Mcy3w?Wݽb,^i,=; lYyrB9{Kʚm-}ؙ ,ҥ'1?9Ms^B\ Smy޲ID1!"!"5ǩ !B뺹 询y)!ܝn!t{YP1Oj'nu<݈⊔ " ";WJ1b[A(]>o ifg ;:(aY,kGSQm9Ŭմ;x2HRUM҉DL&3Amy"҉Kсe!Dd.|` 3Ɔb)[ֵD%Xgr7:7*!bѲm)e3Եi)(9늢8/#WIENDB`bangarang-bangarang/icons/hi16-status-bangarang-loading-6.png000066400000000000000000000012421166760560600243350ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs tEXtSoftwarewww.inkscape.org<IDAT8SMhAM6?u j!<ăGŀUPdhzHDM**IJ R4֥!;qMtM0{}03G|Ѡa`5Ji_-wBD]W5N48~`H$o><!DtgDuJ]]8%Xƶ흾t]_AeE8P(Tђm)5u >eMlM\㜫mˍt"+#jOF.лQ0˯}ˏEV2pknx@8~!Y97SD7w)`[{3$I;b˿~|! ~fsŖz/OoTc%J鵷.{a뇇5p^%Hx @-|u,b[RײHV/أ/z;(0Rfn酆iQ4\U5˲",O,ض`F `Ky}>E}`ps>99D"'~z}M|z{554Ms!W?pRZY˫3v;p7lk4KWرsv3Rh6f1<_/SJ1R:!@YRJE8ץ8qR40ℐ;\*{UU;v?|(BEEH$}cc|> E *h4v7ommB*F&0 YYYakk F@E=N&lnn:5552==MCC'''!BI2`m@ WUUbr98NdU>bwwSR{vvF0$ ( Ζ{<XaYbgXuP(#@u\.yBp4Ka B1|͹UM+Hehh!B!FGG㘦Y*^H$2?\ xv#M>K)ښSvvvJ'}>rmmMJ)iv#c1Uoi0zGGGywJGGlooFE1$j^@n-d Hb #]oy5UN F(u'tX#~UZ޼nssvHB#߄\b_!G7ukLc⎊ۂerl[#~m̙Cģ0`JV:KV#&2!㈆q|K#n!u8F0[8TnS4%=F5uBS)]PzFS6oaUEEuq|y<Ǎ Tl< y.R̛8\Iy=%jhnp.f8$?j/ݘ6Q>~|>q6wNŻ}u' 39W:/a*241TĝA :u3.IB#cj܏L&, 뎢ui!5Aq4%0 PRCуYa+PI?j?; 6IENDB`bangarang-bangarang/icons/hi22-actions-bangarang-preview.png000066400000000000000000000016771166760560600243640ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsNtEXtSoftwarewww.inkscape.org<b]0sg'H9/cV_polenh,Ϛ HW[IENDB`bangarang-bangarang/icons/hi22-actions-bangarang-repeat.png000066400000000000000000000014031166760560600241460ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsNtEXtSoftwarewww.inkscape.org<IDAT8KAǿϸkkJZj[ʂT%:u)ѡADCЭ̂אMXGe7St؞ՅVay>|yn 2.هC! 1? ߹`O&ө%/قE=ͻ۝Jib ?+l&-T^9Cvfmav Ay 580ylÛWPZ]$2MD/+[pq<|RK(Dla<h-\ȊW7նx1ԁ/=R늅й9&&!Qnk]#/N'WB Zɫ{IpIY6' \( !$_ E>M0ޗ&Ă$tb kGv ?FJ'MfYI5;w ~@ %`n d?nt^pQGW " NR5wZǯ`_d?Ὀ#`lW8f}s7 1@b:QTrIRBKPAJq@݆cA pkfOYcF5،S;(E*p@V'BemE/WôRsܘ{ duXIENDB`bangarang-bangarang/icons/hi22-actions-bangarang-shuffle.png000066400000000000000000000020261166760560600243240ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsNtEXtSoftwarewww.inkscape.org<IDAT8[h\Us\3Lf2c'IӘF%hR)RXDU }1XZDE"ZLZRBHBzQNB49gsD%?uXG Doߘ~ޒ-bXzUHu'7$)\)Lܼgk~Mo!ݶ69JXljRTqeEJz )۲իKS:B+ɋYLnVkz_ Dz_J)MA DܪFv.\8Y٣Y}/441nIENDB`bangarang-bangarang/icons/hi22-app-bangarang-notifier-active-pause.png000066400000000000000000000013361166760560600262160ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs-OCtEXtSoftwarewww.inkscape.org<[IDAT8KLQvl}PqjBqzm{P×CkGƲ3jKWumG;k)A-,pVͶ#hm}(S/9W>'>bf^^C>H̤/F2,ݘ Ʈ +>n6#̥^Y9 KJ{0kf!>=E}c}=[AV L,SQPDqTw yGonn$#Ɏ/_dFUE5 dlNk57VBXyCa9dOy97uY@e0 4</zYq!YhZ~Er1zX-P&L󈦨<*IENDB`bangarang-bangarang/icons/hi22-app-bangarang-notifier-active.png000066400000000000000000000013661166760560600251060ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs-OCtEXtSoftwarewww.inkscape.org<sIDAT8KTq?s3ygp|L=,6>D+Tt25TpMpc8.RXȨL$D%:LdNf8Nܹ頌M}~{BBrFe0B p~\;gM $2NhNi0K{mEclj7*P cVQW~-MQvGY)łܞ!ԭlIXSp>z6gې$}QuzphC$vfw#JAT- n7r le۱%g)J '5q)ՃUIOx5f}S\ėOz[xYdTk[7*hBC '|E9VvƧG l0%-j˗K̙+ήoP^c 5M1!ж 5'KqdǦ#>-$Ʉ5ޱz݃[Me#bŪtB b2 LWN! ޏ㦈IENDB`bangarang-bangarang/icons/hi22-app-bangarang-notifier.png000066400000000000000000000012671166760560600236350ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs-OCtEXtSoftwarewww.inkscape.org<4IDAT81K#Q!A,")Dqbi 2nkcbTbb5E 41p 4 w5ٍQGiϻ8D$nozfDDSD$j~ڶmKciL(;bqz蠮묭z h88ˮN&loocYqfffX__gjjM,baaAM^}aضMVRP*h6 ZmSVyxxYAߧN8::UUyJRD"F<58HŰ,9d4vt:r)qrrB$syyH]DDxzz" qxxiV} ( nLul6 p_~KCݡ@DPkxF۱YC{q? f$'&~wgŸikk7M;eeȉ F3KN c= r4B]r\zaVW4I޸&;dJ+u 1 VfL5V\T[3 Sq>Lw9@8wk*yJskQӅ4'V k \:¤TX3\t RXJ(#h-"ӝh,>)Ò~basgst2YAHlq{SO1Ts}1Wi]dȕ;o O~wiPT !j5tn'hpb-ah$m$"720]URa)l! Ƴ86|$+OEkJayRa,;R[yClo`*7ɯu4{|ֵؓbu[ ੥=`;WAFy \#fxrƿp>\8@cDvE6ᆜK `۰el2/On.0FV*DU-0h^id,egf6຿G#3KIENDB`bangarang-bangarang/icons/hi22-status-bangarang-loading-0.png000066400000000000000000000017311166760560600243270ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsm3tEXtSoftwarewww.inkscape.org<VIDAT8_hEǿsw;3;{ދ/B/6FH-R-EKPlM["$/r)1ݴ("BAkSM/Bnf^R0|73,):elw^JXru9M{<28Ӆ< N3 ˥4f*KDd+)wDteY-d[\}L)525#=`6<9O !/G"hm=@=l6 8d蔫Y4a&>::HlQV+3sK~s~r4XZM(tRzq.c,מ_"7Gԓo|ÉGGi7)ɝci!w]VrJ7o5.}=P X&mB@J ۶!vbWmi+ !Xk<m[e2)0 !["!s `ZJVqJߑRJZaFte&NW)!Dq},8~#|RZ[͉ݮS|1A. Á 'tGU^>BLB'k@J9H$0PT:;WRZ㜓VM>7b#?|s{V)5X><ϫ<˲Җehmcv99O)`]׽^v+~n4ueYMp)Ax._Zbʡ~9cőEu/ɯe{|Gy0UmI)tUjҝ2q0nIENDB`bangarang-bangarang/icons/hi22-status-bangarang-loading-1.png000066400000000000000000000017031166760560600243270ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsm3tEXtSoftwarewww.inkscape.org<@IDAT8MH\Www=>m )S vSJ@A0nGqU]Ƣ$qH UWA2%Xl`j7H7]$5B_fǛzmιw9| Gpq]k6Q>ΑTA !NG:1O >mcÝ%x|$1fpd_\-?yqZ!xlS2[DRMc[m27BD7Ro̗*JU"AJ9XUKRKDt->63_zDcWM "y+Dx `y' Ûa\.# /]]^isW.V):/> >zB?iNq,?|)fN&W^ٹ$A~hyxkUN83;03|?`q][Bq1;^ ־X(QEovڛDCbva۶rBqmBuwZ>Ma^IH7"eI9QJ'w'K=$|^ ! Vڔ_9Ck',,tygbJJl1vV wZ=)As@J6ͣV V F4g^y뛫aB.y*dX7#}i?g}B!ϓYCqxɅ870(`1Q~WkMDQtSJcLsp %ۂD ?V~\ bn> >_-oRfYrZVe3(I)cw_ z8ή,@?9Qj4!oķc@YtZkt/QM_=T#rs>uV3R2TA)URhq*B<ە <9?u[B {VPzc !6/j_5q*sk"~jR ҿ<>kZ(9j@}y^56t]iRze]" IENDB`bangarang-bangarang/icons/hi22-status-bangarang-loading-3.png000066400000000000000000000017501166760560600243330ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsm3tEXtSoftwarewww.inkscape.org<eIDAT8MhWci?v7qmBo6_4=4kRKi/ͩvRLa4K#jz.}*Ľ;6!ABҤH!PU=7y3ɦ @N1юT===}DdN1]/Sc45ֿueY4a&,ˊੱ~ 8'MB0 x 0?98bSO)9y^.LQW[88i;G7lauݳ fys#3T)c#u;u^$dC#_f棞灙ʛQUUUu͟"8AJ "&w9Hs,weea:['|$p/._oP:~ 3+<̟[Jv]'?IJi!۶5u8lۆ뺥ѫlA Z#Xmq ۶bq#%) O8RʭtZA"=QJEQnw=;U۬˨('hrr9~iR}J}tJ?+>J.]dsM]tPBzꕟWn8zCSi^qtyYx_/:/Lѥ./-[,ک)2֘=}EQ{CIENDB`bangarang-bangarang/icons/hi22-status-bangarang-loading-4.png000066400000000000000000000017201166760560600243310ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsm3tEXtSoftwarewww.inkscape.org<MIDAT8]hUNvv`II#( (R\(Ri-j#RɋTmׇb+l "*ZCіnY/l2cN-1́p9wϝ{Rt$ oǾ6hOr clZ.Mgp1fzK #8k N1~BfOgK;wegߟ6J)JwSBG]ږ/>|q|xx6MRRa".Uj.[+ākl6i0Ma.:fxKl~T9혡qJ@k?X吸:ܲRPJb忸|x\)<N5B0._JMG sd1v]1!nh4n& ا5hJ8hK!L aw u4 L9[=7 x\B=p9R*yx9))c۬19)3㗟0lK$|A(}뫏_^x]}>5fYNa&(w9s |s~˞lR ^eO$ԁYBop VTa*ijJik7pZqRJٔR}R øfZ}1jNnv=^}Ƙ0ET޵Uqn3{@؃t'IENDB`bangarang-bangarang/icons/hi22-status-bangarang-loading-5.png000066400000000000000000000017021166760560600243320ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsm3tEXtSoftwarewww.inkscape.org<?IDAT8AhTGK^U+x+ڋИTe)CP<,1%M0M7멇Dz ,REDK[졗6曙N[}of~|bay;HZ x7Rwّ >; Pik):savH)!DHvHVRJ9q"ט'"T*T*  )(6uH2sɧm\_}XZ+|fН/5df031Ch0ϤRj6ODӋ+1X]FݯZAk{#WZE! bRE[/ܿZk;V޿৚ebmm=犩v5sD{ޞ?N@@82A ð>QwRW)|SJg@DðvZsspΡ@KJ8`oJyap65M;Zk[^)3NZ-~LDώVOifnӠJ#Ƙ4FBsiwvv}U{{ 5!%fƘ|Ak}stt⹱|3)|qeVJ#)eɫ|P{tnw |xnRlPq+wޢ:|x#2J)gFgJCkFgJ7JD/,oxayEQtPJ zY?|r~6_hB ˛S4Eon7*M za*s)X!bIENDB`bangarang-bangarang/icons/hi22-status-bangarang-loading-6.png000066400000000000000000000017201166760560600243330ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsm3tEXtSoftwarewww.inkscape.org<MIDAT8]hUw3ݹ ɶ5V_J-E} ElJkKFK7OZeWA?"٭X#J >ZBl/Mwܹw/e;k⁁s7s +UjX& `Lj4uVVVa8n/X+W wLj=#]?\[/jwѮCo p]B:7wZ19VhR>TVJZۼ| 5Wdzթq4^(~MR|~zbITG{wT> `RP)ObtU/r2 2 e4oضZȟRJG)U:"?q~~gaE)>!ѓDwb]aK)y[s{>Ӭ4ʥ$It]?s%dYJJ,p1|s>W@^xqFӴdM`JH,3Nc 0' !BPIH"I@ <(pݹ?DoseY~vMb-ɥhsydug 2m~ozl5t:Z\o^>(JWeB|goXСcoZ}1m+hQ8s_,rey8\^8WUu$N(2v1 V9S;ꟷ!Qb6IENDB`bangarang-bangarang/icons/hi256-app-bangarang.png000066400000000000000000000261631166760560600221130ustar00rootroot00000000000000PNG  IHDR\rfsBIT|d pHYsa~tEXtSoftwarewww.inkscape.org< IDATxy$U7"MUD6A񁻾q>⮟7 |)|QQP\QnVYz聯ꪬGddFfeeFd?Aws=soH$x]D 2H$^@~1hl%C ^BBJ$aZw ya\5]eqbxl`<ՓHwI"q0-9e~%]9{M4&7+@>q%3sEY(l PҟPHI+c4eig.Ã{ί^ЍqF;@XH76錑3UY"!PT 1R dL #܎ h  S*ʣ{y_!fLoW+G>Te%%xg45DzVFI+˺4s Y!Xƈ!JPM#VbP S R)Uā믹+2 @ W$7z5@4$P3L!WΡP֬)=.pAAan ҃A&WwF@VR(J?_›o|!0G'ڼct\"Jrha0ih9)D"t()5`gTӌ\nx7~'G{!pd6MʯH~s맮]:yz5]3bGrqpf?*m9KPH2 V PzY{_'Q7] IU#}ýδ1ُbM$፥7w(=X1dpc lrC@ u#@x?^4|U~%ՓG +މ\9g<{DEX5 SHɪPSGf/7cne t?jBQli;_"E& HI0byT.[oOܧѥPnlV5'-˼WDR}m];& #CY+X~~$DTrLLу$%4OH_۫/71JهvUvHxKp$҉4҉S}='㟽{[)dVthOH}:4 gprV\V6D4SHIԡsV7qx@GPO">s˻.Xaugf $dY CQ$꒵pd:wN]>ie8E˂ y@ ׽HK/A~5="ʗWly@ EQV_sޙgt6j`@zxQ0[-_o(p+!/Y{ѯC04 yR'r\y "'QLi ]>xoChqgbiVcxŖ6 -n"bՑ|9Nj2Xzh1 rۙqf@`v3K9xP* ) SO9qΫ@VE-Ee#NCiCk 2C>{KHxho)Xڻ3"{bw?k"i11#-oP" 4^TpeK>21N\a+p-/d,]7y( 㓺yLQ@eʡqzr%}#I.D"y]TK^*=}.݅ k  20ַuzid: "O{ ޻,RH'|4Fѱ24[%F)R)pʷKz#6/a`!rNDUCr@63]w1$H?ƤH@ToV8qbFڇׯyŐ>c]_9'o\50D#:hR &.ʁ/']oNd֛3޼Aajҕ}>.Al҇D`DP~4Z;Ɗ: %B-O^ƫ1T!l +,TLqO" }DιǠ Kr?#а<"H|/zb8x5uKUu^~Cf] >?H$ح**sWf-7WqOE+ \e$ٜ amqtS8 ltHz1>zq0v>z`Jҽg_Li0(_ uV3:9Dv7K$YGI5\o(HFDMCyaaOD+iAE@TC[}% "L J"V/@D;-^@UXZ7 DJP@asP"Q(B}5'RJ %8N-bJӍ"ww߀O]k)Xٿl=g=VpS[[O Klp`n;ıΙCNThh"( GzP ( #d; #W!:sb-e^fscAw2AjD8H@ S/G"H\:1[ 3#l;'+;~N$tO<bQ{4XHN!, K9Ǭvu]b+e7[-Du ®KtB֌$&vؐ7+ -pN+wC\90K{rʓr}ٙn>=F2~_]BllPgA; W)5- 5(c >Mj#p>d?-_&0quuǶa4#,ݸѓڑJw/sS1U8=U>aA $pb&OxGw n꒹OvJ$eCC]>sssiQާ\",xI@{m|T*$(݀d팱H`ĚPJ@sD}<=1-<obցHIXWLHs˗&|B@`Km![O9AiC,>ȿ܍sl6䗁3&1y a#0ˀٙb֑+L;ʧT)#_Y2Ӆ)Gv<ymUB㴃u]y/@YdL@NAoץ݀RjcmQ7)Gݲ|<ꖍB.G/:HBeYzbqކg+ q$2t#.Y0}A# !P<3N;;s^_x0k} =ˀNҳ*1p^ c/йh#AQ,"95Wh9 daNMi5a\|4vH̵\A\pWcY2 )@ O?zNF+ #D(gw|bK1D|2 *u GyzY&\q|a7`{e/=PWDR?v{&+nNDJMY/C_j7Z2g8wpS; ы~kغw„Sû2"d` ,l? ;))8gՋ]zx-@4DE+2i^@|(h!n4ЋN2`3=Iqz=P+K]hOސ}[qqU-{MbDfNbP(&gLuM=Y˰tP?k43 kssZK ҄`L!@ Sޅw.as^"Ed6 1)MfW\8$'bRl: 0I. s_eU_vO/ 9~j[c"W|#ZH@T$nם/]/HI2uZڑba _#(Ø5]mSr-\y7]^A$G- v:k{,~#Q}]EQ{ru⟯kw9B8{%޾Fu ^(e'\WȵƙHhzDOӝ q% wI#J =vXts I<x4 @}y;x6,ވ7.B7 5\!vx+$|d5p*plԙToDhAP1JȦss/m4Z? .8Fy^a vtȑØOzo /\^PHOX IDATX.]Md-6{[ųGv`x}] Aȸ2s_˱Kny*`~ȭ7c7%ΚO;<))4uQ.Jj!]4Yo;m൹Wu0n}|`eʫz"o.p;pR(>O4qE$嵛t Xy^_u8n8:m? WA8] CtXV[X@ݬ*VJx>|Ku k遛omQw]:\hkNea=ygTת HR'o8چk.h ;~%8|DBjiEEke6f' X0H;l؟(xuˮ1$ 9 -&>Manh42( ]O߅{߃7Fblo+Eí?_vvP|I `Cu*3$^ ZMIp3>앵2n?[~ r[th|:$n~fO1DL$!*(O'kazӎDI5i+-kxز/غ{+ڂ#G\*$nnyC*Z2;2 ^;zV,"꿈ͶC۰6=77Ջ'0>01dF+a:?37كxt#ȕrV h"W`C%?7. XhJJ"?(+"A\1w?]Y$>"-dh? hF DPu_\h49ߖ*sr1fc  ,0 & /ԿP P-jJH-S``TTc$.8hMC0MaP{ )mr8&}!S3o $xTўs0 ``LYW^@ 5%6Ajp!/v(Z` 4*ޠeg1ha@t 1\x ` %;ID 3*ֲ's/n/c{#`^X3OPJ;S+'2\3IKH tf܃sT lLf*LH*xTO@ڱʓwg ]CW~؟?ʹ4@\ڐTs|bYtXUDIYHH,m@h?y]oBQ3\co̿ P 4#d Ymwb,y7*@ >zc&*4P[7hkCy'Rʥ]'ԡİQA16'<ď;',5lGDCsCW|?}oVAG /v@EAJ’``D/V3,p 9G/H@f~ haJBW#˘+1췭o` 1,*=JBWLuC0t(XF*'3@ *\osg]ƌ x+?˅  ^ʠ,ubʼn?14g` ԪPZ Pݢ Zh @Fwɡ*v\z?npd y*a1Qh\Q7)F@Eh)I" :gۨzox_^ߌ4ރN^)ӕ6n ZHJC Jf7+7#4 CCMW}YғH‚YA4f͞@%7n Z10kK嗄vѳ|)22?#\ \3MCj7?' jyN pK \7M?ZDIAZxfY 4# $ tTf @;,$T3\rIENDB`bangarang-bangarang/icons/hi32-app-bangarang-douban.png000066400000000000000000000125461166760560600232710ustar00rootroot00000000000000PNG  IHDR szzgAMA|Q =iCCPiccxڝSgTS=BKKoR RBTi@숨"q"Ay((6T}7o9g}>F`DdJ<6.'w T @- m@n8P $ B2r22 t%[j;eOv$(S*@@&X`(ʑs`̔`)d` SGE3(xW\!Sd咔Tn!\]x87CP؄ ee3FvD9;:;8:|?E񋖴e /B_TBfgk+ m_ _׃  2r<[&q?.wL'bPGKĹi ˒$ IHk`~B[P. %w߂1w0hْ 4P6h>؀#;x̆P8XBHLC.,UP%BZF8-p<^0 o`A2DX6b"ֈ#Ef!~H0!H "ERd5R#U^9E.!==F~C>@٨jڡ\ Bh G h%ZBѳڋ>G03l0.Bx,c˱b6b#{";!0 $,",'̈́ Ba$nD>1B%+uc[!\H8Ri D:C!d6ٚA% ry;4:yBP)xR@\ RƩjTS5*.Qkmԫ8MfNEhhFyC+:nDw%JaEz=Ca1J~=+&ib3 z9c; _EBZY U| գWUGԨjfj<5rjjwY/i544D4i01VjYYlۜgK߱٣34545Ojr0qpns>Lћ=Ejkh4km8ndn4ר1͘klŸx$dI}S)4ti[3sf-fCZ||L OE57-I\t˝׬P+'Tj֨zu44ii50lmrlll9-/L6u}wϰ0ۡ7G+GcWLor ]3:B:;}rvq;7:$pesø܋DW'\߻9)܎n~}hLڙFY4xx>2yy z[zy~c#9[;vi{o?$L 10(pS_ȯvlvG#(2*IU<- 999-(yr`GryPGTԊ OR%y;mzh􉌘LJfbq4]ڑ#z-ںhT$Fg* Ki\˙S.7:hz4k]BX"\Ҿp骥}˼],OZ޾xEኁ+J_S}Ay1 W XPR$/}uuu맯߾sr}IERaofbC2]Ioot\<s--.zbFmmmMo*VOuw)y}׮zKv#swo}}9Fv~N~:],k@ Ç]FƽMpXy>t(h?8:V܌4/nmImmk9>x{{۱mDI͓eh OM?=vFvflŞ}> uzwq%K/s/\qu'u;w7_uzZ[̞S={M+=; wz˸~+?R{TXqϖ?7:zA?q)iŠ`Љak=x.{>>R/;^XW_FcG^_NVJ3^=~fm;wsw~08姶ANdNL%c3 cHRMz%u0`:o_FbKGD pHYsodIDATXŗ]]U{s?vh~ *FCH0W}0!W|1H J@iЙЙvvs{ù3&`ιw`fؿ9[sn|bU~tK]pfp̉31L$*11gќF5DhX, Z!} s#iӼsM) BHf\#F DFA"ZR-L#77|׿Of6Y$45׬ԨIB'1Ùb(#KŹz* *DUČB*D43gṽwk+>OH;Wpf  g('%+<"휛d;r3`j")""HD#A"ĔT @P,(&f"A*+R5 hB!By,(bj|VI!NB$#`QSlJL»#s(A"y(5c28][pzLR"gj V30giPnJ;Ep3%ȐW:hl+! !ȶ?]HxL".jr~u蟜[ .4wM~;my=tF,b'-sr>JA/ϓEYF+%gM_zZ{O#RM+C&TӔu#ZhbKD*!e=|LHҤ̧bBs3 B5IY(2 CMPT9ۙ/39BJi苢$26J+62ٞ$>a!E($0>s.Tqj}/4|"FeYn7[<cvFM&StCQM+L80ڡ?;n`(!G#U)!y.i7_íbix`CG0J1Xo!8LZgkX?ݐbyCpyC=$>WsJ~S~n1޷Y^81XӋR2IxQO$Ӽz}>nr>2X+ S(H^\yO_#7ٹZr.  dENuclh7^AZY~r(׎oC0KWXHaQ 5Gx h5spznV5ɊfBpmZgwe8GϜblpFRAe6[mu"Z53Y5b#+rĎZ^$ej}vi4<VQHS)- wM~vNR%;Ggiwpň kR,ݎ=^:r;9X=0EdyΉ)7G^ge1pc"OtZFpRDr.'Wa&s8g2}nG, &s=rzp>&ez8 (o^>&Je6[*[.g%tw3w+_sV#ij%T~ǻ$ƈĈDY=OΤJ)BR ~E|3z봏,D E)E_BDrE$(m(];m"rV~'3f;qߚ.nUUxsq\YKGeẔ*uimx-Wz%m/&-cr홙b`9`9uss]lߏL .zTXtdate:createx32045052 142020620@.zTXtdate:modifyx32045052 142020620@sNzTXtsoftwarexMLOMLLV033ѵP02045450UP())///MLOMLL/J MX!zTXtThumb::Document::Pagesx322 !zTXtThumb::Image::heightx340&QJ zTXtThumb::Image::Widthx340&L"zTXtThumb::MimetypexMLO/K{x_9GzTXtThumb::Sizex34ѳvkZJc*zTXtThumb::URIxKI 29_0IENDB`bangarang-bangarang/icons/hi32-app-bangarang-notifier-active-pause.png000066400000000000000000000020141166760560600262110ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs7tEXtSoftwarewww.inkscape.org<IDATXML\U7 Xl SPjFӐh nLďm˚h41QӍ4.4fG1Ĥ`T(T0X޻039w'O#"tkh[ &mkH'Oݯ2$1ӯ\;A!dz;U*e>DxgG1Z^7)݁ttj$iPI&qcR{,Tsb]ُs2bV$fUQeKhσ52.&z0{P1}h0z0g#!1{qUeOeYK ħ/K 0tLbA3fIe+gbv>.N/k|7*etC G=BRsw/.xO'P݁tP֚9ܼ5|}Svg׾ d8#B=NAɎn= Ȇ'i9n㯠\R(k8+ $#{ `$tpO_S=mL@MpO;mbe णة9Sة9ܥ`"P\N @cv|wSZ߉aP=GPu_ण$fsIA\Tl a GsHk ;j)߶zo1{,y&1Ux-%uk 7~zX fGKq#vRL_|Ņ+y56=@KD.Wp+af轼@u%C)T n7DQeR89MF%9ڜ4W<|IENDB`bangarang-bangarang/icons/hi32-app-bangarang-notifier-active.png000066400000000000000000000020461166760560600251030ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs7tEXtSoftwarewww.inkscape.org<IDATX]lSeo{lnes> #&h"LGb 1f 7hS$&C/b&za⌂13 #v-k)<^ s7N;a?/nH ?gMq[|x1f46BiRfnH4L{v^U"7o%7#~P$`%QW+4^~5)uGъ2`6kZ05V@1 fFǂWg={|nVVQ``"^gqy/hIn`7t ƙH<kTek hlUQ-Mݜ[q7œºͤ-O ] iq[~rԕob];/`͸HkJ:קЧcD)Bh! "ԣ(ØM^ӆNzZ&(|)Z*20[xd}b΂TKs#.[,rm q,y)رUUT BI)Qڼ湤ѓFJ*RcVs{dhڜ#"0Mo4?Id'4 plRSD"*J YV<n%"*JD&WWW 91zzzzi"2%o%9NNgFFB2$ =ooo*.kTZ#7͛k'HD\VM)}pvv v!H$ r~~.tuu177YT*RJ2p@,₻;pݎt]fF~&Nt:)--Q__ޏ\\\ǟ}Bx<*++9>>&Z/#$W,B?~d444ۋ)`0ߟI e 1??OEE~Y.//#N{{;^&''9<<|fFa:ܠ:aJu[Dk255sf64M);@uh&)odP^^fxh@ |O/000@GGGVp8|ε ^5O&(++{14Mvvvrptt,0 ָ:&"j}|jjjPJNxrʆV+"bh_zss3f/Ѣz_SS:;;snEݸnzd8bF{<)a)BPdɳ"KP蠟afIuY5_Obf)oC,ʄ"/p jSI}%(._Sp0-8W=BeMhƁ?Bz\Xdi_:h\Ri$>"/ڜc~YU3`p Ɋ3lzr?NWB5#z'՟.;Q9*&ה, kBdIENDB`bangarang-bangarang/icons/hi32-status-bangarang-loading-0.png000066400000000000000000000025601166760560600243310ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs.b>tEXtSoftwarewww.inkscape.org<IDATXWohU{9ϫ\[۠5RєA#).2*!JYnA#Ӵq!4c,>ȚC4w}wsӇ;o/~wā㗠^  :.-,CX|ud΅mێ(ojb?أDmS?D{<+G]/FĚLaynmYu݈RJ%5C̜G·#t:-&JR"r طsMyu_۶c5[&3/cdf@V_DF0M'm<"dRd'nW=YI)5m"obO$sD?Q+"zWۻhQccc)8Nk۶cwRtEXtSoftwarewww.inkscape.org<IDATXW]lUf=Ll1& eŀݢ &}m bۉ3)xiO"2eW䉨/P__iPJŘYD4afκ"|%OD |CJDsqQJ=>2sVJZGo]1=[;h3r`fzǿgLvy@`5 !b7l6ctq3LeYieYHӰ,IR]7Ϥr-Dd`3MMMPgŮn%!,3C)ul߾}ck* .a='e@ )Rp8oܵ[>N&O1D`g =>a~?L4E8ৃPkkk϶m R)ZZksbe{VjٚTBZf(9`X6x59+cQQ74LEA>99$fI8mԩS\.q$T`LtEXtSoftwarewww.inkscape.org<IDATXklUws.*QnI%e b41~#Dm+)jFm b* $EB| [Ljyjj;d,'d3ssem>ccZ^-&Q:TR(:SJ9S)w7י,m)&_6s~PY be$H7<') !Ѽm fmBl#J)eaOH)9Ld%%%ߨ &B1qڛꈨIa!@DR 9,p9PJ4MFD}ȗ uRB&Bc^PJ1)eU r`b)f"bD!4;;^*D_ ÜsxHg&f 4ẮJvRD"ɶma6cvo9M'wO |clH)hߎLhlѷcYB̖0b^ctvv~sp 922Vq8zZVm:S\@k+l?Z$᥎@X];IZ,B>s=`0h6K&,iY\ecYVr2RbYyb, }nG# Vp@c5=6]I@Ζ:wrL^ Q^8<ܷ|7 /XH$V,/r>j쏹 ˯Q***6o(xUU!D@k=Y[}1&W ,o4t;W^ʮI$1fdvqZT$}S_朇9̃p]7ܰ4 S!D^!+za8(RjFz2&ATL)z]Tk XxUu k&&4.-Q$9wR_8N_9()\52ٜƥS|h7FW)z;e囈4HD14]S!ֺ@1M2^K:c/d&,))yk7arNrde>ƥ'`x/x炏oz Pٶ1]OgE Θ)ᵮ3fXEecl1{? 8ת.IENDB`bangarang-bangarang/icons/hi32-status-bangarang-loading-3.png000066400000000000000000000026121166760560600243320ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs.b>tEXtSoftwarewww.inkscape.org<IDATXWklU>3w麛?g$RA$hDPB $l!hhBJ@mb"@H=gf6GOr3>ιZkPmkc=1JB˲F@0 Ks|ݲeYl$˲/>X6r뺛\)U ,@]픑JYDd{е߳ds]w3"FR e/Zsl3&rW!Fs'1^R!bC4YS'mi bD|aY (EDHa0g4%)ppI@`a3M\A{?8MD5HЧE Udb\Ba cM;.8*VMs5DODz5L|Nf)xyhp]۷f2 4@4/HD7|~RXZ{"Dui\,#F&QJ CDpR2Z~؂$u=ADU!a)+LayͿ:޽% PIvsh"Fċ_uy6 c"0o]zu*9aԩ<kLܺB3&Eu"{pH>`tRJYp8@8NS[wI)6Dt'/kK1&<\xVR}XcS]JDtuO3}VDlLM7 c8?9_f%ߌ ؀ctkng ˲lـnWw=/5οğZ!IENDB`bangarang-bangarang/icons/hi32-status-bangarang-loading-4.png000066400000000000000000000026121166760560600243330ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs.b>tEXtSoftwarewww.inkscape.org<IDATXhG\6wXh5i? ՘Zz)RڔXmDlժ ))F- rKR(ӂPiA;fnt/؜ew߼g{KPmPxۏ~wb9qhY9/'QΤp缁shhm W pI`O(6K)1~n2@p+muUJ3%W#2)7_X ȵ1,+r}xORJRWAնmGM$R, *++%1.t x)zCP4+L)Ƙ, pn !lRʎ[kJ|۳: F) ;j0R{{|h^!Bv@ )eG\qHy1C'εm{Rj1֩G.ɧU;7l&2~!@4xچeP,CJlʽf|:W(PJio)GT?r;>NmY04c,ǂ%.s3!Ĩ8D!^QQRzcɢ$[WdLJ,N?8l[OuG)m A8 nιJ&KZ_۶sg)8YҤ_"?3b7o5tg(Zk?Ck}r㜙BZ"$|oUVOxD\_OK#J×KZB9!OM|s%E#(!~ȉs.cBm "GXS;aEcIJ,0 #RWWl9rΏH)cJ)d8~m1- nE3 , 8`Yhb P)DCZ)!QJ] m lG È2öTs 缆s9_9_9'k7J)UJ""T{G/4xUaD Zp@~`R.!;ꖗ5'ϖP(J\àRKJfKYY6MS۶:}Ʀ: "ve;D!ݒ@ m۶'&r}v;RFBu>uky2_{% - 1yB3j ev$8痦?qf%8QnU^OxcIENDB`bangarang-bangarang/icons/hi32-status-bangarang-loading-5.png000066400000000000000000000026021166760560600243330ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs.b>tEXtSoftwarewww.inkscape.org<IDATXWklTU>vc%AHXP4J ])(!6>CbDE4!R-D# ZyH1B!*mnΙw?mnnIN<9gfԶ](E62 R{RJz\`m)~<UV8~"HDH_%1exkٸǙ-"#ge@k ~?^[%]U*4fLy~xDg!P(+9,}ur@DF03RKYU]5<3OeBk^AjC2e1>+"Y13lV\=1?^ 0ɀ[NV^c{mY 9MDض=D"~d -3"IHdϱoȥ3W%"SG]FD 7x B229{J)G)9t+1ǥb%"lۆ(sW/ucͪ|1fS N]-("GD03֗xx“jMJ35Ř#"ߛ7xApCm>̷:::tga+"ƃw *]*+2]Z#"M"M{{{Oo5{-ZZjǒ[_#+޹eAM0l ^ߏ@ ߟ y<^w1R`85"2qjQBDL"8G'.gjlnbf&yνe)"_k=ID,R/IDQIZ+cL'fN- @Cyo>0sRDV-ҔN" XPdnoIjW.f^>rN˲m0Jk= d֑N1=wZefLօ+=ƘlݼBVfŹΆqf~FD.`.d7lk7ENň3`6ʆ>ٰMWYVTȔw\U}d~ IENDB`bangarang-bangarang/icons/hi32-status-bangarang-loading-6.png000066400000000000000000000026541166760560600243430ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs.b>tEXtSoftwarewww.inkscape.org<)IDATXWklTEfvwDJ*h"Dljbbb#+L$kxiS B@h*b &MhdQikn&9wa/.I3wfa}(֯f5냯ϟ/%N$tJeDTMDJe)@lB$"3cK`)9#98ͫޤL1\ s RšPlq;_RjyUDusMI.,D`ԩY>~\k݂~gO=PFD0u]N#OE AbKzT:R Z[2B j+\eDu:RwƉ3הT`-J=Q%qL,敟9/$f|c%5QBE+jU6Ⱥ 2l *;)`;6!ܦR)wM14:;;CMXLKEs](q7>-bƘxP삹=њ:TRjbc/햦xzbWWvCXYԱ²|wG3eWXZ{_<ϋ|^lRyS[i q8 B;`w0`c*]n1&f> c RTbݻ'V'1J)+ްvBFDӤ5D4 !XڽI"JFVS,m͋+Z:1m+LJ)DdrNDok^ePJ5mZk+ܶf~ -$R u 53d]YSJśۺ'd:Nk}FGGU&^֑tEXtSoftwarewww.inkscape.org<IDATX]lUݹu 5cW^J*FQ@)FMBPMS >h5[,<(D@DRۘMv޹烳d3rp{7瞙s.; k/T o:?nb3@3 ^P)ϱCBMϱKUR( Zp}ٌ9|СXтjEED2r=i5m7I).Z!q'*Sb7"FĝuSZuG7XՔP<_}ocVEF" bW?Bn,#l{{AM8nb_iv)!EQ溮;Fضc1Ƙp[=EG`8dpM<?R)Bp0&!&!x*kս m_ QJ+t̉W4MWJy镞i|KSrB0ƺ4L|*0y6ʲ,wll uD'~WjeMLeY6n9=u4MwՌydOjan+67m] "j1PVLEiI_t˲g@BMu*+x`fĔ8J"OM CE&.΁MS]jGڸKVg{ ^z)L6p+\dw VDZFCӲN_@`g=fpd 'а |aQ0M$d]'XofF\R ڸČ,Wbw +: $hn>}ŰYSʆR$EbPM[=PɇS҄Bұ>ǫa`.6Q'70d|4zlݟpKxc.?L 2-3 n^x3fBL?ރ3c \4~<.NFI=C_BcGvt5#C>hgp EaGB1\a3I;*Ha-+ `($o=5!"K. kyYܾHh lZ3Kj%4)4/ \~ԯ+Ć99>l1nz07\&I> iCgt-Y;VRqt9Ije$TQXؔEcFG E4L0qUо͕o K0 ȧc6ubФ񾩯 p`C0kY+ K(Z0SUԁ Ց޹ bc );8%Q78osng uw8 FGIh4 }=eMKvB_-!bu 7U^ay҆'-/f/ "𧽱}F u| t@%"cQI=lcbY$:'6݊3'p`֚5 Ey+sVY0`\y(=F6P~Û~ ` PJЗvdƟ^ԧcZb\E}jո[#.dDzr4D'W|Kɂ[@P:vqW;'ܺX7ބt0޵7% %nt>M^ zI o/P3&cJ֍Ⱥ;7eX!ERqkKaD'f(;"PPύJG"كCrm|ߜCcpb=)AS{kE#ɓ_ s!}xʇ50V?<b۹6)Z0)Yv;0,86ӆKɻn/"Y4"cǗvI ,Xqjdu|VbL~b5đ\~ VxNwc$YK[wg.Sr}((j8P9~՚3[ P\AO箁 Haze0L0:0H\ VDNX$o"{6T@"e֗ @WrjHny1wFwt\XcBQWX5PO)MPuue_C  )0.TLQA-(DvyOc08e<ժ%%ܐr(2'8YM~O$ɍocӳHUtNQ 8ZC@q)`пǚ'cW_PŶ[ǀkg:olRWl\LL'&$];tofVTT Lb雏0hh<_ذVvA44ryzaʼn^Q^@䖝J˹eި_ (EuAG#JP0JW_\77V'hVc.eٜ/N84͈$" ܶ^*דs70F(zG} ,b铥(Rd6JN9'x_*Upq@ Em䘙Q乼K +~%Z ȩ]xwmmQ|GW':TxɈ,ZZAL>z!膕pQ8)Y{2wĸa;R%qa!R?Q** 7U(tAgd*fQLXB n @̅Bo}a ۅW=_mg " S({S6q-+F)u^|!@pY+[<:tV]$8(|JeKH|@[&W- =_\ ,4o\X@TႶ89my-4R J2qPVn_lOwLy$ W[S)5~h5pSn3(>ꉉs#?dHָ 0 =d29}<p0F+CtXəK=ADQiM׾,^c@( ";V/EF<3> zͺ'ck9nUvG !AՍFxcG(|>$hdFJAvAt=baECHDcIªE,#>(rfY!Vŀ: ;`/~{E8u0 'Y lq 4BLk <(@`[ SPԏwq$(|FP-`FVkp11C٨$i6Ej}I9{eO (O '!`ѫgEqoT`zTǜ]# VR0 gUMѬP66_A>O[wU1?E@PHb7%QVXKrZEZEZEZEZu-IENDB`bangarang-bangarang/icons/hi64-app-bangarang.png000066400000000000000000000054451166760560600220300ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs<<*ƀtEXtSoftwarewww.inkscape.org< IDATx[i{ݙ=g:w KQ%PB?br&$D`G aMzwsu׫螞VTRWU{UUX$֍gv_kXʚUDM1&o 4fxoӃ;XwѼY$7Tlf))ьf|> c ֢E&Bg&Gӏĺc=qu/iGCQ!-N\r`c m:ҳ[?JC2>YܾdRQ D"QQBR9DxdDZ۳d|R}5XC2>q&'3#5az 3@Ғi_o ,#T7fO H,Flo":x{եvx4ѠPr sz05kF̨it6m^iӢ0|@2>Dg֡f݌:qT*$[+Z;%5t$vP3n4jc 풁,J(4Mu* ԡ1s>U_>sַCƱ!KgHg!0bH?7FZc>[/`1qPV( sp $2cM [xzzJh:ߗ&pjj(gqcL<;]{@:t?CuOdąp zYap2!c@#0bhC8NP1@F\ac PQpDe]a1Yg b\tpph'dX1kU D> O[P)܊Ǘ=kـYv#.5jz><{j@87⁋v (4ZZi_]Aڮ2$vJauu\gm {L<!3knCɓƑS9T'( q2Uo زyi<{ xc pA P *'$p63fU'Pm@06tc7gGFיd_:o S! ¸GRIƥT P pp 06(zY+"xEi(IGc*UJHSrIA+Bj:WALb j! eFН/F $DDjl";׊l]0a"wys 0tfHH+1ML%tlv.P 6 Fb ޽\ӱ DutcΈuPbY=]E > a!ԅj cA/]0c31H\ ́8sL1;؇݇_Yп>Nw 'd̮.܀{>`x֘b}F*D{¨P32aסzP Y }xVwG[}ΦǨ!G8eyb@߉^o@rE{(?SvagQ*9-#enטȊ!  J+{@"e>@TB|}͘0Ϫ_c=߿G)|BLl/M SwEsM>!:yEnfj7bQ%V/Mm]UTZ+5}Lis)FcYsFŗdiq?n0c+f/b^o+Rr'$z}THq*PHK"N~W:7=S|G);}ZzT8'91=SH`OsnKKڃ݋78i_7W9?*{wq粻+.<WF@Pv`0nu̸uǡY%ήhmIJ帬2icc82r{ʼn3'D#JoZ$ĺ|?/v}adI$=3XD/d;d$^ 9@,x .%<F@~(їx@0okcBK|TW[ a0NLͱWǪxPB=NcwF#RqN)N>+6[( a , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 msgid "User Name" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "" #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "" #: app/main.cpp:41 msgid "Creator" msgstr "" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "" #: app/main.cpp:54 msgid "Play CD Music" msgstr "" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "" #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "" #: app/common/actionsmanager.cpp:1148 msgid "Show Audio Lists" msgstr "" #: app/common/actionsmanager.cpp:1154 msgid "Show Video Lists" msgstr "" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "" #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 msgid "Tags: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "" #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "" #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "" #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "" #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "" msgstr[1] "" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "" msgstr[1] "" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "" msgstr[1] "" #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "" msgstr[1] "" #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "" #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "" #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" #: platform/ontologyupdater.cpp:385 #, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" #: platform/ontologyupdater.cpp:413 #, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "" #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "" #: platform/playlist.cpp:671 msgid "Video Playback" msgstr "" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "" #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "" #: platform/listengines/ampachelistengine.cpp:161 msgid "Playlists" msgstr "" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "" msgstr[1] "" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "" msgstr[1] "" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "" msgstr[1] "" #: platform/listengines/ampachelistengine.cpp:274 #, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "" msgstr[1] "" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "" msgstr[1] "" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "" msgstr[1] "" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "" msgstr[1] "" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "" msgstr[1] "" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "" #: platform/listengines/dvdlistengine.cpp:97 #, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "" msgstr[1] "" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "" msgstr[1] "" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "" #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "" #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 msgid "Recently Added" msgstr "" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "" msgstr[1] "" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "" msgstr[1] "" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "" msgstr[1] "" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "" msgstr[1] "" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "" msgstr[1] "" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "" msgstr[1] "" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "" msgstr[1] "" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "" msgstr[1] "" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "" bangarang-bangarang/po/cs/000077500000000000000000000000001166760560600157545ustar00rootroot00000000000000bangarang-bangarang/po/cs/CMakeLists.txt000066400000000000000000000001641166760560600205150ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( cs ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/cs/bangarang.po000066400000000000000000002254401166760560600202430ustar00rootroot00000000000000# This is the czech translation of bangarang. # Copyright (C) 2009 bangarang-project # This file is distributed under the same license as the PACKAGE package. # # Oskar Hollmann , 2010, 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-02-02 10:39+0100\n" "Last-Translator: Oskar Hollmann \n" "Language-Team: Czech \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Lokalize 1.2\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Oskar Hollmann" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "oskarhollmann@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Přidat seznam" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Odstranit seznam" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Nastavení" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Přidat seznam" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Zdroj" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Stávající pohled" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Stávající výběr" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Stávající seznam" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Název nového seznamu" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Jméno" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Uložit" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Zpět na seznamy" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Uložené nastavení seznamu" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Jméno" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Název seznamu" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Seriál" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "položky" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "přehráno" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "před" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "potom" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "nebo více" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "přesně" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "nebo méně" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "krát" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Média" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Hledat audio" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Audio" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Video" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Procházet právě přehrávané" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Přehrává se" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Shrnutí" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Filtr" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Další informace mohou být dostupné na:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Stáhnout informace a upravit změny" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Stáhnout informace a uložit změny" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Shoduje se" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Zrušit změny" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Indexovat vybrané" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Text upozornění" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Předchozí" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Přehrát všechny položky v seznamu" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Přehrát vše" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Přehrát vybrané položky ze seznamu" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Přehrát vybrané" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Externí titulky" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Seznam stop" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Chybová zpráva" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Zobrazit následující" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Seznam stop" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Smazat seznam stop" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Zapnout opakování" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Zapnout náhodné přehrávání" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Upozornění" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Ano" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Ne" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Nastavení zvuku" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Zvukový kanál:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Ekvalizér" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Přednastavení" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Před" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Obnovit výchozí" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Skrýt" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Nastavení videa" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Titulky:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Úhel:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Jas:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Kontrast:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Odstín:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Nasycení:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Poměr stran" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Auto" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Přizpůsobit oknu" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Změna měřítka" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Podle okna" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Oříznout" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Zkratky" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Uložit zkratky" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Zrušit" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Procházet seznamy médií" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Celá obrazovka" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Uplynulý čas
Zobrazit zbývající čas" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Ztlumit" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Hlasitost" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Zpět na seznamy" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Přehrávač multimédií pro KDE." #: app/main.cpp:31 #, fuzzy msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2009, Andrew Lake" #: app/main.cpp:32 #, fuzzy msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Poznámka: Tento produkt používá TMDb API, ale není schválen ani " "certifikován TMDb. Prosím, pomozte vylepšit dostupné informace na stránce " "http://themoviedb.org
Poznámka: Tento produkt používá Last.fm API, " "ale není schválen ani certifikován Last.fm. Prosím, pomozte vylepšit " "dostupné informace na stránce http://last.fm
Note: Tento produkt " "používá TheTVDB.com, ale není schválen ani certifikován TheTVDB.com. " "Prosím, pomozte vylepšit dostupné informace na stránce http://thetvdb.com" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Tvůrce" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Přispěvatel" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Chyby mohou být nahlášeny na Bangarang Issue Tracker" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Chyby mohou být nahlášeny na Bangarang Issue Tracker" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Přehrát 'URL'" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Přehrát video DVD" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Přehrát hudební CD" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Zobrazit dodatečný debugovací výstup" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Zavřít" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Přehrát/Pozastavit" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Přehrát" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Pozastavit" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Přehrát další" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Přehrát předchozí" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Ztlumit" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Přehrát vše" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Přehrát vybrané" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Přidat do seznamu stop" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Přidat za právě přehrávané" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Odebrat ze seznamu stop" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Skrýt ovládání" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Zobrazit filtr" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Zobrazit zbývající čas" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Zobrazit nastavení videa" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Zobrazit nastavení zvuku" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Celá obrazovka" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Uložit vybrané informace" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Odstranit vybrané informace" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Obnovit" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Odebrat ze seznamu" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Přidat ke zvukovým proudům" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Přidat do seznamu" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Přidat do seznamu" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Nový seznam" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Zobrazit položky" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Zobrazit Informace" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Zobrazit Informace" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Přidat záložku" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Odebrat záložky" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Klávesové zkratky" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Aktualizace sbírky..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Skrýt v panelu" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Upravit informace" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Skrýt informace" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Přehrát po právě přehrávaném" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Skrýt informace" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Kapitola%1 " #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Zobrazit ovládání" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Skrýt ovládání " #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Skrýt nastavení videa" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Skrýt nastavení zvuku" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Skrýt klávesové zkratky" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Obnovit zvuk" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Obnovit velikost videa" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Zobrazit uplynulý čas" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Záložka-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Aktualizovat sbírku" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Aktualizace sbírky zajišťuje, že informace o mediích jsou uloženy ve formě, " "která je nejlépe dostupná ostatním aplikacím. Aktualizovat sbírku je " "potřeba pouze pokud jste nedávno přešli na novou verzi Bangarangu nebo KDE." "

Toto může trvat několik minut." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Stop" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Zavřít" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Skrýt filtr" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Zobrazit nastavení videa" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Zobrazit nastavení videa" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang není schopen najít repozitář sémantického desktopu Nepomuk. " "Média, knihovny, hodnocení a počet přehrání nebudou dostupné." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Tuto zprávu již nezobrazovat." #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Pokračovat" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "Video DVD" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "Hudební CD" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Celá obrazovka
Ukončit celoobrazovkový režim" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Celá obrazovka" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Přidat/Odebrat ze seznamu" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Zobrazit skladby" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Zobrazit alba" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Zobrazit umělce" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Hudba" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Zvukový proud" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Hudební klip" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 #, fuzzy msgid "Movie" msgstr "Filmy" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 #, fuzzy msgid "TV Show" msgstr "Seriály" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 #, fuzzy msgid "Video Clip" msgstr "Video klipy" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Žádný popis" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Více položek" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Otevřít soubor s obalem" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Stiskněte pro ukončení editace." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Kliknutím skryjte." #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "Možná jsou dostupné další informace
Kliknutím zobrazte..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "ohodnoceno" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Hledat video" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Hledat audio" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Hledat video" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Dokončeno" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Bez názvu" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Odstranit" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Jste si jisti, že chcete smazat \"%1\"?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Žádný efekt" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rock" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Reggae" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Dance" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Live" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Klasika" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Senzace" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Dokumentární" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Drama" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Manuálně" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Umělec: " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Skladatel: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Album: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Skladba: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Rok: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Žánr: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Štítky" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Herec: " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Režisér: " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Scénárista: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Producent: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "Zbývající čas
Zobrazit uplynulý čas a záložky" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "Uplynulý čas
Zobrazit zbývající čas a záložky" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Pozastaveno
Podržením tlačítka zastavte" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Zábava... Právě teď." #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "Zobrazit následující
Kliknutím zobrazte seznam stop" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Přehrávání
Kliknutím pozastavit
Kliknutím a podržením zastavit" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Během přehrávání se vyskytla chyba" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Načítání seznamu stop..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Buffering..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Načítání..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Ztlumeno
Kliknutím zrušit" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Opakovat
Kliknutím vypnout opakování" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Náhodné přehrávání
Kliknutím vypnout náhodné přehrávání" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Jste si jisti, že chcete smazat současný seznam stop?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 položka, %2" msgstr[1] "%1 položky, %2" msgstr[2] "%1 položek, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 položka" msgstr[1] "%1 položky" msgstr[2] "%1 položek" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Seznam stop (Následující)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Vypnout" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Typ" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Obal" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Název" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Umělec" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Skladatel" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Album" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Skladba" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Rok" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Žánr" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Štítky" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Umístění" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Herec" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Režisér" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Scénárista" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Producent" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Seriál" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Sezóna" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Epizoda" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Odkazy" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Počet přehrání" #: platform/infoitemmodel.cpp:100 #, fuzzy msgid "Last Played" msgstr "Nedávno hrané" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Stahuji informace o %1 položce..." msgstr[1] "Stahuji informace o %1 položkách..." msgstr[2] "Stahuji informace o %1 položce..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Staženy informace o %1 položce..." msgstr[1] "Staženy informace o %1 položkách..." msgstr[2] "Staženy informace o %1 položkách..." #: platform/infoitemmodel.cpp:563 #, fuzzy msgid "No Results" msgstr "Žádné výsledky" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Nedávno hrané skladby" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Nejlépe hodnocené skladby" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Často hrané skladby" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Nedávno hrané" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Nejlépe hodnocené" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Často hrané" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Stahování zrušeno" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Začínám aktualizaci..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Aktualizuji: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Odstraňuji informaci..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Více položek" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Vícenásobné %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Žádné výsledky" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "Aktualizuji audio soubory
0 položek aktualizováno..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "Aktualizuji audio soubory
%1 položek aktualizováno..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "Aktualizuji audio soubory
%1 položek aktualizováno..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "Aktualizuji audio soubory
%1 položek aktualizováno..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "Aktualizuji audio soubory
%1 položek aktualizováno..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Aktualizace dokončena." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Aktualizace přerušena." #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Hledat video" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Zde lze stáhnout informace z DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Poznámka: Tento nástroj na stahování informací používá TMDb API, ale není " "schválen ani certifikován TMDb API." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Podrobnosti o kanálu" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "Zde lze stáhnout informace o kanálu na určené adrese." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Podrobnosti o souboru" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Zde lze uhádnout sezónu a číslo epizody podle vzoru na základě jména " "souboru. Např. 2x23, S02E23 nebo 2.23." #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Poznámka: Tento nástroj na stahování informací používá Last.fm API, ale není " "schválen ani certifikován Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Poznámka: Tento nástroj na stahování informací používá TMDb API, ale není " "schválen ani certifikován TMDb API." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Poznámka: Tento nástroj na stahování informací používá theTVDB.com API. " "Prosím, pomozte vylepšit informace na theTVDB.com kliknutím na odkaz." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Umělci" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Alba" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Žánry" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Seznam stop" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 umělec" msgstr[1] "%1 umělci" msgstr[2] "%1 umělců" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 album" msgstr[1] "%1 alba" msgstr[2] "%1 alb" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 žánr" msgstr[1] "%1 žánry" msgstr[2] "%1 žánrů" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Seznam stop" msgstr[1] "Seznam stop" msgstr[2] "Seznam stop" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 skladba" msgstr[1] "%1 skladby" msgstr[2] "%1 skladeb" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 klip" msgstr[1] "%1 klipy" msgstr[2] "%1 klipů" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 proud" msgstr[1] "%1 proudy" msgstr[2] "%1 proudů" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Nový zvukový proud" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Zadat údaje pro vytvoření nového zvukového proudu" #: platform/listengines/cdlistengine.cpp:88 #, fuzzy, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Zvukové CD - %1 skladby" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 skladba" msgstr[1] "%1 skladby" msgstr[2] "%1 skladeb" #: platform/listengines/dvdlistengine.cpp:91 #, fuzzy, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "Video DVD - %1 tituly" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Bez názvu" msgstr[1] "Bez názvu" msgstr[2] "Bez názvu" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Nový zvukový kanál" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Zadat údaje pro vytvoření nového zvukového kanálu" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, fuzzy, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 žánr" msgstr[1] "%1 žánry" msgstr[2] "%1 žánrů" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Nový video kanál" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Zadat údaje pro vytvoření nového video kanálu" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Načítám informace o souboru..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Načítám informace (%1 souborů)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Nedávno hrané" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Skladby" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Klipy" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Zvukové proudy" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Zvukové kanály" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Soubory a adresáře" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Herci" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Režiséři" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Filmy" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Nedávno sledované" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Často sledované" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Seriály" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Video klipy" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Video kanály" #: platform/listengines/musiclistengine.cpp:149 #, fuzzy, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Umělci - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Všechny skladby" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Alba - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Alba - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "přehráno jednou" msgstr[1] "přehráno %1-krát" msgstr[2] "přehráno %1-krát" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, fuzzy, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 skladba" msgstr[1] "%1 skladby" msgstr[2] "%1 skladeb" #: platform/listengines/videolistengine.cpp:141 #, fuzzy, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Filmy - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 film" msgstr[1] "%1 filmy" msgstr[2] "%1 filmů" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Nesetříděné seriály" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 seriál" msgstr[1] "%1 seriály" msgstr[2] "%1 seriálu" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Nesetříděné série" #: platform/listengines/videolistengine.cpp:390 #, fuzzy, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Série - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 série" msgstr[1] "%1 série" msgstr[2] "%1 sérií" #: platform/listengines/videolistengine.cpp:473 #, fuzzy, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Série %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Nesetříděné série" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 epizoda" msgstr[1] "%1 epizody" msgstr[2] "%1 epizod" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 herec" msgstr[1] "%1 herci" msgstr[2] "%1 herců" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 režisér" msgstr[1] "%1 režiséři" msgstr[2] "%1 režisérů" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "adresář" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "před rokem" msgstr[1] "před %1 lety" msgstr[2] "před %1 lety" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "před měsícem" msgstr[1] "před %1 měsíci" msgstr[2] "před %1 měsíci" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "před týdnem" msgstr[1] "před %1 týdny" msgstr[2] "před %1 týdny" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "včera" msgstr[1] "před %1 dny" msgstr[2] "před %1 dny" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "před hodinou" msgstr[1] "před %1 hodinami" msgstr[2] "před %1 hodinami" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "před minutou" msgstr[1] "před %1 minutami" msgstr[2] "před %1 minutami" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "před několika sekundami" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Titul %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Celý disk" #: platform/utilities/mediaitems.cpp:1421 #, fuzzy, kde-format msgid "Season %1" msgstr "Sezóna %1" #: platform/utilities/mediaitems.cpp:1429 #, fuzzy, kde-format msgid "Episode %1" msgstr "Epizoda" #: platform/utilities/mediaitems.cpp:1435 #, fuzzy, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Sezóna %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" #, fuzzy #~ msgid "Showing Information
Click to hide information." #~ msgstr "Zobrazit následující
Click to show playlist" #~ msgid "A Media Player" #~ msgstr "Přehrávač médií" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Podrobnosti" #, fuzzy #~ msgid "Description:%1" #~ msgstr "Popis" #, fuzzy #~ msgid "Show video Settings" #~ msgstr "Zobrazit nastavení videa" #, fuzzy #~ msgid "Show audio Settings" #~ msgstr "Zobrazit nastavení videa" #, fuzzy #~ msgid "Last played: %1" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Not Playing" #~ msgstr "Přehrává se" #, fuzzy #~ msgid "results" #~ msgstr "Žádné výsledky" #, fuzzy #~ msgid "Titles" #~ msgstr "Název" #, fuzzy #~ msgid "Audio Channels" #~ msgstr "Zvukový klip" #, fuzzy #~ msgid "episodeNumber" #~ msgstr "1 epizoda" #~ msgid "Configure shortcuts..." #~ msgstr "Nastavit klávesové zkratky" #, fuzzy #~ msgid "Show video vettings" #~ msgstr "Zobrazit nastavení videa" #~ msgid "Updating..." #~ msgstr "Aktualizace..." #, fuzzy #~ msgid "Updated info for %1, %2" #~ msgstr "Upraveny podrobnosti pro " #, fuzzy #~ msgid "Removed info for %1" #~ msgstr "Odstraněny podrobnosti pro " #~ msgid "Hue" #~ msgstr "Odstín" #~ msgid "Track %1" #~ msgstr "Skladba %1" #, fuzzy #~ msgctxt "%1=Title of DVD" #~ msgid "DVD Video - %1" #~ msgstr "Video DVD - %1 tituly" #, fuzzy #~ msgid "Index audio file(s)" #~ msgstr "Otevřít zvukové soubory" #, fuzzy #~ msgid "Index folder containing audio file(s)" #~ msgstr "Otevřít složku obsahující zvukové soubory" #, fuzzy #~ msgid "Index video file(s)" #~ msgstr "Otevřít video soubory" #, fuzzy #~ msgid "Index folder containing video file(s)" #~ msgstr "Otevřít složku obsahující video soubory" #~ msgid "Audio Files" #~ msgstr "Zvukové soubory" #~ msgid "Video Files" #~ msgstr "Video soubory" #, fuzzy #~ msgid "Recently Played Artists" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Highest Rated Artists" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Played Artists" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Recently Played Albums" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Highest Rated Albums" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Played Albums" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Recently Played Genres" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Highest Rated Genres" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Played Genres" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Recently Played Clips" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Highest Rated Clips" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Played Clips" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Recently Played Streams" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Highest Rated Streams" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Played Streams" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Recently Played Tags" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Highest Rated Tags" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Played Tag" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Recently Watched Movies" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Highest Rated Movies" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Watched Movies" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Recently Watched TV Shows" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Highest Rated TV Shows" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Watched TV Shows" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Recently Watched Genres" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Frequently Watched Genres" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Recently Watched Actors" #~ msgstr "Nedávno hrané" #, fuzzy #~ msgid "Highest Rated Actors" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Watched Actors" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Highest Rated Directors" #~ msgstr "Nejlepší hodnocení" #, fuzzy #~ msgid "Frequently Watched Directors" #~ msgstr "Často hrané" #, fuzzy #~ msgid "Add selected info" #~ msgstr "Odstranit vybrané informace" #, fuzzy #~ msgid "Search in playlist..." #~ msgstr "Načítání seznamu stop..." #~ msgid "Toggle fullscreen" #~ msgstr "Celá obrazovka" #~ msgid "03:00" #~ msgstr "03:00" #~ msgid "Untitled Audio Stream" #~ msgstr "Nepojmenovaný zvukový proud" #~ msgid "Select this item, click Info then Edit to enter audio stream info" #~ msgstr "" #~ "Označte položku, klikněte na Podrobnosti a poté Upravit pro vložení " #~ "podrobností o proudu" #~ msgid "Open image file(s)" #~ msgstr "Otevřít obrázky" #~ msgid "Open folder containing image file(s)" #~ msgstr "Otevřít složku obsahující obrázky" #, fuzzy #~ msgid "%1" #~ msgstr "1" #~ msgid "Edit" #~ msgstr "Upravit" #, fuzzy #~ msgid "Saving..." #~ msgstr "Načítání..." #~ msgid "Track Number" #~ msgstr "Číslo stopy" #~ msgid "Sort" #~ msgstr "Setřídit" #~ msgid "2" #~ msgstr "2" bangarang-bangarang/po/da/000077500000000000000000000000001166760560600157335ustar00rootroot00000000000000bangarang-bangarang/po/da/CMakeLists.txt000066400000000000000000000001641166760560600204740ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( da ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/da/bangarang.po000066400000000000000000002160671166760560600202270ustar00rootroot00000000000000# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Martin Schlander , 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2010-04-07 21:43+0200\n" "Last-Translator: Martin Schlander \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.0\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Martin Schlander" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "mschlander@opensuse.org" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Tilføj liste" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Fjern liste" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Indstillinger" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Tilføj liste" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Kilde" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Aktuel visning" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Aktuel markering" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Aktuel spilleliste" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Navn på ny liste" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Navn" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Gem" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Returnér til lister" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Gemte listeindstillinger" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Navn" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Listetitel" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 #, fuzzy msgid "Show" msgstr "Tv-program" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 #, fuzzy msgid "items" msgstr "1 element" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 #, fuzzy msgid "played" msgstr "Afspil næste" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Medielister" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Søg efter lyd" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Lyd" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Video" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Vis afspiller nu" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Afspiller nu" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Oversigt" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 #, fuzzy msgid "Filter" msgstr "Tilpas" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Annullér redigering" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 #, fuzzy msgid "Index Selected" msgstr "Afspil markerede" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Bekendtgørelsestekst" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Forrige" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Afspil alle medier i listen" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Afspil alle" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Afspil markerede medier i listen" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Afspil markerede" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Spilleliste" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Vis kommende" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Spilleliste" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Ryd spilleliste" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Slå gentag til" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Slå tilfældig til" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 #, fuzzy msgid "Notification" msgstr "Bekendtgørelsestekst" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 #, fuzzy msgid "Audio Settings" msgstr "Videoindstillinger" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 #, fuzzy msgid "Audio Channel:" msgstr "Lydklip" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Gendan standardindstillinger" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Skjul" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Videoindstillinger" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 #, fuzzy msgid "Brightness:" msgstr "Lysstyrke" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 #, fuzzy msgid "Contrast:" msgstr "Kontrast" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 #, fuzzy msgid "Saturation:" msgstr "Mætning" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 #, fuzzy msgid "Aspect Ratio" msgstr "Indstilling af aspektforhold" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automatisk" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Tilpas" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 #, fuzzy msgid "Scaling" msgstr "Skaleringstilstand" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Skalér til at passe" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Skalér og beskær" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 #, fuzzy msgid "Shortcuts" msgstr "Gem genveje" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Gem genveje" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Annullér" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Vis medielister" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Vis fuldskærm" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Forløbet tid
Klik for at vise tilbageværende tid" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Sæt på lydløs" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Lydstyrke" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Returnér til lister" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "" #: app/main.cpp:31 #, fuzzy msgid "Copyright 2011, Andrew Lake" msgstr "Ophavsret 2010, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Ophavsmand" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Bidragsyder" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Fejl kan rapporteres på http://code.google.com/p/bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Fejl kan rapporteres på Bangarangs problemstyring" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Afspil \"URL\"" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Afspil dvd-video" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Afspil musik-cd" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Vis yderligere fejlsøgningsoutput" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Afslut" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "" #: app/common/actionsmanager.cpp:77 #, fuzzy msgid "Play" msgstr "Afspil alle" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Afspil næste" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Afspil forrige" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Afspil alle" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Afspil markerede" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Føj til spilleliste" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 #, fuzzy msgid "Add after Now Playing" msgstr "Vis afspiller nu" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Fjern fra spilleliste" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Skjul kontroller" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 #, fuzzy msgid "Show filter" msgstr "Vis elementer" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 #, fuzzy msgid "Show video settings" msgstr "Vis videoindstillinger" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 #, fuzzy msgid "Show audio settings" msgstr "Vis videoindstillinger" #: app/common/actionsmanager.cpp:164 #, fuzzy msgid "Fullscreen" msgstr "Vis fuldskærm" #: app/common/actionsmanager.cpp:177 #, fuzzy msgid "Save selected info" msgstr "Fjern markeret info" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Fjern markeret info" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Genopfrisk" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Fjern fra liste" #: app/common/actionsmanager.cpp:205 #, fuzzy msgid "Add to \"Audio Streams\"" msgstr "Lydstreams" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Føj til liste" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Føj til liste " #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Ny liste" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Vis elementer" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 #, fuzzy msgid "Show information" msgstr "Information" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 #, fuzzy msgid "Show Info View" msgstr "Information" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "" #: app/common/actionsmanager.cpp:252 #, fuzzy msgid "Remove bookmarks" msgstr "Fjern fra liste" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 #, fuzzy msgid "Show shortcuts editor" msgstr "Gem genveje" #: app/common/actionsmanager.cpp:263 #, fuzzy msgid "Update ontologies..." msgstr "Opdaterer..." #: app/common/actionsmanager.cpp:268 #, fuzzy msgid "Hide in system tray" msgstr "Videofiler" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 #, fuzzy msgid "Hide Info View" msgstr "Videofiler" #: app/common/actionsmanager.cpp:417 #, fuzzy msgid "Play after Now Playing" msgstr "Vis afspiller nu" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 #, fuzzy msgid "Hide information" msgstr "Information" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "" #: app/common/actionsmanager.cpp:597 #, fuzzy msgid "Show Controls" msgstr "Vis info" #: app/common/actionsmanager.cpp:601 #, fuzzy msgid "Hide Controls" msgstr "Skjul kontroller" #: app/common/actionsmanager.cpp:615 #, fuzzy msgid "Hide video settings" msgstr "Skjul videoindstillinger" #: app/common/actionsmanager.cpp:638 #, fuzzy msgid "Hide audio settings" msgstr "Skjul videoindstillinger" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "" #: app/common/actionsmanager.cpp:743 #, fuzzy msgid "Restore Volume" msgstr "Sæt på lydløs" #: app/common/actionsmanager.cpp:903 #, fuzzy msgid "Restore video size" msgstr "Sæt på lydløs" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "" #: app/common/actionsmanager.cpp:1049 #, fuzzy msgid "Close" msgstr "Klip" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 #, fuzzy msgid "Hide filter" msgstr "Videofiler" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Vis videoindstillinger" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Vis videoindstillinger" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang kan ikke tilgå Nepomuk Semantisk desktop-depotet. Funktioner til " "mediebibliotek, vurdering, afspilningstæller vil ikke være tilgængelige." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Vis ikke denne meddelelse igen" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "Dvd-video" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "Lyd-cd" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Fuldskærm
Klik for at afslutte fuldskærm" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Vis fuldskærm" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Føj til spilleliste/fjern fra spilleliste" #: app/common/mediaview.cpp:146 #, fuzzy msgid "Show Songs" msgstr "Vis info" #: app/common/mediaview.cpp:148 #, fuzzy msgid "Show Albums" msgstr "Albummer" #: app/common/mediaview.cpp:150 #, fuzzy msgid "Show Artists" msgstr "Kunstnere" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Musik" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Lydstream" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Lydklip" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Film" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "Tv-program" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Videoklip" #: app/medialists/infoitemdelegate.cpp:154 #, fuzzy msgid "No description" msgstr "Beskrivelse" #: app/medialists/infoitemdelegate.cpp:163 #, fuzzy msgid "Multiple Values" msgstr "Flere %1" #: app/medialists/infoitemdelegate.cpp:466 #, fuzzy msgid "Open artwork file" msgstr "Åbn lydfiler" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "" #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Søg efter video" #: app/medialists/medialistsmanager.cpp:402 #, fuzzy msgid "Audio Search" msgstr "Lydstream" #: app/medialists/medialistsmanager.cpp:409 #, fuzzy msgid "Video Search" msgstr "Videoindstillinger" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Gennemført" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 #, fuzzy msgid "Untitled" msgstr "Titel" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 #, fuzzy msgid "Remove" msgstr "Fjern liste" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, fuzzy, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Vil du virkelig rydde den aktuelle spilleliste?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "" #: app/nowplaying/audiosettings.cpp:100 #, fuzzy msgid "Dance" msgstr "Annullér" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:302 #, fuzzy msgid "Artist: " msgstr "Kunstner" #: app/nowplaying/nowplayingdelegate.cpp:314 #, fuzzy msgid "Composer: " msgstr "Gennemført" #: app/nowplaying/nowplayingdelegate.cpp:326 #, fuzzy msgid "Album: " msgstr "Album" #: app/nowplaying/nowplayingdelegate.cpp:338 #, fuzzy msgid "Track: " msgstr "Spor %1" #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 #, fuzzy msgid "Year: " msgstr "År" #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 #, fuzzy msgid "Genre: " msgstr "Genre" #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 msgid "Tags: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:405 #, fuzzy msgid "Actor: " msgstr "Skuespille" #: app/nowplaying/nowplayingdelegate.cpp:417 #, fuzzy msgid "Director: " msgstr "Instruktør" #: app/nowplaying/nowplayingdelegate.cpp:429 #, fuzzy msgid "Writer: " msgstr "Forfatter" #: app/nowplaying/nowplayingdelegate.cpp:441 #, fuzzy msgid "Producer: " msgstr "Producent" #: app/nowplaying/nowplayingmanager.cpp:110 #, fuzzy msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "Tilbageværende tid
Klik for at vise forløbet tid" #: app/nowplaying/nowplayingmanager.cpp:112 #, fuzzy msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "Forløbet tid
Klik for at vise tilbageværende tid" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Pause
Hold inde for at stoppe" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Underholdning... Nu" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "Viser kommende
Klik for at vise spilleliste" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "Afspiller
Klik for pause
klik og hold for at stoppe" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "En fejl opstod under afspilning" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Indlæser spilleliste..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Opbygger buffer..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Indlæser..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Lydløs
Klik for at genskabe lydstyrke" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Gentag til
Klik for at slå gentag fra" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Tilfældig til
Klik for at slå tilfældig fra" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Vil du virkelig rydde den aktuelle spilleliste?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 element, %2" msgstr[1] "%1 elementer, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 element" msgstr[1] "%1 elementer" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Spilleliste (kommende)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Type" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Grafik" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Titel" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Kunstner" #: platform/infoitemmodel.cpp:83 #, fuzzy msgid "Composer" msgstr "Gennemført" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Album" #: platform/infoitemmodel.cpp:85 #, fuzzy msgid "Track" msgstr "Spor %1" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "År" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Genre" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Placering" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Skuespille" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Instruktør" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Forfatter" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Producent" #: platform/infoitemmodel.cpp:95 #, fuzzy msgid "Series" msgstr "Serienavn" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Sæson" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Afsnit" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "" #: platform/infoitemmodel.cpp:99 #, fuzzy msgid "Play Count" msgstr "Afspil næste" #: platform/infoitemmodel.cpp:100 #, fuzzy msgid "Last Played" msgstr "%1 - senest afspillet: %2" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "" msgstr[1] "" #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "" msgstr[1] "" #: platform/infoitemmodel.cpp:563 #, fuzzy msgid "No Results" msgstr "Ingen resultater" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 #, fuzzy msgid "Recently Played Songs" msgstr "Nyligt afspillet" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 #, fuzzy msgid "Highest Rated Songs" msgstr "Højest vurderet" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 #, fuzzy msgid "Frequently Played Songs" msgstr "Hyppigt afspillet" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Nyligt afspillet" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Højest vurderet" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Hyppigt afspillet" #: platform/infoitemmodel.cpp:1191 #, fuzzy msgid "Fetch Canceled" msgstr "Annullér" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "" #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "" #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 #, fuzzy msgid "Multiple" msgstr "Flere %1" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Flere %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Ingen resultater" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" #: platform/ontologyupdater.cpp:385 #, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" #: platform/ontologyupdater.cpp:413 #, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "" #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "" #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Videoindstillinger" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" #: platform/infofetchers/feedinfofetcher.cpp:35 #, fuzzy msgid "Feed Info" msgstr "Info" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "" #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 #, fuzzy msgid "Artists" msgstr "Kunstner" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 #, fuzzy msgid "Albums" msgstr "Album" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Genrer" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Spilleliste" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 kunstner" msgstr[1] "%1 kunstnere" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 album" msgstr[1] "%1 albummer" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 genre" msgstr[1] "%1 genrer" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Spilleliste" msgstr[1] "Spilleliste" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 sang" msgstr[1] "%1 sange" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 klip" msgstr[1] "%1 klip" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 stream" msgstr[1] "%1 streams" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Ny lydstream" #: platform/listengines/audiostreamlistengine.cpp:99 #, fuzzy msgid "Edit info to create new audio stream" msgstr "Opret nyt audiostream-element" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Lyd-cd - %1 spor" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 spor" msgstr[1] "%1 spor" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "Dvd-video - %1 titler" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Titel" msgstr[1] "Titel" #: platform/listengines/feedlistengine.cpp:111 #, fuzzy msgid "New audio feed" msgstr "Ny lydstream" #: platform/listengines/feedlistengine.cpp:112 #, fuzzy msgid "Edit info to create new audio feed" msgstr "Opret nyt audiostream-element" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, fuzzy, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 genre" msgstr[1] "%1 genrer" #: platform/listengines/feedlistengine.cpp:173 #, fuzzy msgid "New video feed" msgstr "Åbn videofiler" #: platform/listengines/feedlistengine.cpp:174 #, fuzzy msgid "Edit info to create new video feed" msgstr "Opret nyt audiostream-element" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "" #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "" #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Nyligt afspillet" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Sange" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Klip" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Lydstreams" #: platform/listengines/medialistsengine.cpp:165 #, fuzzy msgid "Audio Feeds" msgstr "Lydfiler" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Filer og mapper" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 #, fuzzy msgid "Actors" msgstr "Skuespille" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 #, fuzzy msgid "Directors" msgstr "Instruktør" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Film" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 #, fuzzy msgid "Recently Watched" msgstr "Nyligt afspillet" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 #, fuzzy msgid "Frequently Watched" msgstr "Hyppigt afspillet" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Tv-programmer" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Videoklip" #: platform/listengines/medialistsengine.cpp:356 #, fuzzy msgid "Video Feeds" msgstr "Videofiler" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Kunstnere - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 #, fuzzy msgid "All songs" msgstr "1 sang" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Albummer - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Albummer - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, fuzzy, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "Afspil næste" msgstr[1] "Afspil næste" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, fuzzy, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 spor" msgstr[1] "%1 spor" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Film - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 film" msgstr[1] "%1 film" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Ikke-kategoriserede tv-programmer" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 program" msgstr[1] "%1 programmer" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Ikke-kategoriserede sæsoner" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Sæsoner - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 sæson" msgstr[1] "%1 sæsoner" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - sæson %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Ikke-kategoriserede sæsoner" #: platform/listengines/videolistengine.cpp:477 #, fuzzy, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "Afsnit" msgstr[1] "Afsnit" #: platform/listengines/videolistengine.cpp:593 #, fuzzy, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "Skuespille" msgstr[1] "Skuespille" #: platform/listengines/videolistengine.cpp:662 #, fuzzy, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "Instruktør" msgstr[1] "Instruktør" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Titel %1" #: platform/utilities/mediaitems.cpp:117 #, fuzzy msgid "Full Disc" msgstr "Vis fuldskærm" #: platform/utilities/mediaitems.cpp:1421 #, fuzzy, kde-format msgid "Season %1" msgstr "Sæson %1" #: platform/utilities/mediaitems.cpp:1429 #, fuzzy, kde-format msgid "Episode %1" msgstr "Afsnit" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Sæson %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #, fuzzy #~ msgid "Showing Information
Click to hide information." #~ msgstr "Viser kommende
Klik for at vise spilleliste" #~ msgid "A Media Player" #~ msgstr "En medieafspiller" #~ msgid "Buschmann" #~ msgstr "Buschmann" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Kristof Bal" #~ msgstr "Kristof Bal" #~ msgid "Ryan Kavanagh" #~ msgstr "Ryan Kavanagh" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Info" #, fuzzy #~ msgid "Description:%1" #~ msgstr "Beskrivelse" #, fuzzy #~ msgid "Show video Settings" #~ msgstr "Vis videoindstillinger" #, fuzzy #~ msgid "Show audio Settings" #~ msgstr "Vis videoindstillinger" #, fuzzy #~ msgid "Last played: %1" #~ msgstr "%1 - senest afspillet: %2" #~ msgid "Playback message" #~ msgstr "Afspilningsbesked" #, fuzzy #~ msgid "Not Playing" #~ msgstr "Afspiller nu" #~ msgid "Shuizhuyuanluo" #~ msgstr "Shuizhuyuanluo" #, fuzzy #~ msgid "results" #~ msgstr "Ingen resultater" #, fuzzy #~ msgid "Titles" #~ msgstr "Titel" #, fuzzy #~ msgid "Audio Channels" #~ msgstr "Lydklip" #, fuzzy #~ msgid "episodeNumber" #~ msgstr "1 afsnit" #~ msgid "Configure shortcuts..." #~ msgstr "Indstil genveje..." #, fuzzy #~ msgid "Show video vettings" #~ msgstr "Vis videoindstillinger" #~ msgid "Updating..." #~ msgstr "Opdaterer..." #~ msgid "Updated info for %1, %2" #~ msgstr "Opdaterede info for %1, %2" #~ msgid "Removed info for %1" #~ msgstr "Fjernede info for %1" #~ msgid "Hue" #~ msgstr "Farvetone" #~ msgid "Track %1" #~ msgstr "Spor %1" #, fuzzy #~ msgctxt "%1=Title of DVD" #~ msgid "DVD Video - %1" #~ msgstr "Dvd-video - %1 titler" #, fuzzy #~ msgid "Index audio file(s)" #~ msgstr "Åbn lydfiler" #, fuzzy #~ msgid "Index folder containing audio file(s)" #~ msgstr "Åbn mappe med lydfiler" #, fuzzy #~ msgid "Index video file(s)" #~ msgstr "Åbn videofiler" #, fuzzy #~ msgid "Index folder containing video file(s)" #~ msgstr "Åbn mappe med videofiler" #~ msgid "Audio Files" #~ msgstr "Lydfiler" #~ msgid "Video Files" #~ msgstr "Videofiler" #, fuzzy #~ msgid "Recently Played Artists" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Highest Rated Artists" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Played Artists" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Recently Played Albums" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Highest Rated Albums" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Played Albums" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Recently Played Genres" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Highest Rated Genres" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Played Genres" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Recently Played Clips" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Highest Rated Clips" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Played Clips" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Recently Played Streams" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Highest Rated Streams" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Played Streams" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Recently Played Tags" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Highest Rated Tags" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Played Tag" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Recently Watched Movies" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Highest Rated Movies" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Watched Movies" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Recently Watched TV Shows" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Highest Rated TV Shows" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Watched TV Shows" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Recently Watched Genres" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Frequently Watched Genres" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Recently Watched Actors" #~ msgstr "Nyligt afspillet" #, fuzzy #~ msgid "Highest Rated Actors" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Watched Actors" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Highest Rated Directors" #~ msgstr "Højest vurderet" #, fuzzy #~ msgid "Frequently Watched Directors" #~ msgstr "Hyppigt afspillet" #, fuzzy #~ msgid "Add selected info" #~ msgstr "Fjern markeret info" #, fuzzy #~ msgid "Search in playlist..." #~ msgstr "Indlæser spilleliste..." #~ msgid "Toggle fullscreen" #~ msgstr "Slå fuldskærm til/fra" #~ msgid "Untitled Audio Stream" #~ msgstr "Unavngiven lydstream" #~ msgid "Select this item, click Info then Edit to enter audio stream info" #~ msgstr "" #~ "Vælg dette element, klik på Info og så Redigér for at angive lydstream-" #~ "info" #~ msgid "Open image file(s)" #~ msgstr "Åbn billedfiler" #~ msgid "Open folder containing image file(s)" #~ msgstr "Åbn mappe med billedfiler" #, fuzzy #~ msgid "List of Tags" #~ msgstr "Kristof Bal" #, fuzzy #~ msgid "%1" #~ msgstr "1" #~ msgid "Edit" #~ msgstr "Redigér" #~ msgid "Saving..." #~ msgstr "Gemmer..." #~ msgid "Track Number" #~ msgstr "Spornummer" #~ msgid "Sort" #~ msgstr "Sortér" #~ msgid "2" #~ msgstr "2" #~ msgid "%1 - Played %2 times" #~ msgstr "%1 - afspillet %2 gange" bangarang-bangarang/po/de/000077500000000000000000000000001166760560600157375ustar00rootroot00000000000000bangarang-bangarang/po/de/CMakeLists.txt000066400000000000000000000001641166760560600205000ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( de ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/de/bangarang.po000066400000000000000000002315231166760560600202250ustar00rootroot00000000000000# This is the german translation of bangarang. # Copyright (C) 2009 bangarang-project # This file is distributed under the same license as the bangarang package. # # Andreas Marschke , 2009. # Panagiotis Papadopoulos , 2010. # Moritz N. , 2010. # Stefan Burnicki , 2010, 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-01-24 19:26+0100\n" "Last-Translator: Stefan Burnicki\n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" "X-Language: de_DE\n" "X-Source-Language: en\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Panagiotis Papadopoulos" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "pano_90@gmx.net" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Liste hinzufügen" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Von Wiedergabeliste entfernen" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Einstellungen" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Liste hinzufügen von" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Quelle" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Aktuelle Ansicht" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Aktuelle Auswahl" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Aktuelle Wiedergabeliste" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Neuer Listenname" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Name" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Speichern" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Zu Playlisten zurückkehren" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Einstellungen für gespeicherte Playlisten" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Name" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Playlist-Titel" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Einblenden" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "Elemente" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "wiedergegeben" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "vor" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "nach" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "oder mehr" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "genau" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "oder weniger" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "mal" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Medienlisten" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Nach Audiodateien suchen" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Audio" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Video" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Aktuelle Wiedergabe anzeigen" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Wiedergabe" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Zusammenfassung" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "…" #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Filter" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Zusätzliche Informationen könnten verfügbar sein von:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Informationen beziehen und Änderungen editieren" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Informationen beziehen und Änderungen speichern" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Treffer" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Editieren abbrechen" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Ausgewähltes Indizieren" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Benachrichtigungstext" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Vorher" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Ganze Liste abspielen" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Alle abspielen" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Ausgewählte Titel abspielen" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Auswahl abspielen" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Externe Untertitel" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Wiedergabeliste" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Fehlermeldung" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Nächste Titel Anzeigen" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Wiedergabeliste" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Wiedergabeliste leeren" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Wiederholen aktivieren" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Zufallswiedergabe aktivieren" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Benachrichtigung" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Ja" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Nein" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Audio Einstellungen" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Audio Kanal:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Equalizer" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Voreinstellungen" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Pre" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Voreinstellungen wiederherstellen" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Ausblenden" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Videoeinstellungen" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Untertitel:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Blickwinkel:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Helligkeit:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Kontrast:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Farbton:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Sättigung:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Seitenverhältnis" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automatisch" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Einpassen" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Skalierung:" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "In den Bildschirm einpassen" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Skalieren und zuschneiden" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Kurzbefehle" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Kurzbefehle speichern" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Abbrechen" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Zeige Medienlisten" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Vollbild anzeigen" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "" "Verstrichene Zeit
Klicken, um die verbleibende Zeit anzuzeigen" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Stummschaltung" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Lautstärke" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Zu Playlisten zurückkehren" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Ein Medienwiedergabe Programm für deinen KDE Desktop" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2011, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Anmerkung: Dieses Produkt verwendet die TMDb API, wird aber nicht von " "TMDbunterstützt oder zertifiziert. Bitte helfen Sie die verfügbaren " "Informationen zu verbessern in dem Sie http://themoviedb.org besuchen." "
Anmerkung: Dieses Produkt verwendet die Last.fm API, wird aber " "nicht von Last.fm unterstützt oder zertifiziert. Bitte helfen Sie die " "verfügbaren Informationen zu verbessern in dem Sie http://last.fm besuchen." "
Anmerkung: Dieses Produkt verwendet die TheTVDB.com API, wird " "aber nicht von TheTVDB.comunterstützt oder zertifiziert. Bitte helfen Sie " "die verfügbaren Informationen zu verbessern in dem Sie http://thetvdb.com " "besuchen." #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Ersteller" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Entwickler" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Melden Sie Fehlerberichte für Bangarang bitte hier: http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Bitte senden Sie Fehlerberichte an den Bangarang Issue Tracker" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "URL abspielen" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Video-DVD abspielen" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Musik-CD abspielen" # @TODO This one really isnt well #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Zusätzliche Debugausgabe anzeigen" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Schließen" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Wiedergabe/Pause" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Wiedergabe" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Pause" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Nächstes abspielen" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Vorheriges abspielen" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Stummschalten" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Alle abspielen" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Auswahl abspielen" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Zur Wiedergabeliste hinzufügen" # very strange translation #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Nach dem momentan Spielenden hinzufügen" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Von Wiedergabeliste entfernen" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Steuerelemente ausblenden" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Filter anzeigen" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Verbleibende Zeit anzeigen" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Videoeinstellungen anzeigen" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Audioeinstellungen anzeigen" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Vollbild" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Ausgewählte Informationen speichern" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Ausgewählte Informationen entfernen" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Aktualisieren" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Von Wiedergabeliste entfernen" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Zu \"Audiostreams\" hinzufügen" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Zur Wiedergabeliste hinzufügen" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Zur Wiedergabeliste hinzufügen" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Neue Liste" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Elemente anzeigen" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Information anzeigen" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Informations-Bereich anzeigen" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Lesezeichen hinzufügen" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Lesezeichen entfernen" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Kurzbefehl-Editor anzeigen" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Aktualisiere Ontologie..." # Sounds strange #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "In Systemabschnitt der Kontrolleiste minimieren" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Informationen verwalten" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Informations-Bereich verstecken" # Very strange translation #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Nach dem momentan Spielenden wiedergeben" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Informationen verstecken" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Kapitel %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Steuerelemente anzeigen" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Steuerelemente ausblenden" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Videoeinstellungen ausblenden" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Audioeinstellungen ausblenden" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Kurzbefehl-Editor verstecken" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Lautstärke wiederherstellen" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Videogröße wiederherstellen" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Verbleibende Zeit anzeigen" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Lesezeichen-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Ontologien aktualisieren" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Eine Aktualisierung der Ontologien versichert, dass die Medien Informationen " "so gespeichert werden, dass auch andere Desktop Anwendungen bestmöglichen " "Zugriff darauf haben und diese Informationen nutzen können. Dies ist nur " "nötig, wenn Sie kürzlich Bangarang oder ihr KDE System aktualisiert haben." "

Dies könnte einige Minuten dauern..." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Stoppen" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Schließen" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Filter ausblenden" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Videoeinstellungen anzeigen" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Videoeinstellungen anzeigen" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang kann nicht auf Nepomuk, den semantischen Desktop-Dienst, " "zugreifen. Medienbibliothek, Bewertung und Wiedergabe-Statistik werden nicht " "verfügbar sein." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Diese Meldung nicht mehr anzeigen" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Fortsetzen" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "Video-DVD" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "Audio-CD" # @TODO feels fishy!! #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Vollbild
Klicken Sie hier, um den Vollbildmodus zu verlassen" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Vollbild anzeigen" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Zur Wiedergabeliste hinzufügen / Von Wiedergabeliste entfernen" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Lieder anzeigen" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Alben anzeigen" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Interpreten anzeigen" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Musik" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Audiostream" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Audio-Clip" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Film" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "TV-Show" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Video-Clip" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Keine Beschreibung" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Mehrere Werte" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Cover-Datei öffnen" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr " drücken um das Editieren zu beenden." # strange #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Klicken Sie um es zu verstecken" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "Zusätzliche Informationen könnten verfügbar sein.
Für weiteres klicken " "Sie hier..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "bewertet" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Nach Videodateien suchen" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Audio Suche" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Video Suche" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Vollständig" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Unbenannt" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Entfernen" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Sind Sie sich sicher, dass \"%1\" entfernt werden soll?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Kein Effekt" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rock" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Reggae" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Dance" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Live" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Klassische Musik" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Blockbuster" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Dokumentation" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Drama" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Manuell" #: app/nowplaying/nowplayingdelegate.cpp:302 #, fuzzy msgid "Artist: " msgstr "Interpret: " #: app/nowplaying/nowplayingdelegate.cpp:314 #, fuzzy msgid "Composer: " msgstr "Komponist: " #: app/nowplaying/nowplayingdelegate.cpp:326 #, fuzzy msgid "Album: " msgstr "Album: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Stück: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 #, fuzzy msgid "Year: " msgstr "Jahr: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 #, fuzzy msgid "Genre: " msgstr "Genre: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Schlagworte" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Schauspieler: " #: app/nowplaying/nowplayingdelegate.cpp:417 #, fuzzy msgid "Director: " msgstr "Regisseur: " #: app/nowplaying/nowplayingdelegate.cpp:429 #, fuzzy msgid "Writer: " msgstr "Autor: " #: app/nowplaying/nowplayingdelegate.cpp:441 #, fuzzy msgid "Producer: " msgstr "Produzent: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Verbleibende Zeit
Klicken, um die verstrichene Zeit anzuzeigen" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Verstrichene Zeit
Klicken, um die verbleibende Zeit anzuzeigen" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "PauseGedrückt halten, um zu stoppen" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Unterhaltung… Jetzt" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "" "Zeigt die nächsten Titel an
Klicken, um die Playlist anzuzeigen" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Wiedergabe
Klicken, um zu pausieren
Klicken und gedrückt " "halten, um zu stoppen" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Beim Abspielen ist ein Fehler aufgetreten." #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Wiedergabeliste wird geladen …" #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Puffern…" #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Ladevorgang läuft …" #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "StummKlicken, um den Ton einzuschalten" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Wiederholen An
Hier klicken, um Wiederholen zu deaktivieren" # @TODO feels fishy!! #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "" "Zufallswiedergabe aktiviert
Klicken, um die Zufallswiedergabe zu " "deaktivieren" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Möchten Sie die aktuelle Wiedergabeliste wirklich leeren?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 Element, %2" msgstr[1] "%1 Elemente, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 Element" msgstr[1] "%1 Elemente" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Wiedergabeliste (Nächste)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Ausschalten" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Typ" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Titelbild" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Titel" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Interpret" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Komponist" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Album" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Stück" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Jahr" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Genre" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Schlagworte" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Ort" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Schauspieler" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Regisseur" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Autor" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Produzent" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Serienname" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Staffel" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Episode" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Links" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Wiedergabezähler" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Letzte Wiedergabe" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Beziehe Informationen für %1 Element..." msgstr[1] "Beziehe Informationen für %1 Elemente..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Informationen für %2 von 1 Element bezogen..." msgstr[1] "Informationen für %2 von %1 Elementen bezogen..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Keine Ergebnisse" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Vor kurzem gespielte Lieder" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Am höchsten bewertete Lieder" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Oft gespielte Lieder" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Vor kurzem gespielt" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Höchste Bewertung" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Oft gespielt" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Bezug abgebrochen" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Starte Aktualisierung..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Aktualisiert: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Entferne Informationen..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Mehrere" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Mehrere %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Keine Ergebnisse" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Aktualisiere Audio Typen und Eigenschaften
0 Elemente " "aktualisiert..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "Aktualisiere Audio Typen und Eigenschaften
%1 Audio Elemente " "fertig..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "Aktualisiere Video Typen und Eigenschaften
%1 Video Elemente " "fertig..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "Aktualisiere Audio Typen und Eigenschaften
%1 Audio Elemente " "fertig..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" "Aktualisiere Video Typen und Eigenschaften
%1 Video Elemente " "fertig..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Aktualisierung komplett." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Aktualisierung angehalten." #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Video Suche" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Dieser Dienst bezieht Informationen von DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Anmerkung: Dieser Bezugsdienst verwendet die TMDb API, wird aber nicht von " "TMDbunterstützt oder zertifiziert." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Feed Informationen" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "" "Dieser Dienst bezieht Informationen für den Feed an dessen festgelegtem Ort." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Dateinamen Information" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Dieser Dienst errät Staffel- und Episoden-Nummer basierend auf dem " "Dateinamen. Z.B. 2x23 oder S02E23 oder 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Anmerkung: Dieser Bezugsdienst verwendet die Last.fm API, wird aber nicht " "von Last.fm unterstützt oder zertifiziert." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Anmerkung: Dieser Bezugsdienst verwendet die TMDb API, wird aber nicht von " "TMDbunterstützt oder zertifiziert." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Anmerkung: Dieser Bezugsdienst nutzt die TVDB.com API. Bitte helfen Sie die " "TVDB.com Informationen zu verbessern indem Sie auf den Link klicken." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Interpret" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Alben" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Genre" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Wiedergabeliste" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 Interpret" msgstr[1] "%1 Interpreten" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 Album" msgstr[1] "%1 Alben" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 Genre" msgstr[1] "%1 Genres" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Wiedergabeliste" msgstr[1] "Wiedergabeliste" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 Lied" msgstr[1] "%1 Lieder" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 Clip" msgstr[1] "%1 Clips" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 Stream" msgstr[1] "%1 Streams" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Neuer Audiostream" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Neuen Audiostream-Eintrag erstellen" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Audio-CD – %1 Stücke" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 Stück" msgstr[1] "%1 Stücke" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "Video-DVD – %1 Titel" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Unbenannt" msgstr[1] "Unbenannt" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Neuer Audiostream" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "" "Bearbeiten Sie die Informationen um einen neuen Audiostream zu erstellen." #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 Feed" msgstr[1] "%1 Genres" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Neuer Video-Feed" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "" "Bearbeiten Sie die Informationen um einen neuen Video-Feed zu erstellen." #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Sammle Datei-Informationen..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Sammle Datei-Informationen (%1 Dateien)" #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Vor kurzem gespielt" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Lieder" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Clips" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Audiostreams" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Audio Feeds" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Dateien und Ordner" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Schauspieler" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Regisseur" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Filme" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Vor kurzem angesehen" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Oft angesehen" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "TV-Shows" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Video-Clips" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Video Feeds" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Interpreten – %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Alle Lieder" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Alben – %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Alben – %1 – %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "Einmal wiedergegeben" msgstr[1] "%1 mal wiedergegeben" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 Tag" msgstr[1] "%1 Tags" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Filme – %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 Film" msgstr[1] "%1 Filme" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Nicht kategorisierte TV-Shows" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 Show" msgstr[1] "%1 Shows" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Nicht kategorisierte Staffeln" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Staffeln – %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 Staffel" msgstr[1] "%1 Staffeln" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 – Staffel %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Nicht kategorisierte Staffeln" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 Episode" msgstr[1] "%1 Episoden" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 Schauspieler" msgstr[1] "%1 Schauspieler" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 Regisseur" msgstr[1] "%1 Regisseure" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "Ordner" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "vor einem Jahr" msgstr[1] "vor %1 Jahren" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "vor einem Monat" msgstr[1] "vor %1 Monaten" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "vor einer Woche" msgstr[1] "vor %1 Wochen" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "vor einem Tag" msgstr[1] "vor %1 Tagen" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "vor einer Stunde" msgstr[1] "vor %1 Stunden" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "vor einer Minute" msgstr[1] "vor %1 Minuten" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "vor ein paar Sekunden" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Titel %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Komplette DVD" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Staffel %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Episode %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Staffel %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" #~ msgid "Showing Information
Click to hide information." #~ msgstr "" #~ "Informations-Anzeige
Klicken, um die Informationen auszublenden." #~ msgid "A Media Player" #~ msgstr "Ein Medienabspieler" #~ msgid "Buschmann" #~ msgstr "Buschmann" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Kristof Bal" #~ msgstr "Kristof Bal" #~ msgid "Ryan Kavanagh" #~ msgstr "Ryan Kavanagh" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Info" #~ msgid "Description:%1" #~ msgstr "Beschreibung" #~ msgid "Show video Settings" #~ msgstr "Videoeinstellungen anzeigen" #~ msgid "Show audio Settings" #~ msgstr "Audioeinstellungen anzeigen" #~ msgid "Last played: %1" #~ msgstr "Letzte Wiedergabe" #~ msgid "Playback message" #~ msgstr "Wiedergabe-Nachricht" #~ msgid "Not Playing" #~ msgstr "Keine Wiedergabe" #~ msgid "Shuizhuyuanluo" #~ msgstr "Shuizhuyuanluo" #~ msgid "results" #~ msgstr "Ergebnisse" #~ msgid "Run Script" #~ msgstr "Skript ausführen" #~ msgid "Choose Interpreter:" #~ msgstr "Interpreter auswählen:" #~ msgid "Bangarang - Scripting Console" #~ msgstr "Bangarang - Skript-Konsole" #~ msgid "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgstr "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgid "DVD Menu" #~ msgstr "DVD Menü" #~ msgid "Angles" #~ msgstr "Blickwinkel" #~ msgid "Chapters" #~ msgstr "Kapitel" #~ msgid "Titles" #~ msgstr "Titel" #~ msgid "Audio Channels" #~ msgstr "Audio Kanäle" #~ msgid "Subtitles" #~ msgstr "Untertitel" #~ msgid "episodeNumber" #~ msgstr "1 Episode" #~ msgid "Configure shortcuts..." #~ msgstr "Kurzbefehle festlegen..." #~ msgid "Lookup info using %1" #~ msgstr "Informationen bei %1 nachsehen" #~ msgid "Show video vettings" #~ msgstr "Videoeinstellungen anzeigen" #~ msgid "Enter url" #~ msgstr "Geben Sie die URL ein" #~ msgid "Tags are separated with \";\"" #~ msgstr "Tags werden mit \";\" getrennt" #~ msgid "Updating..." #~ msgstr "Aktualisierung läuft …" #~ msgid "Updated info for %1, %2" #~ msgstr "Informationen aktualisiert für %1, %2" #~ msgid "Removed info for %1" #~ msgstr "Informationen gelöscht für %1" #~ msgid "Hue" #~ msgstr "Farbton" #~ msgid "Track %1" #~ msgstr "Stück %1" #~ msgctxt "%1=Title of DVD" #~ msgid "DVD Video - %1" #~ msgstr "Video-DVD – %1" #~ msgid "Indexer" #~ msgstr "Indexer" #~ msgid "Index audio file(s)" #~ msgstr "Audiodatei(en) indizieren" #~ msgid "Index folder containing audio file(s)" #~ msgstr "Ordner mit Audiodatei(en) indizieren" #~ msgid "Index video file(s)" #~ msgstr "Videodatei(en) indizieren" #~ msgid "Index folder containing video file(s)" #~ msgstr "Ordner mit Videodatei(en) indizieren" #~ msgid "Audio Files" #~ msgstr "Audiodateien" #~ msgid "Video Files" #~ msgstr "Videodateien" #~ msgid "Image" #~ msgstr "Bild" #~ msgid "Double-click to edit" #~ msgstr "Doppelklick, um zu editieren" #~ msgid "Recently Played Artists" #~ msgstr "Vor kurzem gespielt" #~ msgid "Highest Rated Artists" #~ msgstr "Höchste Bewertung" #~ msgid "Frequently Played Artists" #~ msgstr "Oft gespielt" #~ msgid "Recently Played Albums" #~ msgstr "Vor kurzem gespielt" #~ msgid "Highest Rated Albums" #~ msgstr "Höchste Bewertung" #~ msgid "Frequently Played Albums" #~ msgstr "Oft gespielt" #~ msgid "Recently Played Genres" #~ msgstr "Vor kurzem gespielt" #~ msgid "Highest Rated Genres" #~ msgstr "Höchste Bewertung" #~ msgid "Frequently Played Genres" #~ msgstr "Oft gespielt" #~ msgid "Recently Played Clips" #~ msgstr "Vor kurzem gespielt" #~ msgid "Highest Rated Clips" #~ msgstr "Höchste Bewertung" #~ msgid "Frequently Played Clips" #~ msgstr "Oft gespielt" #~ msgid "Recently Played Streams" #~ msgstr "Vor kurzem gespielt" #~ msgid "Highest Rated Streams" #~ msgstr "Höchste Bewertung" #~ msgid "Frequently Played Streams" #~ msgstr "Oft gespielt" #~ msgid "Recently Played Tags" #~ msgstr "Vor kurzem gespielt" #~ msgid "Highest Rated Tags" #~ msgstr "Höchste Bewertung" #~ msgid "Frequently Played Tag" #~ msgstr "Oft gespielt" #~ msgid "Recently Watched Movies" #~ msgstr "Vor kurzem gespielt" #~ msgid "Highest Rated Movies" #~ msgstr "Höchste Bewertung" #~ msgid "Frequently Watched Movies" #~ msgstr "Oft gespielt" #~ msgid "Recently Watched TV Shows" #~ msgstr "Vor kurzem gespielt" #~ msgid "Highest Rated TV Shows" #~ msgstr "Höchste Bewertung" #~ msgid "Frequently Watched TV Shows" #~ msgstr "Oft gespielt" #~ msgid "Recently Watched Genres" #~ msgstr "Vor kurzem gespielt" #~ msgid "Frequently Watched Genres" #~ msgstr "Oft gespielt" #~ msgid "Recently Watched Actors" #~ msgstr "Vor kurzem gespielt" #~ msgid "Highest Rated Actors" #~ msgstr "Höchste Bewertung" #~ msgid "Frequently Watched Actors" #~ msgstr "Oft gespielt" #~ msgid "Recently Watched Directors" #~ msgstr "Vor kurzem angesehene Regisseure" #~ msgid "Highest Rated Directors" #~ msgstr "Am höchsten bewertete Regisseure" #~ msgid "Frequently Watched Directors" #~ msgstr "Oft angesehene Regisseure" #~ msgid "Add selected info" #~ msgstr "Ausgewählte Informationen entfernen" #~ msgid "Search in playlist..." #~ msgstr "Wiedergabeliste wird geladen …" #~ msgid "Toggle fullscreen" #~ msgstr "Vollbild ein-/ausschalten" #~ msgid "Show Scripting Console" #~ msgstr "Skript-Konsole anzeigen" #~ msgid "03:00" #~ msgstr "03:00" #~ msgid "Untitled Audio Stream" #~ msgstr "Unbenannter Audiostream" #~ msgid "Select this item, click Info then Edit to enter audio stream info" #~ msgstr "" #~ "Diesen Eintrag auswählen, Info und dann Editieren anklicken, um " #~ "Audiostream-Informationen einzugeben" #~ msgid "Open image file(s)" #~ msgstr "Bilddatei(en) öffnen" #~ msgid "Open folder containing image file(s)" #~ msgstr "Ordner mit Bilddatei(en) öffnen" #~ msgid "Rating" #~ msgstr "Bewertung" #~ msgid "List of Tags" #~ msgstr "Liste der Schlagworte" #~ msgid "%1" #~ msgstr "%1" #~ msgid "Files with Tag '%1'" #~ msgstr "Dateien mit Schlagwort '%1'" #~ msgid "%1 - Played %2 times" #~ msgstr "%1 - %2-mal wiedergegeben" #~ msgid "%1 - Last Played: %2" #~ msgstr "%1 - Zuletzt wiedergegeben: %2" #~ msgid "Edit" #~ msgstr "Bearbeiten" #~ msgid "Saving..." #~ msgstr "Speichern …" #~ msgid "Track Number" #~ msgstr "Titelnummer" #~ msgid "Sort" #~ msgstr "Sortieren" #~ msgid "2" #~ msgstr "2" #~ msgid "%1 - Episode %2" #~ msgstr "%1 - Episode %2" #~ msgid "Collection/Series Name" #~ msgstr "Sammlung/Serie" bangarang-bangarang/po/el/000077500000000000000000000000001166760560600157475ustar00rootroot00000000000000bangarang-bangarang/po/el/CMakeLists.txt000066400000000000000000000001641166760560600205100ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( el ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/el/bangarang.po000066400000000000000000002310761166760560600202400ustar00rootroot00000000000000# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Nikos Pantazis , 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-02-20 15:45+0200\n" "Last-Translator: Nikos Pantazis \n" "Language-Team: Greek \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Πανταζής Νίκος" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "pantazisnikolaos@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Προσθήκη λίστας" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Αφαίρεση λίστας" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Ρυθμίσεις" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Προσθήκη λίστας" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Πηγή" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Τρέχουσα προβολή" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Τρέχουσα επιλογή" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Τρέχουσα λίστα" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Όνομα νέας λίστας" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Όνομα" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Αποθήκευση" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Επιστροφή στις λίστες" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Ρυθμίσεις αποθηκευμένης λίστας" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Όνομα" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Τίτλος λίστας" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Εμφάνιση" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "αντικείμενα" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "αναπαραγμένο" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "πριν" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "μετά" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "ή περισσότερο" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "ακριβώς" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "ή λιγότερο" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "φορές" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Λίστες πολυμέσων" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Αναζήτηση για ήχο" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Ήχος" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Βίντεο" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Εμφάνιση αναπαραγωγής" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Σε αναπαραγωγή" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Σύνοψη" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Φίλτρο" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Πρόσθετες πληροφορίες μπορεί να είναι διαθέσιμες από:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Λήψη και επεξεργασία πληροφοριών" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Λήψη και αποθήκευση πληροφοριών" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Αντιστοιχίες" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Ακύρωση αλλαγών" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Προσθήκη στο ευρετήριο" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Κείμενο ειδοποίησης" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Προηγούμενο" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Αναπαραγωγή όλων των πολυμέσων στη λίστα" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Αναπαραγωγή όλων" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Αναπαραγωγή των επιλεγμένων πολυμέσων στη λίστα" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Αναπαραγωγή επιλογής" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Εξωτερικός υπότιτλος" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Λίστα" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Μήνυμα σφάλματος" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Εμφάνιση προσεχών" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Λίστα" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Καθαρισμός λίστας" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Ενεργοποίηση επανάληψης" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Ενεργοποίηση τυχαίας σειράς" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Ειδοποίηση" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Ναι" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Όχι" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Ρυθμίσεις ήχου" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Κανάλι ήχου:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Ισοσταθμιστής" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Προκαθορισμένα" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Προ" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Επαναφορά προεπιλογών" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Απόκρυψη" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Ρυθμίσεις βίντεο" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Υπότιτλος:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Γωνία:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Φωτεινότητα:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Αντίθεση:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Απόχρωση:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Κορεσμός:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Αναλογίες" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Αυτόματο" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Ταίριασμα" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Τρόπος κλιμάκωσης" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Κλιμάκωση όσο χωράει" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Κλιμάκωση και αποκοπή" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Συντομεύσεις" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Αποθήκευση συντομεύσεων" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Ακύρωση" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Εμφάνιση λιστών πολυμέσων" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Εμφάνιση πλήρους οθόνης" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Χρόνος που πέρασε
Κλικ για εμφάνιση υπολειπόμενου χρόνου" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Κλείσιμο ήχου" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Ένταση" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Επιστροφή στις λίστες" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Ένας αναπαραγωγέας πολυμέσων για την επιφάνεια εργασίας KDE" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Πνευματικά δικαιώματα 2011, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Σημείωση: Αυτό το προϊόν χρησιμοποιεί το TMDb API, χωρίς να έχει την " "υποστήριξη ή τη πιστοποίηση του TMDb. Παρακαλείστε να βοηθήσετε στη βελτίωση " "των παρεχόμενων πληροφοριών επισκεπτόμενοι το http://themoviedb." "org
Σημείωση: Αυτό το προϊόν χρησιμοποιεί το Last.fm API, χωρίς να " "έχει την υποστήριξη ή τη πιστοποίηση του Last.fm. Παρακαλείστε να βοηθήσετε " "στη βελτίωση των παρεχόμενων πληροφοριών επισκεπτόμενοι το http://last." "fm
Σημείωση: Αυτό το προϊόν χρησιμοποιεί το TheTVDB.com API, χωρίς " "να έχει την υποστήριξη ή τη πιστοποίηση του TheTVDB.com. Παρακαλείστε να " "βοηθήσετε στη βελτίωση των παρεχόμενων πληροφοριών επισκεπτόμενοι το http://" "thetvdb.com" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Δημιουργός" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Συντελεστής" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Προβλήματα μπορούν να αναφέρονται στο http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Προβλήματα μπορούν να αναφέρονται στο Bangarang Issue Tracker" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Αναπαραγωγή 'URL'" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Αναπαραγωγή DVD βίντεο" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Αναπαραγωγή CD ήχου" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Εμφάνιση περισσότερων πληροφοριών αποσφαλμάτωσης" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Τερματισμός" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Αναπαραγωγή/Παύση" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Αναπαραγωγή" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Παύση" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Επόμενο" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Προηγούμενο" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Κλείσιμο ήχου" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Αναπαραγωγή όλων" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Αναπαραγωγή επιλογής" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Προσθήκη στη λίστα" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Προσθήκη μετά το τρέχον" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Αφαίρεση από τη λίστα" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Απόκρυψη στοιχείων ελέγχου" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Εμφάνιση φίλτρου" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Εμφάνιση υπολειπόμενου χρόνου" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Εμφάνιση ρυθμίσεων βίντεο" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Εμφάνιση ρυθμίσεων ήχου" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Πλήρους οθόνης" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Αποθήκευση επιλεγμένων πληροφοριών" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Αφαίρεση επιλεγμένων πληροφοριών" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Ανανέωση" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Αφαίρεση από τη λίστα" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Προσθήκη στις «Ροές ήχου»" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Προσθήκη στη λίστα" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Προσθήκη στη λίστα " #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Νέα λίστα" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Εμφάνιση αντικειμένων" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Εμφάνιση πληροφοριών" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Εμφάνιση προβολής πληροφοριών" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Προσθήκη σελιδοδείκτη" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Αφαίρεση σελιδοδεικτών" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Εμφάνιση επεξεργαστή συντομεύσεων" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Ενημέρωση οντοτήτων..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Απόκρυψη στο πλαίσιο συστήματος" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Διαχείριση πληροφοριών" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Απόκρυψη προβολής πληροφοριών" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Αναπαραγωγή μετά το τρέχον" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Απόκρυψη πληροφοριών" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Κεφάλαιο %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Εμφάνιση στοιχείων ελέγχου" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Απόκρυψη στοιχείων ελέγχου" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Απόκρυψη ρυθμίσεων βίντεο" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Απόκρυψη ρυθμίσεων ήχου" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Απόκρυψη επεξεργαστή συντομεύσεων" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Αποκατάσταση έντασης" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Αποκατάσταση μεγέθους βίντεο" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Εμφάνιση χρόνου που πέρασε" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Σελιδοδείκτης-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Ενημέρωση οντοτήτων" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Η ενημέρωση των οντοτήτων εξασφαλίζει ότι οι πληροφορίες των πολυμέσων θα " "είναι αποθηκευμένες με τρόπο που θα τις καθιστά στο μέγιστο προσβάσιμες από " "άλλες εφαρμογές του χώρου εργασίας. Αυτό είναι απαραίτητο μόνο αν " "αναβαθμίσατε πρόσφατα το Bangarang ή την έκδοση λογισμικού KDE.

Αυτό " "μπορεί να διαρκέσει αρκετά λεπτά." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Διακοπή" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Κλείσιμο" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Απόκρυψη φίλτρου" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Εμφάνιση ρυθμίσεων ήχου" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Εμφάνιση ρυθμίσεων βίντεο" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Το Bangarang αδυνατεί να έχει πρόσβαση στην αποθήκη της σημασιολογικής " "επιφάνειας εργασίας Nepomuk. Η βιβλιοθήκη πολυμέσων, οι λειτουργίες της " "αξιολόγησης και του μετρητή εκτελέσεων δεν θα είναι διαθέσιμες." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Να μην εμφανιστεί ξανά αυτό το μήνυμα." #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Συνέχιση" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD βίντεο" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "CD ήχου" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Πλήρους οθόνης
Κλικ για έξοδο από πλήρους οθόνης" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Εμφάνιση πλήρους οθόνης" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Προσθήκη στη λίστα/Αφαίρεση από τη λίστα" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Εμφάνιση τραγουδιών" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Εμφάνιση άλμπουμ" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Εμφάνιση καλλιτεχνών" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Μουσική" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Ροή ήχου" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Κλιπ ήχου" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Ταινία" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "Τηλεοπτική προβολή" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Κλιπ βίντεο" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Χωρίς περιγραφή" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Πολλαπλές τιμές" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Άνοιγμα αρχείου εξωφύλλου" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Πιέστε για να τελειώσετε την επεξεργασία." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Κλικ για απόκρυψη" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "Πρόσθετες πληροφορίες μπορεί να είναι διαθέσιμες.
Κλικ για " "περισσότερα..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "βαθμολογημένο" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Αναζήτηση για βίντεο" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Αναζήτηση ήχου" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Αναζήτηση βίντεο" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Ολοκλήρωση" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Χωρίς τίτλο" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Αφαίρεση" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Είστε σίγουροι ότι θέλετε να αφαιρέσετε το «%1»;" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Καμία επίδραση" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Ροκ" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Ρέγγε" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Χορευτική" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Ζωντανή" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Κλασσική" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Blockbuster" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Ντοκιμαντέρ" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Δράμα" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Χειροκίνητα" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Καλλιτέχνης: " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Συνθέτης: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Άλμπουμ: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Κομμάτι: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Έτος: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Είδος: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Ετικέτες" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Ηθοποιός: " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Σκηνοθέτης: " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Συγγραφέας: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Παραγωγός: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Χρόνος που απομένει
Κλικ για εμφάνιση του χρόνου που πέρασε και " "σελιδοδεικτών" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Χρόνος που πέρασε
Κλικ για εμφάνιση υπολειπόμενου χρόνου και " "σελιδοδεικτών" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Σε παύση
Κρατήστε για διακοπή" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Ψυχαγωγία... Τώρα" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "Εμφανίζονται τα προσεχή
Κλικ για εμφάνιση της λίστας" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Σε αναπαραγωγή
Κλικ για παύση
Κλικ και κράτημα για διακοπή" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Ένα σφάλμα εμφανίστηκε κατά την αναπαραγωγή" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Φόρτωση λίστας..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Γέμισμα ενδιάμεσης μνήμης..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Φόρτωση..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Κλεισμένος ήχος
Κλικ για αποκατάσταση της έντασης" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Επανάληψη ενεργή
Κλικ για απενεργοποίηση της επανάληψης" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Σε τυχαία σειρά
Κλικ για κανονική σειρά" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Είστε σίγουροι ότι θέλετε να καθαρίσετε τη τρέχουσα λίστα;" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 αντικείμενο, %2" msgstr[1] "%1 αντικείμενα, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 αντικείμενο" msgstr[1] "%1 αντικείμενα" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Λίστα (Προσεχή)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Απενεργοποίηση" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Τύπος" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Εξώφυλλο" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Τίτλος" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Καλλιτέχνης" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Συνθέτης" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Άλμπουμ" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Κομμάτι" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Έτος" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Είδος" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Ετικέτες" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Τοποθεσία" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Ηθοποιός" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Σκηνοθέτης" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Συγγραφέας" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Παραγωγός" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Σειρά" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Περίοδος" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Επεισόδιο" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Σύνδεσμοι" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Αριθμός αναπαραγωγών" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Τελευταία αναπαραγωγή" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Λήψη πληροφοριών για %1 αντικείμενο..." msgstr[1] "Λήψη πληροφοριών για %1 αντικείμενα..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Λήψη πληροφοριών για %2 από 1 αντικείμενο..." msgstr[1] "Λήψη πληροφοριών για %2 από %1 αντικείμενα..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Κανένα αποτέλεσμα" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Πρόσφατες αναπαραγωγές τραγουδιών" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Υψηλότερες βαθμολογίες τραγουδιών" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Συχνές αναπαραγωγές τραγουδιών" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Πρόσφατες αναπαραγωγές" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Υψηλότερες βαθμολογίες" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Συχνές αναπαραγωγές" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Η λήψη ακυρώθηκε" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Εκκίνηση ενημέρωσης..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Ενημερωμένα: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Αφαίρεση πληροφοριών..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Πολλαπλά" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Πολλαπλά %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Κανένα αποτέλεσμα" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Ενημέρωση τύπου και ιδιοτήτων ήχου
0 αντικείμενα ενημερώθηκαν..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "Ενημέρωση τύπου και ιδιοτήτων ήχου
%1 αντικείμενα ήχου " "ενημερώθηκαν..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "Ενημέρωση τύπου και ιδιοτήτων βίντεο
%1 αντικείμενα βίντεο " "ενημερώθηκαν..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "Ενημέρωση τύπου και ιδιοτήτων ήχου
%1 αντικείμενα ήχου " "ενημερώθηκαν..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" "Ενημέρωση τύπου και ιδιοτήτων βίντεο
%1 αντικείμενα βίντεο " "ενημερώθηκαν..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Η ενημέρωση ολοκληρώθηκε." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Η ενημέρωση διακόπηκε." #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Αναζήτηση βίντεο" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Οι πληροφορίες λαμβάνονται από το DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Σημείωση: Η λήψη γίνεται με χρήση του TMDb API, αλλά χωρίς την υποστήριξη ή " "τη πιστοποίηση του TMDb." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Πληροφορίες Feed" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "Λαμβάνει πληροφορίες για το feed στη καθορισμένη τοποθεσία." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Πληροφορίες ονόματος αρχείου" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Η λήψη του αριθμού της περιόδου και του επεισοδίου γίνεται με υποθέσεις " "βασισμένες στο μοτίβο του ονόματος αρχείου. Π.χ. 2x23 ή S02E23 ή 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Σημείωση: Η λήψη γίνεται με χρήση του Last.fm API, αλλά χωρίς την υποστήριξη " "ή τη πιστοποίηση του Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Σημείωση: Η λήψη γίνεται με χρήση του TMDb API, αλλά χωρίς την υποστήριξη ή " "τη πιστοποίηση του TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Σημείωση: Η λήψη γίνεται με χρήση του theTVDB.com API. Παρακαλείστε να " "βοηθήστε στη βελτίωση των πληροφοριών του theTVDB.com κάνοντας κλικ στο " "σύνδεσμο." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Καλλιτέχνες" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Άλμπουμ" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Είδη" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Λίστα" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 καλλιτέχνης" msgstr[1] "%1 καλλιτέχνες" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 άλμπουμ" msgstr[1] "%1 άλμπουμ" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 είδος" msgstr[1] "%1 είδη" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Λίστα" msgstr[1] "Λίστα" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 τραγούδι" msgstr[1] "%1 τραγούδια" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 κλιπ" msgstr[1] "%1 κλιπ" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 ροή" msgstr[1] "%1 ροές" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Νέα ροή ήχου" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Επεξεργαστείτε τις πληροφορίες για να δημιουργήσετε μία νέα ροή ήχου" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "CD ήχου - %1 κομμάτια" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 κομμάτι" msgstr[1] "%1 κομμάτια" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD βίντεο - %1 τίτλοι" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Χωρίς τίτλο" msgstr[1] "Χωρίς τίτλο" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Νέο feed ήχου" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Επεξεργαστείτε τις πληροφορίες για να δημιουργήσετε ένα νέο feed ήχου" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 feed" msgstr[1] "%1 feeds" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Νέο feed βίντεο" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "" "Επεξεργαστείτε τις πληροφορίες για να δημιουργήσετε ένα νέο feed βίντεο" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Συλλογή πληροφοριών αρχείου..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Συλλογή πληροφοριών αρχείου (%1 αρχεία)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Πρόσφατες αναπαραγωγές" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Τραγούδια" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Κλιπ" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Ροές ήχου" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Feeds ήχου" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Αρχεία και φάκελοι" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Ηθοποιοί" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Σκηνοθέτες" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Ταινίες" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Πρόσφατες προβολές" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Συχνές προβολές" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Τηλεοπτικές προβολές" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Κλιπ βίντεο" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Feeds βίντεο" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Καλλιτέχνες - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Όλα τα τραγούδια" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Άλμπουμ - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Άλμπουμ - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "1 αναπαραγωγή" msgstr[1] "%1 αναπαραγωγές" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 ετικέτα" msgstr[1] "%1 ετικέτες" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Ταινίες - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 ταινία" msgstr[1] "%1 ταινίες" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Μη κατηγοριοποιημένες τηλεοπτικές προβολές" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 εκπομπή" msgstr[1] "%1 εκπομπές" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Μη κατηγοριοποιημένες περίοδοι" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Περίοδοι - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 περίοδος" msgstr[1] "%1 περίοδοι" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Περίοδος %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Μη κατηγοριοποιημένες περίοδοι" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 επεισόδιο" msgstr[1] "%1 επεισόδια" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 ηθοποιός" msgstr[1] "%1 ηθοποιοί" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 σκηνοθέτης" msgstr[1] "%1 σκηνοθέτες" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "φάκελος" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "ένα έτος πριν" msgstr[1] "%1 έτη πριν" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "ένα μήνα πριν" msgstr[1] "%1 μήνες πριν" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "μία εβδομάδα πριν" msgstr[1] "%1 εβδομάδες πριν" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "μία ημέρα πριν" msgstr[1] "%1 ημέρες πριν" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "μία ώρα πριν" msgstr[1] "%1 ώρες πριν" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "ένα λεπτό πριν" msgstr[1] "%1 λεπτά πριν" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "λίγα δευτερόλεπτα πριν" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Τίτλος %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Πλήρης δίσκος" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Περίοδος %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Επεισόδιο %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Περίοδος %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" bangarang-bangarang/po/es/000077500000000000000000000000001166760560600157565ustar00rootroot00000000000000bangarang-bangarang/po/es/CMakeLists.txt000066400000000000000000000001641166760560600205170ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( es ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/es/bangarang.po000066400000000000000000002131741166760560600202460ustar00rootroot00000000000000# This is the spanish translation of bangarang. # Copyright (C) 2010 bangarang-project # This file is distributed under the same license as the PACKAGE package. # # Jean Pierre Mazuelos Saavedra , 2010. # Jean Pierre MAZUELOS SAAVEDRA , 2010. # Ernesto Manríquez Mendoza , 2011. # Ernesto Manríquez Mendoza , 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2010-10-06 19:43-0500\n" "Last-Translator: Ernesto Manríquez Mendoza \n" "Language-Team: Spanish \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Language: es_ES\n" "X-Generator: Lokalize 1.1\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Jean Pierre Mazuelos, Ernesto Manríquez" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "apuyaya@yahoo.com, alejandronova@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Añadir lista" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Eliminar lista" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Preferencias" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Agregar lista" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Fuente" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Vista actual" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Selección actual" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Lista de reproducción actual" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Nuevo nombre de lista" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Nombre" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Guardar" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Regresar a Listas" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Guardar preferencias de lista" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Nombre" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Título de Lista" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Mostrar" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "ítemes" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "reproducidos" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "antes del" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "después del" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "o más" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "exactamente" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "o menos" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "veces" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Lista de medios" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Buscar audio" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Audio" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Video" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Mostrar En reproducción" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "En reproducción" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Resumen" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Filtro" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Información adicional puede estar disponible de:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Obtener información y editar" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Obtener información y guardar" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Resultados" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Cancelar edición" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Indizar seleccionado" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Texto de notificación" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Anterior" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Reproducir todos los medios en la lista" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Reproducir todo" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Reproducir los medios seleccionados en la lista" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Reproducir" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Subtítulo" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Lista de reproducción" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Mensaje de error" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Mostrar próximos" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Lista de reproducción" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Limpiar lista" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Activar Repetir" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Activar Reproducción aleatoria" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Notificación" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Sí" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "No" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Preferencias de audio" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Canales de audio:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Ecualizador" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Ecualizaciones" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Pre" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1K" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3K" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6K" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12K" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14K" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16K" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Valores por defecto" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Ocultar" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Preferencias de video" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Subtítulo:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Ángulo:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "No se puede detectar la codificación del subtítulo. Por favor, escoja:" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Brillantez:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Contraste:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Tinte:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Saturación:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Radio de aspecto" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automático" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Rellenar" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Escalado" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Rellenar" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Escalar y cortar" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Atajos de teclado" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Guardar atajos" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Cancelar" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Ver Lista de medios" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Pantalla completa" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Tiempo transcurrido
Haga clic para mostrar tiempo restante" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Silenciar" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Volumen" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Regresar a Listas" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Un reproductor de medios para el escritorio KDE" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2011, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Nota: Este producto usa la interfaz TMDb pero no está auspiciado o " "certificado por TMDb. Por favor, mejore la información disponible visitando " "http://themoviedb.org
Nota: Este producto usa la interfaz Last.fm " "pero no está auspiciado o certificado por Last.fm. Por favor, mejore la " "información disponible visitando http://last.fm
Nota: Este " "producto usa la interfaz TheTVDB.com, pero no está auspiciado o certificado " "por TheTVDB.com. Por favor, mejore la información disponible visitando " "http://thetvdb.com ." #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "" #: app/main.cpp:41 msgid "Creator" msgstr "Creador" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Colaborador" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Los errores pueden ser reportados, en inglés, en http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Los errores pueden ser reportados al Sistema de Problemas de Bangarang" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Reproducir 'URL'" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Reproducir DVD de video" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Reproducir CD de música" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Mostrar información de depuración" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "Activar modo para pantalla táctil" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Salir" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Reproducir/Pausa" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Reproducir" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Pausa" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Siguiente" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Anterior" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Silencio" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Reproducir todo" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Reproducir seleccionado" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Agregar a la lista de reproducción" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Reproducir a continuación" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Eliminar de la lista" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Ocultar controles" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Mostrar filtro" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Mostrar tiempo restante" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Preferencias de video" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Preferencias de audio" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Pantalla completa" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Guardar información seleccionada" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Eliminar información seleccionada" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Actualizar" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Eliminar de la lista" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Añadir a \"Flujos de audio\"" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Agregar a la lista" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Agregar a la lista " #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Nueva lista" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Mostrar items" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Mostrar información" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Mostrar el visor de información" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Añadir marcador" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Eliminar marcadores" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Atajos de teclado" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Actualizar ontologías..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Minimizar a la bandeja de sistema" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Gestionar información" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Ocultar visor de información" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Reproducir a continuación" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Ocultar información" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Capítulo %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Mostrar Controles" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Ocultar Controles" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Ocultar preferencias de video" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Ocultar preferencias de audio" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Ocultar el editor de atajos de teclado" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Restaurar volumen" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Restaurar el tamaño del video" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Mostrar el tiempo transcurrido" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Marcador-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Actualizar ontologías" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Al actualizar las ontologías, se asegura de que la información sobre sus " "canciones y videos sea almacenada de una forma que la vuelve accesible a " "otros programas del escritorio. Esto sólo es necesario si ha actualizado " "recientemente Bangarang o su compilación de software KDE.

El proceso " "puede tomar varios minutos." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Parar" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Cerrar" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Ocultar filtro" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Preferencias de audio" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Preferencias de video" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang no puede acceder al sistema centralizado de base de datos Nepomuk. " "La libreria de medios, sus valoraciones y el conteo de reproducciones no " "estarán disponibles." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "No volver a mostrar este mensaje" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Reanudar" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD de video" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "CD de audio" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Pantalla completa
Haga clic para salir de pantalla completa" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Mostrar pantalla completa" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "" "Agregar a la lista de reproducción/Eliminar de la lista de reproducción" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Mostrar Canciones" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Álbumes" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Artistas" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Música" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Flujo de audio" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Clip de audio" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Película" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "Show de TV" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Clip de Video" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Sin descripción" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Múltiples valores" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Abrir carátula" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Presione para terminar de editar" #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Clic para ocultar" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "Información adicional puede estar disponible.
Clic para mostrar más..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "valorado" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Buscar videos" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Búsqueda de audio" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Búsqueda de video" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Completado" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Sin título" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Eliminar" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "¿Está usted seguro que desea eliminar \"%1\"?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Sin efecto" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Concierto" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Clásica" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Estreno" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Documental" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Artista: " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Compositor: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Álbum: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Pista: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Año: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Género: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Etiquetas" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Actor: " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Director: " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Escritor: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Productor: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" " Tiempo restante
Haga clic para mostrar el tiempo transcurrido y " "marcadores" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Tiempo transcurrido
Haga clic para mostrar tiempo restante y " "marcadores" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Pausado
Mantenga presionado para detener" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Entretenimiento... ahora." #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "" "Mostrando próximos
Haga clic para mostrar lista de reproducción" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Reproduciendo
Haga clic para pausar
Haga click y pulse para " "detener" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Un error ha sido encontrado durante la reproducción" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Cargando lista de reproducción..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Precargando..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Cargando..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Silenciado
Haga clic para restaurar el volumen" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Repetir activado
Haga clic para desactivar la repetición" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "" "Reproducción aleatoria activada
Haga clic para desactivar la " "reproducción aleatoria" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "¿Está seguro que desea limpiar la lista de reproducción actual?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 ítem, %2" msgstr[1] "%1 ítemes, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 ítem" msgstr[1] "%1 ítemes" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Lista de Reproducción (Próximos)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Desactivar" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Tipo" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Carátula" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Título" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Artista" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Compositor" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Álbum" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Pista" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Año" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Género" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Etiquetas" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Ubicación" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Actor" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Director" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Escritor" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Productor" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Series" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Temporada" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Episodio" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Hipervínculos" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Cuenta de reproducciones" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Último reproducido" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Obteniendo información para %1 item..." msgstr[1] "Obteniendo información para %1 ítemes..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Información obtenida para %2 de 1 item..." msgstr[1] "Información obtenida para %2 de %1 ítemes..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "No hubo resultados" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Últimas canciones reproducidas" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Canciones mejor calificadas" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Canciones más reproducidas" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Últimas reproducciones" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Mejor calificados" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Más reproducidos" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Descarga cancelada" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Iniciando actualización..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Actualizado: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Borrando información..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Múltiple" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Múltiples %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "No hubo resultados" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Actualizando tipos de audio y propiedades
0 ítemes actualizados..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "Actualizando tipos de audio y propiedades
%1 ítemes de audio " "listos...." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "Actualizando tipos de video y propiedades
%1 ítemes de video " "listos..." #: platform/ontologyupdater.cpp:385 #, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "Actualizando tipos de audio y propiedades
%1 ítemes de audio " "listos..." #: platform/ontologyupdater.cpp:413 #, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" "Actualizando tipos de video y propiedades
%1 itemes de video " "listos..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Actualización completa." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Actualización detenida" #: platform/playlist.cpp:671 msgid "Video Playback" msgstr "Reproducción de video" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Obtiene información de DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "Douban" #: platform/infofetchers/doubaninfofetcher.cpp:37 msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Nota: Este programa usa la interfaz Douban pero no está auspiciado o " "certificado por Douban." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Fuente RSS" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "Obtiene información de la fuente RSS especificada." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Nombre de archivo" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Obtiene la información de la temporada y del episodio basándose en un patrón " "de nombre de archivo. Ej. 2x23, T02E23, o 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Nota: Este programa usa la interfaz Last.fm pero no está auspiciado o " "certificado por Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Nota: Este programa usa la interfaz TMDb pero no está auspiciado o " "certificado por TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Nota: Este programa usa la interfaz theTVDB.com. Por favor ayude a mejorar " "la información de theTVDB.com haciendo clic aquí." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Artistas" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Álbumes" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Géneros" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Lista de reproducción" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 artista" msgstr[1] "%1 artistas" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 álbum" msgstr[1] "%1 álbumes" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 género" msgstr[1] "%1 géneros" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Lista de reproducción" msgstr[1] "Lista de reproducción" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 canción" msgstr[1] "%1 canciones" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 clip" msgstr[1] "%1 clips" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 flujo" msgstr[1] "%1 flujos" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Nuevo flujo de audio" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Edite información para añadir un nuevo flujo" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "CD de audio - %1 pistas" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 pista" msgstr[1] "%1 pistas" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD de video - %1 títulos" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Sin título" msgstr[1] "Sin título" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Nueva fuente podcast" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Edite información para añadir una nueva fuente de podcast" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 feed" msgstr[1] "%1 feeds" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Nueva fuente de videocast" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Edite información para añadir una nueva fuente videocast" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Recolectando información..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Recolectando información (%1 archivos)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Últimas reproducciones" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Canciones" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Clips" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Flujos de audio" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Podcasts" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Sistema de archivos" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Actores" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Directores" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Películas" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Vistos recientemente" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Más vistos" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Shows de TV" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Cortos de video" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Videocasts" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Artistas - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Todas las canciones" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Álbumes - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Álbumes - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "reproducido una vez" msgstr[1] "reproducido %1 veces" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 etiqueta" msgstr[1] "%1 etiquetas" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Películas - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 película" msgstr[1] "%1 películas" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Shows de TV sin categorizar" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 show" msgstr[1] "%1 shows" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Temporadas sin categorizar" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Temporadas - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 temporada" msgstr[1] "%1 temporadas" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Temporada %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 temporadas sin categorizar" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 episodio" msgstr[1] "%1 episodios" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 actor" msgstr[1] "%1 actores" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 director" msgstr[1] "%1 directores" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "Directorio" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "hace un año" msgstr[1] "hace %1 años" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "hace un mes" msgstr[1] "hace %1 meses" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "hace una semana" msgstr[1] "hace %1 semanas" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "hace un día" msgstr[1] "hace %1 días" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "hace una hora" msgstr[1] "hace %1 horas" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "hace un minuto" msgstr[1] "hace %1 minutos" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "hace pocos segundos" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Título %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Disco entero" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Temporada %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Episodio %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Temporada %1" bangarang-bangarang/po/fi/000077500000000000000000000000001166760560600157455ustar00rootroot00000000000000bangarang-bangarang/po/fi/CMakeLists.txt000066400000000000000000000001641166760560600205060ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( fi ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/fi/bangarang.po000066400000000000000000002234611166760560600202350ustar00rootroot00000000000000# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # , 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-02-01 21:20+0200\n" "Last-Translator: Joonas Sarajärvi\n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.1\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Ville Heikkilä" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "tehomail@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Lisää lista" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Poista lista" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Asetukset" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Lisää lista" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Lähde" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Tämänhetkinen näkymä" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Tämänhetkinen valinta" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Tämänhetkinen soittolista" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Uuden listan nimi" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Nimi" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Tallenna" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Palaa listoihin" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Tallennetun listan asetukset" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Nimi" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Listan nimi" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Ohjelma" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "kohdetta" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "toistettu" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "ennen" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "jälkeen" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "vähintään" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "täsmälleen" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "enintään" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "kertaa" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Medialistat" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Etsi äänitiedostoja" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Ääni" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Video" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Näytä tällä hetkellä toistettava" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Toistettava" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Yhteenveto" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Suodatin" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Lisätietoa voi olla saatavilla" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Hae tietoa ja editoi muutoksia" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Hae tietoa ja tallenna muutokset" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Osumat" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Peruuta muokkaus" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Indeksoi valittu" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Ilmoitus" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Edellinen" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Toista kaikki listalla" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Toista kaikki" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Toista valitut" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Toista valittu" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Tekstitykset" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Soittolista" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Virheilmoitus" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Näytä seuraavat" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Soittolista" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Tyhjennä soittolista" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Kertaustila" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Satunnaistoisto" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Ilmoitus" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Kyllä" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Ei" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Ääniasetukset" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Äänikanava: " #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Taajuuskorjain" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Ajastin" # hmm #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Esi" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Palauta oletukset" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Piilota" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Videoasetukset" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Tekstitykset:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Kuvakulma:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Kirkkaus:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Kontrasti:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Sävy" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Kylläisyys:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Kuvasuhde" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automaattinen" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Sovita" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Skaalaus" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Skaalaa sopivaksi" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Skaalaa ja rajaa" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Pikanäppäimet" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Tallenna pikanäppäimet" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Peruuta" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Näytä medialistat" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Kokoruutu" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Kulunut aika
Näytä jäljellä oleva aika" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Hiljennä ääni" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Äänenvoimakkuus" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Palaa listoihin" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Mediatoistin KDE-työpöydälle" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Tekijänoikeus 2011, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Tekijä" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Kehittäjä" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Virheistä voidaan ilmoittaa osoitteessa http://code.google.com/p/" "bangarangissuetracking/" # Osa puuttuu #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Virheistä voidaan ilmoittaa Bangarangin vianseurantajärjestelmässä" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Toista 'URL'" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Toista DVD" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Toista ääni-CD" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Näytä tarkempi virheraportti " #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Lopeta" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Toista/Tauko" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Toista" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Tauko" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Toista seuraava" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Toista edellinen" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Hiljennä" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Toista kaikki" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Toista valittu" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Lisää soittolistaan" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Lisää nyt toistettavan jälkeen" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Poista soittolistalta" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Piilota säätimet" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Näytä hakusuodatin" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Näytä jäljellä oleva aika" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Näytä videoasetukset" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Näytä ääniasetukset" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Koko näyttö" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Tallenna valitut tiedot" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Poista valitut tiedot" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Päivitä" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Poista listalta" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Lisää äänivirtoihin" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Lisää listalle" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Lisää listalle" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Uusi lista" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Näytä kohteet" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Näytä tiedot" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Näytä tiedot" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Lisää kirjanmerkki" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Poista kirjanmerkki" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Näytä pikanäppäimet" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Päivitä ontologiat..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Piilota ilmoitusalueelle" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Muokkaa tietoja" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Piilota tiedot" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Toista tällä hetkellä toistettavan jälkeen" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Piilota tiedot" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Luku %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Näytä säätimet" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Piilota säätimet" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Piilota videoasetukset" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Piilota ääniasetukset" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Piilota pikanäppäimet" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Palauta äänenvoimakkuus" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Palauta kuvan koko" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Näytä kulunut aika" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Lisää %1 kirjanmerkkeihin" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Päivitä ontologiat" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Ontologioiden päivittäminen takaa mediatiedostojen tallennuksen niin, että " "muut ohjelmat voivat käyttää niitä mahdollisimman helposti. Tämä on " "välttämätöntä vaan, jos olet viimeaikoina päivittänyt Bangarangin tai KDE " "ohjelmistokokoelman.

Tämä voi kestää muutamia minuutteja." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Pysäytä" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Sulje" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Piilota suodatin" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Näytä ääniasetukset" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Näytä videoasetukset" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang ei pääse käsiksi \"Nepomuk Sematic Desktop\" säiliöön. " "Mediakirjasto, arvostelut ja soittolaskuri eivät ole käytettävissä." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Älä näytä tätä viestiä uudelleen" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Jatka" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD Video" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "Ääni-CD" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Koko näyttö
Poistu kokoruututilasta" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Kokoruutu" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Lisää soittolistaan/Poista soittolistalta" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Kappaleet" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Albumit" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Artistit" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Musiikki" # Epävarma #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Äänivirta" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Äänileike" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Elokuva" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "TV-sarja" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Videoleike" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Ei kuvausta" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Useita arvoja" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Avaa kansikuvatiedosto" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Lopeta muokkaaminen painamamalla " #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Piilota" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "Lisätietoa voi olla saatavilla.
Näytä lisää..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "arvosteltu" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Etsi videotiedostoja" # Epävarma #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Musiikki- ja äänihaku" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Videohaku" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Valmis" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Nimetön" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Poista" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Oletko varma, että haluat poistaa \"%1\"?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Ei tehostetta" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rock" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Reggae" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Dance" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Live" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Klassinen" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Blockbuster" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Dokumentti" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Draama" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Manuaalinen" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Artisti: " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Säveltäjä: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Albumi: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Kappale: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Vuosi: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Genre: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Tagit" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Näyttelijä: " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Ohjaaja: " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Käsikirjoittaja: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Tuottaja: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "Aikaa jäljellä
Näytä kulunut aika ja kirjanmerkit" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "Aikaa kulunut
Näytä jäljellä oleva aika ja kirjanmerkit" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Tauotettu
Pidä pohjassa pysäyttääksesi" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Entertainment... Now" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "Seuraavaksi toistettavat
Näytä soittolista" # huono #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Toistetaan
Tauko napsauttamalla
Pysäytä pitämällä pohjassa" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Toistettaessa tapahtui virhe" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Ladataan soittolistaa..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Puskuroidaan..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Ladataan..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Hiljennetty
Palauta äänenvoimakkuus" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Kertaustila käytössä
Peru kertaustila napsauttamalla" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Satunnaistoisto
Peru satunnaistoisto napsauttamalla" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Tahdotko varmasti tyhjentää nykyisen soittolistan?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 kohde, %2" msgstr[1] "%1 kohdetta, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 kohde" msgstr[1] "1% kohdetta" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Soittolista (Seuraavaksi)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Pois päältä" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Tyyppi" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Kansikuva" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Nimike" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Artisti" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Säveltäjä" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Albumi" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Kappale" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Vuosi" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Genre" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Tagit" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Sijainti" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Näyttelijä" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Ohjaaja" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Käsikirjoittaja" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Tuottaja" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Sarja" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Tuotantokausi" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Jakso" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Linkit" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Soittokerrat" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Viimeksi toistetu" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Haetaan tietoa %1 kohteelle" msgstr[1] "Haetaan tietoa %1 kohteille" #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Haettiin yhden kohteen tiedot..." msgstr[1] "Haettiin %1 kohteesta %2:n tiedot..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Ei tuloksia" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Viimeaikoina toistetut kappaleet" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Parhaiten arvostellut kappaleet" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Usein toistetut kappaleet" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Viimeaikoina toistetut" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Parhaiten arvosteltu" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Useasti toistetut" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Nouto peruutettu" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Käynnistetään päivitys..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Päivitetty: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Poistetaan tietoja..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Useita" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Useita %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Ei hakutuloksia" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Päivitetään äänityyppejä ja asetuksia
0 kohdetta päivitettiin..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "Päivitetään äänityyppejä ja asetuksia
%1 kohdetta valmiina..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "Päivitetään videotyyppejä ja asetuksia
%1 kohdetta valmiina..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "Päivitetään äänityyppejä ja asetuksia
%1 kohdetta valmiina..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" "Päivitetään videotyyppejä ja asetuksia
%1 kohdetta valmiina..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Päivitys on suoritettu." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Päivitys keskeytettiin" #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Videohaku" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Tämä hakija etsii tietoa osoitteesta DBPedia.org" #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Huom: Tämä hakija käyttää TMDb -palvelun tarjoamaa rajapintaa, mutta se ei " "virallisti ole TMDb:n tukema." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Syötteen tiedot" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "Tämä hakija etsii tietoa syötteelle määritellystä paikasta" #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Tiedostonimen tiedot" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Tämä hakija arvaa tuotantokauden ja jakson numeron tiedostonimen perusteella." #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Huom: Tämä hakija käyttää Last.fm -palvelun tarjoamaa rajapintaa, mutta se " "ei virallisti ole Last.fm:n tukema." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb." #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Huom: Tämä hakija käyttää TMDb -palvelun tarjoamaa rajapintaa, mutta se ei " "virallisti ole TMDb:n tukema." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Tämä hakija käyttää theTVDB:n rajapintaa. Tietoja theTVDB:n kehittämisestä " "saat napsauttamalla linkkiä." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Artistit" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Albumit" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Genret" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Soittolista" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 artisti" msgstr[1] "%1 artistia" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 albumi" msgstr[1] "%1 albumia" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 genre" msgstr[1] "%1 genreä" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Soittolista" msgstr[1] "Soittolista" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 kappale" msgstr[1] "%1 kappaletta" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 klippi" msgstr[1] "%1 pätkää" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 virta" msgstr[1] "%1 virtaa" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Uusi äänivirta" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Luo uusi äänivirta muokkaamalla tietoja" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Ääni-CD - %1 kappaletta" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 kappale" msgstr[1] "%1 kappaletta" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD Video - %1 nimikettä" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Nimetön" msgstr[1] "Nimetön" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Uusi syöte" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Luo uusi syöte muokkaamalla tietoja" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 syöte" msgstr[1] "%1 syötettä" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Uusi syöte" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Luo uusi syöte muokkaamalla tietoja" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Tutkitaan tiedostoa..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Tutkitaan %1 tiedostoa..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Viimeaikoina toistetut" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Kappaleet" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Leikkeet" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Virrat" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Syötteet" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Tiedostot ja Kansiot" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Näyttelijät" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Ohjaajat" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Elokuvat" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Viimeaikoina katsotut" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Usein katsotut" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "TV-sarjat" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Videoleikkeet" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Syötteet" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Artistit - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Kaikki kappaleet" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Albumeja - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Albumit - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "toistettu kerran" msgstr[1] "toistettu %1 kertaa" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 tagi" msgstr[1] "%1 tagia" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Elokuvia - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 elokuva" msgstr[1] "%1 elokuvaa" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Luokittelemattomat TV-sarjat" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 sarja" msgstr[1] "%1 sarjaa" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Luokittelemattomat tuotantokaudet" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Tuotantokausi - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 tuotantokausi" msgstr[1] "%1 tuotantokautta" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - %2. Tuotantokausi" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Luokittelemattomia tuotantokausia" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 jakso" msgstr[1] "%1 jaksoa" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 näyttelijä" msgstr[1] "%1 näyttelijää" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 ohjaaja" msgstr[1] "1% ohjaajaa" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "kansio" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "vuosi sitten" msgstr[1] "%1 vuotta sitten" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "kuukausi sitten" msgstr[1] "%1 kuukautta sitten" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "viikko sitten " msgstr[1] "%1 viikkoa sitten" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "vuorokausi sitten" msgstr[1] "%1 päivää sitten" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "tunti sitten" msgstr[1] "%1 tuntia sitten" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "minuutti sitten" msgstr[1] "%1 minuuttia sitten" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "muutama sekunti sitten" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Nimike %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Täysi levy" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Tuotantokausi %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Jakso %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Tuotantokausi %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" #~ msgid "Showing Information
Click to hide information." #~ msgstr "Näytetään tiedot
Paina piilottaaksesi tiedot." #~ msgid "A Media Player" #~ msgstr "Mediasoitin" #~ msgid "Buschmann" #~ msgstr "Buschmann" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Kristof Bal" #~ msgstr "Kristof Bal" #~ msgid "Ryan Kavanagh" #~ msgstr "Ryan Kavanagh" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Tiedo" #, fuzzy #~ msgid "Description:%1" #~ msgstr "Kuvaus" #, fuzzy #~ msgid "Show video Settings" #~ msgstr "Näytä videoasetukset" #, fuzzy #~ msgid "Show audio Settings" #~ msgstr "Näytä ääniasetukset" #, fuzzy #~ msgid "Last played: %1" #~ msgstr "Viimeksi toistetu" #~ msgid "Playback message" #~ msgstr "Toisto viesti" #~ msgid "Not Playing" #~ msgstr "Ei soi" #~ msgid "Shuizhuyuanluo" #~ msgstr "Shuizhuyuanluo" #~ msgid "results" #~ msgstr "lopputulos" #~ msgid "Run Script" #~ msgstr "Suorita skripti" #~ msgid "Choose Interpreter:" #~ msgstr "Valitse ohjelmointikielen tulkki" #~ msgid "Bangarang - Scripting Console" #~ msgstr "Bangarang - Skriptaus konsoli" #~ msgid "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgstr "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Tekijänoikeus (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgid "DVD Menu" #~ msgstr "DVD valikko" #~ msgid "Angles" #~ msgstr "Kuvakulma" #~ msgid "Chapters" #~ msgstr "Kappaleet" #~ msgid "Titles" #~ msgstr "Nimike" #~ msgid "Audio Channels" #~ msgstr "Äänikanavat" #~ msgid "Subtitles" #~ msgstr "Tekstitykset" #, fuzzy #~ msgid "episodeNumber" #~ msgstr "1 jakso" #~ msgid "Configure shortcuts..." #~ msgstr "Muokkaa oikoteitä..." #~ msgid "Lookup info using %1" #~ msgstr "Etsi tietoja käyttämällä %1" #~ msgid "Show video vettings" #~ msgstr "Näytä videoasetukset" #~ msgid "Show Remaining Time" #~ msgstr "Näytä jäljellä oleva aika" #~ msgid "Enter url" #~ msgstr "Syötä URL-osoite" #~ msgid "Tags are separated with \";\"" #~ msgstr "Tagit erotellaan \";\" merkillä" #~ msgid "Updating..." #~ msgstr "Päivitetään..." #~ msgid "Updated info for %1, %2" #~ msgstr "%1, %2 tiedot päivitettiin" #~ msgid "Removed info for %1" #~ msgstr "%1 tiedot poistettiin" #~ msgid "Hue" #~ msgstr "Sävy" #~ msgid "Track %1" #~ msgstr "Kappale %1" #~ msgctxt "%1=Title of DVD" #~ msgid "DVD Video - %1" #~ msgstr "DVD Video - %1" #~ msgid "Indexer" #~ msgstr "Indeksoija" #~ msgid "Index audio file(s)" #~ msgstr "Indeksoi äänitiedostoja" #~ msgid "Index folder containing audio file(s)" #~ msgstr "Indeksoi äänikansioita" #~ msgid "Index video file(s)" #~ msgstr "Indeksoi videoitiedostoja" #~ msgid "Index folder containing video file(s)" #~ msgstr "Indeksoi videokansioita" #~ msgid "Audio Files" #~ msgstr "Äänitiedostoja" #~ msgid "Video Files" #~ msgstr "Videotiedostoja" #~ msgid "Image" #~ msgstr "Kuva" #~ msgid "Double-click to edit" #~ msgstr "Editoi kaksoisklikkaamalla" #~ msgid "Recently Played Artists" #~ msgstr "Useasti toistetut artistit" #~ msgid "Highest Rated Artists" #~ msgstr "Parhaiten arvostellut artistit" #~ msgid "Frequently Played Artists" #~ msgstr "Useasti toistetut artistit" #~ msgid "Recently Played Albums" #~ msgstr "Viimeaikoina toistetut albumit" #~ msgid "Highest Rated Albums" #~ msgstr "Parhaiten arvostellut albumit" #~ msgid "Frequently Played Albums" #~ msgstr "Useasti toistetut albumit" #~ msgid "Recently Played Genres" #~ msgstr "Viimeaikoina toistetut genret" #~ msgid "Highest Rated Genres" #~ msgstr "Parhaiten arvostellut genret" #~ msgid "Frequently Played Genres" #~ msgstr "Useasti toistetut genret" #~ msgid "Recently Played Clips" #~ msgstr "Viimeaikoina toistettuja pätkiä" #~ msgid "Highest Rated Clips" #~ msgstr "Parhaiten arvostellut klipit" #~ msgid "Frequently Played Clips" #~ msgstr "Usein toistetut klipit" #~ msgid "Recently Played Streams" #~ msgstr "Viimeaikoina toistetut virrat" #~ msgid "Highest Rated Streams" #~ msgstr "Parhaiten arvostellut virrat " #~ msgid "Frequently Played Streams" #~ msgstr "Usein toistetut virrat" #~ msgid "Recently Played Tags" #~ msgstr "Viimeaikoina toistetut tagit" #~ msgid "Highest Rated Tags" #~ msgstr "Parhaiten arvostellut tagit" #~ msgid "Frequently Played Tag" #~ msgstr "Usein toistetut tagit" #~ msgid "Recently Watched Movies" #~ msgstr "Viimeaikoina katsotut elokuvat" #~ msgid "Highest Rated Movies" #~ msgstr "Parhaiten arvostellut elokuvat" #~ msgid "Frequently Watched Movies" #~ msgstr "Viimeaikoina katsotut elokuvat" #~ msgid "Recently Watched TV Shows" #~ msgstr "Viimeaikoina katsotut TV-sarjat" #~ msgid "Highest Rated TV Shows" #~ msgstr "Parhaiten arvostellut TV-sarjat" #~ msgid "Frequently Watched TV Shows" #~ msgstr "Usein katsotut TV-sarjat" #~ msgid "Recently Watched Genres" #~ msgstr "Viimeaikoina katsotut genret" #~ msgid "Frequently Watched Genres" #~ msgstr "Usein katsotut genret" #~ msgid "Recently Watched Actors" #~ msgstr "Viimeaikoin katsotut näyttelijät" #~ msgid "Highest Rated Actors" #~ msgstr "Parhaiten arvostellut näyttelijät" #~ msgid "Frequently Watched Actors" #~ msgstr "Usein katsotut näyttelijät" #~ msgid "Recently Watched Directors" #~ msgstr "Viimeaikoina katsotut ohjaajat" #~ msgid "Highest Rated Directors" #~ msgstr "Parhaiten arvostellut ohjaajat" #~ msgid "Frequently Watched Directors" #~ msgstr "Usein katsotut ohjaajat" #~ msgid " All songs" #~ msgstr "Kaikki kappaleet" #~ msgid "" #~ "Updating audio types and properties
0 items updated..." #~ msgstr "" #~ "Päivitetään äänityyppejä ja asetuksia
0 kohdetta " #~ "päivitetty..." bangarang-bangarang/po/fr/000077500000000000000000000000001166760560600157565ustar00rootroot00000000000000bangarang-bangarang/po/fr/CMakeLists.txt000066400000000000000000000001641166760560600205170ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( fr ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/fr/bangarang.po000066400000000000000000002325361166760560600202510ustar00rootroot00000000000000# Copyright (C) # Ryan Kavanagh , 2009-2011. # Jérôme Artu , 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-01-27 16:17-0500\n" "Last-Translator: Ryan Kavanagh \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Humbert Julien, Ryan Kavanagh, Jérôme Artu" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "julroy67@gmail.com, ryanakca@kubuntu.org, solojay6@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Ajouter une liste" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Retirer une liste" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Options" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Ajouter une liste" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Source" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Vue actuelle" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Sélection actuelle" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Liste de lecture en cours" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Nom de la nouvelle liste" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Nom" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Enregistrer" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Retour aux listes" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Réglages des listes enregistrés" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Nom" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Titre de la liste" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Afficher" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "éléments" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "joué" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "avant" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "après" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "ou plus" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "exactement" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "ou moins" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "fois" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Listes de média" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Rechercher de l'audio" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Audio" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Vidéo" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Afficher la lecture en cours" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Lecture en cours" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Résumé" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "…" #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Filtre" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Des informations supplémentaire sont peut-être disponible depuis : " #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Récupérer les informations et modifier les changements" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Récupérer les informations et les enregistrer" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Correspondances" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Annuler l'édition" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Indexer la sélection" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Texte de notification" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Précédent" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Lire tout les média dans la liste" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Lire tout" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Lire les média sélectionnés dans la liste" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Lire les éléments sélectionnés" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Sous-titre externe" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Liste de lecture" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Message d'erreur" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Afficher les prochaines pistes" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Liste de lecture" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Vider la liste de lecture" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Activer le mode répétition" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Activer le mode aléatoire" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Notification" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Oui" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Non" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Réglages audio" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Canal audio : " #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Égaliseur" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Préréglages" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Pre" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Restaurer la configuration par défaut" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Cacher" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Réglages vidéo" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Sous-titre : " #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Angle : " #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Luminosité : " #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Contraste : " #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Teinte : " #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Saturation : " #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Rapport hauteur/largeur" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automatique" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Ajuster" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Mise à l'échelle" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Adapter" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Adapter et rogner" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Raccourcis claviers" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Enregistrer les raccourcis claviers" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Annuler" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Afficher les listes de média" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Afficher en plein écran" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Temps écoulé
Cliquez pour afficher le temps restant" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Couper le volume" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Volume" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Retour Aux Listes" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Un lecteur de média pour vôtre bureau KDE" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2011, Andrew Lake" #: app/main.cpp:32 #, fuzzy msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Remarque : ce produit utilise l'API TMBb mais n'est pas certifié ou " "approuvé par TMDb. S'il vous plaît, aidez à améliorer les données " "disponibles en visitant http://themoviedb.org
Remarque : Ce " "produit utilise l'API Last.fm mais il est ni approuvé, ni certifié par Last." "fm. S'il vous plaît, aidez à améliorer les données disponibles en visitant " "http://last.fm
Remarque : Ce produit utilises l'API TheTVDB.com " "mais il est est ni approuvé, ni certifié par TheTVDB.com. S'il vous plaît, " "aidez à améliorer les données disponibles en visitant http://thetvdb.com" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Créateur" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Contributeur" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Veuillez utiliser http://code.google.com/p/bangarangissuetracking/ pour " "signaler des bogues." #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Veuillez utiliser le système de suivi de bogues de Bangarang pour " "signaler des bogues." #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Lire une « URL »" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Lire un DVD vidéo" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Lire un CD audio" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Afficher les informations de débogage" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Quitter" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Lecture/Pause" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Lecture" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Pause" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Lire l'élément suivant" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Lire l'élément précédent" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Couper le son" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Lire tous les éléments" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Lire les éléments sélectionnés" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Ajouter à la liste de lecture" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Ajouter après la lecture en cours" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Retirer de la liste de lecture" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Masquer les contrôles" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Afficher la barre de filtre" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Afficher le temps restant" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Afficher les réglages vidéo" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Afficher les réglages audio" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Plein écran" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Enregistre l'information sélectionné" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Enlever l'information sélectionnée" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Rafraîchir" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Retirer de la liste" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Ajouter aux « flux audio »" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Ajouter à la liste" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Ajouter à la liste " #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Nouvelle liste" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Afficher les éléments" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Afficher les informations" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Afficher le panneau d'information" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Ajouter un signet" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Retirer un signet" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Afficher l'éditeur de raccourcis claviers" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Actualisation des ontologies…" #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Masquer dans la zone de notification" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Gérer les informations" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Masquer le panneau d'information" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Jouer après la lecture en cours" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Masquer les informations" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Chapitre %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Afficher les contrôles" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Masquer les contrôles" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Masquer les réglages vidéos" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Masquer les réglages audio" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Masquer l'éditeur de raccourcis" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Restaurer le volume" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Restaurer a taille vidéo" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Afficher le temps écoulé" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Signet-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Mettre à jour les ontologies" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Mettre à jour les ontologies permet de s'assurer que les informations du " "média sont stockées de façon à les rendre accessible aux autres applications " "du bureau. Cela n'est nécessaire que si vous avez récemment mise à jour " "Bangarang ou votre environnement KDE." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Arrêt" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Fermer" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Masquer la barre de filtre" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Afficher Les Réglages Audio" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Afficher Les Réglages Vidéo" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang est incapable d'accéder au dépôt du bureau sémantique Nepomuk. La " "bibliothèque multimédia, les fonctions de vote et de nombre d'écoutes ne " "seront pas disponibles." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Ne plus afficher ce message" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Reprendre" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD Vidéo" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "CD Audio" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Plein Écran
Cliquez pour sortir du mode plein écran" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Plein écran" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Ajouter à la liste de lecture/Retirer de la liste de lecture" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Afficher les chansons" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Afficher les albums" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Afficher les artistes" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Musique" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Flux audio" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Clip audio" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Film" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "Émission de télévision" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Clip vidéo" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Pas de description" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Valeurs multiples" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Ouvrir une image" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Appuyez sur pour terminer l'édition." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Cliquez pour masquer" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "Des informations supplémentaire sont peut-être disponible.
Cliquez pour " "plus de détails..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "noté" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Rechercher des vidéos" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Recherche audio" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Recherche vidéo" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Complet" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Sans titre" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Retirer" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Voulez-vous vraiment retirer « %1 » ? " #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Pas d'effet" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rock" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Reggae" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Dance" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Concert" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Classique" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Blockbuster" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Documentaire" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Drame" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Manuel" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Artiste : " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Compositeur : " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Album : " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Piste : " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Année : " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Genre : " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Étiquettes" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Acteur : " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Réalisateur : " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Scénariste : " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Producteur : " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Temps restant
Cliquez pour afficher le temps écoulé et les signets" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Temps écoulé
Cliquez pour afficher le temps restant et les signets" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "En Pause
Restez appuyé pour stopper" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Divertissements… Maintenant" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "" "Affiche Les Prochaines Pistes
Cliquez pour afficher la liste de " "lecture" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Lecture En Cours
Cliquez pour mettre en pause
Cliquez et restez " "appuyé pour stopper" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Une erreur a eu lieu lors de la lecture" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Chargement de la liste de lecture…" #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Mise en mémoire tampon…" #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Chargement…" #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Muet
Cliquez pour restaurer le volume" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "" "Mode Répétition Activé
Cliquez pour désactiver le mode répétition" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "" "Mode Aléatoire Activé
Cliquez pour désactiver le mode aléatoire" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Voulez-vous vraiment effacer la liste de lecture courante ? " #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 élément, %2 " msgstr[1] "%1 éléments, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 élément" msgstr[1] "%1 éléments" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Liste de lecture (Prochaines pistes)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Désactivé" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Type" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Pochette" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Titre" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Artiste" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Compositeur" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Album" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Piste" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Année" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Genre" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Étiquettes" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Emplacement" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Acteur" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Réalisateur" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Scénariste" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Producteur" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Séries" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Saison" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Épisode" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Liens" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Nombre de lectures" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Dernière lecture" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Récupération des informations pour %1 élément..." msgstr[1] "Récupération des informations pour %1 éléments..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Informations reçues pour %2 sur 1 élément..." msgstr[1] "Informations reçues pour %2 sur %1 éléments..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Aucun résultats" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Chansons écoutées récemment" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Chansons les mieux notées" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Chansons jouées fréquemment" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Lu récemment" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Mieux noté" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Lu fréquemment" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Récupération annulée" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Débute la mise à jour..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Mis à jour : %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Enlève l'information..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Plusieurs" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Plusieurs %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Aucun résultats" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Met à jour les éléments audio et les propriétés
0 éléments mise à " "jour..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "Mise à jour des éléments audio et des propriétés
%1 éléments audio " "effectués..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "Mise à jour des éléments vidéo et des propriétés
%1 éléments audio " "effectué..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "Mise à jour des éléments audio et des propriétés
%1 éléments audio " "effectués..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" "Mise à jour des éléments vidéo et des propriétés
%1 éléments audio " "effectué..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Mise à jour terminée." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Mise à jour stoppée." #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Recherche vidéo" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Récupère les informations depuis DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Remarque : ce chercheur utilise l'API TMDb mais il est ni certifié, ni " "approuvé par TMDb." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Information du flux" #: platform/infofetchers/feedinfofetcher.cpp:37 #, fuzzy msgid "This fetcher gets information for the feed at the specified location." msgstr "Récupère l'information pour le podcast à l'adresse spécifiée." #: platform/infofetchers/filenameinfofetcher.cpp:31 #, fuzzy msgid "Filename Info" msgstr "Info nom du fichier" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Ce chercheur devine la saison et le numéro d'épisode à partir du nom de " "fichier. E.g. 2x23 ou S02E23 ou 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Remarque : ce chercheur utilise l'API Last.fm mais il est ni certifié, ni " "approuvé par Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Remarque : ce chercheur utilise l'API TMDb mais il est ni certifié, ni " "approuvé par TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Remarque : ce chercheur utilise l'API theTVDB.com. SVP, aidez à l'améliorer " "l'information sur theTVDB.com en cliquant le lien." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Artistes" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Albums" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Genres" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Liste de lecture" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 artiste" msgstr[1] "%1 artistes" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 album" msgstr[1] "%1 albums" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 genre" msgstr[1] "%1 genres" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Liste de lecture" msgstr[1] "Liste de lecture" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 chanson" msgstr[1] "%1 chansons" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 clip" msgstr[1] "%1 clips" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "Un flux" msgstr[1] "%1 flux" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Nouveau flux audio" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Editer l'information pour créer un nouveau flux audio" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "CD Audio - %1 Pistes" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 piste" msgstr[1] "%1 pistes" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "Vidéo DVD - %1 titres" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Sans titre" msgstr[1] "Sans titre" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Nouveau podcast audio" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Editer l'information pour créer un nouveau podcast audio" # msgid "New audio feed" # msgstr "Nouveau flux audio" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 flux" msgstr[1] "%1 flux" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Nouveau flux vidéo" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Editer l'information pour créer un nouveau podcast vidéo" #: platform/listengines/filelistengine.cpp:70 #, fuzzy msgid "Collecting file info..." msgstr "Collecte l'information sur les fichiers..." #: platform/listengines/filelistengine.cpp:340 #, fuzzy, kde-format msgid "Collecting file info (%1 files)..." msgstr "Collecte l'information sur les fichiers (%1 fichiers)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Lu récemment" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Chansons" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Clips" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Flux audio" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Podcasts audio" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Fichiers et dossiers" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Acteurs" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Réalisateurs" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Films" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Regardé récemment" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Regardé fréquemment" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Séries télévisées" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Clips vidéo" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Flux vidéo" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Artistes - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Toutes les chansons" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Albums - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Albums - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "lu 1 fois" msgstr[1] "lu %1 fois" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 étiquette" msgstr[1] "%1 étiquettes" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Films - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 film" msgstr[1] "%1 films" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Séries Télévisées Non Catégorisées" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 émission" msgstr[1] "%1 émissions" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Saisons non catégorisées" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Saisons - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 saison" msgstr[1] "%1 saisons" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Saison %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Saisons non catégorisées" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 épisode" msgstr[1] "%1 épisodes" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 acteur" msgstr[1] "%1 acteurs" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "Un réalisateur" msgstr[1] "%1 réalisateurs" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "dossier" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "il y a un an" msgstr[1] "il y a %1 années" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "il y a un mois" msgstr[1] "il y a %1 mois" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "il y a une semaine" msgstr[1] "il y a %1 semaines" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "il y a un jour" msgstr[1] "il y a %1 jours" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "il y a une heure" msgstr[1] "il y a %1 heures" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "il y a une minute" msgstr[1] "il y a %1 minutes" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "il y a quelques secondes" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Titre %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Disque Complet" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Saison %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Épisode %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Saison %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" #~ msgid "Showing Information
Click to hide information." #~ msgstr "" #~ "Affiche Les Informations
Cliquez pour masquer les informations." #~ msgid "A Media Player" #~ msgstr "Un Lecteur Multimédia" #~ msgid "Buschmann" #~ msgstr "Buschmann" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Kristof Bal" #~ msgstr "Kristof Bal" #~ msgid "Ryan Kavanagh" #~ msgstr "Ryan Kavanagh" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Informations" #~ msgid "Fetch info and edit" #~ msgstr "Récupérer les informations et éditer" #~ msgid "Fetch info for selected item(s)" #~ msgstr "Récupèrer les informations pour le(s) élément(s) sélectionné(s)" #, fuzzy #~ msgid "Description:%1" #~ msgstr "Description" #~ msgid "Show video Settings" #~ msgstr "Afficher les Réglages vidéo" #~ msgid "Show audio Settings" #~ msgstr "Afficher les Rglages audio" #, fuzzy #~ msgid "Last played: %1" #~ msgstr "Dernière Lecture" #~ msgid "Playback message" #~ msgstr "Message de lecture" #~ msgid "Not Playing" #~ msgstr "Ne Joue Rien" #~ msgid "Shuizhuyuanluo" #~ msgstr "Shuizhuyuanluo" #~ msgid "results" #~ msgstr "résultats" #~ msgid "Additional info may be available..." #~ msgstr "Des informations supplémentaires sont peut-être disponible..." #~ msgid "Run Script" #~ msgstr "Lancer Script" #~ msgid "Choose Interpreter:" #~ msgstr "Choisissez l'interpréteur : " #~ msgid "Bangarang - Scripting Console" #~ msgstr "Bangarang - Console de Scripting" #~ msgid "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgstr "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgid "DVD Menu" #~ msgstr "Menu DVD" #~ msgid "Angles" #~ msgstr "Angles" #~ msgid "Chapters" #~ msgstr "Chapitres" #~ msgid "Titles" #~ msgstr "Titres" #~ msgid "Audio Channels" #~ msgstr "Canaux Audio" #~ msgid "Subtitles" #~ msgstr "Sous-titres" #~ msgid "episodeNumber" #~ msgstr "Numéro de l'épisode" #~ msgid "Configure shortcuts..." #~ msgstr "Configurer les raccourcis claviers…" #, fuzzy #~ msgid "Show video vettings" #~ msgstr "Afficher les réglages vidéo" #~ msgid "Show Remaining Time" #~ msgstr "Afficher le temps restant" #~ msgid "Updating..." #~ msgstr "Actualisation…" #~ msgid "Updated info for %1, %2" #~ msgstr "Mettre à jour les données pour %1, %2" #~ msgid "Removed info for %1" #~ msgstr "Données supprimées pour %1" #~ msgid "Hue" #~ msgstr "Teinte" #~ msgid "Track %1" #~ msgstr "Piste %1" #, fuzzy #~ msgctxt "%1=Title of DVD" #~ msgid "DVD Video - %1" #~ msgstr "Vidéo DVD - %1 Titres" #, fuzzy #~ msgid "Index audio file(s)" #~ msgstr "Ouvrir des fichiers audio" #, fuzzy #~ msgid "Index folder containing audio file(s)" #~ msgstr "Ouvrir un dossier qui contient des fichiers audio" #, fuzzy #~ msgid "Index video file(s)" #~ msgstr "Ouvrir des fichiers vidéo" #, fuzzy #~ msgid "Index folder containing video file(s)" #~ msgstr "Ouvrir un dossier qui contient des fichiers vidéo" #~ msgid "Audio Files" #~ msgstr "Fichiers audio" #~ msgid "Video Files" #~ msgstr "Fichiers vidéo" #~ msgid "Image" #~ msgstr "Image" #~ msgid "Double-click to edit" #~ msgstr "Double-cliquez pour éditer" #~ msgid "Recently Played Artists" #~ msgstr "Artistes joués récemment" #~ msgid "Highest Rated Artists" #~ msgstr "Artistes les mieux notés" #~ msgid "Frequently Played Artists" #~ msgstr "Artistes joués fréquemment" #~ msgid "Recently Played Albums" #~ msgstr "Albums joués récemment" #~ msgid "Highest Rated Albums" #~ msgstr "Albums les mieux notés" #~ msgid "Frequently Played Albums" #~ msgstr "Albums joués fréquemment" #~ msgid "Recently Played Genres" #~ msgstr "Styles joués récemment" #~ msgid "Highest Rated Genres" #~ msgstr "Styles les mieux notés" #~ msgid "Frequently Played Genres" #~ msgstr "Styles joués fréquemment" #~ msgid "Recently Played Clips" #~ msgstr "Clips joués récemment" #~ msgid "Highest Rated Clips" #~ msgstr "Clips les mieux notés" #~ msgid "Frequently Played Clips" #~ msgstr "Clips joués fréquemment" #~ msgid "Recently Played Streams" #~ msgstr "Flux audio joués récemment" #~ msgid "Highest Rated Streams" #~ msgstr "Flux audio les mieux notés" #~ msgid "Frequently Played Streams" #~ msgstr "Flux audio joués fréquemment" #, fuzzy #~ msgid "Recently Played Tags" #~ msgstr "Chansons écoutées récemment" #, fuzzy #~ msgid "Highest Rated Tags" #~ msgstr "Chansons les mieux notées" #, fuzzy #~ msgid "Frequently Played Tag" #~ msgstr "Écoutés fréquemment" #~ msgid "Recently Watched Movies" #~ msgstr "Films joués récemment" #~ msgid "Highest Rated Movies" #~ msgstr "Films les mieux notés" #~ msgid "Frequently Watched Movies" #~ msgstr "Films joués fréquemment" #~ msgid "Recently Watched TV Shows" #~ msgstr "Émissions de télévision jouées récemment" #~ msgid "Highest Rated TV Shows" #~ msgstr "Émissions de télévision les mieux notées" #~ msgid "Frequently Watched TV Shows" #~ msgstr "Émissions de télévision jouées fréquemment" #~ msgid "Recently Watched Genres" #~ msgstr "Styles visionnés récemment" #~ msgid "Frequently Watched Genres" #~ msgstr "Styles regardés fréquemment" #~ msgid "Recently Watched Actors" #~ msgstr "Acteurs regardés récemment" #~ msgid "Highest Rated Actors" #~ msgstr "Acteurs les mieux notés" #~ msgid "Frequently Watched Actors" #~ msgstr "Acteurs regardés fréquemment" #~ msgid "Recently Watched Directors" #~ msgstr "Directeur regardés récemment" #~ msgid "Highest Rated Directors" #~ msgstr "Directeur les mieux notés" #~ msgid "Frequently Watched Directors" #~ msgstr "Directeurs regardés fréquemment" #~ msgid " All songs" #~ msgstr " Toutes les chansons" #, fuzzy #~ msgid "Add selected info" #~ msgstr "Ajouter l'information sélectionnée" #, fuzzy #~ msgid "Search in playlist..." #~ msgstr "Recherche dans la liste de lecture…" #~ msgid "Toggle Show Remaining Time" #~ msgstr "Aciver/Désactiver l'affichage du temps restant" #~ msgid "Toggle fullscreen" #~ msgstr "Activer / désactiver le mode plein écran" #~ msgid "Show Scripting Console" #~ msgstr "Afficher la console de scripting" #~ msgid "03:00" #~ msgstr "03:00" #~ msgid "Untitled Audio Stream" #~ msgstr "Flux audio sans titre" #~ msgid "Select this item, click Info then Edit to enter audio stream info" #~ msgstr "" #~ "Sélectionnez cet élément, cliquez Info et Éditer pour saisir les détails " #~ "du flux audio" #~ msgid "Open image file(s)" #~ msgstr "Ouvrir des images" #~ msgid "Open folder containing image file(s)" #~ msgstr "Ouvrir un dossier qui contient des images" #~ msgid "Rating" #~ msgstr "Notation" #~ msgid "List of Tags" #~ msgstr "Liste de Tags" #~ msgid "%1" #~ msgstr "%1" #~ msgid "Files with Tag '%1'" #~ msgstr "Fichiers avec le Tag « %1 »" #~ msgid "Edit" #~ msgstr "Modifier" #, fuzzy #~ msgid "Saving..." #~ msgstr "Enregistrement..." #~ msgid "Track Number" #~ msgstr "Numéro de la piste" #~ msgid "Sort" #~ msgstr "Tri" #~ msgid "2" #~ msgstr "2" #~ msgid "%1 - Episode %2" #~ msgstr "%1 - Épisode %2" #~ msgid "Collection/Series Name" #~ msgstr "Nom de la collection&ubsp;/ série" #~ msgid "buttonGroup" #~ msgstr "buttonGroup" bangarang-bangarang/po/hu/000077500000000000000000000000001166760560600157635ustar00rootroot00000000000000bangarang-bangarang/po/hu/CMakeLists.txt000066400000000000000000000001641166760560600205240ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( hu ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/hu/bangarang.po000066400000000000000000002136441166760560600202550ustar00rootroot00000000000000# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Lutring Márk, 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-11-27 20:19+0100\n" "Last-Translator: Lutring Márk \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Mark Lutring" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "marcus@elitemail.hu" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Lista hozzáadása" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Lista eltávolítása" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Beállítások" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Lista hozzáadása" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Forrás" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Aktuális nézet" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Aktuális kiválasztás" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Aktuális lejátszólista" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Új lista neve" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Név" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Mentés" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Visszatérés a listákhoz" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Lista beállítások elmentve" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Név" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Lista címe" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "megjelenítése" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "elem" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "lejátszva" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "előtt" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "után" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "vagy több" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "pontosan" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "vagy kevesebb" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "×" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Média listák" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Hang keresése" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Hang" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Videó" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Jelenleg lejátszás alatt álló megtekintése" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Jelenleg lejátszás alatt" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Összefoglaló" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Szűrő" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "További információ elérhető lehet innen:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Információ leletöltése és változtatások szerkesztése" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Információ letöltése és változtatások mentése" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Találatok" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Szerkesztés visszavonása" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Kiválasztott Indexelése" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Értesítő üzenet" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Előző" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Minden média lejátszása a listában" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Mind lejátszása" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Kiválasztott média lejátszása a listában" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Kiválasztott lejátszása" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Külső felirat" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Lejátszólista" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Hiba üzenet" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Következők megjelenítése" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Lejátszólista" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Lejátszólista kiürítése" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Ismétlés bekapcsolása" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Véletlenszerű lejátszás bekapcsolása" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Értesítés" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Igen" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Nem" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Hang beállítások" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Hang csatorna:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Equalizer" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Előre beállított" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Előre" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Alapértelmezés visszaállítása" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Elrejtés" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Videó beállítások" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Felirat:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Szög:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Fényesség:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Kontraszt:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Árnyalat:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Telítettség:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Képarány" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automatikus" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Illeszkedő" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Méretezés" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Méretezés, hogy illeszkedjen" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Méretezés és levágás" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Gyorsbillentyűk" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Gyorsbillentyűk mentése" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Mégsem" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Média Listák megtekintése" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Megjelenítés teljes képernyőben" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Eltelt idő
Kattintson a hátralévő idő megjelenítéséhez" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Hangerő némítása" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Hangerő" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Visszatérés a listákhoz" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Média lejátszó a KDE környezethez" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2011, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Megjegyzés: A letöltő a TMDb API-ját használja, de nem támogatja vagy " "hitelesíti a TMDb. Kérjük segítsen tovább fejleszteni az adatbázist, hogy " "meglátogatja a TMDb-t.
Megjegyzés:" " A letöltő a Last.fm API-ját használja, de nem támogatja vagy hitelesíti " "a Last.fm. Kérjük segítsen tovább fejleszteni az adatbázist, hogy " "meglátogatja a Last.fm-t.
Megjegyzés: " "A letöltő a TheTVDB.com API-ját használja, de nem támogatja vagy hitelesíti " "a TheTVDB.com.Kérjük segítsen tovább fejleszteni az adatbázist, hogy " "meglátogatja a TheTVDB.com-t." #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Készítő" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Hozzájáruló" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Hibákat lehet jelenteni a http://code.google.com/p/bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Hibákat lehet jelenteni a Bangarang Issue Tracker-en" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "'URL' lejátszása" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Videó DVD lejátszása" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Zene CD lejátszása" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Kiegészítő hibakereső kimenet megjelenítése" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Kilépés" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Lejátszás/Szünet" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Lejátszás" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Szünet" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Következő lejátszása" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Előző lejátszása" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Némítás" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Mind lejátszása" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Kiválasztott lejátszása" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Hozzáadás a lejátszólistához" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Hozzáadás a most játszott után" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Eltávolítás a lejátszólistából" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Irányítás elrejtése" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Szűrő megjelenítése" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Hátralévő idő megjelenítése" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Videó beállítások megjelenítése" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Hang beállítások megjelenítése" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Teljes képernyő" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Kiválasztott információ mentése" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Kiválasztott információ törlése" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Frissítés" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Eltávolítás a listáról" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Hozzáadás a „Hang adatfolyam” -hoz" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Hozzáadás a listához" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Hozzáadás a listához" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Új lista" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Elemek megjelenítése" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Információ megjelenítése" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Információs nézet megjelenítése" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Könyvjelző hozzáadása" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Könyvjelző eltávolítása" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Gyorsbillentyű szerkesztő megjelenítése" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Ontológiák frissítése..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Elrejtés a tálcára" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Információk szerkesztése" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Információs nézet elrejtése" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Lejátszás a jelenleg játszott után" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Információ elrejtése" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "%1. fejezet" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Irányítás megjelenítése" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Irányítás elrejtése" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Videó beállítások elrejtése" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Hang beállítások elrejtése" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Gyorsbillentyű szerkesztő elrejtése" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Hangerő visszaállítása" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Videó méretének visszaállítása" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Hátralévő idő megjelenítése" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Könyvjelző-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Ontológiák frissítése." #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Ontológiák frissítése biztosítja, hogy a média információk oly módon vannak " "eltárolva, hogy elérhető válnak más asztali alkalmazások számára is.\n" "Ez csak akkor fontos, ha most frissítette a Bangarangot vagy a KDE SC-" "t

Ez eltarthat pár percig." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Megállítás" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Bezárás" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Szűrő elrejtése" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Hang beállítások megjelenítése" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Videó beállítások megjelenítése" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang képtelen elérni a Nepomuk Szemantikus Asztalt. Média könyvtár, " "értékelés és lejátszások száma funkció elérhetetlen lesz." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Ne mutassa ezt az üzenet újra" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Folytatás" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD Videó" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "Hang CD" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "" "Teljes képernyő
Kattintson a kilépéshez a teljes képernyős módból" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Teljes képernyő megjelenítése" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Hozzáadás a lejátszólistához/Eltávolítás a lejátszólistából" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Dalok megjelenítése" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Albumok megjelenítése" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Előadók megjelenítése" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Zene" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Hang adatfolyam" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Hang Klip" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Film" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "TV műsor" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Videó Klip" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Nincs leírás" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Több érték" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Grafikafájl megnyitása" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Nyomja meg gombot a szerkesztés befejezéséhez" #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Kattintson az elrejtéshez" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "További információk lehetnek elérhetőek
Kattintson több " "megjelenítéséhez..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "értékelve" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Videó keresése" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Hang keresés" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Videó keresés" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Kész" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Névtelen" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Eltávolítás" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Biztos, hogy eltávolítja ezt: %1 ?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Nincs effekt" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rock" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Reggae" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Dance" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Élő" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Klasszikus" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Kasszasiker" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Dokumentum" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Dráma" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Kézi" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Előadó: " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Szerző: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Album: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Szám: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Év: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Műfaj: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Címkék" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Színész: " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Rendező: " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Író: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Producer " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Hátralévő idő
Kattintson az eltelt idő és a könyvjelzők " "megjelenítéséhez" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Eltelt idő
Kattintson a hátralévő idő és könyvjelzők " "megjelenítéséhez" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "PausedTartsa nyomva a leállításhoz" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Szórakoztatás...Most" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "" "Következők megjelenítése
Kattintson a lejátszólista " "megjelenítéséhez" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Lejátszás
Kattintson a szünethez
Tartsa nyomva a leállításhoz" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Hiba lépett fel lejátszás közben" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Lejátszólista betöltése..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Pufferelés..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Töltés..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Némítva
Kattintson a hangerő visszaállításához" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Ismétlés bekapcsolva
Kattintson az ismétlés kikapcsolásához" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Véletlenszerű lejátszás
Kattintson a kikapcsoláshoz" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Biztos, hogy kiakarja üríteni a jelenlegi lejátszólistát?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "egy elem, %2" msgstr[1] "%1 elem, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "egy elem" msgstr[1] "%1 elem" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Lejátszólista (Következők)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Letiltás" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Típus" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Grafika" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Cím" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Előadó" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Szerző" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Album" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Szám" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Év" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Műfaj" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Címkék" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Hely" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Színész" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Rendező" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Író" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Producer" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Sorozat" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Évad" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Epizód" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Hivatkozás" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Lejátszások száma" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Utoljára játszva" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Infó letöltése egy elemhez..." msgstr[1] "Infó letöltése %1 elemhez..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Információ letöltve %2 elemhez 1 elemből..." msgstr[1] "Információ letöltve %2 elemhez %2 elemből..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Nincs találat" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Mostanában hallgatott dalok" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Legjobban értékelt dalok" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Gyakran játszott dalok" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Mostanában játszott" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Legjobban értékelt" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Gyakran játszott" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Letöltés visszavonva" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Frissítés kezdése..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Frissítve: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Információ eltávolítása..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Többes" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Többes %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Nincs találat" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "Hang típusok és tulajdonságok frissítése
0 elem frissítve..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "Hang típusok és tulajdonságok frissítése
%1 elem kész..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "Videó típusok és tulajdonságok frissítése
%1 elem kész..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "Hang típusok és tulajdonságok frissítése
%1 elem kész..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "Videó típusok és tulajdonságok frissítése
%1 elem kész..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Frissítés kész" #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Frissítés megállítva" #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Videó keresés" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "A letöltő az információt a DBPedia.org-ról szedi." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Megjegyzés: A letöltő a TMDb API-ját használja, de nem támogatja vagy " "hitelesíti a TMDb." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Hírforrás információ" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "A letöltő információt szerez a meghatározott forrás helyéről." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Fájlnév Információ" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Ez a letöltő kitalálja az évadot és az epizódot a fájlnévből. Pl.2x23 vagy " "S02E23 vagy 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Megjegyzés: A letöltő a Last.fm API-ját használja, de nem támogatja vagy " "hitelesíti a Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Megjegyzés: A letöltő a TMDb API-ját használja, de nem támogatja vagy " "hitelesíti a TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Megjegyzés: A letöltő a theTVDB.com API-ját használja, de nem támogatja vagy " "hitelesíti a TheTVDB.com." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Előadók" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Albumok" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Műfajok" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Lejátszólista" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "egy előadó" msgstr[1] "%1 előadó" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "egy album" msgstr[1] "%1 album" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "egy műfaj" msgstr[1] "%1 műfaj" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Lejátszólista" msgstr[1] "Lejátszólista" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "egy dal" msgstr[1] "%1 dal" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "egy klip" msgstr[1] "%1 klip" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "egy adatfolyam" msgstr[1] "%1 adatfolyam" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Új Hang adatfolyam" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Infó szerkesztése új hang adatfolyam létrehozásához" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Audio CD - %1 szám" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "egy szám" msgstr[1] "%1 szám" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD Videó - %1 Fejezet" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Névtelen" msgstr[1] "Névtelen" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Új Hang forrás" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Infó szerkesztése új hang forrás létrehozásához" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "egy hírforrás" msgstr[1] "%1 hírforrás" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Új videó forrás" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Infó szerkesztése új videó forrás létrehozásához" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Fájl infó begyűjtése" #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Fájl infó begyűjtése (%1 fájl)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Mostanában játszott" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Dalok" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Klipek" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Hangfolyamok" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Audio Források" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Fájlok és Mappák" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Színészek" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Rendezők" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Filmek" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Most nézett" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Gyakran nézett" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "TV műsorok" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Videó Klipek" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Videó Források" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Előadók - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Minden Zene" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Albumok - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Albumok - %1 -%2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "Egyszer lejátszva" msgstr[1] "lejátszva ennyiszer: %1" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "egy címke" msgstr[1] "%1 címke" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Filmek - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "egy film" msgstr[1] "%1 film" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Kategorizálatlan TV műsorok" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "egy műsor" msgstr[1] "%1 műsor" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Kategorizálatlan évadok" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Évadok - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "egy évad" msgstr[1] "%1 évad" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - %2. évad" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Kategorizálatlan évadok" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "egy epizód" msgstr[1] "%1 epizód" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "egy színész" msgstr[1] "%1 színész" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "egy rendező" msgstr[1] "%1 rendező" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "mappa" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "egy évvel ezelőtt" msgstr[1] "%1 évvel ezelőtt" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "egy hónappal ezelőtt" msgstr[1] "%1 hónappal ezelőtt" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "egy héttel ezelőtt" msgstr[1] "%1 héttel ezelőtt" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "egy nappal ezelőtt" msgstr[1] "%1 nappal ezelőtt" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "egy órával ezelőtt" msgstr[1] "%1 órával ezelőtt" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "egy perccel ezelőtt" msgstr[1] "%1 perccel ezelőtt" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "pár másodperce" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Cím %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Teljes Lemez" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "%1. évad" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "%1. epizód" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "%1. évad" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" bangarang-bangarang/po/it/000077500000000000000000000000001166760560600157635ustar00rootroot00000000000000bangarang-bangarang/po/it/CMakeLists.txt000066400000000000000000000001641166760560600205240ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( it ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/it/bangarang.po000066400000000000000000002275161166760560600202600ustar00rootroot00000000000000# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # , 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-11-08 22:06+0100\n" "Last-Translator: \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Giovanni Tedaldi" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "t3ddy1988@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "Form" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Aggiungi lista" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Rimuovi lista" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Impostazioni" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Aggiungi Lista" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Origine" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Vista Corrente" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Selezione Corrente" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Scaletta Corrente" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Nome Nuova Lista" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Nome" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Salva" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Ritorna alle Liste" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Salvate Impostazioni Lista" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Nome" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Titolo Lista" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Programma" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "elementi" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "riprodotto" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "prima" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "dopo" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "o più" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "esattamente" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "o meno" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "volte" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Lista Media" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Ricerca per l'audio" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Audio" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Video" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Mostra In Riproduzione" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "In Riproduzione" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Sommario" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Filtro" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Informazioni aggiuntive potrebbero essere disponibili da:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Recupera info e modifica cambiamenti" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Recupera info e salva cambiamenti" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Corrispondenze" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Annulla Modifica" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Indicizza Selezionati" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Testo Notifica" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Precedente" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Riproduci tutti i media nella lista" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Riproduci Tutti" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Riproduci media selezionati nella lista" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Riproduci Selezionati" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Sottotitoli Esterni" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Scaletta" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Messaggio di errore" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Mostra Prossimi" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Scaletta" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Svuota Scaletta" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Attiva Ripetizione" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Attiva Casuale" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Notifica" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Sì" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "No" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Impostazioni Audio" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Canali Audio:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Equalizzatore" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Preimpostazioni" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Preamp" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Ripristina Default" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Nascondi" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Impostazioni Video" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Sottotitoli:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Angoli:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" "Impossibile determinare la codifica dei sottotitoli, per favore scegli:" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Luminosità:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Contrasto:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Colore:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Saturazione:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Rapporto d'Aspetto" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automatico" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Adatta" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Scala" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Adatta" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Scala e taglia" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Scorciatoie" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Salva Scorciatoie" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Annulla" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Mostra Liste Media" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Mostra tutto schermo" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Tempo trascorso
Click per vedere il tempo rimanente" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Volume muto" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Volume" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Ritorna Alle Liste" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Un lettore multimediale per il tuo desktop KDE" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2011, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Nota: Questo prodotto usa le API di TMDb, ma non è approvato o " "certificato da TMDb. Per favore aiuta a migliorare le informazioni " "disponibili visitando http://themoviedb.org
Nota: Questo prodotto " "usa le API di Last.fm, ma non è approvato o certificato da Last.fm. Per " "favore aiuta a migliorare le informazioni disponibili visitando http://last." "fm
Nota: Questo prodotto usa le API di TheTVDB.com ma non è " "approvato o certificato da TheTVDB.com. Per favore aiuta a migliorare " "leinformazioni disponibili visitando http://thetvdb.com" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Creatore" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Collaboratore" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "I difetti possono essere riportati a http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "I difetti possono essere riportati a Bangarang Issue Tracker" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Riproduci 'URL'" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Riproduci DVD Video" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Riproduci CD Musicale" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Mostra Output di Debug Aggiuntivo" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "Abilita la modalità touch per l'interfaccia" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Esci" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Riproduci/Pausa" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Riproduci" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Pausa" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Riproduci successivo" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Riproduci precedente" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Muto" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Riproduci tutti" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Riproduci selezionati" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Aggiungi alla scaletta" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Aggiungi dopo In Riproduzione" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Rimuovi dalla scaletta" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Nascondi controlli" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Mostra filtro" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Mostra tempo rimanente" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Mostra impostazioni video" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Mostra impostazioni audio" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Schermo intero" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Salva info selezionate" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Rimuovi info selezionate" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Ricarica" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Rimuovi dalla lista" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Aggiungi a \"Stream Audio\"" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Aggiungi alla lista" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Aggiungi alla lista" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Nuova lista" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Mostra elementi" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Mostra Informazioni" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Mostra Informazioni" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Aggiungi segnalibro" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Rimuovi segnalibro" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Mostra editor scorciatoie" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Aggiorna ontologie..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Nascondi nel vassoio di sistema" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Gestisci info" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Nascondi Informazioni" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Riproduci dopo In Riproduzione" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Nascondi Informazioni" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Capitolo %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Mostra Controlli" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Nascondi Controlli" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Nascondi impostazioni video" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Nascondi impostazioni audio" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Nascondi editor scorciatoie" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Ripristina Volume" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Ripristina dimensione video" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Mostra tempo trascorso" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Segnalibro-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Aggiorna ontologie" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Aggiornare le ontologie assicura che le informazioni multimediali vengano " "memorizzate in modo da renderle più accessibili ad altre applicazioni " "desktop. Questo è necessario solo se hai recentemente aggiornato Bangarang o " "KDE SC.

Potrebbe richiedere alcuni minuti." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Stop" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Chiudi" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Nascondi filtro" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Mostra Impostazioni Audio" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Mostra impostazioni video" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang non è in grado di accedere al repository Desktop Semantico " "Nepomuk. La libreria dei Media, le valutazioni e il contatore delle " "riproduzioni non saranno disponibile." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Non mostrare di nuovo questo messaggio" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Riprendi" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD Video" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "CD Audio" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Tutto schermo
Click per uscire" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Mostra a tutto schermo" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Aggiungi alla scaletta/Rimuovi dalla scaletta" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Mostra Canzoni" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Mostra Album" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Mostra Artisti" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Musica" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Stream Audio" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Audio Clip" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Film" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "Programmi TV" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Video Clip" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Nessuna descrizione" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Più Valori" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Apri file copertina" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Premi per terminare la modifica." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Click per nascondere" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "Informazioni aggiuntive potrebbero essere disponibili.
Click per " "mostrarne di più..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "valutato" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Ricerca per il video" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Ricerca Audio" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Ricerca Video" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Completo" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Senza Titolo" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Rimuovi" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Sei sicuro di voler rimuovere \"%1\"?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Nessun effetto" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rock" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Reggae" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Dance" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Live" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Classica" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Blockbuster" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Documentario" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Dramma" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Manuale" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Artista:" #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Compositore:" #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Album:" #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Traccia:" #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Anno:" #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Genere:" #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Tag" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Attore:" #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Regista:" #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Autore:" #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Produttore:" #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Tempo rimanente
Click per vedere il tempo trascorso e segnalibri" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Tempo trascorso
Click per vedere il tempo rimanente e segnalibri" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "In Pausa
Tieni premuto per fermare" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Intrattenimento... Ora!" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "Visualizzazione Prossimi
Click per mostrare la scaletta" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Riproduzione
Click per mettere in pausa
Tenere premuto per " "fermare" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Un errore si è verificato durante la riproduzione" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Caricamento scaletta..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Buffering..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Caricamento..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Muto
Click per ripristinare il volume" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Ripeti
Click per disattivare la ripetizione" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Casuale
Click per disattivare Casuale" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Sei sicuro di voler svuotare la scaletta corrente?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 elemento, %2" msgstr[1] "%1 elementi, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 elemento" msgstr[1] "%1 elementi" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Scaletta (Prossimi)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Disabilita" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Tipo" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Copertina" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Titolo" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Artista" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Compositore" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Album" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Traccia" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Anno" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Genere" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Tag" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Posizione" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Attore" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Regista" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Autore" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Produttore" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Serie" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Stagione" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Episodio" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Link" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Contatore Riproduzioni" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Ultime Riproduzioni" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Recupero info per %1 elemento..." msgstr[1] "Recupero info per %1 elementi..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Recuperate info per %1 di %2 elementi..." msgstr[1] "Recuperate info per %1 di %2 elementi..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Nessun Risultato" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Canzoni Riprodotte di Recente" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Canzoni con Voti Più Alti" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Canzoni Riprodotte di Frequente" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Riprodotti di Recente" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Voti Più Alti" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Riprodotti di Frequente" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Recupero Annullato" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Inizio aggiornamento..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Aggiornato: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Rimozione informazioni..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Multiplo" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Multiplo %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Nessun risultato" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Aggiornando tipi audio e proprietà
0 elementi aggiornati...Updating audio types and properties

%1 audio items done..." msgstr "" "Aggiornando tipi audio e proprietà
%1 elementi audio fatti...Updating video types and properties

%1 video items done..." msgstr "" "Aggiornando tipi video e proprietà
%1 elementi video fatti...Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "Pulizia proprietà audio errate
%1 elementi audio fatti...Cleaning up erroneous video properties
%1 video items done..." msgstr "" "Pulizia proprietà video errate
%1 elementi video fatti...Update complete." msgstr "Aggiornamento completato." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Aggiornamento interrotto." #: platform/playlist.cpp:671 msgid "Video Playback" msgstr "Riproduzione Video" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Questo fetcher ottiene informazioni da DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "Douban" #: platform/infofetchers/doubaninfofetcher.cpp:37 msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Nota: Questo fetcher usa le API di Douban, ma non è approvato o certificato " "da Douban." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Feed Info" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "" "Questo fetcher ottiene le informazioni per il feed alla posizione " "specificata." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Nome del file Info" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Questo fetcher indovina il numero di stagione e puntata sulla base di un " "pattern nel nome del file. Es. 2x23 o S02E23 o 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Nota: Questo fetcher usa le API di Last.fm, ma non è approvato o certificato " "da Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Nota: Questo fetcher usa le API di TMDb, ma non è approvato o certificato da " "TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Nota: Questo fetcher usa le API di theTVDB.com. Aiuta a migliorare le " "informazioni di theTVDB.com cliccando il link." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Artisti" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Album" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Generi" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Scaletta" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 artista" msgstr[1] "%1 artisti" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 album" msgstr[1] "%1 album" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 genere" msgstr[1] "%1 generi" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Scaletta" msgstr[1] "Scaletta" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 canzone" msgstr[1] "%1 canzoni" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 clip" msgstr[1] "%1 clip" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 stream" msgstr[1] "%1 stream" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Nuovo Stream Audio" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Modifica info per creare un nuovo stream audio" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "CD Audio - %1 Tracce" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 traccia" msgstr[1] "%1 tracce" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD Video - %1 Titoli" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Senza Titolo" msgstr[1] "Senza Titolo" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Nuovo feed audio" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Modifica info per creare un nuovo feed audio" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 feed" msgstr[1] "%1 feed" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Nuovo feed video" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Modifica info per creare un nuovo feed video" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Raccolta info file..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Raccolta info file (%1 file)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Riprodotti di Recente" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Canzoni" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Clip" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Stream Audio" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Feed Audio" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "File e Cartelle" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Attori" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Registi" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Film" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Visti di Recente" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Visti di Frequente" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Programmi TV" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Video Clip" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Feed Video" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Artisti - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Tutte le canzoni" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Album - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Album - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "riprodotto una volta" msgstr[1] "riprodotto %1 volte" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 tag" msgstr[1] "%1 tag" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Film - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 film" msgstr[1] "%1 film" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Programmi TV Senza Categoria" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 programma" msgstr[1] "%1 programmi" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Stagioni senza categoria" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Stagioni - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 stagione" msgstr[1] "%1 stagioni" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Stagione %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Stagioni Senza Categoria" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 episodio" msgstr[1] "%1 eEpisodi" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 attore" msgstr[1] "%1 attori" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 regista" msgstr[1] "%1 registi" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "cartella" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "un anno fa" msgstr[1] "%1 anni fa" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "un mese fa" msgstr[1] "%1 mesi fa" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "una settimana fa" msgstr[1] "%1 settimane fa" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "un giorno fa" msgstr[1] "%1 giorni fa" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "un'ora fa" msgstr[1] "%1 ore fa" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "un minuto fa" msgstr[1] "%1 minuti fa" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "pochi secondi fa" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Titolo %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Disco Pieno" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Stagione %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Episodio %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Stagione %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" #~ msgid "Showing Information
Click to hide information." #~ msgstr "" #~ "Visualizzazione Informazioni
Click per nascondere le " #~ "informazioni." #~ msgid "A Media Player" #~ msgstr "Un Player Multimediale" #~ msgid "Buschmann" #~ msgstr "Buschmann" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Kristof Bal" #~ msgstr "Kristof Bal" #~ msgid "Ryan Kavanagh" #~ msgstr "Ryan Kavanagh" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Info" #~ msgid "Fetch info and edit" #~ msgstr "Recupera info e modifica" #~ msgid "Fetch info for selected item(s)" #~ msgstr "Recupera info per gli elementi selezionati" #, fuzzy #~ msgid "Description:%1" #~ msgstr "Descrizione" #, fuzzy #~ msgid "Show video Settings" #~ msgstr "Mostra impostazioni video" #, fuzzy #~ msgid "Show audio Settings" #~ msgstr "Mostra impostazioni audio" #, fuzzy #~ msgid "Last played: %1" #~ msgstr "Ultime Riproduzioni" #~ msgid "Playback message" #~ msgstr "Messaggio Riproduzione" #~ msgid "Not Playing" #~ msgstr "Fermo" #~ msgid "Shuizhuyuanluo" #~ msgstr "Shuizhuyuanluo" #~ msgid "results" #~ msgstr "risultati" #~ msgid "Additional info may be available..." #~ msgstr "Info aggiuntive potrebbero essere disponibili..." #~ msgid "Run Script" #~ msgstr "Lancia Script" #~ msgid "Choose Interpreter:" #~ msgstr "Scegli Interprete:" #~ msgid "Bangarang - Scripting Console" #~ msgstr "Bangarang - Console di Scripting" #~ msgid "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgstr "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgid "DVD Menu" #~ msgstr "Menu DVD" #~ msgid "Angles" #~ msgstr "Angoli" #~ msgid "Chapters" #~ msgstr "Capitoli" #~ msgid "Titles" #~ msgstr "Titoli" #~ msgid "Audio Channels" #~ msgstr "Canali Audio" #~ msgid "Subtitles" #~ msgstr "Sottotitoli" #~ msgid "episodeNumber" #~ msgstr "Numero episodio" #~ msgid "Configure shortcuts..." #~ msgstr "Configura scorciatoie..." #~ msgid "Lookup info using %1" #~ msgstr "Ricerca info utilizzando %1" #~ msgid "Show video vettings" #~ msgstr "Mostra impostazioni video" #~ msgid "Show Remaining Time" #~ msgstr "Mostra Tempo Rimanente" #~ msgid "Enter url" #~ msgstr "Inserisci url" #~ msgid "Tags are separated with \";\"" #~ msgstr "I tag sono separati con \";\"" #~ msgid "Updating..." #~ msgstr "Aggiornando..." #~ msgid "Updated info for %1, %2" #~ msgstr "Aggiornate info per %1, %2" #~ msgid "Removed info for %1" #~ msgstr "Rimosse info per %1" #~ msgid "Hue" #~ msgstr "Tono" #~ msgid "Track %1" #~ msgstr "Traccia %1" #~ msgctxt "%1=Title of DVD" #~ msgid "DVD Video - %1" #~ msgstr "DVD Video - %1" #~ msgid "Indexer" #~ msgstr "Indicizzatore" #~ msgid "Index audio file(s)" #~ msgstr "Indicizza file audio" #~ msgid "Index folder containing audio file(s)" #~ msgstr "Indicizza cartella contenente file audio" #~ msgid "Index video file(s)" #~ msgstr "Indicizza file video" #~ msgid "Index folder containing video file(s)" #~ msgstr "Indicizza cartella contenente file video" #~ msgid "Audio Files" #~ msgstr "File Audio" #~ msgid "Video Files" #~ msgstr "File Video" #~ msgid "Image" #~ msgstr "Immagine" #~ msgid "Double-click to edit" #~ msgstr "Doppio click per modificare" #~ msgid "Recently Played Artists" #~ msgstr "Artisti Riprodotti di Recente" #~ msgid "Highest Rated Artists" #~ msgstr "Artisti con Voti Più Alti" #~ msgid "Frequently Played Artists" #~ msgstr "Artisti Riprodotti di Frequente" #~ msgid "Recently Played Albums" #~ msgstr "Album Riprodotti di Recente" #~ msgid "Highest Rated Albums" #~ msgstr "Album con Voti Più Alti" #~ msgid "Frequently Played Albums" #~ msgstr "Album Riprodotti di Frequente" #~ msgid "Recently Played Genres" #~ msgstr "Generi Riprodotti di Recente" #~ msgid "Highest Rated Genres" #~ msgstr "Generi con Voti Più Alti" #~ msgid "Frequently Played Genres" #~ msgstr "Generi Riprodotti di Frequente" #~ msgid "Recently Played Clips" #~ msgstr "Clip Riprodotti di Recente" #~ msgid "Highest Rated Clips" #~ msgstr "Clip con Voti Più Alti" #~ msgid "Frequently Played Clips" #~ msgstr "Clip Riprodotti di Frequente" #~ msgid "Recently Played Streams" #~ msgstr "Stream Riprodotti di Recente" #~ msgid "Highest Rated Streams" #~ msgstr "Stream con Voti Più Alti" #~ msgid "Frequently Played Streams" #~ msgstr "Stream Riprodotti di Frequente" #~ msgid "Recently Played Tags" #~ msgstr "Tag Riprodotti di Recente" #~ msgid "Highest Rated Tags" #~ msgstr "Tag con Voti Più Alti" #~ msgid "Frequently Played Tag" #~ msgstr "Tag Riprodotti di Frequente" #~ msgid "Recently Watched Movies" #~ msgstr "Film Visti di Recente" #~ msgid "Highest Rated Movies" #~ msgstr "Film con Voti Più Alti" #~ msgid "Frequently Watched Movies" #~ msgstr "Film Visti di Frequente" #~ msgid "Recently Watched TV Shows" #~ msgstr "Programmi TV Visti di Recente" #~ msgid "Highest Rated TV Shows" #~ msgstr "Programmi TV con Voti Più Alti" #~ msgid "Frequently Watched TV Shows" #~ msgstr "Programmi TV Visti di Frequente" #~ msgid "Recently Watched Genres" #~ msgstr "Generi Visti di Recente" #~ msgid "Frequently Watched Genres" #~ msgstr "Generi Visti di Frequente" #~ msgid "Recently Watched Actors" #~ msgstr "Attori Visti di Recente" #~ msgid "Highest Rated Actors" #~ msgstr "Attori con Voti Più Alti" #~ msgid "Frequently Watched Actors" #~ msgstr "Attori Visti di Frequente" #~ msgid "Recently Watched Directors" #~ msgstr "Registi Visti di Recente" #~ msgid "Highest Rated Directors" #~ msgstr "Registi con Voti Più Alti" #~ msgid "Frequently Watched Directors" #~ msgstr "Registi Visti di Frequente" #~ msgid " All songs" #~ msgstr " Tutte le canzoni" #~ msgid "" #~ "Updating audio types and properties
0 items updated..." #~ msgstr "" #~ "Aggiornando tipi audio e proprietà
0 elementi aggiornati..." #, fuzzy #~ msgid "Add selected info" #~ msgstr "Rimuovi info selezionate" #, fuzzy #~ msgid "Search in playlist..." #~ msgstr "Caricamento scaletta..." #~ msgid "Toggle Show Remaining Time" #~ msgstr "Cambia Mostra Tempo Rimanente" #~ msgid "Toggle fullscreen" #~ msgstr "Tutto schermo" #~ msgid "Show Scripting Console" #~ msgstr "Mostra Console di Scripting" #~ msgid "03:00" #~ msgstr "03:00" #~ msgid "Untitled Audio Stream" #~ msgstr "Stream Audio Senza Titolo" #~ msgid "Select this item, click Info then Edit to enter audio stream info" #~ msgstr "" #~ "Seleziona questo elemento, click su Info poi Modifica per inserire le " #~ "informazioni" #~ msgid "Open image file(s)" #~ msgstr "Apri file immagine" #~ msgid "Open folder containing image file(s)" #~ msgstr "Apri cartella contenente file immagine" #~ msgid "Rating" #~ msgstr "Valutazione" #~ msgid "List of Tags" #~ msgstr "Lista dei Tag" #~ msgid "%1" #~ msgstr "%1" #~ msgid "Files with Tag '%1'" #~ msgstr "File con Tag '%1'" #~ msgid "Track Number" #~ msgstr "Numero Traccia" #~ msgid "Sort" #~ msgstr "Ordina" #~ msgid "Edit" #~ msgstr "Modifica" #~ msgid "2" #~ msgstr "2" bangarang-bangarang/po/lt/000077500000000000000000000000001166760560600157665ustar00rootroot00000000000000bangarang-bangarang/po/lt/CMakeLists.txt000066400000000000000000000001641166760560600205270ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( lt ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/lt/bangarang.po000066400000000000000000002157231166760560600202600ustar00rootroot00000000000000# This is the german translation of bangarang. # Copyright (C) 2009 bangarang-project # This file is distributed under the same license as the bangarang package. # # Vytautas Mickus vmickus@gmail.com>, 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2010-09-02 13:49+0200\n" "Last-Translator: Vytautas Mickus vmickus@gmail.com>\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Lokalize 1.1\n" "X-Language: lt_LT\n" "X-Source-Language: C\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Vytautas Mickus" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "vmickus@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Įtraukti į sąrašą" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Pašalinti sąrašą" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Nuostatos" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Įtraukti sąrašą" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Šaltinis" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Dabartinis vaizdas" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Dabar pažymėti" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Dabartinis grojaraštis" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Naujas sąrašo vardas" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Pavadinimas" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Išsaugoti" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Grįžti į sąrašą" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Išsaugotos sąrašo nuostatos" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Pavadinimas" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Sąrašo pavadinimas" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Rodyti" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "įrašas" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "rodyta" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "prieš" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "po" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "arba daugiau" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "tiksliai" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "arba mažiau" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "kartų" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Media bibioteka" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Ieškoti audio" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Audio" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Video" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Rodyti dabar grojamus" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Dabar grojama" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Santrauka" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "…" #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Filtras" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Papildomos informacijos gali būti:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Parsiųsti informaciją ir redaguoti pakeitimus" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Parsiųsti informaciją ir išsaugoti pakeitimus" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Atitikmenys" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Atšaukti redagavimą" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Rodyklė pažymėta" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Pranešimo tekstas" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Ankstesnis" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Groti visus įrašus šiame sąraše" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Groti visus" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Groti pažymėtus įrašus iš sąrašo" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Groti pažymėtus" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Išoriniai subtitrai" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Grojaraštis" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Klaidos pranešimas" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Rodyti būsimus" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Grojaraštis" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Išvalyti grojaraštį" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Įjungti kartojimą" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Įjungti atsitiktinę grojimo tvarką" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Pranešimas" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Taip" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Ne" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Audio nuostatos" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Audio kanalas:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Ekvalaizeris" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Standartiniai nustatymai" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Pre" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Atstatyti standartinius" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Paslėpti" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Video nuostatos" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Subtitrai:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Kampas:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Ryškumas:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Kontrastas:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Atspalvis:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Saturacija:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Proporcijos" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automatinis" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Pritaikyti" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Išdidinimas" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Išdidinti kad tilptų" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Išdinti ir nukarpyti" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Klavišai" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Išsaugoti klavišus" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Atšaukti" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Rodyti media sąrašus" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Rodyti per visą ekraną" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "" " Praėjęs laikas
Spauskite norėdami pamatyti likusį laiką bei " "žymes" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Nutildyti garsą" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Garsumas" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Grįžti į sąrašą" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Media grotuvas jūsų KDE darbastaliui" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2010, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" " Pastaba: Šis produktas naudoja TMDb API, bet nėra patvirtintas arba " "sertifikuotas TMDb. Prašome padėti pagerinti turimą informaciją, apsilankę " "http://themoviedb.org
Pastaba: Šis produktas naudoja Last.fm " "API, bet nėra patvirtintas arba sertifikuotas Last.fm. Prašome jus padėti " "pagerinti turimą informaciją, apsilankę http://last.fm
Pastaba: Šis produktas naudoja TheTVDB.com API, bet nėra patvirtintas arba " "sertifikuotas TheTVDB.com. Prašome jus padėti pagerinti turimą informaciją, " "apsilankę http://thetvdb.com" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Autorius" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Pagalbininkai" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Pastebėtas klaidas prašome pranešti į: http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Pastebėtas klaidas prašome pranešti į: Bangarang Issue Tracker" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Groti nuorodą (URL)" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Groti DVD Video" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Groti muzikinį CD" # @TODO This one really isnt well #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Rodyti papildomą Debug informaciją" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Baigti" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Groti/Sustabdyti" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Groti" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Sustabdyti" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Groti kitą" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Groti ankstesnį" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Be garso" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Groti visus" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Groti pažymėtą" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Įtraukti į grojaraštį" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Ištraukti iškart po dabar grojamo" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Pašalinti iš grojaraščio" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Paslėpti valdymo mygtukus" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Rodyti filtrą" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Rodyti likusį laiką" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Rodyti video nuostatas" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Rodyti audio nuostatas" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Per visą ekraną" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Išsaugoti pažymėtą informaciją" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Pašalinti pažymėtą informaciją" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Atnaujinti" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Pašalinti iš sąrašo" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Įtraukti į „Audio srautai“" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Įtraukti į sąrašą" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Įtraukti į sąrašą " #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Naujas sąrašas" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Rodyti įrašus" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Rodyti informaciją" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Rodyti informaciją" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Įtraukti žymą" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Pašalinti žymą" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Rodyti klavišų redaktorių" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Atnaujinti ontologijas..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Paslėpti sisteminiame skydelyje" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Tvarkyti informaciją" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Paslėpti informaciją" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Groti po dabar grojamo" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Paslėpti informaciją" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Skyrius %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Rodyti valdymo mytukus" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Paslėpti valdymo mygtukus" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Paslėpti video nuostatas" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Paslėpti audio nuostatas" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Paslėpti klavišų redaktorių" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Atstatyti garsumą" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Atstatyti video dydį" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Rodyti praėjusį laiką" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Žyma-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Atnaujinti ontologijas" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Atnaujindami ontologijas jūs užtikrinate, kad visa sukaupta informacija bus " "pasiekiama kitų jūsų kompiuterio programų. Tai reikalinga tik tada kai " "atnaujinate Bangarang grtuvą ar KDE programų rinkinį.

Tai užtruks " "kelias minutes." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Stop" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Užverti" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Paslėpti filtrą" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Rodyti audio nuostatas" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Rodyti video nuostatas" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang negali prisijungti prie Nepomuk semantinio darbastalio saugyklos. " "Media biblioteka, reitingai ir grojimų statistika ir kitos funkcijos neveiks." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Daugiau nerodyti šio pranešimo" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Tęsti" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD Video" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "Audio CD" # @TODO feels fishy!! #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "" "Per visą ekraną
Paspauskite norėdami išjungti viso ekrano rėžimą" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Rodyti per visą ekraną" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Įtraukti į grojaraštį/Pašalinti iš grojaraščio" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Rodyti dainas" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Rodyti albumus" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Rodyti atlikėjus" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Muzika" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Audio kanalas" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Audio klipas" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Filmas" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "TV laida" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Video klipas" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Be aprašymo" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Keletas reikšmių" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Atverti paveikslėlį" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Spauskite norėdami baigti redagavimą." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Spauskite norėdami paslėpti" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "Yra daugiau informacijos
Paspauskite norėdami pamatyti daugiau..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "įvertinta" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Ieškoti video" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Audio paieška" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Video paieška" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Baigta" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Nepavadintas" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Pašalinti" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Ar jūs tikrai norite pašalinti \"%1\"?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Jokių efektų" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rokas" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Regis" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Šokių" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Atliekama gyvai" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Klasikinė" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Dokumentika" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Drama" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Rankinis" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Atlikėjas:" #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Kompozitorius: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Albumas:" #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Takelis: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Metai:" #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Žanras:" #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Žymos" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Aktorius:" #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Režisierius:" #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Scenaristas: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Prodiuseris: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" " Liko laiko
Paspauskite norėdami pamatyti praėjusį laiką bei " "žymes" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" " Praėjęs laikas
Spauskite norėdami pamatyti likusį laiką bei " "žymes" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "SustabdytaIlgai paspaudę išjunksite grojimą" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Pramogos... Dabar" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "Rodomi būsimi
Paspauskite norėdami matyti grojaraštį" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Grojama
Paspauskite jei norite sustabdyti
Ilgai paspaudę " "išjunksite grojimą" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Grojimo metu įvyko klaida" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Įkeliamas grojaraštis …" #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Nuskaitomi duomenys…" #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Įkeliama…" #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "NutildytaPaspauskite norėdami atstatyti garsumą" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Kartojimas įjungtas
Paspauskite norėdami išjungti kartojimą" # @TODO feels fishy!! #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "" "Grojimas atsitiktine tvarka įjungtas
Paspauskite norėdami išjungti " "atsitiktinę tvarką" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Ar jūs tikrai norite išvalyti grojaraštį?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 įrašas, %2" msgstr[1] "%1 įrašų, %2" msgstr[2] "%1 įrašai, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 įrašas" msgstr[1] "%1 įrašų" msgstr[2] "%1 įrašai" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Grojaraštis (Būsimas)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Išjunkti" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Tipas" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Paveikslėlis" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Pavadinimas" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Atlikėjas" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Kompozitorius" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Albumas" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Takelis" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Metai" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Žanras" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Žymos" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Buvimo vieta" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Aktorius" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Režisierius" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Scenaristas" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Prodiuseris" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Serialas" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Sezonas" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Epizodas" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Nuorodos" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Grojimų skaičius" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Paskutinį kartą grota" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Gaunama informacija %1 įrašui..." msgstr[1] "Gaunama informacija %1 įrašams..." msgstr[2] "Gaunama informacija %1 įrašams..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Gauta informacija %1 iš %2 įrašų..." msgstr[1] "Gauta informacija %1 iš %2 įrašų..." msgstr[2] "Gauta informacija %1 iš %2 įrašų..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Jokių rezultatų" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Paskutis grotos dainos" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Geriausiai įvertintos dainos" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Dažniausiai grotos dainos" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Vėliausiai grota" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Aukščiausiai įvertinta" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Dažniausiai grota" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Siuntimas atšauktas" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Pradedamas atnaujinimas..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Atnaujinta: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Pašalinama informacija..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Keletas" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Keletas %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Jokių rezultatų" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "Atnaujinami audio tipai ir savybės
0 įrašų atnaujinta..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "Atnaujinami audio tipai ir savybės
%1 įrašų atnaujinta..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "Atnaujinami video tipai ir savybės
%1 įrašų atnaujinta..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "Atnaujinami audio tipai ir savybės
%1 įrašų atnaujinta..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "Atnaujinami video tipai ir savybės
%1 įrašų atnaujinta..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Atnaujinimas baigtas." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Atnaujimas sustabdytas." #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Video paieška" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Šis informacijos šaltinis gauna duomenis iš DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Pastaba: Šis produktas naudoja TMDb API, bet tai nėra pritarta ir " "sertifikuota paties TMDb." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Kanao informacija" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "" #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Failo pavadinimo informacija" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Šis informacijos šaltinis sezono ir serijos numerius nuskaito iš failo " "pavadinimo, pagal nustatytus šablonus. Pvz.: 2x23 ar S02E23 ar 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Pastaba: Šis produktas naudoja Last.fm API, bet tai nėra pritarta ir " "sertifikuota paties TMDb." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Pastaba: Šis produktas naudoja TMDb API, bet tai nėra pritarta ir " "sertifikuota paties TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Pastaba: Naudojamas theTVDB.com informacijos šaltinis. Prašome paspausti " "nuorodą ir prisidėti prie theTVDB.com projekto tobulinimo." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Atlikėjai" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Albumai" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Žanrai" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Grojaraštis" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 atlikėjas" msgstr[1] "%1 atlikėjai" msgstr[2] "%1 atlikėjų" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 albumas" msgstr[1] "%1 albumai" msgstr[2] "%1 albumų" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 žanras" msgstr[1] "%1 žanrai" msgstr[2] "%1 žanrai" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Grojaraštis" msgstr[1] "Grojaraštis" msgstr[2] "Grojaraštis" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 daina" msgstr[1] "%1 dainų" msgstr[2] "%1 dainų" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 klipas" msgstr[1] "%1 klipai" msgstr[2] "%1 klipai" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 srautas" msgstr[1] "%1 srautai" msgstr[2] "%1 srautų" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Naujas audio srautas" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Redaguokite informaciją norėdami sukurti naują audio srautą" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Audio CD - %1 įrašų" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 įrašas" msgstr[1] "%1 irašai" msgstr[2] "%1 įrašų" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD Video - %1 antraštės" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Nepavadintas" msgstr[1] "Nepavadintas" msgstr[2] "Nepavadintas" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Naujas audio kanalas" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Redaguokite informaciją norėdami sukurti naują audio kanalą" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 kanalas" msgstr[1] "%1 kanalai" msgstr[2] "%1 kanalų" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Naujas video kanalas" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Redaguokite informaciją norėdami sukurti naują video kanalą" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Renkama failo informacija..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Renkama failo informacija (%1 failų)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Vėliausiai grota" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Dainos" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Klipai" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Audio srautai" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Audio kanalai" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Failai ir katalogai" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Aktoriai" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Režisieriai" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Filmai" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Vėliausiai žiūrėti" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Dažniausiai žiūrėti" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "TV laidos" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Video klipai" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Video kanalai" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Artistas - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Visos dainos" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Albumai - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Albumai - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "grota kartą" msgstr[1] "grota %1kartus" msgstr[2] "grota %1kartų" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 žyma" msgstr[1] "%1 žymos" msgstr[2] "%1 žymos" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Filmai - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 filmas" msgstr[1] "%1 filmai" msgstr[2] "%1 filmai" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Nesugrupuotos TV laidos" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 laida" msgstr[1] "%1 laidos" msgstr[2] "%1 laidų" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Nesugrupuoti sezonai" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Sezonas - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 sezonas" msgstr[1] "%1 sezonai" msgstr[2] "%1 sezonai" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Sesonas %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Nesugrupuoti serialai" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 epizodas" msgstr[1] "%1 epizodai" msgstr[2] "%1 epizodai" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 aktorius" msgstr[1] "%1 aktoriai" msgstr[2] "%1 aktoriai" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 režisierius" msgstr[1] "%1 režisieriai" msgstr[2] "%1 režisieriai" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "katalogas" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "prieš metus" msgstr[1] "prieš %1 metus" msgstr[2] "prieš %1 metų" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "prieš mėnesį" msgstr[1] "prieš %1 mėnesius" msgstr[2] "prieš %1 mėnesių" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "prieš savaitę" msgstr[1] "prieš %1 savaites" msgstr[2] "prieš %1 savaičių" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "prieš dieną" msgstr[1] "prieš %1 dienas" msgstr[2] "prieš %1 dienų" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "prieš valandą" msgstr[1] "prieš %1 valandas" msgstr[2] "prieš %1 valandų" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "prieš minutę" msgstr[1] "prieš %1 minutes" msgstr[2] "prieš %1 minučių" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "prieš kelias sekundes" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Pavadinimas %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Pilnas diskas" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Sezonas %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Epizodas %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Sezonas %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" #~ msgid "Showing Information
Click to hide information." #~ msgstr "" #~ "Rodoma informacija
Spauskite norėdami paslėpti informaciją." #~ msgid "A Media Player" #~ msgstr "Media grotuvas" #~ msgid "Buschmann" #~ msgstr "Buschmann" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Kristof Bal" #~ msgstr "Kristof Bal" #~ msgid "Ryan Kavanagh" #~ msgstr "Ryan Kavanagh" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Informacija" #~ msgid "Description:%1" #~ msgstr "Aprašymas:%1" #~ msgid "Fetch info and edit" #~ msgstr "Parsiųsti informaciją ir redaguoti" #~ msgid "Fetch info for selected item(s)" #~ msgstr "Parsiųsti informaciją pažymėtiems įrašams" bangarang-bangarang/po/nl/000077500000000000000000000000001166760560600157605ustar00rootroot00000000000000bangarang-bangarang/po/nl/CMakeLists.txt000066400000000000000000000001641166760560600205210ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( nl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/nl/bangarang.po000066400000000000000000002365021166760560600202500ustar00rootroot00000000000000# Copyright (C) 2009, 2010, 2011 Kristof Bal # This file is distributed under the same license as the Bangarang package. # # Kristof Bal , 2009, 2010, 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-12-03 12:23+0100\n" "Last-Translator: Kristof Bal \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Kristof Bal" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "kristof.bal@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "Form" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Lijst toevoegen" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Lijst verwijderen" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Instellingen" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Lijst toevoegen" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Bron" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Huidige weergave" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Huidige selectie" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Huidige afspeellijst" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "ownCloud/Ampache" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Nieuwe lijstnaam" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "Server" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 msgid "User Name" msgstr "Gebruikersnaam" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "Wachtwoord" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Opslaan" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Terug naar lijsten" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Opgeslagen lijstinstellingen" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Naam" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" "U kan de lijst exporteren naar een bestand indien u hem wenst te gebruiken " "in andere toepassingen" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "Exporteren naar bestand..." #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Titel van de lijst" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Programma" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "items" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "afgespeeld" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "voor" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "na" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "of meer" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "exact" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "of minder" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "keer" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Medialijsten" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Zoeken naar audio" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Audio" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Video" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Wat er nu afspeelt bekijken" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Speelt nu" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Samenvatting" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Filter" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Aanvullende informatie kan beschikbaar zijn van:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Informatie ophalen en wijzigingen bewerken" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Informatie ophalen en wijzigingen opslaan" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Overeenkomsten" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Bewerken annuleren" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Geselecteerde indexeren" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Meldingtekst" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Vorige" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Alle media in lijst afspelen" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Alles afspelen" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Geselecteerde media in lijst afspelen" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Geselecteerde afspelen" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "ExternalSubtitle" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Afspeellijst" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Foutmelding" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Volgende tonen" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Afspeellijst" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Afspeellijst wissen" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Herhalen inschakelen" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Willekeurig (shuffle) inschakelen" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Melding" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Ja" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Nee" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Audio-instellingen" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Audiokanaal:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Equalizer" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Vooraf instellen" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Pre" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Standaardwaarden herstellen" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Verbergen" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Video-instellingen" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Ondertiteling:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Hoek:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "Kan de codering van de ondertitels niet detecteren, selecteer deze:" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Helderheid:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Contrast:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Tint:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Verzadiging:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Beeldverhouding" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automatisch" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Passend" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Schaling" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Passend schalen" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Schalen en bijsnijden" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Sneltoetsen" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Sneltoetsen opslaan" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Annuleren" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Medialijsten tonen" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Volledig scherm tonen" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Verstreken tijd
Klik om de resterende tijd te tonen" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Volume dempen" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Volume" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Terug naar lijsten" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Een mediaspeler voor uw KDE-werkomgeving" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2011, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Opmerking: Dit product maakt gebruik van de TMDb-API maar is niet " "erkend of gecertificeerd door TMDb. Help de beschikbare informatie te " "verbeteren door http://themoviedb.org te bezoeken.
Opmerking: Dit " "product maakt gebruik van de Last.fm-API maar is niet erkend of " "gecertificeerd door Last.fm. Help de beschikbare informatie te verbeteren " "door http://last.fm te bezoeken.
Opmerking: Dit product maakt " "gebruik van de TheTVDB.com-API maar is niet erkend of gecertificeerd door " "TheTVDB.com. Help de beschikbare informatie te verbeteren door http://" "thetvdb.com te bezoeken." #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Maker" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Bijdragen" #: app/main.cpp:43 msgid "Elias Probst" msgstr "Elias Probst" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Fouten mogen worden gerapporteerd op http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Fouten mogen worden gerapporteerd op de foutentracker van Bangarang (Engels)" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "'URL' afspelen" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "DVD afspelen" #: app/main.cpp:54 msgid "Play CD Music" msgstr "MuziekCD afspelen" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Extra debuguitvoer tonen" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "Aanraakmodus (touch) activeren" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Afsluiten" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Afspelen/Pauzeren" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Afspelen" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Pauzeren" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Volgende afspelen" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Vorige afspelen" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Dempen" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Alles afspelen" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Geselecteerde afspelen" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Toevoegen aan afspeellijst" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Toevoegen achter wat nu afspeelt" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Uit afspeellijst verwijderen" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Bediening verbergen" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Filter tonen" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Resterende tijd tonen" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Video-instellingen tonen" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Audio-instellingen tonen" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Volledig scherm" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Geselecteerde informatie opslaan" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Geselecteerde informatie verwijderen" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Vernieuwen" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "Alles selecteren" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Uit lijst verwijderen" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Toevoegen aan \"Audiostreams\"" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Aan lijst toevoegen" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Aan lijst toevoegen " #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Nieuwe lijst" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Items tonen" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Informatie tonen" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Informatiepaneel tonen" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Bladwijzer toevoegen" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Bladwijzers verwijderen" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Sneltoetsbewerker tonen" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Ontologiëen bijwerken..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Verbergen in systeemvak" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Informatie beheren" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Informatiepaneel verbergen" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Afspelen achter wat nu afspeelt" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Informatie verbergen" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Hoofdstuk %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Bediening tonen" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Bediening verbergen" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Video-instellingen verbergen" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Audio-instellingen verbergen" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Sneltoetsbewerker verbergen" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Volume herstellen" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Videogrootte herstellen" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Verstreken tijd tonen" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Bladwijzer-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Ontologiëen bijwerken" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Het bijwerken van ontologiëen zorgt ervoor dat mediainformatie opgeslagen " "wordt op een manier die de infomatie beschikbaar stelt aan andere " "programma's. Dit is alleen nodig indien u Bangarang of uw KDE-" "softwarecompilatie recent bijgewerkt hebt.

Dit kan enkele minuten " "duren." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Stoppen" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Sluiten" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Filter verbergen" #: app/common/actionsmanager.cpp:1148 msgid "Show Audio Lists" msgstr "Audiolijsten tonen" #: app/common/actionsmanager.cpp:1154 msgid "Show Video Lists" msgstr "Videolijsten tonen" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang heeft geen toegang tot Nepomuk Semantic Desktop. De " "mediabibliotheek, waarderingen en afspeelteller zullen niet beschikbaar zijn." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Deze boodschap niet meer tonen" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Hervatten" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD-video" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "Audio-CD" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Volledig scherm
Klik om volledig scherm te beëindigen" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Volledig scherm tonen" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Aan afspeellijst toevoegen/Uit afspeellijst verwijderen" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Nummers tonen" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Albums tonen" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Artiesten tonen" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Muziek" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Audiostream" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Audioclip" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Film" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "TV-programma" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Videoclip" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Geen beschrijving" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Meerdere waarden" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Illustratiebestand openen" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Druk op om bewerken te beëindigen." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Klik om te verbergen" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "Aanvullende informatie kan beschikbaar zijn.
Klik om meer te tonen..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "gewaarderd" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Zoeken naar video" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Audio-zoekopdracht" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Video-zoekopdracht" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Voltooid" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" "Voer het volledig serverpad in.
Bijvoobeeld:
- voor ownCloud, " "voer in: \"http://[host]/owncloud/apps/media\"
- voor Ampache, voer in: " "\"http://[host]/ampache\"
" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Naamloos" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Verwijderen" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Weet u zeker dat u \"%1\" wilt wissen?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "*.m3u|M3U-bestanden (*.m3u)" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" "

Het bestand %1 bestaat reeds.

Wilt u het " "overschrijven?

" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Geen effect" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rock" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Reggae" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Dance" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Live" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Klassiek" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Blockbuster" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Documentaire" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Drama" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Handmatig" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Artiest: " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Componist: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Album: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Track: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Jaar: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Genre: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 msgid "Tags: " msgstr "Tags: " #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Acteur: " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Regisseur: " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Schrijver: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Producer: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Resterende tijd
Klik om de verstreken tijd en bladwijzers te tonen" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Verstreken tijd
Klik hier om de resterende tijd en bladwijzers te " "tonen" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Gepauzeerd
Ingedrukt houden om te stoppen" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Amusement... Nu" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "Toont volgende
Klik om de afspeellijst te tonen" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Aan het spelen
Klik om te pauzeren
Klik en ingedrukt houden om " "te stoppen" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Er trad een fout op bij het afspelen" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Bezig met de afspeellijst laden..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Aan het bufferen..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Bezig met laden..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Gedempt
Klik om het volume te herstellen" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Herhalen aan
Klik om herhalen uit te schakelen" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "" "Willekeurig (shuffle) aan
Klik om willekeurig uit te schakelen" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Weet u zeker dat u de huidige afspeellijst wilt wissen?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 item, %2" msgstr[1] "%1 items, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 item" msgstr[1] "%1 items" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Afspeellijst (Volgende)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Uitschakelen" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Type" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Illustraties" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Titel" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Artiest" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Componist" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Album" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Track" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Jaar" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Genre" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Tags" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Locatie" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Acteur" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Regisseur" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Schrijver" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Producent" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Serie" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Seizoen" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Aflevering" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Koppelingen" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Afspeelteller" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Als laatste afgespeeld" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Informatie voor %1 item ophalen..." msgstr[1] "Informatie voor %1 items ophalen..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Informatie opgehaald voor %2 van 1 item..." msgstr[1] "Informatie opgehaald voor %2 van %1 items..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Geen resultaten" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Recent afgespeelde nummers" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Hoogst beoordeelde nummers" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Veel afgespeelde nummers" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Recent afgespeeld" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Hoogst beoordeeld" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Veel afgespeeld" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Ophalen geannuleerd" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Bijwerken starten..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Bijgewerkt: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Informatie verwijderen..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Meerdere" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Meerdere %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Geen resultaten" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Bezig met bijwerken van audiotypes en eigenschappen
0 items " "bijgewerkt..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "Bezig met bijwerken van audiotypes en -eigenschappen
%1 audioitems " "bijgewerkt..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "Bezig met bijwerken van videotypes en -eigenschappen
%1 videoitems " "bijgewerkt..." #: platform/ontologyupdater.cpp:385 #, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "Bezig met opruimen van foutieve audio-eigenschappen
%1 audioitems " "bijgewerkt..." #: platform/ontologyupdater.cpp:413 #, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" "Bezig met opruimen van foutieve video-eigenschappen
%1 videoitems " "bijgewerkt..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Bijwerken voltooid." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Bijwerken gestopt." #: platform/playlist.cpp:671 msgid "Video Playback" msgstr "Video-vertoning" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Deze dienst haalt informatie op van DBPedia.org" #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "Douban" #: platform/infofetchers/doubaninfofetcher.cpp:37 msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Opmerking: Deze dienst maakt gebruik van de Douban-API, maar is niet erkend " "of gecertificeerd door Douban." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Feedinformatie" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "Deze dienst haalt informatie op voor de feed op de gegeven plaats." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Bestandsnaaminformatie" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Deze dienst raadt het nummer van seizoen en aflevering aan de hand van het " "bestandsnaampatroon. Bijvoorbeeld 2x23 of S02E23 of 2.23." #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Opmerking: Deze dienst maakt gebruik van de Last.fm-API, maar is niet erkend " "of gecertificeerd door Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Opmerking: Deze dienst maakt gebruik van de TMDb-API, maar is niet erkend of " "gecertificeerd door TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Opmerking: Deze dienst maakt gebruik van de theTVDB.com-API. Help met het " "verbeteren van de informatie op theTVDB.com door op de koppeling te klikken." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Artiesten" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Albums" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Genres" #: platform/listengines/ampachelistengine.cpp:161 msgid "Playlists" msgstr "Afspeellijsten" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 artiest" msgstr[1] "%1 artiesten" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 album" msgstr[1] "%1 albums" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 genre" msgstr[1] "%1 genres" #: platform/listengines/ampachelistengine.cpp:274 #, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "1 afspeellijst" msgstr[1] "%1 afspeellijsten" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 nummer" msgstr[1] "%1 nummers" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 clip" msgstr[1] "%1 clips" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 stream" msgstr[1] "%1 streams" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Nieuwe audiostream" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Bewerk informatie om nieuwe audiostream te maken" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Audio-CD - %1 tracks" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 track" msgstr[1] "%1 tracks" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD-video - %1 titels" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Naamloos" msgstr[1] "Naamloos" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Nieuwe audiofeed" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Bewerk informatie om nieuwe audiofeed te maken" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 feed" msgstr[1] "%1 feeds" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Nieuwe videofeed" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Bewerk om informatie om nieuwe videofeed te maken" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Bestandsinformatie verzamelen..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Bestandsinformatie verzamelen (%1 bestanden)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 msgid "Recently Added" msgstr "Recent toegevoegd" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Nummers" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Clips" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Audiostreams" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Audiofeeds" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Bestanden en mappen" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Acteurs" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Regisseurs" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Films" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Recent bekeken" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Veel bekeken" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "TV-programma's" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Videoclips" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Videofeeds" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Artiesten - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Alle nummers" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Albums - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Albums - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "1 keer afgespeeld" msgstr[1] "%1 keer afgespeeld" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "%1 toegevoegd" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 tag" msgstr[1] "%1 tags" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Films - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 film" msgstr[1] "%1 films" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "TV-programma's zonder categorie" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 TV-programma" msgstr[1] "%1 TV-programma's" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Seizoenen zonder categorie" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Seizoenen - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 seizoen" msgstr[1] "%1 seizoenen" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Seizoen %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Seizoenen zonder categorie" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 aflevering" msgstr[1] "%1 afleveringen" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 acteur" msgstr[1] "%1 acteurs" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 regisseur" msgstr[1] "%1 regisseurs" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "map" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "1 jaar geleden" msgstr[1] "%1 jaren geleden" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "1 maand geleden" msgstr[1] "%1 maanden geleden" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "1 week geleden" msgstr[1] "%1 weken geleden" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "1 dag geleden" msgstr[1] "%1 dagen geleden" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "1 uur geleden" msgstr[1] "%1 uren geleden" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "1 minuut geleden" msgstr[1] "%1 minuten geleden" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "enkele seconden geleden" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Titel %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Volledige schijf" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Seizoen %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Episode %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Seizoen %1" #, fuzzy #~ msgid "" #~ "\n" #~ "Enter full server path.
\n" #~ "For example,
\n" #~ "- ownCloud, enter \"http://[host]/owncloud/apps/media\"
\n" #~ "- Ampache enter \"http://[host]/ampache\"
\n" #~ "" #~ msgstr "" #~ "\n" #~ "Enter full server path!!
\n" #~ "For example,
\n" #~ "- ownCloud, enter \"http://[host]/owncloud/apps/media\"
\n" #~ "- Ampache enter \"http://[host]/ampache\"
\n" #~ "" #~ msgid "" #~ "\n" #~ "\n" #~ "

Enter full server path. " #~ "

\n" #~ "

For example,

\n" #~ "

- ownCloud, enter \"http://[host]/owncloud/apps/media\"

\n" #~ "

- Ampache enter \"http://[host]/ampache\"

" #~ msgstr "" #~ "\n" #~ "\n" #~ "

Enter full server " #~ "path!!

\n" #~ "

For example,

\n" #~ "

- ownCloud, enter \"http://[host]/owncloud/apps/media\"

\n" #~ "

- Ampache enter \"http://[host]/ampache\"

" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" #~ msgid "Showing Information
Click to hide information." #~ msgstr "Toont informatie
Klik om de informatie te verbergen" #~ msgid "A Media Player" #~ msgstr "Een mediaspeler" #~ msgid "Buschmann" #~ msgstr "Buschmann" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Kristof Bal" #~ msgstr "Kristof Bal" #~ msgid "Ryan Kavanagh" #~ msgstr "Ryan Kavanagh" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Info" #, fuzzy #~ msgid "Description:%1" #~ msgstr "Beschrijving" #, fuzzy #~ msgid "Show video Settings" #~ msgstr "Video-instellingen tonen" #, fuzzy #~ msgid "Show audio Settings" #~ msgstr "Audio-instellingen tonen" #, fuzzy #~ msgid "Last played: %1" #~ msgstr "Als laatste afgespeeld" #~ msgid "Playback message" #~ msgstr "Afspeelbericht" #~ msgid "Not Playing" #~ msgstr "Niet aan het afspelen" #~ msgid "Shuizhuyuanluo" #~ msgstr "Shuizhuyuanluo" #~ msgid "results" #~ msgstr "resultaten" #~ msgid "Run Script" #~ msgstr "Script uitvoeren" #~ msgid "Choose Interpreter:" #~ msgstr "Kies tolk:" #~ msgid "Bangarang - Scripting Console" #~ msgstr "Bangarang - Scriptconsole" #~ msgid "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgstr "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgid "DVD Menu" #~ msgstr "DVD-menu" #~ msgid "Angles" #~ msgstr "Graden" #~ msgid "Chapters" #~ msgstr "Hoofdstukken" #~ msgid "Titles" #~ msgstr "Titels" #~ msgid "Audio Channels" #~ msgstr "Audiokanalen" #~ msgid "Subtitles" #~ msgstr "Ondertiteling" #, fuzzy #~ msgid "episodeNumber" #~ msgstr "1 aflevering" #~ msgid "Configure shortcuts..." #~ msgstr "Sneltoetsen instellen..." #~ msgid "Lookup info using %1" #~ msgstr "Informatie opzoeken via %1" #~ msgid "Show video vettings" #~ msgstr "Video-instellingen tonen" #~ msgid "Show Remaining Time" #~ msgstr "Toon resterende tijd" #~ msgid "Enter url" #~ msgstr "URL invoeren" #~ msgid "Tags are separated with \";\"" #~ msgstr "Tags dienen gescheiden te worden met \";\"" #~ msgid "Updating..." #~ msgstr "Bijwerken..." #~ msgid "Updated info for %1, %2" #~ msgstr "Informatie bijgewerkt voor %1, %2" #~ msgid "Removed info for %1" #~ msgstr "Informatie verwijderd voor %1" #~ msgid "Hue" #~ msgstr "Tint" #~ msgid "Track %1" #~ msgstr "Nummer %1" #~ msgctxt "%1=Title of DVD" #~ msgid "DVD Video - %1" #~ msgstr "DVD-video - %1" #~ msgid "Indexer" #~ msgstr "Indexer" #~ msgid "Index audio file(s)" #~ msgstr "Indexeer audiobestand(en)" #~ msgid "Index folder containing audio file(s)" #~ msgstr "Indexeer map met audiobestand(en)" #~ msgid "Index video file(s)" #~ msgstr "Indexeer videobestand(en)" #~ msgid "Index folder containing video file(s)" #~ msgstr "Indexeer map met videobestand(en)" #~ msgid "Audio Files" #~ msgstr "Audiobestanden" #~ msgid "Video Files" #~ msgstr "Videobestanden" #~ msgid "Image" #~ msgstr "Afbeelding" #~ msgid "Double-click to edit" #~ msgstr "Dubbelklik om te bewerken" #~ msgid "Recently Played Artists" #~ msgstr "Recent afgespeelde artiesten" #~ msgid "Highest Rated Artists" #~ msgstr "Hoogst beoordeelde artiesten" #~ msgid "Frequently Played Artists" #~ msgstr "Veel afgespeelde artiesten" #~ msgid "Recently Played Albums" #~ msgstr "Recent afgespeelde albums" #~ msgid "Highest Rated Albums" #~ msgstr "Hoogst beoordeelde albums" #~ msgid "Frequently Played Albums" #~ msgstr "Veel afgespeelde albums" #~ msgid "Recently Played Genres" #~ msgstr "Recent afgespeelde genres" #~ msgid "Highest Rated Genres" #~ msgstr "Hoogst beoordeelde genres" #~ msgid "Frequently Played Genres" #~ msgstr "Veel afgespeelde genres" #~ msgid "Recently Played Clips" #~ msgstr "Recent afgespeelde clips" #~ msgid "Highest Rated Clips" #~ msgstr "Hoogst beoordeelde clips" #~ msgid "Frequently Played Clips" #~ msgstr "Veel afgespeelde clips" #~ msgid "Recently Played Streams" #~ msgstr "Recent afgespeelde streams" #~ msgid "Highest Rated Streams" #~ msgstr "Hoogst beoordeelde streams" #~ msgid "Frequently Played Streams" #~ msgstr "Veel afgespeelde streams" #~ msgid "Recently Played Tags" #~ msgstr "Recent afgespeelde tags" #~ msgid "Highest Rated Tags" #~ msgstr "Hoogst beoordeelde tags" #~ msgid "Frequently Played Tag" #~ msgstr "Veel afgespeelde tags" #~ msgid "Recently Watched Movies" #~ msgstr "Recent afgespeelde films" #~ msgid "Highest Rated Movies" #~ msgstr "Hoogst beoordeelde films" #~ msgid "Frequently Watched Movies" #~ msgstr "Veel afgespeelde films" #~ msgid "Recently Watched TV Shows" #~ msgstr "Recent afgespeelde TV-programma's" #~ msgid "Highest Rated TV Shows" #~ msgstr "Hoogst beoordeelde TV-programma's" #~ msgid "Frequently Watched TV Shows" #~ msgstr "Veel afgespeelde TV-programma's" #~ msgid "Recently Watched Genres" #~ msgstr "Recent afgespeelde genres" #~ msgid "Frequently Watched Genres" #~ msgstr "Veel afgespeelde genres" #~ msgid "Recently Watched Actors" #~ msgstr "Recent afgespeelde acteurs" #~ msgid "Highest Rated Actors" #~ msgstr "Hoogst beoordeelde acteurs" #~ msgid "Frequently Watched Actors" #~ msgstr "Veel afgespeelde acteurs" #~ msgid "Recently Watched Directors" #~ msgstr "Recent afgespeelde regisseurs" #~ msgid "Highest Rated Directors" #~ msgstr "Hoogst beoordeelde regisseurs" #~ msgid "Frequently Watched Directors" #~ msgstr "Veel afgespeelde regisseurs" #~ msgid " All songs" #~ msgstr " Alle nummers" #~ msgid "" #~ "Updating audio types and properties
0 items updated..." #~ msgstr "" #~ "Bezig met bijwerken van audiotypes en eigenschappen
0 items " #~ "geüpdate..." #, fuzzy #~ msgid "Add selected info" #~ msgstr "Geselecteerd informatie verwijderen" #, fuzzy #~ msgid "Search in playlist..." #~ msgstr "Afspeellijst laden..." #~ msgid "Toggle fullscreen" #~ msgstr "Volledig scherm wisselen" #~ msgid "03:00" #~ msgstr "03:00" #~ msgid "Untitled Audio Stream" #~ msgstr "Naamloze audiostream" #~ msgid "Select this item, click Info then Edit to enter audio stream info" #~ msgstr "" #~ "Selecteer dit item, klik op Info, dan Bewerken om nieuwe " #~ "audiostreaminformatie toe te voegen" #~ msgid "Open image file(s)" #~ msgstr "Afbeeldingen openen" #~ msgid "Open folder containing image file(s)" #~ msgstr "Map openen met afbeeldingen" #, fuzzy #~ msgid "%1" #~ msgstr "1" #~ msgid "Edit" #~ msgstr "Bewerken" #, fuzzy #~ msgid "Saving..." #~ msgstr "Bezig met laden..." #~ msgid "Track Number" #~ msgstr "Tracknummer" #~ msgid "Sort" #~ msgstr "Sorteren" #~ msgid "2" #~ msgstr "2" #~ msgid "%1 - Episode %2" #~ msgstr "%1 - Episode %2" #~ msgid "Collection/Series Name" #~ msgstr "Naam van de verzameling/serie" bangarang-bangarang/po/pl/000077500000000000000000000000001166760560600157625ustar00rootroot00000000000000bangarang-bangarang/po/pl/CMakeLists.txt000066400000000000000000000001641166760560600205230ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( pl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/pl/bangarang.po000066400000000000000000002236001166760560600202450ustar00rootroot00000000000000# This is the Polish translation for bangarang. # Copyright (C) 2010 bangarang-project # This file is distributed under the same license as the bangarang package. # Łukasz Jernaś , 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2010-02-27 14:11+0200\n" "Last-Translator: Łukasz Jernaś \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Virtaal 0.5.1\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Łukasz Jernaś" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "deejay1@srem.org" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Dodaj listę" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Usuń listę" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Ustawienia" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Dodaj listę" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Źródło" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Bieżący widok" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Bieżące zaznaczenie" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Bieżąca lista odtwarzania" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Nowa nazwa listy" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Nazwa" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Zapisz" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Powróć do list" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Zapisane ustawienia listy" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Nazwa" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Nazwa listy" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 #, fuzzy msgid "Show" msgstr "Program telewizyjny" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 #, fuzzy msgid "items" msgstr "1 pozycja" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 #, fuzzy msgid "played" msgstr "Odtwórz następny" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Listy mediów" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Szukaj plików dźwiękowych" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Dźwięk" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Wideo" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Wyświetla obecnie odtwarzane" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Odtwarzanie" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Podsumowanie" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "…" #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 #, fuzzy msgid "Filter" msgstr "Dopasowanie" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Anuluj edycję" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 #, fuzzy msgid "Index Selected" msgstr "Odtwórz zaznaczone" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Tekst powiadomienia" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Poprzednie" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Odtwarza wszystkie media na liście" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Odtwórz wszystko" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Odtwarza media zaznaczone na liście" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Odtwórz zaznaczone" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Lista odtwarzania" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Wyświetla nadchodzące utwory" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Lista odtwarzania" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Czyści listę odtwarzania" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Włącza powtarzanie" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Włącza losowe odtwarzanie" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 #, fuzzy msgid "Notification" msgstr "Tekst powiadomienia" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 #, fuzzy msgid "Audio Settings" msgstr "Ustawienia wideo" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 #, fuzzy msgid "Audio Channel:" msgstr "Klip dźwiękowy" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Przywróć domyślne" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Ukryj" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Ustawienia wideo" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 #, fuzzy msgid "Brightness:" msgstr "Jasność" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 #, fuzzy msgid "Contrast:" msgstr "Kontrast" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 #, fuzzy msgid "Saturation:" msgstr "Nasycenie" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 #, fuzzy msgid "Aspect Ratio" msgstr "Współczynnik proporcji obrazu" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automatycznie" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Dopasowanie" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 #, fuzzy msgid "Scaling" msgstr "Skalowanie" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Skalowanie do rozmiaru" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Skalowanie z przycięciem" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 #, fuzzy msgid "Shortcuts" msgstr "Zapisz skróty" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Zapisz skróty" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Anuluj" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Wyświetla listy mediów" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Wyświetla w trybie pełnoekranowym" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Upłynęło czasu
Kliknij, by wyświetlić pozostały czas" # LJ: ERM, not really sure about that #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Wycisza głośność" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Głośność" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Powróć do list" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "" #: app/main.cpp:31 #, fuzzy msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2010, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Twórca" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Współtwórca" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Błędy mogą być zgłaszane na stronie http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Błędy mogą być zgłaszane w systemie śledzenia błędów programu Bangarang" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Odtwarza adres URL" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Odtwarza płytę DVD" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Odtwarza płytę CD" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Wyświetla dodatkowe informacje debugowania" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Zakończ" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Odtwarzaj/Wstrzymaj" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Odtwarzaj" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Wstrzymaj" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Odtwórz następny" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Odtwórz poprzedni" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Odtwórz wszystko" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Odtwórz zaznaczone" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Dodaj do listy odtwarzania" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 #, fuzzy msgid "Add after Now Playing" msgstr "Wyświetla obecnie odtwarzane" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Usuń z listy odtwarzania" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Ukryj elementy sterujące" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 #, fuzzy msgid "Show filter" msgstr "Wyświetl pozycje" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 #, fuzzy msgid "Show video settings" msgstr "Wyświetl ustawienia wideo" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 #, fuzzy msgid "Show audio settings" msgstr "Wyświetl ustawienia wideo" #: app/common/actionsmanager.cpp:164 #, fuzzy msgid "Fullscreen" msgstr "Wyświetla w trybie pełnoekranowym" #: app/common/actionsmanager.cpp:177 #, fuzzy msgid "Save selected info" msgstr "Usuń zaznaczone informacje" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Usuń zaznaczone informacje" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Odśwież" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Usuń z listy" #: app/common/actionsmanager.cpp:205 #, fuzzy msgid "Add to \"Audio Streams\"" msgstr "Strumienie dźwiękowe" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Dodaj do listy" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Dodaj do listy" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Nowa lista odtwarzania" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Wyświetl pozycje" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 #, fuzzy msgid "Show information" msgstr "Wyświetla informacje" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 #, fuzzy msgid "Show Info View" msgstr "Wyświetla informacje" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "" #: app/common/actionsmanager.cpp:252 #, fuzzy msgid "Remove bookmarks" msgstr "Usuń z listy" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 #, fuzzy msgid "Show shortcuts editor" msgstr "Zapisz skróty" #: app/common/actionsmanager.cpp:263 #, fuzzy msgid "Update ontologies..." msgstr "Aktualizowanie..." #: app/common/actionsmanager.cpp:268 #, fuzzy msgid "Hide in system tray" msgstr "Pliki wideo" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 #, fuzzy msgid "Hide Info View" msgstr "Pliki wideo" #: app/common/actionsmanager.cpp:417 #, fuzzy msgid "Play after Now Playing" msgstr "Wyświetla obecnie odtwarzane" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 #, fuzzy msgid "Hide information" msgstr "Wyświetla informacje" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Wyświetl elementy sterujące" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Ukryj elementy sterujące" #: app/common/actionsmanager.cpp:615 #, fuzzy msgid "Hide video settings" msgstr "Ukryj ustawienia wideo" #: app/common/actionsmanager.cpp:638 #, fuzzy msgid "Hide audio settings" msgstr "Ukryj ustawienia wideo" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "" # LJ: ERM, not really sure about that #: app/common/actionsmanager.cpp:743 #, fuzzy msgid "Restore Volume" msgstr "Wycisza głośność" # LJ: ERM, not really sure about that #: app/common/actionsmanager.cpp:903 #, fuzzy msgid "Restore video size" msgstr "Wycisza głośność" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "" #: app/common/actionsmanager.cpp:1049 #, fuzzy msgid "Close" msgstr "Klipy" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 #, fuzzy msgid "Hide filter" msgstr "Pliki wideo" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Wyświetl ustawienia wideo" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Wyświetl ustawienia wideo" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Program Bangarang nie może uzyskać dostępu do usługi wyszukiwania " "semantycznego Nepomuk. Biblioteka mediów, funkcje oceniania oraz zliczania " "liczby odtworzeń będą niedostępne." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Nie wyświetlaj tego komunikatu ponownie" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "Film DVD" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "CD-Audio" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Tryb pełnoekranowy
Kliknij, aby opuścić tryb pełnoekranowy" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Wyświetla w trybie pełnoekranowym" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Dodaje/usuwa z listy odtwarzania" #: app/common/mediaview.cpp:146 #, fuzzy msgid "Show Songs" msgstr "Wyświetl elementy sterujące" #: app/common/mediaview.cpp:148 #, fuzzy msgid "Show Albums" msgstr "Albumy" #: app/common/mediaview.cpp:150 #, fuzzy msgid "Show Artists" msgstr "Wykonawcy" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Muzyka" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Strumień dźwiękowy" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Klip dźwiękowy" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Film" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "Program telewizyjny" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Klip wideo" #: app/medialists/infoitemdelegate.cpp:154 #, fuzzy msgid "No description" msgstr "Opis" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Wiele wartości" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Otwórz plik z okładką" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "" #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Szukaj plików wideo" #: app/medialists/medialistsmanager.cpp:402 #, fuzzy msgid "Audio Search" msgstr "Strumień dźwiękowy" #: app/medialists/medialistsmanager.cpp:409 #, fuzzy msgid "Video Search" msgstr "Ustawienia wideo" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Gotowe" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 #, fuzzy msgid "Untitled" msgstr "Tytuł" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 #, fuzzy msgid "Remove" msgstr "Usuń listę" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, fuzzy, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Czy na pewno wyczyścić bieżącą listę odtwarzania?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "" #: app/nowplaying/audiosettings.cpp:100 #, fuzzy msgid "Dance" msgstr "Anuluj" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:302 #, fuzzy msgid "Artist: " msgstr "Wykonawca" #: app/nowplaying/nowplayingdelegate.cpp:314 #, fuzzy msgid "Composer: " msgstr "Gotowe" #: app/nowplaying/nowplayingdelegate.cpp:326 #, fuzzy msgid "Album: " msgstr "Album" #: app/nowplaying/nowplayingdelegate.cpp:338 #, fuzzy msgid "Track: " msgstr "Ścieżka" #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 #, fuzzy msgid "Year: " msgstr "Rok" #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 #, fuzzy msgid "Genre: " msgstr "Gatunek" #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 msgid "Tags: " msgstr "" #: app/nowplaying/nowplayingdelegate.cpp:405 #, fuzzy msgid "Actor: " msgstr "Aktor" #: app/nowplaying/nowplayingdelegate.cpp:417 #, fuzzy msgid "Director: " msgstr "Reżyser" #: app/nowplaying/nowplayingdelegate.cpp:429 #, fuzzy msgid "Writer: " msgstr "Scenarzysta" #: app/nowplaying/nowplayingdelegate.cpp:441 #, fuzzy msgid "Producer: " msgstr "Producent" #: app/nowplaying/nowplayingmanager.cpp:110 #, fuzzy msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "Pozostały czas
Kliknij, by wyświetlić bieżący czas" #: app/nowplaying/nowplayingmanager.cpp:112 #, fuzzy msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "Upłynęło czasu
Kliknij, by wyświetlić pozostały czas" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Wstrzymany
Przytrzymaj, aby zatrzymać" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Rozrywka... W tej chwili" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "" "Wyświetlanie nadchodzących utworów
Kliknij aby wyświetlić listę " "odtwarzania" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Odtwarzanie
Kliknij by wstrzymać
Kliknij i przytrzymaj, by " "zatrzymać" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Wystąpił błąd w trakcie odtwarzania" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Wczytywanie listy odtwarzania..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Buforowanie..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Wczytywanie..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Wyciszono
Kliknij by przywrócić poprzedni poziom głośności" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Powtarzanie
Kliknij aby wyłączyć powtarzanie" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Losowe odtwarzanie
Kliknij aby wyłączyć losowe odtwarzanie" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Czy na pewno wyczyścić bieżącą listę odtwarzania?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 pozycja, %2" msgstr[1] "%1 pozycje, %2" msgstr[2] "%1 pozycji, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 pozycja" msgstr[1] "%1 pozycje" msgstr[2] "%1 pozycji" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Lista odtwarzania (Nadchodzące)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Typ" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Okładka" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Tytuł" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Wykonawca" #: platform/infoitemmodel.cpp:83 #, fuzzy msgid "Composer" msgstr "Gotowe" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Album" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Ścieżka" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Rok" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Gatunek" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Położenie" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Aktor" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Reżyser" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Scenarzysta" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Producent" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Seria" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Sezon" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Odcinek" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Ilość odtworzeń" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Ostatnio odtwarzane" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: platform/infoitemmodel.cpp:563 #, fuzzy msgid "No Results" msgstr "Brak wyników" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 #, fuzzy msgid "Recently Played Songs" msgstr "Ostatnio odtwarzane" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 #, fuzzy msgid "Highest Rated Songs" msgstr "Najlepiej oceniane" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 #, fuzzy msgid "Frequently Played Songs" msgstr "Najczęściej odtwarzane" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Ostatnio odtwarzane" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Najlepiej oceniane" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Najczęściej odtwarzane" #: platform/infoitemmodel.cpp:1191 #, fuzzy msgid "Fetch Canceled" msgstr "Anuluj" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "" #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "" #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 #, fuzzy msgid "Multiple" msgstr "Wielkokrotne %1" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Wielkokrotne %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Brak wyników" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" #: platform/ontologyupdater.cpp:385 #, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" #: platform/ontologyupdater.cpp:413 #, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "" #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "" #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Ustawienia wideo" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" #: platform/infofetchers/feedinfofetcher.cpp:35 #, fuzzy msgid "Feed Info" msgstr "Informacje" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "" #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 #, fuzzy msgid "Artists" msgstr "Wykonawca" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 #, fuzzy msgid "Albums" msgstr "Album" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Gatunki" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Lista odtwarzania" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 wykonawca" msgstr[1] "%1 wykonawców" msgstr[2] "%1 wykonawców" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 album" msgstr[1] "%1 albumy" msgstr[2] "%1 albumów" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 gatunek" msgstr[1] "%1 gatunki" msgstr[2] "%1 gatunków" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Lista odtwarzania" msgstr[1] "Lista odtwarzania" msgstr[2] "Lista odtwarzania" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 utwór" msgstr[1] "%1 utwory" msgstr[2] "%1 utworów" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 klip" msgstr[1] "%1 klipy" msgstr[2] "%1 klipów" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 strumień" msgstr[1] "%1 strumienie" msgstr[2] "%1 strumieni" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Nowy strumień dźwiękowy" #: platform/listengines/audiostreamlistengine.cpp:99 #, fuzzy msgid "Edit info to create new audio stream" msgstr "Utwórz nowy strumień dźwiękowy" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Audio CD - %1 ścieżek" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 ścieżka" msgstr[1] "%1 ścieżki" msgstr[2] "%1 ścieżek" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "Obraz DVD - %1 tytułów" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Tytuł" msgstr[1] "Tytuł" msgstr[2] "Tytuł" #: platform/listengines/feedlistengine.cpp:111 #, fuzzy msgid "New audio feed" msgstr "Nowy strumień dźwiękowy" #: platform/listengines/feedlistengine.cpp:112 #, fuzzy msgid "Edit info to create new audio feed" msgstr "Utwórz nowy strumień dźwiękowy" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, fuzzy, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 gatunek" msgstr[1] "%1 gatunki" msgstr[2] "%1 gatunków" #: platform/listengines/feedlistengine.cpp:173 #, fuzzy msgid "New video feed" msgstr "Otwórz plik wideo" #: platform/listengines/feedlistengine.cpp:174 #, fuzzy msgid "Edit info to create new video feed" msgstr "Utwórz nowy strumień dźwiękowy" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "" #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "" #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Ostatnio odtwarzane" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Utwory" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Klipy" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Strumienie dźwiękowe" #: platform/listengines/medialistsengine.cpp:165 #, fuzzy msgid "Audio Feeds" msgstr "Pliki dźwiękowe" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Pliki i katalogi" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 #, fuzzy msgid "Actors" msgstr "Aktor" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 #, fuzzy msgid "Directors" msgstr "Reżyser" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Filmy" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 #, fuzzy msgid "Recently Watched" msgstr "Ostatnio odtwarzane" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 #, fuzzy msgid "Frequently Watched" msgstr "Najczęściej odtwarzane" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Programy telewizyjne" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Klipy wideo" #: platform/listengines/medialistsengine.cpp:356 #, fuzzy msgid "Video Feeds" msgstr "Pliki wideo" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Wykonawcy - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 #, fuzzy msgid "All songs" msgstr "1 utwór" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Albumy - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Albumy - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, fuzzy, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "Odtwórz następny" msgstr[1] "Odtwórz następny" msgstr[2] "Odtwórz następny" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, fuzzy, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 ścieżka" msgstr[1] "%1 ścieżki" msgstr[2] "%1 ścieżek" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Filmy - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 film" msgstr[1] "%1 filmy" msgstr[2] "%1 filmów" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Nieposortowane programy telewizyjne" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 program" msgstr[1] "%1 programy" msgstr[2] "%1 programów" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Nieposortowane sezony" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Sezony - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 sezon" msgstr[1] "%1 sezony" msgstr[2] "%1 sezonów" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Sezon %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Nieposortowane sezony" #: platform/listengines/videolistengine.cpp:477 #, fuzzy, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "Odcinek" msgstr[1] "Odcinek" msgstr[2] "Odcinek" #: platform/listengines/videolistengine.cpp:593 #, fuzzy, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "Aktor" msgstr[1] "Aktor" msgstr[2] "Aktor" #: platform/listengines/videolistengine.cpp:662 #, fuzzy, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "Reżyser" msgstr[1] "Reżyser" msgstr[2] "Reżyser" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Tytuł %1" #: platform/utilities/mediaitems.cpp:117 #, fuzzy msgid "Full Disc" msgstr "Wyświetla w trybie pełnoekranowym" #: platform/utilities/mediaitems.cpp:1421 #, fuzzy, kde-format msgid "Season %1" msgstr "Sezon %1" #: platform/utilities/mediaitems.cpp:1429 #, fuzzy, kde-format msgid "Episode %1" msgstr "Odcinek" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Sezon %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #, fuzzy #~ msgid "Showing Information
Click to hide information." #~ msgstr "Wyświetlanie Informacji
Kliknij, aby ukryć informacje" #~ msgid "A Media Player" #~ msgstr "Odtwarzacz multimediów" #~ msgid "Buschmann" #~ msgstr "Buschmann" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Kristof Bal" #~ msgstr "Kristof Bal" #~ msgid "Ryan Kavanagh" #~ msgstr "Ryan Kavanagh" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Informacje" #, fuzzy #~ msgid "Description:%1" #~ msgstr "Opis" #, fuzzy #~ msgid "Show video Settings" #~ msgstr "Wyświetl ustawienia wideo" #, fuzzy #~ msgid "Show audio Settings" #~ msgstr "Wyświetl ustawienia wideo" #, fuzzy #~ msgid "Last played: %1" #~ msgstr "Ostatnio odtwarzane" #~ msgid "Playback message" #~ msgstr "Odtwórz wiadomość" #~ msgid "Not Playing" #~ msgstr "Odtwarzanie" #~ msgid "Shuizhuyuanluo" #~ msgstr "Shuizhuyuanluo" #, fuzzy #~ msgid "results" #~ msgstr "Brak wyników" #~ msgid "Run Script" #~ msgstr "Uruchom skrypt" #~ msgid "Choose Interpreter:" #~ msgstr "Wybierz interpreter:" #~ msgid "Bangarang - Scripting Console" #~ msgstr "Konsola skryptów programu Bangarang" #~ msgid "" #~ "BANGARANG MEDIA PLAYER\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #~ msgstr "" #~ "Odtwarzacz multimediów Bangarang\n" #~ "Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)\n" #~ "" #, fuzzy #~ msgid "Titles" #~ msgstr "Tytuł" #, fuzzy #~ msgid "Audio Channels" #~ msgstr "Klip dźwiękowy" #, fuzzy #~ msgid "episodeNumber" #~ msgstr "1 odcinek" #~ msgid "Configure shortcuts..." #~ msgstr "Konfiguracja skrótów..." #, fuzzy #~ msgid "Show video vettings" #~ msgstr "Wyświetl ustawienia wideo" #~ msgid "Updating..." #~ msgstr "Aktualizowanie..." #~ msgid "Updated info for %1, %2" #~ msgstr "Zaktualizowano informacje dla %1, %2" #~ msgid "Removed info for %1" #~ msgstr "Usunięto informacje dla %1" #~ msgid "Hue" #~ msgstr "Odcień" #~ msgid "Track %1" #~ msgstr "Ścieżka %1" #, fuzzy #~ msgctxt "%1=Title of DVD" #~ msgid "DVD Video - %1" #~ msgstr "Obraz DVD - %1 tytułów" #, fuzzy #~ msgid "Index audio file(s)" #~ msgstr "Otwórz pliki dźwiękowy" #, fuzzy #~ msgid "Index folder containing audio file(s)" #~ msgstr "Otwórz katalog zawierający pliki dźwiękowe" #, fuzzy #~ msgid "Index video file(s)" #~ msgstr "Otwórz plik wideo" #, fuzzy #~ msgid "Index folder containing video file(s)" #~ msgstr "Otwórz katalog zawierający pliki wideo" #~ msgid "Audio Files" #~ msgstr "Pliki dźwiękowe" #~ msgid "Video Files" #~ msgstr "Pliki wideo" #~ msgid "Double-click to edit" #~ msgstr "Kliknij dwukrotnie, aby edytować" #, fuzzy #~ msgid "Recently Played Artists" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Highest Rated Artists" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Played Artists" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Recently Played Albums" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Highest Rated Albums" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Played Albums" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Recently Played Genres" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Highest Rated Genres" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Played Genres" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Recently Played Clips" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Highest Rated Clips" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Played Clips" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Recently Played Streams" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Highest Rated Streams" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Played Streams" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Recently Played Tags" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Highest Rated Tags" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Played Tag" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Recently Watched Movies" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Highest Rated Movies" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Watched Movies" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Recently Watched TV Shows" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Highest Rated TV Shows" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Watched TV Shows" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Recently Watched Genres" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Frequently Watched Genres" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Recently Watched Actors" #~ msgstr "Ostatnio odtwarzane" #, fuzzy #~ msgid "Highest Rated Actors" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Watched Actors" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Highest Rated Directors" #~ msgstr "Najlepiej oceniane" #, fuzzy #~ msgid "Frequently Watched Directors" #~ msgstr "Najczęściej odtwarzane" #, fuzzy #~ msgid "Add selected info" #~ msgstr "Usuń zaznaczone informacje" #, fuzzy #~ msgid "Search in playlist..." #~ msgstr "Wczytywanie listy odtwarzania..." #~ msgid "Toggle fullscreen" #~ msgstr "Przełącza tryb pełnoekranowy" #, fuzzy #~ msgid "Show Scripting Console" #~ msgstr "Wyświetl konsolę skryptów" #~ msgid "03:00" #~ msgstr "03:00" #~ msgid "Untitled Audio Stream" #~ msgstr "Nienazwany strumień dźwiękowy" #~ msgid "Select this item, click Info then Edit to enter audio stream info" #~ msgstr "" #~ "Należy zaznaczyć ten element, kliknąć przycisk Informacje a następnie " #~ "przycisk Edycja, aby zmienić ustawienia strumienia dźwiękowego" #~ msgid "Open image file(s)" #~ msgstr "Otwórz obraz" #~ msgid "Open folder containing image file(s)" #~ msgstr "Otwórz katalog zawierający obrazy" #, fuzzy #~ msgid "List of Tags" #~ msgstr "Kristof Bal" #, fuzzy #~ msgid "%1" #~ msgstr "1" #~ msgid "Sort" #~ msgstr "Sortuj" #~ msgid "Information" #~ msgstr "Informacje" #~ msgid "%1 - Played %2 times" #~ msgstr "%1 - Odtwarzane %2 razy" #~ msgid "%1 - Last Played: %2" #~ msgstr "%1 - Ostatnio odtwarzane: %2" #~ msgid "Edit" #~ msgstr "Edycja" #~ msgid "Saving..." #~ msgstr "Zapisywanie..." #~ msgid "Track Number" #~ msgstr "Numer ścieżki" #~ msgid "2" #~ msgstr "2" bangarang-bangarang/po/pt/000077500000000000000000000000001166760560600157725ustar00rootroot00000000000000bangarang-bangarang/po/pt/CMakeLists.txt000066400000000000000000000001641166760560600205330ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( pt ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/pt/bangarang.po000066400000000000000000002122341166760560600202560ustar00rootroot00000000000000# Portuguese translation of bangarang package. # Copyright (C) 2011 This_file_is_part_of_KDE # This file is in public domain. # Sérgio Marques , 2010. # Adaptado ao novo acordo ortográfico msgid "" msgstr "" "Project-Id-Version: bangarang\n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-06-15 01:16-0000\n" "Last-Translator: Sérgio Marques \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Poedit-Language: Portuguese\n" "X-Poedit-Country: Portugal\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Sérgio Marques" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "smarquespt@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Adicionar lista" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Remover lista" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Definições" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Adicionar lista" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Origem" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Vista atual" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Seleção atual" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Lista de reprodução atual" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Nome da nova lista" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Nome" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Gravar" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Regressar às listas" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Definições das listas gravadas" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Nome" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Título" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Mostrar" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "itens" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "reproduzido" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "antes" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "após" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "ou mais" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "exatamente" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "ou menos" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "vezes" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Listas multimédia" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Procurar músicas" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Áudio" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Vídeo" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Ver \"A reproduzir\"" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "A reproduzir" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Resumo" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Filtro" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Podem estar disponíveis mais informações em:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Obter informações e editar" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Obter informações e gravar" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Ocorrências" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Cancelar edição" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Índice selecionado" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Texto da notificação" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Anterior" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Reproduzir lista" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Reproduzir tudo" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Reproduzir apenas a seleção" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Reproduzir seleção" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Legendas externas" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Lista de reprodução" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Mensagem de erro" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Mostrar seguinte" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Lista de reprodução" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Apagar lista de reprodução" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Ativar repetição" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Ativar desordenação" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Notificação" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Sim" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Não" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Definições áudio" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Canal áudio:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Equalizador" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Pré-ajustes" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Pre" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Restaurar predefinições" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Ocultar" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Definições de vídeo" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Legenda:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Ângulo:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Brilho:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Contraste:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Cor:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Saturação:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Tamanho do vídeo" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automático" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Ajustado" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "À escala" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Ajustar para caber" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Ajustar e cortar" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Atalhos" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Gravar atalhos" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Cancelar" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Ver listas multimédia" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Mostrar ecrã completo" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Tempo decorrido
Clique para mostrar o tempo restante" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Silenciar" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Volume" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Regressar às listas" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Um reprodutor multimédia para o KDE" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Direitos de autor 2011, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Nota: Esta aplicação utiliza a API TMDb mas não é certificada pela " "TMDb. Por favor, ajude a melhorar as informações disponíveis, visitando a " "página http://themoviedb.org
Nota: Esta aplicação utiliza a API " "Last.fm mas não é certificada pela Last.fm. Por favor, ajude a melhorar as " "informações disponíveis, visitando a página http://last.fm
Nota: " "Esta aplicação utiliza a API TheTVDB.com mas não é certificada pela TheTVDB." "com. Por favor, ajude a melhorar as informações disponíveis, visitando a " "página http://thetvdb.com" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Criador" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Colaboradores" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Os erros encontrados podem ser reportados em http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Os erros encontrados podem ser reportados no repositório de erros do Bangarang" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Reproduzir \"URL\"" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Reproduzir DVD" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Reproduzir CD de música" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Mostrar informações adicionais de depuração" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Sair" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Reproduzir/Pausar" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Reproduzir" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Pausar" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Reproduzir seguinte" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Reproduzir anterior" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Silenciar" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Reproduzir tudo" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Reproduzir seleção" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Adicionar à lista de reprodução" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Adicionar após a atual" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Remover da lista de reprodução" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Ocultar controlos" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Mostrar filtros" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Mostrar tempo restante" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Mostrar definições de vídeo" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Mostrar definições de áudio" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Ecrã completo" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Gravar informações selecionadas" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Remover informações selecionadas" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Atualizar" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Remover da lista" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Adicionar a \"Emissões áudio\"" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Adicionar à lista" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Adicionar à lista" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Nova lista" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Mostrar itens" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Mostrar informações" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Mostrar painel de informações" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Adicionar marcador" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Remover marcadores" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Mostrar editor de atalhos" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Atualizar ontologias..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Ocultar na área de notificação" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Gestão de informações" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Ocultar painel de informações" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Reproduzir após a atual" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Ocultar informações" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Capítulo %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Mostrar controlos" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Ocultar controlos" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Ocultar definições de vídeo" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Ocultar definições de áudio" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Ocultar editor de atalhos" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Restaurar volume" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Restaurar tamanho do vídeo" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Mostrar tempo decorrido" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Marcador - %1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Atualizar ontologias" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "A atualização das ontologias garante o armazenamento e a disponibilização " "das informações multimédia a outras aplicações. Isto só será necessário se " "tiver atualizado recentemente o Bangarang ou o KDE.

A atualização " "pode levar algum tempo." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Parar" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Fechar" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Ocultar filtros" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Mostrar definições de áudio" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Mostrar definições de vídeo" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "O Bangarang não consegue aceder ao repositório de semânticas Nepomuk. A " "coleção multimédia, avaliação e número de reproduções não estará acessível." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Não mostrar novamente" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Retomar" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "CD áudio" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Ecrã completo
Clique para sair de ecrã completo" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Mostrar ecrã completo" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Adicionar/remover da lista de reprodução" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Mostrar músicas" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Mostrar álbuns" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Mostrar artistas" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Música" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Emissão áudio" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Clipe áudio" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Filme" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "Programa televisivo" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Clipe de vídeo" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Sem descrição" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Múltiplos valores" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Abrir imagem" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Prima para terminar a edição." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Clique para ocultar" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "Podem estar disponíveis mais informações.
Clique para mais detalhes..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "avaliado" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Procurar vídeos" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Procura de áudio" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Procura de vídeo" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Concluído" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Sem título" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Remover" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Tem a certeza de que quer remover \"%1\"?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Sem efeitos" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rock" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Reggae" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Dança" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Ao vivo" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Clássica" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Campeão de bilheteira" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Documentário" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Drama" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Manual" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Artista:" #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Compositor:" #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Álbum:" #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Faixa:" #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Ano:" #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Género:" #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Tags" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Ator(es):" #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Diretor(es):" #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Argumentista(s):" #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Produtor(es):" #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Tempo restante
Clique para mostrar o tempo decorrido e os " "marcadores" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Tempo decorrido
Clique para mostrar o tempo restante e os " "marcadores" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Em pausa
Pressione para parar" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Entretenimento... Agora" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "Mostrar seguinte
Clique para mostrar a lista de reprodução" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "A reproduzir
Clique para pausar
Clique para parar" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Foi encontrado um erro durante a reprodução" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "A carregar lista de reprodução..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "A colocar em memória..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "A carregar..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Sem som
Clique para restaurar o volume" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "A repetição está ativa
Clique para desligar" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "A desordenação está ativa
Clique para desligar" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Tem a certeza de que quer apagar a lista de reprodução atual?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 item, %2" msgstr[1] "%1 itens, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 item" msgstr[1] "%1 itens" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Lista de reprodução (Seguinte)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Desativar" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Tipo" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Capa de álbum" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Título" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Artista" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Compositor" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Álbum" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Faixa" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Ano" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Género" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Tags" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Localização" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Ator(es)" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Diretor(es)" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Argumentista(s)" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Produtor(es)" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Séries" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Temporada" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Episódio" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Ligações" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Número de reproduções" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Última reprodução" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "A obter informações para %1 item..." msgstr[1] "A obter informações para %1 itens..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Obtidas informações para %2 de 1 item..." msgstr[1] "Obtidas informações para %2 de %1 itens..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Sem resultados" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Músicas recentes" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Músicas com avaliação alta" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Músicas frequentes" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Reproduzidas recentemente" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Com melhor avaliação" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Reproduzidas frequentemente" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Cancelada a obtenção" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "A iniciar atualização..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Atualizado: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "A remover informações..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Múltiplos" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Múltiplos %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Sem resultados" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "A atualizar o tipo de áudio e as propriedades
0 itens " "atualizados..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "A atualizar o tipo de áudio e as propriedades
%1 itens " "atualizados..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "A atualizar o tipo de vídeo e as propriedades
%1 itens " "atualizados..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "A atualizar o tipo de áudio e as propriedades
%1 itens " "atualizados..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" "A atualizar o tipo de vídeo e as propriedades
%1 itens " "atualizados..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Atualização concluída." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Atualização parada." #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Procura de vídeo" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Para obter informações na DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "Nota: Utiliza a API TMDb, mas não é certificada pela mesma." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Informações da fonte" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "Para obter informações sobre uma fonte especificada." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Informações do nome" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Para obter as informações da temporada e do episódio com base num nome de " "ficheiro. Exemplo: 2x23 ou S02E23 ou 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "Nota: Utiliza a API Last.fm mas não é certificado pela mesma." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "Nota: Utiliza a API TMDb, mas não é certificada pela mesma." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Nota: Utiliza a API theTVDB.com. Por favor, ajude a melhorar as informações " "disponíveis em theTVDB.com clicando na ligação." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Artistas" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Álbuns" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Géneros" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Lista de reprodução" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 artista" msgstr[1] "%1 artistas" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 álbum" msgstr[1] "%1 álbuns" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 género" msgstr[1] "%1 géneros" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Lista de reprodução" msgstr[1] "Lista de reprodução" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 música" msgstr[1] "%1 músicas" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 clipe" msgstr[1] "%1 clipes" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 emissão" msgstr[1] "%1 emissões" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Nova emissão áudio" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Edite as informações para criar uma emissão" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "CD Áudio - %1 faixas" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 faixa" msgstr[1] "%1 faixas" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD - %1 títulos" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Sem título" msgstr[1] "Sem título" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Nova fonte áudio" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Edite as informações para criar uma fonte" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 fonte" msgstr[1] "%1 fontes" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Nova fonte de vídeo" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Edite as informações para criar uma fonte" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "A obter informações..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "A obter informações (%1 ficheiros)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Reproduzidas recentemente" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Músicas" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Clipes" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Emissões áudio" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Fontes áudio" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Ficheiros e pastas" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Atores" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Diretores" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Filmes" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Vistos recentemente" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Vistos frequentemente" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Programas televisivos" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Clipes de vídeo" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Fontes de vídeo" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Artistas - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Todas as músicas" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Álbuns - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Álbuns - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "reproduzida uma vez" msgstr[1] "reproduzida %1 vezes" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 tag" msgstr[1] "%1 tags" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Filmes - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 filme" msgstr[1] "%1 filmes" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Programas sem categoria" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 programa" msgstr[1] "%1 programas" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Temporadas sem categoria" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Temporadas - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 temporada" msgstr[1] "%1 temporadas" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Temporada %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Temporadas sem categoria" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 episódio" msgstr[1] "%1 episódios" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 ator" msgstr[1] "%1 atores" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 diretor" msgstr[1] "%1 diretores" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "pasta" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "Há 1 ano atrás" msgstr[1] "Há %1 anos atrás" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "Há 1 mês atrás" msgstr[1] "Há %1 meses atrás" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "Há 1 semana atrás" msgstr[1] "Há %1 semanas atrás" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "Há 1 dia atrás" msgstr[1] "Há %1 dias atrás" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "Há 1 hora atrás" msgstr[1] "Há %1 horas atrás" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "Há 1 minuto atrás" msgstr[1] "Há %1 minutos atrás" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "Há alguns segundos" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Título %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Disco completo" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Temporada %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Episódio %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Temporada %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" bangarang-bangarang/po/pt_BR/000077500000000000000000000000001166760560600163555ustar00rootroot00000000000000bangarang-bangarang/po/pt_BR/CMakeLists.txt000066400000000000000000000001671166760560600211210ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( pt_BR ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/pt_BR/bangarang.po000066400000000000000000002244111166760560600206410ustar00rootroot00000000000000# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Márcio Moraes , 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2010-01-16 00:27-0300\n" "Last-Translator: Márcio Moraes \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Lokalize 1.0\n" "X-Language: pt_BR\n" "X-Source-Language: C\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Márcio Moraes" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "marciopanto@gmail.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Adicionar lista" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Remover lista" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Configurações" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Adicionar Lista" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Fonte" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Visualizar Atual" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Seleção Atual" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Lista de Reprodução Atual" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Novo Nome da Lista" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Nome" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Salvar" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Voltar à Lista" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Configurações da Lista Salva" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Nome" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Título da Lista" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Mostrar" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "itens" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "reproduzido" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "após" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "depois" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "ou mais" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "exatamente" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "ou menos" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "as vezes" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Listas de Mídias" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Pesquisar por áudio" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Áudio" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Vídeo" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Visualizar Reproduzindo Agora" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Reproduzindo Agora" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Resumo" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Filtro" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Informações adicionais podem estar disponíveis a partir de:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Obter informações e editar as alterações" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Obter informações e salvar as alterações" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Jogos" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Cancelar Editor" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Indexar Selecionados" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Texto de Notificação" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Anterior" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Reproduzir todas as mídias da lista" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Reproduzir Todos" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Reproduzir mídia selecionada da lista" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Reproduzir Selecionado" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Legenda externa" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Lista de reprodução" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Mensagem de erro" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Mostrar Próximos" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Lista de reprodução" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Limpar Lista de Reprodução" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Ligar modo Repetir" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Ligar modo Aleatório" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Notificação" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Sim" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Não" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Configurações de Áudio" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Canal de Áudio:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Equalizador" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Pré-definidos" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Pré" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Restaurar Padrões" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Oculto" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Configurações de Vídeo" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Legemda:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Ângulo:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Brilho:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Contraste:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "matiz:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Saturação:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Relação de tamanho" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Automático" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Ajustar" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Modo de escala" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Escala de ajuste" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Escala e corte" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Atalhos" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Salvar Atalhos" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Cancelar" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Ver Listas de Mídia" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Mostrar em tela cheia" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Tempo decorrido
Clique aqui para mostrar o tempo restante" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Volume mudo" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Volume" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Voltar à Lista" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Um reprodutor de mídia para seu desktop KDE" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2009, Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Nota: Este produto usa a API TMDb mas não é endossado ou certificado " "pela TMDb. Por favor, ajude a melhorar a informação disponível, visitando " "http://themoviedb.org
Nota: Este produto usa a API do Last.fm, " "mas não é endossado ou certificada pela Last.fm. Queira ajudar a melhorar a " "informação disponível, visitando http://last.fm
Nota: Este produto " "usa a API TheTVDB.com mas não é endossado ou certificado pela TheTVDB.com. " "Queira ajudar a melhorar a informação disponível, visitando o http://thetvdb." "com" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Criador" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Contribuidor" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Defeitos podem ser relatados em http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Defeitos podem ser relatados em Bangarang Issue Tracker " #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Reproduzir 'URL'" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Reproduzir DVD de Vídeo" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Reproduzir CD de Música" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Mostrar Saída de Depuração Adicional" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Sair" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Reproduzir/Pausar" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Reproduzir" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Pausar" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Reproduzir próximo" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Reproduzir anterior" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Mudo" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Reproduzir todos" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Reproduzir selecionados" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Adicionar à lista de reprodução" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Adicionar após Reproduzindo Agora" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Remover da lista de reprodução" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Ocultar controles" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Mostrar filtro" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Mostrar tempo restante" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Mostrar configurações de vídeo" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Mostrar configurações de áudio" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Tela cheia" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Salvar informações selecionadas" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Remover informações selecionadas" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Atualizar" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Remover da lista" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Adicionar ao \"Streams de Áudio\"" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Adicionar à lista" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Adicionar à lista" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Nova lista" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Mostrar itens" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Mostrar informação" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Mostrar Informação da Visualização" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Adicionar favorito" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Remover favoritos" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Mostrar os atalhos do editor" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Atualizar ontologias..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Ocultar na notificação do sistema" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Gerenciar informações" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Ocultar Informação da Visualização" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Reproduzir apoś Reproduzindo Agora" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Ocultar informação" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Capítulo %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Mostrar Controles" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Ocultar Controles" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Ocultar configurações de vídeo" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Ocultar configurações de áudio" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Ocultar os atalhos do editor" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Restaurar Volume" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Restaurar tamanho do vídeo" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Mostrar tempo decorrido" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Favorito-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Atualizar Ontologias" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Atualizando ontologias garante que as informações sobre a mídia seja " "armazenada em uma forma que torna mais acessível a outras aplicações de " "desktop. Isso só é necessário se você tiver atualizado recentemente o " "Bangarang ou a sua compilação de software do KDE.

Isso pode levar " "alguns minutos." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Parar" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Fechar" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Ocultar filtro" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Mostrar Configurações de Vídeo" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Mostrar Configurações de Vídeo" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang não consegue acessar o repositório de Desktop Semântico Nepomuk. " "Biblioteca de mídia, classificação e funções de contagem de reprodução não " "estarão disponíveis." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Não mostrar esta mensagem novamente" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Continuar" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD de Vídeo" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "CD de Áudio" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Tela cheia
Clique aqui para sair da tela cheia" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Mostrar em tela cheia" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Adicionar à lista de reprodução/Remover da lista de reprodução" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Mostrar Sons" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Motrar Álbuns" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Motrar Artistas" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Música" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Streams de Áudio" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Áudio Clipe" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Filmes" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "TV Shows" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Vídeo Clipes" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Nenhuma descrição" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Múltiplos Valores" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Abrir arquivo de arte" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Pressioine para finalizar a edição." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Clique para ocultar" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "Informações adicionais podem estar disponíveis.
Clique para mostrar " "mais..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "avaliado" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Pesquisar por vídeo" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Pesquisar Áudio" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Pesquisar Vídeo" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Concluído" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Sem título" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Remover" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Você tem certeza que deseja apagar \"%1\"?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Sem efeito" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Rock" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Reggae" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Dance" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Ao vivo" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Clássico" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Arrasa quarteirão" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Documentário" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Drama" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Manual" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Artista: " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Compositor: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Álbum: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Faixa: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Ano: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Gênero: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Tags" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Ator: " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Diretor: " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Escritor: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Produtor: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Tempo restante
Clique aqui para mostrar o tempo decorrido e " "favoritos" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Tempo decorrido
Clique aqui para mostrar o tempo restante e " "favoritos" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Pausado
Segure para Parar" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Entretenimento... Agora" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "" "Mostrando Próximos,
Clique aqui para mostrar a lista de reprodução" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Reproduzindo
Clique aqui para pausar
Clique e segure para parar" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Um erro foi encontrado durante a reprodução" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Carregando lista de reprodução..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Armazenando..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Carregando..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Mudo
Clique aqui para restaurar o volume" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Repetir
Clique aqui para desligar o modo repetir" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Aleatório
Clique aqui para desligar o modo alteatório" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Você tem certeza que deseja apagar a lista de reprodução atual?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 item, %2" msgstr[1] "%1 itens, %2%n" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 item%n" msgstr[1] "%1 itens%n" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Lista de reprodução" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Desabilitar" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Tipo" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Arte" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Título" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Artista" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Compositor" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Álbum" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Faixa" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Ano" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Gênero" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Tags" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Localização" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Ator" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Diretor" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Escritor" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Produtor" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Séries" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Temporada" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Episódio" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Links" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Contra Reprodução" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Último Reproduzido" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "%nObtendo informações para %1 item..." msgstr[1] "%nObtendo informações para %1 itens..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "%nInformações obitidas de %2 de 1 item..." msgstr[1] "%nInformações obitidas de %2 de %1 itens..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Sem Resultados" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Sons Recentemente Reproduzidos" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Sons Com Maior Avaliação" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Sons Frequentemente Reproduzidos" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Recentemente Reproduzidos" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Com Maior Avaliação" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Frequentemente Reproduzidos" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Cancelada ao Obter" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Iniciando atualização..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Atualizado: %1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Removendo informações..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Múltiplo" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Múltiplo %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Sem resultados" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Atualizando propriedades e tipos do vídeo
0 ítens atualizado..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "Atualizando propriedades e tipos do vídeo
%1 ítens do áudio " "concluído..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "Atualizando propriedades e tipos do vídeo
%1 ítens do vídeo " "concluído..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "Atualizando propriedades e tipos do vídeo
%1 ítens do áudio " "concluído..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" "Atualizando propriedades e tipos do vídeo
%1 ítens do vídeo " "concluído..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Atualização completa." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Atualização padada." #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "Pesquisar Vídeo" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Isto obtém informações de DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Nota: Esta obtenção usa a API TMDb, mas não é endosado ou certificado pela " "TMDb." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Alimentar Informações" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "Isto obtém informações para alimentar no local especificado." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Informações do nome do arquivo" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Esta obtenção usa as suposições do número do episódio e da temporada baseado " "no nome padrão do arquivo. Por exemplo: 2x23 ou S02E23 ou 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Nota: Esta obtenção usa a API Last.fm, mas não é endosado ou certificado " "pela Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Nota: Esta obtenção usa a API TMDb, mas não é endosado ou certificado pela " "TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Nota: Esta obtenção usa a API TVDB.com. Por favor, ajude a melhorar as " "informações da TVDB.com clicando no link." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Artistas" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Álbuns" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Gêneros" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Lista de reprodução" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 artista%n" msgstr[1] "%1 artistas%n" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 álbum%n" msgstr[1] "%1 álbuns%n" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 gênero%n" msgstr[1] "%1 gêneros%n" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Lista de reprodução" msgstr[1] "Lista de reprodução" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 canção%n" msgstr[1] "%1 canções%n" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 clip%n" msgstr[1] "%1 clipes%n" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 stream%n" msgstr[1] "%1 streams%n" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Novo Stream de Áudio" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Editar informações para criar novo stream de áudio" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "CD de Áudio - %1 Faixas" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 faixa%n" msgstr[1] "%1 faixas%n" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD de Vídeo - %1 Títulos" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Sem título" msgstr[1] "Sem título" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Nova alimentação de áudio" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Editar informações para criar uma nova alimentação de áudio" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 alimentação%n" msgstr[1] "%1 alimentações%n" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Nova alimentação de vídeo" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Editar informações para criar uma nova alimentação de vídeo" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Coletando informações do arquivo..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Coletando informações do arquivo (%1 arquivos)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Recentemente Reproduzidos" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Canções" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Clipes" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Streams de Áudio" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Áudio Mantidos" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Arquivos e Pastas" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Atores" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Diretores" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Filmes" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Recentemente visto" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Frequentemente vistos" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "TV Shows" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Vídeo Clipes" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Vídeo Mantidos" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Artistas - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Todos os sons" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Álbuns - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Álbuns - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "reproduzido uma vez%n" msgstr[1] "reproduzido %1 vezes%n" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 tag%n" msgstr[1] "%1 tags%n" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Filmes - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 filme%n" msgstr[1] "%1 filmes%n" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "TV Shows não categorizada" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 show%n" msgstr[1] "%1 shows%n" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Temporadas não categorizada" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Temporadas - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 temporada%n" msgstr[1] "%1 temporadas%n" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - Temporada %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - Temporadas não Categorizada" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 episódio%n" msgstr[1] "%1 episódios%n" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 ator%n" msgstr[1] "%1 atores%n" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 diretor%n" msgstr[1] "%1 diretores%n" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "pasta" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "um ano atrás%n" msgstr[1] "%1 anos atrás%n" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "um mês atrás%n" msgstr[1] "%1 meses atrás%n" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "um semana atrás%n" msgstr[1] "%1 semans atrás%n" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "um dia atrás%n" msgstr[1] "%1 dia atrás%n" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "um hora atrás%n" msgstr[1] "%1 hora atrás%n" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "um minuto atrás%n" msgstr[1] "%1 minutos atrás%n" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "uns segundos atrás" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Título %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Discom Completo" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Temporada %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Episódio %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Temporada %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" #~ msgid "Showing Information
Click to hide information." #~ msgstr "" #~ "Mostrando Próximos,
Clique aqui para mostrar lista de reprodução" #~ msgid "A Media Player" #~ msgstr "Um Reprodutor de Mídia" #~ msgid "Janusz Lewandowski" #~ msgstr "Janusz Lewandowski" #~ msgid "Sebastian Jambor" #~ msgstr "Sebastian Jambor" #~ msgid "Info" #~ msgstr "Informações" #~ msgid "Description:%1" #~ msgstr "Descrição" #~ msgid "Show video Settings" #~ msgstr "Mostrar Configurações de Vídeo" #~ msgid "Show audio Settings" #~ msgstr "Mostrar Configurações de Vídeo" #~ msgid "Last played: %1" #~ msgstr "Recentemente reproduzidos" #~ msgid "Playback message" #~ msgstr "Mensagem de reprodução" #~ msgid "Not Playing" #~ msgstr "Reproduzindo agora" #~ msgid "results" #~ msgstr "Sem resultados" #~ msgid "Titles" #~ msgstr "Título" #~ msgid "Audio Channels" #~ msgstr "Áudio Clipe" #~ msgid "episodeNumber" #~ msgstr "1 episódio%n" #~ msgid "Configure shortcuts..." #~ msgstr "Configurar atalhos..." #~ msgid "Show video vettings" #~ msgstr "Mostrar Configurações de Vídeo" #~ msgid "Updating..." #~ msgstr "Atualizando..." #~ msgid "Updated info for %1, %2" #~ msgstr "Informações atualizadas para" #~ msgid "Removed info for %1" #~ msgstr "Informações removidas para" #~ msgid "Hue" #~ msgstr "Tonalidade" #~ msgid "Track %1" #~ msgstr "Faixa %1" #~ msgctxt "%1=Title of DVD" #~ msgid "DVD Video - %1" #~ msgstr "DVD de Vídeo - %1 Títulos" #~ msgid "Index audio file(s)" #~ msgstr "Abrir arquivo(s) de áudio" #~ msgid "Index folder containing audio file(s)" #~ msgstr "Abrir pasta contendo arquivo(s) de áudio" #~ msgid "Index video file(s)" #~ msgstr "Abrir arquivo(s) de vídeo" #~ msgid "Index folder containing video file(s)" #~ msgstr "Abrir pasta contendo arquivo(s) de vídeo" #~ msgid "Audio Files" #~ msgstr "Arquivos de Áudio" #~ msgid "Video Files" #~ msgstr "Arquivos de Vídeo" #~ msgid "Recently Played Artists" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Played Artists" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Recently Played Albums" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Played Albums" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Recently Played Genres" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Played Genres" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Recently Played Clips" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Played Clips" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Recently Played Streams" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Played Streams" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Recently Played Tags" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Played Tag" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Recently Watched Movies" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Watched Movies" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Recently Watched TV Shows" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Watched TV Shows" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Recently Watched Genres" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Watched Genres" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Recently Watched Actors" #~ msgstr "Recentemente reproduzidos" #~ msgid "Frequently Watched Actors" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Frequently Watched Directors" #~ msgstr "Frequentemente reproduzidos " #~ msgid "Add selected info" #~ msgstr "Remover informações selecionadas" #~ msgid "Search in playlist..." #~ msgstr "Carregando lista de reprodução..." #~ msgid "Toggle fullscreen" #~ msgstr "Tela cheia" #~ msgid "03:00" #~ msgstr "03:00" #~ msgid "Untitled Audio Stream" #~ msgstr "Stream de Áudio sem titulo" #~ msgid "Select this item, click Info then Edit to enter audio stream info" #~ msgstr "" #~ "Selecione este item e clique em Editar, para inserir informações de " #~ "stream de áudio" #~ msgid "Open image file(s)" #~ msgstr "Abrir arquivo(s) de imagem" #~ msgid "Open folder containing image file(s)" #~ msgstr "Abrir pasta contendo arquivo(s) de imagem" #~ msgid "%1" #~ msgstr "1" #~ msgid "Edit" #~ msgstr "Editar" #~ msgid "Saving..." #~ msgstr "Carregando..." #~ msgid "Track Number" #~ msgstr "Número da faixa" #~ msgid "Sort" #~ msgstr "Classificar" #~ msgid "2" #~ msgstr "2" #~ msgid "Clear Lista de reprodução" #~ msgstr "Apagar lista de reprodução" #~ msgid "Lista de reprodução(Upcoming)" #~ msgstr "Lista de reprodução(Próximos)" bangarang-bangarang/po/ru/000077500000000000000000000000001166760560600157755ustar00rootroot00000000000000bangarang-bangarang/po/ru/CMakeLists.txt000066400000000000000000000001641166760560600205360ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( ru ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/ru/bangarang.po000066400000000000000000002266701166760560600202720ustar00rootroot00000000000000# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # Victor , 2011. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-11-17 20:48+0300\n" "Last-Translator: Victor \n" "Language-Team: Russian <>\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: \n" "X-Generator: Lokalize 1.2\n" "X-Poedit-Bookmarks: 157,313,199,-1,-1,-1,-1,-1,-1,-1\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Рыжих Виктор" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "victorr2007@yandex.ru" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "Форма" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Добавить в список" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Удалить из списка" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Настройки" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Добавить в список" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Источник" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Текущий вид" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Текущий выбор" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Текущий плейлист" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Имя нового списка" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "Название" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Сохранить" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Вернуться в списки" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Параметры сохранения списка" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Название" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Заголовок списка" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Показ" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "пунктов" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "проиграно" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "до" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "после" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "больше" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "точно" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "меньше" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "раз" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Медиатека" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Поиск аудио" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Аудио" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Видео" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Просмотр воспроизведения" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Воспроизведение" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Описание" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Фильтр" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Дополнительную информацию можно получить с:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Выборка данных и редактирование изменений" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Выборка данных и сохранение изменений" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Соответствия" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Закрыть редактирование" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Индексирование выбранного" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Текст уведомления" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Предыдущий" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Играть все из списка" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Играть все" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Играть выбранное из списка" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Играть выбранное" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Встроенные субтитры" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Плейлист" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Сообщение об ошибке" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Показать предстоящий" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Плейлист" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Очистить" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Включить повторение" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Включить перемешивание" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Уведомление" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Да" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Нет" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Параметры звука" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Аудио Канал:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Эквалайзер" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Предустановки" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Пред" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1к" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3к" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6к" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12к" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14к" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16к" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Восстановить по умолчанию" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Скрыть" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Параметры видео" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Субтитри:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Угол:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "Не определить кодировку субтитров, пожалуйста, выберите:" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Яркость:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Контрастность:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Тон:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Насыщенность:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Соотношение сторон" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Автоматическое" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Вместить" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Масштабировать" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Вместить в границы печати" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Масштабировать и обрезать" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Комбинации клавиш" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Сохранить горячие клавиши" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Отменить" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Показать медиа списки" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Во весь экран" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Время осталось
Нажать для просмотра затраченного времени" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Выключить звук" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Громкость" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Вернуться в списки" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Мультимедиа проигрыватель для KDE" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "© Andrew Lake, 2011" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" " Примечание: Этот продукт использует API TMDb без подтверждения " "сертифицирования TMDb. Пожалуйста, помогите улучшить доступную информацию, " "посещая http://themoviedb.org
Примечание: Этот продукт " "использует API Last.fm без подтверждения сертифицирования Last.fm. " "Пожалуйста, помогите улучшить доступную информацию, посещая http://last.fm " "
Примечание: Этот продукт использует TheTVDB.com API без " "подтверждения сертифицирования TheTVDB.com. Пожалуйста, помогите улучшить " "доступную информацию, посещая http://thetvdb.com" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Автор" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Разработчик" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Об ошибках просим сообщать на http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Об ошибках просим сообщать на систему отслеживания проблем Bangarang" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Воспроизвести URL" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Воспроизвести DVD" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Воспроизвести аудио CD" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Дополнительный Вывод Отладки" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "Включить сенсорный интерфейс" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Выход" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Играть/Пауза" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Играть" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Пауза" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Играть следующий" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Играть предыдущий" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Выключить звук" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Играть все" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Играть выбранное" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Добавить в список" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Добавить в очередь" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Удалить из списка" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Скрыть управление" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Открыть фильтр" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Показать оставшееся время" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Открыть настройки видео" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Открыть настройки звука" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "Во весь экран" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Сохранить выбранное" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Удалить выбранное" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Обновить" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Удалить из списка" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Добавить в \"Аудиопоток\"" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Добавить в список" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Добавить в список" #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Новый список" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Пункты" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Информация" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Панель данных" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Добавить закладку" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Удалить закладки" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Открыть редактор клавиш" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Обновить онтологию..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Скрыть в системный лоток" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Панель данных" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Скрыть панель данных" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Добавить в очередь" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Скрыть информацию" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Часть %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Открыть Управление" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Скрыть Управление" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Скрыть настойки видео" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Скрыть настройки звука" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Скрыть редактор клавиш" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Восстановить звук" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Восстановить размер видео" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Прошедшее время" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Закладка-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Обновить онтологии" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "Обновление онтологий гарантирует, что информация носителей хранится в пути, " "который делает его доступным для других настольных приложений. Это " "необходимо, если Вы недавно обновили Bangarang или Ваш KDE.

Это " "может занять несколько минут." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Стоп" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Закрыть" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Скрыть фильтр" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "Открыть настройки звука" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "Открыть настройки видео" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang не может получить доступ к хранилищу Nepomuk. Медиатека, оценки и " "функция количества проигрываний будут недоступны." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Не показывать это сообщение" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Продолжить" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "Видео DVD" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "Аудиодиск" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "Во весь экран
Выйти из полноэкранного режима" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Во весь экран" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Добавить в список/Удалить из списка" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Показать песню" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Показать альбом" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Показать артиста" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Музыка" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Аудиопоток" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Аудио клип" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Фильм" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "Телепередача" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Видео клип" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Нет описания" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Многократные значения" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Открыть файл обложки" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Нажать для завершения редактирования." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Нажать для скрытия" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "Доступна дополнительная информация.
Нажать для просмотра…" #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "оценено" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Поиск видео" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Поиск аудио" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Поиск видео" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Завершено" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Безымянный" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Удалить" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Вы правда хотите удалить \"%1\"?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Без эффектов" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Рок" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Регги" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Данс" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Живое" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Классика" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Блокбастер" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Документальный" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Драма" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Вручную" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Артист: " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Композитор: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Альбом: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Композиция: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Год: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Жанр: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "Теги" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Актер: " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Режиссер: " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Сценарист: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Продюсер: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Время осталось
Щелкните, чтобы показать затраченное время и " "закладки" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Время затрачено
Щелкните, чтобы показать оставшееся время и " "закладки" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Пауза
Нажать для остановки" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Развлечение… Сейчас" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "Показ следующего
Нажми для просмотра списка" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Воспроизведение
Нажать для паузы
Нажать и удерживать, для " "остановки" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Произошла ошибка во время воспроизведения" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Загрузка списка…" #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Буферизация…" #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Загрузка..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Звук выключен
Нажать для включения звука" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Включено повторение
Нажать для выхода" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Перемешивание включено
Нажать для выхода" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Вы хотите очистить текущий список воспроизведения?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "1 элемент, %2" msgstr[1] "%1 элемента, %2" msgstr[2] "%1 элементов, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "1 элемент" msgstr[1] "% элемента" msgstr[2] "%1 элементов" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Плейлист (следуюший)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Отключить" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Тип" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Художественное оформление" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Название" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Исполнитель" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Редактор" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Альбом" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Дорожка" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Год" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Жанр" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Теги" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Расположение" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Актер" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Режиссер" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Сценарист" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Производитель" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Сериал" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Сезон" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Серия" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Ссылки" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Играть пункт" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Список проигрывания" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Выборка информации для %1 элемента..." msgstr[1] "Выборка информации для %1 элементов..." msgstr[2] "Выборка информации для %1 элементов..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Выборка информации для %2 из 1 элемента..." msgstr[1] "Выборка информации для %2 из %1 элементов..." msgstr[2] "Выборка информации для %2 из %1 элементов..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Ничего не найдено" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Недавно проигранные композиции" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Композиции с наивысшей оценкой" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Часто проигрываемые композиции" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Недавно проигранное" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "С наивысшим рейтингом" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Популярные" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Выборка отменена" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Начало обновления…" #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Обновлено: %1 — %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Удаление информации…" #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Многократно" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Многократно %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Ничего не найдено" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Обновление типов аудио данных и параметров
0 данных обновлено…" #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "Обновление типов аудио данных и параметров
Обновлено данных %1 " "аудио объектов…" #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "Обновление типов видео данных и параметров
Обновлено данных %1 " "видео объектов…" #: platform/ontologyupdater.cpp:385 #, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "Очистка ошибочных свойств аудио
%1 аудио объектов готово…" #: platform/ontologyupdater.cpp:413 #, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "Очистка ошибочных свойств видео
%1 видео объектов готово…" #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Обновление завершено." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Обновление остановлено." #: platform/playlist.cpp:671 msgid "Video Playback" msgstr "Воспроизведение видео" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Это инструмент загружает данные с DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "Douban" #: platform/infofetchers/doubaninfofetcher.cpp:37 msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Примечание: Этот продукт использует Douban API без подтверждения " "сертифицирования Douban." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Данные потока" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "Это инструмент загружает информацию потока с указанных адресов." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Данные на основании имени файла" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Этот инструмент назначает данные сезону и сериям на основании имени файла. " "Прикладыв назв: 2x23, S02E23, 2.23." #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Примечание: Этот продукт использует API Last.fm без подтверждения " "сертифицирования Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Примечание: Этот продукт использует API TMDb без подтверждения " "сертифицирования TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Примечание: Этот продукт использует TheTVDB.com API без подтверждения " "сертифицирования TheTVDB.com." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Исполнители" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Альбомы" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Жанры" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "Плейлист" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "1 артист" msgstr[1] "%1 артиста" msgstr[2] "%1 артистов" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "1 альбом" msgstr[1] "%1 альбома" msgstr[2] "%1 альбомов" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "1 жанр" msgstr[1] "%1 жанра" msgstr[2] "%1 жанров" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "Плейлист" msgstr[1] "Плейлист" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "1 песня" msgstr[1] "%1 песни" msgstr[2] "%1 песен" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "1 клип" msgstr[1] "%1 клипа" msgstr[2] "%1 клипов" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "1 поток" msgstr[1] "%1 потока" msgstr[2] "%1 потоков" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Новый аудио поток" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Редактировать данные установки аудио потока" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Аудио CD - %1 композиций" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "1 композиция" msgstr[1] "%1 композиции" msgstr[2] "%1 композиций" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "Видео-DVD — %1 записей" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "Безымянный" msgstr[1] "Безымянный" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Новый аудио поток" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Редактировать данные установки аудио потока" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "1 поток" msgstr[1] "%1 потока" msgstr[2] "%1 потоков" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Новый видео поток" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Редактировать данные установки видео потока" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Сбор данных из файла…" #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Сбор данных из файла (%1 файлов)…" #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "Недавно проигранное" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Песни" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Клипы" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Аудиопотоки" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Аудио потоки" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Файлы и папки" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Актеры" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Режиссеры" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Фильмы" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Недавно просмотренные" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Часто просматриваемые" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Телепередачи" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Видеоклипы" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Видео Каналы" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Артисты - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Все композиции" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Альбомы - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Альбомы -%1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "проигран раз" msgstr[1] "проигран %1 раза" msgstr[2] "проигран %1 раз" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "1 тег" msgstr[1] "%1 тега" msgstr[2] "%1 тегов" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Фильмы - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "1 фильм" msgstr[1] "%1 фильма" msgstr[2] "%1 фильмов" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Некатегорезированные ТВ программы" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "1 показ" msgstr[1] "%1 показа" msgstr[2] "%1 показов" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Некатегорезированные сезоны" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Сезоны — %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "1 сезон" msgstr[1] "%1 сезона" msgstr[2] "%1 сезонов" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 -Сезон %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 -Некатегорезированные сезоны" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "1 серия" msgstr[1] "%1 серии" msgstr[2] "%1 серий" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "1 актер" msgstr[1] "%1 актера" msgstr[2] "%1 актеров" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "1 режиссер" msgstr[1] "%1 режиссера" msgstr[2] "%1 режиссеров" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "папка" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "год назад" msgstr[1] "%1 года назад" msgstr[2] "%1 лет назад" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "месяц назад" msgstr[1] "%1 месяца назад" msgstr[2] "%1 месяцев назад" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "неделя назад" msgstr[1] "%1 недели назад" msgstr[2] "%1 недель назад" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "день назад" msgstr[1] "%1 дня назад" msgstr[2] "%1 дней назад" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "час назад" msgstr[1] "%1 часа назад" msgstr[2] "%1 часов назад" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "минуту назад" msgstr[1] "%1 минуты назад" msgstr[2] "%1 минут назад" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "секунд назад" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Запись %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Весь диск" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Сезон %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Серия %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Сезон %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" bangarang-bangarang/po/uk/000077500000000000000000000000001166760560600157665ustar00rootroot00000000000000bangarang-bangarang/po/uk/CMakeLists.txt000066400000000000000000000001641166760560600205270ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( uk ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/uk/bangarang.po000066400000000000000000002363611166760560600202610ustar00rootroot00000000000000# Copyright (C) 2011 This_file_is_part_of_KDE # This file is distributed under the same license as the bangarang package. # # Yuri Chornoivan , 2010, 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-12-04 19:13+0200\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Lokalize 1.2\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Юрій Чорноіван" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "yurchor@ukr.net" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "Форма" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "Додати список" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "Вилучити список" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "Параметри" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "Додати список" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "Джерело" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "Поточний перегляд" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "Поточне позначене" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "Поточний список відтворення" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "ownCloud/Ampache" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "Назва нового списку" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "Сервер" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 msgid "User Name" msgstr "Ім'я користувача" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "Пароль" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "Зберегти" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "Повернутися до списків" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "Параметри збереженого списку" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "Назва" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" "Ви можете експортувати цей список до файла, якщо ви плануєте скористатися ним " "у інших програмах." #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "Експортувати до файла…" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "Заголовок списку" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "Показ" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "об’єктів" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "відтворено" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "до" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "після" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "або більше" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "точно" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "або менше" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "разів" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "Списки" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "Пошук звукових даних" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "Аудіо" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "Відео" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "Переглянути поточне відтворення" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "Зараз відтворюється" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "Резюме" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "…" #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "Фільтр" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "Додаткові дані можна отримати з:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "Отримати відомості і редагувати зміни" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "Отримати дані і зберегти зміни" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "Відповідники" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "Скасувати редагування" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "Індексувати позначені" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "Текст сповіщення" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "Попередній" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "Відтворити всі пункти у списку" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "Відтворити все" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "Відтворити позначений пункт у списку" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "Відтворити позначені" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "Зовнішні субтитри" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "Список відтворення" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "Повідомлення про помилку" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "Показати наступний" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "Список відтворення" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "Спорожнити список відтворення" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "Увімкнути повторення" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "Увімкнути випадкове відтворення" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "Сповіщення" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "Так" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "Ні" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "Параметри звуку" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "Канали звуку:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "Еквалайзер" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "Набори налаштувань" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "Підс." #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1к" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3к" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6к" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12к" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14к" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16к" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "Відновити типові параметри" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "Сховати" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "Параметри відео" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "Субтитри:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "Кут:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "Не вдалося визначити кодування субтитрів, вкажіть його:" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "Яскравість:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "Контрастність:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "Відтінок:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "Насиченість:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "Співвідношення сторін" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "Автоматично" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "Вмістити" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "Масштабування" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "Вмістити" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "Масштабувати і обрізати" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "Клавіатурні скорочення" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "Зберегти клавіатурні скорочення" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "Скасувати" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "Переглянути списки" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "Показати на весь екран" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "Час відтворення
Натисніть, щоб переглянути час, що залишився" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "Вимкнути звук" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "Гучність" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "Повернутися до списків" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "Мультимедійний програвач для вашої стільниці KDE" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "© Andrew Lake, 2011" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" "Зауваження: у цій програмі використано програмний інтерфейс TMDb, але " "програму не схвалено і не сертифіковано TMDb. Будь ласка, допоможіть у " "покращенні якості даних: відвідайте http://themoviedb.org
Зауваження: у цій програмі використано програмний інтерфейс Last.fm, але програму не " "схвалено і не сертифіковано Last.fm. Будь ласка, допоможіть у покращенні " "якості даних: відвідайте http://last.fm
Зауваження: у цій програмі " "використано програмний інтерфейс TheTVDB.com, але програму не схвалено і не " "сертифіковано TheTVDB.com. Будь ласка, допоможіть у покращенні якості даних: " "відвідайте http://thetvdb.com" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "Автор" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "Учасник розробки" #: app/main.cpp:43 msgid "Elias Probst" msgstr "Elias Probst" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "" "Про вади можна повідомити за адресою http://code.google.com/p/" "bangarangissuetracking/" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "Про вади можна повідомити до системи стеження за вадами Bangarang" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "Відтворити «URL»" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "Відтворити відео-DVD" #: app/main.cpp:54 msgid "Play CD Music" msgstr "Відтворити музичний КД" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "Показувати додаткові діагностичні дані" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "Увімкнути режим сенсорного інтерфейсу" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "Вийти" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "Старт/Пауза" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "Пуск" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "Пауза" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "Відтворити наступний" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "Відтворити попередній" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "Вимкнути звук" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "Відтворити все" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "Відтворити позначені" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "Додати до списку відтворення" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "Додати після поточного відтворення" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "Вилучити зі списку відтворення" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "Сховати керування" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "Фільтр показу" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "Показувати час, що залишився" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "Показувати параметри відео" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "Показувати параметри звуку" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "На весь екран" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "Зберегти позначені відомості" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "Вилучити позначені відомості" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "Оновити" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "Вибрати все" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "Вилучити зі списку" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "Додати до «Аудіопотоків»" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "Додати до списку" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "Додати до списку " #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "Створити список" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "Показати об’єкти" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "Показати відомості" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "Показати панель даних" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "Додати закладку" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "Вилучити закладки" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "Показати редактор скорочень" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "Оновити онтології…" #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "Згорнути до системного лотка" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "Керування відомостями" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "Приховати панель даних" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "Відтворити після поточного відтворення" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "Приховати відомості" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "Частина %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "Показати керування" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "Приховати керування" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "Приховати параметри відео" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "Приховати параметри звуку" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "Приховати редактор скорочень" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "Відновити звук" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "Відновити початкові розміри кадру" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "Показувати час відтворення" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "Закладка-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "Оновити онтології" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "За допомогою оновлення онтологій можна забезпечити таке зберігання даних, за " "якого вони будуть доступні всіх іншим програмам стільничного середовища. " "Таке оновлення може знадобитися, лише якщо ви нещодавно встановили нову " "версію Bangarang або всього набору програм KDE.

Оновлення може " "тривати декілька хвилин." #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "Зупинити" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "Закрити" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "Приховати фільтр" #: app/common/actionsmanager.cpp:1148 msgid "Show Audio Lists" msgstr "Показувати списки аудіо" #: app/common/actionsmanager.cpp:1154 msgid "Show Video Lists" msgstr "Показувати списки відео" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang не вдалося отримати доступ до сховища семантичної стільниці " "Nepomuk. Можливості мультимедійної бібліотеки, оцінювання та визначення " "кількості відтворень буде вимкнено." #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "Не показувати більше це повідомлення" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "Поновити" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "Відео-DVD" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "Аудіо КД" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "На весь екран
Натисніть, щоб вимкнути повноекранний режим" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "Показувати на весь екран" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "Додати до списку/Вилучити зі списку" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "Показувати пісні" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "Показувати альбоми" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "Показувати виконавців" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "Музика" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "Потік звукових даних" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "Звуковий кліп" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "Фільм" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "Телепередача" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "Відеокліп" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "Немає опису" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "Декілька значень" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "Відкрити файл обкладинки" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "Натисніть , щоб завершити редагування." #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "Натисніть, щоб приховати" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "" "Ви можете отримати доступ до додаткових відомостей.
Натисніть, щоб їх " "переглянути…" #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "оцінено" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "Пошук відео" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "Пошук звукових даних" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "Пошук відеоданих" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "Завершення" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" "Вкажіть шлях до сервера повністю.
Приклади:
- ownCloud, вкажіть " "\"http://" "[вузол]/owncloud/apps/media\"
- Ampache, вкажіть " "\"http://[вузол]/ampache\"" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "Без назви" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "Вилучити" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "Ви справді бажаєте вилучити «%1»?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "*.m3u|файли M3U (*.m3u)" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" "

Файл з назвою %1 вже існує.

Бажаєте його " "перезаписати?

" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "Без ефектів" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "Рок" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "Реггі" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "Танцювальна музика" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "Наживо" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "Класика" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "Блокбастер" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "Документальний" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "Драма" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "Вручну" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "Виконавець: " #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "Композитор: " #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "Альбом: " #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "Композиція: " #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "Рік: " #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "Жанр: " #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 msgid "Tags: " msgstr "Мітки: " #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "Актор: " #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "Режисер: " #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "Сценарист: " #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "Продюсер: " #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "" "Час, що залишився
Натисніть, щоб переглянути час відтворення та " "закладки." #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "" "Час відтворення
Натисніть, щоб переглянути час, що залишився, і " "закладки." #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "Призупинено
Натисніть, щоб зупинити" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "Розваги… Зараз" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "" "Показ наступного
Натисніть, щоб переглянути список відтворення" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "" "Відтворення
Натисніть, щоб призупинити
Натисніть і утримуйте, " "щоб зупинити" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "Під час спроби відтворення сталася помилка" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "Завантаження списку відтворення…" #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "Буферизація…" #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "Завантаження…" #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "Звук вимкнено
Натисніть, щоб увімкнути звук" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "Увімкнено повторення
Натисніть, щоб його вимкнути" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "Увімкнено випадкове відтворення
Натисніть, щоб його вимкнути" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "Ви справді бажаєте спорожнити поточний список відтворення?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "%1 об’єкт, %2" msgstr[1] "%1 об’єкти, %2" msgstr[2] "%1 об’єктів, %2" msgstr[3] "1 об’єкт, %2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "%1 об’єкт" msgstr[1] "%1 об’єкти" msgstr[2] "%1 об’єктів" msgstr[3] "1 об’єкт" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "Список відтворення (наступний)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "Вимкнути" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "Тип" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "Графіка" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "Назва" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "Виконавець" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "Композитор" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "Альбом" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "Композиція" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "Рік" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "Жанр" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "Мітки" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "Адреса" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "Актор" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "Режисер" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "Сценарист" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "Продюсер" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "Серіал" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "Сезон" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "Серія" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "Посилання" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "Кількість відтворень" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "Попереднє відтворення" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "Отримання відомостей щодо %1 об’єкта…" msgstr[1] "Отримання відомостей щодо %1 об’єктів…" msgstr[2] "Отримання відомостей щодо %1 об’єктів…" msgstr[3] "Отримання відомостей щодо %1 об’єкта…" #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "Отримання відомостей щодо %2 з %1 об’єкта…" msgstr[1] "Отримано відомості щодо %2 з %1 об’єктів…" msgstr[2] "Отримано відомості щодо %2 з %1 об’єктів…" msgstr[3] "Отримання відомостей щодо %2 з 1 об’єкта…" #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "Нічого не знайдено" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "Нещодавно відтворені композиції" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "Композиції з найвищою оцінкою" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "Часто відтворювані композиції" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "Нещодавні" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "Найвищий рейтинг" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "Популярні" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "Отримання скасовано" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "Початок оновлення…" #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "Оновлено: %1 — %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "Вилучення відомостей…" #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "Декілька" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "Декілька %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "Нічого не знайдено" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "" "Оновлення типів звукових даних та властивостей
Оновлено дані 0 " "об’єктів…" #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "" "Оновлення типів звукових даних та властивостей
Оновлено дані %1 " "звукових об’єктів…" #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "" "Оновлення типів відеоданих та властивостей
Оновлено дані %1 " "відеооб’єктів…" #: platform/ontologyupdater.cpp:385 #, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "" "Спорожнення помилкових параметрів відтворення звуку.
Оновлено дані %" "1 об’єктів…" #: platform/ontologyupdater.cpp:413 #, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "" "Спорожнення помилкових параметрів відео.
Оновлено дані %1 " "відеооб’єктів…" #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "Оновлення завершено." #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "Оновлення зупинено." #: platform/playlist.cpp:671 msgid "Video Playback" msgstr "Відтворення відео" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "Цей інструмент отримує дані з DBPedia.org." #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "Douban" #: platform/infofetchers/doubaninfofetcher.cpp:37 msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "" "Зауваження: цей інструмент використовує програмний інтерфейс Douban, але його " "не схвалено і не сертифіковано Douban." #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "Дані подачі" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "Цей інструмент отримує дані подачі з вказаною адресою." #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "Дані на основі назви файла" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "" "Цей інструмент намагається визначити дані щодо сезону і серії на основі " "назви файла. Приклади назв: 2x23, S02E23, 2.23." #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "" "Зауваження: цей інструмент використовує програмний інтерфейс Last.fm, але " "його не схвалено і не сертифіковано Last.fm." #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "" "Зауваження: цей інструмент використовує програмний інтерфейс TMDb, але його " "не схвалено і не сертифіковано TMDb." #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "Зауваження: цей інструмент використовує програмний інтерфейс theTVDB.com. " "Будь ласка, допоможіть покращити дані theTVDB.com за допомогою наведеного " "посилання." #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "Виконавці" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "Альбоми" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "Жанри" #: platform/listengines/ampachelistengine.cpp:161 msgid "Playlists" msgstr "Списки композицій" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "%1 виконавець" msgstr[1] "%1 виконавці" msgstr[2] "%1 виконавців" msgstr[3] "1 виконавець" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "%1 альбом" msgstr[1] "%1 альбоми" msgstr[2] "%1 альбомів" msgstr[3] "1 альбом" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "%1 жанр" msgstr[1] "%1 жанри" msgstr[2] "%1 жанрів" msgstr[3] "1 жанр" #: platform/listengines/ampachelistengine.cpp:274 #, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "%1 список композицій" msgstr[1] "%1 списки композицій" msgstr[2] "%1 списків композицій" msgstr[3] "1 список композицій" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "%1 пісня" msgstr[1] "%1 пісні" msgstr[2] "%1 пісень" msgstr[3] "1 пісня" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "%1 кліп" msgstr[1] "%1 кліпи" msgstr[2] "%1 кліпів" msgstr[3] "1 кліп" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "%1 потік" msgstr[1] "%1 потоки" msgstr[2] "%1 потоків" msgstr[3] "1 потік" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "Новий потік звукових даних" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "Змініть параметри, щоб створити новий запис потоку звукових даних" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "Аудіо-КД — %1 композицій" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "%1 композиція" msgstr[1] "%1 композиції" msgstr[2] "%1 композицій" msgstr[3] "1 композиція" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "Відео-DVD — %1 записів" #: platform/listengines/dvdlistengine.cpp:97 #, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "%1 об’єкт" msgstr[1] "%1 об’єкти" msgstr[2] "%1 об’єктів" msgstr[3] "%1 об’єкт" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "Новий потік звукових даних" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "Змініть параметри, щоб створити новий запис подачі звукових даних" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "%1 подача" msgstr[1] "%1 подачі" msgstr[2] "%1 подач" msgstr[3] "1 подача" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "Нова подача відеоданих" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "Змініть параметри, щоб створити новий запис подачі відеоданих" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "Збирання даних щодо файла…" #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "Збирання даних щодо файлів (%1 файлів)…" #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 msgid "Recently Added" msgstr "Нещодавно додані" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "Пісні" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "Кліпи" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "Аудіопотоки" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "Подачі звукових даних" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "Файли і теки" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "Актори" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "Режисери" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "Фільми" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "Нещодавно переглянуті" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "Ті, що часто переглядаються" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "Телепередачі" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "Відеокліпи" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "Подачі відеоданих" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "Виконавці — %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "Всі композиції" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "Альбоми — %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "Альбоми —%1 — %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "відтворені %1 раз" msgstr[1] "відтворені %1 рази" msgstr[2] "відтворені %1 разів" msgstr[3] "відтворені один раз" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "додані %1" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "%1 мітка" msgstr[1] "%1 мітки" msgstr[2] "%1 міток" msgstr[3] "1 мітка" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "Фільми — %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "%1 фільм" msgstr[1] "%1 фільми" msgstr[2] "%1 фільмів" msgstr[3] "1 фільм" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "Телепрограми поза категоріями" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "%1 програма" msgstr[1] "%1 програма" msgstr[2] "%1 програма" msgstr[3] "1 програма" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "Сезони поза категоріями" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "Сезони — %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "%1 сезон" msgstr[1] "%1 сезони" msgstr[2] "%1 сезонів" msgstr[3] "1 сезон" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 — сезон %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 — сезони поза категоріями" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "%1 серія" msgstr[1] "%1 серії" msgstr[2] "%1 серій" msgstr[3] "1 серія" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "%1 актор" msgstr[1] "%1 актори" msgstr[2] "%1 акторів" msgstr[3] "1 актор" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "%1 режисер" msgstr[1] "%1 режисери" msgstr[2] "%1 режисерів" msgstr[3] "1 режисер" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "тека" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "%1 рік тому" msgstr[1] "%1 роки тому" msgstr[2] "%1 років тому" msgstr[3] "рік тому" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "%1 місяць тому" msgstr[1] "%1 місяці тому" msgstr[2] "%1 місяців тому" msgstr[3] "місяць тому" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "%1 тиждень тому" msgstr[1] "%1 тижні тому" msgstr[2] "%1 тижнів тому" msgstr[3] "тиждень тому" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "%1 день тому" msgstr[1] "%1 дні тому" msgstr[2] "%1 днів тому" msgstr[3] "день тому" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "%1 годину тому" msgstr[1] "%1 години тому" msgstr[2] "%1 годин тому" msgstr[3] "годину тому" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 хвилину тому" msgstr[1] "%1 хвилини тому" msgstr[2] "%1 хвилин тому" msgstr[3] "хвилину тому" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "декілька секунд тому" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "Запис %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "Весь диск" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "Сезон %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "Серія %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "Сезон %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" bangarang-bangarang/po/zh_CN/000077500000000000000000000000001166760560600163505ustar00rootroot00000000000000bangarang-bangarang/po/zh_CN/CMakeLists.txt000066400000000000000000000001671166760560600211140ustar00rootroot00000000000000file(GLOB _po_files *.po) GETTEXT_PROCESS_PO_FILES( zh_CN ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} ) bangarang-bangarang/po/zh_CN/bangarang.po000066400000000000000000002044571166760560600206440ustar00rootroot00000000000000# translation of bangarang.po to 简体中文 # Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Ni Hui , 2010, 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://code.google.com/p/bangarangissuetracking/" "issues\n" "POT-Creation-Date: 2011-12-03 21:21-0800\n" "PO-Revision-Date: 2011-01-30 10:18+0800\n" "Last-Translator: Ni Hui \n" "Language-Team: Chinese Simplified \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Lokalize 1.1\n" #: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Ni Hui" #: rc.cpp:2 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "shuizhuyuanluo@126.com" #. i18n: file: app/ui/audiolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, AudioListsStack) #. i18n: file: app/ui/videolistsstack.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, VideoListsStack) #: rc.cpp:5 rc.cpp:401 msgid "Form" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList) #. i18n: file: app/ui/videolistsstack.ui:76 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList) #: rc.cpp:8 rc.cpp:404 msgid "Add list" msgstr "添加列表" #. i18n: file: app/ui/audiolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList) #. i18n: file: app/ui/videolistsstack.ui:96 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList) #: rc.cpp:11 rc.cpp:407 msgid "Remove list" msgstr "删除列表" #. i18n: file: app/ui/audiolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList) #. i18n: file: app/ui/videolistsstack.ui:129 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList) #: rc.cpp:14 rc.cpp:410 msgid "Settings" msgstr "设置" #. i18n: file: app/ui/audiolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_5) #. i18n: file: app/ui/videolistsstack.ui:178 #. i18n: ectx: property (text), widget (QLabel, label_7) #: rc.cpp:17 rc.cpp:413 msgid "Add List" msgstr "添加列表" #. i18n: file: app/ui/audiolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_4) #. i18n: file: app/ui/videolistsstack.ui:195 #. i18n: ectx: property (text), widget (QLabel, label_6) #: rc.cpp:20 rc.cpp:416 msgid "Source" msgstr "来源" #. i18n: file: app/ui/audiolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView) #. i18n: file: app/ui/videolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView) #: rc.cpp:23 rc.cpp:422 msgid "Current View" msgstr "当前视图" #. i18n: file: app/ui/audiolistsstack.ui:221 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection) #. i18n: file: app/ui/videolistsstack.ui:214 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection) #: rc.cpp:26 rc.cpp:419 msgid "Current Selection" msgstr "当前选中项" #. i18n: file: app/ui/audiolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist) #. i18n: file: app/ui/videolistsstack.ui:228 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist) #: rc.cpp:29 rc.cpp:425 msgid "Current Playlist" msgstr "当前播放列表" #. i18n: file: app/ui/audiolistsstack.ui:235 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceAmpache) #: rc.cpp:32 msgid "ownCloud/Ampache" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:245 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName) #. i18n: file: app/ui/videolistsstack.ui:238 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName) #: rc.cpp:35 rc.cpp:428 msgid "New List Name" msgstr "新列表名称" #. i18n: file: app/ui/audiolistsstack.ui:258 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServerAdd) #. i18n: file: app/ui/audiolistsstack.ui:432 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheServer) #: rc.cpp:38 rc.cpp:59 msgid "Server" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:265 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserNameAdd) #. i18n: file: app/ui/audiolistsstack.ui:439 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampacheUserName) #: rc.cpp:41 rc.cpp:62 #, fuzzy msgid "User Name" msgstr "名称" #. i18n: file: app/ui/audiolistsstack.ui:272 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePasswordAdd) #. i18n: file: app/ui/audiolistsstack.ui:446 #. i18n: ectx: property (clickMessage), widget (KLineEdit, ampachePassword) #: rc.cpp:44 rc.cpp:65 msgid "Password" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:297 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList) #. i18n: file: app/ui/audiolistsstack.ui:474 #. i18n: ectx: property (text), widget (QPushButton, aslsSave) #. i18n: file: app/ui/audiolistsstack.ui:1019 #. i18n: ectx: property (text), widget (QPushButton, semAConfigSave) #. i18n: file: app/ui/mainwindow.ui:1432 #. i18n: ectx: property (text), widget (QToolButton, infoItemSave) #. i18n: file: app/ui/videolistsstack.ui:257 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList) #. i18n: file: app/ui/videolistsstack.ui:380 #. i18n: ectx: property (text), widget (QPushButton, vslsSave) #. i18n: file: app/ui/videolistsstack.ui:899 #. i18n: ectx: property (text), widget (QPushButton, semVConfigSave) #: rc.cpp:47 rc.cpp:68 rc.cpp:119 rc.cpp:179 rc.cpp:431 rc.cpp:443 rc.cpp:494 msgid "Save" msgstr "保存" #. i18n: file: app/ui/audiolistsstack.ui:354 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList) #. i18n: file: app/ui/audiolistsstack.ui:549 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel) #. i18n: file: app/ui/audiolistsstack.ui:1048 #. i18n: ectx: property (text), widget (QToolButton, aCancelSemConfigure) #. i18n: file: app/ui/videolistsstack.ui:455 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel) #. i18n: file: app/ui/videolistsstack.ui:928 #. i18n: ectx: property (text), widget (QToolButton, vCancelSemConfigure) #: rc.cpp:50 rc.cpp:77 rc.cpp:122 rc.cpp:452 rc.cpp:497 msgid "Return to Lists" msgstr "返回到列表" #. i18n: file: app/ui/audiolistsstack.ui:393 #. i18n: ectx: property (text), widget (QLabel, label_8) #. i18n: file: app/ui/videolistsstack.ui:329 #. i18n: ectx: property (text), widget (QLabel, label_11) #: rc.cpp:53 rc.cpp:437 msgid "Saved List Settings" msgstr "已保存的列表设置" #. i18n: file: app/ui/audiolistsstack.ui:419 #. i18n: ectx: property (text), widget (QLabel, label_9) #. i18n: file: app/ui/videolistsstack.ui:355 #. i18n: ectx: property (text), widget (QLabel, label_10) #: rc.cpp:56 rc.cpp:440 msgid "Name" msgstr "名称" #. i18n: file: app/ui/audiolistsstack.ui:498 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #. i18n: file: app/ui/videolistsstack.ui:404 #. i18n: ectx: property (text), widget (QLabel, exportSavedListLabel) #: rc.cpp:71 rc.cpp:446 msgid "" "You can export this list to a file if you want to use it in other " "applications" msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:520 #. i18n: ectx: property (text), widget (QPushButton, aslsExport) #. i18n: file: app/ui/videolistsstack.ui:426 #. i18n: ectx: property (text), widget (QPushButton, vslsExport) #: rc.cpp:74 rc.cpp:449 msgid "Export to file..." msgstr "" #. i18n: file: app/ui/audiolistsstack.ui:594 #. i18n: ectx: property (text), widget (QLabel, aConfigureSemListTitle) #. i18n: file: app/ui/mainwindow.ui:665 #. i18n: ectx: property (text), widget (QLabel, listTitle) #. i18n: file: app/ui/videolistsstack.ui:500 #. i18n: ectx: property (text), widget (QLabel, vConfigureSemListTitle) #: rc.cpp:80 rc.cpp:152 rc.cpp:455 msgid "List Title" msgstr "列出标题" #. i18n: file: app/ui/audiolistsstack.ui:650 #. i18n: ectx: property (text), widget (QLabel, label_15) #. i18n: file: app/ui/videolistsstack.ui:526 #. i18n: ectx: property (text), widget (QLabel, label_16) #: rc.cpp:83 rc.cpp:458 msgid "Show" msgstr "显示" #. i18n: file: app/ui/audiolistsstack.ui:676 #. i18n: ectx: property (text), widget (QLabel, label_32) #. i18n: file: app/ui/videolistsstack.ui:549 #. i18n: ectx: property (text), widget (QLabel, label_17) #: rc.cpp:86 rc.cpp:461 msgid "items" msgstr "项" #. i18n: file: app/ui/audiolistsstack.ui:732 #. i18n: ectx: property (text), widget (QLabel, semAMoreVerb) #. i18n: file: app/ui/videolistsstack.ui:599 #. i18n: ectx: property (text), widget (QLabel, semVMoreVerb) #: rc.cpp:89 rc.cpp:464 app/medialists/medialistsettings.cpp:94 #: app/medialists/medialistsettings.cpp:106 #: app/medialists/medialistsettings.cpp:123 #: app/medialists/medialistsettings.cpp:135 msgid "played" msgstr "已播放" #. i18n: file: app/ui/audiolistsstack.ui:801 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:668 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:92 rc.cpp:467 msgid "before" msgstr "之前于" #. i18n: file: app/ui/audiolistsstack.ui:806 #. i18n: ectx: property (text), item, widget (QComboBox, semATimeComp) #. i18n: file: app/ui/videolistsstack.ui:673 #. i18n: ectx: property (text), item, widget (QComboBox, semVTimeComp) #: rc.cpp:95 rc.cpp:470 msgid "after" msgstr "之后于" #. i18n: file: app/ui/audiolistsstack.ui:886 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:989 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:766 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:869 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:98 rc.cpp:110 rc.cpp:473 rc.cpp:485 msgid "or more" msgstr "或高于" #. i18n: file: app/ui/audiolistsstack.ui:891 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:994 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:771 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:874 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:101 rc.cpp:113 rc.cpp:476 rc.cpp:488 msgid "exactly" msgstr "等于" #. i18n: file: app/ui/audiolistsstack.ui:896 #. i18n: ectx: property (text), item, widget (QComboBox, semARatingComp) #. i18n: file: app/ui/audiolistsstack.ui:999 #. i18n: ectx: property (text), item, widget (QComboBox, semAFreqComp) #. i18n: file: app/ui/videolistsstack.ui:776 #. i18n: ectx: property (text), item, widget (QComboBox, semVRatingComp) #. i18n: file: app/ui/videolistsstack.ui:879 #. i18n: ectx: property (text), item, widget (QComboBox, semVFreqComp) #: rc.cpp:104 rc.cpp:116 rc.cpp:479 rc.cpp:491 msgid "or less" msgstr "或低于" #. i18n: file: app/ui/audiolistsstack.ui:972 #. i18n: ectx: property (text), widget (QLabel, label_14) #. i18n: file: app/ui/videolistsstack.ui:852 #. i18n: ectx: property (text), widget (QLabel, label_28) #: rc.cpp:107 rc.cpp:482 msgid "times" msgstr "次" #. i18n: file: app/ui/mainwindow.ui:17 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass) #: rc.cpp:125 app/main.cpp:29 app/common/bangarangapplication.cpp:137 #: app/common/bangarangnotifieritem.cpp:11 #: app/nowplaying/nowplayingmanager.cpp:204 #: app/nowplaying/nowplayingmanager.cpp:397 #: app/nowplaying/nowplayingmanager.cpp:528 msgid "Bangarang" msgstr "Bangarang" #. i18n: file: app/ui/mainwindow.ui:156 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: app/ui/mainwindow.ui:6897 #. i18n: ectx: property (text), widget (QToolButton, collectionButton) #: rc.cpp:128 rc.cpp:374 msgid "Media Lists" msgstr "媒体列表" #. i18n: file: app/ui/mainwindow.ui:263 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter) #: rc.cpp:131 app/medialists/medialistsmanager.cpp:369 msgid "Search for audio" msgstr "搜索音频" #. i18n: file: app/ui/mainwindow.ui:306 #. i18n: ectx: property (text), widget (QLabel, audioListLabel) #. i18n: file: app/ui/mainwindow.ui:343 #. i18n: ectx: property (text), widget (QToolButton, audioListSelect) #: rc.cpp:134 rc.cpp:137 msgid "Audio" msgstr "音频" #. i18n: file: app/ui/mainwindow.ui:421 #. i18n: ectx: property (text), widget (QLabel, videoListLabel) #. i18n: file: app/ui/mainwindow.ui:458 #. i18n: ectx: property (text), widget (QToolButton, videoListSelect) #: rc.cpp:140 rc.cpp:143 msgid "Video" msgstr "视频" #. i18n: file: app/ui/mainwindow.ui:554 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying) #: rc.cpp:146 app/nowplaying/nowplayingmanager.cpp:400 #: app/nowplaying/nowplayingmanager.cpp:447 msgid "View Now Playing" msgstr "查看现在播放" #. i18n: file: app/ui/mainwindow.ui:557 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying) #: rc.cpp:149 app/nowplaying/nowplayingmanager.cpp:261 #: app/nowplaying/nowplayingmanager.cpp:264 #: app/nowplaying/nowplayingmanager.cpp:399 #: app/nowplaying/nowplayingmanager.cpp:530 msgid "Now Playing" msgstr "现在播放" #. i18n: file: app/ui/mainwindow.ui:703 #. i18n: ectx: property (text), widget (QLabel, listSummary) #: rc.cpp:155 msgid "Summary" msgstr "摘要" #. i18n: file: app/ui/mainwindow.ui:849 #. i18n: ectx: property (text), widget (QToolButton, closeMediaListFilter) #. i18n: file: app/ui/mainwindow.ui:1292 #. i18n: ectx: property (text), widget (QToolButton, infoFetcherLink) #. i18n: file: app/ui/mainwindow.ui:5502 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistNotification) #. i18n: file: app/ui/mainwindow.ui:5592 #. i18n: ectx: property (text), widget (QToolButton, closePlaylistFilter) #. i18n: file: app/ui/mainwindow.ui:7245 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious) #. i18n: file: app/ui/mainwindow.ui:7277 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause) #. i18n: file: app/ui/mainwindow.ui:7300 #. i18n: ectx: property (text), widget (QToolButton, mediaNext) #: rc.cpp:158 rc.cpp:167 rc.cpp:248 rc.cpp:251 rc.cpp:392 rc.cpp:395 #: rc.cpp:398 msgid "..." msgstr "..." #. i18n: file: app/ui/mainwindow.ui:863 #. i18n: ectx: property (text), widget (QLabel, label_19) #. i18n: file: app/ui/mainwindow.ui:5606 #. i18n: ectx: property (text), widget (QLabel, label_18) #: rc.cpp:161 rc.cpp:254 msgid "Filter" msgstr "过滤器" #. i18n: file: app/ui/mainwindow.ui:1263 #. i18n: ectx: property (text), widget (QLabel, infoFetcherLabel) #: rc.cpp:164 msgid "Additional information may be available from:" msgstr "其它信息可用:" #. i18n: file: app/ui/mainwindow.ui:1314 #. i18n: ectx: property (text), widget (QToolButton, infoFetch) #: rc.cpp:170 msgid "Fetch info and edit changes" msgstr "获取信息并编辑更改" #. i18n: file: app/ui/mainwindow.ui:1336 #. i18n: ectx: property (text), widget (QToolButton, infoAutoFetch) #: rc.cpp:173 msgid "Fetch info and save changes" msgstr "获取信息并保存更改" #. i18n: file: app/ui/mainwindow.ui:1356 #. i18n: ectx: property (text), widget (QLabel, label_27) #: rc.cpp:176 msgid "Matches" msgstr "匹配" #. i18n: file: app/ui/mainwindow.ui:1451 #. i18n: ectx: property (text), widget (QToolButton, infoItemCancelEdit) #: rc.cpp:182 msgid "Cancel Edit" msgstr "取消编辑" #. i18n: file: app/ui/mainwindow.ui:1501 #. i18n: ectx: property (text), widget (QToolButton, infoIndexSelected) #: rc.cpp:185 msgid "Index Selected" msgstr "索引选中项" #. i18n: file: app/ui/mainwindow.ui:1570 #. i18n: ectx: property (text), widget (QLabel, notificationText) #: rc.cpp:188 msgid "Notification Text" msgstr "通知文本" #. i18n: file: app/ui/mainwindow.ui:1653 #. i18n: ectx: property (text), widget (QToolButton, previous) #: rc.cpp:191 msgid "Previous" msgstr "向前" #. i18n: file: app/ui/mainwindow.ui:1697 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll) #: rc.cpp:194 msgid "Play all media in list" msgstr "播放列表中全部媒体" #. i18n: file: app/ui/mainwindow.ui:1703 #. i18n: ectx: property (text), widget (QPushButton, playAll) #: rc.cpp:197 msgid "Play All" msgstr "全部播放" #. i18n: file: app/ui/mainwindow.ui:1729 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected) #: rc.cpp:200 msgid "Play selected media in list" msgstr "播放列表中选中媒体" #. i18n: file: app/ui/mainwindow.ui:1732 #. i18n: ectx: property (text), widget (QPushButton, playSelected) #: rc.cpp:203 msgid "Play Selected" msgstr "播放选中项" #. i18n: file: app/ui/mainwindow.ui:3562 #. i18n: ectx: property (text), widget (QLabel, extSubtitle) #: rc.cpp:206 msgid "ExternalSubtitle" msgstr "外部字幕" #. i18n: file: app/ui/mainwindow.ui:3614 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist_2) #. i18n: file: app/ui/mainwindow.ui:4160 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist) #: rc.cpp:209 rc.cpp:215 app/common/mainwindow.cpp:261 #: app/medialists/savedlistsmanager.cpp:986 #: platform/utilities/mediaitems.cpp:146 msgid "Playlist" msgstr "播放列表" #. i18n: file: app/ui/mainwindow.ui:3681 #. i18n: ectx: property (text), widget (QLabel, playbackMessage) #: rc.cpp:212 msgid "Error message" msgstr "错误消息" #. i18n: file: app/ui/mainwindow.ui:5131 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue) #: rc.cpp:218 app/nowplaying/nowplayingmanager.cpp:233 msgid "Show Upcoming" msgstr "显示即将播放" #. i18n: file: app/ui/mainwindow.ui:5163 #. i18n: ectx: property (text), widget (QLabel, playlistName) #: rc.cpp:221 app/nowplaying/playlistview.cpp:103 msgid "Playlist" msgstr "播放列表" #. i18n: file: app/ui/mainwindow.ui:5189 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist) #: rc.cpp:224 app/nowplaying/nowplayingmanager.cpp:524 msgid "Clear Playlist" msgstr "清除播放列表" #. i18n: file: app/ui/mainwindow.ui:5219 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat) #: rc.cpp:227 app/nowplaying/nowplayingmanager.cpp:412 msgid "Turn on Repeat" msgstr "开启重复" #. i18n: file: app/ui/mainwindow.ui:5222 #. i18n: ectx: property (text), widget (QToolButton, repeat) #. i18n: file: app/ui/mainwindow.ui:5254 #. i18n: ectx: property (text), widget (QToolButton, shuffle) #. i18n: file: app/ui/mainwindow.ui:6944 #. i18n: ectx: property (text), widget (SToolButton, fullScreen) #: rc.cpp:230 rc.cpp:236 rc.cpp:380 msgid "[ ]" msgstr "[ ]" #. i18n: file: app/ui/mainwindow.ui:5251 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle) #: rc.cpp:233 app/nowplaying/nowplayingmanager.cpp:423 msgid "Turn on Shuffle" msgstr "开启乱序" #. i18n: file: app/ui/mainwindow.ui:5463 #. i18n: ectx: property (text), widget (QLabel, playlistNotificationLabel) #: rc.cpp:239 msgid "Notification" msgstr "通知" #. i18n: file: app/ui/mainwindow.ui:5479 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationYes) #: rc.cpp:242 app/common/mainwindow.cpp:118 msgid "Yes" msgstr "是" #. i18n: file: app/ui/mainwindow.ui:5492 #. i18n: ectx: property (text), widget (QPushButton, playlistNotificationNo) #: rc.cpp:245 app/common/mainwindow.cpp:117 msgid "No" msgstr "否" #. i18n: file: app/ui/mainwindow.ui:5645 #. i18n: ectx: property (text), widget (QLabel, label_2) #: rc.cpp:257 msgid "Audio Settings" msgstr "音频设置" #. i18n: file: app/ui/mainwindow.ui:5694 #. i18n: ectx: property (text), widget (QLabel, label_20) #: rc.cpp:260 msgid "Audio Channel:" msgstr "声道:" #. i18n: file: app/ui/mainwindow.ui:5758 #. i18n: ectx: property (title), widget (QGroupBox, eqHolder) #: rc.cpp:263 msgid "Equalizer" msgstr "均衡器" #. i18n: file: app/ui/mainwindow.ui:5776 #. i18n: ectx: property (text), widget (QLabel, label_12) #: rc.cpp:266 msgid "Presets" msgstr "预设" #. i18n: file: app/ui/mainwindow.ui:5839 #. i18n: ectx: property (text), widget (QLabel, eq1Label) #: rc.cpp:269 msgid "Pre" msgstr "预设" #. i18n: file: app/ui/mainwindow.ui:5877 #. i18n: ectx: property (text), widget (QLabel, eq2Label) #: rc.cpp:272 msgid "60" msgstr "60" #. i18n: file: app/ui/mainwindow.ui:5915 #. i18n: ectx: property (text), widget (QLabel, eq3Label) #: rc.cpp:275 msgid "170" msgstr "170" #. i18n: file: app/ui/mainwindow.ui:5953 #. i18n: ectx: property (text), widget (QLabel, eq4Label) #: rc.cpp:278 msgid "310" msgstr "310" #. i18n: file: app/ui/mainwindow.ui:5991 #. i18n: ectx: property (text), widget (QLabel, eq5Label) #: rc.cpp:281 msgid "600" msgstr "600" #. i18n: file: app/ui/mainwindow.ui:6029 #. i18n: ectx: property (text), widget (QLabel, eq6Label) #: rc.cpp:284 msgid "1k" msgstr "1k" #. i18n: file: app/ui/mainwindow.ui:6067 #. i18n: ectx: property (text), widget (QLabel, eq7Label) #: rc.cpp:287 msgid "3k" msgstr "3k" #. i18n: file: app/ui/mainwindow.ui:6105 #. i18n: ectx: property (text), widget (QLabel, eq8Label) #: rc.cpp:290 msgid "6k" msgstr "6k" #. i18n: file: app/ui/mainwindow.ui:6143 #. i18n: ectx: property (text), widget (QLabel, eq9Label) #: rc.cpp:293 msgid "12k" msgstr "12k" #. i18n: file: app/ui/mainwindow.ui:6181 #. i18n: ectx: property (text), widget (QLabel, eq10Label) #: rc.cpp:296 msgid "14k" msgstr "14k" #. i18n: file: app/ui/mainwindow.ui:6219 #. i18n: ectx: property (text), widget (QLabel, eq11Label) #: rc.cpp:299 msgid "16k" msgstr "16k" #. i18n: file: app/ui/mainwindow.ui:6257 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6756 #. i18n: ectx: property (text), widget (QPushButton, restoreDefaultVideoSettings) #: rc.cpp:302 rc.cpp:356 msgid "Restore Defaults" msgstr "还原为默认值" #. i18n: file: app/ui/mainwindow.ui:6264 #. i18n: ectx: property (text), widget (QPushButton, hideAudioSettings) #. i18n: file: app/ui/mainwindow.ui:6763 #. i18n: ectx: property (text), widget (QPushButton, hideVideoSettings) #: rc.cpp:305 rc.cpp:359 msgid "Hide" msgstr "隐藏" #. i18n: file: app/ui/mainwindow.ui:6293 #. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:308 msgid "Video Settings" msgstr "视频设置" #. i18n: file: app/ui/mainwindow.ui:6333 #. i18n: ectx: property (text), widget (QLabel, label_26) #: rc.cpp:311 msgid "Subtitle:" msgstr "字幕:" #. i18n: file: app/ui/mainwindow.ui:6380 #. i18n: ectx: property (text), widget (QLabel, label_25) #: rc.cpp:314 msgid "Angle:" msgstr "角度:" #. i18n: file: app/ui/mainwindow.ui:6405 #. i18n: ectx: property (text), widget (QLabel, subtitleInfoText) #: rc.cpp:317 msgid "Can't detect subtitle encoding, please choose:" msgstr "" #. i18n: file: app/ui/mainwindow.ui:6452 #. i18n: ectx: property (text), widget (QLabel, label_21) #: rc.cpp:320 msgid "Brightness:" msgstr "亮度:" #. i18n: file: app/ui/mainwindow.ui:6499 #. i18n: ectx: property (text), widget (QLabel, label_22) #: rc.cpp:323 msgid "Contrast:" msgstr "对比度:" #. i18n: file: app/ui/mainwindow.ui:6546 #. i18n: ectx: property (text), widget (QLabel, label_23) #: rc.cpp:326 msgid "Hue:" msgstr "色调:" #. i18n: file: app/ui/mainwindow.ui:6593 #. i18n: ectx: property (text), widget (QLabel, label_24) #: rc.cpp:329 msgid "Saturation:" msgstr "饱和度:" #. i18n: file: app/ui/mainwindow.ui:6656 #. i18n: ectx: property (title), widget (QGroupBox, aspectRatioHolder) #: rc.cpp:332 msgid "Aspect Ratio" msgstr "纵横比" #. i18n: file: app/ui/mainwindow.ui:6668 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioAuto) #: rc.cpp:335 msgid "Automatic" msgstr "自动" #. i18n: file: app/ui/mainwindow.ui:6675 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatioWidget) #: rc.cpp:338 msgid "Fit" msgstr "自适应" #. i18n: file: app/ui/mainwindow.ui:6682 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio4_3) #: rc.cpp:341 msgid "4:3" msgstr "4:3" #. i18n: file: app/ui/mainwindow.ui:6689 #. i18n: ectx: property (text), widget (QRadioButton, aspectRatio16_9) #: rc.cpp:344 msgid "16:9" msgstr "16:9" #. i18n: file: app/ui/mainwindow.ui:6699 #. i18n: ectx: property (title), widget (QGroupBox, scalingModeHolder) #: rc.cpp:347 msgid "Scaling" msgstr "缩放" #. i18n: file: app/ui/mainwindow.ui:6711 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeFitInView) #: rc.cpp:350 msgid "Scale to fit" msgstr "缩放以适应" #. i18n: file: app/ui/mainwindow.ui:6718 #. i18n: ectx: property (text), widget (QRadioButton, scaleModeScaleAndCrop) #: rc.cpp:353 msgid "Scale and crop" msgstr "缩放并裁剪" #. i18n: file: app/ui/mainwindow.ui:6795 #. i18n: ectx: property (text), widget (QLabel, label_13) #: rc.cpp:362 msgid "Shortcuts" msgstr "快捷键" #. i18n: file: app/ui/mainwindow.ui:6815 #. i18n: ectx: property (text), widget (QPushButton, saveShortcuts) #: rc.cpp:365 msgid "Save Shortcuts" msgstr "保存快捷键" #. i18n: file: app/ui/mainwindow.ui:6822 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts) #: rc.cpp:368 app/common/actionsmanager.cpp:1037 msgid "Cancel" msgstr "取消" #. i18n: file: app/ui/mainwindow.ui:6894 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton) #: rc.cpp:371 msgid "View Media Lists" msgstr "查看媒体列表" #. i18n: file: app/ui/mainwindow.ui:6941 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen) #: rc.cpp:377 msgid "Show full screen" msgstr "全屏显示" #. i18n: file: app/ui/mainwindow.ui:7049 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime) #: rc.cpp:383 msgid "Time elapsed
Click to show remaining time" msgstr "已用时间
点击显示剩余时间" #. i18n: file: app/ui/mainwindow.ui:7178 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon) #: rc.cpp:386 app/nowplaying/nowplayingmanager.cpp:387 msgid "Mute volume" msgstr "静音" #. i18n: file: app/ui/mainwindow.ui:7219 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider) #: rc.cpp:389 msgid "Volume" msgstr "音量" #. i18n: file: app/ui/videolistsstack.ui:293 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList) #: rc.cpp:434 msgid "Return To Lists" msgstr "返回到列表" #: app/main.cpp:30 msgid "A media player for your KDE desktop" msgstr "KDE 桌面的媒体播放器" #: app/main.cpp:31 msgid "Copyright 2011, Andrew Lake" msgstr "Copyright 2011,Andrew Lake" #: app/main.cpp:32 msgid "" "Note: This product uses the TMDb API but is not endorsed or certified " "by TMDb. Please help improve available information by visiting http://" "themoviedb.org
Note: This product uses the Last.fm API but is not " "endorsed or certified by Last.fm. Please help improve available information " "by visiting http://last.fm
Note: This product uses the TheTVDB.com " "API but is not endorsed or certified by TheTVDB.com. Please help improve " "available information by visiting http://thetvdb.com" msgstr "" #: app/main.cpp:41 msgid "Andrew (Jamboarder) Lake" msgstr "Andrew (Jamboarder) Lake" #: app/main.cpp:41 msgid "Creator" msgstr "缔造者" #: app/main.cpp:42 msgid "Stefan Burnicki" msgstr "Stefan Burnicki" #: app/main.cpp:42 app/main.cpp:43 msgid "Contributor" msgstr "贡献者" #: app/main.cpp:43 msgid "Elias Probst" msgstr "" #: app/main.cpp:45 msgid "" "Defects may be reported at http://code.google.com/p/bangarangissuetracking/" msgstr "缺陷请到 http://code.google.com/p/bangarangissuetracking/ 报告" #: app/main.cpp:45 msgid "" "Defects may be reported at Bangarang Issue Tracker" msgstr "" "缺陷请到 Bangarang 问题跟踪报告" #: app/main.cpp:52 msgid "Play 'URL'" msgstr "播放 URL" #: app/main.cpp:53 msgid "Play DVD Video" msgstr "播放 DVD 视频" #: app/main.cpp:54 msgid "Play CD Music" msgstr "播放 CD 音乐" #: app/main.cpp:55 msgid "Show Additional Debug Output" msgstr "显示额外的调试输出" #: app/main.cpp:56 msgid "Enable touch mode for interface" msgstr "" #: app/common/actionsmanager.cpp:64 msgid "Quit" msgstr "退出" #: app/common/actionsmanager.cpp:70 msgid "Play/Pause" msgstr "播放/暂停" #: app/common/actionsmanager.cpp:77 msgid "Play" msgstr "播放" #: app/common/actionsmanager.cpp:82 msgid "Pause" msgstr "暂停" #: app/common/actionsmanager.cpp:87 msgid "Play next" msgstr "播放下一首" #: app/common/actionsmanager.cpp:93 msgid "Play previous" msgstr "播放上一首" #: app/common/actionsmanager.cpp:99 app/common/actionsmanager.cpp:746 msgid "Mute" msgstr "静音" #: app/common/actionsmanager.cpp:104 msgid "Play all" msgstr "全部播放" #: app/common/actionsmanager.cpp:109 msgid "Play selected" msgstr "播放选中项" #: app/common/actionsmanager.cpp:114 msgid "Add to playlist" msgstr "添加到播放列表" #: app/common/actionsmanager.cpp:119 app/common/actionsmanager.cpp:339 msgid "Add after Now Playing" msgstr "添加于现在播放之后" #: app/common/actionsmanager.cpp:124 app/common/actionsmanager.cpp:129 msgid "Remove from playlist" msgstr "从播放列表删除" #: app/common/actionsmanager.cpp:135 msgid "Hide controls" msgstr "隐藏控件" #: app/common/actionsmanager.cpp:141 app/common/actionsmanager.cpp:1075 #: app/common/actionsmanager.cpp:1080 msgid "Show filter" msgstr "显示过滤器" #: app/common/actionsmanager.cpp:147 app/common/actionsmanager.cpp:956 msgid "Show remaining time" msgstr "显示剩余时间" #: app/common/actionsmanager.cpp:152 app/common/actionsmanager.cpp:623 #: app/common/actionsmanager.cpp:649 app/common/actionsmanager.cpp:702 #: app/common/mainwindow.cpp:300 app/nowplaying/nowplayingmanager.cpp:573 msgid "Show video settings" msgstr "显示视频设置" #: app/common/actionsmanager.cpp:158 app/common/actionsmanager.cpp:626 #: app/common/actionsmanager.cpp:646 app/common/actionsmanager.cpp:703 #: app/common/mainwindow.cpp:301 app/nowplaying/nowplayingmanager.cpp:574 msgid "Show audio settings" msgstr "显示音频设置" #: app/common/actionsmanager.cpp:164 msgid "Fullscreen" msgstr "全屏" #: app/common/actionsmanager.cpp:177 msgid "Save selected info" msgstr "保存选中信息" #: app/common/actionsmanager.cpp:182 msgid "Remove selected info" msgstr "删除选中信息" #: app/common/actionsmanager.cpp:187 msgid "Refresh" msgstr "刷新" #: app/common/actionsmanager.cpp:193 msgid "Select All" msgstr "" #: app/common/actionsmanager.cpp:200 msgid "Remove from list" msgstr "从列表删除" #: app/common/actionsmanager.cpp:205 msgid "Add to \"Audio Streams\"" msgstr "添加到“音频流”" #: app/common/actionsmanager.cpp:210 msgid "Add to list" msgstr "添加到列表" #: app/common/actionsmanager.cpp:214 msgid "Add to list " msgstr "添加到列表 " #: app/common/actionsmanager.cpp:218 app/common/actionsmanager.cpp:223 msgid "New list" msgstr "新建列表" #: app/common/actionsmanager.cpp:228 msgid "Show items" msgstr "显示项目" #: app/common/actionsmanager.cpp:233 app/common/actionsmanager.cpp:437 #: app/common/actionsmanager.cpp:478 app/common/actionsmanager.cpp:907 #: app/common/actionsmanager.cpp:1222 msgid "Show information" msgstr "显示信息" #: app/common/actionsmanager.cpp:238 app/common/actionsmanager.cpp:359 #: app/common/actionsmanager.cpp:1105 msgid "Show Info View" msgstr "显示信息视图" #: app/common/actionsmanager.cpp:245 msgid "Add bookmark" msgstr "添加书签" #: app/common/actionsmanager.cpp:252 msgid "Remove bookmarks" msgstr "删除书签" #: app/common/actionsmanager.cpp:256 app/common/actionsmanager.cpp:627 #: app/common/actionsmanager.cpp:650 app/common/actionsmanager.cpp:699 msgid "Show shortcuts editor" msgstr "显示快捷键编辑器" #: app/common/actionsmanager.cpp:263 msgid "Update ontologies..." msgstr "更新实体..." #: app/common/actionsmanager.cpp:268 msgid "Hide in system tray" msgstr "隐藏于系统托盘" #: app/common/actionsmanager.cpp:278 msgid "Manage info" msgstr "管理信息" #: app/common/actionsmanager.cpp:357 app/common/actionsmanager.cpp:1103 msgid "Hide Info View" msgstr "隐藏信息视图" #: app/common/actionsmanager.cpp:417 msgid "Play after Now Playing" msgstr "播放于现在播放之后" #: app/common/actionsmanager.cpp:440 app/common/actionsmanager.cpp:481 msgid "Hide information" msgstr "隐藏信息" #: app/common/actionsmanager.cpp:530 #, kde-format msgid "Chapter %1" msgstr "章节 %1" #: app/common/actionsmanager.cpp:597 msgid "Show Controls" msgstr "显示控件" #: app/common/actionsmanager.cpp:601 msgid "Hide Controls" msgstr "隐藏控件" #: app/common/actionsmanager.cpp:615 msgid "Hide video settings" msgstr "隐藏视频设置" #: app/common/actionsmanager.cpp:638 msgid "Hide audio settings" msgstr "隐藏音频设置" #: app/common/actionsmanager.cpp:691 msgid "Hide shortcuts editor" msgstr "隐藏快捷键编辑器" #: app/common/actionsmanager.cpp:743 msgid "Restore Volume" msgstr "恢复音量" #: app/common/actionsmanager.cpp:903 msgid "Restore video size" msgstr "恢复视频大小" #: app/common/actionsmanager.cpp:954 msgid "Show elapsed time" msgstr "显示已用时间" #: app/common/actionsmanager.cpp:966 #, kde-format msgid "Bookmark-%1" msgstr "书签-%1" #: app/common/actionsmanager.cpp:1035 app/common/actionsmanager.cpp:1042 msgid "Update Ontologies" msgstr "更新实体" #: app/common/actionsmanager.cpp:1038 msgid "" "Updating ontologies ensures that media information is stored in a way that " "makes it most accessible to other desktop applications. This is only " "necessary if you recently upgraded Bangarang or your KDE software " "compilation.

This may take several minutes." msgstr "" "更新实体可确保媒体信息以一种能够让其它桌面应用程序访问的方式存储。 这只有在您" "最近升级了 Bangarang 或 KDE 软件集合的时候才是需要的。

此操作可能会花" "费好几分钟。" #: app/common/actionsmanager.cpp:1046 msgid "Stop" msgstr "停止" #: app/common/actionsmanager.cpp:1049 msgid "Close" msgstr "关闭" #: app/common/actionsmanager.cpp:1073 app/common/actionsmanager.cpp:1078 msgid "Hide filter" msgstr "隐藏过滤器" #: app/common/actionsmanager.cpp:1148 #, fuzzy msgid "Show Audio Lists" msgstr "显示音频设置" #: app/common/actionsmanager.cpp:1154 #, fuzzy msgid "Show Video Lists" msgstr "显示视频设置" #: app/common/bangarangapplication.cpp:137 msgid "" "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media " "library, rating and play count functions will be unavailable." msgstr "" "Bangarang 无法访问 Nepomuk 语义学桌面仓库。媒体库、评分和播放计数功能将不可" "用。" #: app/common/bangarangapplication.cpp:137 msgid "Don't show this message again" msgstr "不再显示此信息" #: app/common/bangarangapplication.cpp:191 #: app/common/bangarangapplication.cpp:193 msgid "Resume" msgstr "继续" #: app/common/bangarangapplication.cpp:430 #: platform/utilities/mediaitems.cpp:1441 msgid "DVD Video" msgstr "DVD 视频" #: app/common/bangarangapplication.cpp:445 #: platform/listengines/medialistsengine.cpp:202 #: platform/utilities/mediaitems.cpp:1448 msgid "Audio CD" msgstr "音频 CD" #: app/common/mainwindow.cpp:316 msgid "Fullscreen
Click to exit fullscreen" msgstr "全屏
点击退出全屏" #: app/common/mainwindow.cpp:324 msgid "Show fullscreen" msgstr "全屏显示" #: app/common/mediaview.cpp:143 msgid "Add to playlist/Remove from playlist" msgstr "添加到播放列表 / 从播放列表删除" #: app/common/mediaview.cpp:146 msgid "Show Songs" msgstr "显示歌曲" #: app/common/mediaview.cpp:148 msgid "Show Albums" msgstr "显示专辑" #: app/common/mediaview.cpp:150 msgid "Show Artists" msgstr "显示艺人" #: app/medialists/infoitemdelegate.cpp:127 #: app/medialists/infoitemdelegate.cpp:650 msgid "Music" msgstr "音乐" #: app/medialists/infoitemdelegate.cpp:129 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Stream" msgstr "音频流" #: app/medialists/infoitemdelegate.cpp:131 #: app/medialists/infoitemdelegate.cpp:650 msgid "Audio Clip" msgstr "音频剪辑" #: app/medialists/infoitemdelegate.cpp:136 #: app/medialists/infoitemdelegate.cpp:661 msgid "Movie" msgstr "影片" #: app/medialists/infoitemdelegate.cpp:138 #: app/medialists/infoitemdelegate.cpp:661 msgid "TV Show" msgstr "电视节目" #: app/medialists/infoitemdelegate.cpp:140 #: app/medialists/infoitemdelegate.cpp:661 msgid "Video Clip" msgstr "视频剪辑" #: app/medialists/infoitemdelegate.cpp:154 msgid "No description" msgstr "无描述" #: app/medialists/infoitemdelegate.cpp:163 msgid "Multiple Values" msgstr "多个值" #: app/medialists/infoitemdelegate.cpp:466 msgid "Open artwork file" msgstr "打开封面艺照文件" #: app/medialists/infoitemdelegate.cpp:700 msgid "Press to finish editing." msgstr "按下 完成编辑。" #: app/medialists/infomanager.cpp:296 msgid "Click to hide" msgstr "点击以隐藏" #: app/medialists/infomanager.cpp:298 msgid "Additional information may be available.
Click to show more..." msgstr "其它信息可用。
点击以显示更多..." #: app/medialists/medialistsettings.cpp:100 #: app/medialists/medialistsettings.cpp:129 msgid "rated" msgstr "已评分" #: app/medialists/medialistsmanager.cpp:385 msgid "Search for video" msgstr "搜索视频" #: app/medialists/medialistsmanager.cpp:402 msgid "Audio Search" msgstr "音频搜索" #: app/medialists/medialistsmanager.cpp:409 msgid "Video Search" msgstr "视频搜索" #: app/medialists/medialistsmanager.cpp:497 platform/infoitemmodel.cpp:550 msgid "Complete" msgstr "完成" #: app/medialists/savedlistsmanager.cpp:47 #: app/medialists/savedlistsmanager.cpp:51 msgid "" "Enter full server path.
For example,
- ownCloud, enter \"http://" "[host]/owncloud/apps/media\"
- Ampache, enter \"http://[host]/ampache\"" msgstr "" #: app/medialists/savedlistsmanager.cpp:106 #: app/medialists/savedlistsmanager.cpp:122 #: platform/listengines/audiostreamlistengine.cpp:101 #: platform/listengines/feedlistengine.cpp:175 msgid "Untitled" msgstr "无标题" #: app/medialists/savedlistsmanager.cpp:207 #: app/medialists/savedlistsmanager.cpp:251 msgid "Remove" msgstr "删除" #: app/medialists/savedlistsmanager.cpp:209 #: app/medialists/savedlistsmanager.cpp:253 #, kde-format msgid "Are you sure you want to remove \"%1\"?" msgstr "您确定要删除“%1”吗?" #: app/medialists/savedlistsmanager.cpp:930 #: app/medialists/savedlistsmanager.cpp:943 msgid "*.m3u|M3U files (*.m3u)" msgstr "" #: app/medialists/savedlistsmanager.cpp:935 #, kde-format msgid "" "

The file %1 already exists.

Do you want to " "overwrite it?

" msgstr "" #: app/nowplaying/audiosettings.cpp:88 msgid "No effect" msgstr "无效果" #: app/nowplaying/audiosettings.cpp:92 msgid "Rock" msgstr "摇滚" #: app/nowplaying/audiosettings.cpp:96 msgid "Reggae" msgstr "" #: app/nowplaying/audiosettings.cpp:100 msgid "Dance" msgstr "舞曲" #: app/nowplaying/audiosettings.cpp:104 msgid "Live" msgstr "现场" #: app/nowplaying/audiosettings.cpp:108 msgid "Classical" msgstr "古典" #: app/nowplaying/audiosettings.cpp:112 msgid "Blockbuster" msgstr "轰动" #: app/nowplaying/audiosettings.cpp:116 msgid "Documentary" msgstr "纪实" #: app/nowplaying/audiosettings.cpp:120 msgid "Drama" msgstr "戏剧" #: app/nowplaying/audiosettings.cpp:124 app/nowplaying/audiosettings.cpp:149 #: app/nowplaying/audiosettings.cpp:166 app/nowplaying/audiosettings.cpp:185 #: app/nowplaying/audiosettings.cpp:214 msgid "Manual" msgstr "自定义" #: app/nowplaying/nowplayingdelegate.cpp:302 msgid "Artist: " msgstr "艺人:" #: app/nowplaying/nowplayingdelegate.cpp:314 msgid "Composer: " msgstr "作曲:" #: app/nowplaying/nowplayingdelegate.cpp:326 msgid "Album: " msgstr "专辑:" #: app/nowplaying/nowplayingdelegate.cpp:338 msgid "Track: " msgstr "音轨:" #: app/nowplaying/nowplayingdelegate.cpp:350 #: app/nowplaying/nowplayingdelegate.cpp:393 msgid "Year: " msgstr "年份:" #: app/nowplaying/nowplayingdelegate.cpp:362 #: app/nowplaying/nowplayingdelegate.cpp:453 msgid "Genre: " msgstr "流派:" #: app/nowplaying/nowplayingdelegate.cpp:374 #: app/nowplaying/nowplayingdelegate.cpp:465 #, fuzzy msgid "Tags: " msgstr "标签" #: app/nowplaying/nowplayingdelegate.cpp:405 msgid "Actor: " msgstr "演员:" #: app/nowplaying/nowplayingdelegate.cpp:417 msgid "Director: " msgstr "导演:" #: app/nowplaying/nowplayingdelegate.cpp:429 msgid "Writer: " msgstr "编剧:" #: app/nowplaying/nowplayingdelegate.cpp:441 msgid "Producer: " msgstr "制片人:" #: app/nowplaying/nowplayingmanager.cpp:110 msgid "Time remaining
Click to show elapsed time and bookmarks" msgstr "剩余时间
点击显示已用时间和书签" #: app/nowplaying/nowplayingmanager.cpp:112 msgid "Time elapsed
Click to show remaining time and bookmarks" msgstr "已用时间
点击显示剩余时间和书签" #: app/nowplaying/nowplayingmanager.cpp:150 msgid "Paused
Hold to stop" msgstr "已暂停
按住以停止" #: app/nowplaying/nowplayingmanager.cpp:205 msgid "Entertainment... Now" msgstr "影音之乐... 享受吧" #: app/nowplaying/nowplayingmanager.cpp:230 msgid "Showing Upcoming
Click to show playlist" msgstr "显示即将播放
点击显示播放列表" #: app/nowplaying/nowplayingmanager.cpp:291 msgid "Playing
Click to pause
Click and hold to stop" msgstr "播放中
点击以暂停
点击并按住以停止" #: app/nowplaying/nowplayingmanager.cpp:301 msgid "An error has been encountered during playback" msgstr "播放时遇到错误" #: app/nowplaying/nowplayingmanager.cpp:354 msgid "Loading playlist..." msgstr "正在装入播放列表..." #: app/nowplaying/nowplayingmanager.cpp:356 msgid "Buffering..." msgstr "正在缓冲..." #: app/nowplaying/nowplayingmanager.cpp:358 platform/mediaitemmodel.cpp:677 msgid "Loading..." msgstr "正在装入..." #: app/nowplaying/nowplayingmanager.cpp:383 msgid "Muted
Click to restore volume" msgstr "已静音
点击还原音量" #: app/nowplaying/nowplayingmanager.cpp:409 msgid "Repeat On
Click to turn off repeat" msgstr "重复开启
点击关闭重复" #: app/nowplaying/nowplayingmanager.cpp:420 msgid "Shuffle On
Click to turn off Shuffle" msgstr "乱序开启
点击关闭乱序" #: app/nowplaying/nowplayingmanager.cpp:525 msgid "Are you sure you want to clear the current playlist?" msgstr "您确定要清除当前播放列表吗?" #: app/nowplaying/playlistview.cpp:107 #, kde-format msgid "1 item, %2" msgid_plural "%1 items, %2" msgstr[0] "%1 项,%2" #: app/nowplaying/playlistview.cpp:109 platform/mediaitemmodel.cpp:458 #: platform/mediaitemmodel.cpp:478 #: platform/listengines/ampachelistengine.cpp:96 #: platform/listengines/ampachelistengine.cpp:169 #: platform/listengines/feedlistengine.cpp:325 #: platform/listengines/filelistengine.cpp:116 #: platform/listengines/filelistengine.cpp:141 #: platform/listengines/filelistengine.cpp:236 #: platform/listengines/savedlistsengine.cpp:170 #: platform/listengines/taglistengine.cpp:148 #: platform/listengines/videolistengine.cpp:755 #: platform/listengines/videolistengine.cpp:834 #, kde-format msgid "1 item" msgid_plural "%1 items" msgstr[0] "%1 项" #: app/nowplaying/playlistview.cpp:115 msgid "Playlist (Upcoming)" msgstr "播放列表 (即将播放)" #: app/nowplaying/videosettings.cpp:246 app/nowplaying/videosettings.cpp:265 msgid "Disable" msgstr "禁用" #: platform/infoitemmodel.cpp:79 platform/infoitemmodel.cpp:90 msgid "Type" msgstr "类型" #: platform/infoitemmodel.cpp:80 msgid "Artwork" msgstr "艺照" #: platform/infoitemmodel.cpp:81 msgid "Title" msgstr "标题" #: platform/infoitemmodel.cpp:82 msgid "Artist" msgstr "艺人" #: platform/infoitemmodel.cpp:83 msgid "Composer" msgstr "作曲" #: platform/infoitemmodel.cpp:84 msgid "Album" msgstr "专辑" #: platform/infoitemmodel.cpp:85 msgid "Track" msgstr "音轨" #: platform/infoitemmodel.cpp:86 msgid "Year" msgstr "年份" #: platform/infoitemmodel.cpp:87 msgid "Genre" msgstr "流派" #: platform/infoitemmodel.cpp:88 platform/listengines/medialistsengine.cpp:172 #: platform/listengines/medialistsengine.cpp:363 #: platform/listengines/taglistengine.cpp:115 msgid "Tags" msgstr "标签" #: platform/infoitemmodel.cpp:89 platform/infoitemmodel.cpp:602 msgid "Location" msgstr "位置" #: platform/infoitemmodel.cpp:91 msgid "Actor" msgstr "演员" #: platform/infoitemmodel.cpp:92 msgid "Director" msgstr "导演" #: platform/infoitemmodel.cpp:93 msgid "Writer" msgstr "编剧" #: platform/infoitemmodel.cpp:94 msgid "Producer" msgstr "制片人" #: platform/infoitemmodel.cpp:95 msgid "Series" msgstr "剧集" #: platform/infoitemmodel.cpp:96 msgid "Season" msgstr "上演期" #: platform/infoitemmodel.cpp:97 msgid "Episode" msgstr "片段" #: platform/infoitemmodel.cpp:98 msgid "Links" msgstr "链接" #: platform/infoitemmodel.cpp:99 msgid "Play Count" msgstr "播放次数" #: platform/infoitemmodel.cpp:100 msgid "Last Played" msgstr "最近播放" #: platform/infoitemmodel.cpp:368 platform/infoitemmodel.cpp:379 #, kde-format msgid "Fetching info for %1 item..." msgid_plural "Fetching info for %1 items..." msgstr[0] "正在获取 %1 项的信息..." #: platform/infoitemmodel.cpp:539 #, kde-format msgid "Fetched info for %2 of 1 item..." msgid_plural "Fetched info for %2 of %1 items..." msgstr[0] "正在获取 %1 项中第 %2 项的信息..." #: platform/infoitemmodel.cpp:563 msgid "No Results" msgstr "无结果" #: platform/infoitemmodel.cpp:1154 #: platform/listengines/musiclistengine.cpp:127 #: platform/listengines/musiclistengine.cpp:163 #: platform/listengines/musiclistengine.cpp:232 #: platform/listengines/musiclistengine.cpp:262 #: platform/listengines/musiclistengine.cpp:327 #: platform/utilities/mediaitems.cpp:784 platform/utilities/mediaitems.cpp:797 #: platform/utilities/mediaitems.cpp:900 platform/utilities/mediaitems.cpp:919 #: platform/utilities/mediaitems.cpp:937 msgid "Recently Played Songs" msgstr "最近播放的歌曲" #: platform/infoitemmodel.cpp:1155 #: platform/listengines/musiclistengine.cpp:128 #: platform/listengines/musiclistengine.cpp:164 #: platform/listengines/musiclistengine.cpp:233 #: platform/listengines/musiclistengine.cpp:263 #: platform/listengines/musiclistengine.cpp:328 #: platform/utilities/mediaitems.cpp:785 platform/utilities/mediaitems.cpp:798 #: platform/utilities/mediaitems.cpp:901 platform/utilities/mediaitems.cpp:920 #: platform/utilities/mediaitems.cpp:938 msgid "Highest Rated Songs" msgstr "评分较高的歌曲" #: platform/infoitemmodel.cpp:1156 #: platform/listengines/musiclistengine.cpp:129 #: platform/listengines/musiclistengine.cpp:165 #: platform/listengines/musiclistengine.cpp:234 #: platform/listengines/musiclistengine.cpp:264 #: platform/listengines/musiclistengine.cpp:329 #: platform/utilities/mediaitems.cpp:786 platform/utilities/mediaitems.cpp:799 #: platform/utilities/mediaitems.cpp:902 platform/utilities/mediaitems.cpp:921 #: platform/utilities/mediaitems.cpp:939 msgid "Frequently Played Songs" msgstr "最常播放的歌曲" #: platform/infoitemmodel.cpp:1158 platform/infoitemmodel.cpp:1170 #: platform/infoitemmodel.cpp:1174 #: platform/listengines/medialistsengine.cpp:64 #: platform/listengines/medialistsengine.cpp:107 #: platform/listengines/medialistsengine.cpp:117 #: platform/listengines/medialistsengine.cpp:127 #: platform/listengines/medialistsengine.cpp:138 #: platform/listengines/medialistsengine.cpp:149 #: platform/listengines/medialistsengine.cpp:160 #: platform/listengines/medialistsengine.cpp:178 #: platform/listengines/medialistsengine.cpp:258 #: platform/listengines/semanticslistengine.cpp:282 #: platform/listengines/taglistengine.cpp:109 #: platform/listengines/videolistengine.cpp:241 #: platform/listengines/videolistengine.cpp:352 #: platform/listengines/videolistengine.cpp:515 #: platform/listengines/videolistengine.cpp:576 #: platform/listengines/videolistengine.cpp:645 #: platform/utilities/mediaitems.cpp:816 platform/utilities/mediaitems.cpp:834 #: platform/utilities/mediaitems.cpp:852 platform/utilities/mediaitems.cpp:949 #: platform/utilities/mediaitems.cpp:967 platform/utilities/mediaitems.cpp:986 #: platform/utilities/mediaitems.cpp:995 #: platform/utilities/mediaitems.cpp:1004 #: platform/utilities/mediaitems.cpp:1013 #: platform/utilities/mediaitems.cpp:1025 msgid "Recently Played" msgstr "最近播放" #: platform/infoitemmodel.cpp:1159 platform/infoitemmodel.cpp:1171 #: platform/infoitemmodel.cpp:1175 #: platform/listengines/medialistsengine.cpp:74 #: platform/listengines/medialistsengine.cpp:108 #: platform/listengines/medialistsengine.cpp:118 #: platform/listengines/medialistsengine.cpp:128 #: platform/listengines/medialistsengine.cpp:139 #: platform/listengines/medialistsengine.cpp:150 #: platform/listengines/medialistsengine.cpp:161 #: platform/listengines/medialistsengine.cpp:179 #: platform/listengines/medialistsengine.cpp:268 #: platform/listengines/medialistsengine.cpp:302 #: platform/listengines/medialistsengine.cpp:312 #: platform/listengines/medialistsengine.cpp:322 #: platform/listengines/medialistsengine.cpp:332 #: platform/listengines/medialistsengine.cpp:342 #: platform/listengines/medialistsengine.cpp:352 #: platform/listengines/medialistsengine.cpp:369 #: platform/listengines/semanticslistengine.cpp:363 #: platform/listengines/taglistengine.cpp:110 #: platform/listengines/videolistengine.cpp:242 #: platform/listengines/videolistengine.cpp:353 #: platform/listengines/videolistengine.cpp:516 #: platform/listengines/videolistengine.cpp:577 #: platform/listengines/videolistengine.cpp:646 #: platform/utilities/mediaitems.cpp:817 platform/utilities/mediaitems.cpp:835 #: platform/utilities/mediaitems.cpp:853 platform/utilities/mediaitems.cpp:950 #: platform/utilities/mediaitems.cpp:968 platform/utilities/mediaitems.cpp:987 #: platform/utilities/mediaitems.cpp:996 #: platform/utilities/mediaitems.cpp:1005 #: platform/utilities/mediaitems.cpp:1014 #: platform/utilities/mediaitems.cpp:1026 msgid "Highest Rated" msgstr "评分较高" #: platform/infoitemmodel.cpp:1160 platform/infoitemmodel.cpp:1172 #: platform/infoitemmodel.cpp:1176 #: platform/listengines/medialistsengine.cpp:84 #: platform/listengines/medialistsengine.cpp:109 #: platform/listengines/medialistsengine.cpp:119 #: platform/listengines/medialistsengine.cpp:129 #: platform/listengines/medialistsengine.cpp:140 #: platform/listengines/medialistsengine.cpp:151 #: platform/listengines/medialistsengine.cpp:162 #: platform/listengines/medialistsengine.cpp:180 #: platform/listengines/medialistsengine.cpp:278 #: platform/listengines/semanticslistengine.cpp:215 #: platform/listengines/taglistengine.cpp:111 #: platform/listengines/videolistengine.cpp:243 #: platform/listengines/videolistengine.cpp:354 #: platform/listengines/videolistengine.cpp:517 #: platform/listengines/videolistengine.cpp:578 #: platform/listengines/videolistengine.cpp:647 #: platform/utilities/mediaitems.cpp:818 platform/utilities/mediaitems.cpp:836 #: platform/utilities/mediaitems.cpp:854 platform/utilities/mediaitems.cpp:951 #: platform/utilities/mediaitems.cpp:969 platform/utilities/mediaitems.cpp:988 #: platform/utilities/mediaitems.cpp:997 #: platform/utilities/mediaitems.cpp:1006 #: platform/utilities/mediaitems.cpp:1015 #: platform/utilities/mediaitems.cpp:1027 msgid "Frequently Played" msgstr "最常播放" #: platform/infoitemmodel.cpp:1191 msgid "Fetch Canceled" msgstr "获取已取消" #: platform/mediaindexer.cpp:87 platform/mediaindexer.cpp:122 msgid "Starting update..." msgstr "开始更新..." #: platform/mediaindexer.cpp:288 #, kde-format msgid "Updated: %1 - %2" msgstr "已更新:%1 - %2" #: platform/mediaindexer.cpp:293 msgid "Removing info..." msgstr "正在删除信息..." #: platform/mediaitemmodel.cpp:455 platform/mediaitemmodel.cpp:475 msgid "Multiple" msgstr "多个" #: platform/mediaitemmodel.cpp:456 platform/mediaitemmodel.cpp:476 #, kde-format msgid "Multiple %1" msgstr "多个 %1" #: platform/mediaitemmodel.cpp:709 msgid "No results" msgstr "无结果" #: platform/ontologyupdater.cpp:87 platform/ontologyupdater.cpp:200 #: platform/ontologyupdater.cpp:371 platform/ontologyupdater.cpp:399 msgid "Updating audio types and properties
0 items updated..." msgstr "正在更新音频类型和属性
已更新 0 项..." #: platform/ontologyupdater.cpp:174 #, kde-format msgid "Updating audio types and properties
%1 audio items done..." msgstr "正在更新音频类型和属性
已更新 %1 个音频..." #: platform/ontologyupdater.cpp:355 #, kde-format msgid "Updating video types and properties
%1 video items done..." msgstr "正在更新视频类型和属性
已更新 %1 个视频..." #: platform/ontologyupdater.cpp:385 #, fuzzy, kde-format msgid "Cleaning up erroneous audio properties
%1 audio items done..." msgstr "正在更新音频类型和属性
已更新 %1 个音频..." #: platform/ontologyupdater.cpp:413 #, fuzzy, kde-format msgid "Cleaning up erroneous video properties
%1 video items done..." msgstr "正在更新视频类型和属性
已更新 %1 个视频..." #: platform/ontologyupdater.cpp:418 msgid "Update complete." msgstr "更新完成。" #: platform/ontologyupdater.cpp:420 msgid "Update stopped." msgstr "更新停止。" #: platform/playlist.cpp:671 #, fuzzy msgid "Video Playback" msgstr "视频搜索" #: platform/infofetchers/dbpediainfofetcher.cpp:35 msgid "DBPedia" msgstr "DBPedia" #: platform/infofetchers/dbpediainfofetcher.cpp:38 msgid "This fetcher gets information from DBPedia.org." msgstr "此获取器从 DBPedia.org 获得信息。" #: platform/infofetchers/doubaninfofetcher.cpp:34 msgid "Douban" msgstr "" #: platform/infofetchers/doubaninfofetcher.cpp:37 #, fuzzy msgid "" "Note: This fetcher uses the Douban API but is not endorsed or certified by " "Douban." msgstr "注意:此获取器使用 TMDb API,但尚未由 TMDb 认证。" #: platform/infofetchers/feedinfofetcher.cpp:35 msgid "Feed Info" msgstr "提供信息" #: platform/infofetchers/feedinfofetcher.cpp:37 msgid "This fetcher gets information for the feed at the specified location." msgstr "此获取器从指定位置获得提供信息。" #: platform/infofetchers/filenameinfofetcher.cpp:31 msgid "Filename Info" msgstr "文件名信息" #: platform/infofetchers/filenameinfofetcher.cpp:33 msgid "" "This fetcher uses guesses the season and episode number based on a filename " "pattern. E.g. 2x23 or S02E23 or 2.23" msgstr "此获取器从文件名模式中猜测上演期和片断号码,例如 2x23、S02E23 或 2.23" #: platform/infofetchers/lastfminfofetcher.cpp:38 msgid "Last.fm" msgstr "Last.fm" #: platform/infofetchers/lastfminfofetcher.cpp:41 msgid "" "Note: This fetcher uses the Last.fm API but is not endorsed or certified by " "Last.fm." msgstr "注意:此获取器使用 Last.fm API,但尚未由 Last.fm 认证。" #: platform/infofetchers/tmdbinfofetcher.cpp:36 msgid "TMDb" msgstr "TMDb" #: platform/infofetchers/tmdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses the TMDb API but is not endorsed or certified by " "TMDb." msgstr "注意:此获取器使用 TMDb API,但尚未由 TMDb 认证。" #: platform/infofetchers/tvdbinfofetcher.cpp:36 msgid "TVDB" msgstr "TVDB" #: platform/infofetchers/tvdbinfofetcher.cpp:39 msgid "" "Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com " "information by clicking the link." msgstr "" "注意:此获取器使用 theTVDB.com API。请点击链接以帮助改善 theTVDB.com 信息。" #: platform/listengines/ampachelistengine.cpp:137 #: platform/listengines/medialistsengine.cpp:69 #: platform/listengines/medialistsengine.cpp:79 #: platform/listengines/medialistsengine.cpp:89 #: platform/listengines/medialistsengine.cpp:102 #: platform/listengines/musiclistengine.cpp:145 msgid "Artists" msgstr "艺人" #: platform/listengines/ampachelistengine.cpp:145 #: platform/listengines/medialistsengine.cpp:70 #: platform/listengines/medialistsengine.cpp:80 #: platform/listengines/medialistsengine.cpp:90 #: platform/listengines/medialistsengine.cpp:112 #: platform/listengines/musiclistengine.cpp:250 msgid "Albums" msgstr "专辑" #: platform/listengines/ampachelistengine.cpp:153 #: platform/listengines/medialistsengine.cpp:71 #: platform/listengines/medialistsengine.cpp:81 #: platform/listengines/medialistsengine.cpp:91 #: platform/listengines/medialistsengine.cpp:122 #: platform/listengines/medialistsengine.cpp:263 #: platform/listengines/medialistsengine.cpp:273 #: platform/listengines/medialistsengine.cpp:283 #: platform/listengines/medialistsengine.cpp:316 #: platform/listengines/musiclistengine.cpp:337 #: platform/listengines/videolistengine.cpp:523 msgid "Genres" msgstr "流派" #: platform/listengines/ampachelistengine.cpp:161 #, fuzzy msgid "Playlists" msgstr "播放列表" #: platform/listengines/ampachelistengine.cpp:194 #: platform/listengines/musiclistengine.cpp:169 #, kde-format msgid "1 artist" msgid_plural "%1 artists" msgstr[0] "%1 位艺人" #: platform/listengines/ampachelistengine.cpp:224 #: platform/listengines/musiclistengine.cpp:279 #, kde-format msgid "1 album" msgid_plural "%1 albums" msgstr[0] "%1 张专辑" #: platform/listengines/ampachelistengine.cpp:249 #: platform/listengines/musiclistengine.cpp:338 #: platform/listengines/videolistengine.cpp:524 #, kde-format msgid "1 genre" msgid_plural "%1 genres" msgstr[0] "%1 个流派" #: platform/listengines/ampachelistengine.cpp:274 #, fuzzy, kde-format msgid "1 playlist" msgid_plural "%1 playlists" msgstr[0] "播放列表" #: platform/listengines/ampachelistengine.cpp:317 #: platform/listengines/musiclistengine.cpp:455 #: platform/listengines/musiclistengine.cpp:529 #, kde-format msgid "1 song" msgid_plural "%1 songs" msgstr[0] "%1 首曲目" #: platform/listengines/audioclipslistengine.cpp:97 #: platform/listengines/audioclipslistengine.cpp:142 #: platform/listengines/videolistengine.cpp:188 #, kde-format msgid "1 clip" msgid_plural "%1 clips" msgstr[0] "%1 个剪辑" #: platform/listengines/audiostreamlistengine.cpp:93 #: platform/listengines/audiostreamlistengine.cpp:145 #, kde-format msgid "1 stream" msgid_plural "%1 streams" msgstr[0] "%1 个媒体流" #: platform/listengines/audiostreamlistengine.cpp:98 msgid "New Audio Stream" msgstr "新建音频流" #: platform/listengines/audiostreamlistengine.cpp:99 msgid "Edit info to create new audio stream" msgstr "编辑信息以创建新音频流" #: platform/listengines/cdlistengine.cpp:88 #, kde-format msgctxt "%1=Total number of tracks on the CD" msgid "Audio CD - %1 Tracks" msgstr "音频 CD - %1 条音轨" #: platform/listengines/cdlistengine.cpp:92 #, kde-format msgid "1 track" msgid_plural "%1 tracks" msgstr[0] "%1 条音轨" #: platform/listengines/dvdlistengine.cpp:91 #, kde-format msgctxt "%1=Total number of tracks on the DVD" msgid "DVD Video - %1 Titles" msgstr "DVD 视频 - %1 个标题" #: platform/listengines/dvdlistengine.cpp:97 #, fuzzy, kde-format msgid "1 title" msgid_plural "%1 titles" msgstr[0] "无标题" #: platform/listengines/feedlistengine.cpp:111 msgid "New audio feed" msgstr "新建音频订阅" #: platform/listengines/feedlistengine.cpp:112 msgid "Edit info to create new audio feed" msgstr "编辑信息以创建新音频订阅" #: platform/listengines/feedlistengine.cpp:122 #: platform/listengines/feedlistengine.cpp:184 #, kde-format msgid "1 feed" msgid_plural "%1 feeds" msgstr[0] "%1 个订阅" #: platform/listengines/feedlistengine.cpp:173 msgid "New video feed" msgstr "新建视频订阅" #: platform/listengines/feedlistengine.cpp:174 msgid "Edit info to create new video feed" msgstr "编辑信息以创建新视频订阅" #: platform/listengines/filelistengine.cpp:70 msgid "Collecting file info..." msgstr "正在收集文件信息..." #: platform/listengines/filelistengine.cpp:340 #, kde-format msgid "Collecting file info (%1 files)..." msgstr "正在收集文件信息(%1 个文件)..." #: platform/listengines/medialistsengine.cpp:94 #: platform/listengines/medialistsengine.cpp:288 #: platform/listengines/semanticslistengine.cpp:408 #, fuzzy msgid "Recently Added" msgstr "最近播放" #: platform/listengines/medialistsengine.cpp:132 #: platform/listengines/musiclistengine.cpp:360 msgid "Songs" msgstr "曲目" #: platform/listengines/medialistsengine.cpp:143 msgid "Clips" msgstr "剪辑" #: platform/listengines/medialistsengine.cpp:154 msgid "Audio Streams" msgstr "音频流" #: platform/listengines/medialistsengine.cpp:165 msgid "Audio Feeds" msgstr "音频订阅" #: platform/listengines/medialistsengine.cpp:185 #: platform/listengines/medialistsengine.cpp:375 msgid "Files and Folders" msgstr "文件和文件夹" #: platform/listengines/medialistsengine.cpp:264 #: platform/listengines/medialistsengine.cpp:274 #: platform/listengines/medialistsengine.cpp:284 #: platform/listengines/medialistsengine.cpp:326 #: platform/listengines/videolistengine.cpp:592 msgid "Actors" msgstr "演员" #: platform/listengines/medialistsengine.cpp:265 #: platform/listengines/medialistsengine.cpp:275 #: platform/listengines/medialistsengine.cpp:285 #: platform/listengines/medialistsengine.cpp:336 #: platform/listengines/videolistengine.cpp:661 msgid "Directors" msgstr "导演" #: platform/listengines/medialistsengine.cpp:296 #: platform/listengines/videolistengine.cpp:139 msgid "Movies" msgstr "影片" #: platform/listengines/medialistsengine.cpp:301 #: platform/listengines/medialistsengine.cpp:311 #: platform/listengines/medialistsengine.cpp:321 #: platform/listengines/medialistsengine.cpp:331 #: platform/listengines/medialistsengine.cpp:341 #: platform/listengines/medialistsengine.cpp:351 #: platform/listengines/medialistsengine.cpp:368 msgid "Recently Watched" msgstr "最近观看" #: platform/listengines/medialistsengine.cpp:303 #: platform/listengines/medialistsengine.cpp:313 #: platform/listengines/medialistsengine.cpp:323 #: platform/listengines/medialistsengine.cpp:333 #: platform/listengines/medialistsengine.cpp:343 #: platform/listengines/medialistsengine.cpp:353 #: platform/listengines/medialistsengine.cpp:370 msgid "Frequently Watched" msgstr "最常观看" #: platform/listengines/medialistsengine.cpp:306 #: platform/listengines/videolistengine.cpp:287 msgid "TV Shows" msgstr "电视节目" #: platform/listengines/medialistsengine.cpp:346 #: platform/listengines/videolistengine.cpp:187 msgid "Video Clips" msgstr "视频剪辑" #: platform/listengines/medialistsengine.cpp:356 msgid "Video Feeds" msgstr "视频订阅" #: platform/listengines/musiclistengine.cpp:149 #, kde-format msgctxt "%1=Name of Genre" msgid "Artists - %1" msgstr "艺人 - %1" #: platform/listengines/musiclistengine.cpp:154 #: platform/listengines/musiclistengine.cpp:257 msgid "All songs" msgstr "全部歌曲" #: platform/listengines/musiclistengine.cpp:252 #: platform/listengines/musiclistengine.cpp:271 #, kde-format msgid "Albums - %1" msgstr "专辑 - %1" #: platform/listengines/musiclistengine.cpp:276 #, kde-format msgid "Albums - %1 - %2" msgstr "专辑 - %1 - %2" #: platform/listengines/semanticslistengine.cpp:197 #: platform/listengines/semanticslistengine.cpp:201 #: platform/listengines/semanticslistengine.cpp:464 #, kde-format msgid "played once" msgid_plural "played %1 times" msgstr[0] "已播放 %1 次" #: platform/listengines/semanticslistengine.cpp:403 #, kde-format msgctxt "for example, added 3 days ago" msgid "added %1" msgstr "" #: platform/listengines/taglistengine.cpp:116 #, kde-format msgid "1 tag" msgid_plural "%1 tags" msgstr[0] "%1 个标签" #: platform/listengines/videolistengine.cpp:141 #, kde-format msgctxt "%1=Genre of the movie" msgid "Movies - %1" msgstr "影片 - %1" #: platform/listengines/videolistengine.cpp:143 #, kde-format msgid "1 movie" msgid_plural "%1 movies" msgstr[0] "%1 部影片" #: platform/listengines/videolistengine.cpp:276 #: platform/listengines/videolistengine.cpp:277 #: platform/listengines/videolistengine.cpp:471 msgid "Uncategorized TV Shows" msgstr "未分类的电视节目" #: platform/listengines/videolistengine.cpp:288 #, kde-format msgid "1 show" msgid_plural "%1 shows" msgstr[0] "%1 个节目" #: platform/listengines/videolistengine.cpp:381 msgid "Uncategorized seasons" msgstr "未分类的上演期" #: platform/listengines/videolistengine.cpp:390 #, kde-format msgctxt "%1=Name of the Series" msgid "Seasons - %1" msgstr "上演期 - %1" #: platform/listengines/videolistengine.cpp:391 #, kde-format msgid "1 season" msgid_plural "%1 seasons" msgstr[0] "%1 个上演期" #: platform/listengines/videolistengine.cpp:473 #, kde-format msgctxt "%1=Name of the series, %2=Number of the Season" msgid "%1 - Season %2" msgstr "%1 - 上演期 %2" #: platform/listengines/videolistengine.cpp:475 #, kde-format msgctxt "%1=Name of the Series" msgid "%1 - Uncategorized Seasons" msgstr "%1 - 未分类的上演期" #: platform/listengines/videolistengine.cpp:477 #, kde-format msgid "1 episode" msgid_plural "%1 episodes" msgstr[0] "%1 个片段" #: platform/listengines/videolistengine.cpp:593 #, kde-format msgid "1 actor" msgid_plural "%1 actors" msgstr[0] "%1 位演员" #: platform/listengines/videolistengine.cpp:662 #, kde-format msgid "1 director" msgid_plural "%1 directors" msgstr[0] "%1 位导演" #: platform/utilities/artwork.cpp:537 msgid "folder" msgstr "文件夹" #: platform/utilities/general.cpp:379 #, kde-format msgid "a year ago" msgid_plural "%1 years ago" msgstr[0] "%1 年前" #: platform/utilities/general.cpp:381 #, kde-format msgid "a month ago" msgid_plural "%1 months ago" msgstr[0] "%1 个月前" #: platform/utilities/general.cpp:383 #, kde-format msgid "a week ago" msgid_plural "%1 weeks ago" msgstr[0] "%1 周前" #: platform/utilities/general.cpp:385 #, kde-format msgid "a day ago" msgid_plural "%1 days ago" msgstr[0] "%1 天前" #: platform/utilities/general.cpp:387 #, kde-format msgid "an hour ago" msgid_plural "%1 hours ago" msgstr[0] "%1 小时前" #: platform/utilities/general.cpp:389 #, kde-format msgid "a minute ago" msgid_plural "%1 minutes ago" msgstr[0] "%1 分钟前" #: platform/utilities/general.cpp:391 msgid "a few seconds ago" msgstr "刚刚" #: platform/utilities/mediaitems.cpp:115 #, kde-format msgid "Title %1" msgstr "标题 %1" #: platform/utilities/mediaitems.cpp:117 msgid "Full Disc" msgstr "全盘" #: platform/utilities/mediaitems.cpp:1421 #, kde-format msgid "Season %1" msgstr "上演期 %1" #: platform/utilities/mediaitems.cpp:1429 #, kde-format msgid "Episode %1" msgstr "片段 %1" #: platform/utilities/mediaitems.cpp:1435 #, kde-format msgctxt "%1=Number of the Season" msgid "Season %1" msgstr "上演期 %1" #~ msgid "Andreas Marschke" #~ msgstr "Andreas Marschke" #~ msgid "Ni Hui" #~ msgstr "Ni Hui" bangarang-bangarang/src/000077500000000000000000000000001166760560600155205ustar00rootroot00000000000000bangarang-bangarang/src/CMakeLists.txt000066400000000000000000000075521166760560600202710ustar00rootroot00000000000000add_subdirectory(platform/nepomukwriter) set(BangarangSources app/main.cpp app/common/actionsmanager.cpp app/common/bangarangapplication.cpp app/common/bangarangnotifieritem.cpp app/common/dbusobjects.cpp app/common/flickcharm.cpp app/common/mainwindow.cpp app/common/mediaitemdelegate.cpp app/common/mediaview.cpp app/common/ratingdelegate.cpp app/common/sensiblewidgets.cpp app/common/starrating.cpp app/common/artworkpainter.cpp app/medialists/audiolistsstack.cpp app/medialists/medialistsettings.cpp app/medialists/medialistsmanager.cpp app/medialists/infobox.cpp app/medialists/infomanager.cpp app/medialists/infoitemdelegate.cpp app/medialists/infoitemview.cpp app/medialists/savedlistsmanager.cpp app/medialists/videolistsstack.cpp app/nowplaying/audiosettings.cpp app/nowplaying/bangarangvideowidget.cpp app/nowplaying/bookmarksmanager.cpp app/nowplaying/nowplayingdelegate.cpp app/nowplaying/nowplayingmanager.cpp app/nowplaying/nowplayingview.cpp app/nowplaying/playlistview.cpp app/nowplaying/videosettings.cpp platform/dbpediaquery.cpp platform/devicemanager.cpp platform/downloader.cpp platform/infoitemmodel.cpp platform/mediaitemmodel.cpp platform/mediaindexer.cpp platform/mediavocabulary.cpp platform/mediaquery.cpp platform/medialistcache.cpp platform/ontologyupdater.cpp platform/playlist.cpp platform/infofetchers/dbpediainfofetcher.cpp platform/infofetchers/doubaninfofetcher.cpp platform/infofetchers/feedinfofetcher.cpp platform/infofetchers/filenameinfofetcher.cpp platform/infofetchers/infofetcher.cpp platform/infofetchers/lastfminfofetcher.cpp platform/infofetchers/tmdbinfofetcher.cpp platform/infofetchers/tvdbinfofetcher.cpp platform/listengines/ampachelistengine.cpp platform/listengines/audioclipslistengine.cpp platform/listengines/audiostreamlistengine.cpp platform/listengines/cachelistengine.cpp platform/listengines/cdlistengine.cpp platform/listengines/dvdlistengine.cpp platform/listengines/feedlistengine.cpp platform/listengines/filelistengine.cpp platform/listengines/listengine.cpp platform/listengines/listenginefactory.cpp platform/listengines/medialistsengine.cpp platform/listengines/musiclistengine.cpp platform/listengines/nepomuklistengine.cpp platform/listengines/semanticslistengine.cpp platform/listengines/savedlistsengine.cpp platform/listengines/taglistengine.cpp platform/listengines/videolistengine.cpp platform/utilities/artwork.cpp platform/utilities/filetags.cpp platform/utilities/general.cpp platform/utilities/mediaitems.cpp platform/utilities/sha256.cpp platform/utilities/thread.cpp platform/utilities/typechecks.cpp ) kde4_add_ui_files(BangarangSources app/ui/mainwindow.ui app/ui/audiolistsstack.ui app/ui/videolistsstack.ui) kde4_add_executable(bangarang ${BangarangSources}) kde4_add_app_icon(BangarangSources "${CMAKE_CURRENT_SOURCE_DIR}/../icons/hi*.png") # Executable target_link_libraries(bangarang ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} ${KDE4_PHONON_LIBS} ${KDE4_KFILE_LIBS} ${KDE4_KROSSCORE_LIBS} ${KDE4_SOLID_LIBS} ${NEPOMUK_LIBRARIES} ${SOPRANO_LIBRARIES} ${TAGLIB_LIBRARIES} tag ) ########### install files ############### install(TARGETS bangarang ${INSTALL_TARGETS_DEFAULT_ARGS}) # install(TARGETS krossmodulebangarangmod DESTINATION ${PLUGIN_INSTALL_DIR}) # modules one might want to link against in c++ plugins (using dynamic libload magic) #install(FILES DESTINATION ${DATA_INSTALL_DIR}/bangarang) # We might need that once we can load plugins #install(FILES bangarangrc DESTINATION ${CONFIG_INSTALL_DIR}) kde4_install_icons(${ICON_INSTALL_DIR}) bangarang-bangarang/src/Messages.sh000077500000000000000000000021351166760560600176270ustar00rootroot00000000000000#!/bin/bash # Script to extract translatable messages from the code. # Work usually done by scripty in KDE svn XGETTEXT="xgettext --copyright-holder=This_file_is_part_of_KDE --from-code=UTF-8 -C --kde -ci18n -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 -ktr2i18n:1 -kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kaliasLocale -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 --msgid-bugs-address=http://code.google.com/p/bangarangissuetracking/issues" EXTRACTRC="extractrc" export XGETTEXT EXTRACTRC echo 'i18nc("NAME OF TRANSLATORS","Your names");' >> rc.cpp echo 'i18nc("EMAIL OF TRANSLATORS","Your emails");' >> rc.cpp # Extract echo 'Extracting messages...' $EXTRACTRC app/ui/*.ui >> rc.cpp $XGETTEXT *.cpp app/*.cpp app/common/*.cpp app/medialists/*.cpp app/nowplaying/*.cpp platform/*.cpp platform/infofetchers/*.cpp platform/listengines/*.cpp platform/utilities/*.cpp -o ../po/bangarang.pot # Merge echo 'Merging messages...' for lang in $( find ../po -maxdepth 1 -mindepth 1 -type d ) do msgmerge -U $lang/bangarang.po ../po/bangarang.pot done # Clean echo 'Cleaning up...' rm -f rc.cpp echo 'Done!'bangarang-bangarang/src/app/000077500000000000000000000000001166760560600163005ustar00rootroot00000000000000bangarang-bangarang/src/app/common/000077500000000000000000000000001166760560600175705ustar00rootroot00000000000000bangarang-bangarang/src/app/common/actionsmanager.cpp000066400000000000000000001443151166760560600232770ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "actionsmanager.h" #include "bangarangapplication.h" #include "bangarangnotifieritem.h" #include "../../platform/utilities/utilities.h" #include "mainwindow.h" #include "ui_mainwindow.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/playlist.h" #include "../../platform/ontologyupdater.h" #include "../../platform/infofetchers/infofetcher.h" #include "../medialists/medialistsmanager.h" #include "../medialists/infomanager.h" #include "../medialists/savedlistsmanager.h" #include "../nowplaying/bookmarksmanager.h" #include "../nowplaying/videosettings.h" #include "../nowplaying/audiosettings.h" #include "../nowplaying/nowplayingdelegate.h" #include "../nowplaying/nowplayingmanager.h" #include #include #include #include #include #include #include ActionsManager::ActionsManager(MainWindow * parent) : QObject(parent) { /*Set up basics */ m_application = (BangarangApplication *)KApplication::kApplication(); m_parent = parent; ui = m_parent->ui; m_shortcutsConfig = KGlobal::config()->group("shortcuts"); m_shortcutsCollection = new KActionCollection(this); m_shortcutsCollection->setConfigGlobal(true); m_shortcutsCollection->addAssociatedWidget(m_parent); //won't have to add each action to the parent m_othersCollection = new KActionCollection(this); m_contextMenuSource = MainWindow::Default; /*Set up actions*/ //Add standard quit shortcut KAction *action = new KAction(KIcon("application-exit"), i18n("Quit"), this); action->setShortcut(Qt::CTRL + Qt::Key_Q); connect(action, SIGNAL(triggered()), qApp, SLOT(quit())); m_shortcutsCollection->addAction("quit", action); //Play/Pause Action action = new KAction(KIcon("media-playback-start"), i18n("Play/Pause"), this); connect(action, SIGNAL(triggered()), this, SLOT(simplePlayPause())); m_shortcutsCollection->addAction("play_pause", action); //globals only work after adding them to the action manager action->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_D)); //Play Action action = new KAction(KIcon("media-playback-start"), i18n("Play"), this); connect(action, SIGNAL(triggered()), this, SLOT(smartPlay())); m_othersCollection->addAction("play", action); //Pause Action action = new KAction(KIcon("media-playback-pause"), i18n("Pause"), this); connect(action, SIGNAL(triggered()), m_application->playlist()->mediaObject(), SLOT(pause())); m_othersCollection->addAction("pause", action); //Play Next action = new KAction(KIcon("media-skip-forward"), i18n("Play next"), this); connect(action, SIGNAL(triggered()), m_application->playlist(), SLOT(playNext())); m_shortcutsCollection->addAction("play_next", action); action->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_F)); //Play Previous action = new KAction(KIcon("media-skip-backward"), i18n("Play previous"), this); connect(action, SIGNAL(triggered()), m_application->playlist(), SLOT(playPrevious())); m_shortcutsCollection->addAction("play_previous", action); action->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_S)); //Mute action = new KAction(KIcon("dialog-cancel"), i18n("Mute"), this); action->setShortcut(Qt::Key_M); connect(action, SIGNAL(triggered()), this, SLOT(muteAudio())); m_shortcutsCollection->addAction("mute", action); //Play All Action action = new KAction(KIcon("media-playback-start"), i18n("Play all"), this); connect(action, SIGNAL(triggered()), this, SLOT(playAllSlot())); m_othersCollection->addAction("play_all", action); //Play Selected Action action = new KAction(KIcon("media-playback-start"), i18n("Play selected"), this); connect(action, SIGNAL(triggered()), this, SLOT(playSelectedSlot())); m_othersCollection->addAction("play_selected", action); //Add Selected To Playlist Action action = new KAction(KIcon("dialog-ok-apply"), i18n("Add to playlist"), this); connect(action, SIGNAL(triggered()), this, SLOT(addSelectedToPlaylistSlot())); m_othersCollection->addAction("add_to_playlist", action); //Add After Now Playing Action action = new KAction(KIcon("dialog-ok-apply"), i18n("Add after Now Playing"), this); connect(action, SIGNAL(triggered()), this, SLOT(addAfterNowPlaying())); m_othersCollection->addAction("add_after_now_playing", action); //Remove Selected From Playlist Action action = new KAction(KIcon("list-remove"), i18n("Remove from playlist"), this); connect(action, SIGNAL(triggered()), this, SLOT(removeSelectedFromPlaylistSlot())); m_othersCollection->addAction("remove_from_playlist", action); //Remove the selection of the playlist from the playlist action = new KAction(KIcon("list-remove"), i18n("Remove from playlist"), this); action->setShortcut(Qt::Key_Delete); connect(action, SIGNAL(triggered()), this, SLOT(removePlaylistSelectionFromPlaylistSlot())); m_othersCollection->addAction("remove_playlistselection_from_playlist", action); //Toggle Controls Shortcut action = new KAction(KIcon("layer-visible-off"), i18n("Hide controls"), this); action->setShortcut(Qt::CTRL + Qt::Key_H); connect(action, SIGNAL(triggered()), this, SLOT(toggleControls())); m_shortcutsCollection->addAction("toggle_controls", action); //Toggle Playlist/Media Lists Filter action = new KAction(KIcon("view-filter"), i18n("Show filter"), this); action->setShortcut(Qt::CTRL + Qt::Key_F); connect(action, SIGNAL(triggered()), this, SLOT(toggleFilter())); m_shortcutsCollection->addAction("toggle_filter", action); //Toggle Show Remaining Time Shortcut action = new KAction(KIcon("chronometer"), i18n("Show remaining time"), this); connect(action, SIGNAL(triggered()), this, SLOT(toggleShowRemainingTimeSlot())); m_shortcutsCollection->addAction("toggle_show_remaining_time", action); //Show VideoSettings action = new KAction(KIcon("video-display"), i18n("Show video settings"),this); action->setShortcut(Qt::CTRL + Qt::Key_V); connect(action, SIGNAL(triggered()), this, SLOT(toggleVideoSettings())); m_shortcutsCollection->addAction("show_video_settings",action); //Show Audio Settings action = new KAction(KIcon("speaker"), i18n("Show audio settings"),this); action->setShortcut(Qt::CTRL + Qt::Key_U); connect(action, SIGNAL(triggered()), this, SLOT(toggleAudioSettings())); m_shortcutsCollection->addAction("show_audio_settings",action); //Full Screen action = new KAction(KIcon("view-fullscreen"), i18n("Fullscreen"), this); action->setShortcut(Qt::Key_F11); connect(action, SIGNAL(triggered()), this, SLOT(fullScreenToggle())); m_shortcutsCollection->addAction("toggle_fullscreen", action); //Cancel FullScreen/Cancel Hide Controls action = new KAction(this); action->setShortcut(Qt::Key_Escape); connect(action, SIGNAL(triggered()), this, SLOT(cancelFSHC())); m_parent->addAction(action); m_othersCollection->addAction("cancel", action); //shouldn't be editable //Add Info for Selected MediaItems action = new KAction(KIcon("document-save"), i18n("Save selected info"), this); connect(action, SIGNAL(triggered()), m_application->infoManager(), SLOT(addSelectedItemsInfo())); m_othersCollection->addAction("add_selected_info", action); //Remove Info for Selected MediaItems action = new KAction(KIcon("trash-empty"), i18n("Remove selected info"), this); connect(action, SIGNAL(triggered()), m_application->infoManager(), SLOT(removeSelectedItemsInfo())); m_othersCollection->addAction("remove_selected_info", action); //Refresh Media View action = new KAction(KIcon("view-refresh"), i18n("Refresh"), this); action->setShortcut(Qt::Key_F5); connect(action, SIGNAL(triggered()), this, SLOT(mediaViewRefresh())); m_shortcutsCollection->addAction("reload", action); //Select all items action = new KAction(KIcon("edit-select-all"), i18n("Select All"), this); action->setShortcut(Qt::CTRL + Qt::Key_A); connect(action, SIGNAL(triggered()), this, SLOT(selectAll())); m_parent->addAction(action); m_othersCollection->addAction("select_all", action); //Remove selected from playlist action = new KAction(i18n("Remove from list"), this); connect(action, SIGNAL(triggered()), m_application->savedListsManager(), SLOT(removeSelected())); m_othersCollection->addAction("remove_from_list", action); //Add temporary audio streams in the playlist to the MediaList "Audio Streams" action = new KAction(KIcon("list-add"), i18n("Add to \"Audio Streams\""), this); connect(action, SIGNAL(triggered()), this, SLOT(addTemporaryAudioStreams())); m_othersCollection->addAction("add_temp_audio_streams", action); //Add selected to saved audio list m_addToAudioSavedList = new QMenu(i18n("Add to list"), m_parent); connect(m_addToAudioSavedList, SIGNAL(triggered(QAction *)), this, SLOT(addToSavedAudioList(QAction *))); //Add selected to saved video list m_addToVideoSavedList = new QMenu(i18n("Add to list "), m_parent); connect(m_addToVideoSavedList, SIGNAL(triggered(QAction *)), this, SLOT(addToSavedVideoList(QAction *))); //Add a new audio list action = new KAction(KIcon("list-add"), i18n("New list"), m_parent); connect(action, SIGNAL(triggered()), m_application->savedListsManager(), SLOT(showAudioListSave())); m_othersCollection->addAction("new_audio_list", action); //Add a new video list action = new KAction(KIcon("list-add"), i18n("New list"), m_parent); connect(action, SIGNAL(triggered()), m_application->savedListsManager(), SLOT(showVideoListSave())); m_othersCollection->addAction("new_video_list", action); //Show Items action = new KAction(KIcon("bangarang-category-browse"), i18n("Show items"), m_parent); connect(action, SIGNAL(triggered()), this, SLOT(loadSelectedSources())); m_othersCollection->addAction("show_items", action); //Show Now Playing Info action = new KAction(KIcon("help-about"), i18n("Show information"), m_parent); connect(action, SIGNAL(triggered()), this, SLOT(showInfoForNowPlaying())); m_othersCollection->addAction("show_now_playing_info", action); //Show Info View action = new KAction(KIcon("help-about"), i18n("Show Info View"), m_parent); action->setShortcut(Qt::CTRL + Qt::Key_I); connect(action, SIGNAL(triggered()), m_application->infoManager(), SLOT(toggleInfoView())); m_parent->addAction(action); m_othersCollection->addAction("show_info", action); //Add bookmark action = new KAction(KIcon("bookmark-new"), i18n("Add bookmark"), m_parent); connect(action, SIGNAL(triggered()), this, SLOT(addBookmarkSlot())); m_othersCollection->addAction("add_bookmark", action); //Bookmarks Menus m_bookmarksMenu = new QMenu(m_parent); connect(m_bookmarksMenu, SIGNAL(triggered(QAction *)), this, SLOT(activateBookmark(QAction *))); m_removeBookmarksMenu = new QMenu(i18n("Remove bookmarks"), m_parent); connect(m_removeBookmarksMenu, SIGNAL(triggered(QAction *)), this, SLOT(removeBookmark(QAction *))); //Edit Shortcuts action = new KAction(KIcon("configure-shortcuts"), i18n("Show shortcuts editor"), this); connect(action, SIGNAL(triggered()), this, SLOT(toggleShortcutsEditor())); connect(ui->cancelEditShortcuts, SIGNAL(clicked()), this, SLOT(cancelShortcuts())); connect(ui->saveShortcuts, SIGNAL(clicked()), this, SLOT(saveShortcuts())); m_shortcutsCollection->addAction("show_shortcuts_editor", action); //Update Ontologies action = new KAction(KIcon("system-run"), i18n("Update ontologies..."), this); connect(action, SIGNAL(triggered()), this, SLOT(updateOntologies())); m_shortcutsCollection->addAction("update_ontologies", action); //Hide in system tray action = new KAction(KIcon("view-close"), i18n("Hide in system tray"), this); connect(action, SIGNAL(triggered()), m_application->statusNotifierItem(), SLOT(activate())); m_shortcutsCollection->addAction("hide_in_system_tray", action); //set up the shortcuts collection m_shortcutsCollection->readSettings(&m_shortcutsConfig); ui->shortcutsEditor->addCollection(m_shortcutsCollection); /*Set up other variables */ m_nowPlayingContextMenu = new QMenu(m_parent); m_infoMenu = new QMenu(i18n("Manage info"), m_parent); //controls always visible at startup m_controlsVisible = true; //filter ain't m_playlistRestoreFilter = ""; m_mediaListRestoreFilter = ""; } ActionsManager::~ActionsManager() { } QAction * ActionsManager::action( QString name, bool shortcutsOnly ) { QAction *action = m_shortcutsCollection->action(name); if (!shortcutsOnly && action == NULL) { action = m_othersCollection->action(name); } return action; } QMenu * ActionsManager::mediaViewMenu(bool showAbout, MainWindow::ContextMenuSource menuSource) { KHelpMenu * helpMenu = new KHelpMenu(m_parent, m_application->aboutData(), false); helpMenu->menu(); updateSavedListsMenus(); m_contextMenuSource = menuSource; QMenu *menu = new QMenu(m_parent); QString type; bool selection = false; bool isMedia = false; bool isFeed = false; bool isCategory = false; bool isInPlaylist = false; QList selectedItems = selectedMediaItems(); if (selectedItems.count() > 0) { type = selectedItems.at(0).type; selection = true; isMedia = Utilities::isMedia(type); isCategory = Utilities::isCategory(type); isFeed = Utilities::isFeed(selectedItems.at(0).fields["categoryType"].toString()); for (int i = 0; i < selectedItems.count(); i++) { if (m_application->playlist()->isInPlaylist(selectedItems.at(i))) { isInPlaylist = true; break; } } } //Playlist/Playback actions if (isMedia || isCategory) { if (selection && !isInPlaylist) { menu->addAction(action("add_to_playlist")); if (isMedia && (m_application->playlist()->mediaObject()->state() == Phonon::PlayingState || m_application->playlist()->mediaObject()->state() == Phonon::PausedState)) { action("add_after_now_playing")->setIcon(KIcon("dialog-ok-apply")); action("add_after_now_playing")->setText(i18n("Add after Now Playing")); menu->addAction(action("add_after_now_playing")); } } if (selection && isMedia && isInPlaylist) { menu->addAction(action("remove_from_playlist")); } if (selection) { menu->addAction(action("play_selected")); } menu->addAction(action("play_all")); menu->addSeparator(); } //Browsing actions if (menuSource == MainWindow::Default || MainWindow::MediaList) { if (m_application->infoManager()->infoViewVisible()) { action("show_info")->setText(i18n("Hide Info View")); } else { action("show_info")->setText(i18n("Show Info View")); } if (menuSource == MainWindow::Default) { menu->addAction(action("show_info")); if (ui->mediaView->sourceModel()->containsPlayable()) { menu->addAction(action("toggle_filter")); } } } if (selection && isCategory) { menu->addAction(action("show_items")); } menu->addAction(action("reload")); menu->addSeparator(); //Saved List actions if (selection && isMedia) { if (type == "Audio") { if (m_addToAudioSavedList->actions().count() > 0) { menu->addMenu(m_addToAudioSavedList); } } else if (type == "Video") { if (m_addToVideoSavedList->actions().count() > 0) { menu->addMenu(m_addToVideoSavedList); } } if (m_application->browsingModel()->mediaListProperties().lri.startsWith("savedlists://")) { menu->addAction(action("remove_from_list")); } menu->addSeparator(); } menu->addMenu(infoMenu()); if (selection && (isMedia || isFeed)) { menu->addSeparator(); } //About menu if (showAbout) { menu->addAction(helpMenu->action(KHelpMenu::menuAboutApp)); } return menu; } QMenu *ActionsManager::playlistViewMenu() { m_contextMenuSource = MainWindow::Playlist; QMenu *menu = new QMenu(m_parent); menu->addAction(action("remove_from_playlist")); const QList selectedItems = selectedMediaItems(); bool showPlayAfterAction = true; if (selectedItems.count() == 1) { const MediaItem &mediaItem = selectedItems.at(0); if (mediaItem.url == m_application->playlist()->nowPlayingModel()->mediaItemAt(0).url) { showPlayAfterAction = false; } } if (showPlayAfterAction) { action("add_after_now_playing")->setIcon(KIcon("media-playback-start")); action("add_after_now_playing")->setText(i18n("Play after Now Playing")); menu->addAction(action("add_after_now_playing")); } //check for temporary audio streams foreach(const MediaItem &itm, selectedItems) { if (Utilities::isTemporaryAudioStream(itm)) { menu->addAction(action("add_temp_audio_streams")); break; } } return menu; } QMenu *ActionsManager::nowPlayingContextMenu() { m_nowPlayingContextMenu->clear(); if (m_application->playlist()->nowPlayingModel()->rowCount() > 0) { NowPlayingDelegate *delegate = (NowPlayingDelegate *)ui->nowPlayingView->itemDelegate(); if (!delegate->showingInfo() || (ui->videoFrame->isVisible() && m_application->mainWindow()->videoSize() == MainWindow::Normal)) { action("show_now_playing_info")->setText(i18n("Show information")); action("show_now_playing_info")->setIcon(KIcon("help-about")); } else if (delegate->showingInfo()) { action("show_now_playing_info")->setText(i18n("Hide information")); action("show_now_playing_info")->setIcon(KIcon("help-about")); } m_nowPlayingContextMenu->addAction(action("show_now_playing_info")); m_nowPlayingContextMenu->addSeparator(); } if (m_application->playlist()->mediaObject()->state() == Phonon::PlayingState || m_application->playlist()->mediaObject()->state() == Phonon::PausedState) { m_nowPlayingContextMenu->addAction(action("play_previous")); if (m_application->playlist()->mediaObject()->state() == Phonon::PlayingState) { m_nowPlayingContextMenu->addAction(action("pause")); } else { m_nowPlayingContextMenu->addAction(action("play")); } } else { m_nowPlayingContextMenu->addAction(action("play")); } m_nowPlayingContextMenu->addAction(action("play_next")); m_nowPlayingContextMenu->addSeparator(); if (m_application->playlist()->mediaObject()->hasVideo()) { m_nowPlayingContextMenu->addAction(action("show_video_settings")); } m_nowPlayingContextMenu->addAction(action("toggle_controls")); return m_nowPlayingContextMenu; } KMenu *ActionsManager::nowPlayingMenu() { KHelpMenu * helpMenu = new KHelpMenu(m_parent, m_application->aboutData(), false); helpMenu->menu(); m_nowPlayingMenu = new KMenu(m_parent); if (m_application->playlist()->nowPlayingModel()->rowCount() > 0) { MediaItem nowPlayingItem = m_application->playlist()->nowPlayingModel()->mediaItemAt(0); if (Utilities::isMedia(nowPlayingItem.type)) { NowPlayingDelegate *delegate = (NowPlayingDelegate *)ui->nowPlayingView->itemDelegate(); if (!delegate->showingInfo() || (ui->videoFrame->isVisible() && m_application->mainWindow()->videoSize() == MainWindow::Normal)) { action("show_now_playing_info")->setText(i18n("Show information")); action("show_now_playing_info")->setIcon(KIcon("help-about")); } else if (delegate->showingInfo()) { action("show_now_playing_info")->setText(i18n("Hide information")); action("show_now_playing_info")->setIcon(KIcon("help-about")); } m_nowPlayingMenu->addAction(action("show_now_playing_info")); m_nowPlayingMenu->addSeparator(); } } if (ui->contextStackHolder->isVisible() && ui->contextStack->currentIndex() == 0) { m_nowPlayingMenu->addAction(action("toggle_filter")); m_nowPlayingMenu->addSeparator(); } m_nowPlayingMenu->addAction(action("hide_in_system_tray")); if (!m_parent->isFullScreen()) { m_nowPlayingMenu->addAction(action("toggle_controls")); } m_nowPlayingMenu->addAction(action("show_video_settings")); m_nowPlayingMenu->addAction(action("show_audio_settings")); if (!m_application->isTouchEnabled()) { m_nowPlayingMenu->addAction(action("show_shortcuts_editor")); } m_nowPlayingMenu->addSeparator(); m_nowPlayingMenu->addAction(helpMenu->action(KHelpMenu::menuAboutApp)); return m_nowPlayingMenu; } QMenu *ActionsManager::addToSavedAudioListMenu() { return m_addToAudioSavedList; } QMenu *ActionsManager::addToSavedVideoListMenu() { return m_addToVideoSavedList; } QMenu *ActionsManager::bookmarksMenu() { m_removeBookmarksMenu->clear(); m_bookmarksMenu->clear(); m_bookmarksMenu->addAction(action("toggle_show_remaining_time")); m_bookmarksMenu->addSeparator(); Phonon::State state = m_application->playlist()->mediaObject()->state(); action("add_bookmark")->setEnabled((state == Phonon::PlayingState || state == Phonon::PausedState)); if (m_application->playlist()->nowPlayingModel()->rowCount() > 0) { QString url = m_application->playlist()->nowPlayingModel()->mediaItemAt(0).url; Phonon::MediaController *mctrl = m_application->playlist()->mediaController(); int noChaps = mctrl->availableChapters(); if (noChaps > 1) { for (int i = 0; i < noChaps; i++) { QString title = i18n("Chapter %1", i); QAction * ac = m_bookmarksMenu->addAction(KIcon("media-optical-dvd"), title); ac->setData(QString("Chapter:%1").arg(i)); } m_bookmarksMenu->addSeparator(); } //real bookmarks m_bookmarksMenu->addAction(action("add_bookmark")); QStringList bookmarks = m_application->bookmarksManager()->bookmarks(url); for (int i = 0; i < bookmarks.count(); i++) { QString bookmarkName = m_application->bookmarksManager()->bookmarkName(bookmarks.at(i)); qint64 bookmarkTime = m_application->bookmarksManager()->bookmarkTime(bookmarks.at(i)); QTime bmTime(0, (bookmarkTime / 60000) % 60, (bookmarkTime / 1000) % 60); QString bookmarkTitle = QString("%1 (%2)").arg(bookmarkName).arg(bmTime.toString(QString("m:ss"))); QAction * action = m_bookmarksMenu->addAction(KIcon("bookmarks-organize"), bookmarkTitle); action->setData(QString("Activate:%1").arg(bookmarks.at(i))); action = m_removeBookmarksMenu->addAction(KIcon("list-remove"), bookmarkTitle); action->setData(QString("Remove:%1").arg(bookmarks.at(i))); } if (bookmarks.count() > 0) { m_bookmarksMenu->addMenu(m_removeBookmarksMenu); } } return m_bookmarksMenu; } QMenu * ActionsManager::infoMenu() { m_infoMenu->clear(); QList selectedItems = selectedMediaItems(); if (selectedItems.count() > 0) { //m_infoMenu->addAction(action("add_selected_info")); m_infoMenu->addAction(action("remove_selected_info")); } m_infoMenu->addAction(action("update_ontologies")); return m_infoMenu; } //------------------ //-- Action SLOTS -- //------------------ void ActionsManager::mediaViewRefresh() { //Clear image cache if (m_application->browsingModel()->rowCount() > 0 ){ MediaItem mediaItem = m_application->browsingModel()->mediaItemAt(0); Utilities::clearSubTypesFromImageCache(mediaItem.subType()); } m_application->browsingModel()->reload(); } void ActionsManager::fullScreenToggle() { if (m_parent->isFullScreen()) { m_parent->on_fullScreen_toggled(false); } else { m_parent->on_fullScreen_toggled(true); } } void ActionsManager::toggleControls() { QAction *toggle = action("toggle_controls"); if ((!m_parent->isFullScreen() || m_application->isTouchEnabled()) && (m_parent->currentMainWidget() == MainWindow::MainNowPlaying)) { if (m_controlsVisible) { ui->widgetSet->setVisible(false); toggle->setIcon(KIcon("layer-visible-on")); toggle->setText(i18n("Show Controls")); } else { ui->widgetSet->setVisible(true); toggle->setIcon(KIcon("layer-visible-off")); toggle->setText(i18n("Hide Controls")); } m_controlsVisible = !m_controlsVisible; } } void ActionsManager::toggleVideoSettings() { if(ui->contextStack->currentIndex() != 2 || !ui->contextStackHolder->isVisible()) { m_contextStackWasVisible = ui->contextStackHolder->isVisible(); m_previousContextStackIndex = ui->contextStack->currentIndex(); ui->contextStack->setCurrentIndex(2); ui->contextStackHolder->setVisible(true); m_application->videoSettings()->updateSubtitleCombo(); action("show_video_settings")->setText(i18n("Hide video settings")); } else { if (m_contextStackWasVisible && m_previousContextStackIndex == 0) { //if the playlist was showing, show it ui->contextStack->setCurrentIndex(m_previousContextStackIndex); ui->contextStackHolder->setVisible(true); } else { ui->contextStackHolder->setVisible(false); } action("show_video_settings")->setText(i18n("Show video settings")); } //All other actions for the contextStack setting should now say "Show" action("show_audio_settings")->setText(i18n("Show audio settings")); action("show_shortcuts_editor")->setText(i18n("Show shortcuts editor")); } void ActionsManager::toggleAudioSettings() { if(ui->contextStack->currentIndex() != 1 || !ui->contextStackHolder->isVisible()) { m_contextStackWasVisible = ui->contextStackHolder->isVisible(); m_previousContextStackIndex = ui->contextStack->currentIndex(); ui->contextStack->setCurrentIndex(1); ui->contextStackHolder->setVisible(true); m_application->audioSettings()->updateAudioChannelCombo(); action("show_audio_settings")->setText(i18n("Hide audio settings")); } else { if (m_contextStackWasVisible && m_previousContextStackIndex == 0) { //if the playlist was showing, show it ui->contextStack->setCurrentIndex(m_previousContextStackIndex); ui->contextStackHolder->setVisible(true); } else { ui->contextStackHolder->setVisible(false); } action("show_audio_settings")->setText(i18n("Show audio settings")); } //All other actions for the contextStack setting should now say "Show" action("show_video_settings")->setText(i18n("Show video settings")); action("show_shortcuts_editor")->setText(i18n("Show shortcuts editor")); } void ActionsManager::cancelFSHC() { if (m_parent->currentFilterProxyLine()->lineEdit()->hasFocus()) { toggleFilter(); return; } MainWindow::MainWidget cmw = m_parent->currentMainWidget(); if (cmw == MainWindow::MainNowPlaying) { if (ui->playlistView->hasFocus() && ui->playlistView->selectionModel()->hasSelection()) { ui->playlistView->clearSelection(); return; } else if (!m_controlsVisible) { toggleControls(); return; } } else if (cmw == MainWindow::MainMediaList) { if (ui->mediaView->hasFocus() && ui->mediaView->selectionModel()->hasSelection()) { ui->mediaView->clearSelection(); return; } } if (m_parent->isFullScreen()) { fullScreenToggle(); } } void ActionsManager::toggleShortcutsEditor() { if(ui->contextStack->currentIndex() != 3 || !ui->contextStackHolder->isVisible()) { m_contextStackWasVisible = ui->contextStackHolder->isVisible(); m_previousContextStackIndex = ui->contextStack->currentIndex(); ui->contextStack->setCurrentIndex(3); ui->contextStackHolder->setVisible(true); action("show_shortcuts_editor")->setText(i18n("Hide shortcuts editor")); } else { if (m_contextStackWasVisible && m_previousContextStackIndex == 0) { //if the playlist was showing, show it ui->contextStack->setCurrentIndex(m_previousContextStackIndex); ui->contextStackHolder->setVisible(true); } else { ui->contextStackHolder->setVisible(false); } action("show_shortcuts_editor")->setText(i18n("Show shortcuts editor")); } //All other actions for the contextStack setting should now say "Show" action("show_video_settings")->setText(i18n("Show video settings")); action("show_audio_settings")->setText(i18n("Show audio settings")); } void ActionsManager::saveShortcuts() { ui->shortcutsEditor->writeConfiguration(&m_shortcutsConfig); ui->shortcutsEditor->commit(); toggleShortcutsEditor(); } void ActionsManager::cancelShortcuts() { //user canceld, it should be undone what had been edited ui->shortcutsEditor->undoChanges(); toggleShortcutsEditor(); } void ActionsManager::simplePlayPause() { if (m_application->playlist()->mediaObject()->state() == Phonon::PlayingState) { m_application->playlist()->mediaObject()->pause(); } else { smartPlay(); } } void ActionsManager::smartPlay() { if (m_application->playlist()->mediaObject()->state() == Phonon::PausedState) { m_application->playlist()->mediaObject()->play(); } else if (m_application->playlist()->mediaObject()->state() != Phonon::PlayingState) { m_application->playlist()->start(); } } void ActionsManager::muteAudio() { bool muted = m_application->audioOutput()->isMuted(); m_application->audioOutput()->setMuted(!muted); if (m_application->audioOutput()->isMuted()) { action("mute")->setText(i18n("Restore Volume")); action("mute")->setIcon(KIcon("speaker")); } else { action("mute")->setText(i18n("Mute")); action("mute")->setIcon(KIcon("dialog-cancel")); } } void ActionsManager::addSelectedToPlaylistSlot() { QList mediaList = selectedMediaItems(); MediaItemModel *plmod = m_application->playlist()->playlistModel(); foreach (MediaItem item, mediaList) { if (Utilities::isMedia(item.type)) { if (plmod->rowOfUrl(item.url) >= 0) continue; } else if ( !Utilities::isCategory(item.type) ) continue; m_application->playlist()->addMediaItem(item); } } void ActionsManager::addAfterNowPlaying() { //Get selected mediaitems and play QList mediaList = selectedMediaItems(); //Insert into Playlist if (m_application->playlist()->queueModel()->rowCount() <= 1) { m_application->playlist()->addMediaList(mediaList); } else { m_application->playlist()->insertMediaListAt(1, Playlist::QueueModel, mediaList); } } void ActionsManager::removeSelectedFromPlaylistSlot() { QList mediaList = selectedMediaItems(); m_application->playlist()->removeMediaListItems(mediaList); } void ActionsManager::removePlaylistSelectionFromPlaylistSlot() { m_contextMenuSource = MainWindow::Playlist; removeSelectedFromPlaylistSlot(); } void ActionsManager::updateSavedListsMenus() { m_addToAudioSavedList->clear(); m_addToAudioSavedList->addAction(action("new_audio_list")); QStringList audioListNames = m_application->savedListsManager()->savedListNames("Audio"); for (int i = 0; i < audioListNames.count(); i++) { if (!((audioListNames.at(i) == m_application->browsingModel()->mediaListProperties().name) && (m_application->browsingModel()->mediaListProperties().lri.startsWith("savedlists://")))) { KAction * addToSavedList = new KAction(KIcon("view-list-text"), audioListNames.at(i), m_addToAudioSavedList); addToSavedList->setData(audioListNames.at(i)); m_addToAudioSavedList->addAction(addToSavedList); } } m_addToVideoSavedList->clear(); m_addToVideoSavedList->addAction(action("new_video_list")); QStringList videoListNames = m_application->savedListsManager()->savedListNames("Video"); for (int i = 0; i < videoListNames.count(); i++) { if (!((videoListNames.at(i) == m_application->browsingModel()->mediaListProperties().name) && (m_application->browsingModel()->mediaListProperties().lri.startsWith("savedlists://")))) { KAction * addToSavedList = new KAction(KIcon("view-list-text"), videoListNames.at(i), m_addToVideoSavedList); addToSavedList->setData(videoListNames.at(i)); m_addToVideoSavedList->addAction(addToSavedList); } } } void ActionsManager::removeSelectedItemsInfoSlot() { QList mediaList = selectedMediaItems(); m_application->browsingModel()->removeSourceInfo(mediaList); } void ActionsManager::playSelectedSlot() { //Get selected mediaitems and play QList mediaList = selectedMediaItems(); m_application->playlist()->playMediaList(mediaList); // Show Now Playing page m_parent->switchMainWidget(MainWindow::MainNowPlaying); } void ActionsManager::playAllSlot() { //Play all media items in the media list view QList mediaList; for (int i = 0; i < ui->mediaView->model()->rowCount(); ++i) { QModelIndex proxyIndex = ui->mediaView->model()->index(i, 0); QModelIndex index = ui->mediaView->filterProxyModel()->mapToSource(proxyIndex); mediaList.append(m_application->browsingModel()->mediaItemAt(index.row())); } m_application->playlist()->playMediaList(mediaList); // Show Now Playing page m_parent->switchMainWidget(MainWindow::MainNowPlaying); } void ActionsManager::addToSavedAudioList(QAction *addAction) { //Get list of selected items to add QList mediaList = selectedMediaItems(); //Add to saved list if (mediaList.count() > 0) { QString audioListName = addAction->data().toString(); m_application->savedListsManager()->saveMediaList(mediaList, audioListName, "Audio", true); } } void ActionsManager::addToSavedVideoList(QAction *addAction) { //Get list of selected items to add QList mediaList = selectedMediaItems(); //Add to saved list if (mediaList.count() > 0) { QString videoListName = addAction->data().toString(); m_application->savedListsManager()->saveMediaList(mediaList, videoListName, "Video", true); } } void ActionsManager::loadSelectedSources() { m_application->mediaListsManager()->addListToHistory(); QList mediaList; if (m_contextMenuSource == MainWindow::InfoBox) { mediaList = m_application->infoManager()->selectedInfoBoxMediaItems(); } else { QModelIndexList selectedRows = ui->mediaView->selectionModel()->selectedRows(); for (int i = 0 ; i < selectedRows.count() ; ++i) { QSortFilterProxyModel* proxyModel = ui->mediaView->filterProxyModel(); QModelIndex sourceIndex = proxyModel->mapToSource(selectedRows.at(i)); mediaList.append(m_application->browsingModel()->mediaItemAt(sourceIndex.row())); } } m_application->browsingModel()->clearMediaListData(); m_application->browsingModel()->loadSources(mediaList); } void ActionsManager::showInfoForNowPlaying() { if (m_application->mainWindow()->currentMainWidget() != MainWindow::MainNowPlaying) { return; } if (m_application->playlist()->nowPlayingModel()->rowCount() == 0) { return; } //FIXME: Remove this since "Hide Information" overrides this on the menu builder functions if (m_application->playlist()->mediaObject()->hasVideo()) { if (m_application->mainWindow()->videoSize() == MainWindow::Normal) { m_application->mainWindow()->setVideoSize(MainWindow::Mini); action("show_now_playing_info")->setText(i18n("Restore video size")); action("show_now_playing_info")->setIcon(KIcon("transform-scale")); } else { m_application->mainWindow()->setVideoSize(MainWindow::Normal); action("show_now_playing_info")->setText(i18n("Show information")); action("show_now_playing_info")->setIcon(KIcon("help-about")); } } else { NowPlayingDelegate * delegate = (NowPlayingDelegate *)ui->nowPlayingView->itemDelegate(); delegate->setShowInfo(!delegate->showingInfo()); } } const QList ActionsManager::selectedMediaItems() { QList mediaList; QTreeView *view = (m_contextMenuSource == MainWindow::Playlist) ? (QTreeView *) ui->playlistView : (QTreeView *) ui->mediaView; MediaSortFilterProxyModel * proxy = (MediaSortFilterProxyModel *) view->model(); MediaItemModel *model = (MediaItemModel *) proxy->sourceModel(); if (m_contextMenuSource == MainWindow::InfoBox || m_contextMenuSource == MainWindow::Default) { mediaList = m_application->infoManager()->selectedInfoBoxMediaItems(); } if (m_contextMenuSource == MainWindow::MediaList || m_contextMenuSource == MainWindow::Playlist || (m_contextMenuSource == MainWindow::Default && mediaList.count() == 0) ) { QModelIndexList selection = view->selectionModel()->selectedIndexes(); for (int i = 0; i < selection.count(); ++i) { QModelIndex _index = selection.at(i); QModelIndex index; index = proxy->mapToSource(_index); if (index.column() == 0) { mediaList.append(model->mediaItemAt(index.row())); } } } return mediaList; } void ActionsManager::setContextMenuSource(MainWindow::ContextMenuSource menuSource) { m_contextMenuSource = menuSource; } void ActionsManager::toggleShowRemainingTimeSlot() { m_application->nowPlayingManager()->setShowRemainingTime(!m_application->nowPlayingManager()->showingRemainingTime()); if (m_application->nowPlayingManager()->showingRemainingTime()) { action("toggle_show_remaining_time")->setText(i18n("Show elapsed time")); } else { action("toggle_show_remaining_time")->setText(i18n("Show remaining time")); } } void ActionsManager::addBookmarkSlot() { if (m_application->playlist()->nowPlayingModel()->rowCount() > 0) { QString nowPlayingUrl = m_application->playlist()->nowPlayingModel()->mediaItemAt(0).url; qint64 time = m_application->playlist()->mediaObject()->currentTime(); int newBookmarkIndex = m_application->bookmarksManager()->bookmarks(nowPlayingUrl).count() + 1; QString name = i18n("Bookmark-%1", newBookmarkIndex); m_application->bookmarksManager()->addBookmark(nowPlayingUrl, name, time); if (m_application->bookmarksManager()->bookmarks(nowPlayingUrl).count() > 0) { ui->seekTime->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } } } void ActionsManager::activateBookmark(QAction *bookmarkAction) { QString bookmark = bookmarkAction->data().toString(); if (bookmark.isEmpty()) return; if (bookmark.startsWith("Activate:")) { bookmark.remove(0,9); qint64 time = m_application->bookmarksManager()->bookmarkTime(bookmark); m_application->playlist()->mediaObject()->seek(time); } else if (bookmark.startsWith("Chapter:")) { int no = bookmark.remove(0,8).toInt(); m_application->playlist()->mediaController()->setCurrentChapter(no); } } void ActionsManager::removeBookmark(QAction *bookmarkAction) { QString bookmark = bookmarkAction->data().toString(); if (!bookmark.isEmpty() && bookmark.startsWith("Remove:")) { bookmark.remove(0,7); QString nowPlayingUrl = m_application->playlist()->nowPlayingModel()->mediaItemAt(0).url; m_application->bookmarksManager()->removeBookmark(nowPlayingUrl, bookmark); if (m_application->bookmarksManager()->bookmarks(nowPlayingUrl).count() == 0) { ui->seekTime->setToolButtonStyle(Qt::ToolButtonTextOnly); } } } void ActionsManager::toggleFilter() { QFrame *frame = m_application->mainWindow()->currentFilterFrame(); KFilterProxySearchLine *filter = m_application->mainWindow()->currentFilterProxyLine(); bool visible = frame->isVisible(); QString *restore; if (m_parent->currentMainWidget() == MainWindow::MainMediaList) { restore = &m_mediaListRestoreFilter; if ( !visible && !ui->mediaView->sourceModel()->containsPlayable() ) return; } else { restore = &m_playlistRestoreFilter; } frame->setVisible(!visible); if(!visible) { if(!restore->isEmpty()) { filter->setText( *restore ); restore->clear(); } filter->lineEdit()->setFocus(); //the user can start immediately to search filter->lineEdit()->selectAll(); } else { if(!filter->lineEdit()->text().isEmpty()) { *restore = filter->lineEdit()->text(); filter->setText( "" ); } } updateToggleFilterText(); } void ActionsManager::updateOntologies() { KGuiItem updateOntologies; updateOntologies.setText(i18n("Update Ontologies")); KGuiItem cancel; cancel.setText(i18n("Cancel")); if (KMessageBox::questionYesNo(m_parent, i18n("Updating ontologies ensures that media information is stored in a way that makes it most accessible to other desktop applications. This is only necessary if you recently upgraded Bangarang or your KDE software compilation.

This may take several minutes."), QString(), updateOntologies, cancel) == KMessageBox::Yes) { QDialog *dialog = new QDialog(m_parent, Qt::Dialog); dialog->setModal(true); dialog->setAttribute(Qt::WA_DeleteOnClose, true); dialog->setWindowTitle(i18n("Update Ontologies")); QHBoxLayout *layout = new QHBoxLayout; QLabel * label = new QLabel; QPushButton * stopButton = new QPushButton; stopButton->setText(i18n("Stop")); stopButton->setIcon(KIcon("process-stop")); QPushButton * closeButton = new QPushButton; closeButton->setText(i18n("Close")); closeButton->setIcon(KIcon("dialog-close")); layout->addWidget(label); layout->addWidget(stopButton); layout->addWidget(closeButton); dialog->setLayout(layout); closeButton->setVisible(false); OntologyUpdater *updater = new OntologyUpdater(this); connect(updater, SIGNAL(infoMessage(QString)), label, SLOT(setText(QString))); connect(stopButton, SIGNAL(clicked()), updater, SLOT(stopUpdate())); connect(updater, SIGNAL(done()), stopButton, SLOT(hide())); connect(updater, SIGNAL(done()), closeButton, SLOT(show())); connect(closeButton, SIGNAL(clicked()), dialog, SLOT(hide())); connect(dialog, SIGNAL(rejected()), updater, SLOT(stopUpdate())); dialog->show(); updater->start(); } } void ActionsManager::updateToggleFilterText() { QString txt; if (m_parent->currentMainWidget() == MainWindow::MainMediaList) { if (ui->mediaListFilter->isVisible()) txt = i18n("Hide filter"); else txt = i18n("Show filter"); } else { if (ui->playlistFilter->isVisible()) txt = i18n("Hide filter"); else txt = i18n("Show filter"); } action("toggle_filter")->setText(txt); } void ActionsManager::addTemporaryAudioStreams() { QList selected = selectedMediaItems(); QList tempStreams; foreach(const MediaItem &item, selected) { if (Utilities::isTemporaryAudioStream(item)) { tempStreams << item; } } if (tempStreams.count() <= 0) return; m_application->playlist()->playlistModel()->updateSourceInfo(tempStreams, true); } void ActionsManager::toggleInfoView() { m_application->infoManager()->toggleInfoView(); if (m_application->infoManager()->infoViewVisible()) { action("show_info")->setText(i18n("Hide Info View")); } else { action("show_info")->setText(i18n("Show Info View")); } } void ActionsManager::selectAll() { if (ui->mediaView->hasFocus()) { ui->mediaView->selectAll(); } else if (ui->playlistView->hasFocus()) { ui->playlistView->selectAll(); } } void ActionsManager::handleAltS() { if (m_application->mainWindow()->currentMainWidget() == MainWindow::MainMediaList) { ui->Filter->setFocus(); } else { m_application->nowPlayingManager()->toggleShuffle(); } } void ActionsManager::handleAltLeft() { if (m_application->mainWindow()->currentMainWidget() == MainWindow::MainMediaList) { m_application->mediaListsManager()->loadPreviousList(); } else { m_application->mediaObject()->seek(-5000); } } void ActionsManager::handleCtrlM() { if (m_application->mainWindow()->currentMainWidget() == MainWindow::MainMediaList) { m_application->mediaListsManager()->showMenu(); } else { m_application->nowPlayingManager()->showMenu(); } } void ActionsManager::addShortcuts() { //Show Audio Lists Action KAction *action = new KAction(i18n("Show Audio Lists"), this); action->setShortcut(Qt::ALT + Qt::Key_A); connect(action, SIGNAL(triggered()), m_application->mediaListsManager(), SLOT(selectAudioList())); ui->collectionPage->addAction(action); //Show Video Lists Action action = new KAction(i18n("Show Video Lists"), this); action->setShortcut(Qt::ALT + Qt::Key_V); connect(action, SIGNAL(triggered()), m_application->mediaListsManager(), SLOT(selectVideoList())); ui->collectionPage->addAction(action); //Search/Shuffle Action action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_S); connect(action, SIGNAL(triggered()), this, SLOT(handleAltS())); m_application->mainWindow()->addAction(action); //Open Previous List/ Seek backward action action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_Left); connect(action, SIGNAL(triggered()), this, SLOT(handleAltLeft())); m_application->mainWindow()->addAction(action); //Open menu action = new KAction(QString(), this); action->setShortcut(Qt::CTRL + Qt::Key_M); connect(action, SIGNAL(triggered()), this, SLOT(handleCtrlM())); m_application->mainWindow()->addAction(action); //Show Media Lists/Now Playing action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_N); connect(action, SIGNAL(triggered()), m_application->mainWindow(), SLOT(toggleMainWidget())); m_application->mainWindow()->addAction(action); action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_M); connect(action, SIGNAL(triggered()), m_application->mainWindow(), SLOT(toggleMainWidget())); m_application->mainWindow()->addAction(action); //Show Time/Bookmark menu action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_T); connect(action, SIGNAL(triggered()), m_application->bookmarksManager(), SLOT(showBookmarksMenu())); ui->nowPlayingPage->addAction(action); action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_B); connect(action, SIGNAL(triggered()), m_application->bookmarksManager(), SLOT(showBookmarksMenu())); ui->nowPlayingPage->addAction(action); //Show/Hide playlist action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_P); connect(action, SIGNAL(triggered()), m_application->nowPlayingManager(), SLOT(togglePlaylist())); ui->nowPlayingPage->addAction(action); //View upcoming action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_U); connect(action, SIGNAL(triggered()), m_application->nowPlayingManager(), SLOT(toggleQueue())); ui->nowPlayingPage->addAction(action); //Clear Playlist action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_C); connect(action, SIGNAL(triggered()), m_application->nowPlayingManager(), SLOT(clearPlaylist())); ui->nowPlayingPage->addAction(action); //Toggle Repeat action = new KAction(QString(), this); action->setShortcut(Qt::ALT + Qt::Key_R); connect(action, SIGNAL(triggered()), m_application->nowPlayingManager(), SLOT(toggleRepeat())); ui->nowPlayingPage->addAction(action); //Show Now Playing Info action = new KAction(KIcon("help-about"), i18n("Show information"), m_parent); action->setShortcut(Qt::ALT + Qt::Key_I); connect(action, SIGNAL(triggered()), this, SLOT(showInfoForNowPlaying())); ui->nowPlayingPage->addAction(action); //Play/Pause Action action = new KAction(QString(), this); action->setShortcut(Qt::Key_Space); connect(action, SIGNAL(triggered()), this, SLOT(simplePlayPause())); ui->nowPlayingPage->addAction(action); //Play Next action = new KAction(QString(), this); action->setShortcut(Qt::Key_Right); connect(action, SIGNAL(triggered()), m_application->playlist(), SLOT(playNext())); ui->nowPlayingPage->addAction(action); //Play Previous action = new KAction(QString(), this); action->setShortcut(Qt::Key_Left); connect(action, SIGNAL(triggered()), m_application->playlist(), SLOT(playPrevious())); ui->nowPlayingPage->addAction(action); } bangarang-bangarang/src/app/common/actionsmanager.h000066400000000000000000000106041166760560600227350ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef ACTIONSMANAGER_H #define ACTIONSMANAGER_H #include "mainwindow.h" #include #include #include #include #include #include namespace Ui { class MainWindowClass; } class MainWindow; class BangarangApplication; class VideoSettings; class MediaItem; /* * This class creates and manages all actions for bangarang. */ class ActionsManager : public QObject { Q_OBJECT public: ActionsManager(MainWindow * parent); ~ActionsManager(); KActionCollection *shortcutsCollection() { return m_shortcutsCollection; } KActionCollection *othersCollection() { return m_othersCollection; } QAction *action( QString name, bool shortcutsOnly = false ); QMenu *addToSavedAudioListMenu(); QMenu *addToSavedVideoListMenu(); QMenu * mediaViewMenu(bool showAbout = false, MainWindow::ContextMenuSource menuSource = MainWindow::Default); QMenu * playlistViewMenu(); QMenu * nowPlayingContextMenu(); KMenu * nowPlayingMenu(); KMenu * notifierMenu(); void setContextMenuSource(MainWindow::ContextMenuSource menuSource); const QList selectedMediaItems(); QMenu * bookmarksMenu(); QMenu * infoMenu(); void updateToggleFilterText(); void addShortcuts(); bool m_controlsVisible; public slots: void updateSavedListsMenus(); private: BangarangApplication * m_application; MainWindow *m_parent; Ui::MainWindowClass *ui; VideoSettings *m_videoSettings; QMenu *m_addToAudioSavedList; QMenu *m_addToVideoSavedList; QMenu *m_nowPlayingContextMenu; KMenu *m_nowPlayingMenu; bool m_contextStackWasVisible; int m_previousContextStackIndex; QMenu *m_bookmarksMenu; QMenu *m_removeBookmarksMenu; QMenu *m_infoMenu; //every actionn which is allowed to have a shortcut KActionCollection *m_shortcutsCollection; //shortcuts that make no sense to have a shortcut KActionCollection *m_othersCollection; MainWindow::ContextMenuSource m_contextMenuSource; KConfigGroup m_shortcutsConfig; QString m_playlistRestoreFilter; QString m_mediaListRestoreFilter; private slots: void mediaViewRefresh(); void fullScreenToggle(); void toggleControls(); void toggleVideoSettings(); void toggleAudioSettings(); void cancelFSHC(); void toggleShortcutsEditor(); void saveShortcuts(); void cancelShortcuts(); void simplePlayPause(); void smartPlay(); void muteAudio(); void addSelectedToPlaylistSlot(); void addAfterNowPlaying(); void removeSelectedFromPlaylistSlot(); void removePlaylistSelectionFromPlaylistSlot(); void removeSelectedItemsInfoSlot(); void playSelectedSlot(); void playAllSlot(); void addToSavedAudioList(QAction *addAction); void addToSavedVideoList(QAction *addAction); void loadSelectedSources(); void showInfoForNowPlaying(); void toggleShowRemainingTimeSlot(); void toggleFilter(); void addBookmarkSlot(); void activateBookmark(QAction *bookmarkAction); void removeBookmark(QAction *bookmarkAction); void updateOntologies(); void addTemporaryAudioStreams(); void toggleInfoView(); void selectAll(); void handleAltS(); void handleAltLeft(); void handleCtrlM(); }; #endif //ACTIONSMANAGER_H bangarang-bangarang/src/app/common/artworkpainter.cpp000066400000000000000000000062141166760560600233530ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2011 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "artworkpainter.h" #include #include ArtworkPainter::ArtworkPainter(QObject *parent) : QObject(parent) { m_size = 128; for (int i = 0; i < 19; i++) { if (i%2) { m_artworkRotations.append(10); } else { m_artworkRotations.append(-10); } } } void ArtworkPainter::paint(QPainter *p, QRect rect, QList artworkList) { p->save(); int artworkSize = 0.8 * m_size; if (artworkList.count() == 1) { artworkSize = m_size; } int spacing = (rect.width() - artworkSize - 30)/artworkList.count(); int aTop = rect.top() + (rect.height()-artworkSize)/2; int startx = rect.left() + (rect.width()/2) - ((artworkSize/2) - (spacing/2)*(artworkList.count()-1)); p->translate(startx, aTop); for (int i = artworkList.count()-1; i >= 0; i--) { qreal rot = m_artworkRotations.at(i); if (artworkList.count() == 1) { rot = 0; } double rotRad = (3.14159/180)*rot; qreal r = (sqrt(2.0*artworkSize*artworkSize))/2.0; int transX = (artworkSize/2) - r*cos(rotRad +(3.14159/4)); int transY = r*sin(rotRad + (3.14159/4)) - (artworkSize/2); p->rotate(rot); p->translate(transX, -transY); QPixmap artwork = artworkList.at(i).value().scaledToHeight(artworkSize); int ARxOffset = (artworkSize - artwork.width())/2; p->fillRect(ARxOffset, 0, artwork.width(), artwork.height(), Qt::white); p->drawPixmap(ARxOffset, 0, artwork.width(), artwork.height(), artwork); if (artworkList.count() > 1) { QColor outlineColor = QColor(Qt::black); outlineColor.setAlphaF(0.7); p->setPen(outlineColor); p->drawRect(ARxOffset, 0, artwork.width(), artwork.height()); } p->translate(-transX, transY); p->rotate(-rot); p->translate(-spacing, 0); } p->restore(); } void ArtworkPainter::setArtworkSize(int size) { m_size = size; } void ArtworkPainter::paint(QPainter *p, QRect rect, QList artworkList) { QList artworks; for (int i = 0; i < artworkList.count(); i++) { artworks.append(artworkList.at(i)); } paint(p, rect, artworks); } void ArtworkPainter::paint(QPainter *p, QRect rect, QPixmap artwork) { QList artworks; artworks.append(artwork); paint(p, rect, artworks); } bangarang-bangarang/src/app/common/artworkpainter.h000066400000000000000000000025041166760560600230160ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2011 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef ARTWORKPAINTER_H #define ARTWORKPAINTER_H #include #include #include #include class ArtworkPainter : public QObject { Q_OBJECT public: explicit ArtworkPainter(QObject *parent = 0); void setArtworkSize(int size); void paint(QPainter* p, QRect rect, QList artworkList); void paint(QPainter* p, QRect rect, QList artworkList); void paint(QPainter* p, QRect rect, QPixmap artwork); signals: public slots: private: int m_size; QList m_artworkRotations; }; #endif // ARTWORKPAINTER_H bangarang-bangarang/src/app/common/bangarangapplication.cpp000066400000000000000000000415521166760560600244470ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "bangarangapplication.h" #include "bangarangnotifieritem.h" #include "mainwindow.h" #include "ui_mainwindow.h" #include "../medialists/medialistsmanager.h" #include "../medialists/infomanager.h" #include "../medialists/savedlistsmanager.h" #include "../nowplaying/nowplayingmanager.h" #include "../nowplaying/bookmarksmanager.h" #include "actionsmanager.h" #include "../nowplaying/audiosettings.h" #include "../nowplaying/videosettings.h" #include "dbusobjects.h" #include "../../platform/devicemanager.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/medialistcache.h" #include "../../platform/playlist.h" #include "../../platform/utilities/utilities.h" #include #include #include #include #include #include #include #include #include void BangarangApplication::setup() { //Register custom types that are used in signals/slots qRegisterMetaType("MediaItem"); qRegisterMetaType("MediaListProperties"); qRegisterMetaType >("QList"); qRegisterMetaType >("QList"); //setup locale m_locale = new KLocale( aboutData()->appName() ); //Set up media object m_mediaObject = new Phonon::MediaObject(this); m_mediaObject->setTickInterval(500); m_audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); // default to music category; connect(m_audioOutput, SIGNAL(volumeChanged(qreal)), this, SLOT(volumeChanged(qreal))); //Set up playlist m_playlist = new Playlist(this, m_mediaObject); connect(m_playlist->nowPlayingModel(), SIGNAL(mediaListChanged()), this, SLOT(nowPlayingChanged())); //Set up Media Lists view browsing model m_browsingModel = new MediaItemModel(this); //Set up shared media list cache m_sharedMediaListCache = m_browsingModel->mediaListCache(); m_playlist->playlistModel()->setMediaListCache(m_sharedMediaListCache); // Set up system tray icon m_statusNotifierItem = new BangarangNotifierItem(this); //Start device manager (Singleton will create and start it) DeviceManager::instance(); //Set up main window m_mainWindow = new MainWindow(); //Setup Media Lists Manager m_mediaListsManager = new MediaListsManager(m_mainWindow); //Setup Info Manager m_infoManager = new InfoManager(m_mainWindow); //Setup Saved Lists Manager m_savedListsManager = new SavedListsManager(m_mainWindow); //Setup Actions Manager m_actionsManager = new ActionsManager(m_mainWindow); //Setup Now Playing Manager m_nowPlayingManager = new NowPlayingManager(m_mainWindow); //Setup Bookmarks Manager m_bookmarksManager = new BookmarksManager(m_mainWindow); //Setup Audio Settings m_audioSettings = new AudioSettings(m_mainWindow); m_audioSettings->setMediaController(m_playlist->mediaController()); //Setup Video Settings m_videoSettings = new VideoSettings(m_mainWindow, m_mainWindow->videoWidget()); m_videoSettings->setMediaController(m_playlist->mediaController()); //Complete Setup m_mainWindow->completeSetup(); m_touchIsEnabled = false; //Create media paths m_audioPath = Phonon::createPath(m_mediaObject, m_audioOutput); m_videoPath = Phonon::createPath(m_mediaObject, m_mainWindow->videoWidget()); m_volume = m_audioOutput->volume(); m_audioSettings->setAudioPath(&m_audioPath); m_statusNotifierItem->setAssociatedWidget(m_mainWindow); m_statusNotifierItem->contextMenu()->addAction(m_actionsManager->action("mute")); m_statusNotifierItem->contextMenu()->addSeparator(); m_statusNotifierItem->contextMenu()->addAction(m_actionsManager->action("play_previous")); m_statusNotifierItem->contextMenu()->addAction(m_actionsManager->action("play_pause")); m_statusNotifierItem->contextMenu()->addAction(m_actionsManager->action("play_next")); m_statusNotifierItem->contextMenu()->addSeparator(); m_statusNotifierItem->contextMenu()->addAction(m_actionsManager->action("quit")); connect(m_statusNotifierItem, SIGNAL(changeVolumeRequested(int)), this, SLOT(volumeChanged(int))); //Initialize Nepomuk if (!Utilities::nepomukInited()) { KMessageBox::information(m_mainWindow, i18n("Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media library, rating and play count functions will be unavailable."), i18n("Bangarang"), i18n("Don't show this message again")); } //Load Config KConfig config; KConfigGroup generalGroup( &config, "General" ); QSize windowSize = QSize(generalGroup.readEntry("WindowWidth", 740), generalGroup.readEntry("WindowHeight", 520)); m_mainWindow->setGeometry(QRect(m_mainWindow->rect().topLeft(), windowSize)); QList nowPlayingSplitterSizes = generalGroup.readEntry("NowPlayingSplitterSizes", QList() << 375 << 362 ); m_mainWindow->ui->nowPlayingSplitter->setSizes(nowPlayingSplitterSizes); QList mediaListSplitterSizes = generalGroup.readEntry("MediaListSplitterSizes", QList() << 170 << 565); m_mainWindow->ui->mediaListsSplitter->setSizes(mediaListSplitterSizes); QList mediaViewSplitterSizes = generalGroup.readEntry("MediaViewSplitterSizes", QList() << 338 << 220); m_mainWindow->ui->mediaViewSplitter->setSizes(mediaViewSplitterSizes); int defaultMediaList = generalGroup.readEntry("mediaListsType", 0); if (defaultMediaList == 0) { m_mediaListsManager->showMediaList(MediaListsManager::AudioList); } else { m_mediaListsManager->showMediaList(MediaListsManager::VideoList); } bool infoViewVisible = (generalGroup.readEntry("InfoViewVisible", true)); if (m_infoManager->infoViewVisible() != infoViewVisible) { m_infoManager->toggleInfoView(true); } m_playlist->setShuffleMode(generalGroup.readEntry("Shuffle", false)); m_playlist->setRepeatMode(generalGroup.readEntry("Repeat", false)); m_audioOutput->setVolume(static_cast(generalGroup.readEntry("Volume", static_cast(m_volume * 100))) / 100); m_audioSettings->restoreAudioSettings(&generalGroup); m_videoSettings->restoreVideoSettings(&generalGroup); //connect signal from notfier, so that pause/resume will work connect(m_statusNotifierItem, SIGNAL(changeStateRequested(Phonon::State)), this, SLOT(handleNotifierStateRequest(Phonon::State))); //Setup D-Bus Objects m_mprisRootObject = new MprisRootObject(this); QDBusConnection::sessionBus().registerObject("/", m_mprisRootObject, QDBusConnection::ExportAllContents); QDBusConnection::sessionBus().registerObject("/Player", new MprisPlayerObject(this), QDBusConnection::ExportAllContents); QDBusConnection::sessionBus().registerObject("/TrackList", new MprisTrackListObject(this), QDBusConnection::ExportAllContents); QDBusConnection::sessionBus().registerService("org.mpris.bangarang"); m_actionsManager->addShortcuts(); } BangarangApplication::~BangarangApplication() { //Bookmark last position if program is closed while watching video. if (m_mediaObject->state() == Phonon::PlayingState || m_mediaObject->state() == Phonon::PausedState) { if (m_playlist->nowPlayingModel()->rowCount() > 0 && m_mediaObject->currentTime() > 10000) { MediaItem nowPlayingItem = m_playlist->nowPlayingModel()->mediaItemAt(0); if (nowPlayingItem.type == "Video") { QString nowPlayingUrl = nowPlayingItem.url; qint64 time = m_mediaObject->currentTime(); QString existingBookmark = m_bookmarksManager->bookmarkLookup(nowPlayingUrl, i18n("Resume")); m_bookmarksManager->removeBookmark(nowPlayingUrl, existingBookmark); m_bookmarksManager->addBookmark(nowPlayingUrl, i18n("Resume"), time); } } } //Save application config KConfig config; KConfigGroup generalGroup( &config, "General" ); generalGroup.writeEntry("Shuffle", m_playlist->shuffleMode()); generalGroup.writeEntry("Repeat", m_playlist->repeatMode()); generalGroup.writeEntry("InfoViewVisible", m_infoManager->infoViewVisible()); generalGroup.writeEntry("Volume", static_cast(m_volume*100)); generalGroup.writeEntry("WindowWidth", m_mainWindow->width()); generalGroup.writeEntry("WindowHeight", m_mainWindow->height()); generalGroup.writeEntry("NowPlayingSplitterSizes", m_mainWindow->ui->nowPlayingSplitter->sizes()); generalGroup.writeEntry("MediaListSplitterSizes", m_mainWindow->ui->mediaListsSplitter->sizes()); generalGroup.writeEntry("MediaViewSplitterSizes", m_mainWindow->ui->mediaViewSplitter->sizes()); generalGroup.writeEntry("mediaListsType", (int)m_mediaListsManager->currentMediaListSelection()); m_audioSettings->saveAudioSettings(&generalGroup); m_videoSettings->saveVideoSettings(&generalGroup); config.sync(); m_savedListsManager->savePlaylist(); //destroying inverse to construction delete m_videoSettings; delete m_audioSettings; delete m_bookmarksManager; delete m_actionsManager; delete m_savedListsManager; delete m_infoManager; delete m_mainWindow; delete m_browsingModel; delete m_statusNotifierItem; delete m_playlist; delete m_audioOutput; delete m_mediaObject; delete m_locale; } MainWindow * BangarangApplication::mainWindow() { return m_mainWindow; } Playlist * BangarangApplication::playlist() { return m_playlist; } Phonon::MediaObject * BangarangApplication::mediaObject() { return m_mediaObject; } Phonon::MediaObject * BangarangApplication::newMediaObject() { Phonon::MediaObject * oldMediaObject = m_mediaObject; m_nowPlayingManager->disconnectPhononWidgets(); m_mediaObject = new Phonon::MediaObject(this); m_mediaObject->setTickInterval(500); m_playlist->setMediaObject(m_mediaObject); m_audioSettings->setMediaController(m_playlist->mediaController()); m_videoSettings->setMediaController(m_playlist->mediaController()); m_videoPath.reconnect(m_mediaObject, m_mainWindow->videoWidget()); m_audioPath.reconnect(m_mediaObject, m_audioOutput); m_audioOutput->setVolume(m_volume); m_nowPlayingManager->connectPhononWidgets(); delete oldMediaObject; return m_mediaObject; } Phonon::AudioOutput * BangarangApplication::audioOutput() { return m_audioOutput; } MediaItemModel * BangarangApplication::browsingModel() { return m_browsingModel; } MediaListCache * BangarangApplication::sharedMediaListCache() { return m_sharedMediaListCache; } MediaListsManager* BangarangApplication::mediaListsManager() { return m_mediaListsManager; } InfoManager * BangarangApplication::infoManager() { return m_infoManager; } SavedListsManager * BangarangApplication::savedListsManager() { return m_savedListsManager; } ActionsManager * BangarangApplication::actionsManager() { return m_actionsManager; } NowPlayingManager* BangarangApplication::nowPlayingManager() { return m_nowPlayingManager; } BookmarksManager * BangarangApplication::bookmarksManager() { return m_bookmarksManager; } BangarangNotifierItem * BangarangApplication::statusNotifierItem() { return m_statusNotifierItem; } AudioSettings * BangarangApplication::audioSettings() { return m_audioSettings; } MprisRootObject* BangarangApplication::mprisRootObject() { return m_mprisRootObject; } const KAboutData * BangarangApplication::aboutData() { return KCmdLineArgs::aboutData(); } void BangarangApplication::handleNotifierStateRequest(Phonon::State state) { if (state == Phonon::PausedState) m_mediaObject->pause(); else m_mediaObject->play(); } qreal BangarangApplication::volume() { return m_volume; } void BangarangApplication::volumeChanged(qreal newVolume) { //Phonon::AudioOutput::volume() only return the volume at app start. //Therefore I need to track volume changes independently. m_volume = newVolume; } void BangarangApplication::volumeChanged(int delta) { if ((m_volume == 0 && delta < 0) || (m_volume == 1 && delta > 0)) { return; } m_volume += (qreal)delta/25; if (m_volume < 0) { m_volume = 0; } if (m_volume > 1) { m_volume = 1; } m_audioOutput->setVolume(m_volume); } void BangarangApplication::nowPlayingChanged() { MediaItemModel * nowPlayingModel = m_playlist->nowPlayingModel(); if (nowPlayingModel->rowCount() == 0) { m_statusNotifierItem->setState(Phonon::StoppedState); return; } MediaItem nowPlayingItem = nowPlayingModel->mediaItemAt(0); QString type = nowPlayingItem.type; if (Utilities::isDisc(nowPlayingItem.url)) { return; } //Switch the audio output to the appropriate phonon category bool changed = false; m_volume = m_audioOutput->volume(); if (type == "Audio" && m_audioOutput->category() != Phonon::MusicCategory) { m_nowPlayingManager->disconnectPhononWidgets(); m_audioPath.disconnect(); delete m_audioOutput; m_audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); changed = true; } else if (type == "Video" && m_audioOutput->category() != Phonon::VideoCategory) { m_nowPlayingManager->disconnectPhononWidgets(); m_audioPath.disconnect(); delete m_audioOutput; m_audioOutput = new Phonon::AudioOutput(Phonon::VideoCategory, this); changed = true; } //Reconnect audio if (changed) { m_audioPath.reconnect(m_mediaObject, m_audioOutput); m_audioOutput->setVolume(m_volume); m_audioSettings->reconnectAudioPath(&m_audioPath); connect(m_audioOutput, SIGNAL(volumeChanged(qreal)), this, SLOT(volumeChanged(qreal))); m_nowPlayingManager->connectPhononWidgets(); } } void BangarangApplication::processCommandLineArgs() { //Process command line arguments QList mediaList; bool itemLoaded = false; KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if (args->isSet("touch")) { m_touchIsEnabled = true; //Adjust interface to be more touch friendly mainWindow()->enableTouch(); audioSettings()->enableTouch(); videoSettings()->enableTouch(); } kDebug() << "TOUCH:" << args->isSet("touch"); if (args->isSet("play-dvd")) { //Play DVD QList dvds = DeviceManager::instance()->deviceList(DeviceManager::VideoType); if ( dvds.isEmpty() ) { kDebug() << "no DVD found"; m_nowPlayingManager->showErrorMessage(i18n("No DVD found")); } else { kDebug() << "playing DVD"; MediaItem mediaItem; mediaItem.title = i18n("DVD Video"); mediaItem.fields["title"]; mediaItem.url = QString("dvdvideo://%1" ).arg(dvds.at(0).udi()); mediaItem.type = "Category"; mediaList << mediaItem; itemLoaded = true; } } else if (args->isSet("play-cd")) { //Play CD QList cds = DeviceManager::instance()->deviceList(DeviceManager::AudioType); if ( cds.isEmpty() ) { kDebug() << "no CD found"; m_nowPlayingManager->showErrorMessage(i18n("No CD found")); } else { kDebug() << "playing CD"; MediaItem mediaItem; mediaItem.type = "Category"; mediaItem.title = i18n("Audio CD"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = QString( "cdaudio://%1" ).arg(cds.at(0).udi()); mediaList << mediaItem; itemLoaded = true; } } else { //Play Url(s) for(int i = 0; i < args->count(); i++) { KUrl cmdLineKUrl = args->url(i); MediaItem mediaItem = Utilities::mediaItemFromUrl(cmdLineKUrl); mediaList << mediaItem; itemLoaded = true; } } if (mediaList.count() > 0) { m_playlist->playMediaList(mediaList); } if (!itemLoaded) { m_savedListsManager->loadPlaylist(); } } bool BangarangApplication::isTouchEnabled() { return m_touchIsEnabled; } bangarang-bangarang/src/app/common/bangarangapplication.h000066400000000000000000000070251166760560600241110ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef BANGARANGAPPLICATION_H #define BANGARANGAPPLICATION_H #include #include #include #include #include class VideoSettings; class MediaListProperties; class MediaItemModel; class MediaListCache; class Playlist; class MediaListsManager; class InfoManager; class SavedListsManager; class ActionsManager; class BookmarksManager; class NowPlayingManager; class AudioSettings; class MainWindow; class BangarangNotifierItem; class MprisRootObject; class BangarangApplication : public KApplication { Q_OBJECT public: static const int TOUCH_TOUCHABLE_METRIC = 32; static const int TOUCH_VISUAL_METRIC = 22; ~BangarangApplication(); void setup(); MainWindow * mainWindow(); Phonon::MediaObject * mediaObject(); Phonon::MediaObject * newMediaObject(); Phonon::AudioOutput * audioOutput(); qreal volume(); Playlist * playlist(); MediaItemModel * browsingModel(); MediaListCache * sharedMediaListCache(); MediaListsManager* mediaListsManager(); InfoManager * infoManager(); SavedListsManager * savedListsManager(); ActionsManager * actionsManager(); NowPlayingManager* nowPlayingManager(); BookmarksManager * bookmarksManager(); BangarangNotifierItem * statusNotifierItem(); AudioSettings * audioSettings(); VideoSettings * videoSettings() { return m_videoSettings; } MprisRootObject * mprisRootObject(); KLocale * locale() { return m_locale; } const KAboutData * aboutData(); void processCommandLineArgs(); bool isTouchEnabled(); private: MainWindow * m_mainWindow; KLocale * m_locale; Phonon::MediaObject * m_mediaObject; Phonon::AudioOutput * m_audioOutput; Phonon::Path m_audioPath; Phonon::Path m_videoPath; qreal m_volume; Playlist * m_playlist; MediaItemModel * m_browsingModel; MediaListCache * m_sharedMediaListCache; MediaListsManager* m_mediaListsManager; InfoManager * m_infoManager; SavedListsManager * m_savedListsManager; NowPlayingManager* m_nowPlayingManager; ActionsManager * m_actionsManager; BookmarksManager * m_bookmarksManager; BangarangNotifierItem * m_statusNotifierItem; AudioSettings * m_audioSettings; VideoSettings * m_videoSettings; MprisRootObject * m_mprisRootObject; bool m_nepomukInited; bool m_touchIsEnabled; private slots: void handleNotifierStateRequest(Phonon::State state); void nowPlayingChanged(); void volumeChanged(qreal newVolume); void volumeChanged(int delta); }; #endif bangarang-bangarang/src/app/common/bangarangnotifieritem.cpp000066400000000000000000000032771166760560600246440ustar00rootroot00000000000000#include "bangarangnotifieritem.h" #include #include #include #include BangarangNotifierItem::BangarangNotifierItem(QObject* parent) : KStatusNotifierItem(parent) { setTitle(i18n("Bangarang")); setIconByName("bangarang-notifier"); setStandardActionsEnabled(false); connect(this, SIGNAL(scrollRequested(int,Qt::Orientation)), this, SLOT(handleScrollRequested(int,Qt::Orientation))); connect(this, SIGNAL(secondaryActivateRequested(QPoint)), this, SLOT(handleMiddleClick())); } BangarangNotifierItem::~BangarangNotifierItem() { } Phonon::State BangarangNotifierItem::state() const { return m_currentState; } void BangarangNotifierItem::setState(Phonon::State state) { if (m_currentState == state) return; m_currentState = state; if (m_currentState == Phonon::StoppedState) { setStatus(KStatusNotifierItem::Passive); setIconByName("bangarang-notifier"); } else if (m_currentState == Phonon::PausedState){ setStatus(KStatusNotifierItem::Active); setIconByName("bangarang-notifier-active-pause"); } else { setStatus(KStatusNotifierItem::Active); setIconByName("bangarang-notifier-active"); } } void BangarangNotifierItem::handleMiddleClick() { if (m_currentState == Phonon::PlayingState) emit changeStateRequested(Phonon::PausedState); else if (m_currentState == Phonon::PausedState) emit changeStateRequested(Phonon::PlayingState); } void BangarangNotifierItem::handleScrollRequested(int delta, Qt::Orientation orientation) { if (orientation == Qt::Vertical) emit changeVolumeRequested(delta/120); // else emit changeTrackRequested(delta/120); } bangarang-bangarang/src/app/common/bangarangnotifieritem.h000066400000000000000000000043061166760560600243030ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef BANGARANGNOTIFIERITEM_H #define BANGARANGNOTIFIERITEM_H #include #include #include /** * Bangarang KStatusNotifierIcon. * * Represents the app in the systray. * * If Phonon::State is playing or paused a respective overlay icon is shown. * * If the user performs an mouse scroll action on the icon, either a changeTrackRequest or * changeVolumeRequest is emitted. * If the icon recognizes a middle click the changeStateRequest will be emitted. * * @author Steve Fischer */ class BangarangNotifierItem : public KStatusNotifierItem { Q_OBJECT public: BangarangNotifierItem(QObject* parent = 0); virtual ~BangarangNotifierItem(); Phonon::State state() const; void setState(Phonon::State state); signals: /** * Inform the associated window that the state should changed either from playing to paused or * from paused to playing. * @param newState either 'Playing' or 'Paused' */ void changeStateRequested(Phonon::State newState); /** * Inform the associated window that the volume should be increased or decreased. * @param delta increase/decrease value */ void changeVolumeRequested(int delta); private: Phonon::State m_currentState; private slots: void handleMiddleClick(); void handleScrollRequested(int delta, Qt::Orientation orientation); }; #endif // BANGARANGNOTIFIERITEM_H bangarang-bangarang/src/app/common/dbusobjects.cpp000066400000000000000000000232431166760560600226070ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Ni Hui (shuizhuyuanluo@126.com) * * * 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 . */ #include "dbusobjects.h" #include "bangarangapplication.h" #include "mainwindow.h" #include "../../platform/playlist.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/utilities/mediaitems.h" #include #include #include #include QDBusArgument& operator<<(QDBusArgument& argument, const MprisStatusStruct& statusStruct) { argument.beginStructure(); argument << statusStruct.state; argument << statusStruct.random; argument << statusStruct.repeatTrack; argument << statusStruct.repeatPlaylist; argument.endStructure(); return argument; } const QDBusArgument& operator>>(const QDBusArgument& argument, MprisStatusStruct& statusStruct) { argument.beginStructure(); argument >> statusStruct.state; argument >> statusStruct.random; argument >> statusStruct.repeatTrack; argument >> statusStruct.repeatPlaylist; argument.endStructure(); return argument; } QDBusArgument& operator<<(QDBusArgument& argument, const MprisVersionStruct& versionStruct) { argument.beginStructure(); argument << versionStruct.major << versionStruct.minor; argument.endStructure(); return argument; } const QDBusArgument& operator>>(const QDBusArgument& argument, MprisVersionStruct& versionStruct) { argument.beginStructure(); argument >> versionStruct.major >> versionStruct.minor; argument.endStructure(); return argument; } MprisRootObject::MprisRootObject(QObject *parent) : QObject(parent) { qDBusRegisterMetaType(); m_metaDataFields << QPair("artist", "artist") << QPair("album", "album") << QPair("trackNumber", "tracknumber") << QPair("duration", "time") << QPair("genre", "genre") << QPair("rating", "rating") << QPair("year", "year") << QPair("artworkUrl", "arturl"); // TODO: more metadata } MprisRootObject::~MprisRootObject() { } QString MprisRootObject::Identity() { const KAboutData *aboutData = KGlobal::mainComponent().aboutData(); return aboutData->programName() + ' ' + aboutData->version(); } void MprisRootObject::Quit() { kapp->quit(); } MprisVersionStruct MprisRootObject::MprisVersion() { MprisVersionStruct versionStruct; versionStruct.major = 1; versionStruct.minor = 0; return versionStruct; } MprisPlayerObject::MprisPlayerObject(BangarangApplication *app_) : QObject(app_), m_app(app_) { qDBusRegisterMetaType(); connect(m_app->playlist()->nowPlayingModel(), SIGNAL(mediaListChanged()), this, SLOT(slotTrackChange())); connect(m_app->playlist(), SIGNAL(shuffleModeChanged(bool)), this, SLOT(slotStatusChange())); connect(m_app->playlist(), SIGNAL(repeatModeChanged(bool)), this, SLOT(slotStatusChange())); connect(m_app->playlist()->mediaObject(), SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(slotMediaStateChange(Phonon::State,Phonon::State))); } MprisPlayerObject::~MprisPlayerObject() { } void MprisPlayerObject::Next() { m_app->playlist()->playNext(); } void MprisPlayerObject::Prev() { m_app->playlist()->playPrevious(); } void MprisPlayerObject::Pause() { if (m_app->playlist()->mediaObject()->state() == Phonon::PlayingState) { m_app->playlist()->mediaObject()->pause(); } else { /// unpause may start the playlist as well when no media is paused Play(); } } void MprisPlayerObject::Stop() { m_app->playlist()->stop(); } void MprisPlayerObject::Play() { if (m_app->playlist()->mediaObject()->state() == Phonon::PausedState) { m_app->playlist()->mediaObject()->play(); } else if (m_app->playlist()->mediaObject()->state() != Phonon::PlayingState) { m_app->playlist()->start(); } } void MprisPlayerObject::Repeat(bool repeat) { m_app->playlist()->setRepeatMode(repeat); } MprisStatusStruct MprisPlayerObject::GetStatus() { MprisStatusStruct statusStruct; if (m_app->playlist()->mediaObject()->state() == Phonon::PausedState) { statusStruct.state = 1; } else if (m_app->playlist()->mediaObject()->state() == Phonon::PlayingState) { statusStruct.state = 0; } else { statusStruct.state = 2; } if (m_app->playlist()->shuffleMode()) { statusStruct.random = 1; } else { statusStruct.random = 0; } statusStruct.repeatTrack = 0; // FIXME track repeat not implemented yet if (m_app->playlist()->repeatMode()) { statusStruct.repeatPlaylist = 1; } else { statusStruct.repeatPlaylist = 0; } return statusStruct; } QVariantMap MprisPlayerObject::GetMetadata() { MediaItem item = m_app->playlist()->nowPlayingModel()->mediaItemAt(0); if ( item.type != "Audio" && item.type != "Video" ) return QVariantMap(); QVariantMap map; const MprisMetaDataFieldList & mdList = m_app->mprisRootObject()->metaDataFieldList(); map["location"] = item.url; map["title"] = item.title; for (int i = 0; i < mdList.count(); i++) { const QPair cur = mdList.at(i); QVariant value = item.fields.value(cur.first); if ( value.isValid() ) map[cur.second] = value; } return map; } int MprisPlayerObject::GetCaps() { int capabilities = (1 << 0) | // CAN_GO_NEXT (1 << 1) | // CAN_GO_PREV (1 << 3) | // CAN_PLAY (1 << 4) | // CAN_SEEK (1 << 5) | // CAN_PROVIDE_METADATA (1 << 6); // CAN_HAS_TRACKLIST if (m_app->playlist()->mediaObject()->state() == Phonon::PlayingState) { capabilities |= (1 << 2); // CAN_PAUSE } return capabilities; } void MprisPlayerObject::VolumeSet(int volume) { m_app->audioOutput()->setVolume(qreal(volume)/100); } int MprisPlayerObject::VolumeGet() { return static_cast(m_app->audioOutput()->volume()*100); } void MprisPlayerObject::PositionSet(int position) { m_app->playlist()->mediaObject()->seek(position); } int MprisPlayerObject::PositionGet() { return m_app->playlist()->mediaObject()->currentTime(); } void MprisPlayerObject::slotTrackChange() { emit TrackChange( GetMetadata() ); emit StatusChange( GetStatus() ); // also emit status change when track changes } void MprisPlayerObject::slotStatusChange() { emit StatusChange( GetStatus() ); } void MprisPlayerObject::slotMediaStateChange(Phonon::State newstate, Phonon::State oldstate) { if ( newstate == Phonon::PausedState || oldstate == Phonon::PausedState ) { emit StatusChange( GetStatus() ); return; } if ( newstate == Phonon::PlayingState || oldstate == Phonon::PlayingState ) { emit CapsChange( GetCaps() ); emit StatusChange( GetStatus() ); } } MprisTrackListObject::MprisTrackListObject(BangarangApplication *app_) : QObject(app_), m_app(app_) { connect(m_app->playlist()->playlistModel(), SIGNAL(mediaListChanged()), this, SLOT(slotTrackListChange())); } MprisTrackListObject::~MprisTrackListObject() { } QVariantMap MprisTrackListObject::GetMetadata(int index) { if ( index < 0 || index >= GetLength() || GetLength() == 0 ) return QVariantMap(); MediaItem item = m_app->playlist()->playlistModel()->mediaList().value(index); if ( item.type != "Audio" && item.type != "Video" ) return QVariantMap(); QVariantMap map; const MprisMetaDataFieldList & mdList = m_app->mprisRootObject()->metaDataFieldList(); map["location"] = item.url; map["title"] = item.title; for (int i = 0; i < mdList.count(); i++) { const QPair cur = mdList.at(i); QVariant value = item.fields.value(cur.first); if ( value.isValid() ) map[cur.second] = value; } return map; } int MprisTrackListObject::GetCurrentTrack() { return m_app->playlist()->rowOfNowPlaying(); } int MprisTrackListObject::GetLength() { return m_app->playlist()->nowPlayingModel()->rowCount(); } int MprisTrackListObject::AddTrack(const QString &url, bool playImmediately) { MediaItem item = Utilities::mediaItemFromUrl( KUrl( url ) ); m_app->playlist()->addMediaItem( item ); if (playImmediately) { int playlistIndex = m_app->playlist()->playlistModel()->rowCount() - 1; if (playlistIndex >=0) { m_app->playlist()->playItemAt(playlistIndex, Playlist::PlaylistModel); } } return 0; } void MprisTrackListObject::DelTrack(int index) { m_app->playlist()->removeMediaItemAt(index); } void MprisTrackListObject::SetLoop(bool loop) { m_app->playlist()->setRepeatMode(loop); } void MprisTrackListObject::SetRandom(bool random) { m_app->playlist()->setShuffleMode(random); } void MprisTrackListObject::slotTrackListChange() { emit TrackListChange( GetLength() ); } bangarang-bangarang/src/app/common/dbusobjects.h000066400000000000000000000066131166760560600222560ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Ni Hui (shuizhuyuanluo@126.com) * * * 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 . */ #ifndef DBUSOBJECTS_H #define DBUSOBJECTS_H #include #include class BangarangApplication; struct MprisStatusStruct; struct MprisVersionStruct; typedef QList< QPair > MprisMetaDataFieldList; class MprisRootObject : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.freedesktop.MediaPlayer") public: explicit MprisRootObject(QObject *parent); ~MprisRootObject(); const MprisMetaDataFieldList &metaDataFieldList() { return m_metaDataFields; } public Q_SLOTS: QString Identity(); void Quit(); MprisVersionStruct MprisVersion(); private: MprisMetaDataFieldList m_metaDataFields; }; class MprisPlayerObject : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.freedesktop.MediaPlayer") public: MprisPlayerObject(BangarangApplication *app_); ~MprisPlayerObject(); public Q_SLOTS: void Next(); void Prev(); void Pause(); void Stop(); void Play(); void Repeat(bool repeat); MprisStatusStruct GetStatus(); QVariantMap GetMetadata(); int GetCaps(); void VolumeSet(int volume); int VolumeGet(); void PositionSet(int position); int PositionGet(); Q_SIGNALS: void TrackChange(const QVariantMap &metadata); void StatusChange(const MprisStatusStruct &status); void CapsChange(int capabilities); private: BangarangApplication *m_app; private Q_SLOTS: void slotTrackChange(); void slotStatusChange(); void slotMediaStateChange(Phonon::State newstate, Phonon::State oldstate); }; class MprisTrackListObject : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.freedesktop.MediaPlayer") public: MprisTrackListObject(BangarangApplication *app_); ~MprisTrackListObject(); public Q_SLOTS: QVariantMap GetMetadata(int index); int GetCurrentTrack(); int GetLength(); int AddTrack(const QString &url, bool playImmediately); void DelTrack(int index); void SetLoop(bool loop); void SetRandom(bool random); Q_SIGNALS: void TrackListChange(int size); private: BangarangApplication *m_app; private Q_SLOTS: void slotTrackListChange(); }; struct MprisStatusStruct { int state; int random; int repeatTrack; int repeatPlaylist; }; Q_DECLARE_METATYPE(MprisStatusStruct) struct MprisVersionStruct { quint16 major; quint16 minor; }; Q_DECLARE_METATYPE(MprisVersionStruct) #endif // DBUSOBJECTS_H bangarang-bangarang/src/app/common/flickcharm.cpp000066400000000000000000000215761166760560600224120ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** ** This file is part of the Graphics Dojo project on Qt Labs. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 or 3.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and ** http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #include "flickcharm.h" #include #include #include #include #include #include #include #include #include struct FlickData { typedef enum { Steady, Pressed, ManualScroll, AutoScroll, Stop } State; State state; QWidget *widget; QPoint pressPos; QPoint offset; QPoint dragPos; QPoint speed; QList ignored; }; class FlickCharmPrivate { public: QHash flickData; QBasicTimer ticker; }; FlickCharm::FlickCharm(QObject *parent): QObject(parent) { d = new FlickCharmPrivate; } FlickCharm::~FlickCharm() { delete d; } void FlickCharm::activateOn(QWidget *widget) { QAbstractScrollArea *scrollArea = dynamic_cast(widget); if (scrollArea) { QWidget *viewport = scrollArea->viewport(); viewport->installEventFilter(this); scrollArea->installEventFilter(this); QList vpChildren = viewport->findChildren(); for (int j = 0; j < vpChildren.count(); j++) { vpChildren.at(j)->installEventFilter(this); } d->flickData.remove(viewport); d->flickData[viewport] = new FlickData; d->flickData[viewport]->widget = widget; d->flickData[viewport]->state = FlickData::Steady; return; } qWarning() << "FlickCharm only works on QAbstractScrollArea (and derived classes)"; } void FlickCharm::deactivateFrom(QWidget *widget) { QAbstractScrollArea *scrollArea = dynamic_cast(widget); if (scrollArea) { QWidget *viewport = scrollArea->viewport(); viewport->removeEventFilter(this); scrollArea->removeEventFilter(this); delete d->flickData[viewport]; d->flickData.remove(viewport); return; } } static QPoint scrollOffset(QWidget *widget) { int x = 0, y = 0; QAbstractScrollArea *scrollArea = dynamic_cast(widget); if (scrollArea) { x = scrollArea->horizontalScrollBar()->value(); y = scrollArea->verticalScrollBar()->value(); } return QPoint(x, y); } static void setScrollOffset(QWidget *widget, const QPoint &p) { QAbstractScrollArea *scrollArea = dynamic_cast(widget); if (scrollArea) { scrollArea->horizontalScrollBar()->setValue(p.x()); scrollArea->verticalScrollBar()->setValue(p.y()); } } static QPoint deaccelerate(const QPoint &speed, int a = 1, int max = 64) { int x = qBound(-max, speed.x(), max); int y = qBound(-max, speed.y(), max); x = (x == 0) ? x : (x > 0) ? qMax(0, x - a) : qMin(0, x + a); y = (y == 0) ? y : (y > 0) ? qMax(0, y - a) : qMin(0, y + a); return QPoint(x, y); } bool FlickCharm::eventFilter(QObject *object, QEvent *event) { if (!object->isWidgetType()) return false; QEvent::Type type = event->type(); if (type != QEvent::MouseButtonPress && type != QEvent::MouseButtonRelease && type != QEvent::MouseMove) return false; QMouseEvent *mouseEvent = dynamic_cast(event); if (!mouseEvent || mouseEvent->modifiers() != Qt::NoModifier) return false; bool isInArea = false; QWidget* viewport = 0; QWidget* widget = dynamic_cast(object); QWidget* widgetParent = dynamic_cast(object->parent()); for (int i = 0; i < d->flickData.keys().count(); i++) { viewport = d->flickData.keys().at(i); if (widget == viewport || widgetParent == viewport) { isInArea = true; break; } QList children = viewport->findChildren(); for (int j = 0; j < children.count(); j++) { if (widget == children.at(j) || widgetParent == children.at(j)) { isInArea = true; break; } } if (isInArea) { break; } } if (!isInArea) { return false; } FlickData *data = d->flickData.value(viewport); if (!viewport || !data || data->ignored.removeAll(event)) return false; bool consumed = false; switch (data->state) { case FlickData::Steady: if (mouseEvent->type() == QEvent::MouseButtonPress) if (mouseEvent->buttons() == Qt::LeftButton) { consumed = true; data->state = FlickData::Pressed; data->pressPos = viewport->mapFromGlobal(mouseEvent->globalPos()); data->offset = scrollOffset(data->widget); } break; case FlickData::Pressed: if (mouseEvent->type() == QEvent::MouseButtonRelease) { consumed = true; data->state = FlickData::Steady; QMouseEvent *event1 = new QMouseEvent(QEvent::MouseButtonPress, data->pressPos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QMouseEvent *event2 = new QMouseEvent(*mouseEvent); data->ignored << event1; data->ignored << event2; QApplication::postEvent(object, event1); QApplication::postEvent(object, event2); } if (mouseEvent->type() == QEvent::MouseMove) { consumed = true; data->state = FlickData::ManualScroll; data->dragPos = QCursor::pos(); if (!d->ticker.isActive()) d->ticker.start(20, this); } break; case FlickData::ManualScroll: if (mouseEvent->type() == QEvent::MouseMove) { consumed = true; QPoint delta = viewport->mapFromGlobal(mouseEvent->globalPos()) - data->pressPos; setScrollOffset(data->widget, data->offset - delta); } if (mouseEvent->type() == QEvent::MouseButtonRelease) { consumed = true; data->state = FlickData::AutoScroll; } break; case FlickData::AutoScroll: if (mouseEvent->type() == QEvent::MouseButtonPress) { consumed = true; data->state = FlickData::Stop; data->speed = QPoint(0, 0); data->pressPos = viewport->mapFromGlobal(mouseEvent->globalPos()); data->offset = scrollOffset(data->widget); } if (mouseEvent->type() == QEvent::MouseButtonRelease) { consumed = true; data->state = FlickData::Steady; data->speed = QPoint(0, 0); } break; case FlickData::Stop: if (mouseEvent->type() == QEvent::MouseButtonRelease) { consumed = true; data->state = FlickData::Steady; } if (mouseEvent->type() == QEvent::MouseMove) { consumed = true; data->state = FlickData::ManualScroll; data->dragPos = QCursor::pos(); if (!d->ticker.isActive()) d->ticker.start(20, this); } break; default: break; } return consumed; } void FlickCharm::timerEvent(QTimerEvent *event) { int count = 0; QHashIterator item(d->flickData); while (item.hasNext()) { item.next(); FlickData *data = item.value(); if (data->state == FlickData::ManualScroll) { count++; data->speed = QCursor::pos() - data->dragPos; data->dragPos = QCursor::pos(); } if (data->state == FlickData::AutoScroll) { count++; data->speed = deaccelerate(data->speed); QPoint p = scrollOffset(data->widget); setScrollOffset(data->widget, p - data->speed); if (data->speed == QPoint(0, 0)) data->state = FlickData::Steady; } } if (!count) d->ticker.stop(); QObject::timerEvent(event); } bangarang-bangarang/src/app/common/flickcharm.h000066400000000000000000000030071166760560600220440ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** ** This file is part of the Graphics Dojo project on Qt Labs. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 or 3.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and ** http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef FLICKCHARM_H #define FLICKCHARM_H #include class FlickCharmPrivate; class QWidget; class FlickCharm: public QObject { Q_OBJECT public: FlickCharm(QObject *parent = 0); ~FlickCharm(); void activateOn(QWidget *widget); void deactivateFrom(QWidget *widget); bool eventFilter(QObject *object, QEvent *event); protected: void timerEvent(QTimerEvent *event); private: FlickCharmPrivate *d; }; #endif // FLICKCHARM_H bangarang-bangarang/src/app/common/mainwindow.cpp000066400000000000000000000533331166760560600224570ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "mainwindow.h" #include "bangarangapplication.h" #include "bangarangnotifieritem.h" #include "actionsmanager.h" #include "ui_mainwindow.h" #include "../nowplaying/bangarangvideowidget.h" #include "../nowplaying/nowplayingmanager.h" #include "../medialists/medialistsmanager.h" #include "../medialists/infomanager.h" #include "../medialists/medialistsettings.h" #include "../../platform/utilities/utilities.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindowClass) { m_application = (BangarangApplication *)KApplication::kApplication(); ui->setupUi(this); m_audioListsStack = new AudioListsStack(0); m_videoListsStack = new VideoListsStack(0); KAcceleratorManager::setNoAccel(ui->audioListSelect); KAcceleratorManager::setNoAccel(ui->videoListSelect); //Set up menu hiding timer m_menuTimer = new QTimer(this); m_menuTimer->setInterval(3000); m_menuTimer->setSingleShot(true); connect(m_menuTimer, SIGNAL(timeout()), ui->floatingMenuHolder, SLOT(hide())); //Setup interface icons setupIcons(); // Hide certain widgets ui->previous->setVisible(false); ui->contextStackHolder->setVisible(false); ui->playSelected->setVisible(false); m_audioListsStack->ui->configureAudioList->setVisible(false); m_videoListsStack->ui->configureVideoList->setVisible(false); ui->semanticsHolder->setVisible(false); ui->loadingIndicator->setVisible(false); ui->extSubtitle->setVisible(false); ui->playbackMessage->setVisible(false); ui->notificationWidget->setVisible(false); ui->videoListsStackHolder->hide(); ui->videoListsSelectHolder->show(); ui->videoListLabel->hide(); ui->audioListsStackHolder->layout()->addWidget(m_audioListsStack); ui->audioListsStackHolder->show(); ui->audioListsSelectHolder->hide(); ui->audioListLabel->show(); //Initialize Nepomuk m_nepomukInited = Utilities::nepomukInited(); if (!m_nepomukInited) { ui->Filter->setVisible(false); } //Set up video widget m_videoWidget = new BangarangVideoWidget(ui->videoFrame); connect(m_videoWidget,SIGNAL(fullscreenChanged(bool)),this,SLOT(on_fullScreen_toggled(bool))); //Add video widget to video frame QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(m_videoWidget); layout->setContentsMargins(0,0,0,0); ui->videoFrame->setLayout(layout); ui->videoFrame->setFrameShape(QFrame::NoFrame); //Set up volume and seek slider ui->volumeSlider->setMuteVisible( false ); ui->seekSlider->setIconVisible(false); ui->seekTime->setToolButtonStyle(Qt::ToolButtonTextOnly); KAcceleratorManager::setNoAccel(ui->seekTime); //Set up playlist view ui->playlistView->setMainWindow(this); ui->playlistFilterProxyLine->lineEdit()->setClickMessage(QString()); ui->playlistFilter->setVisible(false); ui->playlistNotification->setVisible(false); ui->playlistNotificationNo->setText(i18n("No")); ui->playlistNotificationYes->setText(i18n("Yes")); //Setup Now Playing view ui->nowPlayingView->setMainWindow( this ); updateCustomColors(); connect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()), this, SLOT(updateCustomColors())); m_videoSize = Normal; ui->videoFrame->setVisible(false); ui->nowPlayingView->move(0,0); ui->nowPlayingView->resize(ui->nowPlayingHolder->size()); ui->videoFrame->move(0,0); ui->videoFrame->resize(ui->nowPlayingHolder->size()); KAcceleratorManager::setNoAccel(ui->showPlaylist); KAcceleratorManager::setNoAccel(ui->showPlaylist_2); //Setup Media List Settings m_mediaListSettings = new MediaListSettings(this); //Set up defaults ui->nowPlayingSplitter->setCollapsible(0,true); ui->nowPlayingSplitter->setCollapsible(1,false); ui->stackedWidget->setCurrentIndex((int) MainNowPlaying); ui->mediaViewHolder->setCurrentIndex(0); m_audioListsStack->ui->audioListsStack->setCurrentIndex(0); m_videoListsStack->ui->videoListsStack->setCurrentIndex(0); ui->contextStack->setCurrentIndex(0); ui->mediaPlayPause->setHoldDelay(1000); ui->listSummary->setFont(KGlobalSettings::smallestReadableFont()); ui->playlistDuration->setFont(KGlobalSettings::smallestReadableFont()); ui->playbackMessage->clear(); ui->collectionButton->setFocus(); //Install event filter for hiding widgets in Now Playing view ui->nowPlayingView->setMouseTracking(true); m_videoWidget->setMouseTracking(true); ui->nowPlayingView->viewport()->installEventFilter(this); m_videoWidget->installEventFilter(this); // Set up cursor hiding and context menu for videos. m_videoWidget->setFocusPolicy(Qt::ClickFocus); KCursor::setAutoHideCursor(m_videoWidget, true); } MainWindow::~MainWindow() { delete ui; } void MainWindow::completeSetup() { setupActions(); ui->playlistView->setupActions(); resetTabOrder(); } /*--------------- -- Accessors -- ---------------*/ AudioListsStack *MainWindow::audioListsStack() { return m_audioListsStack; } VideoListsStack *MainWindow::videoListsStack() { return m_videoListsStack; } MediaListSettings *MainWindow::mediaListSettings() { return m_mediaListSettings; } BangarangVideoWidget * MainWindow::videoWidget() { return m_videoWidget; } MainWindow::VideoSize MainWindow::videoSize() { return m_videoSize; } void MainWindow::setVideoSize(VideoSize size) { m_videoSize = size; if (m_videoSize == Normal) { ui->nowPlayingView->hideInfo(); QPoint topLeft = ui->videoFrame->mapToParent(ui->videoFrame->rect().topLeft()); QPropertyAnimation *animation = new QPropertyAnimation(ui->videoFrame, "geometry"); animation->setDuration(500); animation->setStartValue(QRect(topLeft, ui->videoFrame->size())); animation->setEndValue(ui->nowPlayingHolder->rect()); animation->setEasingCurve(QEasingCurve::InOutQuad); animation->start(); } else { int width = qMax(200, ui->nowPlayingHolder->width()/3); int height = qMax(150, width*3/4); int left = ui->nowPlayingHolder->width() - width - 20; int top = ui->nowPlayingHolder->height() - height - 20; QPropertyAnimation *animation = new QPropertyAnimation(ui->videoFrame, "geometry"); connect(animation, SIGNAL(finished()), ui->nowPlayingView, SLOT(showInfo())); animation->setDuration(500); animation->setStartValue(ui->videoFrame->rect()); animation->setEndValue(QRect(left, top, width, height)); animation->setEasingCurve(QEasingCurve::InOutQuad); animation->start(); } } /*--------------------- -- UI widget slots -- ----------------------*/ void MainWindow::on_nowPlayingHolder_resized() { ui->nowPlayingView->move(0,0); ui->nowPlayingView->resize(ui->nowPlayingHolder->size()); QFont extSubtitleFont = ui->extSubtitle->font(); extSubtitleFont.setPixelSize(qMax(int(ui->nowPlayingHolder->height()*0.045), KGlobalSettings::smallestReadableFont().pixelSize())); ui->extSubtitle->setFont(extSubtitleFont); ui->extSubtitle->setMaximumWidth(0.8*ui->nowPlayingHolder->width()); ui->extSubtitle->move((ui->nowPlayingHolder->width() - ui->extSubtitle->width())/2, ui->nowPlayingHolder->geometry().bottom() - 20 - ui->extSubtitle->height()); if (m_videoSize == Normal && !this->isFullScreen()) { ui->videoFrame->setGeometry(QRect(QPoint(0, 0), ui->nowPlayingHolder->size())); } else if (m_videoSize == Normal && this->isFullScreen()) { ui->videoFrame->setGeometry(QRect(QPoint(0, 0), QSize(ui->nowPlayingHolder->width(), this->height()))); } else { int width = qMax(200, ui->nowPlayingHolder->width()/3); int height = qMax(150, width*3/4); int left = ui->nowPlayingHolder->width() - width - 20; int top = ui->nowPlayingHolder->height() - height - 20; ui->videoFrame->setGeometry(left, top, width, height); } if (ui->contextStackHolder->isVisible()) { ui->floatingMenuHolder->setVisible(false); m_menuTimer->stop(); } else { QFontMetrics fm(ui->showPlaylist_2->font()); QRect textRect = fm.boundingRect(i18n("Playlist")); int width = textRect.width() + 36; ui->showPlaylist_2->setGeometry(QRect(ui->showPlaylist_2->rect().topLeft(), QSize(width, qMax(24, textRect.height() + 8)))); int left = ui->nowPlayingHolder->width() - (width + qMax(24, textRect.height() + 8)); ui->floatingMenuHolder->setGeometry(QRect(QPoint(left, 0), QSize(width + qMax(24, textRect.height() + 8), qMax(24, textRect.height() + 8)))); ui->floatingMenuHolder->setVisible(true); ui->floatingMenuHolder->raise(); m_menuTimer->start(); } } void MainWindow::on_nowPlaying_clicked() { switchMainWidget(MainNowPlaying); // Show Now Playing page } void MainWindow::on_collectionButton_clicked() { switchMainWidget(MainMediaList); // Show Collection page ui->collectionButton->setFocus(); } void MainWindow::on_showPlaylist_clicked() { if (ui->contextStackHolder->isVisible() && ui->contextStack->currentIndex() == 0) { ui->contextStackHolder->setVisible(false); } else { ui->contextStack->setCurrentIndex(0); ui->contextStackHolder->setVisible(true); QFrame *filter = currentFilterFrame(); KFilterProxySearchLine *line = currentFilterProxyLine(); if (filter->isVisible() && line->lineEdit()->text().isEmpty()) { m_application->actionsManager()->action("toggle_filter")->trigger(); } } m_application->actionsManager()->action("show_video_settings")->setText(i18n("Show video settings")); m_application->actionsManager()->action("show_audio_settings")->setText(i18n("Show audio settings")); m_application->actionsManager()->action("show_shortcuts_editor")->setText(i18n("Show shortcuts editor")); } void MainWindow::on_showPlaylist_2_clicked() { on_showPlaylist_clicked(); } void MainWindow::on_fullScreen_toggled(bool fullScreen) { if (fullScreen) { showFullScreen(); ui->widgetSet->setPalette(ui->contextStackHolder->palette()); ui->widgetSet->setAutoFillBackground(true); ui->fullScreen->setIcon(KIcon("view-restore")); ui->fullScreen->setToolTip(i18n("Fullscreen
Click to exit fullscreen")); ui->fullScreen->setChecked(true); ui->widgetSet->setVisible(false); } else { showNormal(); ui->widgetSet->setPalette(this->palette()); ui->widgetSet->setAutoFillBackground(false); ui->fullScreen->setIcon(KIcon("view-fullscreen")); ui->fullScreen->setToolTip(i18n("Show fullscreen")); ui->fullScreen->setChecked(false); if (m_application->actionsManager()->m_controlsVisible) { ui->widgetSet->setVisible(true); } } } void MainWindow::on_seekTime_clicked() { QPoint menuLocation = ui->seekTime->mapToGlobal(QPoint(0,ui->showMenu->height())); m_application->actionsManager()->bookmarksMenu()->popup(menuLocation); } void MainWindow::on_showMenu_clicked() { m_application->nowPlayingManager()->showMenu(); } void MainWindow::on_showMenu_2_clicked() { m_application->nowPlayingManager()->showMenu(); } void MainWindow::on_showMediaViewMenu_clicked() { m_application->mediaListsManager()->showMenu(); } /*---------------------- -- Helper functions -- ----------------------*/ void MainWindow::setupIcons() { //Main Window Icon setWindowIcon(KIcon("bangarang")); //Audio List Icons m_audioListsStack->ui->addAudioList->setIcon(KIcon("list-add")); m_audioListsStack->ui->removeAudioList->setIcon(KIcon("list-remove")); m_audioListsStack->ui->configureAudioList->setIcon(KIcon("configure")); m_audioListsStack->ui->saveAudioList->setIcon(KIcon("document-save")); m_audioListsStack->ui->aslsSave->setIcon(KIcon("document-save")); m_audioListsStack->ui->aslsExport->setIcon(KIcon("document-export")); m_audioListsStack->ui->semAConfigSave->setIcon(KIcon("document-save")); //Video List Icons m_videoListsStack->ui->addVideoList->setIcon(KIcon("list-add")); m_videoListsStack->ui->removeVideoList->setIcon(KIcon("list-remove")); m_videoListsStack->ui->configureVideoList->setIcon(KIcon("configure")); m_videoListsStack->ui->saveVideoList->setIcon(KIcon("document-save")); m_videoListsStack->ui->vslsSave->setIcon(KIcon("document-save")); m_videoListsStack->ui->vslsExport->setIcon(KIcon("document-export")); m_videoListsStack->ui->semVConfigSave->setIcon(KIcon("document-save")); //Media View Icons ui->seekTime->setIcon(KIcon("bookmarks-organize")); ui->playSelected->setIcon(KIcon("media-playback-start")); ui->playAll->setIcon(KIcon("media-playback-start")); ui->nowPlaying->setIcon(KIcon("tool-animator")); ui->closeMediaListFilter->setIcon(KIcon("dialog-close")); ui->infoIndexSelected->setIcon(KIcon("system-run")); ui->showInfoFetcherExpander->setIcon(KIcon("help-about")); ui->infoFetcherLink->setIcon(KIcon("emblem-symbolic-link")); //Now Playing View bottom bar ui->collectionButton->setIcon(KIcon("view-media-playlist")); ui->fullScreen->setIcon(KIcon("view-fullscreen")); ui->volumeIcon->setIcon(KIcon("speaker")); ui->mediaPlayPause->setIcon(KIcon("media-playback-start")); //Now Playing View top bar ui->showPlaylist->setIcon(KIcon("dialog-ok-apply")); ui->showPlaylist_2->setIcon(KIcon("dialog-ok-apply")); //Playlist View ui->repeat->setIcon(Utilities::turnIconOff(KIcon("bangarang-repeat"), QSize(22, 22))); ui->shuffle->setIcon(Utilities::turnIconOff(KIcon("bangarang-shuffle"), QSize(22, 22))); ui->showQueue->setIcon(Utilities::turnIconOff(KIcon("bangarang-preview"), QSize(22, 22))); ui->clearPlaylist->setIcon(Utilities::turnIconOff(KIcon("bangarang-clearplaylist"), QSize(22, 22))); ui->closePlaylistFilter->setIcon(KIcon("dialog-close")); ui->closePlaylistNotification->setIcon(KIcon("dialog-close")); //Audio settings ui->restoreDefaultAudioSettings->setIcon(KIcon("edit-undo")); ui->restoreDefaultVideoSettings->setIcon(KIcon("edit-undo")); } void MainWindow::setupActions() { ui->mediaPrevious->setDefaultAction(m_application->actionsManager()->action("play_previous")); ui->mediaNext->setDefaultAction(m_application->actionsManager()->action("play_next")); } bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (isFullScreen() && !m_application->isTouchEnabled() && currentMainWidget() == MainNowPlaying && event->type() == QEvent::MouseMove) { QMouseEvent * mouseEvent = (QMouseEvent *)event; QWidget* widget = (QWidget* )obj; if (widget->height() - mouseEvent->y() <= ui->widgetSet->height()) { //Show the widgets in the Now Playing view ui->widgetSet->setVisible(true); } else { //Hide the widgets in the Now Playing view ui->widgetSet->setVisible(false); } } //Show floating menu if (event->type() == QEvent::MouseMove) { if (!ui->contextStackHolder->isVisible()) { ui->floatingMenuHolder->setVisible(true); ui->floatingMenuHolder->raise(); QPoint pos = ((QMouseEvent *)event)->globalPos(); if (ui->floatingMenuHolder->rect().contains(ui->floatingMenuHolder->mapFromGlobal(pos))) { m_menuTimer->stop(); } else { m_menuTimer->start(); } } } // standard event processing return QObject::eventFilter(obj, event); } /*------------------------- -- Device Notifier Slots -- ---------------------------*/ void MainWindow::updateCustomColors() { //Update custom colors in Now Playing View QColor highlightColor = QApplication::palette().color(QPalette::Highlight); int r = highlightColor.red(); int g = highlightColor.green(); int b = highlightColor.blue(); QString styleSheet = QString("background-color: qlineargradient(spread:reflect, x1:0.494, y1:0, x2:0.505682, y2:1, stop:0 rgba(0, 0, 0, 0), stop:0.20 rgba(%1, %2, %3, 25), stop:0.5 rgba(%1, %2, %3, 55), stop:0.75 rgba(%1, %2, %3, 30), stop:1 rgba(0, 0, 0, 0)); color: rgb(255, 255, 255);").arg(r).arg(g).arg(b); ui->nowPlayingView->setStyleSheet(styleSheet); //Update custom colors in Media Lists View QPalette viewPalette = ui->mediaViewHolder->palette(); viewPalette.setColor(QPalette::Window, viewPalette.color(QPalette::Base)); ui->mediaListHolder->setPalette(viewPalette); ui->semanticsHolder->setPalette(viewPalette); viewPalette.setColor(QPalette::Window, palette().color(QPalette::Window)); ui->mediaListFilter->setPalette(viewPalette); viewPalette.setColor(QPalette::Window, viewPalette.color(QPalette::AlternateBase)); ui->infoFetcherExpander->setPalette(viewPalette); } QFrame* MainWindow::currentFilterFrame() { return (currentMainWidget() == MainMediaList) ? ui->mediaListFilter : ui->playlistFilter; } KFilterProxySearchLine* MainWindow::currentFilterProxyLine() { return (currentMainWidget() == MainMediaList) ? ui->mediaListFilterProxyLine : ui->playlistFilterProxyLine; } void MainWindow::switchMainWidget(MainWindow::MainWidget which) { ui->stackedWidget->setCurrentIndex((int) which); m_application->actionsManager()->updateToggleFilterText(); emit switchedMainWidget(which); } MainWindow::MainWidget MainWindow::currentMainWidget() { return (MainWidget) ui->stackedWidget->currentIndex(); } void MainWindow::enableTouch() { kDebug() << "ENABLING TOUCH"; int tTouchable = BangarangApplication::TOUCH_TOUCHABLE_METRIC; int tVisual = BangarangApplication::TOUCH_VISUAL_METRIC; ui->widgetSet->setMinimumHeight(48); ui->widgetSet->setMaximumHeight(48); ui->mediaListWidgetSet->setMinimumHeight(48); ui->mediaListWidgetSet->setMaximumHeight(48); ui->mediaListWidgetSet1->setMinimumHeight(48); ui->mediaListWidgetSet1->setMaximumHeight(48); ui->showMediaViewMenu->setMinimumSize(tTouchable, tTouchable); ui->audioListSelect->setMinimumSize(tTouchable, tTouchable); ui->videoListSelect->setMinimumSize(tTouchable, tTouchable); m_audioListsStack->enableTouch(); m_videoListsStack->enableTouch(); ui->Filter->setMinimumHeight(tTouchable); ui->closeMediaListFilter->setMinimumSize(tTouchable, tTouchable); ui->mediaListFilterProxyLine->setMinimumHeight(tTouchable); ui->mediaView->enableTouch(); m_application->infoManager()->enableTouch(); ui->playlistView->enableTouch(); ui->closePlaylistFilter->setMinimumSize(tTouchable, tTouchable); ui->playlistFilterProxyLine->setMinimumHeight(tTouchable); ui->nowPlayingView->enableTouch(); ui->fullScreen->setMinimumSize(tTouchable, tTouchable); ui->fullScreen->setIconSize(QSize(tVisual, tVisual)); ui->seekTime->setMinimumHeight(tTouchable); ui->volumeIcon->setMinimumSize(tTouchable, tTouchable); ui->volumeIcon->setIconSize(QSize(tVisual, tVisual)); ui->volumeSlider->setMaximumWidth(110); ui->volumeSlider->setMinimumWidth(110); ui->mediaPrevious->setMinimumSize(tTouchable + 8, tTouchable); ui->mediaNext->setMinimumSize(tTouchable + 8, tTouchable); ui->mediaPlayPause->setMinimumSize(50, 46); ui->mediaPlayPause->setIconSize(QSize(40, 40)); ui->clearPlaylist->setMinimumSize(tTouchable, tTouchable); ui->shuffle->setMinimumSize(tTouchable, tTouchable); ui->repeat->setMinimumSize(tTouchable, tTouchable); ui->showQueue->setMinimumSize(tTouchable, tTouchable); ui->showPlaylist->setMinimumHeight(tTouchable); ui->showPlaylist_2->setMinimumHeight(tTouchable); ui->showMenu->setMinimumSize(tTouchable, tTouchable); ui->showMenu_2->setMinimumSize(tTouchable, tTouchable); ui->floatingMenuHolder->setMinimumSize(tTouchable, tTouchable); ui->widgetSet->setPalette(ui->contextStackHolder->palette()); ui->widgetSet->setAutoFillBackground(true); } void MainWindow::resetTabOrder() { //Set Tab Order for Media Lists view QWidget* visibleList = m_audioListsStack->ui->audioLists; if (ui->videoListsStackHolder->isVisible()) { visibleList = m_videoListsStack->ui->videoLists; } setTabOrder(visibleList, ui->mediaView); } void MainWindow::toggleMainWidget() { if (currentMainWidget() == MainMediaList) { switchMainWidget(MainNowPlaying); } else { switchMainWidget(MainMediaList); } } void MainWindow::stopMenuTimer() { m_menuTimer->stop(); } bangarang-bangarang/src/app/common/mainwindow.h000066400000000000000000000065711166760560600221260ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include "../nowplaying/bangarangvideowidget.h" #include "../medialists/audiolistsstack.h" #include "../medialists/videolistsstack.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class MediaListSettings; class BangarangApplication; class KFilterProxySearchLine; namespace Ui { class MainWindowClass; } class MainWindow : public QMainWindow { Q_OBJECT public: enum ContextMenuSource{Default = 0, MediaList = 1, InfoBox = 2, Playlist = 3}; enum MainWidget{ MainMediaList = 0, MainNowPlaying = 1 }; enum VideoSize{Normal = 0, Mini = 1 }; MainWindow(QWidget *parent = 0); ~MainWindow(); void completeSetup(); AudioListsStack *audioListsStack(); VideoListsStack *videoListsStack(); MediaListSettings *mediaListSettings(); BangarangVideoWidget * videoWidget(); void setVideoSize(VideoSize size = Normal); VideoSize videoSize(); void switchMainWidget(MainWindow::MainWidget which); MainWidget currentMainWidget(); QFrame *currentFilterFrame(); KFilterProxySearchLine* currentFilterProxyLine(); void enableTouch(); void resetTabOrder(); void stopMenuTimer(); Ui::MainWindowClass *ui; signals: void switchedMainWidget(MainWindow::MainWidget which); public slots: void on_fullScreen_toggled(bool fullScreen); void toggleMainWidget(); private: void setupIcons(); void setupActions(); BangarangVideoWidget *m_videoWidget; QDateTime m_lastMouseMoveTime; bool m_nepomukInited; BangarangApplication * m_application; VideoSize m_videoSize; QTimer *m_menuTimer; AudioListsStack *m_audioListsStack; VideoListsStack *m_videoListsStack; MediaListSettings *m_mediaListSettings; private slots: void on_nowPlayingHolder_resized(); void on_nowPlaying_clicked(); void on_collectionButton_clicked(); void on_showPlaylist_clicked(); void on_showPlaylist_2_clicked(); void on_seekTime_clicked(); void on_showMenu_clicked(); void on_showMenu_2_clicked(); void on_showMediaViewMenu_clicked(); void updateCustomColors(); protected: bool eventFilter(QObject *obj, QEvent *event); }; #endif // MAINWINDOW_H bangarang-bangarang/src/app/common/mediaitemdelegate.cpp000066400000000000000000000631531166760560600237350ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "mediaitemdelegate.h" #include "bangarangapplication.h" #include "mainwindow.h" #include "../medialists/infomanager.h" #include "starrating.h" #include "../../platform/playlist.h" #include "../../platform/mediaindexer.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/utilities/utilities.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include MediaItemDelegate::MediaItemDelegate(QObject *parent) : QItemDelegate(parent) { m_application = (BangarangApplication *)KApplication::kApplication(); m_parent = (MainWindow *)parent; m_minRowHeight = 22; m_defaultIconSize = 22; m_heightPadding = 0; m_playlistIconSize = 16; m_categoryIconSize = 22; m_suppressSemanticComment = false; m_useProxy = false; m_starRatingSize = StarRating::Small; m_miniModeFont = KGlobalSettings::smallestReadableFont(); setRenderMode(NormalMode); m_actionIconPadding = m_padding; m_showPlaying = KIcon("media-playback-start"); m_showInPlaylist = KIcon("dialog-ok-apply"); m_categoryActionIcon = KIcon("bangarang-category-browse"); QImage image = KIcon("dialog-ok-apply").pixmap(32,32).toImage(); KIconEffect::toGray(image, 1.0); KIconEffect::semiTransparent(image); QPixmap pixmap(32, 32); pixmap.fill(Qt::transparent); QPainter pp(&pixmap); pp.drawImage(QPoint(0,0), image); pp.end(); m_showNotInPlaylist = KIcon(pixmap); m_removeFromPlaylist = KIcon("list-remove"); m_itemsThatNeedArtwork = new QList(); m_utilThread = new Utilities::Thread(this); connect(m_utilThread, SIGNAL(gotArtwork(QImage,MediaItem)), this, SLOT(gotArtwork(QImage,MediaItem))); m_nepomukInited = Utilities::nepomukInited(); if (m_nepomukInited) { m_mediaIndexer = new MediaIndexer(this); } } MediaItemDelegate::~MediaItemDelegate() { } void MediaItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItemV4 opt(option); QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); if (!(m_application->isTouchEnabled() && (option.state.testFlag(QStyle::State_MouseOver) && !option.state.testFlag(QStyle::State_Selected)))) { style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget); } if (index.column() != 0) return; //Determin basic information const int left = option.rect.left(); const int top = option.rect.top(); const int width = option.rect.width(); const int height = option.rect.height(); const int currentDuratingSpacer = duratingSpacer(&option.rect); QColor foregroundColor = (option.state.testFlag(QStyle::State_Selected))? option.palette.color(QPalette::HighlightedText):option.palette.color(QPalette::Text); QColor subColor = (option.state.testFlag(QStyle::State_Selected))? option.palette.color(QPalette::HighlightedText) : KColorScheme(QPalette::Active).foreground(KColorScheme::InactiveText).color(); QColor nowPlayingColor = option.palette.color(QPalette::Highlight); nowPlayingColor.setAlpha(70); //Determine item type QString subType; QString type = index.data(MediaItem::TypeRole).toString(); MediaItemModel * model = (MediaItemModel *) index.model(); int modelRow = index.row(); if (useProxy()) { MediaSortFilterProxyModel *proxyModel = (MediaSortFilterProxyModel *)index.model(); model = (MediaItemModel *)proxyModel->sourceModel(); modelRow = proxyModel->mapToSource(index).row(); } MediaItem mediaItem = model->mediaItemAt(modelRow); subType = mediaItem.subType(); bool hasSubTitle = false; if (index.data(MediaItem::SubTitleRole).isValid() || index.data(MediaItem::SemanticCommentRole).isValid()) { if (!index.data(MediaItem::SubTitleRole).toString().isEmpty() || !index.data(MediaItem::SemanticCommentRole).toString().isEmpty()) { hasSubTitle = true; } } bool isMediaItem = Utilities::isMedia(type); bool isCategory = Utilities::isCategory(type); bool isAction = type == "Action"; bool isMessage = type == "Message"; bool hasUrl = !index.data(MediaItem::UrlRole).toString().isEmpty(); bool exists = index.data(MediaItem::ExistsRole).toBool(); bool hasCustomArtwork = index.data(MediaItem::HasCustomArtworkRole).toBool(); //Create base pixmap QPixmap pixmap(width, height); pixmap.fill(Qt::transparent); QPainter p(&pixmap); p.translate(-option.rect.topLeft()); //Paint background for currently playing item bool isPlaying = false; if (m_application->playlist()->nowPlayingModel()->rowCount() > 0) { MediaItem nowPlayingItem = m_application->playlist()->nowPlayingModel()->mediaItemAt(0); if (nowPlayingItem.url == index.data(MediaItem::UrlRole).toString()) { isPlaying = true; hasCustomArtwork = false; QLinearGradient linearGrad(QPointF(left, top), QPointF(left+width, top)); linearGrad.setColorAt(0, nowPlayingColor); linearGrad.setColorAt(0.7, nowPlayingColor); linearGrad.setColorAt(1.0, Qt::transparent); QBrush brush(linearGrad); p.fillRect(left, top, width, height, brush); } } //Paint Icon int iconSize = m_iconSize; int topOffset = (height - iconSize) / 2; if (m_renderMode == NormalMode) { QIcon icon; if (isPlaying) { icon = m_showPlaying; } else { QPixmap artwork; if (subType == "Artist" || subType == "Album" || subType == "AudioGenre" || subType =="Audio Stream" || subType == "Audio Feed" || subType == "Movie" || subType == "VideoGenre" || subType == "Actor" || subType == "Director" || subType == "Video Feed" || subType == "TV Series" || subType == "TV Season" || subType == "TV Show") { if (Utilities::artworkIsInCache(mediaItem)) { artwork = Utilities::getArtworkFromMediaItem(mediaItem); } else if (artworkNeededIndex(mediaItem) == -1) { m_itemsThatNeedArtwork->append(mediaItem); getArtwork(); } } if (!artwork.isNull()) { icon = QIcon(artwork); hasCustomArtwork = true; } else { icon = index.data(Qt::DecorationRole).value(); } } iconSize = hasCustomArtwork ? height - 2: m_iconSize; topOffset = (height - iconSize) / 2; if (!icon.isNull()) { icon.paint(&p, left + topOffset, top + topOffset, iconSize, iconSize, Qt::AlignCenter, QIcon::Normal); } if (!exists) { KIcon("emblem-unmounted").paint(&p, left + m_padding, top + topOffset, 16, 16, Qt::AlignCenter, QIcon::Normal); } } //Paint text int textInner = m_textInner; if (hasCustomArtwork || m_renderMode == NormalMode) { textInner = topOffset + iconSize + m_padding; } QFont textFont; if (m_renderMode == NormalMode) { textFont = option.font; } else { textFont = m_miniModeFont; } int vAlign = (hasSubTitle && m_renderMode == NormalMode) ? Qt::AlignTop : Qt::AlignVCenter; int hAlign = (isAction || isMessage) ? Qt::AlignCenter : Qt::AlignLeft; int textWidth = width - textInner - m_padding - currentDuratingSpacer; int boxHeight = height - m_heightPadding; int boxTop = top + (height - boxHeight)/2; if (isAction || isMessage) { textWidth = width - textInner - m_padding; } if (m_renderMode == NormalMode && isCategory) { textWidth = width - textInner - m_padding - m_iconSize; } QString text = index.data(Qt::DisplayRole).toString(); QFontMetrics fm(textFont); text = fm.elidedText(text, Qt::ElideRight, textWidth); textFont.setItalic(isAction || isMessage); p.setFont(textFont); p.setPen(foregroundColor); p.drawText(left + textInner, boxTop+1, textWidth, boxHeight, vAlign | hAlign, text); if (hasSubTitle && m_renderMode == NormalMode) { p.setPen(subColor); QString subTitle = index.data(MediaItem::SubTitleRole).toString(); QString comment = m_suppressSemanticComment ? QString() : index.data(MediaItem::SemanticCommentRole).toString(); if (!comment.isEmpty()) { QString spacer = subTitle.isEmpty() ? QString() : QString(" "); QString comment = spacer + index.data(MediaItem::SemanticCommentRole).toString(); QFont commentFont = KGlobalSettings::smallestReadableFont(); commentFont.setItalic(true); QFontMetrics fmComment(commentFont); comment = fmComment.elidedText(comment, Qt::ElideRight, textWidth); p.setFont(commentFont); p.drawText(left + textInner, boxTop, textWidth, boxHeight, Qt::AlignBottom | Qt::AlignRight, comment); p.setFont(textFont); if (fmComment.width(comment) < textWidth) { subTitle = fm.elidedText(subTitle, Qt::ElideRight, textWidth - fmComment.width(comment)); } } else { subTitle = fm.elidedText(subTitle, Qt::ElideRight, textWidth); } p.drawText(left + textInner, boxTop, textWidth, boxHeight, Qt::AlignBottom | hAlign, subTitle); } //Paint duration if (isMediaItem && (m_renderMode == NormalMode || m_renderMode == MiniMode)) { QString duration = index.data(MediaItem::DurationRole).toString(); p.setPen(subColor); p.drawText(left + width - currentDuratingSpacer, boxTop+1, currentDuratingSpacer - addRmPlaylistRect(&option.rect).width(), boxHeight, //icon size = add to / remove from playlist icon Qt::AlignBottom | Qt::AlignRight, duration); } //Paint Rating if (m_renderMode == NormalMode || (m_renderMode == MiniRatingMode && (!option.state.testFlag(QStyle::State_MouseOver) || !isCategory))) { if ((m_nepomukInited) && (isMediaItem || !index.data(MediaItem::RatingRole).isNull()) && (subType != "CD Track") && (subType != "DVD Title") && hasUrl ) { int rating = (index.data(MediaItem::RatingRole).isValid()) ? index.data(MediaItem::RatingRole).toInt() : 0; QPoint topLeft = ratingRect(&option.rect).topLeft(); StarRating r = StarRating(rating, m_starRatingSize, topLeft); if (option.state.testFlag(QStyle::State_MouseOver) && !m_application->isTouchEnabled()) { r.setHoverAtPosition(m_view->mapFromGlobal(QCursor::pos())); } r.paint(&p); } } //Paint PlayCount if (m_renderMode == MiniPlayCountMode && !index.data(MediaItem::PlayCountRole).isNull() && (!option.state.testFlag(QStyle::State_MouseOver) || !isCategory)) { QString playCountText = QString("%1").arg(index.data(MediaItem::PlayCountRole).toInt()); p.drawText(left + width - currentDuratingSpacer, boxTop+1, currentDuratingSpacer - 1, boxHeight, Qt::AlignVCenter| Qt::AlignRight, playCountText); } //Paint Remove from playlist / add to playlist / category icon if (isMediaItem && hasUrl && m_renderMode == NormalMode) { //Paint add to playlist Icon int playlistRow = m_application->playlist()->playlistModel()->rowOfUrl(index.data(MediaItem::UrlRole).value()); QIcon icon; if (playlistRow != -1) { if (option.state.testFlag(QStyle::State_MouseOver) && !m_application->isTouchEnabled()) { icon = m_removeFromPlaylist; } else { icon = m_showInPlaylist; } } else { if (option.state.testFlag(QStyle::State_MouseOver) && !m_application->isTouchEnabled()) { icon = m_showNotInPlaylist; } else if (m_application->isTouchEnabled()) { QPixmap cboxpixmap(32, 32); cboxpixmap.fill(Qt::transparent); QPainter pp(&cboxpixmap); pp.setPen(Qt::gray); pp.drawRoundedRect(5, 5, 22, 22, 4.0, 4.0); pp.end(); icon = QIcon(cboxpixmap); } else { icon = KIcon(); } } int topOffset = (height - m_playlistIconSize) / 2; int leftOffset = addRmPlaylistRect(&option.rect).left() - left + m_actionIconPadding; icon.paint(&p, left + leftOffset, top + topOffset, m_playlistIconSize, m_playlistIconSize, Qt::AlignCenter, QIcon::Normal); } else if (isCategory && hasUrl && (m_renderMode == NormalMode || (m_renderMode != NormalMode && option.state.testFlag(QStyle::State_MouseOver) && !m_application->isTouchEnabled()))) { //Paint Category Icon int topOffset = (height - m_categoryIconSize) / 2; int leftOffset = categoryIconRect(&option.rect).left() - left + m_actionIconPadding; m_categoryActionIcon.paint(&p, left + leftOffset, top + topOffset, m_categoryIconSize, m_categoryIconSize, Qt::AlignLeft, QIcon::Normal); } p.end(); //Draw finished pixmap painter->drawPixmap(option.rect.topLeft(), pixmap); } QSize MediaItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { Q_UNUSED(option); Q_UNUSED(index); return QSize(0, calcItemHeight()); } int MediaItemDelegate::calcItemHeight() const { QFont titleFont; titleFont.setBold(true); int textHeight; int minHeight; int padding; if (m_renderMode == NormalMode || m_renderMode == MiniAlbumMode) { textHeight = 2 * QFontInfo(titleFont).pixelSize(); // Height for title and subtitle minHeight = m_minRowHeight; padding = 3; } else { titleFont = m_miniModeFont; textHeight = QFontInfo(titleFont).pixelSize()+4; // Height for title minHeight = 0; padding = 2; } return qMax(textHeight, minHeight) + padding * 2 + 1; } int MediaItemDelegate::columnWidth (int column, int viewWidth) const { Q_UNUSED(column); return viewWidth; } bool MediaItemDelegate::editorEvent( QEvent *event, QAbstractItemModel *_model, const QStyleOptionViewItem &option, const QModelIndex &_index) { static bool s_mouseOverRating = false; QEvent::Type eventType = event->type(); QModelIndex index; MediaItemModel *model; QPoint mousePos = ((QMouseEvent *)event)->pos(); //if we use a proxy the index is from the proxy, not from the MediaItemModel which we need if (useProxy()) { MediaSortFilterProxyModel * proxy = (MediaSortFilterProxyModel *) _model; model = (MediaItemModel *) proxy->sourceModel(); index = proxy->mapToSource(_index); } else { model = (MediaItemModel *) _model; index = _index; } QString url = index.data(MediaItem::UrlRole).toString(); QString type = index.data(MediaItem::TypeRole).toString(); if (index.column() != 0) //by default it only has the first column goto no_special_event; /* Upcoming behaviour: * 1. check for the type of the item * 2. if exist, check for special regions (rating, "buttons") * 3. if they offer different behaviour, check for special events */ if (Utilities::isAction(type)) { //no special areas, check event if (event->type() == QEvent::MouseButtonPress) { emit actionActivated(index); } return true; } else if (Utilities::isMessage(type)) { //do nothing return true; } else if (Utilities::isCategory(type)) { if(url.isEmpty()) { goto no_special_event; } QRect curArea = addRmPlaylistRect(&option.rect); //doubleclick on the item or click on the "add to/remove from playlist" area if ((eventType == QEvent::KeyPress && ((QKeyEvent *)event)->key() == Qt::Key_Right) || (eventType == QEvent::MouseButtonDblClick) || (eventType == QEvent::MouseButtonPress && curArea.contains(mousePos) && (m_renderMode == NormalMode || (m_renderMode != NormalMode && !m_application->isTouchEnabled())))) { emit categoryActivated(index); return true; } } else if (Utilities::isMedia(type)) { if (url.isEmpty()) { goto no_special_event; } //check for rating region QRect curArea = ratingRect(&option.rect); if (curArea.contains(mousePos) && !m_application->isTouchEnabled()) { //check for events/if it's useful if (!m_nepomukInited || (eventType != QEvent::MouseButtonRelease && eventType != QEvent::MouseMove) || (m_renderMode != NormalMode && m_renderMode != MiniRatingMode) ) { goto no_special_event; } if (!s_mouseOverRating) {//mouse entered s_mouseOverRating = true; } if (eventType == QEvent::MouseMove) //mouse over { m_view->update(index); return true; } //else the user clicked, so we have to save the new rating int rating = StarRating::RatingAtPosition(mousePos, m_starRatingSize, curArea.topLeft()); MediaItemModel *cmodel = model; //models have to be update #define MODELS_TO_BE_UPDATED 5 MediaItemModel *models[MODELS_TO_BE_UPDATED] = { cmodel, m_application->playlist()->playlistModel(), m_application->playlist()->queueModel(), m_application->playlist()->nowPlayingModel(), m_application->browsingModel() }; MediaItem updatedItem = cmodel->mediaItemAt(index.row()); m_mediaIndexer->updateRating(updatedItem.fields["resourceUri"].toString(),rating); for (int i = 0; i < MODELS_TO_BE_UPDATED; cmodel = models[++i]) { int row = cmodel->rowOfUrl(url); if (row >= 0) { MediaItem update = cmodel->mediaItemAt(row); update.fields["rating"] = rating; cmodel->replaceMediaItemAt(row, update); } } #undef MODELS_TO_BE_UPDATED m_application->infoManager()->loadSelectedInfo(); return true; } else { if (s_mouseOverRating) { //onLeave effect s_mouseOverRating = false; m_view->update(index); return true; } } //remove from/add to playlist area curArea = addRmPlaylistRect(&option.rect); if (curArea.contains(mousePos)) { if (eventType == QEvent::MouseButtonPress && m_renderMode == NormalMode ) { //clicked on the icon int playlistRow = m_application->playlist()->playlistModel()->rowOfUrl(index.data(MediaItem::UrlRole).value()); if (playlistRow != -1) { m_application->playlist()->removeMediaItemAt(playlistRow); } else { m_application->playlist()->addMediaItem(model->mediaItemAt(index.row())); } return true; } } } no_special_event: return QItemDelegate::editorEvent(event, model, option, index); } void MediaItemDelegate::setView(QAbstractItemView * view) { m_view = view; m_defaultViewSelectionMode = view->selectionMode(); } void MediaItemDelegate::setRenderMode(RenderMode mode) { m_renderMode = mode; if (mode == NormalMode || mode == MiniAlbumMode) { m_padding = 3; m_iconSize = m_defaultIconSize; } else { m_padding = 2; m_iconSize = 0; } m_textInner = m_iconSize == 0 ? m_padding : m_iconSize + 2 * m_padding; if (m_renderMode != NormalMode) { m_actionIconPadding = 2; m_categoryIconSize = 18; } } QRect MediaItemDelegate::ratingRect(const QRect *rect) const { QSize sz = StarRating::SizeHint(m_starRatingSize); QPoint p = QPoint(rect->left() + rect->width() - duratingSpacer(rect), rect->top() + m_padding); return QRect(p, sz); } int MediaItemDelegate::duratingSpacer(const QRect *rect) const { if (m_renderMode == NormalMode || m_renderMode == MiniRatingMode || m_renderMode == MiniMode) { return StarRating::SizeHint(m_starRatingSize).width() + addRmPlaylistRect(rect).width(); } else if (m_renderMode == MiniPlayCountMode) { return 35; } else { return 0; } } QRect MediaItemDelegate::addRmPlaylistRect(const QRect* rect) const { if (m_renderMode == NormalMode) { QPoint p = QPoint(rect->left() + rect->width() - m_playlistIconSize - 2 * m_actionIconPadding, rect->top() + m_padding); return QRect(p, QSize(m_playlistIconSize + 2 * m_actionIconPadding, rect->height())); } else { QPoint p = QPoint(rect->left() + rect->width() - 18, rect->top() + m_padding); return QRect(p, QSize(18, 18)); } } QRect MediaItemDelegate::categoryIconRect(const QRect* rect) const { if (m_renderMode == NormalMode) { QPoint p = QPoint(rect->left() + rect->width() - m_categoryIconSize - 2 * m_actionIconPadding, rect->top() + m_padding); return QRect(p, QSize(m_categoryIconSize + 2 * m_actionIconPadding, rect->height())); } else { QPoint p = QPoint(rect->left() + rect->width() - m_categoryIconSize - 2 * m_actionIconPadding, rect->top() + (rect->height() - m_categoryIconSize)/2); return QRect(p, QSize(m_categoryIconSize, m_categoryIconSize)); } } MediaItemDelegate::RenderMode MediaItemDelegate::currentRenderMode() { return m_renderMode; } int MediaItemDelegate::heightForAllRows() { return m_view->model()->rowCount()*(calcItemHeight())+10; } void MediaItemDelegate::setUseProxy(bool b) { m_useProxy = b; } void MediaItemDelegate::setSuppressSemanticComment(bool suppress) { m_suppressSemanticComment = suppress; } bool MediaItemDelegate::suppressSemanticComment() { return m_suppressSemanticComment; } int MediaItemDelegate::artworkNeededIndex(const MediaItem &mediaItem) const { int foundIndex = -1; for (int i = 0; i < m_itemsThatNeedArtwork->count(); i++) { MediaItem item = m_itemsThatNeedArtwork->at(i); if (item.url == mediaItem.url) { foundIndex = i; break; } } return foundIndex; } void MediaItemDelegate::getArtwork() const { if (!m_utilThread->isRunning() && !m_itemsThatNeedArtwork->isEmpty()) { MediaItem mediaItem = m_itemsThatNeedArtwork->first(); m_utilThread->getArtworkFromMediaItem(mediaItem); } } void MediaItemDelegate::gotArtwork(const QImage &artwork, const MediaItem &mediaItem) { //Find mediaItem and remove from list int foundIndex = artworkNeededIndex(mediaItem); if (foundIndex != -1) { m_itemsThatNeedArtwork->removeAt(foundIndex); } //Determine index to update if (!artwork.isNull()) { QModelIndex index; if (m_useProxy) { MediaSortFilterProxyModel *proxyModel = (MediaSortFilterProxyModel *)m_view->model(); MediaItemModel *model = (MediaItemModel *)proxyModel->sourceModel(); int row = model->rowOfUrl(mediaItem.url); index = proxyModel->mapFromSource(model->index(row, 0)); } else { MediaItemModel * model = (MediaItemModel *) index.model(); int row = model->rowOfUrl(mediaItem.url); index = model->index(row, 0); } m_view->update(index); } //Get artwork for next item if (m_utilThread->wait() && !m_itemsThatNeedArtwork->isEmpty()) { MediaItem mediaItem = m_itemsThatNeedArtwork->first(); m_utilThread->getArtworkFromMediaItem(mediaItem); } } void MediaItemDelegate::enableTouch() { m_minRowHeight = BangarangApplication::TOUCH_TOUCHABLE_METRIC; m_defaultIconSize = BangarangApplication::TOUCH_TOUCHABLE_METRIC; m_heightPadding = 4; m_starRatingSize = StarRating::Medium; m_playlistIconSize = 22; m_categoryIconSize = 22; m_miniModeFont = KGlobalSettings::generalFont(); setRenderMode(m_renderMode); m_actionIconPadding = 10; } bangarang-bangarang/src/app/common/mediaitemdelegate.h000066400000000000000000000103331166760560600233720ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIAITEMDELEGATE_H #define MEDIAITEMDELEGATE_H #include "../../platform/mediaitemmodel.h" #include #include #include #include #include #include #include class MainWindow; class MediaIndexer; class BangarangApplication; namespace Utilities { class Thread; } /* * This Item Delegate is responsible for painting items in a * MediaItemModel for a View. It is also responsible for communicating ui * events to the model to activate categories or actions, etc. * */ class MediaItemDelegate : public QItemDelegate { Q_OBJECT public: enum RenderMode {NormalMode = 0, MiniMode = 1, MiniPlaybackTimeMode = 2, MiniRatingMode = 3, MiniPlayCountMode = 4, MiniAlbumMode = 5}; MediaItemDelegate(QObject * parent = 0); ~MediaItemDelegate(); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; int columnWidth (int column, int viewWidth) const; bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& _index); void setView(QAbstractItemView * view); void setRenderMode(MediaItemDelegate::RenderMode mMode); MediaItemDelegate::RenderMode currentRenderMode(); int heightForAllRows(); void setUseProxy(bool b = true); bool useProxy() const { return m_useProxy; } void setSuppressSemanticComment(bool suppress); bool suppressSemanticComment(); QRect ratingRect(const QRect *rect) const; QRect addRmPlaylistRect(const QRect *rect) const; QRect categoryIconRect(const QRect* rect) const; void enableTouch(); protected: MediaItemModel *mediaItemModelFromIndex(const QModelIndex* index) const; private: BangarangApplication * m_application; MainWindow * m_parent; QAbstractItemView * m_view; QAbstractItemView::SelectionMode m_defaultViewSelectionMode; QPixmap m_ratingCount; QPixmap m_ratingNotCount; KIcon m_showPlaying; KIcon m_showInPlaylist; KIcon m_showNotInPlaylist; KIcon m_removeFromPlaylist; KIcon m_categoryActionIcon; int calcItemHeight() const; bool m_nepomukInited; bool m_useProxy; MediaIndexer * m_mediaIndexer; MediaItemDelegate::RenderMode m_renderMode; int m_starRatingSize; int m_padding; int m_iconSize; int m_textInner; Utilities::Thread * m_utilThread; QList *m_itemsThatNeedArtwork; bool m_suppressSemanticComment; int m_minRowHeight; int m_defaultIconSize; int m_heightPadding; int m_playlistIconSize; int m_categoryIconSize; int m_actionIconPadding; QFont m_miniModeFont; int artworkNeededIndex(const MediaItem &mediaItem) const; int duratingSpacer(const QRect *rect) const; Q_SIGNALS: void categoryActivated(QModelIndex index); void actionActivated(QModelIndex index); private Q_SLOTS: void getArtwork() const; void gotArtwork(const QImage &artwork, const MediaItem &mediaItem); }; #endif // MEDIAITEMDELEGATE_H bangarang-bangarang/src/app/common/mediaview.cpp000066400000000000000000000150151166760560600222500ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "mediaview.h" #include "bangarangapplication.h" #include "mainwindow.h" #include "actionsmanager.h" #include "flickcharm.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/utilities/utilities.h" #include #include #include #include #include MediaView::MediaView(QWidget * parent):QTreeView (parent) { m_application = (BangarangApplication *)KApplication::kApplication(); m_proxyModel = new MediaSortFilterProxyModel(); setModel(m_proxyModel); m_mediaItemModel = new MediaItemModel(parent); setSourceModel(m_mediaItemModel); m_mode = MediaItemDelegate::NormalMode; connect(m_mediaItemModel, SIGNAL(mediaListChanged()), this, SLOT(mediaListChanged())); setHeaderHidden(true); setRootIsDecorated(false); setFrameShape(QFrame::NoFrame); setFrameShadow(QFrame::Plain); setAlternatingRowColors(true); setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); } MediaView::~MediaView() { } void MediaView::setMainWindow(MainWindow * mainWindow) { m_mediaItemDelegate = new MediaItemDelegate(mainWindow); m_mediaItemDelegate->setUseProxy(true); setItemDelegate(m_mediaItemDelegate); m_mediaItemDelegate->setView(this); setDragEnabled(true); connect(this, SIGNAL(categoryActivated(QModelIndex)), m_mediaItemDelegate, SIGNAL(categoryActivated(QModelIndex))); } void MediaView::setMode(MediaItemDelegate::RenderMode mode) { m_mode = mode; m_mediaItemDelegate->setRenderMode(mode); } MediaItemDelegate::RenderMode MediaView::mode() { return m_mode; } void MediaView::setSourceModel(QAbstractItemModel * mediaItemModel) { m_mediaItemModel = (MediaItemModel *)mediaItemModel; connect(m_mediaItemModel, SIGNAL(mediaListChanged()), this, SLOT(mediaListChanged())); m_proxyModel->setSourceModel((QAbstractItemModel *) m_mediaItemModel); } void MediaView::contextMenuEvent(QContextMenuEvent * event) { if (selectionModel()->selectedIndexes().count() != 0) { //NOTE:The context menu source determination here depends on mini modes only being used for infoboxes. MainWindow::ContextMenuSource contextMenuSource; if (m_mode == MediaItemDelegate::NormalMode) { contextMenuSource = MainWindow::MediaList; } else { contextMenuSource = MainWindow::InfoBox; } bool showAbout = false; QMenu * menu = m_application->actionsManager()->mediaViewMenu(showAbout, contextMenuSource); menu->exec(event->globalPos()); } } void MediaView::mediaListChanged() { if (m_mediaItemModel->rowCount() > 0 && (m_mode == MediaItemDelegate::NormalMode || m_mode == MediaItemDelegate::MiniAlbumMode)) { header()->setStretchLastSection(true); } else if (m_mode != MediaItemDelegate::NormalMode) { if (m_mediaItemModel->rowCount() > 0 && m_mode != MediaItemDelegate::MiniAlbumMode) { header()->setStretchLastSection(true); header()->setResizeMode(QHeaderView::ResizeToContents); } int height = m_mediaItemDelegate->heightForAllRows(); setMinimumHeight(height); setMaximumHeight(height); //Add more info to each tooltip in mini modes QList mediaList = m_mediaItemModel->mediaList(); for (int i = 0; i < mediaList.count(); i++) { const MediaItem& mi = mediaList.at(i); QString tooltip = QString("%1").arg(mi.title); if (!mi.subTitle.isEmpty()) { tooltip += QString("
%1").arg(mi.subTitle); } if (!mi.semanticComment.isEmpty()) { tooltip += QString("
%3").arg(mi.semanticComment); } m_mediaItemModel->item(i)->setData(tooltip, Qt::ToolTipRole); } } } bool MediaView::viewportEvent(QEvent* event) { if (event->type() == QEvent::ToolTip) { QHelpEvent *helpEvent = static_cast(event); QPoint mousePos = helpEvent->pos(); QModelIndex index = indexAt(mousePos); QRect visRect = visualRect(index); QRect area = m_mediaItemDelegate->addRmPlaylistRect(&visRect); if (area.contains(mousePos)) { QString url = index.data(MediaItem::UrlRole).toString(); QString type = index.data(MediaItem::TypeRole).toString(); if (!url.isEmpty()) { QString tipText; if (Utilities::isMedia(type)) { tipText = i18n("Add to playlist/Remove from playlist"); } else if (Utilities::isCategory(type)) { if (url.startsWith("music://songs")) { tipText = i18n( "Show Songs" ); } else if (url.startsWith("music://albums")) { tipText = i18n( "Show Albums" ); } else if (url.startsWith("music://artists")) { tipText = i18n( "Show Artists" ); } } if ( !tipText.isEmpty() ) { QToolTip::showText(helpEvent->globalPos(), tipText, this, area); return true; } } } } return QTreeView::viewportEvent(event); } void MediaView::enableTouch() { FlickCharm *charm = new FlickCharm(this); charm->activateOn(this); this->setDragEnabled(false); m_mediaItemDelegate->enableTouch(); } void MediaView::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Right) { QModelIndexList selectedRows = selectionModel()->selectedRows(); if (selectedRows.count() > 0) { QModelIndex sourceIndex = filterProxyModel()->mapToSource(selectedRows.at(0)); emit categoryActivated(sourceIndex); } } QTreeView::keyPressEvent(event); } bangarang-bangarang/src/app/common/mediaview.h000066400000000000000000000045471166760560600217250ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIAVIEW_H #define MEDIAVIEW_H #include #include #include #include "mediaitemdelegate.h" class MainWindow; class MediaItemModel; class BangarangApplication; class MediaSortFilterProxyModel; class QSortFilterProxyModel; /* * This class is mostly to provide custom context menus for the QTreeView * used to display media lists. */ class MediaView : public QTreeView { Q_OBJECT public: MediaView(QWidget * parent = 0); ~MediaView(); void setMainWindow(MainWindow * mainWindow); void setMode(MediaItemDelegate::RenderMode Mode); MediaItemDelegate::RenderMode mode(); void setSourceModel(QAbstractItemModel * mediaItemModel); MediaItemModel *sourceModel() { return m_mediaItemModel; } QSortFilterProxyModel *filterProxyModel() { return (QSortFilterProxyModel *) m_proxyModel; } void enableTouch(); Q_SIGNALS: void categoryActivated(QModelIndex index); protected: void contextMenuEvent(QContextMenuEvent * event); bool viewportEvent(QEvent * event); void keyPressEvent(QKeyEvent *event); private: BangarangApplication * m_application; MediaItemModel * m_mediaItemModel; MediaItemDelegate * m_mediaItemDelegate; MediaSortFilterProxyModel *m_proxyModel; MediaItemDelegate::RenderMode m_mode; QAction * playAllAction; QAction * playSelectedAction; QAction * addSelectedToPlayListAction; QAction * removeSelectedToPlayListAction; private slots: void mediaListChanged(); }; #endif // MEDIAVIEW_H bangarang-bangarang/src/app/common/ratingdelegate.cpp000066400000000000000000000042021166760560600232510ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "ratingdelegate.h" #include "starrating.h" #include RatingDelegate::RatingDelegate(QObject *parent) : QItemDelegate(parent) { } void RatingDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItemV4 opt(option); QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget); const int left = option.rect.left(); const int top = option.rect.top(); const int width = option.rect.width(); const int height = option.rect.height(); if (index.column() != 0) return; //Create base pixmap QPixmap pixmap(width, height); pixmap.fill(Qt::transparent); QPainter p(&pixmap); p.translate(-option.rect.topLeft()); //Paint rating int rating = index.data(Qt::UserRole).toInt(); StarRating starRating = StarRating(rating, StarRating::Medium); starRating.setRating(rating); QSize ratingSize = starRating.sizeHint(); int ratingLeft = left + 2; int ratingTop = top + (height - ratingSize.height())/2; QRect ratingRect = QRect(QPoint(ratingLeft, ratingTop), ratingSize); starRating.setPoint(ratingRect.topLeft()); starRating.paint(&p); p.end(); //Draw finished pixmap painter->drawPixmap(option.rect.topLeft(), pixmap); } bangarang-bangarang/src/app/common/ratingdelegate.h000066400000000000000000000021061166760560600227170ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef RATINGDELEGATE_H #define RATINGDELEGATE_H #include class RatingDelegate : public QItemDelegate { Q_OBJECT public: RatingDelegate(QObject *parent = 0); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; #endif // RATINGDELEGATE_H bangarang-bangarang/src/app/common/sensiblewidgets.cpp000066400000000000000000000135071166760560600234750ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "sensiblewidgets.h" #include "ratingdelegate.h" #include "starrating.h" #include #include #include SToolButton::SToolButton(QWidget * parent):QToolButton (parent) { m_hoverDelay = 0; m_timer = new QTimer(this); connect(this, SIGNAL(pressed()), this, SLOT(pressedEvent())); connect(this, SIGNAL(released()), this, SLOT(releasedEvent())); } SToolButton::~SToolButton() { delete m_timer; } void SToolButton::setHoverDelay(int i) { m_hoverDelay = i; } int SToolButton::hoverDelay() { return m_hoverDelay; } void SToolButton::enterEvent(QEvent *event) { Q_UNUSED(event); m_hovered = true; if (m_hoverDelay > 0) { QTimer::singleShot(m_hoverDelay, this, SLOT(hoverTimeout())); } else { emit this->entered(); } } void SToolButton::leaveEvent(QEvent *event) { Q_UNUSED(event); m_hovered = false; emit this->exited(); } void SToolButton::hoverTimeout() { if (m_hovered) { emit this->entered(); } } void SToolButton::setHoldDelay(int i) { m_holdDelay = i; } int SToolButton::holdDelay() { return m_holdDelay; } void SToolButton::pressedEvent() { m_pressed = true; if (m_holdDelay > 0) { m_timer->singleShot(m_holdDelay, this, SLOT(holdTimeout())); } } void SToolButton::holdTimeout() { if (m_pressed) { emit this->held(); } } void SToolButton::releasedEvent() { m_pressed = false; m_timer->stop(); } SFrame::SFrame(QWidget * parent):QFrame (parent) { m_hoverDelay = 0; } SFrame::~SFrame() { } void SFrame::setHoverDelay(int i) { m_hoverDelay = i; } int SFrame::hoverDelay() { return m_hoverDelay; } void SFrame::enterEvent(QEvent *event) { Q_UNUSED(event); m_hovered = true; if (m_hoverDelay > 0) { QTimer::singleShot(m_hoverDelay, this, SLOT(hoverTimeout())); } else { emit this->entered(); } } void SFrame::leaveEvent(QEvent *event) { Q_UNUSED(event); m_hovered = false; emit this->exited(); } void SFrame::mouseMoveEvent(QMouseEvent *event) { emit mouseMoved(); Q_UNUSED(event); } void SFrame::resizeEvent(QResizeEvent *) { emit resized(); } void SFrame::hoverTimeout() { if (m_hovered) { emit this->entered(); } } SLabel::SLabel(QWidget * parent):QLabel (parent) { m_hoverPixmap = new QPixmap(); m_mousePressed = false; } SLabel::~SLabel() { } void SLabel::setHoverPixmap(QPixmap * pixmap) { m_hoverPixmap = pixmap; } void SLabel::enterEvent(QEvent *event) { Q_UNUSED(event); if (!m_hoverPixmap->isNull()) { m_pixmap = *this->pixmap(); this->setPixmap(*m_hoverPixmap); } emit this->entered(); } void SLabel::leaveEvent(QEvent *event) { Q_UNUSED(event); if (!m_hoverPixmap->isNull()) { this->setPixmap(m_pixmap); } emit this->exited(); } SListWidget::SListWidget(QWidget * parent):QListWidget (parent) { connect(this, SIGNAL(itemSelectionChanged()), this, SLOT(compareSelectionChanges())); } SListWidget::~SListWidget() { } void SListWidget::compareSelectionChanges() { QList currentSelectedItems = this->selectedItems(); for (int i = 0; i < currentSelectedItems.count(); ++i) { if (lastSelectedItems.indexOf(currentSelectedItems.at(i)) == -1) { emit selected(currentSelectedItems.at(i)); } } for (int i = 0; i < lastSelectedItems.count(); ++i) { if (currentSelectedItems.indexOf(lastSelectedItems.at(i)) == -1) { emit unSelected(lastSelectedItems.at(i)); } } lastSelectedItems = currentSelectedItems; } void SListWidget::selectorEntered() { this->setSelectionMode(QAbstractItemView::MultiSelection); } void SListWidget::selectorExited() { this->setSelectionMode(QAbstractItemView::ExtendedSelection); } SRatingCombo::SRatingCombo(QWidget * parent) : QComboBox(parent) { this->setItemDelegate(new RatingDelegate(this)); } void SRatingCombo::paintEvent (QPaintEvent * e) { QVariant ratingData = this->itemData(this->currentIndex(),Qt::UserRole).toInt(); if (ratingData.isValid()) { QStylePainter p(this); QStyleOptionComboBox option; option.initFrom(this); p.drawComplexControl(QStyle::CC_ComboBox, option); QRect subRect = p.style()->subElementRect(QStyle::SE_ComboBoxFocusRect, &option); const int left = subRect.left(); const int top = subRect.top(); const int height = subRect.height(); int rating = ratingData.toInt(); StarRating starRating = StarRating(rating, StarRating::Medium); starRating.setRating(rating); QSize ratingSize = starRating.sizeHint(); int ratingLeft = left + 2; int ratingTop = top + (height - ratingSize.height())/2; QRect ratingRect = QRect(QPoint(ratingLeft, ratingTop), ratingSize); starRating.setPoint(ratingRect.topLeft()); if (!this->isEnabled()) { starRating.setHoverAtPosition(ratingRect.topLeft()); } starRating.paint(&p); } else { QComboBox::paintEvent(e); } } #include "sensiblewidgets.moc" bangarang-bangarang/src/app/common/sensiblewidgets.h000066400000000000000000000066641166760560600231500ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef SENSIBLEWIDGETS_H #define SENSIBLEWIDGETS_H #include #include #include #include #include #include #include #include #include #include #include #include class SToolButton : public QToolButton { Q_OBJECT public: SToolButton(QWidget * parent = 0); ~SToolButton(); void setHoverDelay(int i); int hoverDelay(); void setHoldDelay(int i); int holdDelay(); private: bool m_hovered; bool m_pressed; int m_hoverDelay; int m_holdDelay; QTimer *m_timer; Q_SIGNALS: void entered(); void exited(); void held(); protected: void enterEvent(QEvent *event); void leaveEvent(QEvent *event); protected Q_SLOTS: void hoverTimeout(); void holdTimeout(); void pressedEvent(); void releasedEvent(); }; class SFrame : public QFrame { Q_OBJECT public: SFrame(QWidget * parent = 0); ~SFrame(); void setHoverDelay(int i); int hoverDelay(); private: bool m_hovered; int m_hoverDelay; Q_SIGNALS: void entered(); void exited(); void mouseMoved(); void resized(); protected: void enterEvent(QEvent *event); void leaveEvent(QEvent *event); void mouseMoveEvent(QMouseEvent *event); void resizeEvent(QResizeEvent *); protected Q_SLOTS: void hoverTimeout(); }; class SLabel : public QLabel { Q_OBJECT public: SLabel(QWidget * parent = 0); ~SLabel(); void setHoverPixmap(QPixmap * pixmap); private: QPixmap * m_hoverPixmap; QPixmap m_pixmap; bool m_mousePressed; Q_SIGNALS: void entered(); void exited(); void clicked(); protected: void enterEvent(QEvent *event); void leaveEvent(QEvent *event); }; class SListWidget : public QListWidget { Q_OBJECT public: SListWidget(QWidget * parent = 0); ~SListWidget(); Q_SIGNALS: void selected(QListWidgetItem * item); void unSelected(QListWidgetItem * item); private: QList lastSelectedItems; protected Q_SLOTS: void compareSelectionChanges(); void selectorEntered(); void selectorExited(); }; class SComboBox : public QComboBox { Q_OBJECT public: SComboBox(QWidget * parent = 0) : QComboBox(parent) {} ~SComboBox(){} //I have no idea why there is no default USER property in QComboBox Q_PROPERTY(QString currentText READ currentText USER true); }; class SRatingCombo : public QComboBox { Q_OBJECT public: SRatingCombo(QWidget * parent = 0); ~SRatingCombo(){} void paintEvent ( QPaintEvent * e ); }; #endif // SENSIBLEWIDGETS_H bangarang-bangarang/src/app/common/starrating.cpp000066400000000000000000000064031166760560600224550ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Stefan Burnicki (stefan.burnicki@gmx.de) * * * 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 . */ #include "starrating.h" #include #include #include StarRating::StarRating(int rating, int size, QPoint point, QPoint hoverPos) { m_rating = rating; m_point = point; setHoverAtPosition(hoverPos); setSize(size); } void StarRating::paint(QPainter *painter) { painter->save(); bool hover = (m_hoverRating != InvalidRating && m_rating != m_hoverRating); int lowRating = m_rating; int highRating = m_hoverRating; bool lower = ( hover && m_hoverRating < m_rating); if (lower) { lowRating = m_hoverRating; highRating = m_rating; } painter->translate(m_point + QPoint(StarRating::Margin, StarRating::Margin)); int rating = lowRating; QPixmap *star = &m_starNormal; QPixmap *star_next = hover ? &m_starHover : &m_starInactive; for (int i = 1; i <= MaxRating; i++) { if ( i > rating ) { if (hover) { rating = highRating; star = &m_starHover; star_next = &m_starInactive; hover = false; } else { rating = MaxRating; star = &m_starInactive; star_next = &m_starInactive; } } if (i % 2 == 0) { painter->drawPixmap((((i / 2) - 1) * (m_starSize + 2)), 0, *star); } else if( i == rating) { int halfWidth = (m_starSize / 2); int pos = (int) (i / 2); QRect srcRect = QRect(QPoint(0, 0), QSize(halfWidth, m_starSize)); painter->drawPixmap(QPoint((pos * (m_starSize + 2)), 0), *star, srcRect); srcRect = QRect(QPoint(halfWidth, 0), QSize(halfWidth, m_starSize)); painter->drawPixmap(QPoint((pos * (m_starSize + 2)) + halfWidth, 0), *star_next, srcRect); i++; } } painter->restore(); } void StarRating::setSize(int size) { int px = (size < Small) ? Small : size; QSize sz = QSize(px, px); KIcon icon = KIcon("rating"); m_starNormal = icon.pixmap(sz); m_starSize = m_starNormal.size().width(); //maybe we didn't get the full size sz = QSize(m_starSize, m_starSize); m_starInactive = icon.pixmap(sz, QIcon::Disabled); m_starHover = QPixmap(sz); QColor transBlack = Qt::black; transBlack.setAlpha(100); m_starHover.fill(transBlack); QPainter p(&m_starHover); p.setCompositionMode(QPainter::CompositionMode_SourceIn); p.drawPixmap(QPoint(0,0), m_starNormal); p.end(); } bangarang-bangarang/src/app/common/starrating.h000066400000000000000000000063161166760560600221250ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Stefan Burnicki (stefan.burnicki@gmx.de) * * * 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 . */ #ifndef STARRATINGWIDGET_H #define STARRATINGWIDGET_H #include #include #include /* This file will provide the StarRatingWidget, which is a QWidget and the StarRating which is responsible for painting rating stars. It will support ratings from 1 to 10 in different sizes */ #include class StarRating { public: enum Size { Small = 8, Medium = 12, Big = 16, Huge = 22 }; enum MinMax{ InvalidRating = -1, MinRating = 0, MaxRating = 10 }; static const int Margin = 1; StarRating(int rating = 0, int size = Small, QPoint point = QPoint(0, 0), QPoint hoverPos = QPoint(-1, -1)); void setRating(int rating) { m_rating = rating; } void setSize(int size); void setPoint(QPoint point) { m_point = point; } void setHoverAtPosition(QPoint point) { m_hoverRating = ratingAtPosition(point); } bool valid(int rating) const { return (rating >= MinRating && rating <= MaxRating); } int rating() { return m_rating; } QSize sizeHint() const { return StarRating::SizeHint(m_starSize); } int ratingAtPosition(QPoint point) const { return StarRating::RatingAtPosition(point, m_starSize, m_point); } void paint(QPainter *painter); static QSize SizeHint(int size) { // *__*__*__*__* + StarRating::Margin around it int bothMargin = (StarRating::Margin * 2); return QSize( 5 * (size + 2) - 2, size) + QSize(bothMargin, bothMargin); } static int RatingAtPosition(QPoint point, int starSize, QPoint offset) { QPoint p = point - offset; //relative to the rating pic now QSize sz = StarRating::SizeHint(starSize); if (p.x() < 0 || p.y() < 0 || p.x() > sz.width() || p.y() > sz.height()) return StarRating::InvalidRating; int in_x = p.x() - StarRating::Margin + starSize / 4; int real_width = sz.width() - StarRating::Margin * 2; int rating = (int) ((StarRating::MaxRating * in_x) / real_width); if (rating > StarRating::MaxRating || rating < StarRating::MinRating) rating = StarRating::InvalidRating; return rating; } protected: QPixmap m_starHover; QPixmap m_starNormal; QPixmap m_starInactive; int m_rating; int m_hoverRating; QPoint m_point; int m_starSize; }; Q_DECLARE_METATYPE( StarRating ) #endif bangarang-bangarang/src/app/main.cpp000066400000000000000000000062701166760560600177350ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "common/mainwindow.h" #include "common/bangarangapplication.h" #include #include #include #include #include #include static KAboutData aboutData( "bangarang", 0, ki18n("Bangarang"), "2.1", ki18n("A media player for your KDE desktop"), KAboutData::License_GPL_V3, ki18n("Copyright 2011, Andrew Lake"), ki18n("Note: This product uses the TMDb API but is not endorsed or certified by TMDb. Please help improve available information by visiting http://themoviedb.org
" "Note: This product uses the Last.fm API but is not endorsed or certified by Last.fm. Please help improve available information by visiting http://last.fm
" "Note: This product uses the TheTVDB.com API but is not endorsed or certified by TheTVDB.com. Please help improve available information by visiting http://thetvdb.com"), "http://bangarangkde.wordpress.org" ); int main(int argc, char *argv[]) { aboutData.setProgramIconName("bangarang"); aboutData.setOrganizationDomain( "mpris.org" ); //for DBus aboutData.addAuthor( ki18n("Andrew (Jamboarder) Lake"), ki18n("Creator"), "jamboarder@gmail.com"); aboutData.addCredit(ki18n("Stefan Burnicki"), ki18n("Contributor")); aboutData.addCredit(ki18n("Elias Probst"), ki18n("Contributor")); aboutData.setBugAddress("http://code.google.com/p/bangarangissuetracking/"); aboutData.setCustomAuthorText(ki18n("Defects may be reported at http://code.google.com/p/bangarangissuetracking/"), ki18n("Defects may be reported at Bangarang Issue Tracker")); aboutData.setHomepage("http://gitorious.org/bangarang"); aboutData.setLicense(KAboutData::License_GPL_V3); KCmdLineArgs::init( argc, argv, &aboutData ); KCmdLineOptions options; options.add("+[URL]", ki18n( "Play 'URL'" )); options.add("play-dvd", ki18n( "Play DVD Video" )); options.add("play-cd", ki18n( "Play CD Music" )); options.add("debug", ki18n( "Show Additional Debug Output" )); options.add("touch", ki18n("Enable touch mode for interface")); KCmdLineArgs::addCmdLineOptions( options ); BangarangApplication application; application.setup(); MainWindow * w = application.mainWindow(); w->show(); application.processCommandLineArgs(); return application.exec(); } bangarang-bangarang/src/app/medialists/000077500000000000000000000000001166760560600204365ustar00rootroot00000000000000bangarang-bangarang/src/app/medialists/audiolistsstack.cpp000066400000000000000000000060771166760560600243620ustar00rootroot00000000000000#include "../common/bangarangapplication.h" #include "../common/mainwindow.h" #include "../common/flickcharm.h" #include "medialistsmanager.h" #include "savedlistsmanager.h" #include "medialistsettings.h" #include "../../platform/mediaitemmodel.h" #include "audiolistsstack.h" AudioListsStack::AudioListsStack(QWidget *parent) : QWidget(parent), ui(new Ui::AudioListsStack) { ui->setupUi(this); m_application = (BangarangApplication *)KApplication::kApplication(); ui->audioLists->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); } AudioListsStack::~AudioListsStack() { delete ui; } void AudioListsStack::enableTouch() { int tTouchable = BangarangApplication::TOUCH_TOUCHABLE_METRIC; int tVisual = BangarangApplication::TOUCH_VISUAL_METRIC; ui->addAudioList->setMinimumSize(tTouchable, tTouchable); ui->addAudioList->setIconSize(QSize(tVisual, tVisual)); ui->removeAudioList->setMinimumSize(tTouchable, tTouchable); ui->removeAudioList->setIconSize(QSize(tVisual, tVisual)); ui->configureAudioList->setMinimumSize(tTouchable, tTouchable); ui->configureAudioList->setIconSize(QSize(tVisual, tVisual)); ui->audioLists->setIconSize(QSize(tTouchable, tTouchable)); ui->audioLists->setGridSize(QSize(0, tTouchable + 2)); FlickCharm* charm = new FlickCharm(this); charm->activateOn(ui->audioLists); ui->aNewListName->setMinimumHeight(tTouchable); ui->saveAudioList->setMinimumHeight(tTouchable); ui->aCancelSaveList->setMinimumHeight(tTouchable); ui->aslsListName->setMinimumHeight(tTouchable); ui->aslsSave->setMinimumHeight(tTouchable); ui->exportSavedListLabel->hide(); ui->aslsExport->hide(); ui->aslsCancel->setMinimumHeight(tTouchable); ui->semALimit->setMinimumHeight(tTouchable); ui->semATimeComp->setMinimumHeight(tTouchable); ui->semATime->setMinimumHeight(tTouchable); ui->semARating->setMinimumHeight(tTouchable); ui->semARatingComp->setMinimumHeight(tTouchable); ui->semAFreq->setMinimumHeight(tTouchable); ui->semAFreqComp->setMinimumHeight(tTouchable); ui->semAConfigSave->setMinimumHeight(tTouchable); ui->aCancelSemConfigure->setMinimumHeight(tTouchable); } void AudioListsStack::on_configureAudioList_clicked() { if (ui->audioLists->selectionModel()->selectedIndexes().count() > 0) { int selectedRow = ui->audioLists->selectionModel()->selectedIndexes().at(0).row(); MediaItem selectedItem = m_application->mediaListsManager()->audioListsModel()->mediaItemAt(selectedRow); if (selectedItem.url.startsWith("savedlists://") || selectedItem.url.startsWith("ampache://")) { m_application->savedListsManager()->showAudioSavedListSettings(); } else if (selectedItem.url.startsWith("semantics://recent") || selectedItem.url.startsWith("semantics://frequent") || selectedItem.url.startsWith("semantics://highest") || selectedItem.url.startsWith("semantics://recentlyadded")) { m_application->mainWindow()->mediaListSettings()->showMediaListSettings(); } } } bangarang-bangarang/src/app/medialists/audiolistsstack.h000066400000000000000000000010001166760560600240040ustar00rootroot00000000000000#ifndef AUDIOLISTSSTACK_H #define AUDIOLISTSSTACK_H #include namespace Ui { class AudioListsStack; } #include "ui_audiolistsstack.h" class BangarangApplication; class AudioListsStack : public QWidget { Q_OBJECT public: explicit AudioListsStack(QWidget *parent = 0); ~AudioListsStack(); void enableTouch(); Ui::AudioListsStack *ui; private: BangarangApplication *m_application; private slots: void on_configureAudioList_clicked(); }; #endif // AUDIOLISTSSTACK_H bangarang-bangarang/src/app/medialists/infobox.cpp000066400000000000000000000130731166760560600226120ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "infobox.h" #include "../common/mainwindow.h" #include "../common/mediaview.h" #include "../common/mediaitemdelegate.h" #include "infomanager.h" #include "../common/bangarangapplication.h" #include "medialistsmanager.h" #include "../../platform/mediaitemmodel.h" #include #include #include #include #include #include #include InfoBox::InfoBox(QWidget * parent):QWidget (parent) { //Set up title bar m_titleBar = new QWidget; m_titleBar->setAutoFillBackground(true); m_titleBar->setPalette(QApplication::palette()); connect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()), this, SLOT(updateTitleColors())); QHBoxLayout * titleLayout = new QHBoxLayout; titleLayout->setContentsMargins(0,0,0,0); titleLayout->setSpacing(0); m_icon = new QLabel; m_icon->setMaximumSize(QSize(20,20)); m_icon->setAlignment(Qt::AlignCenter); m_title = new QLabel; m_title->setFont(KGlobalSettings::smallestReadableFont()); m_title->setAlignment(Qt::AlignCenter); QLabel * spacer = new QLabel; spacer->setMaximumSize(QSize(20,20)); titleLayout->addWidget(m_icon); titleLayout->addWidget(m_title); titleLayout->addWidget(spacer); m_titleBar->setLayout(titleLayout); m_titleBar->setMinimumHeight(20); //Set up media view QVBoxLayout * layout = new QVBoxLayout; layout->setContentsMargins(0,0,0,0); layout->setSpacing(0); m_mediaView = new MediaView(); m_mediaView->setFocusPolicy(Qt::ClickFocus); connect((MediaItemModel *)m_mediaView->sourceModel(), SIGNAL(mediaListChanged()), this, SLOT(mediaListChanged())); layout->addWidget(m_titleBar); layout->addWidget(m_mediaView); //Complete setup setLayout(layout); } InfoBox::~InfoBox() { } QLabel * InfoBox::title() { return m_title; } MediaView * InfoBox::mediaView() { return m_mediaView; } void InfoBox::setMainWindow(MainWindow * mainWindow) { m_mainWindow = mainWindow; m_mediaView->setMainWindow(mainWindow); MediaItemDelegate * mediaItemDelegate = (MediaItemDelegate *)m_mediaView->itemDelegate(); connect(mediaItemDelegate, SIGNAL(categoryActivated(QModelIndex)), this, SLOT(categoryActivated(QModelIndex))); } void InfoBox::setInfo(const QString &title, const QString & lri) { m_title->setText(title); if (lri.startsWith("semantics://frequent")) { m_mediaView->setMode(MediaItemDelegate::MiniPlayCountMode); } else if (lri.startsWith("semantics://recent")) { m_mediaView->setMode(MediaItemDelegate::MiniPlaybackTimeMode); } else if (lri.startsWith("semantics://highest")) { m_mediaView->setMode(MediaItemDelegate::MiniRatingMode); }else if (lri.startsWith("music://albums")) { m_mediaView->setMode(MediaItemDelegate::MiniAlbumMode); } else { m_mediaView->setMode(MediaItemDelegate::MiniMode); } MediaItemModel * model = (MediaItemModel *)m_mediaView->sourceModel(); hide(); model->loadLRI(lri); } void InfoBox::setTitle(const QString &title) { m_title->setText(title); } void InfoBox::updateTitleColors() { m_titleBar->setPalette(QApplication::palette()); } void InfoBox::mediaListChanged() { //Set title bar icon based on content of mediaview MediaItemModel * model = (MediaItemModel *)m_mediaView->sourceModel(); if (model->rowCount() > 0) { if (model->rowCount() == 1) { if (model->mediaItemAt(0).type == "Message" && m_mediaView->mode() != MediaItemDelegate::NormalMode) { hide(); return; } } show(); QPixmap pixmap = model->mediaItemAt(0).artwork.pixmap(16,16); m_icon->setPixmap(pixmap); } //Set widget height to contents MediaItemDelegate * mediaViewDelegate = (MediaItemDelegate *)m_mediaView->itemDelegate(); int mediaViewHeight = mediaViewDelegate->heightForAllRows(); setMaximumHeight(mediaViewHeight + m_titleBar->height()); } void InfoBox::categoryActivated(QModelIndex index) { MediaItemModel *model = (MediaItemModel *)m_mediaView->sourceModel(); MediaItem categoryMediaItem = model->mediaItemAt(index.row()); MediaListProperties mediaListProperties = MediaListProperties(categoryMediaItem.url); mediaListProperties.name = categoryMediaItem.title; mediaListProperties.category = categoryMediaItem; BangarangApplication * application = (BangarangApplication *)KApplication::kApplication(); application->mediaListsManager()->addListToHistory(); application->browsingModel()->clearMediaListData(); application->browsingModel()->setMediaListProperties(mediaListProperties); application->browsingModel()->load(); } void InfoBox::enableTouch() { m_mediaView->enableTouch(); m_title->setFont(KGlobalSettings::generalFont()); } bangarang-bangarang/src/app/medialists/infobox.h000066400000000000000000000033061166760560600222550ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef INFOBOX_H #define INFOBOX_H #include #include #include #include class MainWindow; class MediaView; /* * This class is mostly to provide custom infobox widget used in the Info view * used to display media lists. */ class InfoBox : public QWidget { Q_OBJECT public: InfoBox(QWidget * parent = 0); ~InfoBox(); void setMainWindow(MainWindow * mainWindow); QLabel * title(); MediaView * mediaView(); void setInfo(const QString &title, const QString & lri); void setTitle(const QString &title); void enableTouch(); private: MediaView * m_mediaView; MainWindow * m_mainWindow; QLabel * m_icon; QLabel * m_title; QWidget * m_titleBar; private slots: void updateTitleColors(); void mediaListChanged(); void categoryActivated(QModelIndex index); }; #endif // INFOBOX_H bangarang-bangarang/src/app/medialists/infoitemdelegate.cpp000066400000000000000000001351461166760560600244610ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "infoitemdelegate.h" #include "infoitemview.h" #include "../common/mainwindow.h" #include "ui_mainwindow.h" #include "../common/sensiblewidgets.h" #include "../common/bangarangapplication.h" #include "medialistsmanager.h" #include "../common/starrating.h" #include "../common/artworkpainter.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/infoitemmodel.h" #include "../../platform/utilities/utilities.h" #include "../../platform/playlist.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include InfoItemDelegate::InfoItemDelegate(QObject *parent) : QItemDelegate(parent) { m_application = (BangarangApplication *)KApplication::kApplication(); m_nepomukInited = Utilities::nepomukInited(); m_stringListIndexEditing = -1; m_rowOfNewValue = -1; m_padding = 3; m_isEditing = false; m_typeChanged = false; m_starRatingSize = StarRating::Big; m_suppressEditing = false; m_drillIcon = KIcon("bangarang-category-browse"); QImage drillIconHighlightImage = KIcon("bangarang-category-browse").pixmap(16+m_padding,16+m_padding).toImage(); KIconEffect::toGamma(drillIconHighlightImage, 0.5); m_drillIconHighlight = QIcon(QPixmap::fromImage(drillIconHighlightImage)); connect(this, SIGNAL(closeEditor(QWidget*)), this, SLOT(endEditing(QWidget*))); } InfoItemDelegate::~InfoItemDelegate() { } void InfoItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStandardItemModel * model = (QStandardItemModel *)index.model(); //Get basic information about painting area const int width = option.rect.width(); const int height = option.rect.height(); QColor foregroundColor = option.palette.color(QPalette::Text); QColor hoverColor = option.palette.color(QPalette::Highlight); hoverColor.setAlpha(35); //Get basic information about field QString field = index.data(InfoItemModel::FieldRole).toString(); QString text; if (!index.data(Qt::DisplayRole).isNull()) { if (index.data(Qt::DisplayRole).type() == QVariant::DateTime) { KDateTime dateTime(index.data(Qt::DisplayRole).toDateTime()); text = KGlobal::locale()->formatDateTime(dateTime.toLocalZone(), KLocale::FancyLongDate); } else { text = index.data(Qt::DisplayRole).toString(); } } bool multipleValues = index.data(InfoItemModel::MultipleValuesRole).toBool(); bool isEditable = model->itemFromIndex(index)->isEditable() && !m_suppressEditing; bool modified = (index.data(Qt::DisplayRole) != index.data(InfoItemModel::OriginalValueRole)); bool isArtwork = (field == "artwork"); bool isRating = (field == "rating"); bool isUrl = (field == "url" || field == "relatedTo"); //Set basic formatting info QRect dataRect = fieldDataRect(option, index); QFont textFont = KGlobalSettings::smallestReadableFont(); Qt::AlignmentFlag hAlign = Qt::AlignLeft; bool showFieldName = true; //Formatting modifications based on field info if (field == "audioType") { int typeIndex = index.data(Qt::DisplayRole).toInt(); if (typeIndex == 0) { text = i18n("Music"); } else if (typeIndex == 1) { text = i18n("Audio Stream"); } else if (typeIndex == 2) { text = i18n("Audio Clip"); } } else if (field == "videoType") { int typeIndex = index.data(Qt::DisplayRole).toInt(); if (typeIndex == 0) { text = i18n("Movie"); } else if (typeIndex == 1) { text = i18n("TV Show"); } else if (typeIndex == 2) { text = i18n("Video Clip"); } } else if (field == "artwork") { showFieldName = false; } else if (field == "title") { showFieldName = false; textFont = option.font; textFont.setPointSize(1.5*textFont.pointSize()); hAlign = Qt::AlignHCenter; } else if (field == "description") { showFieldName = false; hAlign = Qt::AlignJustify; if (text.isEmpty()) { foregroundColor.setAlphaF(0.7); text = i18n("No description"); hAlign = Qt::AlignCenter; textFont.setItalic(true); } } else if (field == "url") { textFont.setBold(modified); text = QFontMetrics(textFont).elidedText(text, Qt::ElideMiddle, dataRect.width()); } if (multipleValues) { text = i18n("Multiple Values"); textFont.setItalic(true); foregroundColor.setAlphaF(0.7); } if (modified) { textFont.setBold(true); } //Create base pixmap QPixmap pixmap(width, height); pixmap.fill(Qt::transparent); QPainter p(&pixmap); p.setRenderHint(QPainter::SmoothPixmapTransform); p.setRenderHint(QPainter::Antialiasing); p.translate(-option.rect.topLeft()); //Paint field name if (showFieldName) { QString fieldName = index.data(InfoItemModel::FieldNameRole).toString(); QFont fieldNameFont = KGlobalSettings::smallestReadableFont(); fieldNameFont.setItalic(true); int fieldNameWidth = width - dataRect.width() - 3*m_padding; QTextOption textOption(Qt::AlignRight | Qt::AlignTop); textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); QRect fieldNameRect(dataRect.left()-fieldNameWidth-2*m_padding, dataRect.top(), fieldNameWidth, dataRect.height()); p.setFont(fieldNameFont); p.setPen(foregroundColor); p.drawText(QRectF(fieldNameRect), fieldName, textOption); } //Paint field data if (isArtwork) { //Paint Artwork if (isEditable && option.state.testFlag(QStyle::State_MouseOver) && !m_isEditing) { //Draw hover rectangle p.save(); QRect hoverRect(dataRect.adjusted(-m_padding, -m_padding, m_padding, m_padding)); p.setPen(Qt::NoPen); p.setBrush(QBrush(hoverColor)); p.drawRoundedRect(hoverRect, 3.0, 3.0); p.restore(); } QList artworkList = index.data(InfoItemModel::ArtworkListRole).toList(); ArtworkPainter artworkPainter; if (artworkList.count() == 0) { QIcon artwork = index.data(Qt::DecorationRole).value(); artworkPainter.paint(&p, dataRect, artwork.pixmap(128, 128)); } else { artworkPainter.paint(&p, dataRect, artworkList); } if (isEditable && option.state.testFlag(QStyle::State_MouseOver)) { QString artworkUrl = index.data(Qt::EditRole).toString(); //Draw clear field "button" if (!artworkUrl.isEmpty()) { int clrTop = dataRect.top() + (dataRect.height() - 16)/2; int clrLeft = dataRect.right() - 16; KIcon("edit-clear-locationbar-rtl").paint(&p, clrLeft, clrTop, 16, 16); } } } else if (isRating) { //Paint rating int rating = index.data(Qt::DisplayRole).toInt(); StarRating starRating = StarRating(rating, m_starRatingSize); starRating.setRating(rating); QSize ratingSize = starRating.sizeHint(); int ratingLeft = dataRect.left() + (dataRect.width()-ratingSize.width())/2; int ratingTop = dataRect.top() + (dataRect.height() - ratingSize.height())/2; QRect ratingRect = QRect(QPoint(ratingLeft, ratingTop), ratingSize); starRating.setPoint(ratingRect.topLeft()); if (option.state.testFlag(QStyle::State_MouseOver) && !m_application->isTouchEnabled()) { starRating.setHoverAtPosition(m_mousePos); } starRating.paint(&p); } else { QTextOption textOption(hAlign | Qt::AlignTop); textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); if (index.data(Qt::DisplayRole).type() == QVariant::StringList) { //Render field data in a list QStringList textList = index.data(Qt::DisplayRole).toStringList(); QStringList originalTextList = index.data(InfoItemModel::OriginalValueRole).toStringList(); QList drillList = index.data(InfoItemModel::DrillRole).toList(); int textHeight = QFontMetrics(textFont).height(); for (int i = 0; i <= textList.count(); i++) { if (i == textList.count() && i > 0) { break; } int top = dataRect.top()+i*(textHeight+2*m_padding); QRect textRect(dataRect.left(), top, dataRect.width(), textHeight); QRect hoverRect = textRect.adjusted(-m_padding, -m_padding, m_padding, m_padding); if (isEditable && option.state.testFlag(QStyle::State_MouseOver) && hoverRect.contains(m_mousePos) && !m_isEditing) { //Draw hover rectangle p.save(); p.setPen(Qt::NoPen); p.setBrush(QBrush(hoverColor)); p.drawRoundedRect(hoverRect, 3.0, 3.0); p.restore(); //Draw link icon QRect linkIconRect; if (isUrl && !textList.isEmpty() && option.state.testFlag(QStyle::State_MouseOver)) { linkIconRect = textRect.adjusted(textRect.width() - 16, 0, 0, 0); p.save(); p.setPen(Qt::NoPen); QColor linkHoverColor = hoverColor; linkHoverColor.setAlpha(255); p.setBrush(QBrush(linkHoverColor)); p.drawRoundedRect(linkIconRect.adjusted(0,-m_padding, m_padding, m_padding), 3.0, 3.0); p.drawRect(linkIconRect.adjusted(0,-m_padding, 0, m_padding)); p.restore(); KIcon("emblem-symbolic-link").paint(&p, linkIconRect.adjusted(0,-m_padding, m_padding, m_padding)); textRect.adjust(0, 0, -linkIconRect.width(), 0); } //Draw drill icon QRect drillIconRect; if (i < drillList.count()) { if (!drillList.at(i).isNull()) { drillIconRect = textRect.adjusted(textRect.width()-16, 0, 0, 0); } } if (!drillIconRect.isNull()) { p.save(); p.setPen(Qt::NoPen); QColor drillHoverColor = hoverColor; drillHoverColor.setAlpha(255); p.setBrush(QBrush(drillHoverColor)); p.drawRoundedRect(drillIconRect.adjusted(0,-m_padding, m_padding, m_padding), 3.0, 3.0); p.drawRect(drillIconRect.adjusted(0,-m_padding, 0, m_padding)); p.restore(); if (drillIconRect.contains(m_mousePos)) { m_drillIconHighlight.paint(&p, drillIconRect.adjusted(0,-m_padding, m_padding, m_padding)); } else { m_drillIcon.paint(&p, drillIconRect.adjusted(0,-m_padding, m_padding, m_padding)); } textRect.adjust(0, 0, -drillIconRect.width(), 0); } //Draw plus icon QRect plusIconRect; if (i == textList.count()-1) { plusIconRect = textRect.adjusted(textRect.width()-16, 0, 0, 0); } if (!plusIconRect.isNull()) { p.save(); p.setPen(Qt::NoPen); QColor plusHoverColor = hoverColor; plusHoverColor.setAlpha(255); p.setBrush(QBrush(plusHoverColor)); if (drillIconRect.isNull()) { p.drawRoundedRect(plusIconRect.adjusted(0,-m_padding, m_padding, m_padding), 3.0, 3.0); } p.drawRect(plusIconRect.adjusted(0,-m_padding, 0, m_padding)); int addTop = plusIconRect.top() + (plusIconRect.height()-6)/2; int addLeft = plusIconRect.left() + (plusIconRect.width()-6)/2 + 1; QColor color = option.palette.color(QPalette::HighlightedText); if (plusIconRect.contains(m_mousePos)) { color.setAlpha(255); } else { color.setAlpha(200); } QPen pen(color); pen.setWidth(2); p.setPen(pen); p.drawLine(addLeft+3, addTop, addLeft+3, addTop+6); p.drawLine(addLeft, addTop+3, addLeft+6, addTop+3); p.restore(); textRect.adjust(0, 0, -plusIconRect.width(), 0); } } //Paint field list data if (i < textList.count()) { if (i >= originalTextList.count()) { textFont.setBold(true); } else if (textList.at(i) == originalTextList.at(i)) { textFont.setBold(false); } else { textFont.setBold(true); } if (!isUrl) { text = QFontMetrics(textFont).elidedText(textList.at(i), Qt::ElideRight, textRect.width()); } else { KUrl url(textList.at(i)); if (!url.isLocalFile()) { text = QFontMetrics(textFont).elidedText(url.host(), Qt::ElideMiddle, textRect.width()); } else { text = QFontMetrics(textFont).elidedText(textList.at(i), Qt::ElideMiddle, textRect.width()); } } p.setFont(textFont); p.setPen(foregroundColor); p.drawText(QRectF(textRect), text, textOption); } else if (multipleValues) { p.setFont(textFont); p.setPen(foregroundColor); p.drawText(QRectF(textRect), text, textOption); } } } else { //Render field data QRect textRect = dataRect; QRect hoverRect = dataRect.adjusted(-m_padding, -m_padding, m_padding, m_padding); if (isEditable && option.state.testFlag(QStyle::State_MouseOver) && hoverRect.contains(m_mousePos) && !m_isEditing) { //Draw hover rectangle p.save(); p.setPen(Qt::NoPen); p.setBrush(QBrush(hoverColor)); p.drawRoundedRect(hoverRect, 3.0, 3.0); p.restore(); //Draw drill icon QVariant drillItem = index.data(InfoItemModel::DrillRole); QRect drillIconRect; if (!drillItem.isNull()) { drillIconRect = textRect.adjusted(textRect.width() - 16, 0, 0, 0); } if (!drillIconRect.isNull()) { p.save(); p.setPen(Qt::NoPen); QColor drillHoverColor = hoverColor; drillHoverColor.setAlpha(255); p.setBrush(QBrush(drillHoverColor)); p.drawRoundedRect(drillIconRect.adjusted(0,-m_padding, m_padding, m_padding), 3.0, 3.0); p.drawRect(drillIconRect.adjusted(0,-m_padding, 0, m_padding)); p.restore(); if (drillIconRect.contains(m_mousePos)) { m_drillIconHighlight.paint(&p, drillIconRect.adjusted(0,-m_padding, m_padding, m_padding)); } else { m_drillIcon.paint(&p, drillIconRect.adjusted(0,-m_padding, m_padding, m_padding)); } textRect.adjust(0, 0, -drillIconRect.width(), 0); } } //Draw link icon if (isUrl && option.state.testFlag(QStyle::State_MouseOver) && !m_application->isTouchEnabled()) { KUrl url(index.data().toString()); if (url.isValid() && (field == "relatedTo" || (field == "url" && url.isLocalFile()))) { QRect linkIconRect = textRect.adjusted(textRect.width() - 16, 0, 0, 0); KIcon("emblem-symbolic-link").paint(&p, linkIconRect.adjusted(0,-m_padding, m_padding, m_padding)); textRect.adjust(0, 0, -linkIconRect.width(), 0); text = QFontMetrics(textFont).elidedText(text, Qt::ElideMiddle, textRect.width()); } } //Draw field data p.setFont(textFont); p.setPen(foregroundColor); p.drawText(QRectF(textRect), text, textOption); } } p.end(); //Draw finished pixmap painter->drawPixmap(option.rect.topLeft(), pixmap); } QSize InfoItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { Q_UNUSED(option); return QSize(0, rowHeight(index.row())); } bool InfoItemDelegate::editorEvent( QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { BangarangApplication *application = (BangarangApplication *)KApplication::kApplication(); m_mousePos = ((QMouseEvent *)event)->pos(); if (!m_isEditing) { m_view->update(index); } QString field = index.data(InfoItemModel::FieldRole).toString(); if (field == "artwork") { bool isEditable = ((QStandardItemModel *)model)->itemFromIndex(index)->isEditable() && !m_suppressEditing; if (event->type() == QEvent::MouseButtonRelease && isEditable) { QRect clearButtonRect = QRect(option.rect.left()+option.rect.width()-16, option.rect.top()+(option.rect.height()-16)/2, 16, 16); if (clearButtonRect.contains(m_mousePos)) { //Clear set artwork InfoItemModel *model = (InfoItemModel *)index.model(); model->clearArtwork(); } else { //Get artwork url from user QString artworkUrl = index.data(Qt::EditRole).toString(); if (artworkUrl.isEmpty()) { InfoItemModel *model = (InfoItemModel *)index.model(); if (model->mediaList().count() > 0) { artworkUrl = KUrl(model->mediaList().at(0).url).directory(); } } KUrl newUrl = KFileDialog::getImageOpenUrl(KUrl(artworkUrl), application->mainWindow(), i18n("Open artwork file")); if (newUrl.isValid()) { model->setData(index, newUrl.url(), Qt::EditRole); model->setData(index, false, InfoItemModel::MultipleValuesRole); } application->mainWindow()->ui->mediaView->setFocus(); } } return true; } else if (field == "rating") { if (event->type() == QEvent::MouseButtonRelease) { //Determine rating set a mouse position QRect dataRect = fieldDataRect(option, index); QSize ratingSize = StarRating::SizeHint(m_starRatingSize); int ratingLeft = dataRect.left() + (dataRect.width()-ratingSize.width())/2; int ratingTop = dataRect.top() + (dataRect.height() - ratingSize.height())/2; QRect ratingRect = QRect(QPoint(ratingLeft, ratingTop), ratingSize); int rating = StarRating::RatingAtPosition(m_mousePos, m_starRatingSize, ratingRect.topLeft()); //Set rating InfoItemModel *model = (InfoItemModel *)index.model(); model->setRating(rating); QList mediaList = model->mediaList(); QList modelsToUpdate; modelsToUpdate.append(application->playlist()->playlistModel()); modelsToUpdate.append(application->playlist()->queueModel()); modelsToUpdate.append(application->playlist()->nowPlayingModel()); modelsToUpdate.append(application->browsingModel()); for (int i = 0; i < modelsToUpdate.count(); i++) { MediaItemModel *modelToUpdate = modelsToUpdate.at(i); for (int j = 0; j < mediaList.count(); j++) { int row = modelToUpdate->rowOfUrl(mediaList.at(j).url); if (row != -1) { MediaItem mediaItem = modelToUpdate->mediaItemAt(row); mediaItem.fields["rating"] = rating; modelToUpdate->replaceMediaItemAt(row, mediaItem); } } } } return true; } else if (field == "url") { if (event->type() == QEvent::MouseButtonPress) { bool isEditable = ((QStandardItemModel *)model)->itemFromIndex(index)->isEditable() && !m_suppressEditing; QRect dataRect = fieldDataRect(option, index); QRect hoverRect = dataRect.adjusted(-m_padding, -m_padding, m_padding, m_padding); KUrl url(index.data(Qt::DisplayRole).toString()); url = KUrl(url.directory()); if (url.isValid() && url.isLocalFile()) { QRect linkIconRect = dataRect.adjusted(dataRect.width() - 16, -m_padding, m_padding, m_padding); hoverRect.adjust(0, 0, -16 - m_padding, 0); if (linkIconRect.contains(m_mousePos) || (m_application->isTouchEnabled() && hoverRect.contains(m_mousePos) & !isEditable)) { QDesktopServices::openUrl(url); } } if (hoverRect.contains(m_mousePos)) { m_isEditing = true; return QItemDelegate::editorEvent(event, model, option, index); } } return true; } else { //Determine where mouse button was pressed and handle approriate int listIndex = stringListIndexAtMousePos(option, index); QRect dataRect = fieldDataRect(option, index); QRect hoverRect = dataRect.adjusted(-m_padding, -m_padding, m_padding, m_padding); bool linkIconExists = (field == "relatedTo"); bool drillIconExists = false; if (index.data(Qt::DisplayRole).type() == QVariant::String) { QVariant drillItem = index.data(InfoItemModel::DrillRole); if (!drillItem.isNull()) { drillIconExists = true; } } if (index.data(Qt::DisplayRole).type() == QVariant::StringList ) { QList drillList = index.data(InfoItemModel::DrillRole).toList(); if (listIndex != -1 && listIndex < drillList.count()) { if (!drillList.at(listIndex).isNull()) { drillIconExists = true; } } } QRect linkIconRect; if (linkIconExists) { linkIconRect = dataRect.adjusted(dataRect.width() - 16, -m_padding, m_padding, m_padding); hoverRect.adjust(0, 0, -16 - m_padding, 0); dataRect.adjust(0, 0, -16, 0); } QRect drillIconRect; if (drillIconExists) { drillIconRect = dataRect.adjusted(dataRect.width() - 16, -m_padding, m_padding, m_padding); hoverRect.adjust(0, 0, -16 - m_padding, 0); dataRect.adjust(0, 0, -16, 0); } QRect plusIconRect; QStringList textList = index.data(Qt::DisplayRole).toStringList(); if (index.data(Qt::DisplayRole).type() == QVariant::StringList && listIndex == textList.count()-1) { plusIconRect = dataRect.adjusted(dataRect.width()-16, 0, 0, 0); } if (hoverRect.contains(m_mousePos) && !m_isEditing && !m_suppressEditing) { if (event->type() == QEvent::MouseButtonRelease) { m_isEditing = true; } if (plusIconRect.contains(m_mousePos)) { if (index.data(Qt::DisplayRole).type() == QVariant::StringList && event->type() == QEvent::MouseButtonPress) { //Editing new value m_stringListIndexEditing = -1; m_rowOfNewValue = index.row(); emit sizeHintChanged(index); // QApplication::processEvents(); //this would disturb the flow and cause a wrong line edit to exist m_view->update(index); m_view->fixHeightToContents(); } } else { if (index.data(Qt::DisplayRole).type() == QVariant::StringList && event->type() == QEvent::MouseButtonPress) { //Editing existing value m_stringListIndexEditing = stringListIndexAtMousePos(option, index); m_rowOfNewValue = -1; } } return QItemDelegate::editorEvent(event, model, option, index); } else if (drillIconRect.contains(m_mousePos) && !m_isEditing && !m_application->isTouchEnabled()) { if (event->type() == QEvent::MouseButtonRelease) { m_rowOfNewValue = -1; MediaItem drillItem = index.data(InfoItemModel::DrillRole).value(); if (index.data(Qt::DisplayRole).type() == QVariant::StringList) { QList drillList = index.data(InfoItemModel::DrillRole).toList(); if (listIndex != -1 && listIndex < drillList.count()) { drillItem = drillList.at(listIndex).value(); } } if (!drillItem.url.isEmpty()) { MediaListProperties mediaListProperties; mediaListProperties.lri = drillItem.url; mediaListProperties.name = drillItem.title; mediaListProperties.category = drillItem; application->mediaListsManager()->addListToHistory(); application->browsingModel()->clearMediaListData(); application->browsingModel()->setMediaListProperties(mediaListProperties); application->browsingModel()->load(); } return true; } else { return true; } } else if (linkIconRect.contains(m_mousePos) | (linkIconExists && hoverRect.contains(m_mousePos) && m_application->isTouchEnabled())) { if (event->type() == QEvent::MouseButtonRelease) { KUrl url; if (index.data(Qt::DisplayRole).type() == QVariant::StringList) { QList urlList = index.data().toList(); if (listIndex != -1 && listIndex < urlList.count()) { url = urlList.at(listIndex).toString(); } } else { url = KUrl(index.data(Qt::DisplayRole).toString()); } if (url.isValid()) { QDesktopServices::openUrl(url); } } return true; } else { return true; } } } QWidget *InfoItemDelegate::createEditor( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const { QString field = index.data(InfoItemModel::FieldRole).toString(); QVariant value = index.data(Qt::EditRole); if (field == "artwork" || field == "rating") { return 0; } if (value.type() == QVariant::Int) { if (field == "audioType") { QStringList list; list << i18n("Music") << i18n("Audio Stream") << i18n("Audio Clip"); QComboBox *comboBox = new QComboBox(parent); comboBox->setFont(KGlobalSettings::smallestReadableFont()); comboBox->addItems(list); comboBox->setEditable(false); comboBox->setCurrentIndex(value.toInt()); comboBox->setAutoFillBackground(true); connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(typeChanged(int))); return comboBox; } else if (field == "videoType") { QStringList list; list << i18n("Movie") << i18n("TV Show") << i18n("Video Clip"); QComboBox *comboBox = new QComboBox(parent); comboBox->setFont(KGlobalSettings::smallestReadableFont()); comboBox->addItems(list); comboBox->setEditable(false); comboBox->setCurrentIndex(value.toInt()); comboBox->setAutoFillBackground(true); connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(typeChanged(int))); return comboBox; } else { KLineEdit *lineEdit = new KLineEdit(parent); lineEdit->setInputMask("0000"); lineEdit->setFont(KGlobalSettings::smallestReadableFont()); lineEdit->setAutoFillBackground(true); return lineEdit; } } else if (value.type() == QVariant::StringList) { QStringList valueList = index.data(InfoItemModel::ValueListRole).toStringList(); if (valueList.count() == 0) { KLineEdit *lineEdit = new KLineEdit(parent); lineEdit->setFont(KGlobalSettings::smallestReadableFont()); lineEdit->setAutoFillBackground(true); return lineEdit; } else { SComboBox *comboBox = new SComboBox(parent); for (int i = 0; i < valueList.count(); i++) { comboBox->addItem(valueList.at(i), valueList.at(i)); } comboBox->setEditable(true); comboBox->setFont(KGlobalSettings::smallestReadableFont()); comboBox->setAutoFillBackground(true); return comboBox; } } else if (value.type() == QVariant::String) { if (field == "description") { QTextEdit *textEdit = new QTextEdit(parent); textEdit->setAcceptRichText(false); textEdit->setFont(KGlobalSettings::smallestReadableFont()); textEdit->setAutoFillBackground(true); textEdit->setToolTip(i18n("Press to finish editing.")); textEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); textEdit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); return textEdit; } QStringList valueList = index.data(InfoItemModel::ValueListRole).toStringList(); if (valueList.count() == 0) { KLineEdit *lineEdit = new KLineEdit(parent); lineEdit->setFont(KGlobalSettings::smallestReadableFont()); lineEdit->setAutoFillBackground(true); return lineEdit; } else { SComboBox *comboBox = new SComboBox(parent); for (int i = 0; i < valueList.count(); i++) { comboBox->addItem(valueList.at(i), valueList.at(i)); } comboBox->setEditable(true); comboBox->setFont(KGlobalSettings::smallestReadableFont()); comboBox->setAutoFillBackground(true); return comboBox; } } else if (field != "artwork") { KLineEdit *lineEdit = new KLineEdit(parent); lineEdit->setFont(KGlobalSettings::smallestReadableFont()); lineEdit->setAutoFillBackground(true); return lineEdit; } else { return 0; } Q_UNUSED(option); } void InfoItemDelegate::setEditorData (QWidget * editor, const QModelIndex & index) const { QString field = index.data(InfoItemModel::FieldRole).toString(); QVariant::Type type = index.data(Qt::EditRole).type(); bool multipleValues = index.data(InfoItemModel::MultipleValuesRole).toBool(); if (type == QVariant::String) { if (multipleValues) { return; } QString text = index.data(Qt::EditRole).toString(); QStringList valueList = index.data(InfoItemModel::ValueListRole).toStringList(); if (valueList.isEmpty()) { if (field == "description") { QTextEdit *textEdit = qobject_cast(editor); textEdit->setText(text); } else { KLineEdit *lineEdit = qobject_cast(editor); lineEdit->setText(text); } } else { SComboBox *comboBox = qobject_cast(editor); comboBox->lineEdit()->setText(text); } return; } if (type == QVariant::StringList) { if (multipleValues) { return; } QString text; QStringList textList = index.data(Qt::EditRole).toStringList(); if (m_stringListIndexEditing != -1 && m_stringListIndexEditing < textList.count()) { text = textList.at(m_stringListIndexEditing); } QStringList valueList = index.data(InfoItemModel::ValueListRole).toStringList(); if (valueList.isEmpty()) { KLineEdit *lineEdit = qobject_cast(editor); lineEdit->setText(text); } else { SComboBox *comboBox = qobject_cast(editor); comboBox->lineEdit()->setText(text); } return; } if (index.data(Qt::EditRole).type() == QVariant::Int) { if (multipleValues) return; QVariant data = index.data(Qt::EditRole); if (data.isNull()) return; if (field == "audioType" || field == "videoType") { QComboBox *comboBox = qobject_cast(editor); comboBox->setCurrentIndex(data.toInt()); return; } KLineEdit *lineEdit = qobject_cast(editor); lineEdit->setText(data.toString()); return; } QItemDelegate::setEditorData(editor, index); } void InfoItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { QString field = index.data(InfoItemModel::FieldRole).toString(); if (index.data(Qt::DisplayRole).type() == QVariant::StringList) { QRect editorRect = stringListRectAtMousePos(option, index); editor->setGeometry(editorRect); } else { QRect dataRect = fieldDataRect(option, index); QRect editorRect = dataRect.adjusted(-m_padding, -m_padding, m_padding, m_padding); editor->setGeometry(editorRect); } } void InfoItemDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex &index) const { QString field = index.data(InfoItemModel::FieldRole).toString(); if (field == "audioType" || field == "videoType") { QComboBox * comboBox = qobject_cast(editor); if (!comboBox) { return; } model->setData(index, comboBox->currentIndex(), Qt::EditRole); } else if (field == "description") { QTextEdit * textEdit = qobject_cast(editor); if (!textEdit) { return; } model->setData(index, textEdit->toPlainText(), Qt::DisplayRole); model->setData(index, textEdit->toPlainText(), Qt::EditRole); } else if (index.data(Qt::EditRole).type() == QVariant::String){ QStringList valueList = index.data(InfoItemModel::ValueListRole).toStringList(); QString text; if (valueList.isEmpty()) { KLineEdit * lineEdit = qobject_cast(editor); if (!lineEdit) { return; } text = lineEdit->text().trimmed(); } else { SComboBox * comboBox = qobject_cast(editor); if (!comboBox) { return; } text = comboBox->lineEdit()->text().trimmed(); } model->setData(index, text, Qt::DisplayRole); model->setData(index, text, Qt::EditRole); } else if (index.data(Qt::EditRole).type() == QVariant::StringList){ QStringList valueList = index.data(InfoItemModel::ValueListRole).toStringList(); QString text; if (valueList.isEmpty()) { KLineEdit * lineEdit = qobject_cast(editor); if (!lineEdit) { return; } text = lineEdit->text().trimmed(); } else { SComboBox * comboBox = qobject_cast(editor); if (!comboBox) { return; } text = comboBox->lineEdit()->text().trimmed(); } QStringList textList = index.data(Qt::EditRole).toStringList(); if (m_stringListIndexEditing == -1 && !text.isEmpty()){ textList.append(text); } else if (m_stringListIndexEditing >= 0 && !text.isEmpty()) { textList.replace(m_stringListIndexEditing, text); } else if (m_stringListIndexEditing >= 0 && text.isEmpty()) { textList.removeAt(m_stringListIndexEditing); } else { return; } model->setData(index, textList, Qt::DisplayRole); model->setData(index, textList, Qt::EditRole); } else if (index.data(Qt::EditRole).type() == QVariant::Int) { KLineEdit * lineEdit = qobject_cast(editor); if (!lineEdit) { return; } if (!lineEdit->text().trimmed().isEmpty()) { int value = lineEdit->text().toInt(); model->setData(index, value, Qt::DisplayRole); model->setData(index, value, Qt::EditRole); } else { model->setData(index, QVariant(QVariant::Int), Qt::DisplayRole); model->setData(index, QVariant(QVariant::Int), Qt::EditRole); } } else { QItemDelegate::setModelData(editor, model, index); } } void InfoItemDelegate::setView(InfoItemView * view) { m_view = view; m_defaultViewSelectionMode = view->selectionMode(); } int InfoItemDelegate::heightForWordWrap(QFont font, int width, QString text) const { QFontMetrics fm(font); QRect rect(0, 0, width, fm.lineSpacing()); int height = fm.boundingRect(rect, Qt::AlignTop | Qt::AlignLeft | Qt::TextWordWrap,text).height(); return height; } int InfoItemDelegate::rowHeight(int row) const { QModelIndex index = m_view->model()->index(row,0); QString field = index.data(InfoItemModel::FieldRole).toString(); QVariant::Type fieldType = index.data(Qt::DisplayRole).type(); bool modified = (index.data(Qt::DisplayRole) != index.data(InfoItemModel::OriginalValueRole)); int width = m_view->width(); int height; if (field == "artwork") { height = 128 + 10 + 2*m_padding ; //10 pixel to accomodate rotated artwork } else if (field == "rating") { height = StarRating::SizeHint(m_starRatingSize).height() + 2 *m_padding; } else { QString text = index.data(Qt::DisplayRole).toString(); if (fieldType == QVariant::StringList) { QStringList textList = index.data(Qt::DisplayRole).toStringList(); if (textList.count() > 0) { text = textList.at(0); } } QFont textFont = KGlobalSettings::smallestReadableFont(); int fieldNameWidth = qMax(70, (width - 4 * m_padding)/4); int availableWidth = width - 5 * m_padding - fieldNameWidth; if (field == "title") { textFont = QFont(); textFont.setPointSize(1.5*textFont.pointSize()); availableWidth = width - 4*m_padding; } else if (field == "description") { availableWidth = width - 4*m_padding; } else if (field == "url") { text = QString(" "); // url text is elided to a single line anyway } if (availableWidth <= 0) { availableWidth = 100; } if (modified) { textFont.setBold(true); } height = heightForWordWrap(textFont, availableWidth, text) + 2*m_padding; if (fieldType == QVariant::StringList) { QStringList textList = index.data(Qt::DisplayRole).toStringList(); int rows = textList.count(); if (m_rowOfNewValue == row || rows == 0){ rows++; } height = rows*height; } } return height; } int InfoItemDelegate::heightForAllRows() { int height = 0; for (int i = 0; i < m_view->model()->rowCount(); i++) { height = height + rowHeight(i); } return height + 2; } QRect InfoItemDelegate::fieldDataRect(const QStyleOptionViewItem &option, const QModelIndex &index) const { //Get basic information about painting area const int left = option.rect.left(); const int top = option.rect.top(); const int width = option.rect.width(); const int height = option.rect.height(); //Get basic information about field QString field = index.data(InfoItemModel::FieldRole).toString(); //Set basic formatting info int padding = m_padding; int fieldNameWidth = qMax(70, (width - 4 * padding)/4); int textWidth = width - 5 * padding - fieldNameWidth; int textLeft = left + fieldNameWidth + 3 * padding; //Special handling for some field types if (field == "artwork" || field == "title" || field == "rating" || field == "description") { textWidth = width - 4 * padding; textLeft = left + 2*padding; } return QRect(textLeft, top+padding, textWidth, height-2*padding); } int InfoItemDelegate::stringListIndexAtMousePos(const QStyleOptionViewItem &option, const QModelIndex &index) const { int foundIndex = -1; if (index.data(Qt::DisplayRole).type() == QVariant::StringList) { QRect dataRect = fieldDataRect(option, index); QStringList textList = index.data(Qt::DisplayRole).toStringList(); if (textList.count() != 0) { int textHeight = QFontMetrics(KGlobalSettings::smallestReadableFont()).height(); for (int i = 0; i < textList.count(); i++) { QRect textRect(dataRect.left(), dataRect.top()+i*(textHeight+2*m_padding), dataRect.width(), textHeight); QRect hoverRect(textRect.adjusted(-m_padding, -m_padding, m_padding, m_padding)); if (hoverRect.contains(m_mousePos)) { foundIndex = i; break; } } } } return foundIndex; } QRect InfoItemDelegate::stringListRectAtMousePos(const QStyleOptionViewItem &option, const QModelIndex &index) const { QRect foundRect; if (index.data(Qt::DisplayRole).type() == QVariant::StringList) { QRect dataRect = fieldDataRect(option, index); QStringList textList = index.data(Qt::DisplayRole).toStringList(); if (textList.count() == 0) { QRect hoverRect = dataRect.adjusted(-m_padding, -m_padding, m_padding, m_padding); if (hoverRect.contains(m_mousePos)) { foundRect = hoverRect; } } else { int textHeight = QFontMetrics(KGlobalSettings::smallestReadableFont()).height(); for (int i = 0; i < textList.count(); i++) { int top = dataRect.top()+i*(textHeight+2*m_padding); QRect textRect(dataRect.left(), top, dataRect.width(), textHeight); QRect hoverRect = textRect.adjusted(-m_padding, -m_padding, m_padding, m_padding); if (hoverRect.contains(m_mousePos)) { QString field = index.data(InfoItemModel::FieldRole).toString(); if (field == "url" || field == "relatedTo") { //adjust for presence of icon rect textRect.adjust(0, 0, -16, 0); } QList drillLriList = index.data(InfoItemModel::DrillRole).toList(); QRect drillIconRect; if (i < drillLriList.count()) { if (!drillLriList.at(i).isNull()) { drillIconRect = textRect.adjusted(textRect.width()-16, -m_padding, m_padding, m_padding); textRect.adjust(0,0,-16,0); } } QRect plusIconRect; if (i == textList.count() - 1) { plusIconRect = textRect.adjusted(textRect.width()-16, -m_padding, 0, m_padding); } if (plusIconRect.contains(m_mousePos)) { foundRect = hoverRect.adjusted(0, textHeight+2*m_padding, 0, textHeight+2*m_padding); } else { foundRect = hoverRect; } break; } } } } return foundRect; } void InfoItemDelegate::endEditing(QWidget * editor) { resetEditMode(); Q_UNUSED(editor); } void InfoItemDelegate::resetEditMode() { m_isEditing = false; if (m_rowOfNewValue != -1) { InfoItemModel * model = (InfoItemModel *)m_view->model(); QModelIndex index = model->index(m_rowOfNewValue,0); emit sizeHintChanged(index); m_rowOfNewValue = -1; } } void InfoItemDelegate::enableTouch() { m_starRatingSize = StarRating::Huge; } void InfoItemDelegate::typeChanged(int i) { m_typeChanged = true; Q_UNUSED(i); } bool InfoItemDelegate::eventFilter(QObject *editor, QEvent *event) { if (m_typeChanged) { m_typeChanged = false; QKeyEvent *enterEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier); return QItemDelegate::eventFilter(editor, enterEvent); } else { return QItemDelegate::eventFilter(editor, event); } } void InfoItemDelegate::suppressEditing(bool suppress) { m_suppressEditing = suppress; } bangarang-bangarang/src/app/medialists/infoitemdelegate.h000066400000000000000000000066011166760560600241170ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef INFOITEMDELEGATE_H #define INFOITEMDELEGATE_H #include #include #include #include #include #include class MainWindow; class MediaIndexer; class InfoItemView; class BangarangApplication; /* * This Item Delegate is responsible for painting items in a * values model for items' infoview. It is also responsible for * providing editing widgets. * */ class InfoItemDelegate : public QItemDelegate { Q_OBJECT public: InfoItemDelegate(QObject * parent = 0); ~InfoItemDelegate(); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index); QWidget *createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const; void setEditorData ( QWidget * editor, const QModelIndex & index ) const; void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex &index) const; void setView(InfoItemView * view); void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; int rowHeight(int row) const; int heightForAllRows(); void resetEditMode(); void enableTouch(); void suppressEditing(bool suppress); protected: bool eventFilter(QObject * editor, QEvent * event); private: InfoItemView * m_view; QAbstractItemView::SelectionMode m_defaultViewSelectionMode; bool m_nepomukInited; int heightForWordWrap(QFont font, int width, QString text) const; QPoint m_mousePos; int m_stringListIndexEditing; int m_rowOfNewValue; QIcon m_drillIcon; QIcon m_drillIconHighlight; int m_padding; bool m_isEditing; int m_starRatingSize; BangarangApplication* m_application; bool m_typeChanged; bool m_suppressEditing; QRect fieldDataRect(const QStyleOptionViewItem &option, const QModelIndex &index) const; int stringListIndexAtMousePos(const QStyleOptionViewItem &option, const QModelIndex &index) const; QRect stringListRectAtMousePos(const QStyleOptionViewItem &option, const QModelIndex &index) const; Q_SIGNALS: private Q_SLOTS: void endEditing(QWidget * editor); void typeChanged(int i); }; #endif // INFOITEMDELEGATE_H bangarang-bangarang/src/app/medialists/infoitemview.cpp000066400000000000000000000047011166760560600236510ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "infoitemview.h" #include "infoitemdelegate.h" #include "../../platform/infoitemmodel.h" InfoItemView::InfoItemView(QWidget *parent) : QListView(parent) { m_infoItemModel = new InfoItemModel(this); setModel(m_infoItemModel); m_infoItemDelegate = new InfoItemDelegate(this); m_infoItemDelegate->setView(this); setItemDelegate(m_infoItemDelegate); connect(this, SIGNAL(updateSizeHints(QModelIndex)), m_infoItemDelegate, SIGNAL(sizeHintChanged(QModelIndex))); connect(m_infoItemModel, SIGNAL(dataChanged(const QModelIndex, const QModelIndex)), this, SLOT(infoDataChangedSlot(const QModelIndex, const QModelIndex))); connect(m_infoItemModel, SIGNAL(infoChanged(bool)), this, SLOT(infoChanged(bool))); } void InfoItemView::fixHeightToContents() { //Fix height to contents int infoItemViewHeight = m_infoItemDelegate->heightForAllRows(); setMinimumHeight(infoItemViewHeight); setMaximumHeight(infoItemViewHeight); } void InfoItemView::resizeEvent(QResizeEvent *e) { fixHeightToContents(); for (int i = 0; i < model()->rowCount(); i++) { emit updateSizeHints(model()->index(i,0)); } QListView::resizeEvent(e); } void InfoItemView::infoDataChangedSlot(const QModelIndex &topleft, const QModelIndex &bottomright) { m_infoItemDelegate->resetEditMode(); fixHeightToContents(); Q_UNUSED(topleft); Q_UNUSED(bottomright); } void InfoItemView::infoChanged(bool changed) { m_infoItemDelegate->resetEditMode(); fixHeightToContents(); Q_UNUSED(changed); } void InfoItemView::enableTouch() { m_infoItemDelegate->enableTouch(); } void InfoItemView::suppressEditing(bool suppress) { m_infoItemDelegate->suppressEditing(suppress); } bangarang-bangarang/src/app/medialists/infoitemview.h000066400000000000000000000026271166760560600233230ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef INFOITEMVIEW_H #define INFOITEMVIEW_H #include class InfoItemDelegate; class InfoItemModel; class InfoItemView : public QListView { Q_OBJECT public: explicit InfoItemView(QWidget *parent = 0); void resizeEvent(QResizeEvent *e); void fixHeightToContents(); void enableTouch(); void suppressEditing(bool suppress); signals: void updateSizeHints(QModelIndex index); public slots: void infoDataChangedSlot(const QModelIndex &topleft, const QModelIndex &bottomright); void infoChanged(bool changed); private: InfoItemModel *m_infoItemModel; InfoItemDelegate *m_infoItemDelegate; }; #endif // INFOITEMVIEW_H bangarang-bangarang/src/app/medialists/infomanager.cpp000066400000000000000000000655071166760560600234450ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "infomanager.h" #include "medialistsmanager.h" #include "../common/bangarangapplication.h" #include "infoitemdelegate.h" #include "infobox.h" #include "../common/mainwindow.h" #include "../common/flickcharm.h" #include "ui_mainwindow.h" #include "../common/mediaitemdelegate.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/infoitemmodel.h" #include "../../platform/playlist.h" #include "../../platform/utilities/utilities.h" #include "../../platform/infofetchers/infofetcher.h" #include "../../platform/infofetchers/dbpediainfofetcher.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include InfoManager::InfoManager(MainWindow * parent) : QObject(parent) { m_application = (BangarangApplication *)KApplication::kApplication(); m_parent = parent; ui = m_parent->ui; m_nepomukInited = Utilities::nepomukInited(); m_enableTouch = false; m_infoItemModel = (InfoItemModel *)ui->infoItemView->model(); m_infoItemModel->setSourceModel(m_application->browsingModel()); ui->infoSaveHolder->setVisible(false); ui->infoIndexerHolder->setVisible(false); ui->infoFetcherHolder->setVisible(false); ui->infoFetcherExpander->setVisible(false); ui->infoFetcherExpander->setCurrentIndex(0); ui->infoFetcherLink->setVisible(false); QFont fetcherMessageFont = KGlobalSettings::smallestReadableFont(); ui->infoFetcherLabel->setFont(fetcherMessageFont); ui->infoFetcherSelector->setFont(fetcherMessageFont); ui->infoFetch->setFont(fetcherMessageFont); ui->infoAutoFetch->setFont(fetcherMessageFont); //Set up selection timer m_selectionTimer = new QTimer(this); m_selectionTimer->setSingleShot(true); connect(m_selectionTimer, SIGNAL(timeout()), this, SLOT(loadSelectedInfo())); //Set up info fetching m_currentInfoFetcher = 0; connect(ui->infoAutoFetch, SIGNAL(clicked()), this, SLOT(autoFetchInfo())); connect(ui->infoFetch, SIGNAL(clicked()), this, SLOT(fetchInfo())); connect(ui->showInfoFetcherExpander, SIGNAL(clicked()), this, SLOT(toggleShowInfoFetcherExpander())); connect(ui->infoFetcherSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(selectInfoFetcher(int))); connect(ui->infoFetcherLink, SIGNAL(clicked()), this, SLOT(openInfoFetcherLink())); connect(m_infoItemModel, SIGNAL(fetching()), this, SLOT(showFetching())); connect(m_infoItemModel, SIGNAL(fetchingStatusUpdated()), this, SLOT(fetchingStatusUpdated())); connect(m_infoItemModel, SIGNAL(fetchComplete()), this, SLOT(fetchComplete())); connect(ui->fetchedMatches, SIGNAL(currentRowChanged(int)), m_infoItemModel, SLOT(selectFetchedMatch(int))); connect(m_infoItemModel, SIGNAL(infoChanged(bool)), this, SLOT(infoChanged(bool))); connect(ui->infoItemCancelEdit, SIGNAL(clicked()), this, SLOT(cancelItemEdit())); connect(ui->infoItemSave, SIGNAL(clicked()), this, SLOT(saveItemInfo())); connect(ui->infoIndexSelected, SIGNAL(clicked()), this, SLOT(addSelectedItemsInfo())); connect(ui->mediaView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(mediaSelectionChanged(const QItemSelection, const QItemSelection))); connect(m_application->browsingModel(), SIGNAL(mediaListChanged()), this, SLOT(loadSelectedInfo())); connect(m_application->browsingModel(), SIGNAL(mediaListPropertiesChanged()), this, SLOT(mediaListPropertiesChanged())); m_infoViewVisible = ui->semanticsHolder->isVisible(); } InfoManager::~InfoManager() { } //--------------------- //-- UI Widget Slots -- //--------------------- void InfoManager::toggleInfoView(bool force) { if ((m_application->mainWindow()->currentMainWidget() != MainWindow::MainMediaList) && !force) { return; } bool makeVisible = !m_infoViewVisible; ui->semanticsHolder->setVisible(makeVisible); if (makeVisible) { m_infoViewVisible = true; loadSelectedInfo(); } else { m_infoViewVisible = false; } } void InfoManager::showInfoView() { ui->semanticsHolder->setVisible(true); loadSelectedInfo(); m_infoViewVisible = true; } void InfoManager::hideInfoView() { ui->semanticsHolder->setVisible(false); m_infoViewVisible = false; } bool InfoManager::infoViewVisible() { return m_infoViewVisible; } void InfoManager::mediaSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected ) { //Delay updating info for 400 milliseconds to prevent rapid-fire nepomuk queries. m_selectionTimer->start(400); Q_UNUSED(selected); Q_UNUSED(deselected); } void InfoManager::saveItemInfo() { //Save changed item info in model m_infoItemModel->saveChanges(); //Update Now Playing and Playlist views m_application->playlist()->nowPlayingModel()->updateMediaItems(m_infoItemModel->mediaList()); m_application->playlist()->playlistModel()->updateMediaItems(m_infoItemModel->mediaList()); //Now that data is saved hide Save/Cancel controls ui->infoSaveHolder->setVisible(false); showIndexer(); if (ui->infoFetcherExpander->isVisible()) { toggleShowInfoFetcherExpander(); } } void InfoManager::cancelItemEdit() { m_infoItemModel->cancelChanges(); ui->infoSaveHolder->setVisible(false); showIndexer(); if (ui->infoFetcherExpander->isVisible()) { toggleShowInfoFetcherExpander(); } } void InfoManager::autoFetchInfo() { if (m_currentInfoFetcher) { m_infoItemModel->autoFetch(m_currentInfoFetcher); } } void InfoManager::fetchInfo() { if (m_currentInfoFetcher) { m_infoItemModel->fetch(m_currentInfoFetcher); } } void InfoManager::selectInfoFetcher(int index) { if (index < 0) { return; } m_currentInfoFetcher = m_infoItemModel->availableInfoFetchers().at(index); if (m_currentInfoFetcher->about().isEmpty()) { ui->infoFetcherSelector->setToolTip(QString("")); } else { ui->infoFetcherSelector->setToolTip(QString("%1
%2") .arg(m_currentInfoFetcher->name()) .arg(m_currentInfoFetcher->about())); } ui->infoFetcherLink->setToolTip(QString("%1
%2") .arg(m_currentInfoFetcher->name()) .arg(m_currentInfoFetcher->url().prettyUrl())); ui->infoFetcherLink->setVisible(m_currentInfoFetcher->url().isValid()); } void InfoManager::selectInfoFetcher(QAction * infoFetcherAction) { QList infoFetchers = m_infoItemModel->availableInfoFetchers(); for (int i = 0; i < infoFetchers.count(); i++) { if (infoFetchers.at(i)->name() == infoFetcherAction->text()) { m_currentInfoFetcher = infoFetchers.at(i); break; } } } void InfoManager::showInfoViewForMediaItem(const MediaItem &mediaItem) { m_parent->switchMainWidget(MainWindow::MainMediaList); if (!ui->semanticsHolder->isVisible()) { ui->semanticsHolder->setVisible(true); } QList mediaList; mediaList << mediaItem; if (mediaList.count() == 0) { return; } m_infoItemModel->loadInfo(mediaList); } void InfoManager::setContext(const MediaItem &category) { m_contextCategory = category; } void InfoManager::removeSelectedItemsInfo() { QList selectedItems; QModelIndexList selectedRows = ui->mediaView->selectionModel()->selectedRows(); if (selectedRows.count() > 0) { //If items are selected then the context is the selected items for (int i = 0 ; i < selectedRows.count() ; ++i) { QSortFilterProxyModel* proxyModel = ui->mediaView->filterProxyModel(); QModelIndex sourceIndex = proxyModel->mapToSource(selectedRows.at(i)); selectedItems.append(m_application->browsingModel()->mediaItemAt(sourceIndex.row())); } } if (selectedItems.count() > 0) { m_application->browsingModel()->removeSourceInfo(selectedItems); } } void InfoManager::addSelectedItemsInfo() { QList selectedItems; QModelIndexList selectedRows = ui->mediaView->selectionModel()->selectedRows(); if (selectedRows.count() > 0) { //If items are selected then the context is the selected items for (int i = 0 ; i < selectedRows.count() ; ++i) { QSortFilterProxyModel* proxyModel = ui->mediaView->filterProxyModel(); QModelIndex sourceIndex = proxyModel->mapToSource(selectedRows.at(i)); selectedItems.append(m_application->browsingModel()->mediaItemAt(sourceIndex.row())); } } if (selectedItems.count() > 0) { m_application->browsingModel()->updateSourceInfo(selectedItems); } } void InfoManager::infoChanged(bool modified) { ui->infoSaveHolder->setVisible(modified); if (modified) { ui->infoIndexerHolder->setVisible(false); } else { showIndexer(); } showInfoFetcher(); } void InfoManager::toggleShowInfoFetcherExpander() { ui->infoFetcherExpander->setVisible(!ui->infoFetcherExpander->isVisible()); if (ui->infoFetcherExpander->isVisible()) { ui->showInfoFetcherExpander->setToolTip(i18n("Click to hide")); } else { ui->showInfoFetcherExpander->setToolTip(i18n("Additional information may be available.
Click to show more...")); ui->infoFetcherExpander->setCurrentIndex(0); //switch to infofetcher selector page everytime it is hidden. } } //---------------------- //-- Helper functions -- //---------------------- void InfoManager::loadSelectedInfo() { bool templateIsSelected = false; QModelIndexList selectedRows = ui->mediaView->selectionModel()->selectedRows(); MediaSortFilterProxyModel *proxy = (MediaSortFilterProxyModel *) ui->mediaView->model(); if (selectedRows.count() == 1) { int row = proxy->mapToSource(selectedRows.at(0)).row(); MediaItem mediaItem = m_application->browsingModel()->mediaItemAt(row); templateIsSelected = mediaItem.fields["isTemplate"].toBool(); } //Make sure info view is visble before doing anything if (!m_infoViewVisible && !templateIsSelected) { return; } //Automatically show info view if template is selected if (templateIsSelected) { ui->semanticsHolder->setVisible(true); m_infoViewVisible = true; } m_selectedInfoBoxMediaItems.clear(); emit infoBoxSelectionChanged(m_selectedInfoBoxMediaItems); //Determine Information context m_context.clear(); if (selectedRows.count() > 0) { //If items are selected then the context is the selected items for (int i = 0 ; i < selectedRows.count() ; ++i) { int row = proxy->mapToSource(selectedRows.at(i)).row(); MediaItem mediaItem = m_application->browsingModel()->mediaItemAt(row); mediaItem.subTitle = QString(); mediaItem.fields["isTemplate"] = false; m_context.append(mediaItem); } } else if (m_application->browsingModel()->rowCount()>0) { //If nothing is selected then the information context is //the category selected to produce the list of media in the mediaview m_context.append(m_application->browsingModel()->mediaListProperties().category); } else { return; } //Show/Hide indexer showIndexer(); //Load contextual data into info model and info boxes if (!(m_context.count() == 1 && m_infoItemModel->mediaList().count() == 1 && m_context.at(0).url == m_infoItemModel->mediaList().at(0).url)) { m_infoItemModel->loadInfo(m_context); if (m_context.at(0).fields["audioType"].toString() == "Audio Stream" || m_context.at(0).fields["categoryType"].toString() == "Audio Feed" || m_context.at(0).fields["categoryType"].toString() == "Video Feed") { ui->infoItemView->suppressEditing(false); } else { ui->infoItemView->suppressEditing(m_application->isTouchEnabled()); } } //Show/Hide Info Fetcher ui->infoFetcherExpander->setCurrentIndex(0); ui->infoFetcherExpander->setVisible(false); showInfoFetcher(); //Get context data for info boxes int totalInfoBoxes = ui->infoBoxHolder->layout()->count(); QStringList contextLRIs; QStringList contextTitles; if (m_context.count() <= 20) { //TODO: This should be configurable for (int i = 0; i < m_context.count(); i++) { MediaItem contextCategory = m_context.at(i); if (i == 0) { contextTitles = contextCategory.fields["contextTitles"].toStringList(); contextLRIs = contextCategory.fields["contextLRIs"].toStringList(); continue; } QStringList currentContextTitles = contextCategory.fields["contextTitles"].toStringList(); QStringList currentContextLRIs = contextCategory.fields["contextLRIs"].toStringList(); QStringList mergedContextLRIs; QStringList mergedContextTitles; for (int j = 0; j < currentContextLRIs.count(); j++) { if (j < contextLRIs.count() ) { QString mergedContextLRI = Utilities::mergeLRIs(contextLRIs.at(j), currentContextLRIs.at(j)); if (!mergedContextLRI.isEmpty()) { mergedContextLRIs.append(mergedContextLRI); mergedContextTitles.append(currentContextTitles.at(j)); } } } contextTitles = mergedContextTitles; contextLRIs = mergedContextLRIs; } //Load any context infoboxes totalInfoBoxes = ui->infoBoxHolder->layout()->count(); for (int i = 0; i < contextLRIs.count(); i++) { QString title = contextTitles.at(i); QString lri = contextLRIs.at(i); if (i < totalInfoBoxes) { InfoBox * infoBox = (InfoBox *)ui->infoBoxHolder->layout()->itemAt(i)->widget(); MediaItemModel * infoBoxModel = (MediaItemModel *)infoBox->mediaView()->sourceModel(); if (infoBoxModel->mediaListProperties().lri != lri) { infoBox->setInfo(title, lri); } else { infoBox->setTitle(title); } } else { InfoBox *infoBox = new InfoBox; infoBox->setMainWindow(m_parent); infoBox->setInfo(title, lri); if (m_enableTouch) { infoBox->enableTouch(); } QVBoxLayout * infoBoxHolderLayout = (QVBoxLayout *)ui->infoBoxHolder->layout(); infoBoxHolderLayout->addWidget(infoBox); connect(infoBox->mediaView()->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(infoBoxSelectionChanged(const QItemSelection, const QItemSelection))); } } } //Remove any unused infoboxes totalInfoBoxes = ui->infoBoxHolder->layout()->count(); if (contextLRIs.count() < totalInfoBoxes) { for (int i = contextLRIs.count(); i < totalInfoBoxes; i++) { int lastItemIndex = ui->infoBoxHolder->layout()->count() - 1; if (lastItemIndex >= 0) { InfoBox * unusedInfoBox = (InfoBox *)ui->infoBoxHolder->layout()->itemAt(lastItemIndex)->widget(); disconnect(unusedInfoBox->mediaView()->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(infoBoxSelectionChanged(const QItemSelection, const QItemSelection))); ui->infoBoxHolder->layout()->removeWidget(unusedInfoBox); delete unusedInfoBox; } } } } void InfoManager::showIndexer() { //Show indexer for selected local filelistengine items bool indexerVisible = false; if (m_nepomukInited) { bool isLocalFileList = false; MediaListProperties viewProperties = m_application->browsingModel()->mediaListProperties(); if (viewProperties.lri.startsWith("files://") && viewProperties.engineFilterList().count() >= 2) { KUrl viewUrl(viewProperties.engineFilterList().at(1)); if (!viewUrl.isEmpty() && viewUrl.isLocalFile()) { isLocalFileList = true; } } QModelIndexList selectedRows = ui->mediaView->selectionModel()->selectedRows(); MediaSortFilterProxyModel *proxy = (MediaSortFilterProxyModel *) ui->mediaView->model(); if (selectedRows.count() > 0) { for (int i = 0 ; i < selectedRows.count() ; ++i) { int row = proxy->mapToSource(selectedRows.at(i)).row(); MediaItem selectedItem = m_application->browsingModel()->mediaItemAt(row); MediaListProperties selectedProperties; selectedProperties.lri = selectedItem.url; if (selectedProperties.lri.startsWith("files://") && selectedProperties.engineFilterList().count() >= 2) { KUrl selectedUrl(selectedProperties.engineFilterList().at(1)); if (!selectedUrl.isEmpty() && selectedUrl.isLocalFile()) { indexerVisible = true; } else { indexerVisible = false; break; } } else if (isLocalFileList && (selectedItem.type == "Audio" || selectedItem.type == "Video")) { KUrl selectedUrl(selectedItem.url); if (!selectedUrl.isEmpty() && selectedUrl.isLocalFile()) { indexerVisible = true; } else { indexerVisible = false; break; } } else { indexerVisible = false; break; } } } } ui->infoIndexerHolder->setVisible(indexerVisible); } void InfoManager::showInfoFetcher() { if (m_infoItemModel->availableInfoFetchers().count() > 0) { //Load available InfoFetchers and determine if any are fetching info bool isFetching = false; ui->infoFetcherSelector->clear(); for (int i = 0; i < m_infoItemModel->availableInfoFetchers().count(); i++) { InfoFetcher * infoFetcher = m_infoItemModel->availableInfoFetchers().at(i); ui->infoFetcherSelector->addItem(infoFetcher->icon(), infoFetcher->name()); if (infoFetcher->isFetching()) { ui->infoFetcherSelector->setCurrentIndex(i); m_currentInfoFetcher = infoFetcher; isFetching = true; } } //Select default InfoFetcher if (ui->infoFetcherSelector->currentIndex() == -1) { m_currentInfoFetcher = m_infoItemModel->availableInfoFetchers().at(0); ui->infoFetcherSelector->setCurrentIndex(0); } //Show Info Fetcher UI if (!isFetching) { ui->showInfoFetcherExpander->setVisible(true); ui->infoFetcherHolder->setVisible(true); } //Offer Autofetch and Fetch buttons bool autoFetchVisible = m_infoItemModel->autoFetchIsAvailable(m_currentInfoFetcher); bool fetchVisible = m_infoItemModel->fetchIsAvailable(m_currentInfoFetcher); ui->infoAutoFetch->setVisible(autoFetchVisible); ui->infoFetch->setVisible(fetchVisible); } else { ui->infoFetcherHolder->setVisible(false); } } void InfoManager::showFetching() { //Hide everything but the fetching message if (ui->infoFetcherExpander->isVisible()) { toggleShowInfoFetcherExpander(); } ui->infoFetcherHolder->setVisible(false); ui->showInfoFetcherExpander->setVisible(false); } void InfoManager::fetchComplete() { ui->showInfoFetcherExpander->setVisible(true); //Determine if multiple matches are available for fetched info and show them if (m_infoItemModel->fetchedMatches().count() > 1) { disconnect(ui->fetchedMatches, SIGNAL(currentRowChanged(int)), m_infoItemModel, SLOT(selectFetchedMatch(int))); ui->fetchedMatches->clear(); QList fetchedMatches = m_infoItemModel->fetchedMatches(); for (int i = 0; i < fetchedMatches.count(); i++) { ui->fetchedMatches->addItem(fetchedMatches.at(i).title); } ui->fetchedMatches->setCurrentRow(0);; connect(ui->fetchedMatches, SIGNAL(currentRowChanged(int)), m_infoItemModel, SLOT(selectFetchedMatch(int))); if (!ui->infoFetcherExpander->isVisible()) { toggleShowInfoFetcherExpander(); } ui->infoFetcherExpander->setCurrentIndex(1); ui->fetchedMatches->setFocus(); } else { ui->infoFetcherExpander->setCurrentIndex(0); if (ui->infoFetcherExpander->isVisible()) { toggleShowInfoFetcherExpander(); } } ui->infoFetcherHolder->setVisible(true); } void InfoManager::infoBoxSelectionChanged (const QItemSelection & selected, const QItemSelection & deselected) { if (selected.indexes().count() > 0) { //Only allow one item in one infobox to be selected at a time. int totalInfoBoxes = ui->infoBoxHolder->layout()->count(); for (int i = 0; i < totalInfoBoxes; i++) { InfoBox * infoBox = (InfoBox *)ui->infoBoxHolder->layout()->itemAt(i)->widget(); if (infoBox->mediaView()->selectionModel()->selectedRows().count() > 0) { if (infoBox->mediaView()->selectionModel()->selection().indexes().at(0) != selected.indexes().at(0)) { infoBox->mediaView()->selectionModel()->clearSelection(); } } } //Store selected Media Item m_selectedInfoBoxMediaItems.clear(); MediaSortFilterProxyModel * proxyModel = (MediaSortFilterProxyModel *)selected.indexes().at(0).model(); MediaItemModel * model = (MediaItemModel *)proxyModel->sourceModel(); int selectedRow = selected.indexes().at(0).row(); m_selectedInfoBoxMediaItems.append(model->mediaItemAt(selectedRow)); emit infoBoxSelectionChanged(m_selectedInfoBoxMediaItems); //Show "Play Selected" button ui->playAll->setVisible(false); ui->playSelected->setVisible(true); } else { //Check to see if other infoboxes has something selected; //this handles deselection of infobox mediaItems bool selected = false; int totalInfoBoxes = ui->infoBoxHolder->layout()->count() - 1; for (int i = 0; i < totalInfoBoxes; i++) { InfoBox * infoBox = (InfoBox *)ui->infoBoxHolder->layout()->itemAt(i)->widget(); if (infoBox->mediaView()->selectionModel()->selectedRows().count() > 0) { selected = true; break; } } if (!selected) { m_selectedInfoBoxMediaItems.clear(); emit infoBoxSelectionChanged(m_selectedInfoBoxMediaItems); } } Q_UNUSED(deselected); } const QList InfoManager::selectedInfoBoxMediaItems() { return m_selectedInfoBoxMediaItems; } void InfoManager::clearInfoBoxSelection() { int totalInfoBoxes = ui->infoBoxHolder->layout()->count() - 1; for (int i = 0; i < totalInfoBoxes; i++) { InfoBox * infoBox = (InfoBox *)ui->infoBoxHolder->layout()->itemAt(i)->widget(); if (infoBox->mediaView()->selectionModel()->selectedRows().count() > 0) { infoBox->mediaView()->selectionModel()->clearSelection(); } } m_selectedInfoBoxMediaItems.clear(); emit infoBoxSelectionChanged(m_selectedInfoBoxMediaItems); } void InfoManager::mediaListPropertiesChanged() { QModelIndexList selectedRows = ui->mediaView->selectionModel()->selectedRows(); if (selectedRows.count() == 0) { loadSelectedInfo(); } } void InfoManager::fetchingStatusUpdated() { QHash status = m_infoItemModel->fetchingStatus(); QString description = status["description"].toString(); int progress = status["progress"].toInt(); if (!description.isEmpty()) { ui->notificationWidget->setVisible(true); QFontMetrics fm(ui->notificationText->font()); QString notificationText = fm.elidedText(description, Qt::ElideRight, ui->notificationText->width()); ui->notificationText->setText(notificationText); } else { m_application->mediaListsManager()->delayedNotificationHide(); } if (progress >= 0 && progress <= 100) { ui->notificationProgress->setValue(progress); ui->notificationProgress->setVisible(true); } else { ui->notificationProgress->setVisible(false); } } void InfoManager::openInfoFetcherLink() { if (m_currentInfoFetcher->url().isValid()) { QDesktopServices::openUrl(m_currentInfoFetcher->url()); } } void InfoManager::enableTouch() { int tTouchable = BangarangApplication::TOUCH_TOUCHABLE_METRIC; int tVisual = BangarangApplication::TOUCH_VISUAL_METRIC; ui->showInfoFetcherExpander->setMinimumSize(tTouchable, tTouchable); ui->showInfoFetcherExpander->setIconSize(QSize(tVisual, tVisual)); ui->infoFetcherHolder->setMaximumHeight(160); ui->infoFetcherSelector->setMinimumHeight(tTouchable); ui->infoFetcherLink->setMinimumSize(tTouchable, tTouchable); ui->infoFetcherLink->setIconSize(QSize(tVisual, tVisual)); ui->infoFetch->setMinimumHeight(tTouchable); ui->infoAutoFetch->setMinimumHeight(tTouchable); ui->infoItemSave->setMinimumHeight(tTouchable); ui->infoItemCancelEdit->setMinimumHeight(tTouchable); ui->infoIndexSelected->setMinimumHeight(tTouchable); ui->infoItemView->enableTouch(); FlickCharm *charm = new FlickCharm(ui->infoItemViewHolder); charm->activateOn(ui->infoItemViewHolder); m_enableTouch = true; } bangarang-bangarang/src/app/medialists/infomanager.h000066400000000000000000000065561166760560600231110ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef INFOMANAGER_H #define INFOMANAGER_H #include "../../platform/mediaitemmodel.h" #include #include #include #include namespace Ui { class MainWindowClass; } class MainWindow; class InfoItemModel; class InfoItemDelegate; class MediaItemDelegate; class BangarangApplication; class InfoFetcher; /* * This class provides a user interface for updating information associated with MediaItems */ class InfoManager : public QObject { Q_OBJECT public: InfoManager(MainWindow * parent); ~InfoManager(); const QList selectedInfoBoxMediaItems(); bool infoViewVisible(); void enableTouch(); public slots: void toggleInfoView(bool force = false); void showInfoView(); void hideInfoView(); void mediaSelectionChanged (const QItemSelection & selected, const QItemSelection & deselected); void saveItemInfo(); void loadSelectedInfo(); void showInfoViewForMediaItem(const MediaItem &mediaItem); void setContext(const MediaItem &category); void clearInfoBoxSelection(); void mediaListPropertiesChanged(); void removeSelectedItemsInfo(); void addSelectedItemsInfo(); void selectInfoFetcher(QAction * infoFetcherAction); private: void showIndexer(); BangarangApplication * m_application; MainWindow *m_parent; Ui::MainWindowClass *ui; bool m_nepomukInited; InfoItemModel *m_infoItemModel; InfoItemDelegate *m_infoItemDelegate; QList m_context; MediaItemModel *m_recentlyPlayedModel; MediaItemModel *m_highestRatedModel; MediaItemModel *m_frequentlyPlayedModel; MediaItem m_contextCategory; QList m_selectedInfoBoxMediaItems; QTimer *m_selectionTimer; bool m_infoViewVisible; InfoFetcher *m_currentInfoFetcher; bool m_enableTouch; private slots: void cancelItemEdit(); void infoBoxSelectionChanged (const QItemSelection & selected, const QItemSelection & deselected); void infoChanged(bool modified); void fetchInfo(); void autoFetchInfo(); void showFetching(); void fetchComplete(); void showInfoFetcher(); void toggleShowInfoFetcherExpander(); void selectInfoFetcher(int index); void fetchingStatusUpdated(); void openInfoFetcherLink(); Q_SIGNALS: void infoBoxSelectionChanged(QList selectedItems); }; #endif //INFOMANAGER_H bangarang-bangarang/src/app/medialists/medialistsettings.cpp000066400000000000000000000547461166760560600247160ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "medialistsettings.h" #include "../common/bangarangapplication.h" #include "medialistsmanager.h" #include "../common/ratingdelegate.h" #include "../../platform/utilities/utilities.h" #include "../common/mainwindow.h" #include "ui_mainwindow.h" #include "../../platform/mediaitemmodel.h" #include #include #include MediaListSettings::MediaListSettings(MainWindow * parent) : QObject(parent) { m_application = (BangarangApplication*)KApplication::kApplication(); m_parent = parent; ui = m_parent->ui; m_parent->audioListsStack()->ui->semATimeHolder->setVisible(false); m_parent->audioListsStack()->ui->semARatingHolder->setVisible(false); m_parent->audioListsStack()->ui->semAFreqHolder->setVisible(false); m_parent->videoListsStack()->ui->semVTimeHolder->setVisible(false); m_parent->videoListsStack()->ui->semVRatingHolder->setVisible(false); m_parent->videoListsStack()->ui->semVFreqHolder->setVisible(false); for (int i = 10; i >= 0; i--) { m_parent->audioListsStack()->ui->semARating->addItem(QIcon(), QString(), i); } for (int i = 10; i >= 0; i--) { m_parent->videoListsStack()->ui->semVRating->addItem(QIcon(), QString(), i); } connect(m_parent->audioListsStack()->ui->aCancelSemConfigure, SIGNAL(clicked()), this, SLOT(hideMediaListSettings())); connect(m_parent->videoListsStack()->ui->vCancelSemConfigure, SIGNAL(clicked()), this, SLOT(hideMediaListSettings())); connect(m_parent->audioListsStack()->ui->semAConfigSave, SIGNAL(clicked()), this, SLOT(saveMediaListSettings())); connect(m_parent->videoListsStack()->ui->semVConfigSave, SIGNAL(clicked()), this, SLOT(saveMediaListSettings())); connect(m_parent->audioListsStack()->ui->semASelectMore, SIGNAL(toggled(bool)), this, SLOT(moreSelected(bool))); connect(m_parent->videoListsStack()->ui->semVSelectMore, SIGNAL(toggled(bool)), this, SLOT(moreSelected(bool))); m_parent->audioListsStack()->ui->semATime->setDateTime(QDateTime::currentDateTime()); m_parent->videoListsStack()->ui->semVTime->setDateTime(QDateTime::currentDateTime()); } MediaListSettings::~MediaListSettings() { } void MediaListSettings::showMediaListSettings() { moreSelected(false); if (m_application->mediaListsManager()->currentMediaListSelection() == MediaListsManager::AudioList) { if (m_parent->audioListsStack()->ui->audioLists->selectionModel()->selectedIndexes().count() > 0) { int selectedRow = m_parent->audioListsStack()->ui->audioLists->selectionModel()->selectedIndexes().at(0).row(); MediaItem selectedItem = m_application->mediaListsManager()->audioListsModel()->mediaItemAt(selectedRow); m_parent->audioListsStack()->ui->aConfigureSemListTitle->setText(selectedItem.title); showMediaListSettingsForLri(selectedItem.url); readConfigEntryForLRI(selectedItem.url); } } else { if (m_parent->videoListsStack()->ui->videoLists->selectionModel()->selectedIndexes().count() > 0) { int selectedRow = m_parent->videoListsStack()->ui->videoLists->selectionModel()->selectedIndexes().at(0).row(); MediaItem selectedItem = m_application->mediaListsManager()->videoListsModel()->mediaItemAt(selectedRow); m_parent->videoListsStack()->ui->vConfigureSemListTitle->setText(selectedItem.title); showMediaListSettingsForLri(selectedItem.url); readConfigEntryForLRI(selectedItem.url); } } } void MediaListSettings::showMediaListSettingsForLri(const QString &lri) { if (m_application->mediaListsManager()->currentMediaListSelection() == MediaListsManager::AudioList) { if (lri.startsWith("semantics://")) { m_parent->audioListsStack()->ui->audioListsStack->setCurrentIndex(3); if (lri.startsWith("semantics://recent?")) { m_parent->audioListsStack()->ui->semATimeHolder->show(); m_parent->audioListsStack()->ui->semARatingHolder->hide(); m_parent->audioListsStack()->ui->semAFreqHolder->hide(); m_parent->audioListsStack()->ui->semAMoreVerb->setText(i18n("played")); m_parent->audioListsStack()->ui->semASelectMore->show(); } else if (lri.startsWith("semantics://highest?")) { m_parent->audioListsStack()->ui->semATimeHolder->hide(); m_parent->audioListsStack()->ui->semARatingHolder->show(); m_parent->audioListsStack()->ui->semAFreqHolder->hide(); m_parent->audioListsStack()->ui->semAMoreVerb->setText(i18n("rated")); m_parent->audioListsStack()->ui->semASelectMore->show(); } else if (lri.startsWith("semantics://frequent?")) { m_parent->audioListsStack()->ui->semATimeHolder->hide(); m_parent->audioListsStack()->ui->semARatingHolder->hide(); m_parent->audioListsStack()->ui->semAFreqHolder->show(); m_parent->audioListsStack()->ui->semAMoreVerb->setText(i18n("played")); m_parent->audioListsStack()->ui->semASelectMore->show(); } else if (lri.startsWith("semantics://recentlyadded?")) { m_parent->audioListsStack()->ui->semATimeHolder->hide(); m_parent->audioListsStack()->ui->semARatingHolder->hide(); m_parent->audioListsStack()->ui->semAFreqHolder->hide(); m_parent->audioListsStack()->ui->semAMoreVerb->hide(); m_parent->audioListsStack()->ui->semASelectMore->hide(); } } } else { if (lri.startsWith("semantics://")) { m_parent->videoListsStack()->ui->videoListsStack->setCurrentIndex(3); if (lri.startsWith("semantics://recent?")) { m_parent->videoListsStack()->ui->semVTimeHolder->show(); m_parent->videoListsStack()->ui->semVRatingHolder->hide(); m_parent->videoListsStack()->ui->semVFreqHolder->hide(); m_parent->videoListsStack()->ui->semVMoreVerb->setText(i18n("played")); m_parent->videoListsStack()->ui->semVSelectMore->show(); } else if (lri.startsWith("semantics://highest?")) { m_parent->videoListsStack()->ui->semVTimeHolder->hide(); m_parent->videoListsStack()->ui->semVRatingHolder->show(); m_parent->videoListsStack()->ui->semVFreqHolder->hide(); m_parent->videoListsStack()->ui->semVMoreVerb->setText(i18n("rated")); m_parent->videoListsStack()->ui->semVSelectMore->show(); } else if (lri.startsWith("semantics://frequent?")) { m_parent->videoListsStack()->ui->semVTimeHolder->hide(); m_parent->videoListsStack()->ui->semVRatingHolder->hide(); m_parent->videoListsStack()->ui->semVFreqHolder->show(); m_parent->videoListsStack()->ui->semVMoreVerb->setText(i18n("played")); m_parent->videoListsStack()->ui->semVSelectMore->show(); } else if (lri.startsWith("semantics://recentlyadded?")) { m_parent->videoListsStack()->ui->semVTimeHolder->hide(); m_parent->videoListsStack()->ui->semVRatingHolder->hide(); m_parent->videoListsStack()->ui->semVFreqHolder->hide(); m_parent->videoListsStack()->ui->semVMoreVerb->hide(); m_parent->videoListsStack()->ui->semVSelectMore->hide(); } } } } void MediaListSettings::hideMediaListSettings() { if (m_application->mediaListsManager()->currentMediaListSelection() == MediaListsManager::AudioList) { m_parent->audioListsStack()->ui->audioListsStack->setCurrentIndex(0); } else { m_parent->videoListsStack()->ui->videoListsStack->setCurrentIndex(0); } } void MediaListSettings::saveMediaListSettings() { if (m_application->mediaListsManager()->currentMediaListSelection() == MediaListsManager::AudioList) { int selectedRow = m_parent->audioListsStack()->ui->audioLists->selectionModel()->selectedIndexes().at(0).row(); MediaItem selectedItem = m_application->mediaListsManager()->audioListsModel()->mediaItemAt(selectedRow); writeConfigEntryForLRI(selectedItem.url); m_application->mediaListsManager()->audioListsModel()->reload(); m_parent->audioListsStack()->ui->audioListsStack->setCurrentIndex(0); } else { int selectedRow = m_parent->videoListsStack()->ui->videoLists->selectionModel()->selectedIndexes().at(0).row(); MediaItem selectedItem = m_application->mediaListsManager()->videoListsModel()->mediaItemAt(selectedRow); writeConfigEntryForLRI(selectedItem.url); m_application->mediaListsManager()->videoListsModel()->reload(); m_parent->videoListsStack()->ui->videoListsStack->setCurrentIndex(0); } } QStringList MediaListSettings::configEntryForLRI(const QString &lri) { QStringList configEntry; if (lri.startsWith("semantics://recent?audio")) { configEntry.append("RecentAudioLimit"); configEntry.append("RecentAudioPlayed"); } else if (lri.startsWith("semantics://frequent?audio")) { configEntry.append("FrequentAudioLimit"); configEntry.append("FrequentAudioPlayed"); } else if (lri.startsWith("semantics://highest?audio")) { configEntry.append("HighestAudioLimit"); configEntry.append("HighestAudioRated"); } else if (lri.startsWith("semantics://recentlyadded?audio")) { configEntry.append("RecentlyAddedAudioLimit"); configEntry.append("RecentlyAddedAudioRated"); } else if (lri.startsWith("semantics://recent?video")) { configEntry.append("RecentVideoLimit"); configEntry.append("RecentVideoPlayed"); } else if (lri.startsWith("semantics://frequent?video")) { configEntry.append("FrequentVideoLimit"); configEntry.append("FrequentVideoPlayed"); } else if (lri.startsWith("semantics://highest?video")) { configEntry.append("HighestVideoLimit"); configEntry.append("HighestVideoRated"); } else if (lri.startsWith("semantics://recentlyadded?video")) { configEntry.append("RecentlyAddedVideoLimit"); configEntry.append("RecentlyAddedVideoRated"); } return configEntry; } void MediaListSettings::readConfigEntryForLRI(const QString &lri) { QStringList configEntry = configEntryForLRI(lri); if (!configEntry.isEmpty() && configEntry.at(0).contains("Audio")) { KConfig config; KConfigGroup generalGroup( &config, "General" ); int limit = generalGroup.readEntry(configEntry.at(0), 20); m_parent->audioListsStack()->ui->semALimit->setValue(limit); m_parent->audioListsStack()->ui->semASelectMore->setChecked(false); if (configEntry.count() > 1) { if (generalGroup.hasKey(configEntry.at(1))) { QStringList entry = generalGroup.readEntry(configEntry.at(1), QStringList()); if (!entry.isEmpty() && configEntry.at(1) == "RecentAudioPlayed") { if (entry.at(0) == "<") { m_parent->audioListsStack()->ui->semATimeComp->setCurrentIndex(0); } else { m_parent->audioListsStack()->ui->semATimeComp->setCurrentIndex(1); } QDateTime recentDateTime = QDateTime::fromString(entry.at(1), "yyyyMMddHHmmss"); m_parent->audioListsStack()->ui->semATime->setDateTime(recentDateTime); m_parent->audioListsStack()->ui->semASelectMore->setChecked(true); } else if (!entry.isEmpty() && configEntry.at(1) == "HighestAudioRated") { if (entry.at(0) == ">=") { m_parent->audioListsStack()->ui->semARatingComp->setCurrentIndex(0); } else if (entry.at(0) == "=") { m_parent->audioListsStack()->ui->semARatingComp->setCurrentIndex(1); } else { m_parent->audioListsStack()->ui->semARatingComp->setCurrentIndex(2); } int ratingIndex = 10 - (entry.at(1).toInt()); if (ratingIndex < 0 || ratingIndex >= m_parent->audioListsStack()->ui->semARating->count()) { ratingIndex = 0; } m_parent->audioListsStack()->ui->semARating->setCurrentIndex(ratingIndex); m_parent->audioListsStack()->ui->semASelectMore->setChecked(true); } else if (!entry.isEmpty() && configEntry.at(1) == "FrequentAudioPlayed") { if (entry.at(0) == ">=") { m_parent->audioListsStack()->ui->semAFreqComp->setCurrentIndex(0); } else if (entry.at(0) == "=") { m_parent->audioListsStack()->ui->semAFreqComp->setCurrentIndex(1); } else { m_parent->audioListsStack()->ui->semAFreqComp->setCurrentIndex(2); } int frequentlyPlayedCount = qMax(0, entry.at(1).toInt()); m_parent->audioListsStack()->ui->semAFreq->setValue(frequentlyPlayedCount); m_parent->audioListsStack()->ui->semASelectMore->setChecked(true); } } } } else if (!configEntry.isEmpty() && configEntry.at(0).contains("Video")) { KConfig config; KConfigGroup generalGroup( &config, "General" ); int limit = generalGroup.readEntry(configEntry.at(0), 20); m_parent->videoListsStack()->ui->semVLimit->setValue(limit); m_parent->videoListsStack()->ui->semVSelectMore->setChecked(false); if (configEntry.count() > 1) { if (generalGroup.hasKey(configEntry.at(1))) { QStringList entry = generalGroup.readEntry(configEntry.at(1), QStringList()); if (!entry.isEmpty() && configEntry.at(1) == "RecentVideoPlayed") { if (entry.at(0) == "<") { m_parent->videoListsStack()->ui->semVTimeComp->setCurrentIndex(0); } else { m_parent->videoListsStack()->ui->semVTimeComp->setCurrentIndex(1); } QDateTime recentDateTime = QDateTime::fromString(entry.at(1), "yyyyMMddHHmmss"); m_parent->videoListsStack()->ui->semVTime->setDateTime(recentDateTime); m_parent->videoListsStack()->ui->semVSelectMore->setChecked(true); } else if (!entry.isEmpty() && configEntry.at(1) == "HighestVideoRated") { if (entry.at(0) == ">=") { m_parent->videoListsStack()->ui->semVRatingComp->setCurrentIndex(0); } else if (entry.at(0) == "=") { m_parent->videoListsStack()->ui->semVRatingComp->setCurrentIndex(1); } else { m_parent->videoListsStack()->ui->semVRatingComp->setCurrentIndex(2); } int ratingIndex = 10 - (entry.at(1).toInt()); if (ratingIndex < 0 || ratingIndex >= m_parent->videoListsStack()->ui->semVRating->count()) { ratingIndex = 0; } m_parent->videoListsStack()->ui->semVRating->setCurrentIndex(ratingIndex); m_parent->videoListsStack()->ui->semVSelectMore->setChecked(true); } else if (!entry.isEmpty() && configEntry.at(1) == "FrequentVideoPlayed") { if (entry.at(0) == ">=") { m_parent->videoListsStack()->ui->semVFreqComp->setCurrentIndex(0); } else if (entry.at(0) == "=") { m_parent->videoListsStack()->ui->semVFreqComp->setCurrentIndex(1); } else { m_parent->videoListsStack()->ui->semVFreqComp->setCurrentIndex(2); } int frequentlyPlayedCount = qMax(0, entry.at(1).toInt()); m_parent->videoListsStack()->ui->semVFreq->setValue(frequentlyPlayedCount); m_parent->videoListsStack()->ui->semVSelectMore->setChecked(true); } } } } } void MediaListSettings::writeConfigEntryForLRI(const QString &lri) { QStringList configEntry = configEntryForLRI(lri); if (!configEntry.isEmpty() && configEntry.at(0).contains("Audio")) { KConfig config; KConfigGroup generalGroup( &config, "General" ); int limit = m_parent->audioListsStack()->ui->semALimit->value(); generalGroup.writeEntry(configEntry.at(0), limit); if (m_parent->audioListsStack()->ui->semASelectMore->isChecked() && configEntry.count() > 1) { if (configEntry.at(1) == "RecentAudioPlayed") { QStringList entry; if (m_parent->audioListsStack()->ui->semATimeComp->currentIndex() == 0) { entry.append("<"); } else { entry.append(">"); } entry.append(m_parent->audioListsStack()->ui->semATime->dateTime().toString("yyyyMMddHHmmss")); generalGroup.writeEntry(configEntry.at(1), entry); } else if (configEntry.at(1) == "HighestAudioRated") { QStringList entry; if (m_parent->audioListsStack()->ui->semARatingComp->currentIndex() == 0) { entry.append(">="); } else if (m_parent->audioListsStack()->ui->semARatingComp->currentIndex() == 1) { entry.append("="); } else { entry.append("<="); } entry.append(QString("%1").arg(10 - m_parent->audioListsStack()->ui->semARating->currentIndex())); generalGroup.writeEntry(configEntry.at(1), entry); } else if (configEntry.at(1) == "FrequentAudioPlayed") { QStringList entry; if (m_parent->audioListsStack()->ui->semAFreqComp->currentIndex() == 0) { entry.append(">="); } else if (m_parent->audioListsStack()->ui->semAFreqComp->currentIndex() == 1) { entry.append("="); } else { entry.append("<="); } entry.append(QString("%1").arg(m_parent->audioListsStack()->ui->semAFreq->value())); generalGroup.writeEntry(configEntry.at(1), entry); } } else if (configEntry.count() > 1) { generalGroup.deleteEntry(configEntry.at(1)); } config.sync(); } else if (!configEntry.isEmpty() && configEntry.at(0).contains("Video")) { KConfig config; KConfigGroup generalGroup( &config, "General" ); int limit = m_parent->videoListsStack()->ui->semVLimit->value(); generalGroup.writeEntry(configEntry.at(0), limit); if (m_parent->videoListsStack()->ui->semVSelectMore->isChecked() && configEntry.count() > 1) { if (configEntry.at(1) == "RecentVideoPlayed") { QStringList entry; if (m_parent->videoListsStack()->ui->semVTimeComp->currentIndex() == 0) { entry.append("<"); } else { entry.append(">"); } entry.append(m_parent->videoListsStack()->ui->semVTime->dateTime().toString("yyyyMMddHHmmss")); generalGroup.writeEntry(configEntry.at(1), entry); } else if (configEntry.at(1) == "HighestVideoRated") { QStringList entry; if (m_parent->videoListsStack()->ui->semVRatingComp->currentIndex() == 0) { entry.append(">="); } else if (m_parent->videoListsStack()->ui->semVRatingComp->currentIndex() == 1) { entry.append("="); } else { entry.append("<="); } entry.append(QString("%1").arg(10 - m_parent->videoListsStack()->ui->semVRating->currentIndex())); generalGroup.writeEntry(configEntry.at(1), entry); } else if (configEntry.at(1) == "FrequentVideoPlayed") { QStringList entry; if (m_parent->videoListsStack()->ui->semVFreqComp->currentIndex() == 0) { entry.append(">="); } else if (m_parent->videoListsStack()->ui->semVFreqComp->currentIndex() == 1) { entry.append("="); } else { entry.append("<="); } entry.append(QString("%1").arg(m_parent->videoListsStack()->ui->semVFreq->value())); generalGroup.writeEntry(configEntry.at(1), entry); } } else if (configEntry.count() > 1) { generalGroup.deleteEntry(configEntry.at(1)); } config.sync(); } } void MediaListSettings::moreSelected(bool checked) { if (m_application->mediaListsManager()->currentMediaListSelection() == MediaListsManager::AudioList) { m_parent->audioListsStack()->ui->semATimeComp->setEnabled(checked); m_parent->audioListsStack()->ui->semATime->setEnabled(checked); m_parent->audioListsStack()->ui->semARatingComp->setEnabled(checked); m_parent->audioListsStack()->ui->semARating->setEnabled(checked); m_parent->audioListsStack()->ui->semAFreqComp->setEnabled(checked); m_parent->audioListsStack()->ui->semAFreq->setEnabled(checked); } else { m_parent->videoListsStack()->ui->semVTimeComp->setEnabled(checked); m_parent->videoListsStack()->ui->semVTime->setEnabled(checked); m_parent->videoListsStack()->ui->semVRatingComp->setEnabled(checked); m_parent->videoListsStack()->ui->semVRating->setEnabled(checked); m_parent->videoListsStack()->ui->semVFreqComp->setEnabled(checked); m_parent->videoListsStack()->ui->semVFreq->setEnabled(checked); } } bangarang-bangarang/src/app/medialists/medialistsettings.h000066400000000000000000000035561166760560600243540ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIALISTSETTINGS_H #define MEDIALISTSETTINGS_H #include #include #include namespace Ui { class MainWindowClass; } class MainWindow; class MediaItem; class MediaItemModel; class BangarangApplication; /* * This class provides a user interface for saving and removing media lists * FIXME: Need interface to rename (or configure?) media lists */ class MediaListSettings : public QObject { Q_OBJECT public: MediaListSettings(MainWindow * parent); ~MediaListSettings(); public slots: void showMediaListSettings(); void hideMediaListSettings(); void saveMediaListSettings(); private: BangarangApplication* m_application; MainWindow *m_parent; Ui::MainWindowClass *ui; void showMediaListSettingsForLri(const QString &lri); QStringList configEntryForLRI(const QString &lri); void readConfigEntryForLRI(const QString &lri); void writeConfigEntryForLRI(const QString &lri); private slots: void moreSelected(bool); }; #endif //MEDIALISTSETTINGS_H bangarang-bangarang/src/app/medialists/medialistsmanager.cpp000066400000000000000000000603221166760560600246360ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "medialistsmanager.h" #include "../common/bangarangapplication.h" #include "../common/mainwindow.h" #include "ui_mainwindow.h" #include "../common/mediaview.h" #include "infomanager.h" #include "../common/actionsmanager.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/utilities/artwork.h" #include "../../platform/utilities/general.h" #include #include MediaListsManager::MediaListsManager(MainWindow* parent) : QObject(parent) { m_application = (BangarangApplication*)KApplication::kApplication(); Ui::MainWindowClass* ui = m_application->mainWindow()->ui; //Set up Audio lists view MediaListProperties audioListsProperties; audioListsProperties.lri = "medialists://audio"; m_audioListsModel = new MediaItemModel(this); m_audioListsModel->setMediaListProperties(audioListsProperties); QListView* audioLists = m_application->mainWindow()->audioListsStack()->ui->audioLists; audioLists->setModel(m_audioListsModel); connect(audioLists->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(audioListsSelectionChanged(const QItemSelection, const QItemSelection))); connect(m_audioListsModel, SIGNAL(mediaListChanged()), this, SLOT(audioListsChanged())); m_audioListsModel->load(); QToolButton* audioListSelect = m_application->mainWindow()->ui->audioListSelect; connect(audioListSelect, SIGNAL(clicked()), this, SLOT(selectAudioList())); //Set up Video lists view MediaListProperties videoListsProperties; videoListsProperties.lri = "medialists://video"; m_videoListsModel = new MediaItemModel(this); m_videoListsModel->setMediaListProperties(videoListsProperties); QListView* videoLists = m_application->mainWindow()->videoListsStack()->ui->videoLists; videoLists->setModel(m_videoListsModel); connect(videoLists->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(videoListsSelectionChanged(const QItemSelection, const QItemSelection))); connect(m_videoListsModel, SIGNAL(mediaListChanged()), this, SLOT(videoListsChanged())); m_videoListsModel->load(); QToolButton* videoListSelect = m_application->mainWindow()->ui->videoListSelect; connect(videoListSelect, SIGNAL(clicked()), this, SLOT(selectVideoList())); //Set up media list view m_loadingProgress = 0; MediaView* mediaView = ui->mediaView; mediaView->setMainWindow(m_application->mainWindow()); mediaView->setSourceModel(m_application->browsingModel()); connect(m_application->browsingModel(), SIGNAL(mediaListChanged()), this, SLOT(mediaListChanged())); connect(m_application->browsingModel(), SIGNAL(mediaListPropertiesChanged()), this, SLOT(mediaListPropertiesChanged())); connect(m_application->browsingModel(), SIGNAL(loading()), this, SLOT(mediaListLoading())); connect(m_application->browsingModel(), SIGNAL(loadingStateChanged(bool)), this, SLOT(mediaListLoadingStateChanged(bool))); connect(m_application->browsingModel(), SIGNAL(propertiesChanged()), this, SLOT(updateListHeader())); connect((MediaItemDelegate *)mediaView->itemDelegate(), SIGNAL(categoryActivated(QModelIndex)), this, SLOT(mediaListCategoryActivated(QModelIndex))); connect((MediaItemDelegate *)mediaView->itemDelegate(), SIGNAL(actionActivated(QModelIndex)), this, SLOT(mediaListActionActivated(QModelIndex))); connect(mediaView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(mediaSelectionChanged(const QItemSelection, const QItemSelection))); connect(ui->previous, SIGNAL(clicked()), this, SLOT(loadPreviousList())); connect(m_application->playlist()->nowPlayingModel(), SIGNAL(mediaListChanged()), this, SLOT(nowPlayingChanged())); connect(m_application->mainWindow(), SIGNAL(switchedMainWidget(MainWindow::MainWidget)), this, SLOT(defaultListLoad(MainWindow::MainWidget))); //Setup media list filter ui->mediaListFilterProxyLine->lineEdit()->setClickMessage(QString()); ui->mediaListFilterProxyLine->setProxy(ui->mediaView->filterProxyModel()); ui->mediaListFilter->setVisible(false); connect(ui->closeMediaListFilter, SIGNAL(clicked()), this, SLOT(closeMediaListFilter())); //Set up play select/all buttons connect(ui->playAll, SIGNAL(clicked()), this, SLOT(playAll())); connect(ui->playSelected, SIGNAL(clicked()), this, SLOT(playSelected())); //Setup browsing model status notifications connect(m_application->browsingModel(), SIGNAL(statusUpdated()), this, SLOT(browsingModelStatusUpdated())); //Set up search KLineEdit* searchField = m_application->mainWindow()->ui->Filter; connect(searchField, SIGNAL(returnPressed()), this, SLOT(loadSearch())); //Set up device notifier connect(DeviceManager::instance(), SIGNAL(deviceListChanged(DeviceManager::RelatedType)), this, SLOT(updateDeviceList(DeviceManager::RelatedType))); //Set default media list selection showMediaList(AudioList); } //--- Audio lists slots --- void MediaListsManager::audioListsSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected) { if ((m_mediaListSelection == AudioList) && (m_application->mainWindow()->currentMainWidget() == MainWindow::MainMediaList) && (selected.indexes().count() > 0)) { int selectedRow = selected.indexes().at(0).row(); loadMediaList(m_audioListsModel, selectedRow); } Q_UNUSED(deselected); } void MediaListsManager::audioListsChanged() { QModelIndex index = m_audioListsModel->index(0, 0); if (index.isValid()) { QListView* audioLists = m_application->mainWindow()->audioListsStack()->ui->audioLists; audioLists->selectionModel()->select( index, QItemSelectionModel::Select ); } } //--- Video Lists slots --- void MediaListsManager::videoListsSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected) { if ((m_mediaListSelection == VideoList) && (m_application->mainWindow()->currentMainWidget() == MainWindow::MainMediaList) && (selected.indexes().count() > 0)) { int selectedRow = selected.indexes().at(0).row(); loadMediaList(m_videoListsModel, selectedRow); } Q_UNUSED(deselected); } void MediaListsManager::videoListsChanged() { QModelIndex index = m_videoListsModel->index(0, 0); if (index.isValid()) { QListView* videoLists = m_application->mainWindow()->videoListsStack()->ui->videoLists; videoLists->selectionModel()->select( index, QItemSelectionModel::Select ); } } //--- Main Media List slots --- void MediaListsManager::mediaListChanged() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; ui->listTitle->setText(m_application->browsingModel()->mediaListProperties().name); ui->listSummary->setText(m_application->browsingModel()->mediaListProperties().summary); MediaItemModel* model = m_application->browsingModel(); if ((model->rowCount() > 0) && (ui->mediaViewHolder->currentIndex() ==0)) { MediaItem firstListItem = model->mediaItemAt(0); QString listItemType = firstListItem.type; if ((listItemType == "Audio") || (listItemType == "Video") || (listItemType == "Category")) { if (!firstListItem.fields["isTemplate"].toBool()) { ui->playAll->setVisible(true); } } else { ui->playAll->setVisible(false); } ui->playSelected->setVisible(false); } } void MediaListsManager::mediaListLoading() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (ui->mediaListFilter->isVisible()) { ui->mediaListFilterProxyLine->lineEdit()->clear(); hidePlayButtons(); } } void MediaListsManager::mediaListLoadingStateChanged(bool loading) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (loading) { if (!ui->loadingIndicator->isVisible()) { ui->loadingIndicator->show(); showMediaListLoading(); } } else { ui->loadingIndicator->hide(); } } void MediaListsManager::mediaListPropertiesChanged() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; ui->listTitle->setText(m_application->browsingModel()->mediaListProperties().name); ui->listSummary->setText(m_application->browsingModel()->mediaListProperties().summary); } void MediaListsManager::updateListHeader() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; ui->listTitle->setText(m_application->browsingModel()->mediaListProperties().name); ui->listSummary->setText(m_application->browsingModel()->mediaListProperties().summary); } void MediaListsManager::mediaListCategoryActivated(QModelIndex index) { addListToHistory(); m_application->browsingModel()->categoryActivated(index); } void MediaListsManager::mediaListActionActivated(QModelIndex index) { addListToHistory(); m_application->browsingModel()->actionActivated(index); } void MediaListsManager::mediaSelectionChanged (const QItemSelection & selected, const QItemSelection & deselected ) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; QModelIndexList selectedIndexes = ui->mediaView->selectionModel()->selectedIndexes(); // use this instead of selected which works better after a selectAll if (selectedIndexes.count() > 0) { int firstRow = selectedIndexes.at(0).row(); MediaItem firstSelectedItem = m_application->browsingModel()->mediaItemAt(firstRow); QString itemType = firstSelectedItem.type; if ((itemType == "Audio") || (itemType == "Video") || (itemType == "Category")) { if (firstSelectedItem.fields.contains("isTemplate") && firstSelectedItem.fields["isTemplate"].toBool()) { ui->playSelected->setVisible(false); } else { ui->playSelected->setVisible(true); } ui->playAll->setVisible(false); } else { ui->playSelected->setVisible(false); ui->playAll->setVisible(false); } } else { MediaItem firstListItem = m_application->browsingModel()->mediaItemAt(0); QString itemType = firstListItem.type; if ((itemType == "Audio") || (itemType == "Video") || (itemType == "Category")) { if (firstListItem.fields.contains("isTemplate") && firstListItem.fields["isTemplate"].toBool()) { ui->playAll->setVisible(false); } else { ui->playAll->setVisible(true); } ui->playSelected->setVisible(false); } else { ui->playSelected->setVisible(false); ui->playAll->setVisible(false); } } Q_UNUSED(selected); Q_UNUSED(deselected); } void MediaListsManager::closeMediaListFilter() { m_application->actionsManager()->action("toggle_filter")->trigger(); } //--- General Functions --- void MediaListsManager::loadMediaList(MediaItemModel *listsModel, int row) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; MediaListProperties currentProperties; MediaItem selectedItem = listsModel->mediaItemAt(row); currentProperties.name = selectedItem.title; currentProperties.lri = selectedItem.url; currentProperties.category = selectedItem; if (m_application->browsingModel()->mediaListProperties().lri != currentProperties.lri) { m_application->browsingModel()->clearMediaListData(); m_application->browsingModel()->setMediaListProperties(currentProperties); m_application->browsingModel()->load(); m_mediaListHistory.clear(); m_mediaListPropertiesHistory.clear(); ui->previous->setVisible(false); ui->mediaViewHolder->setCurrentIndex(0); } //Update InfoManager Context m_application->infoManager()->setContext(selectedItem); //Determine if selected list is configurable bool isAudioList = (listsModel->mediaListProperties().lri == "medialists://audio"); bool isVideoList = (listsModel->mediaListProperties().lri == "medialists://video"); bool selectedIsConfigurable = selectedItem.fields["isConfigurable"].toBool(); if (isAudioList) { m_application->mainWindow()->audioListsStack()->ui->configureAudioList->setVisible(selectedIsConfigurable); } else if (isVideoList) { m_application->mainWindow()->videoListsStack()->ui->configureVideoList->setVisible(selectedIsConfigurable); } } void MediaListsManager::loadPreviousList() { if (m_mediaListHistory.isEmpty()) { return; } Ui::MainWindowClass* ui = m_application->mainWindow()->ui; m_application->browsingModel()->clearMediaListData(); m_application->browsingModel()->setMediaListProperties(m_mediaListPropertiesHistory.last()); m_application->browsingModel()->loadMediaList(m_mediaListHistory.last(), true); QApplication::processEvents(); // Allows view to get updated before scrollbar is set ui->mediaView->verticalScrollBar()->setValue(m_mediaListScrollHistory.last()); //Clean up history and update previous button m_mediaListHistory.removeLast(); m_mediaListPropertiesHistory.removeLast(); m_mediaListScrollHistory.removeLast(); if (m_mediaListPropertiesHistory.count() > 0) { ui->previous->setVisible(true); ui->previous->setText(m_mediaListPropertiesHistory.last().name); } else { ui->previous->setVisible(false); } } void MediaListsManager::addListToHistory() { //Add medialList to history Ui::MainWindowClass* ui = m_application->mainWindow()->ui; QList mediaList = m_application->browsingModel()->mediaList(); m_mediaListHistory.append(mediaList); m_mediaListPropertiesHistory << m_application->browsingModel()->mediaListProperties(); m_mediaListScrollHistory << ui->mediaView->verticalScrollBar()->value(); QString previousButtonText(m_application->browsingModel()->mediaListProperties().name); ui->previous->setText(previousButtonText); ui->previous->setVisible(true); } void MediaListsManager::hidePlayButtons() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; ui->playSelected->setVisible(false); ui->playAll->setVisible(false); } void MediaListsManager::showMediaListLoading() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (ui->loadingIndicator->isVisible()) { m_loadingProgress++; if ((m_loadingProgress > 7) || (m_loadingProgress < 0)) { m_loadingProgress = 0; } QString iconName = QString("bangarang-loading-%1").arg(m_loadingProgress); QPixmap pixmap = KIcon(iconName).pixmap(16, 16); ui->loadingIndicator->setPixmap(pixmap); QTimer::singleShot(100, this, SLOT(showMediaListLoading())); } } void MediaListsManager::selectAudioList() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; showMediaList(AudioList); m_application->mainWindow()->audioListsStack()->ui->audioListsStack->setCurrentIndex(0); QListView* audioLists = m_application->mainWindow()->audioListsStack()->ui->audioLists; if (audioLists->selectionModel()->selectedIndexes().count() > 0){ int selectedRow = audioLists->selectionModel()->selectedIndexes().at(0).row(); loadMediaList(m_audioListsModel, selectedRow); } m_application->mainWindow()->audioListsStack()->ui->audioLists->setFocus(); ui->Filter->setClickMessage(i18n("Search for audio")); ui->Filter->clear(); } void MediaListsManager::selectVideoList() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; showMediaList(VideoList); m_application->mainWindow()->videoListsStack()->ui->videoListsStack->setCurrentIndex(0); QListView* videoLists = m_application->mainWindow()->videoListsStack()->ui->videoLists; if (videoLists->selectionModel()->selectedIndexes().count() > 0){ int selectedRow = videoLists->selectionModel()->selectedIndexes().at(0).row(); loadMediaList(m_videoListsModel, selectedRow); } m_application->mainWindow()->videoListsStack()->ui->videoLists->setFocus(); ui->Filter->setClickMessage(i18n("Search for video")); ui->Filter->clear(); } void MediaListsManager::loadSearch() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; ui->mediaView->setFocus(); QListView* audioLists = m_application->mainWindow()->audioListsStack()->ui->audioLists; audioLists->selectionModel()->clearSelection(); QListView* videoLists = m_application->mainWindow()->videoListsStack()->ui->videoLists; videoLists->selectionModel()->clearSelection(); if (!ui->Filter->text().isEmpty()) { addListToHistory(); if (m_mediaListSelection == MediaListsManager::AudioList) { MediaListProperties searchProperties; searchProperties.name = i18n("Audio Search"); searchProperties.lri = QString("music://search?%1").arg(ui->Filter->text()); m_application->browsingModel()->clearMediaListData(); m_application->browsingModel()->setMediaListProperties(searchProperties); m_application->browsingModel()->load(); } else { MediaListProperties searchProperties; searchProperties.name = i18n("Video Search"); searchProperties.lri = QString("video://search?%1").arg(ui->Filter->text()); m_application->browsingModel()->clearMediaListData(); m_application->browsingModel()->setMediaListProperties(searchProperties); m_application->browsingModel()->load(); } } } void MediaListsManager::showMediaList(MediaListSelection listSelection) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (listSelection == AudioList) { ui->videoListsStackHolder->layout()->removeWidget(m_application->mainWindow()->videoListsStack()); ui->videoListsStackHolder->hide(); ui->videoListsSelectHolder->show(); ui->videoListLabel->hide(); ui->audioListsStackHolder->layout()->addWidget(m_application->mainWindow()->audioListsStack()); ui->audioListsStackHolder->show(); ui->audioListsSelectHolder->hide(); ui->audioListLabel->show(); m_application->mainWindow()->resetTabOrder(); m_application->mainWindow()->audioListsStack()->ui->audioLists->setFocus(); } else if (listSelection == VideoList) { ui->audioListsStackHolder->layout()->removeWidget(m_application->mainWindow()->audioListsStack()); ui->audioListsStackHolder->hide(); ui->audioListsSelectHolder->show(); ui->audioListLabel->hide(); ui->videoListsStackHolder->layout()->addWidget(m_application->mainWindow()->videoListsStack()); ui->videoListsStackHolder->show(); ui->videoListsSelectHolder->hide(); ui->videoListLabel->show(); m_application->mainWindow()->resetTabOrder(); m_application->mainWindow()->videoListsStack()->ui->videoLists->setFocus(); } m_mediaListSelection = listSelection; } MediaListsManager::MediaListSelection MediaListsManager::currentMediaListSelection() { return m_mediaListSelection; } MediaItemModel* MediaListsManager::audioListsModel() { return m_audioListsModel; } MediaItemModel* MediaListsManager::videoListsModel() { return m_videoListsModel; } void MediaListsManager::updateDeviceList(DeviceManager::RelatedType type) { if ( type == DeviceManager::AudioType || type == DeviceManager::AllTypes ) { m_audioListsModel->clearMediaListData(); m_audioListsModel->load(); } if ( type == DeviceManager::VideoType || type == DeviceManager::AllTypes ) { m_videoListsModel->clearMediaListData(); m_videoListsModel->load(); } } void MediaListsManager::playSelected() { m_application->actionsManager()->setContextMenuSource(MainWindow::Default); m_application->actionsManager()->action("play_selected")->trigger(); } void MediaListsManager::playAll() { m_application->actionsManager()->action("play_all")->trigger(); } void MediaListsManager::browsingModelStatusUpdated() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; QHash status = m_application->browsingModel()->status(); QString description = status["description"].toString(); int progress = status["progress"].toInt(); if (!description.isEmpty()) { ui->notificationWidget->setVisible(true); QFontMetrics fm(ui->notificationText->font()); QString notificationText = fm.elidedText(description, Qt::ElideRight, ui->notificationText->width()); ui->notificationText->setText(notificationText); } else { ui->notificationText->setText(i18n("Complete")); delayedNotificationHide(); } if (progress >= 0 && progress <= 100) { ui->notificationProgress->setValue(progress); ui->notificationProgress->setVisible(true); } else { ui->notificationProgress->setVisible(false); } } void MediaListsManager::delayedNotificationHide() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; QTimer::singleShot(3000, ui->notificationWidget, SLOT(hide())); } void MediaListsManager::updateSeekTime(qint64 time) { //Add currently playing item to browsing model if contents is "Recently Played" if (time > 12000 && time < 13000) { if (m_application->playlist()->nowPlayingModel()->rowCount() == 0) { return; } MediaItem nowPlayingItem = m_application->playlist()->nowPlayingModel()->mediaItemAt(0); MediaListProperties mediaListProperties = m_application->browsingModel()->mediaListProperties(); if (!mediaListProperties.lri.startsWith(QString("semantics://recent?%1").arg(nowPlayingItem.type.toLower()))) { return; } QStringList filterList = mediaListProperties.engineFilterList(); int filterIndex = -1; for (int i = 0; i < filterList.count(); i++) { if (filterList.at(i).startsWith("lastPlayed")) { filterIndex = i; break; } } if (filterIndex >= 0) { if (mediaListProperties.filterOperator(filterList.at(filterIndex)) != ">") { return; } } nowPlayingItem.artwork = Utilities::defaultArtworkForMediaItem(nowPlayingItem); nowPlayingItem.semanticComment = Utilities::wordsForTimeSince(nowPlayingItem.fields["lastPlayed"].toDateTime()); m_application->browsingModel()->insertMediaItemAt(0, nowPlayingItem); } } void MediaListsManager::nowPlayingChanged() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; //Update Media List view int startRow = ui->mediaView->indexAt(ui->mediaView->rect().topLeft()).row(); int endRow = ui->mediaView->indexAt(ui->mediaView->rect().bottomRight()).row(); if (endRow == -1) { endRow = startRow + ui->mediaView->model()->rowCount(); } for (int i = startRow; i <= endRow; i++) { ui->mediaView->update(ui->mediaView->model()->index(i, 0)); } } void MediaListsManager::defaultListLoad(MainWindow::MainWidget which) { if (which != MainWindow::MainMediaList) { return; } if (!m_application->browsingModel()->mediaListProperties().lri.isEmpty()) { return; } if (m_mediaListSelection == MediaListsManager::AudioList) { selectAudioList(); } else { selectVideoList(); } } void MediaListsManager::showMenu() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; QMenu * menu = m_application->actionsManager()->mediaViewMenu(true); QPoint menuLocation = ui->showMediaViewMenu->mapToGlobal(QPoint(0,ui->showMediaViewMenu->height())); menu->exec(menuLocation); } bangarang-bangarang/src/app/medialists/medialistsmanager.h000066400000000000000000000061031166760560600243000ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2011 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIALISTSMANAGER_H #define MEDIALISTSMANAGER_H #include "../../platform/devicemanager.h" #include "../common/mainwindow.h" #include #include namespace Ui { class MainWindowClass; } class MainWindow; class MediaItem; class MediaItemModel; class MediaListProperties; class BangarangApplication; class MediaListsManager : public QObject { Q_OBJECT public: enum MediaListSelection{ AudioList = 0, VideoList = 1 }; MediaListsManager(MainWindow* parent); void loadMediaList(MediaItemModel* listsModel, int row); void addListToHistory(); void showMediaList(MediaListSelection listSelection); MediaListSelection currentMediaListSelection(); MediaItemModel* audioListsModel(); MediaItemModel* videoListsModel(); void showMenu(); public slots: void loadPreviousList(); void selectAudioList(); void selectVideoList(); void loadSearch(); void closeMediaListFilter(); void delayedNotificationHide(); private: BangarangApplication* m_application; MediaItemModel* m_audioListsModel; MediaItemModel* m_videoListsModel; MediaListSelection m_mediaListSelection; QList< QList > m_mediaListHistory; QList m_mediaListPropertiesHistory; QList m_mediaListScrollHistory; int m_loadingProgress; void hidePlayButtons(); private slots: void audioListsSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected); void audioListsChanged(); void videoListsSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected); void videoListsChanged(); void mediaListChanged(); void mediaListPropertiesChanged(); void mediaListLoading(); void mediaListLoadingStateChanged(bool); void updateListHeader(); void mediaListCategoryActivated(QModelIndex index); void mediaListActionActivated(QModelIndex index); void mediaSelectionChanged (const QItemSelection & selected, const QItemSelection & deselected); void updateDeviceList(DeviceManager::RelatedType type); void showMediaListLoading(); void playSelected(); void playAll(); void browsingModelStatusUpdated(); void updateSeekTime(qint64 time); void nowPlayingChanged(); void defaultListLoad(MainWindow::MainWidget which); }; #endif // MEDIALISTSMANAGER_H bangarang-bangarang/src/app/medialists/savedlistsmanager.cpp000066400000000000000000001460611166760560600246660ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "savedlistsmanager.h" #include "../common/bangarangapplication.h" #include "medialistsmanager.h" #include "../../platform/utilities/utilities.h" #include "../common/mainwindow.h" #include "infomanager.h" #include "../common/actionsmanager.h" #include "ui_mainwindow.h" #include "ui_audiolistsstack.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/playlist.h" #include #include #include #include #include #include #include SavedListsManager::SavedListsManager(MainWindow * parent) : QObject(parent) { m_application = (BangarangApplication *)KApplication::kApplication(); m_parent = parent; ui = m_parent->ui; m_parent->audioListsStack()->ui->aListSourceSelection->setEnabled(false); m_parent->videoListsStack()->ui->vListSourceSelection->setEnabled(false); m_parent->audioListsStack()->ui->ampacheServerAdd->setToolTip(i18n("Enter full server path.
" "For example,
" "- ownCloud, enter \"http://[host]/owncloud/apps/media\"
" "- Ampache, enter \"http://[host]/ampache\"
")); m_parent->audioListsStack()->ui->ampacheServer->setToolTip(i18n("Enter full server path.
" "For example,
" "- ownCloud, enter \"http://[host]/owncloud/apps/media\"
" "- Ampache, enter \"http://[host]/ampache\"
")); m_parent->audioListsStack()->ui->ampacheDataAdd->hide(); m_parent->audioListsStack()->ui->ampacheData->hide(); loadSavedListsIndex(); connect(m_parent->audioListsStack()->ui->addAudioList, SIGNAL(clicked()), this, SLOT(showAudioListSave())); connect(m_parent->videoListsStack()->ui->addVideoList, SIGNAL(clicked()), this, SLOT(showVideoListSave())); connect(m_parent->audioListsStack()->ui->aCancelSaveList, SIGNAL(clicked()), this, SLOT(returnToAudioList())); connect(m_parent->videoListsStack()->ui->vCancelSaveList, SIGNAL(clicked()), this, SLOT(returnToVideoList())); connect(m_parent->audioListsStack()->ui->saveAudioList, SIGNAL(clicked()), this, SLOT(saveAudioList())); connect(m_parent->videoListsStack()->ui->saveVideoList, SIGNAL(clicked()), this, SLOT(saveVideoList())); connect(m_parent->audioListsStack()->ui->aNewListName, SIGNAL(textChanged(QString)), this, SLOT(enableValidSave(QString))); connect(m_parent->videoListsStack()->ui->vNewListName, SIGNAL(textChanged(QString)), this, SLOT(enableValidSave(QString))); connect(m_parent->audioListsStack()->ui->ampacheServerAdd, SIGNAL(textChanged(QString)), this, SLOT(enableValidSave(QString))); connect(m_parent->audioListsStack()->ui->ampacheUserNameAdd, SIGNAL(textChanged(QString)), this, SLOT(enableValidSave(QString))); connect(m_parent->audioListsStack()->ui->ampachePasswordAdd, SIGNAL(textChanged(QString)), this, SLOT(enableValidSave(QString))); connect(m_parent->audioListsStack()->ui->aNewListName, SIGNAL(returnPressed()), this, SLOT(saveAudioList())); connect(m_parent->videoListsStack()->ui->vNewListName, SIGNAL(returnPressed()), this, SLOT(saveVideoList())); connect(m_parent->audioListsStack()->ui->removeAudioList, SIGNAL(clicked()), this, SLOT(removeAudioList())); connect(m_parent->videoListsStack()->ui->removeVideoList, SIGNAL(clicked()), this, SLOT(removeVideoList())); connect(m_parent->audioListsStack()->ui->aslsCancel, SIGNAL(clicked()), this, SLOT(returnToAudioList())); connect(m_parent->videoListsStack()->ui->vslsCancel, SIGNAL(clicked()), this, SLOT(returnToVideoList())); connect(m_parent->audioListsStack()->ui->aslsSave, SIGNAL(clicked()), this, SLOT(saveAudioListSettings())); connect(m_parent->videoListsStack()->ui->vslsSave, SIGNAL(clicked()), this, SLOT(saveVideoListSettings())); connect(m_parent->audioListsStack()->ui->aslsExport, SIGNAL(clicked()), this, SLOT(exportAudioList())); connect(m_parent->videoListsStack()->ui->vslsExport, SIGNAL(clicked()), this, SLOT(exportVideoList())); connect(m_parent->audioListsStack()->ui->aslsListName, SIGNAL(textChanged(QString)), this, SLOT(enableValidSave(QString))); connect(m_parent->videoListsStack()->ui->vslsListName, SIGNAL(textChanged(QString)), this, SLOT(enableValidSave(QString))); connect(m_parent->audioListsStack()->ui->aslsListName, SIGNAL(returnPressed()), this, SLOT(saveAudioListSettings())); connect(m_parent->videoListsStack()->ui->vslsListName, SIGNAL(returnPressed()), this, SLOT(saveVideoListSettings())); connect(m_parent->audioListsStack()->ui->aListSourceAmpache, SIGNAL(toggled(bool)), this, SLOT(toggleAmpacheDataAdd(bool))); connect(m_parent->audioListsStack()->ui->ampacheServer, SIGNAL(textChanged(QString)), this, SLOT(enableValidSave(QString))); connect(m_parent->audioListsStack()->ui->ampacheUserName, SIGNAL(textChanged(QString)), this, SLOT(enableValidSave(QString))); connect(m_parent->audioListsStack()->ui->ampachePassword, SIGNAL(textEdited(QString)), this, SLOT(ampachePasswordEdited(QString))); connect(ui->mediaView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(selectionChanged(const QItemSelection, const QItemSelection))); connect(m_parent->audioListsStack()->ui->audioLists->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(audioListsSelectionChanged(const QItemSelection, const QItemSelection))); connect(m_parent->videoListsStack()->ui->videoLists->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(videoListsSelectionChanged(const QItemSelection, const QItemSelection))); connect(m_application->browsingModel(), SIGNAL(mediaListChanged()), this, SLOT(mediaListChanged())); connect(m_application->infoManager(), SIGNAL(infoBoxSelectionChanged(QList)), this, SLOT(infoBoxSelectionChanged(QList))); m_nepomukInited = Utilities::nepomukInited(); } SavedListsManager::~SavedListsManager() { } void SavedListsManager::showAudioListSave() { m_parent->audioListsStack()->ui->audioListsStack->setCurrentIndex(1); m_parent->audioListsStack()->ui->aNewListName->setText(i18n("Untitled")); if (m_parent->audioListsStack()->ui->aListSourceSelection->isEnabled()) { m_parent->audioListsStack()->ui->aListSourceSelection->setChecked(true); } else if (m_parent->audioListsStack()->ui->aListSourceView->isEnabled()) { m_parent->audioListsStack()->ui->aListSourceView->setChecked(true); } else { m_parent->audioListsStack()->ui->aListSourcePlaylist->setChecked(true); } m_parent->audioListsStack()->ui->aNewListName->setFocus(); enableValidSave(); m_application->actionsManager()->setContextMenuSource(MainWindow::Default); } void SavedListsManager::showVideoListSave() { m_parent->videoListsStack()->ui->videoListsStack->setCurrentIndex(1); m_parent->videoListsStack()->ui->vNewListName->setText(i18n("Untitled")); if (m_parent->videoListsStack()->ui->vListSourceSelection->isEnabled()) { m_parent->videoListsStack()->ui->vListSourceSelection->setChecked(true); } else if (m_parent->videoListsStack()->ui->vListSourceView->isEnabled()) { m_parent->videoListsStack()->ui->vListSourceView->setChecked(true); } else { m_parent->videoListsStack()->ui->vListSourcePlaylist->setChecked(true); } m_parent->videoListsStack()->ui->vNewListName->setFocus(); enableValidSave(); m_application->actionsManager()->setContextMenuSource(MainWindow::Default); } void SavedListsManager::returnToAudioList() { m_parent->audioListsStack()->ui->aNewListName->clear(); m_parent->audioListsStack()->ui->aslsListName->clear(); m_parent->audioListsStack()->ui->audioListsStack->setCurrentIndex(0); } void SavedListsManager::returnToVideoList() { m_parent->videoListsStack()->ui->vNewListName->clear(); m_parent->videoListsStack()->ui->vslsListName->clear(); m_parent->videoListsStack()->ui->videoListsStack->setCurrentIndex(0); } void SavedListsManager::saveAudioList() { if (!m_parent->audioListsStack()->ui->saveAudioList->isEnabled()) { return; } if (m_parent->audioListsStack()->ui->aListSourceSelection->isChecked()) { //Get selected media items and save QList mediaList = m_application->actionsManager()->selectedMediaItems(); saveMediaList(mediaList, m_parent->audioListsStack()->ui->aNewListName->text(), QString("Audio")); } else if (m_parent->audioListsStack()->ui->aListSourceView->isChecked()) { saveView(m_parent->audioListsStack()->ui->aNewListName->text(), QString("Audio")); } else if (m_parent->audioListsStack()->ui->aListSourcePlaylist->isChecked()) { QList mediaList = m_application->playlist()->playlistModel()->mediaList(); saveMediaList(mediaList, m_parent->audioListsStack()->ui->aNewListName->text(), QString("Audio")); } else if (m_parent->audioListsStack()->ui->aListSourceAmpache->isChecked()) { QString name = m_parent->audioListsStack()->ui->aNewListName->text(); QString server = m_parent->audioListsStack()->ui->ampacheServerAdd->text(); QString userName = m_parent->audioListsStack()->ui->ampacheUserNameAdd->text(); QString password = m_parent->audioListsStack()->ui->ampachePasswordAdd->text(); saveAmpacheData("Audio", QString(), name, server, userName, password); } MediaListProperties audioListsProperties = m_application->mediaListsManager()->audioListsModel()->mediaListProperties(); m_application->mediaListsManager()->audioListsModel()->clearMediaListData(); m_application->mediaListsManager()->audioListsModel()->setMediaListProperties(audioListsProperties); m_application->mediaListsManager()->audioListsModel()->load(); returnToAudioList(); } void SavedListsManager::saveVideoList() { if (m_parent->videoListsStack()->ui->vListSourceSelection->isChecked()) { //Get selected media items and save QList mediaList = m_application->actionsManager()->selectedMediaItems(); saveMediaList(mediaList, m_parent->videoListsStack()->ui->vNewListName->text(), QString("Video")); } else if (m_parent->videoListsStack()->ui->vListSourceView->isChecked()) { saveView(m_parent->videoListsStack()->ui->vNewListName->text(), QString("Video")); } else if (m_parent->videoListsStack()->ui->vListSourcePlaylist->isChecked()) { QList mediaList = m_application->playlist()->playlistModel()->mediaList(); saveMediaList(mediaList, m_parent->videoListsStack()->ui->vNewListName->text(), QString("Video")); } MediaListProperties videoListsProperties = m_application->mediaListsManager()->videoListsModel()->mediaListProperties(); m_application->mediaListsManager()->videoListsModel()->clearMediaListData(); m_application->mediaListsManager()->videoListsModel()->setMediaListProperties(videoListsProperties); m_application->mediaListsManager()->videoListsModel()->load(); returnToVideoList(); } void SavedListsManager::removeAudioList() { if (m_parent->audioListsStack()->ui->audioLists->selectionModel()->selectedIndexes().count() > 0){ int selectedRow = m_parent->audioListsStack()->ui->audioLists->selectionModel()->selectedIndexes().at(0).row(); MediaItem selectedItem = m_application->mediaListsManager()->audioListsModel()->mediaItemAt(selectedRow); QString name = selectedItem.title; bool isSavedList = selectedItem.url.startsWith("savedlists://"); bool isAmpacheServer = selectedItem.url.startsWith("ampache://"); KGuiItem removeSavedList; removeSavedList.setText(i18n("Remove")); removeSavedList.setIcon(KIcon("list-remove")); QString message = i18n("Are you sure you want to remove \"%1\"?", name); if (KMessageBox::warningContinueCancel(m_parent, message, QString(), removeSavedList) == KMessageBox::Continue) { if (isSavedList) { //Remove M3U file QString filename = name; filename = filename.replace(" ", ""); QFile::remove(KStandardDirs::locateLocal("data", QString("bangarang/Audio-%1.m3u").arg(filename), false)); QString savedListEntry = QString("Audio:::%1") .arg(name); QList rowsToRemove; for (int i = 0; i < m_savedAudioLists.count(); i++) { if (m_savedAudioLists.at(i).startsWith(savedListEntry)) { rowsToRemove << i; } } for (int i = 0; i < rowsToRemove.count(); i++) { m_savedAudioLists.removeAt(rowsToRemove.at(i)); } updateSavedListsIndex(); MediaListProperties audioListsProperties = m_application->mediaListsManager()->audioListsModel()->mediaListProperties(); m_application->mediaListsManager()->audioListsModel()->clearMediaListData(); m_application->mediaListsManager()->audioListsModel()->setMediaListProperties(audioListsProperties); m_application->mediaListsManager()->audioListsModel()->load(); emit savedListsChanged(); } if (isAmpacheServer) { removeAmpacheData("Audio", name); m_application->mediaListsManager()->audioListsModel()->reload(); } } } } void SavedListsManager::removeVideoList() { if (m_parent->videoListsStack()->ui->videoLists->selectionModel()->selectedIndexes().count() > 0){ int selectedRow = m_parent->videoListsStack()->ui->videoLists->selectionModel()->selectedIndexes().at(0).row(); QString name = m_application->mediaListsManager()->videoListsModel()->mediaItemAt(selectedRow).title; KGuiItem removeSavedList; removeSavedList.setText(i18n("Remove")); removeSavedList.setIcon(KIcon("list-remove")); QString message = i18n("Are you sure you want to remove \"%1\"?", name); if (KMessageBox::warningContinueCancel(m_parent, message, QString(), removeSavedList) == KMessageBox::Continue) { //Remove M3U file QString filename = name; filename = filename.replace(" ", ""); QFile::remove(KStandardDirs::locateLocal("data", QString("bangarang/Video-%1.m3u").arg(filename), false)); QString savedListEntry = QString("Video:::%1") .arg(name); QList rowsToRemove; for (int i = 0; i < m_savedVideoLists.count(); i++) { if (m_savedVideoLists.at(i).startsWith(savedListEntry)) { rowsToRemove << i; } } for (int i = 0; i < rowsToRemove.count(); i++) { m_savedVideoLists.removeAt(rowsToRemove.at(i)); } updateSavedListsIndex(); MediaListProperties videoListsProperties = m_application->mediaListsManager()->videoListsModel()->mediaListProperties(); m_application->mediaListsManager()->videoListsModel()->clearMediaListData(); m_application->mediaListsManager()->videoListsModel()->setMediaListProperties(videoListsProperties); m_application->mediaListsManager()->videoListsModel()->load(); emit savedListsChanged(); } } } void SavedListsManager::enableValidSave(QString newText) { m_parent->audioListsStack()->ui->saveAudioList->setEnabled(true); if (!m_parent->audioListsStack()->ui->aNewListName->text().isEmpty() && !m_parent->audioListsStack()->ui->ampacheDataAdd->isVisible()) { m_parent->audioListsStack()->ui->saveAudioList->setEnabled(true); } else { if (!m_parent->audioListsStack()->ui->ampacheDataAdd->isVisible()) { m_parent->audioListsStack()->ui->saveAudioList->setEnabled(false); } else { if (m_parent->audioListsStack()->ui->ampacheServerAdd->text().isEmpty() || m_parent->audioListsStack()->ui->ampacheUserNameAdd->text().isEmpty() || m_parent->audioListsStack()->ui->ampachePasswordAdd->text().isEmpty()) { m_parent->audioListsStack()->ui->saveAudioList->setEnabled(false); } else { m_parent->audioListsStack()->ui->saveAudioList->setEnabled(true); } } } if (!m_parent->videoListsStack()->ui->vNewListName->text().isEmpty()) { m_parent->videoListsStack()->ui->saveVideoList->setEnabled(true); } else { m_parent->videoListsStack()->ui->saveVideoList->setEnabled(false); } if (!m_parent->audioListsStack()->ui->aslsListName->text().isEmpty() && !m_parent->audioListsStack()->ui->ampacheData->isVisible()) { m_parent->audioListsStack()->ui->aslsSave->setEnabled(true); } else { if (!m_parent->audioListsStack()->ui->ampacheData->isVisible()) { m_parent->audioListsStack()->ui->aslsSave->setEnabled(false); } else { if (m_parent->audioListsStack()->ui->ampacheServer->text().isEmpty() || m_parent->audioListsStack()->ui->ampacheUserName->text().isEmpty() || m_parent->audioListsStack()->ui->ampachePassword->text().isEmpty()) { m_parent->audioListsStack()->ui->aslsSave->setEnabled(false); } else { m_parent->audioListsStack()->ui->aslsSave->setEnabled(true); } } } if (!m_parent->videoListsStack()->ui->vslsListName->text().isEmpty()) { m_parent->videoListsStack()->ui->vslsSave->setEnabled(true); } else { m_parent->videoListsStack()->ui->vslsSave->setEnabled(false); } Q_UNUSED(newText); //not used since method may be called directly } void SavedListsManager::audioListsSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected) { if (selected.indexes().count() > 0) { bool isSavedList = selected.indexes().at(0).data(MediaItem::IsSavedListRole).toBool(); bool isAmpacheServer = selected.indexes().at(0).data(MediaItem::UrlRole).toString().startsWith("ampache://"); if (isSavedList || isAmpacheServer) { m_parent->audioListsStack()->ui->removeAudioList->setEnabled(true); } else { m_parent->audioListsStack()->ui->removeAudioList->setEnabled(false); } } Q_UNUSED(selected); Q_UNUSED(deselected); } void SavedListsManager::videoListsSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected) { if (selected.indexes().count() > 0) { bool isSavedList = selected.indexes().at(0).data(MediaItem::IsSavedListRole).toBool(); if (isSavedList) { m_parent->videoListsStack()->ui->removeVideoList->setEnabled(true); } else { m_parent->videoListsStack()->ui->removeVideoList->setEnabled(false); } } Q_UNUSED(selected); Q_UNUSED(deselected); } void SavedListsManager::selectionChanged (const QItemSelection & selected, const QItemSelection & deselected ) { if (m_application->infoManager()->selectedInfoBoxMediaItems().count() > 0) { QString listItemType = m_application->infoManager()->selectedInfoBoxMediaItems().at(0).type; if ((listItemType == "Audio") || (listItemType == "Video") || (listItemType == "Image")) { m_parent->audioListsStack()->ui->aListSourceSelection->setEnabled(true); m_parent->videoListsStack()->ui->vListSourceSelection->setEnabled(true); } } else if (ui->mediaView->selectionModel()->selectedRows().count() > 0) { QString listItemType = m_application->browsingModel()->mediaItemAt(0).type; if ((listItemType == "Audio") || (listItemType == "Video") || (listItemType == "Image")) { m_parent->audioListsStack()->ui->aListSourceSelection->setEnabled(true); m_parent->videoListsStack()->ui->vListSourceSelection->setEnabled(true); } } else { m_parent->audioListsStack()->ui->aListSourceSelection->setChecked(false); m_parent->videoListsStack()->ui->vListSourceSelection->setChecked(false); m_parent->audioListsStack()->ui->aListSourceSelection->setEnabled(false); m_parent->videoListsStack()->ui->vListSourceSelection->setEnabled(false); } Q_UNUSED(selected); Q_UNUSED(deselected); } void SavedListsManager::infoBoxSelectionChanged(QList selectedItems) { if (selectedItems.count() > 0) { QString listItemType = selectedItems.at(0).type; if ((listItemType == "Audio") || (listItemType == "Video") || (listItemType == "Image")) { m_parent->audioListsStack()->ui->aListSourceSelection->setEnabled(true); m_parent->videoListsStack()->ui->vListSourceSelection->setEnabled(true); } } else if (ui->mediaView->selectionModel()->selectedRows().count() > 0) { QString listItemType = m_application->browsingModel()->mediaItemAt(0).type; if ((listItemType == "Audio") || (listItemType == "Video") || (listItemType == "Image")) { m_parent->audioListsStack()->ui->aListSourceSelection->setEnabled(true); m_parent->videoListsStack()->ui->vListSourceSelection->setEnabled(true); } } else { m_parent->audioListsStack()->ui->aListSourceSelection->setChecked(false); m_parent->videoListsStack()->ui->vListSourceSelection->setChecked(false); m_parent->audioListsStack()->ui->aListSourceSelection->setEnabled(false); m_parent->videoListsStack()->ui->vListSourceSelection->setEnabled(false); } } void SavedListsManager::showAudioSavedListSettings() { m_parent->audioListsStack()->ui->audioListsStack->setCurrentIndex(2); QModelIndexList selectedIndexes = m_parent->audioListsStack()->ui->audioLists->selectionModel()->selectedIndexes(); for(int i = 0; i < selectedIndexes.count(); i++) { int row = selectedIndexes.at(i).row(); m_parent->audioListsStack()->ui->aslsListName->setText(m_application->mediaListsManager()->audioListsModel()->mediaItemAt(row).title); // We can only export a playlist when we have a .m3u file MediaItem selectedItem = m_application->mediaListsManager()->audioListsModel()->mediaItemAt(row); if (selectedItem.url.startsWith("savedlists://")) { m_parent->audioListsStack()->ui->aslsExport->show(); m_parent->audioListsStack()->ui->exportSavedListLabel->show(); m_parent->audioListsStack()->ui->ampacheData->hide(); } else { m_parent->audioListsStack()->ui->aslsExport->hide(); m_parent->audioListsStack()->ui->exportSavedListLabel->hide(); if (selectedItem.url.startsWith("ampache://")) { m_ampachePasswordEdited = false; m_parent->audioListsStack()->ui->ampacheData->show(); QString server = selectedItem.fields["server"].toString(); m_parent->audioListsStack()->ui->ampacheServer->setText(server); QString userName = selectedItem.fields["username"].toString(); m_parent->audioListsStack()->ui->ampacheUserName->setText(userName); QString password = QString().fill('*',selectedItem.fields["pwdLength"].toInt()); m_parent->audioListsStack()->ui->ampachePassword->setText(password); //enableValidSave(); } } } m_parent->audioListsStack()->ui->aslsListName->setFocus(); } void SavedListsManager::showVideoSavedListSettings() { m_parent->videoListsStack()->ui->videoListsStack->setCurrentIndex(2); QModelIndexList selectedIndexes = m_parent->videoListsStack()->ui->videoLists->selectionModel()->selectedIndexes(); for(int i = 0; i < selectedIndexes.count(); i++) { int row = selectedIndexes.at(i).row(); m_parent->videoListsStack()->ui->vslsListName->setText(m_application->mediaListsManager()->videoListsModel()->mediaItemAt(row).title); // We can only export a playlist when we have a .m3u file QString selectedLri = m_application->mediaListsManager()->videoListsModel()->mediaItemAt(row).url; if (selectedLri.startsWith("savedlists://")) { m_parent->videoListsStack()->ui->vslsExport->show(); m_parent->videoListsStack()->ui->exportSavedListLabel->show(); } else { m_parent->videoListsStack()->ui->vslsExport->hide(); m_parent->videoListsStack()->ui->exportSavedListLabel->hide(); } } m_parent->videoListsStack()->ui->vslsListName->setFocus(); } void SavedListsManager::mediaListChanged() { if (m_application->browsingModel()->rowCount() > 0) { QString listItemType = m_application->browsingModel()->mediaItemAt(0).type; if (listItemType == "Audio" && m_nepomukInited && m_application->browsingModel()->lriIsLoadable()) { m_parent->audioListsStack()->ui->aListSourceView->setEnabled(true); } else if (listItemType == "Video" && m_nepomukInited && m_application->browsingModel()->lriIsLoadable()) { m_parent->videoListsStack()->ui->vListSourceView->setEnabled(true); } else { m_parent->audioListsStack()->ui->aListSourceView->setChecked(false); m_parent->videoListsStack()->ui->vListSourceView->setChecked(false); m_parent->audioListsStack()->ui->aListSourceView->setEnabled(false); m_parent->videoListsStack()->ui->vListSourceView->setEnabled(false); } } } void SavedListsManager::saveMediaList(QList mediaList, const QString &name, const QString &type, bool append) { if (!name.isEmpty()) { //Create and populate M3U file QString filename = name; filename = filename.replace(" ", ""); QIODevice::OpenMode openMode; if (append) { openMode = QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append; } else { QFile::remove(KStandardDirs::locateLocal("data", QString("bangarang/%1-%2.m3u").arg(type).arg(filename), false)); openMode = QIODevice::WriteOnly | QIODevice::Text; } QFile file(KStandardDirs::locateLocal("data", QString("bangarang/%1-%2.m3u").arg(type).arg(filename), true)); if (!file.open(openMode)) { return; } QTextStream out(&file); if (!append) { out << "#EXTM3U" << "\r\n"; } for (int i = 0; i < mediaList.count(); i++) { if (mediaList.at(i).type == "Audio" || mediaList.at(i).type == "Video") { out << "#EXTINF:" << mediaList.at(i).fields["duration"].toInt() << "," << mediaList.at(i).title << "\r\n"; out << mediaList.at(i).url << "\r\n"; } } file.close(); //Save list to index file if (type == "Audio") { QString indexEntry = QString("%1:::%2:::%3") .arg(type) .arg(name) .arg(QString("savedlists://%1-%2.m3u").arg(type).arg(filename)); QString savedListEntry = QString("Audio:::%1") .arg(name); QList rowsToRemove; for (int i = 0; i < m_savedAudioLists.count(); i++) { if (m_savedAudioLists.at(i).startsWith(savedListEntry)) { rowsToRemove << i; } } for (int i = 0; i < rowsToRemove.count(); i++) { m_savedAudioLists.removeAt(rowsToRemove.at(i)); } m_savedAudioLists << indexEntry; } else if (type == "Video") { QString indexEntry = QString("%1:::%2:::%3") .arg(type) .arg(name) .arg(QString("savedlists://%1-%2.m3u").arg(type).arg(filename)); QString savedListEntry = QString("Video:::%1") .arg(name); QList rowsToRemove; for (int i = 0; i < m_savedVideoLists.count(); i++) { if (m_savedVideoLists.at(i).startsWith(savedListEntry)) { rowsToRemove << i; } } for (int i = 0; i < rowsToRemove.count(); i++) { m_savedVideoLists.removeAt(rowsToRemove.at(i)); } m_savedVideoLists << indexEntry; } updateSavedListsIndex(); emit savedListsChanged(); } } void SavedListsManager::saveView(const QString &name, const QString &type) { if (!name.isEmpty()) { //Add to saved list index if (type == "Audio") { QString indexEntry = QString("%1:::%2:::%3") .arg(type) .arg(name) .arg(m_application->browsingModel()->mediaListProperties().lri); QString savedListEntry = QString("Audio:::%1") .arg(name); QList rowsToRemove; for (int i = 0; i < m_savedAudioLists.count(); i++) { if (m_savedAudioLists.at(i).startsWith(savedListEntry)) { rowsToRemove << i; } } for (int i = 0; i < rowsToRemove.count(); i++) { m_savedAudioLists.removeAt(rowsToRemove.at(i)); } m_savedAudioLists << indexEntry; } else if (type == "Video") { QString indexEntry = QString("%1:::%2:::%3") .arg(type) .arg(name) .arg(m_application->browsingModel()->mediaListProperties().lri); QString savedListEntry = QString("Video:::%1") .arg(name); QList rowsToRemove; for (int i = 0; i < m_savedVideoLists.count(); i++) { if (m_savedVideoLists.at(i).startsWith(savedListEntry)) { rowsToRemove << i; } } for (int i = 0; i < rowsToRemove.count(); i++) { m_savedVideoLists.removeAt(rowsToRemove.at(i)); } m_savedVideoLists << indexEntry; } updateSavedListsIndex(); emit savedListsChanged(); } } void SavedListsManager::loadSavedListsIndex() { //Load lists from index m_savedAudioLists.clear(); m_savedVideoLists.clear(); QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/savedlists", false)); if (!indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { return; } QTextStream in(&indexFile); while (!in.atEnd()) { QString line = in.readLine(); QStringList nameUrl = line.split(":::"); if (nameUrl.count() >= 3) { QString type = nameUrl.at(0).trimmed(); if (type == "Audio") { m_savedAudioLists << line; } else if (type == "Video") { m_savedVideoLists << line; } } } indexFile.close(); emit savedListsChanged(); } void SavedListsManager::updateSavedListsIndex() { QFile::remove(KStandardDirs::locateLocal("data", "bangarang/savedlists", false)); QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/savedlists", true)); if (!indexFile.open(QIODevice::WriteOnly | QIODevice::Text)) { return; } QTextStream outIndex(&indexFile); for (int i = 0; i < m_savedAudioLists.count(); i++) { outIndex << m_savedAudioLists.at(i) << "\r\n"; } for (int i = 0; i < m_savedVideoLists.count(); i++) { outIndex << m_savedVideoLists.at(i) << "\r\n"; } indexFile.close(); } QStringList SavedListsManager::savedListNames(const QString &type) { QList savedLists ; if (type == "Audio") { savedLists = m_savedAudioLists; } else if (type == "Video") { savedLists = m_savedVideoLists; } QStringList savedListNames; for (int i = 0; i < savedLists.count(); i++) { QString name = savedLists.at(i).split(":::").at(1); QString lri = savedLists.at(i).split(":::").at(2); if (lri.startsWith("savedlists://")) { savedListNames.append(name); } } return savedListNames; } void SavedListsManager::removeSelected() { if (m_application->browsingModel()->mediaListProperties().lri.startsWith("savedlists://")) { QList mediaList; QList rowsToRemove; //Rebuild mediaList without selected items for (int i = 0; i < m_application->browsingModel()->rowCount(); i++) { QModelIndex index = m_application->browsingModel()->index(i, 0); QSortFilterProxyModel * proxy = ui->mediaView->filterProxyModel(); QModelIndex proxyIndex = proxy->mapFromSource(index); if (!ui->mediaView->selectionModel()->isSelected(proxyIndex)) { mediaList.append(m_application->browsingModel()->mediaItemAt(i)); } else { rowsToRemove.append(i); } } //Save new medialist QString lri = m_application->browsingModel()->mediaListProperties().lri; QString name = savedListLriName(lri); saveMediaList(mediaList, name, m_application->browsingModel()->mediaItemAt(0).type); //Remove items from model m_application->browsingModel()->reload(); } } void SavedListsManager::saveAudioListSettings() { //Get old list name QString oldName; QModelIndexList selectedIndexes = m_parent->audioListsStack()->ui->audioLists->selectionModel()->selectedIndexes(); int audioListsRow = selectedIndexes.at(0).row(); MediaItem mediaItem; if (selectedIndexes.count() > 0) { oldName = m_application->mediaListsManager()->audioListsModel()->mediaItemAt(audioListsRow).title; mediaItem = m_application->mediaListsManager()->audioListsModel()->mediaItemAt(audioListsRow); } if (mediaItem.url.startsWith("ampache://")) { QString newName = m_parent->audioListsStack()->ui->aslsListName->text(); QString server = m_parent->audioListsStack()->ui->ampacheServer->text(); QString userName = m_parent->audioListsStack()->ui->ampacheUserName->text(); QString password = m_parent->audioListsStack()->ui->ampachePassword->text(); saveAmpacheData("Audio", oldName, newName, server, userName, password); //Update Audio ListView mediaItem.title = newName; mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["server"] = server; mediaItem.fields["username"] = userName; QString key = mediaItem.fields["key"].toString(); if (m_ampachePasswordEdited) { key = Utilities::sha256Of(password); mediaItem.fields["key"] = key; mediaItem.fields["pwdLength"] = password.length(); } mediaItem.url = QString("ampache://%1?server=%2||username=%3||key=%4||request=root") .arg("audio") .arg(server) .arg(userName) .arg(key); m_application->mediaListsManager()->audioListsModel()->replaceMediaItemAt(audioListsRow, mediaItem); //m_application->browsingModel()->loadLRI(mediaItem.url); ui->listTitle->setText(newName); m_ampachePasswordEdited = false; } if (mediaItem.url.startsWith("savedlists://")) { //Read index file to locate and rename saved list name QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/savedlists", false)); if (!indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { return; } m_savedAudioLists.clear(); QTextStream in(&indexFile); while (!in.atEnd()) { QString line = in.readLine().trimmed(); QStringList nameUrl = line.split(":::"); if (nameUrl.count() >= 3) { QString type = nameUrl.at(0).trimmed(); QString name = nameUrl.at(1).trimmed(); QString lri = nameUrl.at(2).trimmed(); if (type == "Audio") { QString indexEntry = line; if (name == oldName) { QString newName = m_parent->audioListsStack()->ui->aslsListName->text(); if (lri.startsWith("savedlists://")) { //rename file QString filename = name.replace(" ", ""); QFile file(KStandardDirs::locateLocal("data", QString("bangarang/%1-%2.m3u").arg(type).arg(filename), true)); QString newFilename = QString(newName).replace(" ", ""); QFile::remove(KStandardDirs::locateLocal("data", QString("bangarang/%1-%2.m3u").arg(type).arg(newFilename), true)); QString renamedFileName = file.fileName(); renamedFileName.replace(QString("%1.m3u").arg(filename), QString("%1.m3u").arg(newFilename)); file.rename(renamedFileName); lri.replace(QString("%1.m3u").arg(filename), QString("%1.m3u").arg(newFilename)); } //Update Audio ListView mediaItem.title = newName; mediaItem.url = lri; m_application->mediaListsManager()->audioListsModel()->replaceMediaItemAt(audioListsRow, mediaItem); ui->listTitle->setText(newName); //create new index entry for index file indexEntry = QString("%1:::%2:::%3") .arg(type) .arg(newName) .arg(lri); } m_savedAudioLists.append(indexEntry); } } } indexFile.close(); //Update index file updateSavedListsIndex(); emit savedListsChanged(); } if (selectedIndexes.count() > 0) { m_parent->audioListsStack()->ui->audioLists->selectionModel()->select(selectedIndexes.at(0), QItemSelectionModel::Select); } returnToAudioList(); } void SavedListsManager::saveVideoListSettings() { //Get old list name QString oldName; QModelIndexList selectedIndexes = m_parent->videoListsStack()->ui->videoLists->selectionModel()->selectedIndexes(); int videoListsRow = selectedIndexes.at(0).row(); MediaItem mediaItem; if (selectedIndexes.count() > 0) { oldName = m_application->mediaListsManager()->videoListsModel()->mediaItemAt(videoListsRow).title; mediaItem = m_application->mediaListsManager()->videoListsModel()->mediaItemAt(videoListsRow); } //Read index file to locate and rename saved list name QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/savedlists", false)); if (!indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { return; } m_savedVideoLists.clear(); QTextStream in(&indexFile); while (!in.atEnd()) { QString line = in.readLine().trimmed(); QStringList nameUrl = line.split(":::"); if (nameUrl.count() >= 3) { QString type = nameUrl.at(0).trimmed(); QString name = nameUrl.at(1).trimmed(); QString lri = nameUrl.at(2).trimmed(); if (type == "Video") { QString indexEntry = line; if (name == oldName) { QString newName = m_parent->videoListsStack()->ui->vslsListName->text(); if (lri.startsWith("savedlists://")) { //rename file QString filename = name.replace(" ", ""); QFile file(KStandardDirs::locateLocal("data", QString("bangarang/%1-%2.m3u").arg(type).arg(filename), true)); QString newFilename = QString(newName).replace(" ", ""); QFile::remove(KStandardDirs::locateLocal("data", QString("bangarang/%1-%2.m3u").arg(type).arg(newFilename), true)); QString renamedFileName = file.fileName(); renamedFileName.replace(QString("%1.m3u").arg(filename), QString("%1.m3u").arg(newFilename)); file.rename(renamedFileName); lri.replace(QString("%1.m3u").arg(filename), QString("%1.m3u").arg(newFilename)); } //Update Video ListView mediaItem.title = newName; mediaItem.url = lri; m_application->mediaListsManager()->videoListsModel()->replaceMediaItemAt(videoListsRow, mediaItem); ui->listTitle->setText(newName); //create new index entry for index file indexEntry = QString("%1:::%2:::%3") .arg(type) .arg(newName) .arg(lri); } m_savedVideoLists.append(indexEntry); } } } indexFile.close(); //Update index file updateSavedListsIndex(); emit savedListsChanged(); if (selectedIndexes.count() > 0) { m_parent->videoListsStack()->ui->videoLists->selectionModel()->select(selectedIndexes.at(0), QItemSelectionModel::Select); } returnToVideoList(); } void SavedListsManager::exportAudioList() { //Get list name QString listName; QModelIndexList selectedIndexes = m_parent->audioListsStack()->ui->audioLists->selectionModel()->selectedIndexes(); int audioListsRow = selectedIndexes.at(0).row(); if (selectedIndexes.count() > 0) { listName = m_application->mediaListsManager()->audioListsModel()->mediaItemAt(audioListsRow).title; } //Read index file to locate and rename saved list name QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/savedlists", false)); if (!indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { return; } QTextStream in(&indexFile); while (!in.atEnd()) { QString line = in.readLine().trimmed(); QStringList nameUrl = line.split(":::"); if (nameUrl.count() >= 3) { QString type = nameUrl.at(0).trimmed(); QString name = nameUrl.at(1).trimmed(); QString lri = nameUrl.at(2).trimmed(); if (type == "Audio") { QString indexEntry = line; if (name == listName) { if (lri.startsWith("savedlists://")) { QString filename = name.replace(" ", ""); KUrl fileUrl(KStandardDirs::locateLocal("data", QString("bangarang/%1-%2.m3u").arg(type).arg(filename), true)); exportPlaylist(fileUrl); } } } } } indexFile.close(); } void SavedListsManager::exportVideoList() { //Get list name QString listName; QModelIndexList selectedIndexes = m_parent->videoListsStack()->ui->videoLists->selectionModel()->selectedIndexes(); int videoListsRow = selectedIndexes.at(0).row(); if (selectedIndexes.count() > 0) { listName = m_application->mediaListsManager()->videoListsModel()->mediaItemAt(videoListsRow).title; } //Read index file to locate and rename saved list name QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/savedlists", false)); if (!indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { return; } QTextStream in(&indexFile); while (!in.atEnd()) { QString line = in.readLine().trimmed(); QStringList nameUrl = line.split(":::"); if (nameUrl.count() >= 3) { QString type = nameUrl.at(0).trimmed(); QString name = nameUrl.at(1).trimmed(); QString lri = nameUrl.at(2).trimmed(); if (type == "Video") { QString indexEntry = line; if (name == listName) { if (lri.startsWith("savedlists://")) { QString filename = name.replace(" ", ""); KUrl fileUrl(KStandardDirs::locateLocal("data", QString("bangarang/%1-%2.m3u").arg(type).arg(filename), true)); exportPlaylist(fileUrl); } } } } } indexFile.close(); } void SavedListsManager::exportPlaylist(KUrl &saveFrom) { KUrl saveAs = KFileDialog::getSaveUrl(KUrl(), i18n("*.m3u|M3U files (*.m3u)")); bool ready = false; while (!ready) { if (!saveAs.isEmpty()) { if (KIO::NetAccess::exists(saveAs, KIO::NetAccess::DestinationSide, m_parent)) { const QString message = i18n("

The file %1 already exists.

" "

Do you want to overwrite it?

", saveAs.fileName()); const int answer = KMessageBox::warningYesNoCancel(m_parent, message); if (answer == KMessageBox::Yes) { KIO::NetAccess::del(saveAs, m_parent); KIO::NetAccess::file_copy(saveFrom, saveAs, m_parent); ready = true; } else if (answer == KMessageBox::No) { saveAs = KFileDialog::getSaveUrl(KUrl(), i18n("*.m3u|M3U files (*.m3u)")); } else { // Cancel ready = true; } } else { // File doesn't exist yet, no problem KIO::NetAccess::file_copy(saveFrom, saveAs, m_parent); ready = true; } } else { // No filename selected, just return ready = true; } } } QString SavedListsManager::savedListLriName(const QString &lri) { QString name; for (int i = 0; i < m_savedAudioLists.count(); i++) { if (m_savedAudioLists.at(i).endsWith(lri)) { QString indexEntry = m_savedAudioLists.at(i); name = indexEntry.split(":::").at(1); } } for (int i = 0; i < m_savedVideoLists.count(); i++) { if (m_savedVideoLists.at(i).endsWith(lri)) { QString indexEntry = m_savedVideoLists.at(i); name = indexEntry.split(":::").at(1); } } return name; } void SavedListsManager::savePlaylist() { saveMediaList(m_application->playlist()->playlistModel()->mediaList(), "current", "Playlist"); } void SavedListsManager::loadPlaylist() { MediaItem mediaItem; mediaItem.type = "Category"; mediaItem.title = i18n("Playlist"); mediaItem.url = "savedlists://Playlist-current.m3u"; m_application->playlist()->addMediaItem(mediaItem); } void SavedListsManager::toggleAmpacheDataAdd(bool checked) { m_parent->audioListsStack()->ui->ampacheDataAdd->setVisible(checked); enableValidSave(); } void SavedListsManager::saveAmpacheData(const QString type, const QString oldName, const QString newName, const QString server, const QString userName, const QString password) { //create new index entry for index file QString key = Utilities::sha256Of(password); QString newEntry = QString("%1:::%2:::%3:::%4:::%5:::%6") .arg(type) .arg(newName) .arg(server) .arg(userName) .arg(key) .arg(password.length()); //Read index file to locate and rename saved list name QStringList serverLines; QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/ampacheservers", false)); if (indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&indexFile); while (!in.atEnd()) { QString line = in.readLine().trimmed(); QStringList serverData = line.split(":::"); if (serverData.count() >= 6) { QString indexEntry = line; QString curType = serverData.at(0).trimmed(); QString name = serverData.at(1).trimmed(); if (!m_ampachePasswordEdited) { key = serverData.at(4).trimmed(); } if (curType.toLower() == type.toLower()) { if (name == oldName) { newEntry = QString("%1:::%2:::%3:::%4:::%5:::%6") .arg(type) .arg(newName) .arg(server) .arg(userName) .arg(key) .arg(password.length()); indexEntry = newEntry; } } serverLines.append(indexEntry); } } indexFile.close(); } if (serverLines.isEmpty()) { serverLines.append(newEntry); } QFile::remove(KStandardDirs::locateLocal("data", "bangarang/ampacheservers", false)); if (!indexFile.open(QIODevice::WriteOnly | QIODevice::Text)) { return; } QTextStream outIndex(&indexFile); for (int i = 0; i < serverLines.count(); i++) { outIndex << serverLines.at(i) << "\r\n"; } indexFile.close(); } void SavedListsManager::ampachePasswordEdited(QString text) { if (!m_ampachePasswordEdited) { m_parent->audioListsStack()->ui->ampachePassword->clear(); m_ampachePasswordEdited = true; } enableValidSave(text); } void SavedListsManager::removeAmpacheData(const QString type, const QString name) { //Read index file to locate and rename saved list name QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/ampacheservers", false)); if (!indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { return; } QStringList serverLines; QTextStream in(&indexFile); while (!in.atEnd()) { QString line = in.readLine().trimmed(); QStringList serverData = line.split(":::"); if (serverData.count() >= 6) { QString indexEntry = line; QString curType = serverData.at(0).trimmed(); QString curName = serverData.at(1).trimmed(); if (!(curType.toLower() == type.toLower() && (curName == name))) { serverLines.append(indexEntry); } } } indexFile.close(); QFile::remove(KStandardDirs::locateLocal("data", "bangarang/ampacheservers", false)); if (!indexFile.open(QIODevice::WriteOnly | QIODevice::Text)) { return; } QTextStream outIndex(&indexFile); for (int i = 0; i < serverLines.count(); i++) { outIndex << serverLines.at(i) << "\r\n"; } indexFile.close(); } bangarang-bangarang/src/app/medialists/savedlistsmanager.h000066400000000000000000000070741166760560600243330ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef SAVEDLISTSMANAGER_H #define SAVEDLISTSMANAGER_H #include #include #include #include namespace Ui { class MainWindowClass; } class MainWindow; class MediaItem; class MediaItemModel; class BangarangApplication; /* * This class provides a user interface for saving and removing media lists * FIXME: Need interface to rename (or configure?) media lists */ class SavedListsManager : public QObject { Q_OBJECT public: SavedListsManager(MainWindow * parent); ~SavedListsManager(); void saveMediaList(QList mediaList, const QString &name, const QString &type, bool append = false); void saveView(const QString &name, const QString &type); QStringList savedListNames(const QString &type); QString savedListLriName(const QString &lri); signals: void savedListsChanged(); public slots: void showAudioListSave(); void showVideoListSave(); void returnToAudioList(); void returnToVideoList(); void saveAudioList(); void saveVideoList(); void removeSelected(); void saveAudioListSettings(); void saveVideoListSettings(); void savePlaylist(); void loadPlaylist(); void showAudioSavedListSettings(); void showVideoSavedListSettings(); void toggleAmpacheDataAdd(bool); private: BangarangApplication * m_application; MainWindow *m_parent; Ui::MainWindowClass *ui; int m_startRow; QList m_savedAudioListRows; QList m_savedVideoListRows; QStringList m_savedAudioLists; QStringList m_savedVideoLists; void updateSavedListsIndex(); bool m_nepomukInited; bool m_ampachePasswordEdited; void exportPlaylist(KUrl &saveFrom); void saveAmpacheData(const QString type, const QString oldName, const QString newName, const QString server, const QString userName, const QString password); void removeAmpacheData(const QString type, const QString name); private slots: void enableValidSave(QString newText = QString()); void selectionChanged (const QItemSelection & selected, const QItemSelection & deselected); void audioListsSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected); void videoListsSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected); void mediaListChanged(); void infoBoxSelectionChanged(QList selectedItems); void removeAudioList(); void removeVideoList(); void exportAudioList(); void exportVideoList(); void loadSavedListsIndex(); void ampachePasswordEdited(QString text); }; #endif //SAVEDLISTSMANAGER_H bangarang-bangarang/src/app/medialists/videolistsstack.cpp000066400000000000000000000060021166760560600243530ustar00rootroot00000000000000#include "../common/bangarangapplication.h" #include "../common/mainwindow.h" #include "../common/flickcharm.h" #include "medialistsmanager.h" #include "savedlistsmanager.h" #include "medialistsettings.h" #include "../../platform/mediaitemmodel.h" #include "videolistsstack.h" VideoListsStack::VideoListsStack(QWidget *parent) : QWidget(parent), ui(new Ui::VideoListsStack) { ui->setupUi(this); m_application = (BangarangApplication *)KApplication::kApplication(); ui->videoLists->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); } VideoListsStack::~VideoListsStack() { delete ui; } void VideoListsStack::enableTouch() { int tTouchable = BangarangApplication::TOUCH_TOUCHABLE_METRIC; int tVisual = BangarangApplication::TOUCH_VISUAL_METRIC; ui->addVideoList->setMinimumSize(tTouchable, tTouchable); ui->addVideoList->setIconSize(QSize(tVisual, tVisual)); ui->removeVideoList->setMinimumSize(tTouchable, tTouchable); ui->removeVideoList->setIconSize(QSize(tVisual, tVisual)); ui->configureVideoList->setMinimumSize(tTouchable, tTouchable); ui->configureVideoList->setIconSize(QSize(tVisual, tVisual)); ui->videoLists->setIconSize(QSize(tTouchable, tTouchable)); ui->videoLists->setGridSize(QSize(0,tTouchable)); FlickCharm* charm = new FlickCharm(this); charm->activateOn(ui->videoLists); ui->vNewListName->setMinimumHeight(tTouchable); ui->saveVideoList->setMinimumHeight(tTouchable); ui->vCancelSaveList->setMinimumHeight(tTouchable); ui->vslsListName->setMinimumHeight(tTouchable); ui->vslsSave->setMinimumHeight(tTouchable); ui->exportSavedListLabel->hide(); ui->vslsExport->hide(); ui->vslsCancel->setMinimumHeight(tTouchable); ui->semVLimit->setMinimumHeight(tTouchable); ui->semVTimeComp->setMinimumHeight(tTouchable); ui->semVTime->setMinimumHeight(tTouchable); ui->semVRating->setMinimumHeight(tTouchable); ui->semVRatingComp->setMinimumHeight(tTouchable); ui->semVFreq->setMinimumHeight(tTouchable); ui->semVFreqComp->setMinimumHeight(tTouchable); ui->semVConfigSave->setMinimumHeight(tTouchable); ui->vCancelSemConfigure->setMinimumHeight(tTouchable); } void VideoListsStack::on_configureVideoList_clicked() { if (ui->videoLists->selectionModel()->selectedIndexes().count() > 0) { int selectedRow = ui->videoLists->selectionModel()->selectedIndexes().at(0).row(); MediaItem selectedItem = m_application->mediaListsManager()->videoListsModel()->mediaItemAt(selectedRow); if (selectedItem.url.startsWith("savedlists://")) { m_application->savedListsManager()->showVideoSavedListSettings(); } else if (selectedItem.url.startsWith("semantics://recent") || selectedItem.url.startsWith("semantics://frequent") || selectedItem.url.startsWith("semantics://highest") || selectedItem.url.startsWith("semantics://recentlyadded")) { m_application->mainWindow()->mediaListSettings()->showMediaListSettings(); } } } bangarang-bangarang/src/app/medialists/videolistsstack.h000066400000000000000000000010011166760560600240120ustar00rootroot00000000000000#ifndef VIDEOLISTSSTACK_H #define VIDEOLISTSSTACK_H #include namespace Ui { class VideoListsStack; } #include "ui_videolistsstack.h" class BangarangApplication; class VideoListsStack : public QWidget { Q_OBJECT public: explicit VideoListsStack(QWidget *parent = 0); ~VideoListsStack(); void enableTouch(); Ui::VideoListsStack *ui; private: BangarangApplication *m_application; private slots: void on_configureVideoList_clicked(); }; #endif // VIDEOLISTSSTACK_H bangarang-bangarang/src/app/nowplaying/000077500000000000000000000000001166760560600204675ustar00rootroot00000000000000bangarang-bangarang/src/app/nowplaying/audiosettings.cpp000066400000000000000000000257731166760560600240730ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "audiosettings.h" #include "../common/bangarangapplication.h" #include "../../platform/utilities/utilities.h" #include "../common/mainwindow.h" #include "ui_mainwindow.h" #include "../common/actionsmanager.h" #include "../../platform/playlist.h" #include #include #include #include #include #include using namespace Phonon; AudioSettings::AudioSettings(MainWindow * parent) : QObject(parent) { /*Set up basics */ m_application = (BangarangApplication *) KApplication::kApplication(); m_mainWindow = parent; ui = m_mainWindow->ui; m_mediaController = NULL; //Setup and connect ui widgets connect(ui->restoreDefaultAudioSettings, SIGNAL(clicked()), this, SLOT(restoreDefaults())); connect(ui->hideAudioSettings, SIGNAL(clicked()), m_application->actionsManager()->action("show_audio_settings"), SLOT(trigger())); ui->eq1Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq2Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq3Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq4Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq5Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq6Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq7Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq8Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq9Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq10Label->setFont(KGlobalSettings::smallestReadableFont()); ui->eq11Label->setFont(KGlobalSettings::smallestReadableFont()); m_uiEqs << ui->eq1 << ui->eq2 << ui->eq3 << ui->eq4 << ui->eq5 << ui->eq6 << ui->eq7 << ui->eq8 << ui->eq9 << ui->eq10 << ui->eq11; for (int i = 0; i < 11; i++) { m_uiEqs.at(i)->setProperty("EQ_NO", i); } ui->audioChannelSelectionHolder->setEnabled(false); } AudioSettings::~AudioSettings() { } void AudioSettings::setMediaController(MediaController* mediaController) { m_mediaController = mediaController; updateAudioChannels(); connect(m_mediaController, SIGNAL(availableAudioChannelsChanged()), this, SLOT(updateAudioChannels())); connectAudioChannelCombo(); } void AudioSettings::setAudioPath(Path *audioPath) { //Determine if equalizer capability is present if (!insertAudioEffects(audioPath)) { ui->eqHolder->setEnabled(false); } //Load presets QList preset; preset <<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0; m_eqPresetNames << i18n("No effect"); m_eqPresets << preset; preset.clear(); preset <<0<<6<<5<<3<<0<<-2<<-2<<0<<3<<4<<6; m_eqPresetNames << i18n("Rock"); m_eqPresets << preset; preset.clear(); preset <<0<<6<<5<<0<<-2<<-1<<0<<0<<2<<4<<6; m_eqPresetNames << i18n("Reggae"); m_eqPresets << preset; preset.clear(); preset <<0<<6<<6<<4<<0<<-1<<-1<<0<<0<<2<<4; m_eqPresetNames << i18n("Dance"); m_eqPresets << preset; preset.clear(); preset <<0<<6<<2<<-1<<2<<4<<4<<4<<4<<2<<2; m_eqPresetNames << i18n("Live"); m_eqPresets << preset; preset.clear(); preset <<0<<-2<<-2<<1<<0<<1<<2<<2<<1<<0<<0; m_eqPresetNames << i18n("Classical"); m_eqPresets << preset; preset.clear(); preset <<0<<8<<6<<0<<0<<1<<2<<1<<0<<3<<5; m_eqPresetNames << i18n("Blockbuster"); m_eqPresets << preset; preset.clear(); preset <<0<<0<<0<<1<<2<<3<<4<<3<<2<<1<<0; m_eqPresetNames << i18n("Documentary"); m_eqPresets << preset; preset.clear(); preset <<0<<6<<3<<1<<2<<4<<4<<3<<0<<2<<4; m_eqPresetNames << i18n("Drama"); m_eqPresets << preset; preset.clear(); preset <<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0; m_eqPresetNames << i18n("Manual"); m_eqPresets << preset; ui->eqPresets->addItems(m_eqPresetNames); ui->eqPresets->setCurrentIndex(0); connect(ui->eqPresets, SIGNAL(currentIndexChanged(const QString)), this, SLOT(loadPreset(const QString))); } void AudioSettings::reconnectAudioPath(Path* audioPath) { if (!insertAudioEffects(audioPath)) { ui->eqHolder->setEnabled(false); return; } //be sure the values are still set for (int i = 0; i < m_audioEq->parameters().count(); i++ ) { m_audioEq->setParameterValue(m_audioEq->parameters()[i], m_uiEqs.at(i)->value()); } } void AudioSettings::saveAudioSettings(KConfigGroup *configGroup) { configGroup->writeEntry("EqualizerPresetSelection", ui->eqPresets->currentIndex()); QList manualPreset = m_eqPresets.at(m_eqPresetNames.indexOf(i18n("Manual"))); QStringList manualPresetStrL; for (int i = 0; i < manualPreset.count(); i++) { manualPresetStrL << QString("%1").arg(manualPreset.at(i)); } configGroup->writeEntry("EqualizerManualPreset", manualPresetStrL.join(",")); } void AudioSettings::restoreAudioSettings(KConfigGroup *configGroup) { QString manualPresetStr = configGroup->readEntry("EqualizerManualPreset", QString()); QStringList manualPresetStrL = manualPresetStr.split(","); if (manualPresetStrL.count() == 11) { QList preset; for (int i = 0; i < manualPresetStrL.count(); i++) { preset << manualPresetStrL.at(i).toInt(); } int indexOfManual = m_eqPresetNames.indexOf(i18n("Manual")); if (indexOfManual != -1) { m_eqPresets.replace(indexOfManual, preset); } } ui->eqPresets->setCurrentIndex(configGroup->readEntry("EqualizerPresetSelection", 0)); } void AudioSettings::loadPreset(const QString &presetName) { int indexOfPreset = m_eqPresetNames.indexOf(presetName); if (indexOfPreset != -1) { QList preset = m_eqPresets.at(indexOfPreset); setEq(preset); } } void AudioSettings::updateManualEqPresets() { int manualIndex = m_eqPresetNames.indexOf(i18n("Manual")); if (manualIndex != -1) { QList preset; foreach (QSlider *eq, m_uiEqs) { preset << eq->value(); } m_eqPresets.replace(manualIndex, preset); disconnect(ui->eqPresets, SIGNAL(currentIndexChanged(const QString)), this, SLOT(loadPreset(const QString))); ui->eqPresets->setCurrentIndex(manualIndex); connect(ui->eqPresets, SIGNAL(currentIndexChanged(const QString)), this, SLOT(loadPreset(const QString))); } } void AudioSettings::setEq(const QList &preset) { if (m_audioEq == NULL) { return; } disconnectEq(); for (int i = 0; i < m_audioEq->parameters().count(); i++ ) { m_audioEq->setParameterValue(m_audioEq->parameters().at(i), preset.at(i)); m_uiEqs.at(i)->setValue(preset.at(i)); } connectEq(); } void AudioSettings::restoreDefaults() { int manualIndex = m_eqPresetNames.indexOf(i18n("Manual")); if (manualIndex != -1) { QList preset; preset <<0<<0<<0<<0<<0<<0<<0<<0<<0<<0<<0; m_eqPresets.replace(manualIndex, preset); } ui->eqPresets->setCurrentIndex(0); } void AudioSettings::eqChanged(int v) { QVariant var = sender()->property("EQ_NO"); if (!var.isValid() || var.toInt() >= m_audioEq->parameters().count()) { return; } m_audioEq->setParameterValue(m_audioEq->parameters()[var.toInt()], v); updateManualEqPresets(); } void AudioSettings::connectEq() { foreach (QSlider *eq, m_uiEqs) { connect(eq, SIGNAL(valueChanged(int)), this, SLOT(eqChanged(int))); } } void AudioSettings::disconnectEq() { foreach (QSlider *eq, m_uiEqs) { disconnect(eq, SIGNAL(valueChanged(int)), this, SLOT(eqChanged(int))); } } void AudioSettings::setAudioChannel(int idx) { if ( idx < 0 ) return; int sidx = ui->audioChannelSelection->itemData(idx).toInt(); if ( m_mediaController->currentAudioChannel().index() == sidx ) return; AudioChannelDescription aud = AudioChannelDescription::fromIndex(sidx); m_mediaController->setCurrentAudioChannel(aud); } void AudioSettings::updateAudioChannels() { disconnectAudioChannelCombo(); QComboBox *cb = ui->audioChannelSelection; QList auds = m_mediaController->availableAudioChannels(); int no = auds.count(); ui->audioChannelSelectionHolder->setEnabled( no > 1 ); //has at least one audio channel cb->clear(); foreach (AudioChannelDescription aud, auds) { QString descr = aud.description().trimmed(); QString more = descr.isEmpty() ? QString() : QString(" (%1)").arg(descr); QString name = aud.name().trimmed(); QString trans_name = m_application->locale()->languageCodeToName( name ); QString display_name = trans_name.isEmpty() ? name : trans_name; cb->addItem( display_name + more, QVariant( aud.index() )); } updateAudioChannelCombo(); //will also reconnect } void AudioSettings::updateAudioChannelCombo() { disconnectAudioChannelCombo(); int curIdx = m_mediaController->currentAudioChannel().index(); QComboBox *cb = ui->audioChannelSelection; for (int i = 0; i < cb->count(); i++) { if (cb->itemData(i).toInt() == curIdx) { cb->setCurrentIndex(i); break; } } connectAudioChannelCombo(); } bool AudioSettings::insertAudioEffects(Path* audioPath) { QList effects = BackendCapabilities::availableAudioEffects(); foreach (EffectDescription effect, effects) { if(effect.name() != "KEqualizer") { continue; } m_audioEq = new Effect(effect, this); if (m_audioEq == NULL) continue; audioPath->insertEffect(m_audioEq); connectEq(); return true; } m_audioEq = NULL; return false; } void AudioSettings::connectAudioChannelCombo() { connect(ui->audioChannelSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(setAudioChannel(int))); } void AudioSettings::disconnectAudioChannelCombo() { disconnect(ui->audioChannelSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(setAudioChannel(int))); } void AudioSettings::enableTouch() { int tTouchable = BangarangApplication::TOUCH_TOUCHABLE_METRIC; ui->audioChannelSelection->setMinimumHeight(tTouchable); ui->eqPresets->setMinimumHeight(tTouchable); ui->restoreDefaultAudioSettings->setMinimumHeight(tTouchable); ui->hideAudioSettings->setMinimumHeight(tTouchable); } bangarang-bangarang/src/app/nowplaying/audiosettings.h000066400000000000000000000050751166760560600235310ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef AUDIOSETTINGS_H #define AUDIOSETTINGS_H #include #include #include #include #include #include #include #include class BangarangApplication; namespace Ui { class MainWindowClass; } class MainWindow; class MediaItemModel; class MediaItemDelegate; /* * This class is provide audio settings functions. */ class AudioSettings : public QObject { Q_OBJECT public: AudioSettings(MainWindow * parent = 0); ~AudioSettings(); void setAudioPath(Phonon::Path *audioPath); void reconnectAudioPath(Phonon::Path *audioPath); void setMediaController(Phonon::MediaController *mediaController); void saveAudioSettings(KConfigGroup *configGroup); void restoreAudioSettings(KConfigGroup *configGroup); void connectEq(); void disconnectEq(); void enableTouch(); public slots: void loadPreset(const QString &presetName); void setEq(const QList &set); void restoreDefaults(); void setAudioChannel(int idx); void updateAudioChannelCombo(); private: bool insertAudioEffects(Phonon::Path *audioPath); void connectAudioChannelCombo(); void disconnectAudioChannelCombo(); BangarangApplication * m_application; MainWindow * m_mainWindow; Ui::MainWindowClass *ui; Phonon::Effect * m_audioEq; Phonon::MediaController * m_mediaController; QStringList m_eqPresetNames; QList > m_eqPresets; QList m_uiEqs; void updateManualEqPresets(); private slots: void eqChanged(int v); void updateAudioChannels(); }; #endif // AUDIOSETTINGS_H bangarang-bangarang/src/app/nowplaying/bangarangvideowidget.cpp000066400000000000000000000063751166760560600253610ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "bangarangvideowidget.h" #include "../common/actionsmanager.h" #include #include #include #include #include #include #include #include #include class BangarangVideoWidgetPrivate { public: BangarangVideoWidgetPrivate() { } }; BangarangVideoWidget::BangarangVideoWidget(QWidget * parent) : Phonon::VideoWidget(parent) , d(new BangarangVideoWidgetPrivate) { m_application = (BangarangApplication *)KApplication::kApplication(); m_contextMenu = NULL; } BangarangVideoWidget::~BangarangVideoWidget() { delete d; } void BangarangVideoWidget::wheelEvent(QWheelEvent *event) { if(event->delta() > 0 ) { emit skipBackward(event->delta()); } else if (event->delta() < 0 ) { emit skipForward(event->delta()); } Phonon::VideoWidget::wheelEvent(event); } void BangarangVideoWidget::mouseDoubleClickEvent (QMouseEvent *event) { if(event->button() == Qt::LeftButton && !m_application->isTouchEnabled()){ if (m_fullscreen) { emit fullscreenChanged(false); setIsFullscreen(false); } else { emit fullscreenChanged(true); setIsFullscreen(true); } } } void BangarangVideoWidget::mouseReleaseEvent(QMouseEvent *event) { if (m_application->isTouchEnabled()) { m_application->actionsManager()->action("toggle_controls")->trigger(); } Q_UNUSED(event); } void BangarangVideoWidget::setIsFullscreen(bool isFullscreen) { m_fullscreen = isFullscreen; } void BangarangVideoWidget::contextMenuEvent ( QContextMenuEvent * event ) { /* * NOTE: at least at a bangarang 2.x release we should set a fixed menu. the nowPlayingContextMenu * is currently rebuild at any call, because the available subtitles/audiotracks and so on could have changed. * But as I spotted the MediaController provides signals that these have changed. So we need to implement * slots for these in a class (don't know which, maybe just a separate one existing only for the DVD menu). * Then the menu should be _changed_ not recreated as this function can keep the pointer to the contextMenu */ Q_UNUSED(event); if ( m_contextMenu != NULL ) m_contextMenu->exec(QCursor::pos()); else m_application->actionsManager()->nowPlayingContextMenu()->exec(QCursor::pos()); } QMenu* BangarangVideoWidget::contextMenu() { return m_contextMenu; } void BangarangVideoWidget::setContextMenu(QMenu * menu) { m_contextMenu = menu; } #include "bangarangvideowidget.moc" bangarang-bangarang/src/app/nowplaying/bangarangvideowidget.h000066400000000000000000000050621166760560600250160ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef BANGARANGVIDEOWIDGET_H #define BANGARANGVIDEOWIDGET_H #include "../common/bangarangapplication.h" #include #include #include class BangarangVideoWidgetPrivate; /** * This class is there to override the Phonon::VideoWidget to get the QWheelEvent * and thus be able to skip over parts of a video. * * @author Andreas Marschke */ class BangarangVideoWidget : public Phonon::VideoWidget { Q_OBJECT public: /** * create new instance */ BangarangVideoWidget(QWidget * parent = 0); /** * @desc delete instance */ ~BangarangVideoWidget(); /** * @desc override of wheelEvent. If mousewheel is vertically scrolled it emits @func skip(). */ virtual void wheelEvent ( QWheelEvent * event ); /** * @desc * @param set if @param fullscreen should be true or false * This emits @SIGNAL fullscreenChanged() so the rest of Bangarang can Hook into it. */ void setIsFullscreen(bool fullscreen); /** * Context menu shown when the widget is rightclicked. **/ QMenu * contextMenu(); /** * You can either work with the QMenu returned by contextMenu() or set * your own menu with @param menu. **/ void setContextMenu(QMenu * menu); protected: void mouseDoubleClickEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *); Q_SIGNALS: void skipForward(int i); void skipBackward(int i); void fullscreenChanged(bool); private: friend class BangarangVideoWidgetPrivate; BangarangVideoWidgetPrivate* const d; BangarangApplication *m_application; bool m_fullscreen; QMenu *m_contextMenu; private slots: void contextMenuEvent(QContextMenuEvent * event); }; #endif //BANGARANGVIDEOWIDGET_H bangarang-bangarang/src/app/nowplaying/bookmarksmanager.cpp000066400000000000000000000174401166760560600245240ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "bookmarksmanager.h" #include "../../platform/utilities/utilities.h" #include "../common/mainwindow.h" #include "../common/bangarangapplication.h" #include "../common/actionsmanager.h" #include "ui_mainwindow.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/playlist.h" #include #include #include #include BookmarksManager::BookmarksManager(MainWindow * parent) : QObject(parent) { m_parent = parent; ui = m_parent->ui; m_application = (BangarangApplication*)KApplication::kApplication(); } BookmarksManager::~BookmarksManager() { } QStringList BookmarksManager::bookmarks(const QString &url) { QStringList bookmarksList; if( url == "-" ) return bookmarksList; //Load bookmarks for specified url QFile *file = bookmarkFile(url); if (file->open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream bmin(file); while (!bmin.atEnd()) { QString line = bmin.readLine(); QStringList nameTime = line.split(":::"); if (nameTime.count() == 2) { bookmarksList.append(line); } } } return bookmarksList; } QString BookmarksManager::bookmarkName(const QString &bookmark) { QString name; QStringList nameTime = bookmark.split(":::"); if (nameTime.count() == 2) { name = nameTime.at(0); } return name; } qint64 BookmarksManager::bookmarkTime(const QString &bookmark) { qint64 time = 0; QStringList nameTime = bookmark.split(":::"); if (nameTime.count() == 2) { time = nameTime.at(1).toInt(); } return time; } QString BookmarksManager::bookmarkLookup(const QString & url, const QString &name) { QString bookmark; QStringList currentBookmarks = bookmarks(url); for (int i = 0; i < currentBookmarks.count(); i++) { if (bookmarkName(currentBookmarks.at(i)) == name) { bookmark = currentBookmarks.at(i); break; } } return bookmark; } bool BookmarksManager::hasBookmarks(const MediaItem &mediaItem) { return (bookmarks(mediaItem.url).count() > 0); } void BookmarksManager::addBookmark(const QString &url, const QString &name, int time) { QStringList currentBookmarks = bookmarks(url); currentBookmarks.append(QString("%1:::%2").arg(name).arg(time)); writeBookmarks(bookmarkFile(url, true), currentBookmarks); } void BookmarksManager::removeBookmark(const QString &url, const QString &bookmark) { QStringList currentBookmarks = bookmarks(url); if (currentBookmarks.count() > 0) { int indexOfBookmark = currentBookmarks.indexOf(bookmark); if (indexOfBookmark != -1) { currentBookmarks.removeAt(indexOfBookmark); } if (currentBookmarks.count() > 0) { writeBookmarks(bookmarkFile(url), currentBookmarks); } else { removeBookmarks(url); } } } void BookmarksManager::removeBookmarks(const QString &url) { QFile *file = bookmarkFile(url); file->remove(); QStringList fileIndex = bookmarkFileIndex(); QStringList newFileIndex; for (int i = 0; i < fileIndex.count(); i++) { QStringList urlBookmarkFile = fileIndex.at(i).split(":::"); if (urlBookmarkFile.count() == 2) { if (urlBookmarkFile.at(0) != url) { newFileIndex.append(fileIndex.at(i)); } } } writeBookmarkFileIndex(newFileIndex); } void BookmarksManager::renameBookmark(const QString &url, const QString &oldName, const QString &newName) { QStringList currentBookmarks = bookmarks(url); for (int i = 0; i < currentBookmarks.count(); i++) { if (bookmarkName(currentBookmarks.at(i)) == oldName) { QString newBookMark = QString("%1:::%2").arg(newName).arg(bookmarkTime(currentBookmarks.at(i))); currentBookmarks.replace(i,newBookMark); writeBookmarks(bookmarkFile(url), currentBookmarks); break; } } } void BookmarksManager::showAddBookmarkDialog() { /*if (m_parent->playlist()->nowPlayingModel()->rowCount() > 0) { QString nowPlayingUrl = m_parent->playlist()->nowPlayingModel()->mediaItemAt(0).url; int currentTime = m_parent->playlist()->mediaObject()->currentTime(); }*/ } QFile *BookmarksManager::bookmarkFile(const QString &url, bool createIfMissing) { QFile *file = new QFile(""); bool urlIsMissing = true; //Find bookmark file for the specified url QStringList fileIndex = bookmarkFileIndex(); QStringList indexOfUrl = fileIndex.filter(url); if (indexOfUrl.count() > 0) { QStringList urlBookmarkFile = indexOfUrl.at(0).split(":::"); if (urlBookmarkFile.count() == 2) { file = new QFile(urlBookmarkFile.at(1)); urlIsMissing = false; } } //Add new bookmark file for the specified url to the index if none exists if (urlIsMissing && createIfMissing) { QString bookmarkFileName = QDateTime::currentDateTime().toString("yyyyMMddhhmmss"); QString bookmarkFilePath = KStandardDirs::locateLocal("data", QString("bangarang/bookmarks/%1").arg(bookmarkFileName), true); fileIndex.append(QString("%1:::%2").arg(url).arg(bookmarkFilePath)); writeBookmarkFileIndex(fileIndex); file = new QFile(bookmarkFilePath); } return file; } void BookmarksManager::writeBookmarks(QFile *file, QStringList bookmarkList) { file->remove(); if (file->open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream bmout(file); for (int i = 0; i < bookmarkList.count(); i ++) { bmout << bookmarkList.at(i) << "\r\n"; } file->close(); } } QStringList BookmarksManager::bookmarkFileIndex() { QStringList fileIndex; //Find bookmark file for the specified url QFile bookmarksFile(KStandardDirs::locateLocal("data", "bangarang/bookmarks/bookmarks", true)); if (bookmarksFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&bookmarksFile); while (!in.atEnd()) { QString line = in.readLine(); QStringList urlBookmarkFile = line.split(":::"); if (urlBookmarkFile.count() == 2) { fileIndex << line; } } bookmarksFile.close(); } return fileIndex; } void BookmarksManager::writeBookmarkFileIndex(QStringList fileIndex) { QFile bookmarkIndex(KStandardDirs::locateLocal("data", "bangarang/bookmarks/bookmarks", true)); bookmarkIndex.remove(); if (bookmarkIndex.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream bmout(&bookmarkIndex); for (int i = 0; i < fileIndex.count(); i++) { bmout << fileIndex.at(i) << "\r\n"; } bookmarkIndex.close(); } } void BookmarksManager::showBookmarksMenu() { if (m_application->mainWindow()->currentMainWidget() == MainWindow::MainNowPlaying) { QPoint menuLocation = ui->seekTime->mapToGlobal(QPoint(0,ui->showMenu->height())); m_application->actionsManager()->bookmarksMenu()->popup(menuLocation); } } bangarang-bangarang/src/app/nowplaying/bookmarksmanager.h000066400000000000000000000044321166760560600241660ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef BOOKMARKSMANAGER_H #define BOOKMARKSMANAGER_H #include #include namespace Ui { class MainWindowClass; } class MainWindow; class MediaItem; class BangarangApplication; /* * This class provides a user interface for adding and removing mediaItem bookmarks */ class BookmarksManager : public QObject { Q_OBJECT public: BookmarksManager(MainWindow * parent); ~BookmarksManager(); QStringList bookmarks(const QString &url); QString bookmarkName(const QString &bookmark); qint64 bookmarkTime(const QString &bookmark); QString bookmarkLookup(const QString & url, const QString &name); bool hasBookmarks(const MediaItem &mediaItem); public slots: void addBookmark(const QString &url, const QString &name, int time); void removeBookmark(const QString &url, const QString &bookmark); void removeBookmarks(const QString &url); void renameBookmark(const QString &url, const QString &oldName, const QString &newName); void showBookmarksMenu(); void showAddBookmarkDialog(); private: BangarangApplication* m_application; MainWindow *m_parent; Ui::MainWindowClass *ui; bool m_nepomukInited; QFile *bookmarkFile(const QString &url, bool createIfMissing = false); void writeBookmarks(QFile *file, QStringList bookmarkList); QStringList bookmarkFileIndex(); void writeBookmarkFileIndex(QStringList fileIndex); }; #endif //BOOKMARKSMANAGER_H bangarang-bangarang/src/app/nowplaying/nowplayingdelegate.cpp000066400000000000000000000566431166760560600250730ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "nowplayingdelegate.h" #include "../common/bangarangapplication.h" #include "../medialists/infomanager.h" #include "../../platform/utilities/utilities.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/mediaindexer.h" #include "../../platform/mediavocabulary.h" #include "../../platform/playlist.h" #include "../common/mainwindow.h" #include "../common/starrating.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include NowPlayingDelegate::NowPlayingDelegate(QObject *parent) : QItemDelegate(parent) { m_application = (BangarangApplication *)KApplication::kApplication(); m_parent = (MainWindow *)parent; m_globalRatingRect = QRect(0, 0, 0, 0); m_view = NULL; m_iconSize = 128; m_padding = 6; m_textInner = m_iconSize + 2 * m_padding; m_starRatingSize = StarRating::Big; m_showInfo = false; m_infoFont = KGlobalSettings::smallestReadableFont(); m_nepomukInited = Utilities::nepomukInited(); if (m_nepomukInited) { m_mediaIndexer = new MediaIndexer(this); } } NowPlayingDelegate::~NowPlayingDelegate() { } void NowPlayingDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.row() != 0 && index.column() !=0) { return; } const int left = option.rect.left(); const int top = option.rect.top(); const int width = option.rect.width(); const int height = option.rect.height(); QColor foregroundColor = (option.state.testFlag(QStyle::State_Selected)) ? option.palette.color(QPalette::HighlightedText) : option.palette.color(QPalette::Text); bool isMedia = Utilities::isMediaItem(&index); QString type = index.data(MediaItem::TypeRole).toString(); MediaItemModel * model = (MediaItemModel *)index.model(); QString subType; if (type == "Audio") { subType = model->mediaItemAt(index.row()).fields["audioType"].toString(); } else if (type == "Video") { subType = model->mediaItemAt(index.row()).fields["videoType"].toString(); } //Create base pixmap QPixmap pixmap(width, height); pixmap.fill(Qt::transparent); QPainter p(&pixmap); p.translate(-option.rect.topLeft()); //Paint Artwork KIcon icon(index.data(Qt::DecorationRole).value()); int topOffset = (height - 2*m_iconSize) / 2; if (!icon.isNull() && m_iconSize > 0) { icon.paint(&p, left + m_padding, top + topOffset, m_iconSize, m_iconSize, Qt::AlignCenter, QIcon::Normal); } //Paint text QString text = index.data(Qt::DisplayRole).toString(); QFont textFont = option.font; QTextOption textOption(Qt::AlignLeft | Qt::AlignBottom); textOption.setWrapMode(QTextOption::WordWrap); QRect titleRect(left + m_textInner, top + m_padding, width - m_textInner - m_padding, 0.4 * m_iconSize + topOffset); textFont.setPixelSize((int)(m_iconSize/6)); p.setFont(textFont); p.setPen(foregroundColor); p.drawText(QRectF(titleRect), text, textOption); QString subTitle = index.data(MediaItem::SubTitleRole).toString(); QFont subTitleFont = option.font; QRect subTitleRect(left + m_textInner, top + topOffset + 0.4 * m_iconSize, width - m_textInner - m_padding, 0.6 * m_iconSize - 18); subTitleFont.setPixelSize((int)(m_iconSize/9)); textOption.setAlignment(Qt::AlignLeft | Qt::AlignVCenter); QColor subTitleColor = KColorScheme(QPalette::Active).foreground(KColorScheme::InactiveText).color(); p.setFont(subTitleFont); p.setPen(subTitleColor); p.drawText(QRectF(subTitleRect), subTitle, textOption); //Draw rating if (m_nepomukInited && isMedia && (subType != "CD Track") && (subType != "DVD Title")) { int rating = index.data(MediaItem::RatingRole).isValid() ? index.data(MediaItem::RatingRole).toInt() : 0; StarRating r = StarRating(rating, m_starRatingSize, ratingRect(&option.rect).topLeft()); if (option.state.testFlag(QStyle::State_MouseOver) && !m_application->isTouchEnabled()) r.setHoverAtPosition(m_view->mapFromGlobal(QCursor::pos())); r.paint(&p); } p.end(); //Draw finished pixmap painter->drawPixmap(option.rect.topLeft(), pixmap); QPixmap baseReflectionPixmap = pixmap.copy(0,0,pixmap.width(),pixmap.height()/2); QPixmap reflection = Utilities::reflection(baseReflectionPixmap); painter->drawPixmap(option.rect.topLeft() + QPoint(0, 1+height/2), reflection); //Draw additional info paintInfo(painter, option, index); } QSize NowPlayingDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { int width; if (index.column() == 0) { width = option.rect.width(); } else { width = 0; } return QSize(width, m_view->height()); } int NowPlayingDelegate::columnWidth (int column, int viewWidth) const { int width; if (column == 0) { width = viewWidth; } else { width = 0; } return width; } void NowPlayingDelegate::setShowInfo(bool showInfo) { m_showInfo = showInfo; m_view->update(m_view->model()->index(0,0)); } bool NowPlayingDelegate::showingInfo() { return m_showInfo; } QRect NowPlayingDelegate::ratingRect(const QRect *rect) const { QSize sz = StarRating::SizeHint(m_starRatingSize); QPoint p = QPoint(rect->left() + m_textInner, rect->top() + (rect->height() / 2) - sz.height()); return QRect(p, sz); } bool NowPlayingDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { static bool s_mouseOver = false; Q_UNUSED(model); if (event->type() != QEvent::MouseButtonRelease && event->type() != QEvent::MouseMove) return false; if (index.column() != 0) return false; if (!Utilities::isMediaItem(&index)) return false; QPoint mousePos = ((QMouseEvent *)event)->pos(); m_view->update(index); QRect ratingArea = ratingRect(&option.rect); if (!m_nepomukInited) { return false; } if (!ratingArea.contains(mousePos)) { if (s_mouseOver) { //onLeave effect s_mouseOver = false; m_view->update(); } return false; } if (!s_mouseOver) //mouse entered s_mouseOver = true; if (event->type() == QEvent::MouseMove) //mouse over { m_view->update(); return false; } //else the user clicked, so we have to save the new rating int rating = StarRating::RatingAtPosition(mousePos, m_starRatingSize, ratingArea.topLeft()); MediaItemModel *cmodel = (MediaItemModel *)index.model(); QString url = cmodel->mediaItemAt(index.row()).url; bool indexerUpdated = false; //models have to be update #define MODELS_TO_BE_UPDATED 4 MediaItemModel *models[MODELS_TO_BE_UPDATED] = { cmodel, m_application->playlist()->playlistModel(), m_application->playlist()->queueModel(), m_application->browsingModel() }; for (int i = 0; i < MODELS_TO_BE_UPDATED; i++) { cmodel = models[i]; int row = cmodel->rowOfUrl(url); if (row < 0) continue; MediaItem update = cmodel->mediaItemAt(row); update.fields["rating"] = rating; cmodel->replaceMediaItemAt(row, update); if (!indexerUpdated) { m_mediaIndexer->updateRating(update.fields["resourceUri"].toString(),rating); indexerUpdated = true; } } m_application->infoManager()->loadSelectedInfo(); return false; } void NowPlayingDelegate::updateSizeHint() { emit sizeHintChanged(m_view->model()->index(0,0)); } void NowPlayingDelegate::paintInfo(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (!m_showInfo) { return; } MediaItem mediaItem = ((MediaItemModel *)index.model())->mediaItemAt(index.row()); if (mediaItem.type != "Audio" && mediaItem.type != "Video") { return; } //Draw additional info //TODO::The code below could probably use a pass to reduce duplication QFont infoFont = m_infoFont; QFontMetrics fm(infoFont); QFont fieldFont = m_infoFont; fieldFont.setBold(true); QColor foregroundColor = option.palette.color(QPalette::Text); QColor fieldColor = foregroundColor; fieldColor.setAlpha(190); QColor subTitleColor = KColorScheme(QPalette::Active).foreground(KColorScheme::InactiveText).color(); painter->setPen(subTitleColor); painter->setFont(infoFont); painter->setRenderHint(QPainter::Antialiasing); QRect rect = infoRect(option, index); if (mediaItem.type == "Audio") { int line = 0; QString artists = mediaItem.fields["artist"].toStringList().join(", "); if (!artists.isEmpty()) { QString field = i18n("Artist: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, artists); line++; } QString composers = mediaItem.fields["composer"].toStringList().join(", "); if (!composers.isEmpty()) { QString field = i18n("Composer: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, composers); line++; } QString album = mediaItem.fields["album"].toString(); if (!album.isEmpty()) { QString field = i18n("Album: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, album); line++; } int trackNumber = mediaItem.fields["trackNumber"].toInt(); if (trackNumber > 0) { QString field = i18n("Track: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, QString("%1").arg(trackNumber)); line++; } int year = mediaItem.fields["year"].toInt(); if (year > 0) { QString field = i18n("Year: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, QString("%1").arg(year)); line++; } QString genres = mediaItem.fields["genre"].toStringList().join(", "); if (!genres.isEmpty()) { QString field = i18n("Genre: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, genres); line++; } QString tags = mediaItem.fields["tags"].toStringList().join(", "); if (!tags.isEmpty()) { QString field = i18n("Tags: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, tags); line++; } QString description = mediaItem.fields["description"].toString(); if (!description.isEmpty()) { painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextWordWrap, description); line++; } } else if (mediaItem.type == "Video") { int line = 0; int year = mediaItem.fields["year"].toInt(); if (year > 0) { QString field = i18n("Year: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, QString("%1").arg(year)); line++; } QString actors = mediaItem.fields["actor"].toStringList().join(", "); if (!actors.isEmpty()) { QString field = i18n("Actor: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, actors); line++; } QString directors = mediaItem.fields["director"].toStringList().join(", "); if (!directors.isEmpty()) { QString field = i18n("Director: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, directors); line++; } QString writers = mediaItem.fields["writer"].toStringList().join(", "); if (!writers.isEmpty()) { QString field = i18n("Writer: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, writers); line++; } QString producers = mediaItem.fields["producer"].toStringList().join(", "); if (!producers.isEmpty()) { QString field = i18n("Producer: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, producers); line++; } QString genres = mediaItem.fields["genre"].toStringList().join(", "); if (!genres.isEmpty()) { QString field = i18n("Genre: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, genres); line++; } QString tags = mediaItem.fields["tags"].toStringList().join(", "); if (!tags.isEmpty()) { QString field = i18n("Tags: "); QFontMetrics fm(fieldFont); painter->save(); painter->setFont(fieldFont); painter->setPen(fieldColor); painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, field); painter->restore(); painter->drawText(rect.adjusted(fm.width(field), line*(fm.lineSpacing()+3), 0, 0), Qt::TextSingleLine, tags); line++; } QString description = mediaItem.fields["description"].toString(); if (!description.isEmpty()) { painter->drawText(rect.adjusted(0, line*(fm.lineSpacing()+3), 0, 0), Qt::TextWordWrap, description); line++; } } } QRect NowPlayingDelegate::infoRect(const QStyleOptionViewItem &option, const QModelIndex &index) const { if (!m_showInfo) { return QRect(); } MediaItem mediaItem = ((MediaItemModel *)index.model())->mediaItemAt(index.row()); if (mediaItem.type != "Audio" && mediaItem.type != "Video") { return QRect(); } QRect rect; QFont infoFont = m_infoFont; QFontMetrics fm(infoFont); int infoWidth = option.rect.width() - 20; if (m_parent->videoSize() == MainWindow::Mini) { infoWidth = infoWidth - m_parent->ui->videoFrame->width() - 20; } if (mediaItem.type == "Audio") { int line = 0; QString artists = mediaItem.fields["artist"].toStringList().join(", "); if (!artists.isEmpty()) { artists = fm.elidedText(artists, Qt::ElideRight, infoWidth); line++; } QString composers = mediaItem.fields["composer"].toStringList().join(", "); if (!composers.isEmpty()) { composers = fm.elidedText(composers, Qt::ElideRight, infoWidth); line++; } QString album = mediaItem.fields["album"].toString(); if (!album.isEmpty()) { album = fm.elidedText(album, Qt::ElideRight, infoWidth); line++; } int trackNumber = mediaItem.fields["trackNumber"].toInt(); if (trackNumber > 0) { line++; } int year = mediaItem.fields["year"].toInt(); if (year > 0) { line++; } QString genres = mediaItem.fields["genre"].toStringList().join(", "); if (!genres.isEmpty()) { genres = fm.elidedText(genres, Qt::ElideRight, infoWidth); line++; } QString tags = mediaItem.fields["tags"].toStringList().join(", "); if (!tags.isEmpty()) { tags = fm.elidedText(tags, Qt::ElideRight, infoWidth); line++; } QString description = mediaItem.fields["description"].toString(); if (!description.isEmpty()) { QRect descRect = fm.boundingRect(0, 0, infoWidth, fm.lineSpacing(), Qt::TextWordWrap, description); line = line + int((0.5+descRect.height())/fm.lineSpacing()); } rect = option.rect.adjusted(5, option.rect.height()-line*(fm.lineSpacing()+3) - 5, -option.rect.width() + infoWidth + 5, -5); if (rect.height() > option.rect.height()/2) { rect = QRect(); } } else if (mediaItem.type == "Video") { int line = 0; int year = mediaItem.fields["year"].toInt(); if (year > 0) { line++; } QString actors = mediaItem.fields["actor"].toStringList().join(", "); if (!actors.isEmpty()) { actors = fm.elidedText(actors, Qt::ElideRight, infoWidth); line++; } QString directors = mediaItem.fields["director"].toStringList().join(", "); if (!directors.isEmpty()) { directors = fm.elidedText(directors, Qt::ElideRight, infoWidth); line++; } QString writers = mediaItem.fields["writer"].toStringList().join(", "); if (!writers.isEmpty()) { writers = fm.elidedText(writers, Qt::ElideRight, infoWidth); line++; } QString producers = mediaItem.fields["producer"].toStringList().join(", "); if (!producers.isEmpty()) { producers = fm.elidedText(producers, Qt::ElideRight, infoWidth); line++; } QString genres = mediaItem.fields["genre"].toStringList().join(", "); if (!genres.isEmpty()) { genres = fm.elidedText(genres, Qt::ElideRight, infoWidth); line++; } QString tags = mediaItem.fields["tags"].toStringList().join(", "); if (!tags.isEmpty()) { tags = fm.elidedText(tags, Qt::ElideRight, infoWidth); line++; } QString description = mediaItem.fields["description"].toString(); if (!description.isEmpty()) { QRect descRect = fm.boundingRect(0, 0, infoWidth, fm.lineSpacing(), Qt::TextWordWrap, description); line = line + int((0.5+descRect.height())/fm.lineSpacing()); } rect = option.rect.adjusted(5, option.rect.height()-line*(fm.lineSpacing()+3) - 5, -option.rect.width() + infoWidth + 5, -5); if (rect.height() > option.rect.height()/2) { rect = QRect(); } } return rect; } void NowPlayingDelegate::enableTouch() { m_starRatingSize = StarRating::Huge; m_iconSize = 164; m_textInner = m_iconSize + 2 * m_padding; m_infoFont = KGlobalSettings::generalFont(); } bangarang-bangarang/src/app/nowplaying/nowplayingdelegate.h000066400000000000000000000053131166760560600245240ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef NOWPLAYINGDELEGATE_H #define NOWPLAYINGDELEGATE_H #include #include #include #include class MainWindow; class MediaIndexer; class BangarangApplication; /* * This ItemDelegate is responsible for painting the currently * playing MediaItem for the Now Playing View. It is * also responsible for updating the rating when the user changes * the rating from the Now Playing View. */ class NowPlayingDelegate : public QItemDelegate { Q_OBJECT public: NowPlayingDelegate(QObject * parent = 0); ~NowPlayingDelegate(); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; int columnWidth (int column, int viewWidth) const; bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index); QAbstractItemView *view() { return m_view; } void setView(QAbstractItemView *view) { m_view = view; } void updateSizeHint(); void setShowInfo(bool showInfo); bool showingInfo(); void enableTouch(); protected: QRect ratingRect(const QRect *rect) const; private: BangarangApplication * m_application; MainWindow * m_parent; int m_iconSize; int m_padding; int m_textInner; int m_starRatingSize; bool m_nepomukInited; QRect m_globalRatingRect; QAbstractItemView *m_view; MediaIndexer * m_mediaIndexer; bool m_showInfo; QFont m_infoFont; void paintInfo(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QRect infoRect(const QStyleOptionViewItem &option, const QModelIndex &index) const; }; #endif // NOWPLAYINGDELEGATE_H bangarang-bangarang/src/app/nowplaying/nowplayingmanager.cpp000066400000000000000000000603121166760560600247170ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "nowplayingmanager.h" #include "../common/bangarangapplication.h" #include "../common/mainwindow.h" #include "../common/bangarangnotifieritem.h" #include "../common/actionsmanager.h" #include "bangarangvideowidget.h" #include "playlistview.h" #include "bookmarksmanager.h" #include "ui_mainwindow.h" #include "../../platform/mediaitemmodel.h" #include "../../platform/playlist.h" #include "../../platform/utilities/artwork.h" #include "../../platform/utilities/general.h" #include #include #include NowPlayingManager::NowPlayingManager(MainWindow* parent) : QObject(parent) { m_application = (BangarangApplication*)KApplication::kApplication(); Ui::MainWindowClass* ui = m_application->mainWindow()->ui; m_pausePressed = false; m_stopPressed = false; m_loadingProgress = 0; //Connect to media object signals and slots connect(m_application->mediaObject(), SIGNAL(tick(qint64)), this, SLOT(updateSeekTime(qint64))); connect(m_application->mediaObject(), SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(mediaStateChanged(Phonon::State, Phonon::State))); connect(m_application->mainWindow()->videoWidget(), SIGNAL(skipForward(int)), this, SLOT(skipForward(int))); connect(m_application->mainWindow()->videoWidget(), SIGNAL(skipBackward(int)), this, SLOT(skipBackward(int))); connectPhononWidgets(); //Set up playlist connect(m_application->playlist(), SIGNAL(playlistFinished()), this, SLOT(playlistFinished())); connect(m_application->playlist(), SIGNAL(loading()), this, SLOT(playlistLoading())); connect(m_application->playlist(), SIGNAL(shuffleModeChanged(bool)), this, SLOT(shuffleModeChanged(bool))); connect(m_application->playlist(), SIGNAL(repeatModeChanged(bool)), this, SLOT(repeatModeChanged(bool))); //Setup Now Playing view connect(m_application->playlist()->nowPlayingModel(), SIGNAL(mediaListChanged()), this, SLOT(nowPlayingChanged())); //Set up playlist view connect(ui->playlistView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(playPlaylistItem(QModelIndex))); connect(ui->closePlaylistNotification, SIGNAL(clicked()), this, SLOT(closePlaylistNotification())); connect(ui->playlistNotificationNo, SIGNAL(clicked()), this, SLOT(selectPlaylistNotificationNo())); connect(ui->playlistNotificationYes, SIGNAL(clicked()), this, SLOT(selectPlaylistNotificationYes())); connect(ui->closePlaylistFilter, SIGNAL(clicked()), this, SLOT(closePlaylistFilter())); ui->playlistFilterProxyLine->setProxy(m_application->playlist()->filterProxyModel()); m_playWhenPlaylistChanges = false; //Setup show queue, clear playlist shuffle and repeat connect(ui->showQueue, SIGNAL(clicked()), this, SLOT(toggleQueue())); connect(ui->shuffle, SIGNAL(clicked()), this, SLOT(toggleShuffle())); connect(ui->repeat, SIGNAL(clicked()), this, SLOT(toggleRepeat())); connect(ui->clearPlaylist, SIGNAL(clicked()), this, SLOT(clearPlaylist())); //Setup playback buttons connect(ui->mediaPlayPause, SIGNAL(pressed()), this, SLOT(mediaPlayPausePressed())); connect(ui->mediaPlayPause, SIGNAL(held()), this, SLOT(mediaPlayPauseHeld())); connect(ui->mediaPlayPause, SIGNAL(released()), this, SLOT(mediaPlayPauseReleased())); setShowRemainingTime(false); updateSeekTime(0); showApplicationBanner(); } void NowPlayingManager::connectPhononWidgets() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; ui->volumeSlider->setAudioOutput(m_application->audioOutput()); ui->seekSlider->setMediaObject(m_application->mediaObject()); connect(ui->volumeIcon, SIGNAL(toggled(bool)), m_application->audioOutput(), SLOT(setMuted(bool))); connect(m_application->audioOutput(), SIGNAL(mutedChanged(bool)), this, SLOT(updateMuteStatus(bool))); updateMuteStatus(m_application->audioOutput()->isMuted()); } void NowPlayingManager::disconnectPhononWidgets() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; disconnect(ui->volumeIcon, SIGNAL(toggled(bool)), m_application->audioOutput(), SLOT(setMuted(bool))); disconnect(m_application->audioOutput(), SIGNAL(mutedChanged(bool)), this, SLOT(updateMuteStatus(bool))); } void NowPlayingManager::setShowRemainingTime(bool showRemainingTime) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; m_showRemainingTime = showRemainingTime; if (m_showRemainingTime) { ui->seekTime->setToolTip(i18n("Time remaining
Click to show elapsed time and bookmarks")); } else { ui->seekTime->setToolTip(i18n("Time elapsed
Click to show remaining time and bookmarks")); } } bool NowPlayingManager::showingRemainingTime() { return m_showRemainingTime; } bool NowPlayingManager::newPlaylistNotification(QString text, QObject *receiver, const char *slot) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; bool question = (receiver != NULL); if (ui->playlistNotification->isVisible() && !ui->closePlaylistNotification->isVisible()) { return false; //There is a pending notification that needs to be answered! } if (question && !slot) { return false; //receiver set but no slot. That's wrong! } ui->playlistNotificationLabel->setText(text); ui->closePlaylistNotification->setVisible(!question); ui->playlistNotificationNo->setVisible(question); ui->playlistNotificationYes->setVisible(question); if (question) { connect(this, SIGNAL(playlistNotificationResult(bool)), receiver, slot); } return true; } void NowPlayingManager::mediaPlayPausePressed() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if ((m_application->mediaObject()->state() == Phonon::PlayingState)) { m_application->mediaObject()->pause(); m_pausePressed = true; ui->mediaPlayPause->setToolTip(i18n("Paused
Hold to stop")); } } void NowPlayingManager::mediaPlayPauseHeld() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if ((m_application->mediaObject()->state() != Phonon::LoadingState) && (m_application->mediaObject()->state() != Phonon::StoppedState)) { if (m_pausePressed) { m_pausePressed = false; } m_stopPressed = true; ui->mediaPlayPause->setIcon(KIcon("media-playback-stop")); m_application->playlist()->stop(); } } void NowPlayingManager::mediaPlayPauseReleased() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (m_stopPressed) { m_stopPressed = false; } else { if ((!m_pausePressed) && (m_application->mediaObject()->state() == Phonon::PausedState)) { m_application->mediaObject()->play(); } else if ((m_application->mediaObject()->state() == Phonon::StoppedState) || (m_application->mediaObject()->state() == Phonon::LoadingState)) { if (ui->playlistView->model()->rowCount() > 0 && ui->playlistView->selectionModel()->selectedIndexes().count() == 0) { m_application->playlist()->start(); } else if (ui->playlistView->model()->rowCount() > 0 && ui->playlistView->selectionModel()->selectedIndexes().count() > 0) { QModelIndex index = ui->playlistView->selectionModel()->selectedIndexes().at(0); playPlaylistItem(index); } } } m_pausePressed = false; if ((m_application->mediaObject()->state() == Phonon::PausedState) || (m_application->mediaObject()->state() == Phonon::StoppedState)) { ui->mediaPlayPause->setIcon(KIcon("media-playback-start")); ui->mediaPlayPause->setToolTip(""); } } void NowPlayingManager::playPlaylistItem(const QModelIndex &index) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; int row = m_application->playlist()->filterProxyModel()->mapToSource(index).row(); m_application->playlist()->playItemAt(row, ui->playlistView->currentModelType()); ui->playlistView->selectionModel()->clear(); } void NowPlayingManager::showApplicationBanner() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; MediaItem applicationBanner; applicationBanner.artwork = KIcon("bangarang"); applicationBanner.title = i18n("Bangarang"); applicationBanner.subTitle = i18n("Entertainment... Now"); applicationBanner.type = "Application Banner"; applicationBanner.url = "-"; m_application->playlist()->nowPlayingModel()->loadMediaItem(applicationBanner, true); m_application->mainWindow()->setVideoSize(MainWindow::Normal); ui->videoFrame->setVisible(false); } void NowPlayingManager::toggleShuffle() { bool shuffleMode = m_application->playlist()->shuffleMode(); m_application->playlist()->setShuffleMode(!shuffleMode); } void NowPlayingManager::toggleRepeat() { bool repeatMode = m_application->playlist()->repeatMode(); m_application->playlist()->setRepeatMode(!repeatMode); } void NowPlayingManager::toggleQueue() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; Playlist::Model type = ui->playlistView->toggleModel(); if (type == Playlist::QueueModel) { ui->showQueue->setToolTip(i18n("Showing Upcoming
Click to show playlist")); ui->showQueue->setIcon(KIcon("bangarang-preview")); } else { ui->showQueue->setToolTip(i18n("Show Upcoming")); ui->showQueue->setIcon(Utilities::turnIconOff(KIcon("bangarang-preview"), QSize(22, 22))); } } void NowPlayingManager::updateSeekTime(qint64 time) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; //Update seek time int totalTimeMSecs = m_application->mediaObject()->totalTime(); QTime currentTime(time/(60*60000), (time / 60000) % 60, (time / 1000) % 60); QTime totalTime(totalTimeMSecs/(60*60000), (totalTimeMSecs / 60000) % 60, (totalTimeMSecs / 1000) % 60); QString displayTime; if (!m_showRemainingTime) { displayTime = Utilities::durationString(time/1000); } else { displayTime = Utilities::durationString(currentTime.secsTo(totalTime)); } ui->seekTime->setText(displayTime); //Update Now Playing Button text MediaItemModel * nowPlayingModel = m_application->playlist()->nowPlayingModel(); if (nowPlayingModel->rowCount() > 0) { if (nowPlayingModel->mediaItemAt(0).type != "Application Banner") { QString title = nowPlayingModel->mediaItemAt(0).title; QFontMetrics fm(ui->nowPlaying->font()); title = fm.elidedText(title, Qt::ElideRight, ui->nowPlaying->width() - 30 - 3*4); QString nowPlayingText = i18n("Now Playing") + QString(" (")+ displayTime + QString(")\n") + title; ui->nowPlaying->setText(nowPlayingText); } else { ui->nowPlaying->setText(i18n("Now Playing")); } } } void NowPlayingManager::mediaStateChanged(Phonon::State newstate, Phonon::State oldstate) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (newstate == Phonon::PlayingState) { m_application->statusNotifierItem()->setState(newstate); ui->mediaPlayPause->setIcon(KIcon("media-playback-pause")); bool nowPlayingItemIsVideo = false; if (m_application->playlist()->nowPlayingModel()->rowCount() > 0) { MediaItem nowPlayingItem = m_application->playlist()->nowPlayingModel()->mediaItemAt(0); nowPlayingItemIsVideo = (nowPlayingItem.type == "Video"); } if (nowPlayingItemIsVideo) { ui->videoFrame->setVisible(true); if (m_application->mainWindow()->videoSize() == MainWindow::Mini) { ui->nowPlayingView->showInfo(); } else { ui->videoFrame->setGeometry(QRect(QPoint(0, 0), ui->nowPlayingHolder->size())); } } else { ui->videoFrame->setVisible(false); } ui->mediaPlayPause->setToolTip(i18n("Playing
Click to pause
Click and hold to stop")); } else { if ((!m_pausePressed) && (!m_stopPressed)) { ui->mediaPlayPause->setIcon(KIcon("media-playback-start")); } } showLoading(); if (newstate == Phonon::ErrorState) { if (m_application->mediaObject()->errorString().isEmpty()) { showErrorMessage(i18n("An error has been encountered during playback")); } else { showErrorMessage(m_application->mediaObject()->errorString()); } //Use a new media object instead and discard //the old media object (whose state appears to be broken after errors) Phonon::MediaObject * mediaObject = m_application->newMediaObject(); ui->seekSlider->setMediaObject(mediaObject); connect(mediaObject, SIGNAL(tick(qint64)), this, SLOT(updateSeekTime(qint64))); connect(mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(mediaStateChanged(Phonon::State, Phonon::State))); if (m_application->playlist()->rowOfNowPlaying() < (m_application->playlist()->playlistModel()->rowCount() - 1)) { m_application->playlist()->playNext(); } else { m_application->playlist()->stop(); } } if (newstate == Phonon::PausedState) m_application->statusNotifierItem()->setState(newstate); else if (newstate == Phonon::StoppedState) m_application->statusNotifierItem()->setState(newstate); Q_UNUSED(oldstate); } void NowPlayingManager::showLoading() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if ((m_application->mediaObject()->state() == Phonon::LoadingState || m_application->mediaObject()->state() == Phonon::BufferingState || m_application->playlist()->state() == Playlist::Loading) && (m_application->playlist()->state() != Playlist::Finished)) { m_loadingProgress += 1; if ((m_loadingProgress > 7) || (m_loadingProgress < 0)) { m_loadingProgress = 0; } QString iconName= QString("bangarang-loading-%1").arg(m_loadingProgress); ui->seekTime->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->seekTime->setIcon(KIcon(iconName)); if (m_application->playlist()->state() == Playlist::Loading) { ui->seekTime->setToolTip(i18n("Loading playlist...")); } else if (m_application->mediaObject()->state() == Phonon::BufferingState) { ui->seekTime->setToolTip(i18n("Buffering...")); } else { ui->seekTime->setToolTip(i18n("Loading...")); } QTimer::singleShot(100, this, SLOT(showLoading())); } else { ui->seekTime->setIcon(KIcon("bookmarks-organize")); if (m_application->playlist()->nowPlayingModel()->rowCount() > 0) { if (m_application->bookmarksManager()->hasBookmarks(m_application->playlist()->nowPlayingModel()->mediaItemAt(0)) || m_application->playlist()->mediaController()->availableChapters() > 1 ){ ui->seekTime->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } else { ui->seekTime->setToolButtonStyle(Qt::ToolButtonTextOnly); } } else { ui->seekTime->setToolButtonStyle(Qt::ToolButtonTextOnly); } setShowRemainingTime(m_showRemainingTime); //Make sure tooltip is updated } } void NowPlayingManager::updateMuteStatus(bool muted) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (muted) { ui->volumeIcon->setIcon(KIcon("dialog-cancel")); ui->volumeIcon->setToolTip(i18n("Muted
Click to restore volume")); ui->volumeIcon->setChecked(true); } else { ui->volumeIcon->setIcon(KIcon("speaker")); ui->volumeIcon->setToolTip(i18n("Mute volume")); ui->volumeIcon->setChecked(false); m_application->audioOutput()->setVolume(m_application->volume()); } } void NowPlayingManager::playlistFinished() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; showApplicationBanner(); m_application->mainWindow()->setWindowTitle(i18n("Bangarang")); ui->nowPlaying->setIcon(KIcon("tool-animator")); ui->nowPlaying->setText(i18n("Now Playing")); ui->nowPlaying->setToolTip(i18n("View Now Playing")); ui->seekTime->setText("0:00"); } void NowPlayingManager::repeatModeChanged(bool repeat) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (repeat) { ui->repeat->setIcon(KIcon("bangarang-repeat")); ui->repeat->setToolTip(i18n("Repeat On
Click to turn off repeat")); } else { ui->repeat->setIcon(Utilities::turnIconOff(KIcon("bangarang-repeat"), QSize(22, 22))); ui->repeat->setToolTip(i18n("Turn on Repeat")); } } void NowPlayingManager::shuffleModeChanged(bool shuffle) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (shuffle) { ui->shuffle->setToolTip(i18n("Shuffle On
Click to turn off Shuffle")); ui->shuffle->setIcon(KIcon("bangarang-shuffle")); } else { ui->shuffle->setToolTip(i18n("Turn on Shuffle")); ui->shuffle->setIcon(Utilities::turnIconOff(KIcon("bangarang-shuffle"), QSize(22, 22))); } } void NowPlayingManager::nowPlayingChanged() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; MediaItemModel * nowPlayingModel = m_application->playlist()->nowPlayingModel(); if (nowPlayingModel->rowCount() == 0) { m_application->statusNotifierItem()->setState(Phonon::StoppedState); return; } MediaItem nowPlayingItem = nowPlayingModel->mediaItemAt(0); //Tidy up view and switch to the correct viewing widget ui->nowPlayingView->tidyHeader(); //Update Now Playing button in Media Lists view if (nowPlayingItem.type != "Application Banner") { ui->nowPlaying->setIcon(nowPlayingItem.artwork); QString title = nowPlayingItem.title; QString subTitle = nowPlayingItem.subTitle; QString description = nowPlayingItem.fields["description"].toString(); QString toolTipText = i18n("View Now Playing") + QString("
%1").arg(title); if (!subTitle.isEmpty()) { toolTipText += QString("
%2").arg(subTitle); } if (!description.isEmpty()) { toolTipText += QString("
%3").arg(description); } ui->nowPlaying->setToolTip(toolTipText); m_application->mainWindow()->setWindowTitle(QString(nowPlayingItem.title + " - Bangarang")); } //Update seekTime button if (m_application->bookmarksManager()->hasBookmarks(nowPlayingItem)) { ui->seekTime->setIcon(KIcon("bookmarks-organize")); ui->seekTime->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } else { ui->seekTime->setToolButtonStyle(Qt::ToolButtonTextOnly); } //Update status notifier //- Scale artwork to current desktop icon size otherwise notifier will show unknown icon int iconSize = KIconLoader::global()->currentSize(KIconLoader::Desktop); QPixmap artworkPix = nowPlayingItem.artwork.pixmap(iconSize, iconSize); m_application->statusNotifierItem()->setToolTip(QIcon(artworkPix), nowPlayingItem.title, nowPlayingItem.subTitle); } void NowPlayingManager::playlistLoading() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (ui->playlistFilter->isVisible()) { ui->playlistFilterProxyLine->lineEdit()->clear(); } showLoading(); } void NowPlayingManager::closePlaylistNotification() { selectPlaylistNotificationNo(); } void NowPlayingManager::selectPlaylistNotificationNo() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; emit playlistNotificationResult(true); ui->playlistNotification->setVisible(false); } void NowPlayingManager::selectPlaylistNotificationYes() { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; emit playlistNotificationResult(false); ui->playlistNotification->setVisible(false); } void NowPlayingManager::skipForward(int i) { if (m_application->mediaObject()->isSeekable()) { m_application->mediaObject()->seek(m_application->mediaObject()->currentTime() + qint64(i)*100); } } void NowPlayingManager::skipBackward(int i) { if (m_application->mediaObject()->isSeekable()) { m_application->mediaObject()->seek(m_application->mediaObject()->currentTime() + qint64(i)*100); } } void NowPlayingManager::clearPlaylist() { if (m_application->mainWindow()->currentMainWidget() != MainWindow::MainNowPlaying) { return; } Ui::MainWindowClass* ui = m_application->mainWindow()->ui; ui->clearPlaylist->setIcon(KIcon("bangarang-clearplaylist")); KGuiItem clearPlaylist; clearPlaylist.setText(i18n("Clear Playlist")); if (KMessageBox::warningContinueCancel(m_application->mainWindow(), i18n("Are you sure you want to clear the current playlist?"), QString(), clearPlaylist) == KMessageBox::Continue) { m_application->playlist()->clearPlaylist(); showApplicationBanner(); m_application->mainWindow()->setWindowTitle(i18n("Bangarang")); ui->nowPlaying->setIcon(KIcon("tool-animator")); ui->nowPlaying->setText(i18n("Now Playing")); } ui->clearPlaylist->setIcon(Utilities::turnIconOff(KIcon("bangarang-clearplaylist"), QSize(22, 22))); } void NowPlayingManager::closePlaylistFilter() { m_application->actionsManager()->action("toggle_filter")->trigger(); } void NowPlayingManager::showMenu() { m_application->mainWindow()->stopMenuTimer(); KMenu * menu = m_application->actionsManager()->nowPlayingMenu(); QPoint menuLocation; Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (ui->contextStackHolder->isVisible()) { menuLocation = ui->showMenu->mapToGlobal(QPoint(0,ui->showMenu->height())); } else { menuLocation = ui->showMenu_2->mapToGlobal(QPoint(0,ui->showMenu->height())); } menu->popup(menuLocation); } void NowPlayingManager::togglePlaylist() { if (m_application->mainWindow()->currentMainWidget() != MainWindow::MainNowPlaying) { return; } Ui::MainWindowClass* ui = m_application->mainWindow()->ui; if (ui->contextStackHolder->isVisible() && ui->contextStack->currentIndex() == 0) { ui->contextStackHolder->setVisible(false); } else { ui->contextStack->setCurrentIndex(0); ui->contextStackHolder->setVisible(true); QFrame *filter = m_application->mainWindow()->currentFilterFrame(); KFilterProxySearchLine *line = m_application->mainWindow()->currentFilterProxyLine(); if (filter->isVisible() && line->lineEdit()->text().isEmpty()) { m_application->actionsManager()->action("toggle_filter")->trigger(); } } m_application->actionsManager()->action("show_video_settings")->setText(i18n("Show video settings")); m_application->actionsManager()->action("show_audio_settings")->setText(i18n("Show audio settings")); } void NowPlayingManager::showErrorMessage(QString error) { Ui::MainWindowClass* ui = m_application->mainWindow()->ui; ui->playbackMessage->setText(error); QFontMetrics fm(ui->playbackMessage->font()); QSize textSize = fm.boundingRect(QRect(0, 0, ui->extSubtitle->maximumWidth(), fm.lineSpacing()), Qt::AlignCenter | Qt::TextWordWrap, ui->playbackMessage->text()).size(); int top = ui->nowPlayingHolder->geometry().bottom() - 50 - textSize.height(); int left = (ui->nowPlayingHolder->width() - textSize.width()) / 2; ui->playbackMessage->setGeometry(left - 8, top - 8, textSize.width() + 8, textSize.height() + 8); ui->playbackMessage->setVisible(true); ui->playbackMessage->raise(); QTimer::singleShot(6000, ui->playbackMessage, SLOT(hide())); } bangarang-bangarang/src/app/nowplaying/nowplayingmanager.h000066400000000000000000000051261166760560600243660ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2011 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef NOWPLAYINGMANAGER_H #define NOWPLAYINGMANAGER_H #include #include #include namespace Ui { class MainWindowClass; } class MainWindow; class MediaItem; class MediaItemModel; class BangarangApplication; class NowPlayingManager : public QObject { Q_OBJECT public: explicit NowPlayingManager(MainWindow* parent); void connectPhononWidgets(); void disconnectPhononWidgets(); void setShowRemainingTime(bool show); bool showingRemainingTime(); bool newPlaylistNotification(QString text, QObject* receiver = NULL, const char* slot = NULL); signals: void playlistNotificationResult(bool confirmed); public slots: void showApplicationBanner(); void showMenu(); void showErrorMessage(QString error); void togglePlaylist(); void clearPlaylist(); void toggleShuffle(); void toggleRepeat(); void toggleQueue(); private: BangarangApplication* m_application; bool m_playWhenPlaylistChanges; bool m_showRemainingTime; bool m_pausePressed; bool m_stopPressed; int m_loadingProgress; private slots: void mediaPlayPausePressed(); void mediaPlayPauseHeld(); void mediaPlayPauseReleased(); void playPlaylistItem(const QModelIndex & index); void updateSeekTime(qint64 time); void mediaStateChanged(Phonon::State newstate, Phonon::State oldstate); void showLoading(); void updateMuteStatus(bool muted); void playlistFinished(); void shuffleModeChanged(bool repeat); void repeatModeChanged(bool shuffle); void skipForward(int i); void skipBackward(int i); void nowPlayingChanged(); void playlistLoading(); void closePlaylistNotification(); void selectPlaylistNotificationNo(); void selectPlaylistNotificationYes(); void closePlaylistFilter(); }; #endif // NOWPLAYINGMANAGER_H bangarang-bangarang/src/app/nowplaying/nowplayingview.cpp000066400000000000000000000047601166760560600242640ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Stefan Burnicki (stefan.burnicki@gmx.de) * * * 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 . */ #include "nowplayingview.h" #include "../common/bangarangapplication.h" #include "../common/mainwindow.h" #include "../common/actionsmanager.h" #include "nowplayingdelegate.h" #include #include #include "../../platform/playlist.h" #include "../../platform/mediaitemmodel.h" NowPlayingView::NowPlayingView(QWidget* parent): QTreeView(parent) { m_application = (BangarangApplication *)KApplication::kApplication(); m_nowPlayingModel = m_application->playlist()->nowPlayingModel(); setModel( m_nowPlayingModel ); header()->setVisible(false); m_nowPlayingDelegate = NULL; connect(m_nowPlayingModel, SIGNAL(mediaListChanged()), this, SLOT(tidyHeader())); } NowPlayingView::~NowPlayingView() { } void NowPlayingView::setMainWindow(MainWindow * mainWindow) { m_nowPlayingDelegate = new NowPlayingDelegate(mainWindow); setItemDelegate(m_nowPlayingDelegate); m_nowPlayingDelegate->setView(this); } void NowPlayingView::contextMenuEvent(QContextMenuEvent * event) { QMenu * menu = m_application->actionsManager()->nowPlayingContextMenu(); menu->exec(event->globalPos()); } void NowPlayingView::resizeEvent(QResizeEvent *event) { if (m_nowPlayingDelegate) { m_nowPlayingDelegate->updateSizeHint(); } QTreeView::resizeEvent(event); } void NowPlayingView::tidyHeader() { header()->setStretchLastSection(false); header()->setResizeMode(0, QHeaderView::Stretch); } void NowPlayingView::showInfo() { if (m_nowPlayingDelegate) { m_nowPlayingDelegate->setShowInfo(true); } } void NowPlayingView::hideInfo() { if (m_nowPlayingDelegate) { m_nowPlayingDelegate->setShowInfo(false); } } void NowPlayingView::enableTouch() { m_nowPlayingDelegate->enableTouch(); } bangarang-bangarang/src/app/nowplaying/nowplayingview.h000066400000000000000000000033521166760560600237250ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Stefan Burnicki (stefan.burnicki@gmx.de) * * * 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 . */ #ifndef NOWPLAYINGVIEW_H #define NOWPLAYINGVIEW_H #include #include #include #include "../../platform/mediaitemmodel.h" class MainWindow; class MediaItem; class NowPlayingDelegate; class BangarangApplication; class MediaItemModel; /* * This class is mostly to provide custom context menus for the NowPlaying TreeView */ class NowPlayingView : public QTreeView { Q_OBJECT public: NowPlayingView(QWidget * parent = 0); ~NowPlayingView(); void setMainWindow(MainWindow * mainWindow); void enableTouch(); public Q_SLOTS: void tidyHeader(); void showInfo(); void hideInfo(); protected: void contextMenuEvent (QContextMenuEvent * event); void resizeEvent(QResizeEvent *event); private: MediaItemModel *m_nowPlayingModel; BangarangApplication * m_application; NowPlayingDelegate *m_nowPlayingDelegate; }; #endif // NOWPLAYINGVIEW_H bangarang-bangarang/src/app/nowplaying/playlistview.cpp000066400000000000000000000112611166760560600237300ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Stefan Burnicki (stefan.burnicki@gmx.de) * * * 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 . */ #include "playlistview.h" #include "../common/mediaitemdelegate.h" #include "../common/actionsmanager.h" #include "../common/bangarangapplication.h" #include "../common/flickcharm.h" #include "../../platform/utilities/utilities.h" #include "ui_mainwindow.h" #include PlaylistView::PlaylistView(QWidget* parent): QListView(parent) { m_application = (BangarangApplication *)KApplication::kApplication(); m_playlist = m_application->playlist(); m_playlistModel = m_playlist->playlistModel(); setModel(m_playlist->filterProxyModel()); setSourceModel(m_playlistModel); setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); connect(m_playlistModel, SIGNAL(mediaListChanged()), this, SLOT(playlistChanged())); connect(m_playlistModel, SIGNAL(mediaListPropertiesChanged()), this, SLOT(playlistChanged())); m_playlistItemDelegate = NULL; m_playlistName = NULL; m_playlistDuration = NULL; m_currentModel = Playlist::PlaylistModel; } void PlaylistView::setMainWindow(MainWindow* mainWindow) { m_playlistItemDelegate = new MediaItemDelegate(mainWindow); m_playlistItemDelegate->setUseProxy(true); setItemDelegate(m_playlistItemDelegate); m_playlistItemDelegate->setView(this); m_playlistItemDelegate->setSuppressSemanticComment(true); m_playlistName = mainWindow->ui->playlistName; m_playlistDuration = mainWindow->ui->playlistDuration; } void PlaylistView::setupActions() { addAction(m_application->actionsManager()->action("remove_playlistselection_from_playlist")); } void PlaylistView::contextMenuEvent(QContextMenuEvent* event) { if (selectionModel()->selectedIndexes().count() != 0) { QMenu * menu = m_application->actionsManager()->playlistViewMenu(); menu->exec(event->globalPos()); } } void PlaylistView::dropEvent(QDropEvent *e) { QListView::dropEvent(e); setDragDropMode(QAbstractItemView::DragDrop); } void PlaylistView::dragMoveEvent(QDragMoveEvent *e) { if (e->source() == this) { setDragDropMode(QAbstractItemView::InternalMove); } else { setDragDropMode(QAbstractItemView::DragDrop); } QListView::dragMoveEvent(e); } void PlaylistView::setSourceModel(MediaItemModel* model) { m_playlist->filterProxyModel()->setSourceModel((QAbstractItemModel *) model); } MediaItemModel *PlaylistView::sourceModel() { return (MediaItemModel *)m_playlist->filterProxyModel()->sourceModel(); } void PlaylistView::playlistChanged() { if (m_currentModel == Playlist::PlaylistModel) { m_playlistName->setText(i18n("Playlist")); if (m_playlist->playlistModel()->rowCount() > 0) { QString duration = Utilities::mediaListDurationText(m_playlist->playlistModel()->mediaList()); if (!duration.isEmpty()) { m_playlistDuration->setText(i18np("1 item, %2", "%1 items, %2", m_playlist->playlistModel()->rowCount(), duration)); } else { m_playlistDuration->setText(i18np("1 item", "%1 items", m_playlist->playlistModel()->rowCount())); } } else { m_playlistDuration->setText(QString()); } } else { m_playlistName->setText(i18n("Playlist (Upcoming)")); } } Playlist::Model PlaylistView::toggleModel() { if ( m_currentModel == Playlist::PlaylistModel ) { m_currentModel = Playlist::QueueModel; } else { m_currentModel = Playlist::PlaylistModel; } if (m_currentModel == Playlist::QueueModel) { setSourceModel(m_playlist->queueModel()); setDragDropMode(QAbstractItemView::InternalMove); } else { setSourceModel(m_playlist->playlistModel()); setDragDropMode(QAbstractItemView::DragDrop); } playlistChanged(); return m_currentModel; } void PlaylistView::enableTouch() { FlickCharm *charm = new FlickCharm(this); charm->activateOn(this); this->setDragEnabled(false); m_playlistItemDelegate->enableTouch(); } bangarang-bangarang/src/app/nowplaying/playlistview.h000066400000000000000000000036021166760560600233750ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Stefan Burnicki (stefan.burnicki@gmx.de) * * * 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 . */ #ifndef PLAYLISTVIEW_H #define PLAYLISTVIEW_H #include #include #include "../../platform/playlist.h" #include "../common/mainwindow.h" class MediaItemDelegate; class PlaylistView : public QListView { Q_OBJECT public: PlaylistView(QWidget * parent = 0); void setMainWindow(MainWindow *mainWindow); void setSourceModel(MediaItemModel* model); MediaItemModel *sourceModel(); Playlist::Model toggleModel(); Playlist::Model currentModelType() { return m_currentModel; } void setupActions(); void enableTouch(); protected: void contextMenuEvent (QContextMenuEvent * event); void dragMoveEvent(QDragMoveEvent *e); void dropEvent(QDropEvent *e); private: Playlist *m_playlist; BangarangApplication *m_application; MediaItemModel * m_playlistModel; MediaItemDelegate * m_playlistItemDelegate; QLabel* m_playlistName; QLabel* m_playlistDuration; Playlist::Model m_currentModel; private slots: void playlistChanged(); }; #endif // PLAYLISTVIEW_H bangarang-bangarang/src/app/nowplaying/videosettings.cpp000066400000000000000000000447731166760560600241010ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "videosettings.h" #include "../common/mainwindow.h" #include "ui_mainwindow.h" #include "../common/bangarangapplication.h" #include "../common/actionsmanager.h" #include #include #include #include using namespace Phonon; VideoSettings::VideoSettings(MainWindow *parent, VideoWidget *widget) : QObject( parent ) { //member vars m_application = (BangarangApplication *) KApplication::kApplication(); m_mediaController = NULL; ui = parent->ui; m_videoWidget = widget; ui->angleSelectionHolder->setEnabled(false); ui->subtitleSelectionHolder->setEnabled(false); //Setup encoding combo box QStringList list; foreach (QString codec, QTextCodec::availableCodecs()) list.append(codec); list.sort(); ui->subtitleEncodingSelection->addItems(list); ui->subtitleInfoText->hide(); ui->subtitleEncodingSelection->hide(); //setup connections setupConnections(); } void VideoSettings::setupConnections() { connect(ui->angleSelection, SIGNAL(currentIndexChanged(int)),this,SLOT(setAngle(int))); connect(ui->subtitleSelection, SIGNAL(currentIndexChanged(int)),this,SLOT(setSubtitle(int))); connect(ui->brightnessSlider,SIGNAL(valueChanged(int)),this,SLOT(setBrightness(int))); connect(ui->contrastSlider,SIGNAL(valueChanged(int)),this,SLOT(setContrast(int))); connect(ui->hueSlider,SIGNAL(valueChanged(int)),this,SLOT(setHue(int))); connect(ui->saturationSlider,SIGNAL(valueChanged(int)),this,SLOT(setSaturation(int))); connect(ui->aspectRatioAuto,SIGNAL(toggled(bool)), this,SLOT(setAspectRatioAuto(bool))); connect(ui->aspectRatioWidget,SIGNAL(toggled(bool)), this,SLOT(setAspectRatioWidget(bool))); connect(ui->aspectRatio4_3,SIGNAL(toggled(bool)), this,SLOT(setAspectRatio4_3(bool))); connect(ui->aspectRatio16_9,SIGNAL(toggled(bool)), this,SLOT(setAspectRatio16_9(bool))); connect(ui->scaleModeFitInView,SIGNAL(toggled(bool)), this,SLOT(setScaleModeFitInView(bool))); connect(ui->scaleModeScaleAndCrop,SIGNAL(toggled(bool)), this,SLOT(setScaleModeScaleAndCrop(bool))); connect(ui->restoreDefaultVideoSettings, SIGNAL(clicked()), this, SLOT(restoreDefaults())); connect(ui->hideVideoSettings, SIGNAL(clicked()), m_application->actionsManager()->action("show_video_settings"), SLOT(trigger())); connect(ui->subtitleEncodingSelection, SIGNAL(currentIndexChanged(QString)), this, SLOT(subtitleEncodingChanged(QString))); connect(m_application->playlist()->nowPlayingModel(), SIGNAL(mediaListChanged()), this, SLOT(updateSubtitles())); } VideoSettings::~VideoSettings() { } void VideoSettings::setMediaController(MediaController* mctrl) { m_mediaController = mctrl; updateAngles(m_mediaController->availableAngles()); updateSubtitles(); connect(m_mediaController, SIGNAL(angleChanged(int)), this, SLOT(updateAngleCombo(int))); connect(m_mediaController, SIGNAL(availableAnglesChanged(int)), this, SLOT(updateAngles(int))); connect(m_mediaController, SIGNAL(availableSubtitlesChanged()), this, SLOT(updateSubtitles())); connectAngleCombo(); connectSubtitleCombo(); } void VideoSettings::setBrightness(int ch) { m_videoWidget->setBrightness(qreal(ch)/100); } void VideoSettings::setContrast(int ch) { m_videoWidget->setContrast(qreal(ch)/100); } void VideoSettings::setHue(int ch) { m_videoWidget->setHue(qreal(ch)/100); } void VideoSettings::setSaturation(int ch) { m_videoWidget->setSaturation(qreal(ch)/100); } void VideoSettings::setAspectRatioAuto(bool checked) { Q_UNUSED(checked); m_videoWidget->setAspectRatio(VideoWidget::AspectRatioAuto); ui->scalingModeHolder->setEnabled(true); } void VideoSettings::setAspectRatio4_3(bool checked) { Q_UNUSED(checked); m_videoWidget->setAspectRatio(VideoWidget::AspectRatio4_3); ui->scalingModeHolder->setEnabled(true); } void VideoSettings::setAspectRatio16_9(bool checked) { Q_UNUSED(checked); m_videoWidget->setAspectRatio(VideoWidget::AspectRatio16_9); ui->scalingModeHolder->setEnabled(true); } void VideoSettings::setAspectRatioWidget(bool checked) { Q_UNUSED(checked); m_videoWidget->setAspectRatio(VideoWidget::AspectRatioWidget); ui->scalingModeHolder->setEnabled(false); } void VideoSettings::setScaleModeFitInView(bool checked) { Q_UNUSED(checked); m_videoWidget->setScaleMode(VideoWidget::FitInView); } void VideoSettings::setScaleModeScaleAndCrop(bool checked) { Q_UNUSED(checked); m_videoWidget->setScaleMode(VideoWidget::ScaleAndCrop); } void VideoSettings::restoreDefaults() { m_videoWidget->setBrightness(0); m_videoWidget->setContrast(0); m_videoWidget->setHue(0); m_videoWidget->setSaturation(0); m_videoWidget->setAspectRatio(VideoWidget::AspectRatioAuto); m_videoWidget->setScaleMode(VideoWidget::FitInView); ui->brightnessSlider->setValue(0); ui->contrastSlider->setValue(0); ui->hueSlider->setValue(0); ui->saturationSlider->setValue(0); ui->aspectRatioAuto->setChecked(true); ui->scaleModeFitInView->setChecked(true); } void VideoSettings::setAngle(int idx) { if ( idx < 0 || idx > m_mediaController->availableAngles() ) return; m_mediaController->setCurrentAngle(idx); } void VideoSettings::setSubtitle(int idx) { ui->subtitleInfoText->hide(); ui->subtitleEncodingSelection->hide(); if ( idx < 0 ) return; int sidx = ui->subtitleSelection->itemData(idx).toInt(); if (sidx >= -1) { SubtitleDescription sub = SubtitleDescription::fromIndex(sidx); m_mediaController->setCurrentSubtitle(sub); if (sidx == -1) { readExternalSubtitles(KUrl()); } } else { //Read external subtitles KUrl subtitleUrl(m_extSubtitleFiles.at(-sidx - 100)); readExternalSubtitles(subtitleUrl); } } void VideoSettings::updateAngles(int no) { disconnectAngleCombo(); QComboBox *cb = ui->angleSelection; ui->angleSelectionHolder->setEnabled( no > 1 ); //1 is always set, thats no selection cb->clear(); for (int i = 1; i <= no; i++ ) { cb->addItem(QString("%1").arg(i)); } updateAngleCombo(m_mediaController->currentAngle(), true); //will reconnect angle combo } void VideoSettings::updateAngleCombo(int selected, bool afterUpdate) { disconnectAngleCombo(); if ( selected < 0 ) selected = m_mediaController->currentAngle(); if ( ui->angleSelection->count() < selected ) { if ( !afterUpdate ) { //try to update the angles if not just done updateAngles(m_mediaController->availableAngles()); } else connectAngleCombo(); return; } ui->angleSelection->setCurrentIndex(selected); connectAngleCombo(); } void VideoSettings::updateSubtitles() { disconnectSubtitleCombo(); QComboBox *cb = ui->subtitleSelection; QList subs = m_mediaController->availableSubtitles(); int no = subs.count(); ui->subtitleSelectionHolder->setEnabled( no > 0 ); //can have no subtitles at all cb->clear(); for (int i = 0; i < no; i++ ) { //no subtitles + disable subtitle if ( i == 0 ) { cb->addItem(i18n("Disable"), QVariant( -1 )); continue; } SubtitleDescription sub = subs.at((i - 1)); //-1 because of the first (disable) item QString descr = sub.description().trimmed(); QString more = descr.isEmpty() ? QString() : QString(" (%1)").arg(descr); QString name = sub.name().trimmed(); QString trans_name = m_application->locale()->languageCodeToName( name ); QString display_name = trans_name.isEmpty() ? name : trans_name; cb->addItem( display_name + more, QVariant( sub.index() )); } if (m_application->playlist()->nowPlayingModel()->rowCount() > 0) { MediaItem nowPlayingItem = m_application->playlist()->nowPlayingModel()->mediaItemAt(0); if (nowPlayingItem.type == "Video") { //Search for Subtitles m_extSubtitleFiles = findSubtitleFiles(KUrl(nowPlayingItem.url)); if (!m_extSubtitleFiles.isEmpty()) { if (cb->model()->rowCount() == 0) { cb->insertItem(0, i18n("Disable"), QVariant(-1)); } for (int i = 0; i < m_extSubtitleFiles.count(); i++) { KUrl fileUrl(m_extSubtitleFiles.at(i)); cb->addItem(fileUrl.fileName(), QVariant(-100 - i)); cb->model()->setData(cb->model()->index(cb->model()->rowCount()-1, 0), fileUrl.path(), Qt::ToolTipRole); } ui->subtitleSelectionHolder->setEnabled(true); } } else { ui->extSubtitle->hide(); } } updateSubtitleCombo(); //will reconnect subtitle combo } void VideoSettings::updateSubtitleCombo() { disconnectSubtitleCombo(); int curIdx = m_mediaController->currentSubtitle().index(); QComboBox *cb = ui->subtitleSelection; for (int i = 0; i < cb->count(); i++) { if (cb->itemData(i).toInt() == curIdx) { cb->setCurrentIndex(i); break; } } connectSubtitleCombo(); } void VideoSettings::restoreVideoSettings(KConfigGroup* config) { ui->brightnessSlider->setValue(config->readEntry("VideoBrightness", 0)); ui->contrastSlider->setValue(config->readEntry("VideoContrast", 0)); ui->hueSlider->setValue(config->readEntry("VideoHue", 0)); ui->saturationSlider->setValue(config->readEntry("VideoSaturation", 0)); VideoWidget::AspectRatio ratio = (VideoWidget::AspectRatio) config->readEntry("VideoAspectRatio", (int) VideoWidget::AspectRatioAuto); VideoWidget::ScaleMode scaleMode = (VideoWidget::ScaleMode) config->readEntry("VideoScaleMode", (int) VideoWidget::FitInView); ui->aspectRatioAuto->setChecked(ratio == VideoWidget::AspectRatioAuto); ui->aspectRatioWidget->setChecked(ratio == VideoWidget::AspectRatioWidget); ui->aspectRatio4_3->setChecked(ratio == VideoWidget::AspectRatio4_3); ui->aspectRatio16_9->setChecked(ratio == VideoWidget::AspectRatio16_9); ui->scaleModeFitInView->setChecked(scaleMode == VideoWidget::FitInView); ui->scaleModeScaleAndCrop->setChecked(scaleMode == VideoWidget::ScaleAndCrop); ui->scalingModeHolder->setEnabled(ratio != VideoWidget::AspectRatioWidget); } void VideoSettings::saveVideoSettings(KConfigGroup* config) { config->writeEntry("VideoBrightness", (int) (m_videoWidget->brightness() * 100 )); config->writeEntry("VideoContrast", (int) (m_videoWidget->contrast() * 100 )); config->writeEntry("VideoHue", (int) (m_videoWidget->hue() * 100 )); config->writeEntry("VideoSaturation", (int) (m_videoWidget->saturation() * 100 )); config->writeEntry("VideoAspectRatio", (int) m_videoWidget->aspectRatio() ); config->writeEntry("VideoScaleMode", (int) m_videoWidget->scaleMode() ); } void VideoSettings::connectAngleCombo() { connect(ui->angleSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(setAngle(int))); } void VideoSettings::disconnectAngleCombo() { disconnect(ui->angleSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(setAngle(int))); } void VideoSettings::connectSubtitleCombo() { connect(ui->subtitleSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(setSubtitle(int))); } void VideoSettings::disconnectSubtitleCombo() { disconnect(ui->subtitleSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(setSubtitle(int))); } QStringList VideoSettings::findSubtitleFiles(const KUrl &url) { if (!url.isLocalFile()) { return QStringList(); } QDir dir(url.directory(KUrl::AppendTrailingSlash)); QFileInfoList files = dir.entryInfoList(QStringList("*.srt"), QDir::Files); QFileInfoList dirs = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); for (int i = 0; i < dirs.count(); i++) { QDir subDir(dirs.at(i).absoluteFilePath()); QFileInfoList subDirFiles = subDir.entryInfoList(QStringList("*.srt"), QDir::Files); files.append(subDirFiles); } QStringList subtitleFiles; for (int i = 0; i < files.count(); i++) { subtitleFiles.append(files.at(i).absoluteFilePath()); } return subtitleFiles; } void VideoSettings::readExternalSubtitles(const KUrl &subtitleUrl) { QString encodingName = QString(); bool emitted = false; kDebug() << "Checking external subtitles..."; m_extSubtitleUrl = subtitleUrl; if (subtitleUrl.isLocalFile()) { QFile file(subtitleUrl.path()); if (file.open(QFile::ReadOnly)) { KEncodingProber prober(KEncodingProber::Universal); if (prober.feed(file.readAll()) == KEncodingProber::FoundIt) { encodingName = prober.encoding().toLower(); } else { kDebug() << "Unknown encoding, choosing default..."; ui->subtitleInfoText->show(); ui->subtitleEncodingSelection->show(); QString defaultCodec = QTextCodec::codecForLocale()->name(); int idx = ui->subtitleEncodingSelection->findText(defaultCodec); if ( idx != ui->subtitleEncodingSelection->currentIndex() ) { ui->subtitleEncodingSelection->setCurrentIndex(idx); emitted = true; } } } } if ( !emitted ) { subtitleEncodingChanged(encodingName); } } void VideoSettings::subtitleEncodingChanged(const QString& encoding) { m_extSubtitleTimes.clear(); m_extSubtitles.clear(); if (m_extSubtitleUrl.isLocalFile()) { QFile file(m_extSubtitleUrl.path()); if (file.open(QFile::ReadOnly)) { file.seek(0); QTextStream in(&file); in.setCodec(QTextCodec::codecForName(encoding.toAscii())); bool lastLineWasTime = false; kDebug() << "Loading subtitles..."; while (!in.atEnd()) { QString line = in.readLine().trimmed(); if (line.contains("-->")) { QStringList times = line.split("-->"); if (times.count() != 2) { break; } QTime startTime = QTime::fromString(times.at(0).trimmed(), "hh:mm:ss,zzz"); QTime endTime = QTime::fromString(times.at(1).trimmed(), "hh:mm:ss,zzz"); if (!startTime.isValid() || !endTime.isValid()) { break; } int start = QTime(0,0,0,0).msecsTo(startTime); int end = QTime(0,0,0,0).msecsTo(endTime); m_extSubtitleTimes.append(QString("%1,%2").arg(start).arg(end)); lastLineWasTime = true; } else if (lastLineWasTime) { QString subtitle = line; while (!in.atEnd() && !line.isEmpty()) { line = in.readLine().trimmed(); if (subtitle.contains("") || line.contains("") || line.contains("")) { subtitle.append(QString("
%1").arg(line)); } else { subtitle.append(QString("\n%1").arg(line)); } } m_extSubtitles.append(subtitle.trimmed()); lastLineWasTime = false; } } kDebug() << "Finished loading subtitles...."; } } if (!m_extSubtitleTimes.isEmpty()) { connect(m_application->playlist()->mediaObject(), SIGNAL(tick(qint64)), this, SLOT(showExternalSubtitles(qint64))); m_application->playlist()->mediaObject()->setTickInterval(100); } else { disconnect(m_application->playlist()->mediaObject(), SIGNAL(tick(qint64)), this, SLOT(showExternalSubtitles(qint64))); ui->extSubtitle->hide(); m_application->playlist()->mediaObject()->setTickInterval(500); } } void VideoSettings::showExternalSubtitles(qint64 time) { QString subtitle; //Find subtitle index corresponding to time for (int i = 0; i < m_extSubtitleTimes.count(); i++) { QStringList times = m_extSubtitleTimes.at(i).split(","); int startTime = times.at(0).trimmed().toInt(); int endTime = times.at(1).trimmed().toInt(); if (time >= startTime && time <= endTime) { subtitle = m_extSubtitles.at(i); } if (startTime > time) { break; } } //Update external subtitle display if (!subtitle.isEmpty()) { QFontMetrics fm(ui->extSubtitle->font()); QString textForSize = subtitle; if (textForSize.contains("")) { textForSize.remove(""); textForSize.remove(""); textForSize.replace("
", "\n"); QFont font = ui->extSubtitle->font(); font.setItalic(true); fm = QFontMetrics(font); } QSize textSize = fm.boundingRect(QRect(0, 0, ui->extSubtitle->maximumWidth(), fm.lineSpacing()), Qt::AlignCenter | Qt::TextWordWrap, textForSize).size(); int top = ui->nowPlayingHolder->geometry().bottom() - 20 - textSize.height(); int left = (ui->nowPlayingHolder->width() - textSize.width()) / 2; ui->extSubtitle->setGeometry(left - 8, top - 8, textSize.width() + 8, textSize.height() + 8); ui->extSubtitle->setText(subtitle); ui->extSubtitle->show(); ui->extSubtitle->raise(); } else { ui->extSubtitle->hide(); } } void VideoSettings::enableTouch() { int tTouchable = BangarangApplication::TOUCH_TOUCHABLE_METRIC; ui->subtitleSelection->setMinimumHeight(tTouchable); ui->angleSelection->setMinimumHeight(tTouchable); ui->subtitleEncodingSelection->setMinimumHeight(tTouchable); ui->restoreDefaultVideoSettings->setMinimumHeight(tTouchable); ui->hideVideoSettings->setMinimumHeight(tTouchable); } #include "moc_videosettings.cpp" bangarang-bangarang/src/app/nowplaying/videosettings.h000066400000000000000000000062701166760560600235340ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andreas Marschke (xxtjaxx@gmail.com) * * * 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 . */ #ifndef VIDEOSETTINGS_H #define VIDEOSETTINGS_H #include #include #include #include #include #include #include #include class MainWindow; class BangarangApplication; namespace Ui { class MainWindowClass; } /** * This class provides Settings for the VideoWidget * such as it AspectRatio and Colorization * @short Video Settings * @author Andreas Marschke xxtjaxx@gmail.com * @version 0.1 **/ using namespace Phonon; class VideoSettings : public QObject { Q_OBJECT public: /** * Default constructor **/ VideoSettings(MainWindow* parent, VideoWidget* widget); /** * Destructor */ virtual ~VideoSettings(); void setMediaController( MediaController *mctrl ); MediaController *mediaController() { return m_mediaController; } void restoreVideoSettings(KConfigGroup* config); void saveVideoSettings(KConfigGroup* config); void enableTouch(); public slots: //it should also be possible to use them as normal functions void setBrightness(int ch); void setContrast(int ch); void setHue(int ch); void setSaturation(int ch); void setAspectRatioAuto(bool checked); void setAspectRatioWidget(bool checked); void setAspectRatio4_3(bool checked); void setAspectRatio16_9(bool checked); void setSubtitle(int idx); void setAngle(int idx); void setScaleModeFitInView(bool checked); void setScaleModeScaleAndCrop(bool checked); void restoreDefaults(); void updateSubtitleCombo(); void updateAngleCombo(int selected = -1, bool afterUpdate = false); void readExternalSubtitles(const KUrl &subtitleUrl); private: void connectAngleCombo(); void disconnectAngleCombo(); void connectSubtitleCombo(); void disconnectSubtitleCombo(); Ui::MainWindowClass *ui; BangarangApplication * m_application; MediaController * m_mediaController; VideoWidget *m_videoWidget; KUrl m_extSubtitleUrl; QStringList m_extSubtitleTimes; QStringList m_extSubtitles; QStringList m_extSubtitleFiles; void setupConnections(); QStringList findSubtitleFiles(const KUrl &url); private slots: void updateAngles(int no); void updateSubtitles(); void showExternalSubtitles(qint64 time); void subtitleEncodingChanged(const QString &encoding); }; #endif // VIDEOSETTINGS_H bangarang-bangarang/src/app/ui/000077500000000000000000000000001166760560600167155ustar00rootroot00000000000000bangarang-bangarang/src/app/ui/audiolistsstack.ui000066400000000000000000001103431166760560600224640ustar00rootroot00000000000000 AudioListsStack 0 0 400 341 Form 0 0 0 0 0 Qt::StrongFocus QAbstractItemView::SelectRows 0 0 18 QFrame::NoFrame QFrame::Raised 0 0 Qt::NoFocus Add list ../../convenience/list-add.png../../convenience/list-add.png true Qt::NoFocus Remove list ../../convenience/list-remove.png../../convenience/list-remove.png true Qt::Horizontal 40 20 Qt::NoFocus Settings ../../convenience/configure.png../../convenience/configure.png true 0 0 4 Qt::Vertical 20 10 Add List Qt::AlignCenter Qt::Horizontal Source 0 0 0 Current View Current Selection Current Playlist ownCloud/Ampache New List Name true Server User Name Password true 0 0 0 28 Save ../../convenience/document-save.png../../convenience/document-save.png Qt::Vertical 20 10 0 0 16777215 24 0 0 0 0 Qt::NoFocus Return to Lists Qt::ToolButtonTextBesideIcon true Qt::LeftArrow 0 Qt::Vertical 20 10 Saved List Settings Qt::AlignCenter Qt::Horizontal 0 0 Name Server User Name Password true 0 0 0 28 Save ../../convenience/document-save.png../../convenience/document-save.png Qt::Vertical 20 10 You can export this list to a file if you want to use it in other applications true 0 0 0 28 Export to file... Qt::Vertical 20 40 0 0 Qt::NoFocus Return to Lists Qt::ToolButtonTextBesideIcon true Qt::LeftArrow 0 Qt::Vertical 20 10 4 4 List Title Qt::AlignCenter Qt::Horizontal 0 0 0 0 0 0 0 0 Show 5 500 20 0 0 items 0 0 0 0 true 0 0 0 22 played 0 0 2 0 0 0 Qt::Vertical 20 40 0 0 0 0 before after 0 0 0 0 Qt::Vertical 20 40 0 0 0 0 0 30 or more exactly or less 0 0 0 0 Qt::Vertical 20 40 0 0 0 0 0 2 times 0 0 or more exactly or less Save Qt::Vertical 20 10 0 0 Qt::NoFocus Return to Lists Qt::ToolButtonTextBesideIcon true Qt::LeftArrow KLineEdit QLineEdit
klineedit.h
SRatingCombo QComboBox
app/common/sensiblewidgets.h
bangarang-bangarang/src/app/ui/convenience/000077500000000000000000000000001166760560600212115ustar00rootroot00000000000000bangarang-bangarang/src/app/ui/convenience/README000066400000000000000000000007461166760560600221000ustar00rootroot00000000000000The icons in this directory are used by ../mainwindow.ui The sole purpose is to allow shared use of Qt4 Designer to more correctly visualize mainwindow.ui during design. Just add an icon here and point to it in Qt4 Designer. NOTE: This is for design purposes only. Icons should be replaced with a proper KIcon in code. Use of Qt4 Designer for editing ui files is strongly recommended. We can work on making ui files more efficient after we get the interaction models nailed down. bangarang-bangarang/src/app/ui/convenience/audio-x-wav.png000066400000000000000000000012721166760560600240620ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<7IDATxڍS=oA}gea+)ӹMEEHDIG(P!NH029}8}7W_iTwW'w]C"Ovvt.#@ֲTK# n=VϷUl6) pIlsIdka*sJ"d"%><>h1B>ԍC edydNkuRYM +_?Q2|NamʶAnXp8 T ܝL&X0t)<@*c(B!pUU~7%k9h[Ys/ۢ_y3ss's-D>`? W70ذ>tW)mVuFIXOA`Lhtpp[{k1s߇\.d=^k8MY_gr7@4x3$Wȑw‹8R`^N[REDly#O8ChWXSM᠖bL mu߂t:-"IΨ1HĚAD[|5tjdP*멁=SSq.`Xs(=&6Wwq`,.hxٗ_m_ BNIENDB`bangarang-bangarang/src/app/ui/convenience/dialog-close.png000066400000000000000000000014551166760560600242660ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME IDATxe[hήlGjc9-.EXJ22ɱ( ||H  XZLnvss m~}DC}1qj 7ZwMc12l.w~`K߷n߯ʊ+gθ6223Gx\lK&>X..TJKK%=믱%Oj zYanJG"8$8bMy椚mu:f.37#;;{-MNHK{4GtԷόZҾi[٧ic]Ⴋ5LO),WD\qO5AZ JAtW?̪j̊R*ZuUJK,Sz|@·;zUj&RC 1 9&BVsO30u.~uTm2Cfw))X8ZE&>K%W?v#jSvv@3yw)n)buYWH_d%@oЄe.|QQ`[~1|Ɋt]Q"Qd?8ɛ 6 @z#̔Y@%Z[QIENDB`bangarang-bangarang/src/app/ui/convenience/document-open-folder.png000066400000000000000000000006431166760560600257500ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxڥJ@ϝIV\PAfZ [-}m,|}}A|[A]P:Df%~piýDà0$ 745CCe<5!CW|vDqs8mI#/{g O^7T$/R;xc: &2Mn$DK1F)[zڢ\A2ǹB`-(ks9(_ FuZcr\kzF>'==S CLԽ=efW* XJzIENDB`bangarang-bangarang/src/app/ui/convenience/document-save.png000066400000000000000000000010631166760560600244710ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڥ?H@_t:UAЭE$ M謸Ag7BRA5x_"B }|=\0VICRU Pܧ'EhZTi%&RXX\'( Aۛ+T*Du]h1 .^)B#H.^ݮ+Ӵ>LB=rY' W>3Gkӛ62d&VtIrpA=F"D4h:Lja|:$_t:ڃiA*˸8;e[8( +59G>!y$qc0Ma@uѓ$ުH42mJ 0mf[@|5 VA^Q<@R 4 PO\IENDB`bangarang-bangarang/src/app/ui/convenience/documentinfo.png000066400000000000000000000015351166760560600244150ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDAT8mKkeN3Lf2LRSP(S,") ]DEq-ŕ"V4X(P76ژLqmM^=WץDFu:?mZ)6å2SW#Y\4PJ)|vCK=qϑLhTÄ҅/_8;D {]w~rnu5bUɒRKrgƟBDzcvhW y7C If.=S3^NQq*cwVRW;ˬeUF#;dR ꁏTP;_lb"F52C~l(a,/ph.iyU*.]+(DeȪ.Z@QX>9j|AwA 8, ؂Q8k=z3~jlP$^kb2` %^^=6#M/ r1)Mct@Oy%(U/X!Hjڽլ2X+weÝRE;$>ph\/ {7LyTxKMߠA"l{7P~蕧~l9h 8_P\;is3""e:|ssO|G.gwtkIǯP EuO; oo=o@ɘIENDB`bangarang-bangarang/src/app/ui/convenience/flag-blue.png000066400000000000000000000032331166760560600235560ustar00rootroot00000000000000PNG  IHDROc#" pHYs7\7\Ǥ vpAg\ƭbKGD XIDATxڭ{\w9NQ)'4-N7RR.<\& qVZ(5őFJѺ.K6:PqHYlG.m;?B/Eo{78%KBٙ)-6X"/*c( @۳dj;Ֆwwwwoema햛(%G zJ7v]BtO`y$`6Iɓ1 r!.bA֔N]sTw.^)fA ;p/kB^\̠ 'uI;*v 0X8}@1ڸ+_/T$g#T?3; Ȋ7bXw3"v4 +Í?LMגƟ54n;[?YY-\}rɎ;慦Wg&+jH#_Ry*͑;z @V˜I?w^ _!+*V;hAIгj2ejNHpR"!g/m}B^m+Ofxee]"BV,Ҷ ̗:;"'Tp.6ׄf _͉!wnxsQgǎL@LUK^/ٴdgˆ&*,<ϡk5mٱ<ȣ c6_dx͇Ӿ=1`~Y\1u~?^v醴OGKnjc^JڻuK/|Y+$4B^l:JYzxj=IpIHdIu*5GCBT=n]SloݯYIL 4_, .ƕ3҉mツED%vpY/s 1QJ-[&!)U_9D_79uܔdS jk`51iW(NYԍ-Rd'X;Lƌ 徢{YBEm09`ӕU+lrX2vxJ~ D?On2U5.ET Em޺B}~ 4!.O>.l\ao9/0_t{ J%4K|r^wވ|M{ 2+lcڴkT]uaa1`.@HPy$rjnfzQ"? oG)WXǘ~%f9=sEt@A5bB8;*;5Rc*z"DMm @\-^F5^gcMTJ}AlT:-ֻZRzguk\P/MleWvl"}(&qf{c`8Tl{lb78қ)8Ws4<8)N3lэ8q:*8ɜ;9 8E Q'9Gq^N f[n5"zTXtSoftwarex+//.NN,H/J6XS\IENDB`bangarang-bangarang/src/app/ui/convenience/help-about.png000066400000000000000000000013361166760560600237620ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<[IDATxڥ1hA73;{].\R)DBP,J,D4Vbc!h#&UBbi*v6*6b]5]nnw]ic7;xCJ)Y1mNcShW"\VN;B;{X]@)U(^1K+b' j.L]ZCB'Pxm;YӀ.9\+HR 169z$P.J͇P:/ Yk=4qp0w @CWUpՐ0q`hoԧ< iN TA(p}x):(DLĠMj9K48ܖoa@{GImO l5 unK+/] ;G HW} (*H q(& &$FFu&"1F_sqc:@,$kh/2c̆4u37ʠ&b ~Nf|kŞ/E}i҃e&u3_3Iv-;E0#6yyuuc"" Յq4> Ϛ%vIENDB`bangarang-bangarang/src/app/ui/convenience/list-add.png000066400000000000000000000010641166760560600234210ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڥMkQ5IILiݸH]DD?p"čӕ`A@\BRn.TDqL36t;BEpDBy8#$*D$`^^&1H܃r tG7P&lAj&@L@r8DD2z;>CtƦqM8Z\ԒZ^ERs$Dԭa[IlȦ%lb z- S2f{Ȝ&# 5d YRRl‡IjW[ o9#هHU !@TA} Y Ȍ$֙W@n0H42~k.IԝFWu.0e4uY8&'mq2 Ǩ] 'D\`b_;I!i[Kc~M?]#=HO'tE?#כNVR$ I&\^ rCiAn$wƌd/ \|I)^M9;Q(' ;|p%(BmxJA7L#["д?43 E\.a>{qAϦ8Ӿ{iɬAD 4"ZOi\DŽ8\ISF/>ZQN4 )4=Mtb51 @~`OhCTu`1&iMZ -{/Me P!{W zs`K S`a+r}`ʆ_}q#gLvld (/!!! >u\IYtFktXsek@l!@|+2Y4lՠٍVҼ! W'qm,QHڬhH؅j2z+ؼ$ɞ1Zje{)ݸTl;@ ls}wgDIENDB`bangarang-bangarang/src/app/ui/convenience/media-playback-start.png000066400000000000000000000022311166760560600257130ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx}kU}3IMk L[ BF+fU4-~P\JHi6(KM[EjkBDDE63Nׇ0C$/$k׉?$"fÅф5kX)p@+E&pe|M_hBBdɱ Qq76R_c}0RgYetM<1n>>`pїTel"ogBJCv~[en_: la%3 &q;l,v76x':.2‰xBgJݾ~ l<9mw-6O*2í .E^e{K<+Ѵ,j,pZL=|A:,ԩ3HYlAd˫Kf!N[Yc~d_ @]qnק"?-6bujTcG#+O5ZC) $@)>bmY c1sT2(e|ɓcw·?I[xbkk,r #h%[v`1ʼn`dB%xK]<܇_.'e93k-O' :i;S_q}P\.g[zvǵc rJ傻|6a9ßъIENDB`bangarang-bangarang/src/app/ui/convenience/media-playback-start16.png000066400000000000000000000007651166760560600260740ustar00rootroot00000000000000PNG  IHDR7sBITUF pHYs:tEXtSoftwarewww.inkscape.org<tIDATAKS;ڡ}.]xԞ~_O(pMIX+V$n4[3tF::dJBs!*NUz%ɵw ([c 1GܑTUu2\tI% rmXǺN(5U)]2=ȢK.{A߸*tK`RvԔ[(iO~M .h=uZ +Ig_|hÁ^g__(pgL)X-V[YWzW.G&Sm:wq ϴP3ۚ,&?؁Ppy3t FPu5Սp '7"Q活n= wgv򬺪L&}-w0,}t}4pIH%ўRfĿ6U^Iҝٯ!-G^~;OSiGAӶ~uI:pHGm#MZuTxʁ8ɮ#'QoЗxC[r3'("gԓh(JjR)HU<-I$( jMczURAQBa]"6АTMռ2U]m%JxVѮwVC;&v}g}XzZ2 ^=rL_bk+u^aqiPbn=o΀Th}pbiPBÈkiSОKeár̎~laBSѣ;zOKd tXhH*o~W]Rf.9WbfpxxrCEzhd@uj2EX(-RAiIJ|XL# CBsאY"ׇ"amBPV#-u+cʑ&9G&Ә0￾_ֻWp<kBIb g 6iX>pCD`@4w6nS9*V[5V`|sjs*8ӍmEO4æ T&-ɠUTf %zPxĒD\u\J /v!x݂9N9//xg G)Nwz &u[knI_f C+mG%0] 寑/b9T Kdo= >xzO:-'zYMudh5Z>S"2LLv{Ls\Ifgȅ; f.GW}D,} r+a>iCJ7-;P+vdµ̳a^ޖiU| uitQdb)C3 US8GE'ޝ/U}a[HmN3fM/4i*Gʞn~n.E,|vߒ7d Kj|*$t-rD~ am{3E\lٓA m^iK @Qp8acQ',lK1!6pM>ԋD}NUo[pkh8`@ymr"f|JbsVi>-+("{?W=D͢:/."B߱,QjnE>yn5Vۺ˹uO}0^8X&N%1)Wb Ã]8恮i8gE/$t5.(_ Сz^#Q&= UWf_|X<+hnȦ!3㷥J{K9iȣla^sQA":3.7yB[cRVIȖW2=3P|N%cO+ 9%.Uk@GuIV>6#b;$33MT+z1e 3+.2ϔ 7Jyz,w|;ME {9靫uuą-@K*(Vy_׳o9ApԄzͲ-wW7! Z_Ã=Ӝc8m ^LSIuF ?Y!Fa21>)>*k UZBeڽ]փ҆]Q98[,Q\Oޟy86EErdgt`*^QpdYF+V[uNUaay+'T[Pp[ӯs^fXkэWf-(Jo$e$1U.[#S\yx-SK|dgg+#dKT ='+R †!Y"™7Qz,1ŕ1SaD q,n|8iıM'%cw(Z#Y'O| vrR,,ڃY0ORe9)|zhR2(y_ȟv?~ }A0e SA@TW ktiMys^ڙ`iYZe~os T{T_ #idLKGE&e,8[l?@P|~C9rPR >؆2vc>|Q"zTXtSoftwarex+//.NN,H/J6XS\IENDB`bangarang-bangarang/src/app/ui/convenience/tool-animator.png000066400000000000000000000036501166760560600245100ustar00rootroot00000000000000PNG  IHDR szzsRGB pHYs7]7]F]tIME 4ћbKGD(IDATxڽ{lTuǿ{;NP,C$(>j]!n\|%QBc4*&nfWnBV}SәSۡvouLwͧsgs~QXB 9-epѢ_6^UرO߼V5:V~f55=ٳ{dnm B8L&Kp'G8)X^j0zwUe BjEE9rr,p8Ɛm^Xb+5a\r{***>|xSF`߾x&[_ }-9}~`ww@Ǽ2[vY?`6TdG~ 6 Q2JȑpL'TU wr,_ ƈ"Bꔖ VU󰁸cbbԓMx0g破(fzzz?wIby0EmmVj@<5˃re=P.`;NbҬLUs}v/xZ\lf< ㄗ3Gpc\ϝ0#3]vGwxm,aXzy媵{zz2336000-5k*mmb};䤇%vl?ý|mw % ܁PB͛7߾ .0Fu:' ;=ꫯ=mmTG} `Z5w P`6 cJO?~~v>>>E6he+( {{i\ߧX6Vl'Q dt I@h'Dp8,ҧ ?XPP]02)pr\{{By"YPj0 ޲9@g|k!H{L0 &_/]q@Ol%%!#᧳ݞV4tK^^-[[`smPTH .Dh~*׮E_O8KPk%p\hmLΎK/_αq?)aࡇ~7Ren4㈐;ĉh;! EgdK1d(x۶{h޻!F{TvE~}/VFdO`%_@PF'j]L)_"-K$X[Nݻf3B![Ưwm[l3$4k1==.z+X@Eq曳zfF(/_G4 UY2tB$Kt-ݫ7%E2nFWG{<2*Zp *i?x9|%nT9_N7Ԡ[Ni$jЯ5a| PB{k#JRYuLOf+F"Kz%Si"?u<=xdqr'#vBnPFn^n"ƹQADf\.i#$+>Y Ct|<";{&1ظq B!SAYMMpZ'q11>:7<<~)4v8\Urt ,ZD9NHY$I|o+KG,#UI,CP(1d Ǥ, 4L!kjjPnAfr^DɻLr&1Ycr  ~b@ ۽DŸLRi:qVb&" NGpB*B"D~t-dϝŝ=LJA5+UEQQo؀|K<N[̺wl@mf&+JK΢<U?ףc(FYUrw."s|gF_Huu[v[Q)P0=d4~75p#0wĻIENDB`bangarang-bangarang/src/app/ui/convenience/video-television.png000066400000000000000000000010361166760560600252040ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxŒ?OP} u!%L8:9Hp2nH0bL0Px4qq'}d_$ Fa.J~v~Z Xbwh$ `a7Ϗ _&h :RpJN) :h7,d%w⮉0QTb`0@wdY NC!Űx>h4Ko~ !lNwz"/)jaT@tXkJmVm餧m~Ěm8>)|_Ar[\2/+cvsB,w('ژB^8_a~QV}n 8RqV(2jz|NV v{ίs b[buIENDB`bangarang-bangarang/src/app/ui/convenience/video-x-generic.png000066400000000000000000000013211166760560600247010ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<NIDATxڅSMkQ=3iڅta-&~A[Z XUjq!.\(V(bQ7J*(HVnZu$fQlL65GE3wy$AӴCh1xh-[SL yOsn&uuv4:n`Zk@ Hvuww0H)es &ض:{ɫ]IBUdIr^L:Ocn.۰{B W.O H$}6԰ğk 6+R C4zůEܙMb*e*5x>Xyl8::A8qnݯul؎BqF1}k@USy|Jo_?RhOnJ%Χ,  jTThh(BGOKS4;I##$y^U Z/>/j^T;3R(d<һfP*, D>[4A0yvyЉS W2y,T,!uWYT6{7oxsy;|ߗrԵL1·dhX~m8|nIENDB`bangarang-bangarang/src/app/ui/convenience/view-fullscreen.png000066400000000000000000000006141166760560600250320ustar00rootroot00000000000000PNG  IHDR(-SsRGB pHYs B(xtIME BPLTE<<>>CCFFRR]]^^^^``ddggؓڗژۙܜܝܞݟݠޡޢߥਨltRNS3ǽ=bKGD*SԞuIDATxeB@5[,",E'2{4s6hhKё!r>1؛hM08'qD"x~6x\L2$\S?\EnG=XIENDB`bangarang-bangarang/src/app/ui/convenience/view-media-playlist.png000066400000000000000000000016141166760560600256070ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTEJLN!P#R#R%T&U*Y,Z.Z/]1_2a5c:g=iIuKyZ[oŇɇњٟᠽ⢿㣺֣㤼ڤ㥼٥ܥ榾۩꪿٪ܮ񱱱ⷷ⽽㾾7tRNS >?I.HLIDAT8c`=`dbX:&ҤJdP\í M)m)H ## @lX, fg"44*NOLJ * .HtututvuE:QDzyVg!Tщlv'`dd%ofhamak#ef V .aa瓠%$+.V )$. +'-,!(#E|8RUPRfB;v :5,+/:ײ̈́2`¯p΢RRH GIENDB`bangarang-bangarang/src/app/ui/convenience/view-sort-ascending.png000066400000000000000000000011701166760560600256060ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڥSkAfwYKQHAATTh&zѿR'_ "$ F)P@*MA nJ!fgyCgCPo1 @LyRʆ1o~1˲Hk1 ǁq MainWindowClass 0 0 740 600 false Bangarang 0 0 0 2 1 0 1 0 Qt::Horizontal false 10 0 170 0 250 16777215 QFrame::NoFrame QFrame::Raised 0 0 4 0 0 0 24 16777215 16777215 QFrame::NoFrame QFrame::Raised 0 0 Qt::Horizontal QSizePolicy::Expanding 34 20 0 0 75 true Media Lists Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Qt::Horizontal 40 20 QFrame::StyledPanel QFrame::Raised 1 2 0 1 0 0 QFrame::NoFrame QFrame::Raised 0 1 0 1 1 0 0 0 0 16777215 16777215 Qt::ClickFocus true false Search for audio true 0 0 0 0 0 24 75 true Audio Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 8 0 0 0 0 0 24 Qt::NoFocus Audio true Qt::Horizontal 40 20 0 0 Qt::Horizontal 0 0 0 0 2 0 24 75 true Video Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 8 0 0 0 0 0 24 Qt::NoFocus Video true Qt::Horizontal 40 20 0 0 0 0 16777215 36 QFrame::NoFrame QFrame::Raised 0 0 0 0 0 0 75 false true Qt::NoFocus View Now Playing Now Playing ../convenience/tool-animator.png../convenience/tool-animator.png 30 30 Qt::ToolButtonTextBesideIcon true 90 0 QFrame::NoFrame QFrame::Raised 0 0 4 0 0 0 0 false QFrame::StyledPanel QFrame::Sunken 0 0 true 0 1 0 0 0 0 0 List Title 2 24 0 QFrame::NoFrame false Qt::AlignCenter 0 0 Summary Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 Qt::NoFocus true Qt::DownArrow 0 0 0 true Qt::Horizontal 1 false 70 0 true 0 0 0 0 250 0 true true QFrame::NoFrame QAbstractItemView::NoEditTriggers true QAbstractItemView::ExtendedSelection QAbstractItemView::ScrollPerPixel false true false 0 true QFrame::StyledPanel QFrame::Plain 0 0 0 Qt::NoFocus ... ../convenience/dialog-close.png../convenience/dialog-close.png true Filter Qt::NoFocus 30 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 true 0 0 220 0 Qt::NoFocus QFrame::NoFrame true 0 0 220 291 Qt::ClickFocus 0 0 12 0 4 0 0 true Qt::ClickFocus true QFrame::NoFrame QFrame::Plain Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff QAbstractItemView::CurrentChanged|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked true true true QAbstractItemView::DragDrop Qt::IgnoreAction QAbstractItemView::SingleSelection QAbstractItemView::SelectRows QAbstractItemView::ScrollPerPixel 0 80 QFrame::NoFrame QFrame::Plain 0 12 8 12 0 0 0 Qt::ClickFocus 0 0 Qt::Vertical 20 200 0 0 16777215 140 0 0 1 0 4 Qt::Horizontal true 0 0 Qt::Horizontal 40 20 Qt::NoFocus ../convenience/help-about.png../convenience/help-about.png true Qt::Horizontal 40 20 false 2 12 0 12 0 true 0 0 4 Additional information may be available from: true 0 0 Qt::NoFocus Qt::NoFocus ... true 0 0 Qt::NoFocus Fetch info and edit changes Qt::ToolButtonTextOnly true 0 0 Qt::NoFocus Fetch info and save changes true 4 4 Matches Qt::AlignCenter 0 0 Qt::NoFocus 0 0 1 0 0 Qt::Horizontal 4 4 0 0 Qt::NoFocus Save Qt::ToolButtonTextBesideIcon 0 0 Qt::NoFocus Cancel Edit 0 0 1 0 0 Qt::Horizontal 4 4 Qt::NoFocus Index Selected Qt::ToolButtonTextBesideIcon true 0 0 0 26 16777215 26 true 2 3 1 1 0 0 Notification Text 0 0 100 20 24 0 0 0 36 16777215 36 QFrame::NoFrame QFrame::Raised 0 0 0 0 75 true Qt::NoFocus false Previous Qt::ToolButtonTextBesideIcon true Qt::LeftArrow Qt::Horizontal 40 20 0 0 100 32 Qt::NoFocus Play all media in list Play All ../convenience/media-playback-start16.png../convenience/media-playback-start16.png 0 0 100 32 Qt::NoFocus Play selected media in list Play Selected ../convenience/media-playback-start16.png../convenience/media-playback-start16.png false 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 true 0 0 255 255 255 48 48 48 72 72 72 60 60 60 24 24 24 32 32 32 255 255 255 255 255 255 255 255 255 0 0 0 48 48 48 0 0 0 24 24 24 255 255 220 0 0 0 255 255 255 48 48 48 72 72 72 60 60 60 24 24 24 32 32 32 255 255 255 255 255 255 255 255 255 0 0 0 48 48 48 0 0 0 24 24 24 255 255 220 0 0 0 24 24 24 48 48 48 72 72 72 60 60 60 24 24 24 32 32 32 24 24 24 255 255 255 24 24 24 48 48 48 48 48 48 0 0 0 48 48 48 255 255 220 0 0 0 true Qt::Horizontal 3 70 0 240 400 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 true QFrame::NoFrame QFrame::Raised 10 10 351 431 true Qt::NoFocus background-color: qlineargradient(spread:reflect, x1:0.494, y1:0, x2:0.505682, y2:1, stop:0 rgba(0, 0, 0, 0), stop:0.15 rgba(0, 78, 255, 30), stop:0.5 rgba(0, 68, 255, 42), stop:0.75 rgba(0, 78, 255, 30), stop:1 rgba(0, 0, 0, 0)); color: rgb(255, 255, 255); QFrame::NoFrame true QAbstractItemView::NoEditTriggers QAbstractItemView::NoSelection false true 160 280 200 150 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 true QFrame::NoFrame QFrame::Raised 50 80 54 15 75 true true ExternalSubtitle Qt::AlignCenter 4 200 50 91 24 0 0 0 24 true 0 0 0 0 Qt::NoFocus Playlist ../convenience/mail-mark-notjunk.png../convenience/mail-mark-notjunk.png false Qt::ToolButtonTextBesideIcon true 0 0 Qt::NoFocus ../convenience/configure.png../convenience/configure.png QToolButton::DelayedPopup true Qt::DownArrow 70 180 231 24 75 true true Error message Qt::AlignCenter 2 255 255 255 48 48 48 72 72 72 60 60 60 24 24 24 32 32 32 255 255 255 255 255 255 255 255 255 0 0 0 48 48 48 0 0 0 24 24 24 255 255 220 0 0 0 255 255 255 48 48 48 72 72 72 60 60 60 24 24 24 32 32 32 255 255 255 255 255 255 255 255 255 0 0 0 48 48 48 0 0 0 24 24 24 255 255 220 0 0 0 24 24 24 48 48 48 72 72 72 60 60 60 24 24 24 32 32 32 24 24 24 255 255 255 24 24 24 48 48 48 48 48 48 0 0 0 48 48 48 255 255 220 0 0 0 true 0 0 0 0 false 0 0 Qt::Horizontal 40 20 0 0 Qt::NoFocus Playlist ../convenience/mail-mark-notjunk.png../convenience/mail-mark-notjunk.png false Qt::ToolButtonTextBesideIcon true Qt::NoFocus ../convenience/configure.png../convenience/configure.png QToolButton::DelayedPopup true Qt::DownArrow Qt::Horizontal 0 0 255 255 255 48 48 48 72 72 72 60 60 60 24 24 24 32 32 32 255 255 255 255 255 255 255 255 255 0 0 0 48 48 48 0 0 0 24 24 24 255 255 220 0 0 0 255 255 255 48 48 48 72 72 72 60 60 60 24 24 24 32 32 32 255 255 255 255 255 255 255 255 255 0 0 0 48 48 48 0 0 0 24 24 24 255 255 220 0 0 0 24 24 24 48 48 48 72 72 72 60 60 60 24 24 24 32 32 32 24 24 24 255 255 255 24 24 24 48 48 48 48 48 48 0 0 0 48 48 48 255 255 220 0 0 0 true 0 4 0 255 255 255 48 48 48 61 61 61 48 48 48 24 24 24 32 32 32 255 255 255 255 255 255 255 255 255 10 10 10 48 48 48 219 219 219 28 28 28 255 255 220 0 0 0 255 255 255 48 48 48 61 61 61 48 48 48 24 24 24 32 32 32 255 255 255 255 255 255 255 255 255 10 10 10 48 48 48 219 219 219 28 28 28 255 255 220 0 0 0 24 24 24 48 48 48 61 61 61 48 48 48 24 24 24 32 32 32 24 24 24 255 255 255 24 24 24 48 48 48 48 48 48 219 219 219 28 28 28 255 255 220 0 0 0 true QFrame::NoFrame QFrame::Raised 0 0 3 3 3 0 0 QFrame::NoFrame QFrame::Sunken 0 0 QFrame::NoFrame QFrame::Raised 0 0 Qt::NoFocus Show Upcoming ../icons/hi22-actions-bangarang-preview.png../icons/hi22-actions-bangarang-preview.png 22 22 false true 0 0 <b>Playlist</b> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 0 Qt::NoFocus Clear Playlist ../icons/hi22-actions-bangarang-clearplaylist.png../icons/hi22-actions-bangarang-clearplaylist.png 22 22 true Qt::Vertical Qt::NoFocus Turn on Repeat [ ] ../icons/hi22-actions-bangarang-repeat.png../icons/hi22-actions-bangarang-repeat.png 22 22 false true true Qt::NoFocus Turn on Shuffle [ ] ../icons/hi22-actions-bangarang-shuffle.png../icons/hi22-actions-bangarang-shuffle.png 22 22 false true QFrame::NoFrame QFrame::Plain 0 0 0 0 10 10 10 51 51 51 10 10 10 51 51 51 51 51 51 51 51 51 QFrame::Sunken Qt::Horizontal 10 10 10 65 65 65 10 10 10 65 65 65 65 65 65 65 65 65 true QFrame::NoFrame 0 0 0 0 0 Notification 0 4 Qt::NoFocus Yes false Qt::NoFocus No Qt::NoFocus ... ../convenience/dialog-close.png../convenience/dialog-close.png true 250 0 true false QFrame::NoFrame 1 QAbstractItemView::NoEditTriggers true QAbstractItemView::DragDrop true QAbstractItemView::ExtendedSelection 0 0 QFrame::NoFrame QFrame::Raised 0 0 2 0 0 Qt::NoFocus ... ../convenience/dialog-close.png../convenience/dialog-close.png true Filter Qt::NoFocus 0 true 75 true Audio Settings 8 true 0 0 4 0 4 0 0 0 0 0 Audio Channel: 0 0 true Qt::Horizontal 40 20 Qt::Vertical 20 10 0 0 0 200 Equalizer 0 0 0 Presets 0 0 0 0 0 0 0 0 -12 12 Qt::Vertical QSlider::TicksBelow 4 Pre Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 60 Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 170 Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 310 Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 600 Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 1k Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 3k Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 6k Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 12k Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 14k Qt::AlignCenter 0 0 -12 12 Qt::Vertical QSlider::NoTicks 16k Qt::AlignCenter Qt::Vertical 20 10 0 Restore Defaults Hide 0 0 0 75 true Video Settings 8 -1 0 0 -1 4 0 4 0 Subtitle: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Qt::Horizontal 40 20 0 0 0 0 Qt::LeftToRight Angle: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 75 true Can't detect subtitle encoding, please choose: Qt::Vertical 20 10 6 4 4 0 100 0 Brightness: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 250 0 -99 Qt::Horizontal 0 100 0 Contrast: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 250 0 -99 Qt::Horizontal 0 100 0 Hue: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 250 0 -99 Qt::Horizontal 0 100 0 Saturation: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 250 0 -99 Qt::Horizontal Qt::Vertical 20 10 0 0 0 Aspect Ratio 0 0 Automatic Fit 4:3 16:9 Scaling 0 0 Scale to fit Scale and crop Qt::Vertical 20 10 0 0 0 Restore Defaults Hide -1 4 0 25 75 true Shortcuts Qt::StrongFocus 0 Save Shortcuts Cancel 0 0 0 38 16777215 38 0 1 2 1 0 0 0 75 true Qt::NoFocus View Media Lists Media Lists convenience/view-media-playlist.pngconvenience/view-media-playlist.png 32 32 Qt::ToolButtonTextBesideIcon true QFrame::NoFrame QFrame::Raised 0 0 Qt::NoFocus Show full screen [ ] convenience/view-fullscreen.pngconvenience/view-fullscreen.png 16 16 true QToolButton::DelayedPopup true QFrame::NoFrame QFrame::Raised 0 0 Qt::Horizontal QSizePolicy::Fixed 4 20 0 0 16777215 16777215 QFrame::NoFrame QFrame::Raised 0 0 0 0 75 true Qt::NoFocus <b>Time elapsed</b><br>Click to show remaining time 03:00 true 0 0 QFrame::NoFrame QFrame::Raised 0 0 0 0 QFrame::NoFrame QFrame::Raised 0 0 0 0 Qt::NoFocus Qt::Horizontal QSizePolicy::Fixed 2 20 QFrame::NoFrame QFrame::Raised 0 0 8 0 0 0 0 Qt::NoFocus Mute volume ../convenience/preferences-desktop-text-to-speech.png../convenience/preferences-desktop-text-to-speech.png 16 16 true true 0 0 70 16777215 Qt::NoFocus Volume Qt::Horizontal QSizePolicy::Fixed 2 20 Qt::NoFocus ... convenience/media-skip-backward.pngconvenience/media-skip-backward.png 22 22 true 0 0 Qt::NoFocus ... convenience/media-playback-start.pngconvenience/media-playback-start.png 32 32 true Qt::NoFocus ... convenience/media-skip-forward.pngconvenience/media-skip-forward.png 22 22 true Phonon::SeekSlider QWidget
phonon/seekslider.h
Phonon::VolumeSlider QWidget
phonon/volumeslider.h
KFilterProxySearchLine QWidget
kfilterproxysearchline.h
KLineEdit QLineEdit
klineedit.h
KShortcutsEditor QWidget
kshortcutseditor.h
SToolButton QToolButton
app/common/sensiblewidgets.h
entered() exited()
SFrame QFrame
app/common/sensiblewidgets.h
1 entered() exited()
MediaView QTreeView
app/common/mediaview.h
NowPlayingView QTreeView
app/nowplaying/nowplayingview.h
InfoItemView QListView
app/medialists/infoitemview.h
PlaylistView QListView
app/nowplaying/playlistview.h
mediaView mediaListFilterProxyLine Filter fetchedMatches infoItemSave infoItemCancelEdit playAll playSelected playlistView playlistFilterProxyLine playlistNotificationYes playlistNotificationNo audioChannelSelection eqPresets eq1 eq2 eq3 eq4 eq5 eq6 eq7 eq8 eq9 eq10 eq11 restoreDefaultAudioSettings hideAudioSettings subtitleSelection angleSelection subtitleEncodingSelection brightnessSlider contrastSlider hueSlider saturationSlider aspectRatioAuto aspectRatioWidget aspectRatio4_3 aspectRatio16_9 scaleModeFitInView scaleModeScaleAndCrop restoreDefaultVideoSettings hideVideoSettings shortcutsEditor saveShortcuts cancelEditShortcuts showPlaylist_2 infoItemViewHolder showInfoFetcherExpander infoFetcherSelector infoFetcherLink infoFetch infoAutoFetch closePlaylistFilter collectionButton showMediaViewMenu showPlaylist showMenu closePlaylistNotification showMenu_2 nowPlayingView volumeIcon
bangarang-bangarang/src/app/ui/videolistsstack.ui000066400000000000000000001000001166760560600224560ustar00rootroot00000000000000 VideoListsStack 0 0 400 312 Form 0 0 0 0 0 0 0 QAbstractItemView::SelectRows 0 18 QFrame::NoFrame QFrame::Raised 0 0 Qt::NoFocus Add list ../../convenience/list-add.png../../convenience/list-add.png true Qt::NoFocus Remove list ../../convenience/list-remove.png../../convenience/list-remove.png true Qt::Horizontal 40 20 Qt::NoFocus Settings ../../convenience/configure.png../../convenience/configure.png true 0 0 8 Qt::Vertical 20 10 Add List Qt::AlignCenter Qt::Horizontal Source 0 0 0 Current Selection Current View Current Playlist New List Name 0 0 0 28 Save ../../convenience/document-save.png../../convenience/document-save.png Qt::Vertical 20 10 0 0 Qt::NoFocus Return To Lists Qt::ToolButtonTextBesideIcon true Qt::LeftArrow 0 Qt::Vertical 20 10 Saved List Settings Qt::AlignCenter Qt::Horizontal 0 0 Name 0 0 0 28 Save ../../convenience/document-save.png../../convenience/document-save.png Qt::Vertical 20 10 You can export this list to a file if you want to use it in other applications true 0 0 0 28 Export to file... Qt::Vertical 20 40 0 0 Qt::NoFocus Return to Lists Qt::ToolButtonTextBesideIcon true Qt::LeftArrow 0 Qt::Vertical 20 10 4 4 List Title Qt::AlignCenter Qt::Horizontal 0 0 Show 5 1000 0 0 items 0 0 0 0 true 0 0 0 22 played 0 0 2 0 0 0 Qt::Vertical 20 40 0 0 0 0 before after 0 0 0 0 0 0 Qt::Vertical 20 40 0 0 0 0 0 0 0 30 or more exactly or less 0 0 0 0 Qt::Vertical 20 40 0 0 0 0 0 2 times 0 0 or more exactly or less Save Qt::Vertical 20 10 0 0 Qt::NoFocus Return to Lists Qt::ToolButtonTextBesideIcon true Qt::LeftArrow KLineEdit QLineEdit
klineedit.h
SRatingCombo QComboBox
app/common/sensiblewidgets.h
bangarang-bangarang/src/config-bangarang.h.cmake000066400000000000000000000000471166760560600221340ustar00rootroot00000000000000#cmakedefine HAVE_KSTATUSNOTIFIERITEM 1bangarang-bangarang/src/platform/000077500000000000000000000000001166760560600173445ustar00rootroot00000000000000bangarang-bangarang/src/platform/dbpediaquery.cpp000066400000000000000000000257041166760560600225360ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "dbpediaquery.h" #include #include #include #include #include #include #include #include #include #include #include DBPediaQuery::DBPediaQuery(QObject * parent) : QObject(parent) { m_queryPrefix = QString("PREFIX owl: " "PREFIX xsd: " "PREFIX rdfs: " "PREFIX rdf: " "PREFIX foaf: " "PREFIX dc: " "PREFIX dbr: " "PREFIX dbpedia2: " "PREFIX dbpedia: " "PREFIX skos: " "PREFIX dbo: "); m_lang = KGlobal::locale()->language(); if (m_lang.size() > 2) { m_lang = m_lang.left(2); } } DBPediaQuery::~DBPediaQuery() { } void DBPediaQuery::getArtistInfo(const QString & artistName) { //Create query url QString query = m_queryPrefix + QString("SELECT DISTINCT str(?label) AS ?name ?description ?thumbnail " "WHERE { " "{?person rdf:type dbo:Band . } " "UNION " "{?person rdf:type dbo:MusicalArtist . } " "?person rdfs:label ?label . " "?label bif:contains \"%1\" . " "OPTIONAL {?person rdfs:comment ?description . " "FILTER (lang(?description) ='%2') } " "OPTIONAL {?person dbo:thumbnail ?thumbnail . } " "} ") .arg(artistName) .arg(m_lang); //Create Request Key QString requestKey = QString("Artist:%1").arg(artistName); //Launch Query launchQuery(query, requestKey); } void DBPediaQuery::getAlbumInfo(const QString & albumName) { Q_UNUSED(albumName) } void DBPediaQuery::getActorInfo(const QString & actorName) { //Create query url QString query = m_queryPrefix + QString("SELECT DISTINCT str(?label) AS ?name ?description ?thumbnail " "WHERE { " "?person rdf:type dbo:Actor . " "?person rdfs:label ?label . " "?label bif:contains \"%1\" . " "OPTIONAL {?person rdfs:comment ?description . " "FILTER (lang(?description) ='%2') } " "OPTIONAL {?person dbo:thumbnail ?thumbnail . } " "} ") .arg(actorName) .arg(m_lang); //Create Request Key QString requestKey = QString("Actor:%1").arg(actorName); //Launch Query launchQuery(query, requestKey); } void DBPediaQuery::getDirectorInfo(const QString & directorName) { //Create query url QString query = m_queryPrefix + QString("SELECT DISTINCT str(?label) AS ?name ?description ?thumbnail " "WHERE { " "?person rdf:type dbo:Director . " "?person rdfs:label ?label . " "?label bif:contains \"%1\" . " "OPTIONAL {?person rdfs:comment ?description . " "FILTER (lang(?description) ='%2') } " "OPTIONAL {?person dbo:thumbnail ?thumbnail . } " "} ") .arg(directorName) .arg(m_lang); //Create Request Key QString requestKey = QString("Director:%1").arg(directorName); //Launch Query launchQuery(query, requestKey); } void DBPediaQuery::getMovieInfo(const QString & movieName) { //Create query url QString query = m_queryPrefix + QString("SELECT DISTINCT str(?label) AS ?title ?description ?thumbnail ?duration ?releaseDate ?actor ?writer ?director ?producer " "WHERE { " "{ ?work rdf:type dbo:Film . } " "?work rdfs:label ?label . " "?label bif:contains \"%1\" . " "?work rdfs:comment ?description . " "OPTIONAL { ?work dbo:starring ?actorres . " "?actorres foaf:name ?actor . } " "OPTIONAL { ?work dbo:director ?directorres . " "?directorres foaf:name ?director . } " "OPTIONAL { ?work dbo:writer ?writerres . " "?writerres foaf:name ?writer . } " "OPTIONAL { ?work dbo:producer ?producerres . " "?producerres foaf:name ?producer . } " "OPTIONAL { ?work dbo:duration ?duration . } " "OPTIONAL {?work foaf:depiction ?thumbnail . } " "OPTIONAL {?work dbo:releaseDate ?releaseDate . } " "FILTER (lang(?description) ='%2') } ") .arg(movieName) .arg(m_lang); //Create Request Key QString requestKey = QString("Movie:%1").arg(movieName); //Launch Query launchQuery(query, requestKey); } void DBPediaQuery::launchQuery(const QString &query, const QString &requestKey) { //Construct dbpedia url QString dbPediaSPARQL = QString(QUrl::toPercentEncoding(query)); QString dbPediaUrlString= QString("http://dbpedia.org/sparql/?format=application/xml&query=%1").arg(dbPediaSPARQL); KUrl dbPediaUrl = KUrl(dbPediaUrlString); //Add query url to request collection m_requests.insert(requestKey, dbPediaUrl); //Prepare download target location QString targetFileName = QString("bangarang/%1.tmp") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); KUrl dbPediaDownloadUrl = KUrl(KStandardDirs::locateLocal("data", targetFileName, true)); QFile downloadTarget(dbPediaDownloadUrl.path()); downloadTarget.remove(); //Launch query KIO::CopyJob *copyJob = KIO::copy(dbPediaUrl, dbPediaDownloadUrl, KIO::Overwrite | KIO::HideProgressInfo); copyJob->setAutoDelete(true); connect (copyJob, SIGNAL(copyingDone(KIO::Job *, const KUrl, const KUrl, time_t, bool, bool)), this, SLOT(resultsReturned(KIO::Job *, const KUrl, const KUrl, time_t, bool, bool))); copyJob->setUiDelegate(0); } void DBPediaQuery::resultsReturned(KIO::Job *job, const KUrl &from, const KUrl &to, time_t mtime, bool directory, bool renamed) { Q_UNUSED(job); Q_UNUSED(mtime); Q_UNUSED(directory); Q_UNUSED(renamed); QList resultsBindingSets; QString requestKey = m_requests.key(from); QFile file(to.path()); //Check to see if result file can be opened if (!file.open(QIODevice::ReadOnly | QIODevice::Text) || requestKey.isEmpty()) { kDebug() << QString("Couldn't open dbpedia query result file:%1").arg(from.path()); if (requestKey.startsWith("Artist")) { emit gotArtistInfo(false, resultsBindingSets, requestKey); } else if (requestKey.startsWith("Album")) { emit gotAlbumInfo(false, resultsBindingSets, requestKey); } else if (requestKey.startsWith("Actor")) { emit gotActorInfo(false, resultsBindingSets, requestKey); } else if (requestKey.startsWith("Director")) { emit gotDirectorInfo(false, resultsBindingSets, requestKey); } else if (requestKey.startsWith("Movie")) { emit gotMovieInfo(false, resultsBindingSets, requestKey); } return; } //Results file is an XML document QDomDocument resultsDoc("queryResult"); resultsDoc.setContent(&file); kDebug() << "Got results for " << requestKey; //Iterate through result nodes of the XML document QDomNodeList results = resultsDoc.elementsByTagName("result"); for (int i = 0; i < results.count(); i++) { QDomNodeList resultBindings = results.at(i).childNodes(); Soprano::BindingSet bindingSet = Soprano::BindingSet(); for (int j = 0; j < resultBindings.count(); j++) { QDomElement currentBinding = resultBindings.at(j).toElement(); QString bindingName = currentBinding.attribute("name"); Soprano::Node value; QDomElement currentBindingContent = currentBinding.firstChild().toElement(); if (currentBindingContent.tagName() == "uri") { value = Soprano::Node(QUrl(currentBindingContent.text())); } else if (currentBindingContent.tagName() == "literal") { if (currentBindingContent.attribute("datatype") == "http://www.w3.org/2001/XMLSchema#date") { QDate dateValue = QDate::fromString(currentBindingContent.text(), "yyyy-MM-dd"); value = Soprano::Node(Soprano::LiteralValue(dateValue)); } else { value = Soprano::Node(Soprano::LiteralValue(currentBindingContent.text())); } } bindingSet.insert(bindingName, value); } resultsBindingSets.append(bindingSet); } m_requests.remove(requestKey); //Check type of request and emit appropriate results signal if (requestKey.startsWith("Artist")) { emit gotArtistInfo(true, resultsBindingSets, requestKey); } else if (requestKey.startsWith("Album")) { emit gotAlbumInfo(true, resultsBindingSets, requestKey); } else if (requestKey.startsWith("Actor")) { emit gotActorInfo(true, resultsBindingSets, requestKey); } else if (requestKey.startsWith("Director")) { emit gotDirectorInfo(true, resultsBindingSets, requestKey); } else if (requestKey.startsWith("Movie")) { emit gotMovieInfo(true, resultsBindingSets, requestKey); } //Remove results file file.remove(); } bangarang-bangarang/src/platform/dbpediaquery.h000066400000000000000000000043561166760560600222030ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef DBPEDIAQUERY_H #define DBPEDIAQUERY_H #include #include #include #include class DBPediaQuery : public QObject { Q_OBJECT public: DBPediaQuery(QObject *parent = 0); ~DBPediaQuery(); void getArtistInfo(const QString & artistName); void getAlbumInfo(const QString & albumName); void getActorInfo(const QString & actorName); void getDirectorInfo(const QString & actorName); void getMovieInfo(const QString & movieName); private: QString m_queryPrefix; QHash m_requests; QString m_lang; void launchQuery(const QString &query, const QString &requestKey); Q_SIGNALS: void gotArtistInfo(bool successful, const QList results, const QString requestKey); void gotAlbumInfo(bool successful, const QList results, const QString requestKey); void gotActorInfo(bool successful, const QList results, const QString requestKey); void gotDirectorInfo(bool successful, const QList results, const QString requestKey); void gotMovieInfo(bool successful, const QList results, const QString requestKey); private Q_SLOTS: void resultsReturned(KIO::Job *job, const KUrl &from, const KUrl &to, time_t mtime, bool directory, bool renamed); }; #endif // DBPEDIAQUERY_H bangarang-bangarang/src/platform/devicemanager.cpp000066400000000000000000000072421166760560600226470ustar00rootroot00000000000000#include "devicemanager.h" #include #include #include #include #include DeviceManager *DeviceManager::m_instance = NULL; DeviceManager::DeviceManager(QObject* parent): QThread(parent) { m_deviceMutex = new QMutex(); } DeviceManager::~DeviceManager() { delete m_deviceMutex; } DeviceManager* DeviceManager::instance() { static QMutex mutex; if (!m_instance) { mutex.lock(); if (!m_instance) { m_instance = new DeviceManager(); m_instance->start(); } mutex.unlock(); } return m_instance; } void DeviceManager::drop() { static QMutex mutex; mutex.lock(); m_instance->quit(); delete m_instance; m_instance = 0; mutex.unlock(); } QList< Solid::Device > DeviceManager::deviceList(DeviceManager::RelatedType reqType) { QList< Solid::Device > list; m_deviceMutex->lock(); QMapIterator i(m_devices); while (i.hasNext()) { i.next(); const DeviceDescription & dev = i.value(); //filter the list if (!dev.first.isValid()) { continue; } if (dev.second != AllTypes && reqType != dev.second ) { continue; } list.append(dev.first); } m_deviceMutex->unlock(); return list; } void DeviceManager::run() { //Currently only discs are supported QList devices = Solid::Device::listFromType(Solid::DeviceInterface::OpticalDisc, QString()); //Create the device list m_deviceMutex->lock(); foreach (Solid::Device device, devices) { const Solid::OpticalDisc *disc = device.as (); RelatedType relT = AllTypes; if (disc == NULL) continue; int type = disc->availableContent(); if (type & Solid::OpticalDisc::Audio) { relT = AudioType; } else if (type & Solid::OpticalDisc::VideoDvd) { relT = VideoType; } m_devices.insert(device.udi(), DeviceDescription(device, relT)); } m_deviceMutex->unlock(); //connect to signals to stay up-to-date with our list connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString & )), this, SLOT(deviceAdded(const QString & ))); connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(const QString & )), this, SLOT(deviceRemoved(const QString & ))); //don't forget to run the event loop, or signals/slots won't work exec(); } void DeviceManager::deviceAdded(const QString &udi) { //Check type of device that was added and add it to cached list Solid::Device devAdded(udi); RelatedType relT = AllTypes; if (!devAdded.isDeviceInterface(Solid::DeviceInterface::OpticalDisc)) return; const Solid::OpticalDisc *disc = devAdded.as (); if (disc == NULL) return; int type = disc->availableContent(); if (type & Solid::OpticalDisc::Audio) { relT = AudioType; } else if (type & Solid::OpticalDisc::VideoDvd) { relT = VideoType; } m_deviceMutex->lock(); m_devices.insert(udi, DeviceDescription(devAdded, relT)); m_deviceMutex->unlock(); emit deviceListChanged( relT ); } void DeviceManager::deviceRemoved(const QString &udi) { //remove the device from the list m_deviceMutex->lock(); if (m_devices.find(udi) == m_devices.end()) { m_deviceMutex->unlock(); return; } RelatedType relT = m_devices.value(udi).second; m_devices.remove(udi); m_deviceMutex->unlock(); emit deviceListChanged( relT ); } bangarang-bangarang/src/platform/devicemanager.h000066400000000000000000000023001166760560600223020ustar00rootroot00000000000000#ifndef DEVICEMANAGER_H #define DEVICEMANAGER_H #include #include #include class DeviceManager : public QThread { Q_OBJECT public: enum RelatedType { AudioType, VideoType, AllTypes }; typedef QPair DeviceDescription; static DeviceManager* instance(); static void drop(); QList deviceList(RelatedType type = AllTypes); signals: void deviceListChanged(DeviceManager::RelatedType type); protected: virtual void run(); private: DeviceManager(QObject* parent = 0); ~DeviceManager(); DeviceManager(const DeviceManager &); // hide copy constructor DeviceManager& operator=(const DeviceManager &); // hide assign op // we leave just the declarations, so the compiler will warn us // if we try to use those two functions by accident static DeviceManager* m_instance; QMutex *m_deviceMutex; QMap m_devices; private slots: void deviceAdded(const QString &udi); void deviceRemoved(const QString &udi); }; #endif // DEVICEMANAGER_H bangarang-bangarang/src/platform/downloader.cpp000066400000000000000000000045371166760560600222170ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "downloader.h" #include #include Downloader::Downloader(QObject * parent):QObject (parent) { m_dirLister = new KDirLister(this); } Downloader::~Downloader() { } void Downloader::download(const KUrl &from, const KUrl &to) { if (to.isLocalFile()) { QFile fileTarget(to.path()); fileTarget.remove(); } KIO::CopyJob *copyJob = KIO::copyAs(from, to, KIO::Overwrite | KIO::HideProgressInfo); copyJob->setUiDelegate(0); copyJob->setAutoDelete(true); connect (copyJob, SIGNAL(copyingDone(KIO::Job *, const KUrl, const KUrl, time_t, bool, bool)), this, SLOT(copyingDone(KIO::Job *, const KUrl, const KUrl, time_t, bool, bool))); } KDirLister * Downloader::dirLister() { return m_dirLister; } void Downloader::listDir(const KUrl &url) { connect(m_dirLister, SIGNAL(completed(KUrl)), this, SLOT(listDirComplete(KUrl))); m_dirLister->openUrl(url); } void Downloader::copyingDone(KIO::Job *job, const KUrl &from, const KUrl &to, time_t mtime, bool directory, bool renamed) { Q_UNUSED(job); Q_UNUSED(mtime); Q_UNUSED(directory); Q_UNUSED(renamed); disconnect (job, SIGNAL(copyingDone(KIO::Job *, const KUrl, const KUrl, time_t, bool, bool)), this, SLOT(copyingDone(KIO::Job *, const KUrl, const KUrl, time_t, bool, bool))); emit downloadComplete(from, to); } void Downloader::listDirComplete(const KUrl &url) { m_dirLister->stop(); disconnect(m_dirLister,SIGNAL(completed(KUrl)), this, SLOT(listDirComplete(KUrl))); emit listingComplete(url); } bangarang-bangarang/src/platform/downloader.h000066400000000000000000000031151166760560600216530ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef DOWNLOADER_H #define DOWNLOADER_H #include #include #include /* * This class provides a simple downloader accessible via signals/slots. */ class Downloader : public QObject { Q_OBJECT public: Downloader(QObject * parent = 0); ~Downloader(); KDirLister *dirLister(); public slots: void download(const KUrl &from, const KUrl &to); void listDir(const KUrl &url); private: KDirLister * m_dirLister; private slots: void copyingDone(KIO::Job *job, const KUrl &from, const KUrl &to, time_t mtime, bool directory, bool renamed); void listDirComplete(const KUrl & url); signals: void downloadComplete(const KUrl &from, const KUrl &to); void listingComplete(const KUrl &url); }; #endif // DOWNLOADER_H bangarang-bangarang/src/platform/infofetchers/000077500000000000000000000000001166760560600220235ustar00rootroot00000000000000bangarang-bangarang/src/platform/infofetchers/dbpediainfofetcher.cpp000066400000000000000000000446241166760560600263460ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "dbpediainfofetcher.h" #include "../dbpediaquery.h" #include "../mediaitemmodel.h" #include "../downloader.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include #include DBPediaInfoFetcher::DBPediaInfoFetcher(QObject * parent) : InfoFetcher(parent) { m_name = i18n("DBPedia"); m_icon = KIcon("bangarang-dbpedia"); m_url = KUrl("http://dbpedia.org"); m_about = i18n("This fetcher gets information from DBPedia.org."); m_dbPediaQuery = new DBPediaQuery(this); connect (m_dbPediaQuery, SIGNAL(gotArtistInfo(bool,QList,QString)), this, SLOT(gotPersonInfo(bool,QList,QString))); connect (m_dbPediaQuery, SIGNAL(gotActorInfo(bool,QList,QString)), this, SLOT(gotPersonInfo(bool,QList,QString))); connect (m_dbPediaQuery, SIGNAL(gotDirectorInfo(bool,QList,QString)), this, SLOT(gotPersonInfo(bool,QList,QString))); connect (m_dbPediaQuery, SIGNAL(gotMovieInfo(bool,QList,QString)), this, SLOT(gotMovieInfo(bool,QList,QString))); m_downloader = new Downloader(this); connect(this, SIGNAL(download(KUrl,KUrl)), m_downloader, SLOT(download(KUrl,KUrl))); connect(m_downloader, SIGNAL(downloadComplete(KUrl,KUrl)), this, SLOT(gotThumbnail(KUrl,KUrl))); //Define fetchable fields m_fetchableFields["Artist"] = QStringList() << "artwork" << "title" << "description"; m_fetchableFields["Actor"] = QStringList() << "artwork" << "title" << "description"; m_fetchableFields["Director"] = QStringList() << "artwork" << "title" << "description"; m_fetchableFields["Movie"] = QStringList() << "artwork" << "title" << "description" << "actor" << "director" << "writer"; //Define required fields m_requiredFields["Artist"] = QStringList() << "title"; m_requiredFields["Actor"] = QStringList() << "title"; m_requiredFields["Director"] = QStringList() << "title"; m_requiredFields["Movie"] = QStringList() << "title"; } DBPediaInfoFetcher::~DBPediaInfoFetcher() { } bool DBPediaInfoFetcher::available(const QString &subType) { /* * We check if the network is connected. As some distributions use ifup to set up their connection * Solid::Networking may return Unknow, as it only checks NetworkManager, not ifup. * A real check to the dbpedia server would be overkill and take too long here. * In general this fetcher should not be available if the dbpedia server cannot be reached. * Maybe we get an idea to handle this properly later on, but there's currently the following problem: * A connection test would take some, so maybe the user wouldn't see this infofetcher directly or * even worse this test would block the whole application. */ Solid::Networking::Status state = Solid::Networking::status(); bool networkConnected = ( state == Solid::Networking::Connected || state == Solid::Networking::Unknown ); bool handlesType = (m_requiredFields[subType].count() > 0); return (networkConnected && handlesType); } void DBPediaInfoFetcher::fetchInfo(QList mediaList, int maxMatches, bool updateRequiredFields, bool updateArtwork) { Q_UNUSED(maxMatches); m_updateRequiredFields = updateRequiredFields; m_mediaList.clear(); m_requestKeys.clear(); m_thumbnailKeys.clear(); m_fetchedMatches.clear(); m_indexesWithThumbnail.clear(); m_updateArtwork = updateArtwork; //Build request keys (basically the search string for DBPediaQuery) for (int i = 0; i < mediaList.count(); i++) { MediaItem mediaItem = mediaList.at(i); QString keyPrefix; QString keySuffix; if (mediaItem.subType() == "Artist") { keyPrefix = "Artist:"; keySuffix = mediaItem.fields["title"].toString().remove("'"); } if (mediaItem.subType() == "Actor") { keyPrefix = "Actor:"; keySuffix = mediaItem.fields["title"].toString().remove("'"); } if (mediaItem.subType() == "Director") { keyPrefix = "Director:"; keySuffix = mediaItem.fields["title"].toString().remove("'"); } if (mediaItem.subType() == "Movie") { keyPrefix = "Movie:"; mediaItem.title = Utilities::titleForRequest(mediaItem.title); keySuffix = mediaItem.title; keySuffix.remove("'"); } if (!keyPrefix.isEmpty()) { m_mediaList.append(mediaItem); int keyIndex = m_requestKeys.lastIndexOf(QRegExp(QString("%1*").arg(keyPrefix) ,Qt::CaseSensitive, QRegExp::Wildcard)); if (keyIndex == -1) { QString requestKey = QString("%1'%2'").arg(keyPrefix).arg(keySuffix); m_requestKeys.append(requestKey); } else { QString requestKey = m_requestKeys.at(keyIndex); requestKey.append(QString(" OR '%1'").arg(keySuffix)); m_requestKeys.replace(keyIndex, requestKey); } } } //Launch requests if (!m_requestKeys.isEmpty()) { for (int i = 0; i < m_requestKeys.count(); i++) { if (m_requestKeys.at(i).startsWith("Artist:")) { setFetching(); m_dbPediaQuery->getArtistInfo(m_requestKeys.at(i).mid(7)); } if (m_requestKeys.at(i).startsWith("Actor:")) { setFetching(); m_dbPediaQuery->getActorInfo(m_requestKeys.at(i).mid(6)); } if (m_requestKeys.at(i).startsWith("Director:")) { setFetching(); m_dbPediaQuery->getDirectorInfo(m_requestKeys.at(i).mid(9)); } if (m_requestKeys.at(i).startsWith("Movie:")) { setFetching(); m_dbPediaQuery->getMovieInfo(m_requestKeys.at(i).mid(6)); } } } } void DBPediaInfoFetcher::gotPersonInfo(bool successful, const QList results, const QString &requestKey) { m_requestKeys.removeAll(requestKey); if (!successful || m_timeout) { checkComplete(); emit noResults(this); return; } if (results.count() == 0) { checkComplete(); emit noResults(this); return; } QString subType = requestKey.left(requestKey.indexOf(":")); QString lastThumbnailUrl; for (int i = 0; i < results.count(); i++) { Soprano::BindingSet binding = results.at(i); QString name = binding.value("name").literal().toString().trimmed(); //Find item corresponding to info MediaItem mediaItem; int foundIndex = -1; for (int j = 0; j < m_mediaList.count(); j++) { MediaItem item = m_mediaList.at(j); if (item.subType() == subType && name.contains(item.fields["title"].toString())) { mediaItem = item; foundIndex = j; break; } } if (foundIndex == -1) { continue; } //Create new match item based on result and add to matches QList matches = m_fetchedMatches[foundIndex]; if (!name.isEmpty()) { MediaItem match = mediaItem; //Set Title match.title = name; if (m_updateRequiredFields) { match.fields["title"] = match.title; } //Set Description QString description = binding.value("description").literal().toString().trimmed(); if (!description.isEmpty()) { match.fields["description"] = description; } //Get Thumbnail if (m_updateArtwork) { QString thumbnailUrlString = binding.value("thumbnail").uri().toString(); KUrl thumbnailUrl = KUrl(thumbnailUrlString); if (thumbnailUrl.isValid() && thumbnailUrlString != lastThumbnailUrl) { QString thumbnailTargetFile = QString("bangarang/thumbnails/%1-%2-%3") .arg(subType) .arg(name) .arg(thumbnailUrl.fileName()); KUrl thumbnailTargetUrl = KUrl(KStandardDirs::locateLocal("data", thumbnailTargetFile, true)); QFile downloadTarget(thumbnailTargetUrl.path()); downloadTarget.remove(); m_thumbnailKeys[QString("%1,%2").arg(foundIndex).arg(matches.count())] = thumbnailUrl.prettyUrl(); emit download(thumbnailUrl, thumbnailTargetUrl); lastThumbnailUrl = thumbnailUrlString; } } match = Utilities::makeSubtitle(match); matches.append(match); } m_fetchedMatches[foundIndex] = matches; } } void DBPediaInfoFetcher::gotMovieInfo(bool successful, const QList results, const QString &requestKey) { m_requestKeys.removeAll(requestKey); if (!successful || m_timeout) { checkComplete(); emit noResults(this); return; } if (results.count() == 0) { checkComplete(); emit noResults(this); return; } //Process results QString subType = requestKey.left(requestKey.indexOf(":")); QString lastThumbnailUrl; for (int i = 0; i < results.count(); i++) { Soprano::BindingSet binding = results.at(i); QString title = binding.value("title").literal().toString().trimmed(); //Find item corresponding to info MediaItem mediaItem; int foundIndex = -1; for (int j = 0; j < m_mediaList.count(); j++) { MediaItem item = m_mediaList.at(j); if (item.subType() == subType && title.contains(item.title)) { mediaItem = item; foundIndex = j; break; } } if (foundIndex == -1) { continue; } //Create new match item based on result and add to matches QList matches = m_fetchedMatches[foundIndex]; if (!title.isEmpty()) { //Find item in matches int matchIndex = -1; for (int j = 0; j < matches.count(); j++) { MediaItem matchItem = matches.at(j); if (matchItem.title == title) { matchIndex = j; break; } } MediaItem match = mediaItem; if (matchIndex != -1) { match = matches.at(matchIndex); } //Set Title match.title = title; if (m_updateRequiredFields) { match.fields["title"] = title; } //Set Description QString description = binding.value("description").literal().toString().trimmed(); if (!description.isEmpty()) { match.fields["description"] = description; } //Set Duration int duration = binding.value("duration").literal().toInt(); if (duration != 0) { match.duration = Utilities::durationString(duration); match.fields["duration"] = duration; } //Set releaseDate QDate releaseDate = binding.value("releaseDate").literal().toDate(); if (releaseDate.isValid()) { match.fields["releaseDate"] = releaseDate; match.fields["year"] = releaseDate.year(); } //Set Actors QStringList actors = match.fields["actor"].toStringList(); QString actor = binding.value("actor").literal().toString().trimmed(); if (actors.indexOf(actor) == -1 && !actor.isEmpty()) { actors.append(actor); } match.fields["actor"] = actors; //Set Directors QStringList directors = match.fields["director"].toStringList(); QString director = binding.value("director").literal().toString().trimmed(); if (directors.indexOf(director) == -1 && !director.isEmpty()) { directors.append(director); } match.fields["director"] = directors; //Set Writers QStringList writers = match.fields["writer"].toStringList(); QString writer = binding.value("writer").literal().toString().trimmed(); if (writers.indexOf(writer) == -1) { writers.append(writer); } match.fields["writer"] = writers; //Set Producers QStringList producers = match.fields["producer"].toStringList(); QString producer = binding.value("producer").literal().toString().trimmed(); if (producers.indexOf(producer) == -1) { producers.append(producer); } match.fields["producer"] = producers; //Get Thumbnail if (m_updateArtwork) { QString thumbnailUrlString = binding.value("thumbnail").uri().toString(); thumbnailUrlString.replace("/wikipedia/commons/", "/wikipedia/en/"); //Wikipedia appears to be storing posters here instead KUrl thumbnailUrl = KUrl(thumbnailUrlString); if (thumbnailUrl.isValid() && thumbnailUrlString != lastThumbnailUrl && !m_timeout) { lastThumbnailUrl = thumbnailUrlString; if (m_indexesWithThumbnail.indexOf(foundIndex) == -1) { m_indexesWithThumbnail.append(foundIndex); } if (matchIndex == -1) { m_thumbnailKeys[QString("%1,%2").arg(foundIndex).arg(matches.count())] = thumbnailUrl.prettyUrl(); } else { m_thumbnailKeys[QString("%1,%2").arg(foundIndex).arg(matchIndex)] = thumbnailUrl.prettyUrl(); } QString thumbnailTargetFile = QString("bangarang/thumbnails/%1-%2-%3") .arg(subType) .arg(title) .arg(thumbnailUrl.fileName()); KUrl thumbnailTargetUrl = KUrl(KStandardDirs::locateLocal("data", thumbnailTargetFile, true)); QFile downloadTarget(thumbnailTargetUrl.path()); downloadTarget.remove(); m_timer->start(2000*m_indexesWithThumbnail.count()); // additional 2 seconds to get thumbnail emit download(thumbnailUrl, thumbnailTargetUrl); } } match = Utilities::makeSubtitle(match); if (matchIndex == -1) { matches.append(match); } else { matches.replace(matchIndex, match); } } m_fetchedMatches[foundIndex] = matches; if (m_timeout) { break; } } //For matches with no thumbnails return fetched info QList indexes = m_fetchedMatches.keys(); for (int i = 0; i < indexes.count(); i++) { int foundIndex = indexes.at(i); if (m_indexesWithThumbnail.indexOf(foundIndex) == -1) { QList matches = m_fetchedMatches.take(foundIndex); emit infoFetched(matches); } } } void DBPediaInfoFetcher::gotThumbnail(const KUrl &from, const KUrl &to) { QString requestKey = m_thumbnailKeys.key(from.prettyUrl()); m_thumbnailKeys.remove(requestKey); if (requestKey.isEmpty()) { return; } int foundIndex = requestKey.split(",").at(0).toInt(); int matchesIndex = requestKey.split(",").at(1).toInt(); if (!m_fetchedMatches.contains(foundIndex)) { return; } QList matches = m_fetchedMatches[foundIndex]; MediaItem match = matches.at(matchesIndex); QString thumbnailFile = to.path(); QPixmap thumbnail = QPixmap(thumbnailFile).scaled(200,200, Qt::KeepAspectRatio, Qt::SmoothTransformation); if (!thumbnail.isNull()) { match.artwork = QIcon(thumbnail); match.fields["artworkUrl"] = to.prettyUrl(); match.hasCustomArtwork = true; matches.replace(matchesIndex, match); m_fetchedMatches[foundIndex] = matches; } //When all thumbnails are retrieved return fetched info if (allThumbnailsFetchedForIndex(foundIndex)) { QList matches = m_fetchedMatches.take(foundIndex); emit infoFetched(matches); } if (m_thumbnailKeys.isEmpty()) { checkComplete(); } } bool DBPediaInfoFetcher::allThumbnailsFetchedForIndex(int index) { bool thumbnailsFetched = true; foreach(QString requestKey, m_thumbnailKeys) { int foundIndex = requestKey.split(",").at(0).toInt(); if (foundIndex == index) { thumbnailsFetched = false; break; } } return thumbnailsFetched; } void DBPediaInfoFetcher::checkComplete() { if (m_requestKeys.count() == 0) { m_isFetching = false; if (!m_timeout) { m_timer->stop(); emit fetchComplete(); emit fetchComplete(this); } } } void DBPediaInfoFetcher::timeout() { //Return any remaining matches that have not yet been returned if (!m_fetchedMatches.isEmpty()) { foreach (QList matches, m_fetchedMatches) { emit infoFetched(matches); } } InfoFetcher::timeout(); } bangarang-bangarang/src/platform/infofetchers/dbpediainfofetcher.h000066400000000000000000000042711166760560600260050ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef DBPEDIAINFOFETCHER_H #define DBPEDIAINFOFETCHER_H #include "infofetcher.h" #include #include #include class DBPediaQuery; class Downloader; /* * This class uses DBpedia for fetching meta info for a provided media list. */ class DBPediaInfoFetcher : public InfoFetcher { Q_OBJECT public: DBPediaInfoFetcher(QObject * parent = 0); ~DBPediaInfoFetcher(); bool available(const QString &subType); public slots: void fetchInfo(QList mediaList, int maxMatches = 4, bool updatedRequiredFields = true, bool updateArtwork = true); private: DBPediaQuery * m_dbPediaQuery; Downloader * m_downloader; QHash m_thumbnailKeys; QStringList m_requestKeys; QHash > m_fetchedMatches; QList m_indexesWithThumbnail; bool allThumbnailsFetchedForIndex(int index); void checkComplete(); private slots: void gotMovieInfo(bool successful, const QList results, const QString &requestKey); void gotThumbnail(const KUrl &from, const KUrl &to); void gotPersonInfo(bool successful, const QList results, const QString &requestKey); protected slots: void timeout(); signals: void download(const KUrl &from, const KUrl &to); }; #endif // DBPEDIAINFOFETCHER_H bangarang-bangarang/src/platform/infofetchers/doubaninfofetcher.cpp000066400000000000000000000203761166760560600262240ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2011 Ni Hui (shuizhuyuanluo@126.com) * * * 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 . */ #include "doubaninfofetcher.h" #include "../downloader.h" #include "../mediaitemmodel.h" #include #include #include #include #include #include DoubanInfoFetcher::DoubanInfoFetcher(QObject* parent) : InfoFetcher(parent) { m_name = i18n("Douban"); m_icon = KIcon("bangarang-douban"); m_url = KUrl("http://douban.com"); m_about = i18n("Note: This fetcher uses the Douban API but is not endorsed or certified by Douban."); m_searchAPI = "http://api.douban.com/music/subjects?q=%1&max-results=%2"; m_timeout = 20000; m_downloader = new Downloader(this); connect(this, SIGNAL(download(KUrl,KUrl)), m_downloader, SLOT(download(KUrl,KUrl))); connect(m_downloader, SIGNAL(downloadComplete(KUrl,KUrl)), this, SLOT(processOriginalRequest(KUrl,KUrl))); m_thumbnailDownloader = new Downloader(this); connect(this, SIGNAL(downloadThumbnail(KUrl,KUrl)), m_thumbnailDownloader, SLOT(download(KUrl,KUrl))); connect(m_thumbnailDownloader, SIGNAL(downloadComplete(KUrl,KUrl)), this, SLOT(processThumbnails(KUrl,KUrl))); //Define fetchable fields m_fetchableFields["Music"] = QStringList() << "artwork" << "title" << "description" << "artist" << "album" << "trackNumber" << "genre" << "year" << "duration"; // m_fetchableFields["Artist"] = QStringList() << "artwork" << "title" << "description"; // m_fetchableFields["Album"] = QStringList() << "artwork" << "title" << "description"; //Define required fields m_requiredFields["Music"] = QStringList() << "title" << "artist"; // m_requiredFields["Artist"] = QStringList() << "title"; // m_requiredFields["Album"] = QStringList() << "title" << "artist"; } DoubanInfoFetcher::~DoubanInfoFetcher() { } bool DoubanInfoFetcher::available(const QString &subType) { Solid::Networking::Status state = Solid::Networking::status(); bool networkConnected = ( state == Solid::Networking::Connected || state == Solid::Networking::Unknown ); bool handlesType = (m_requiredFields[subType].count() > 0); return (networkConnected && handlesType); } void DoubanInfoFetcher::timeout() { //Return any remaining matches that have not yet been returned emit infoFetched(m_fetchedMatches.values()); InfoFetcher::timeout(); } void DoubanInfoFetcher::fetchInfo(QList mediaList, int maxMatches, bool updateRequiredFields, bool fetchArtwork) { Q_UNUSED(maxMatches); Q_UNUSED(updateRequiredFields); Q_UNUSED(fetchArtwork); m_mediaList.clear(); m_requestKeys.clear(); m_fetchedMatches.clear(); m_thumbnailKeys.clear(); m_toFetchCount = mediaList.count(); m_fetchedCount = 0; for (int i = 0; i < m_toFetchCount; i++) { MediaItem mediaItem = mediaList.at(i); QString DoubanUrlStr; if (mediaItem.subType() == "Album") { QString album = mediaItem.fields["title"].toString(); QString artist = mediaItem.fields["artist"].toString(); DoubanUrlStr = m_searchAPI.arg(album).arg(artist).arg(1); } else if (mediaItem.subType() == "Music") { QString title = mediaItem.fields["title"].toString(); QString artist = mediaItem.fields["artist"].toString(); QString album = mediaItem.fields["album"].toString(); QString searchTerm = title + ',' + artist; if (!album.isEmpty()) searchTerm += ',' + album; DoubanUrlStr = m_searchAPI.arg(searchTerm).arg(1); } if (DoubanUrlStr.isEmpty()) continue; KUrl DoubanUrl(DoubanUrlStr); m_mediaList.append(mediaItem); m_requestKeys.append(DoubanUrl.prettyUrl()); //Retrieve Douban info QString DoubanTargetFile = QString("bangarang/temp/Douban%1.xml").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzzz")); KUrl DoubanTargetUrl = KUrl(KStandardDirs::locateLocal("data", DoubanTargetFile, true)); QFile DoubanTarget(DoubanTargetUrl.path()); DoubanTarget.remove(); setFetching(); emit download(DoubanUrl, DoubanTargetUrl); } } void DoubanInfoFetcher::processOriginalRequest(const KUrl &from, const KUrl to) { //Process results int originalRequestIndex = m_requestKeys.indexOf(from.prettyUrl()); MediaItem mediaItem = m_mediaList.at(originalRequestIndex); QFile file(to.path()); QDomDocument DoubanDoc("Douban"); DoubanDoc.setContent(&file); QDomNode entry = DoubanDoc.elementsByTagName("entry").at(0); QDomElement titleElem = entry.firstChildElement("title"); if (!titleElem.isNull()) { if (mediaItem.subType() == "Album") { mediaItem.title = titleElem.text(); mediaItem.fields["title"] = mediaItem.title; } else if (mediaItem.subType() == "Music") { mediaItem.fields["album"] = titleElem.text(); } } QDomElement dbattrElem = entry.firstChildElement("db:attribute"); while (!dbattrElem.isNull()) { if (dbattrElem.attribute("name") == "pubdate") { mediaItem.fields["year"] = dbattrElem.text().section('-', 0, 0); } else if (dbattrElem.attribute("name") == "singer") { mediaItem.fields["artist"] = QStringList() << dbattrElem.text(); } dbattrElem = dbattrElem.nextSiblingElement("db:attribute"); } //Add fetched matches to collection of fetched matches m_fetchedMatches.insert(originalRequestIndex, mediaItem); QString link; QDomElement linkElem = entry.firstChildElement("link"); while (!linkElem.isNull()) { link = linkElem.attribute("href"); if (link.endsWith("jpg")) break; linkElem = linkElem.nextSiblingElement("link"); } QString imageUrl = link.replace("spic","lpic"); KUrl thumbnailUrl = KUrl(imageUrl); QFile(to.path()).remove(); //Launch Thumbnail requests QString thumbnailTargetFile = QString("bangarang/thumbnails/%1-Douban-%2-%3") .arg(mediaItem.subType()) .arg(mediaItem.fields["DoubanID"].toString()) .arg(thumbnailUrl.fileName()); KUrl thumbnailTargetUrl = KUrl(KStandardDirs::locateLocal("data", thumbnailTargetFile, true)); QFile downloadTarget(thumbnailTargetUrl.path()); downloadTarget.remove(); m_thumbnailKeys[thumbnailUrl.prettyUrl()] = originalRequestIndex; emit downloadThumbnail(thumbnailUrl, thumbnailTargetUrl); } void DoubanInfoFetcher::processThumbnails(const KUrl &from, const KUrl to) { //Process results int originalRequestIndex = m_thumbnailKeys.value(from.prettyUrl()); MediaItem mediaItem = m_fetchedMatches.value(originalRequestIndex); QString thumbnailFile = to.path(); qWarning() << "thumbnailFile" << thumbnailFile; QPixmap thumbnail = QPixmap(thumbnailFile).scaled(200,200, Qt::KeepAspectRatio, Qt::SmoothTransformation); if (!thumbnail.isNull()) { mediaItem.artwork = QIcon(thumbnail); mediaItem.fields["artworkUrl"] = to.prettyUrl(); mediaItem.hasCustomArtwork = true; } m_fetchedMatches[originalRequestIndex] = mediaItem; m_fetchedCount++; if (m_toFetchCount == m_fetchedCount) { emit infoFetched(m_fetchedMatches.values()); m_isFetching = false; if (!m_timeout) { m_timer->stop(); emit fetchComplete(); emit fetchComplete(this); } m_fetchedCount = 0; m_toFetchCount = 0; } } bangarang-bangarang/src/platform/infofetchers/doubaninfofetcher.h000066400000000000000000000036711166760560600256700ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2011 Ni Hui (shuizhuyuanluo@126.com) * * * 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 . */ #ifndef DOUBANINFOFETCHER_H #define DOUBANINFOFETCHER_H #include "infofetcher.h" #include class Downloader; class DoubanInfoFetcher : public InfoFetcher { Q_OBJECT public: explicit DoubanInfoFetcher(QObject* parent = 0); virtual ~DoubanInfoFetcher(); virtual bool available(const QString &subType); public slots: virtual void fetchInfo(QList mediaList, int maxMatches, bool updateRequiredFields = true, bool fetchArtwork = true); signals: void download(const KUrl &from, const KUrl &to); void downloadThumbnail(const KUrl &from, const KUrl &to); protected slots: virtual void timeout(); private slots: void processOriginalRequest(const KUrl &from, const KUrl to); void processThumbnails(const KUrl &from, const KUrl to); private: QString m_searchAPI; Downloader* m_downloader; Downloader* m_thumbnailDownloader; QHash m_fetchedMatches; QStringList m_requestKeys; QHash m_thumbnailKeys; int m_toFetchCount; int m_fetchedCount; bool isFetchingThumbnail; }; #endif // DOUBANINFOFETCHER_H bangarang-bangarang/src/platform/infofetchers/feedinfofetcher.cpp000066400000000000000000000206231166760560600256520ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "feedinfofetcher.h" #include "../downloader.h" #include "../mediaitemmodel.h" #include #include #include #include #include #include #include FeedInfoFetcher::FeedInfoFetcher(QObject *parent) : InfoFetcher(parent) { m_name = i18n("Feed Info"); m_icon = KIcon("application-rss+xml"); m_about = i18n("This fetcher gets information for the feed at the specified location."); m_downloader = new Downloader(this); connect(this, SIGNAL(download(KUrl,KUrl)), m_downloader, SLOT(download(KUrl,KUrl))); connect(m_downloader, SIGNAL(downloadComplete(KUrl,KUrl)), this, SLOT(gotFeedInfo(KUrl,KUrl))); //Define fetchable fields m_fetchableFields["Audio Feed"] = QStringList() << "artwork" << "title" << "description"; m_fetchableFields["Video Feed"] = QStringList() << "artwork" << "title" << "description"; //Define required fields m_requiredFields["Audio Feed"] = QStringList() << "url"; m_requiredFields["Video Feed"] = QStringList() << "url"; } FeedInfoFetcher::~FeedInfoFetcher() { } bool FeedInfoFetcher::available(const QString &subType) { //Available if connected to network bool networkConnected = (Solid::Networking::status() == Solid::Networking::Connected); bool handlesType = (m_requiredFields[subType].count() > 0); return (networkConnected && handlesType); } void FeedInfoFetcher::fetchInfo(QList mediaList, int maxMatches, bool updateRequiredFields, bool updateArtwork) { Q_UNUSED(maxMatches); m_updateRequiredFields = updateRequiredFields; m_mediaList.clear(); m_requestKeys.clear(); m_updateArtwork = updateArtwork; for (int i = 0; i < mediaList.count(); i++) { MediaItem mediaItem = mediaList.at(i); QString feedUrlStr = mediaItem.fields["url"].toString(); KUrl feedUrl(feedUrlStr); if (!feedUrl.isEmpty()) { m_mediaList.append(mediaItem); m_requestKeys.append(feedUrl.prettyUrl()); //Retrieve feed info QString feedTargetFile = QString("bangarang/temp/%1").arg(feedUrl.fileName()); KUrl feedTargetUrl = KUrl(KStandardDirs::locateLocal("data", feedTargetFile, true)); QFile feedTarget(feedTargetUrl.path()); feedTarget.remove(); setFetching(); emit download(feedUrl, feedTargetUrl); } } } void FeedInfoFetcher::gotFeedInfo(const KUrl &from, const KUrl &to) { //Determine if we got feed or thumbnail bool gotThumbnail = false; if (m_requestKeys.indexOf(from.prettyUrl()) == -1) { if (!m_thumbnailKeys.key(from.prettyUrl()).isEmpty()) { gotThumbnail = true; } } if (!gotThumbnail) { //Find item corresponding to fetched info int foundIndex = m_requestKeys.indexOf(from.prettyUrl()); if (foundIndex == -1) { return; } MediaItem mediaItem = m_mediaList.at(foundIndex); QFile file(to.path()); QDomDocument feedDoc("feed"); feedDoc.setContent(&file); //Iterate through item nodes of the XML document bool mediaItemUpdated = false; KUrl thumbnailUrl; //Determine if RSS or Atom based feed bool isRSS = (feedDoc.elementsByTagName("rss").count() > 0); bool isAtom = (feedDoc.elementsByTagName("feed").count() > 0); if (!isRSS && !isAtom) { return; } QString feedTagName = isRSS ? "channel" : (isAtom ? "feed": QString()); QDomNodeList feeds = feedDoc.elementsByTagName(feedTagName); for (int i = 0; i < feeds.count(); i++) { QDomNodeList nodes = feeds.at(i).childNodes(); for (int j = 0; j < nodes.count(); j++) { if (nodes.at(j).isElement()) { QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "title") { mediaItem.title = element.text(); mediaItem.fields["title"] = mediaItem.title; mediaItemUpdated = true; } else if (element.tagName() == "description" || element.tagName() == "subtitle") { mediaItem.fields["description"] = element.text(); mediaItemUpdated = true; } else if (element.tagName() == "itunes:image") { if (thumbnailUrl.isEmpty() && m_updateArtwork) { thumbnailUrl = KUrl(element.attribute("href")); } } else if (element.tagName() == "logo") { if (thumbnailUrl.isEmpty() && m_updateArtwork) { thumbnailUrl = KUrl(element.text().trimmed()); } } else if (element.tagName() == "image") { QDomNodeList imageNodes = nodes.at(j).childNodes(); for (int k = 0; k < imageNodes.count(); k++) { QDomElement imageElement = imageNodes.at(k).toElement(); if (imageElement.tagName() == "url") { if (thumbnailUrl.isEmpty() && m_updateArtwork) { thumbnailUrl = KUrl(imageElement.text()); } } } } } } } QFile(to.path()).remove(); if (mediaItemUpdated) { m_mediaList.replace(foundIndex, mediaItem); QList fetchedMatches; fetchedMatches.append(mediaItem); emit infoFetched(fetchedMatches); } //Fetch Thumbnail if (thumbnailUrl.isValid()) { m_thumbnailKeys[from.prettyUrl()] = thumbnailUrl.prettyUrl(); QString thumbnailTargetFile = QString("bangarang/thumbnails/%1-%2-%3") .arg(mediaItem.subType()) .arg(mediaItem.title) .arg(thumbnailUrl.fileName()); KUrl thumbnailTargetUrl = KUrl(KStandardDirs::locateLocal("data", thumbnailTargetFile, true)); QFile downloadTarget(thumbnailTargetUrl.path()); downloadTarget.remove(); emit download(thumbnailUrl, thumbnailTargetUrl); } else { m_requestKeys.removeAll(from.prettyUrl()); } } else { //Find item corresponding to fetched thumbnail QString requestKey = m_thumbnailKeys.key(from.prettyUrl()); int foundIndex = m_requestKeys.indexOf(requestKey); if (foundIndex == -1) { return; } //Update artwork QString thumbnailFile = to.path(); QPixmap thumbnail = QPixmap(thumbnailFile).scaled(200,200, Qt::KeepAspectRatio, Qt::SmoothTransformation); if (!thumbnail.isNull()) { MediaItem mediaItem = m_mediaList.at(foundIndex); mediaItem.artwork = QIcon(thumbnail); mediaItem.fields["artworkUrl"] = to.prettyUrl(); mediaItem.hasCustomArtwork = true; m_mediaList.replace(foundIndex, mediaItem); QList fetchedMatches; fetchedMatches.append(mediaItem); emit infoFetched(fetchedMatches); } m_requestKeys.removeAll(requestKey); } if (m_requestKeys.count() == 0) { m_isFetching = false; if (!m_timeout) { m_timer->stop(); emit fetchComplete(); emit fetchComplete(this); } } else if (!m_timeout){ m_timer->start(m_timeoutLength); } } bangarang-bangarang/src/platform/infofetchers/feedinfofetcher.h000066400000000000000000000027761166760560600253300ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef FEEDINFOFETCHER_H #define FEEDINFOFETCHER_H #include "infofetcher.h" #include class Downloader; class FeedInfoFetcher : public InfoFetcher { Q_OBJECT public: FeedInfoFetcher(QObject *parent = 0); ~FeedInfoFetcher(); bool available(const QString &subType); private: Downloader * m_downloader; QStringList m_requestKeys; QHash m_thumbnailKeys; private slots: void gotFeedInfo(const KUrl &from, const KUrl &to); signals: void download(const KUrl &from, const KUrl &to); public slots: void fetchInfo(QList mediaList, int maxMatches = 4, bool updatedRequiredFields = true, bool updateArtwork = true); }; #endif // FEEDINFOFETCHER_H bangarang-bangarang/src/platform/infofetchers/filenameinfofetcher.cpp000066400000000000000000000103111166760560600265200ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "filenameinfofetcher.h" #include "../mediaitemmodel.h" #include "../utilities/utilities.h" #include #include #include FileNameInfoFetcher::FileNameInfoFetcher(QObject *parent) : InfoFetcher(parent) { m_name = i18n("Filename Info"); m_icon = KIcon("quickopen-file"); m_about = i18n("This fetcher uses guesses the season and episode number based on a filename pattern. E.g. 2x23 or S02E23 or 2.23"); //Define fetchable fields m_fetchableFields["TV Show"] = QStringList() << "season" << "episode"; //Define required fields m_requiredFields["TV Show"] = QStringList() << "url"; } FileNameInfoFetcher::~FileNameInfoFetcher() { } bool FileNameInfoFetcher::available(const QString &subType) { bool handlesType = (m_requiredFields[subType].count() > 0); return (handlesType); } void FileNameInfoFetcher::fetchInfo(QList mediaList, int maxMatches, bool updateRequiredFields, bool updateArtwork) { /* * Attempts to guess metadata from MediaItem's filename * It currently only works for season and episode numbers for TV shows * but could potentially be expanded * it's not really necessary for music files as the indexer gets metadata from the files themselves * (Contributed by: Miha Čančula) * TODO: Add more search patterns to cover things like "SeasonXXEpisodeYY", etc. */ Q_UNUSED(maxMatches); QList updatedItems; setFetching(); for (int i = 0; i < mediaList.size(); ++i) { bool updated = false; MediaItem item = mediaList.at(i); if (item.type == "Video" && item.fields["videoType"] == "TV Show") { QString fileName = KUrl(item.fields["url"].toString()).fileName(); // If the url is empty or poinst to to nepomuk's location, // we can't get the filname that way. // So we use the title as a fall-back if (fileName.isEmpty() || fileName.startsWith("nepomuk:/")) { fileName = item.fields["title"].toString(); } // correctly parses names like 2x23 or S02E23 or 2.23 or 2/23 // \d = digit, \D = non-digit QRegExp seasonEpisodeRegex("(\\d+)\\D(\\d+)"); if (seasonEpisodeRegex.indexIn(fileName) > -1) { item.fields["season"] = seasonEpisodeRegex.cap(1).toInt(); item.fields["episodeNumber"] = seasonEpisodeRegex.cap(2).toInt(); updated = true; } else { // for notations like 224 for episode 23 of season 2 // some shows might have more than 10 seasons, but I am unaware of any with more than 100 episodes per season QRegExp noSeparatorRegex("(\\d{3,4})"); if (noSeparatorRegex.indexIn(fileName) > -1) { QString match = noSeparatorRegex.cap(1); item.fields["episodeNumber"] = match.right(2).toInt(); match.chop(2); item.fields["season"] = match.toInt(); updated = true; } } item = Utilities::makeSubtitle(item); } if (updated) { QList matches; matches.append(item); emit infoFetched(matches); } } if (!m_timeout) { emit fetchComplete(); emit fetchComplete(this); } Q_UNUSED(updateRequiredFields); Q_UNUSED(updateArtwork); } bangarang-bangarang/src/platform/infofetchers/filenameinfofetcher.h000066400000000000000000000023251166760560600261730ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef FILENAMEINFOFETCHER_H #define FILENAMEINFOFETCHER_H #include "infofetcher.h" class FileNameInfoFetcher : public InfoFetcher { Q_OBJECT public: FileNameInfoFetcher(QObject *parent = 0); ~FileNameInfoFetcher(); bool available(const QString &subType); public slots: void fetchInfo(QList mediaList, int maxMatches = 4, bool updatedRequiredFields = true, bool updateArtwork = true); }; #endif // FILENAMEINFOFETCHER_H bangarang-bangarang/src/platform/infofetchers/infofetcher.cpp000066400000000000000000000062251166760560600250300ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "infofetcher.h" #include "../mediaitemmodel.h" #include "../utilities/utilities.h" #include #include InfoFetcher::InfoFetcher(QObject * parent) : QObject(parent) { m_name = QString(); m_icon = KIcon("run-build"); m_url = KUrl(); m_isFetching = false; m_timeout = false; m_timeoutLength = 6000; m_timer = new QTimer(this); m_timer->setSingleShot(true); connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); } InfoFetcher::~InfoFetcher() { } QString InfoFetcher::name() { return m_name; } QIcon InfoFetcher::icon() { return m_icon; } KUrl InfoFetcher::url() { return m_url; } QString InfoFetcher::about() { return m_about; } bool InfoFetcher::hasMultipleValues(const QString &field) { QVariant value; if (field == "artworkUrl") { if (m_mediaList.count() == 1) { return false; } else { return true; } } for (int i = 0; i < m_mediaList.count(); i++) { if (value.isNull()) { value = m_mediaList.at(i).fields.value(field); } else if (m_mediaList.at(i).fields.value(field) != value) { return true; } } return false; } QVariant InfoFetcher::commonValue(const QString &field) { QVariant value; for (int i = 0; i < m_mediaList.count(); i++) { if (m_mediaList.at(i).fields.contains(field)) { if (value.isNull()) { value = m_mediaList.at(i).fields.value(field); } else if (m_mediaList.at(i).fields.value(field) != value) { value = QVariant(); break; } } } return value; } QStringList InfoFetcher::valueList(const QString &field) { QStringList value; value << QString(); for (int i = 0; i < m_mediaList.count(); i++) { if (m_mediaList.at(i).fields.contains(field)) { if (value.indexOf(m_mediaList.at(i).fields.value(field).toString()) == -1) { value << m_mediaList.at(i).fields.value(field).toString(); } } } return value; } void InfoFetcher::setFetching() { m_isFetching = true; m_timeout = false; m_timer->start(m_timeoutLength); emit fetching(); } void InfoFetcher::timeout() { kDebug() << "TIMEOUT"; m_timeout = true; m_isFetching = false; emit fetchComplete(); emit fetchComplete(this); } bangarang-bangarang/src/platform/infofetchers/infofetcher.h000066400000000000000000000056651166760560600245040ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef INFOFETCHER_H #define INFOFETCHER_H #include #include #include #include "../mediaitemmodel.h" /* * This is a base clase for fetching meta info for a provided media list. */ class InfoFetcher : public QObject { Q_OBJECT public: InfoFetcher(QObject * parent = 0); ~InfoFetcher(); QString name(); QIcon icon(); KUrl url(); QString about(); virtual QStringList fetchableFields(const QString &subType) { return m_fetchableFields[subType]; } virtual QStringList requiredFields(const QString &subType) { return m_requiredFields[subType]; } virtual bool available(const QString &subType) { Q_UNUSED(subType); return false; } virtual bool isFetching() { return m_isFetching; } public slots: virtual void fetchInfo(QList mediaList, int maxMatches, bool updateRequiredFields = true, bool fetchArtwork = true) { Q_UNUSED(mediaList); Q_UNUSED(maxMatches); Q_UNUSED(updateRequiredFields); Q_UNUSED(fetchArtwork); } protected: QString m_name; QIcon m_icon; KUrl m_url; QList m_mediaList; QHash m_fetchableFields; QHash m_requiredFields; bool m_isFetching; bool m_updateRequiredFields; bool m_updateArtwork; bool m_timeout; QString m_about; QTimer *m_timer; int m_timeoutLength; bool hasMultipleValues(const QString &field); QVariant commonValue(const QString &field); QStringList valueList(const QString &field); void setFetching(); protected slots: virtual void timeout(); signals: void infoFetched(QList fetchedMatches); void updateFetchedInfo(int index, MediaItem match); void fetching(); void fetchComplete(); void fetchComplete(InfoFetcher *infoFetcher); void noResults(InfoFetcher *infoFetcher); }; #endif // INFOFETCHER_H bangarang-bangarang/src/platform/infofetchers/lastfminfofetcher.cpp000066400000000000000000000535061166760560600262430ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "lastfminfofetcher.h" #include "../downloader.h" #include "../mediaitemmodel.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include #include #include LastfmInfoFetcher::LastfmInfoFetcher(QObject *parent) : InfoFetcher(parent) { m_name = i18n("Last.fm"); m_icon = KIcon("bangarang-lastfm"); m_url = KUrl("http://last.fm"); m_about = i18n("Note: This fetcher uses the Last.fm API but is not endorsed or certified by Last.fm."); QString lang = KGlobal::locale()->language(); if (lang.size() > 2) { lang = lang.left(2); } //NOTE: The API key below must be used only in Bangarang. Please do not use this key in other applications. // API keys can be requested from last.fm. m_apiKey = "07066aba654ada984ea6b45032f510c0"; m_artistSearchAPI = QString("http://ws.audioscrobbler.com/2.0/?method=artist.search&api_key=%1&limit=%2&artist=%3").arg(m_apiKey).arg("%1").arg("%2"); m_artistInfoAPI = QString("http://ws.audioscrobbler.com/2.0/?method=artist.getInfo&autocorrect=1&api_key=%1&lang=%2&artist=%3").arg(m_apiKey).arg(lang).arg("%1"); m_albumInfoAPI = QString("http://ws.audioscrobbler.com/2.0/?method=album.getInfo&autocorrect=1&api_key=%1&lang=%2&album=%3&artist=%4").arg(m_apiKey).arg(lang).arg("%1").arg("%2"); m_trackInfoAPI = QString("http://ws.audioscrobbler.com/2.0/?method=track.getInfo&autocorrect=1&api_key=%1&lang=%2&track=%3&artist=%4").arg(m_apiKey).arg(lang).arg("%1").arg("%2"); m_timeout = 20000; m_downloader = new Downloader(this); connect(this, SIGNAL(download(KUrl,KUrl)), m_downloader, SLOT(download(KUrl,KUrl))); connect(m_downloader, SIGNAL(downloadComplete(KUrl,KUrl)), this, SLOT(gotLastfmInfo(KUrl,KUrl))); //Define fetchable fields m_fetchableFields["Music"] = QStringList() << "artwork" << "title" << "description" << "artist" << "album" << "trackNumber" << "genre" << "year" << "duration"; m_fetchableFields["Artist"] = QStringList() << "artwork" << "title" << "description"; //m_fetchableFields["Album"] = QStringList() << "artwork" << "title" << "description"; //Define required fields m_requiredFields["Music"] = QStringList() << "title" << "artist"; m_requiredFields["Artist"] = QStringList() << "title"; //m_requiredFields["Album"] = QStringList() << "title" << "artist"; m_lastRequestTime = QDateTime::currentDateTime(); } bool LastfmInfoFetcher::available(const QString &subType) { /* * We check if the network is connected. As some distributions use ifup to set up their connection * Solid::Networking may return Unknown, as it only checks NetworkManager, not ifup. * A real check to the Lastfm server would be overkill and take too long here. * In general this fetcher should not be available if the Lastfm server cannot be reached. * Maybe we get an idea to handle this properly later on, but there's currently the following problem: * A connection test would take some, so maybe the user wouldn't see this infofetcher directly or * even worse this test would block the whole application. */ Solid::Networking::Status state = Solid::Networking::status(); bool networkConnected = ( state == Solid::Networking::Connected || state == Solid::Networking::Unknown ); bool handlesType = (m_requiredFields[subType].count() > 0); return (networkConnected && handlesType); } void LastfmInfoFetcher::fetchInfo(QList mediaList, int maxMatches, bool updateRequiredFields, bool updateArtwork) { //Wait 5 seconds before processing next request //NOTE: This is intended to prevent abuse of the last.fm api during autofetches. while (m_lastRequestTime.secsTo(QDateTime::currentDateTime()) < 5) { sleep(1); } m_updateRequiredFields = updateRequiredFields; m_mediaList.clear(); m_requestKeys.clear(); m_fetchedMatches.clear(); m_thumbnailKeys.clear(); m_moreInfoKeys.clear(); m_updateArtwork = updateArtwork; for (int i = 0; i < mediaList.count(); i++) { MediaItem mediaItem = mediaList.at(i); QString LastfmUrlStr; if (mediaItem.subType() == "Artist") { m_requestType = ArtistRequest; QString searchTerm = Utilities::titleForRequest(mediaItem.fields["title"].toString()); LastfmUrlStr = m_artistSearchAPI.arg(maxMatches).arg(searchTerm); } else if (mediaItem.subType() == "Album") { m_requestType = AlbumRequest; QString album = mediaItem.fields["title"].toString(); QString artist = mediaItem.fields["artist"].toString(); LastfmUrlStr = m_albumInfoAPI.arg(album).arg(artist); } else if (mediaItem.subType() == "Music") { m_requestType = TrackRequest; QString title = mediaItem.fields["title"].toString(); QString artist = mediaItem.fields["artist"].toString(); LastfmUrlStr = m_trackInfoAPI.arg(title).arg(artist); } KUrl LastfmUrl(LastfmUrlStr); if (!LastfmUrl.isEmpty()) { m_mediaList.append(mediaItem); m_requestKeys.append(LastfmUrl.prettyUrl()); //Retrieve Lastfm info QString LastfmTargetFile = QString("bangarang/temp/Lastfm%1.xml").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzzz")); KUrl LastfmTargetUrl = KUrl(KStandardDirs::locateLocal("data", LastfmTargetFile, true)); QFile LastfmTarget(LastfmTargetUrl.path()); LastfmTarget.remove(); setFetching(); emit download(LastfmUrl, LastfmTargetUrl); } } } void LastfmInfoFetcher::gotLastfmInfo(const KUrl &from, const KUrl &to) { m_lastRequestTime = QDateTime::currentDateTime(); //Process original requests processOriginalRequest(from, to); //Process thumbnails processThumbnails(from, to); //Process more info processMoreInfo(from, to); //Determine if all info for each match set is fetched for (int i = 0; i < m_requestKeys.count(); i++) { //Check if original request is done bool originalRequestDone = (m_requestKeys.at(i) == "done"); if (!originalRequestDone) { continue; } //Check if thumbnail requests for this request are done int thumbnailsRequested = m_thumbnailKeys.keys().count(); QStringList thumbnailValues = m_thumbnailKeys.values(); int thumbnailsRetrieved = thumbnailValues.filter(QRegExp("^done")).count(); bool thumbnailsDone = (thumbnailsRetrieved == thumbnailsRequested) ? true : false; if (!thumbnailsDone) { continue; } //Check if more info requests for this request are done int moreInfosRequested = m_moreInfoKeys.keys().count(); QStringList moreInfoValues = m_moreInfoKeys.values(); int moreInfosRetrieved = moreInfoValues.filter(QRegExp("^done")).count(); bool moreInfosDone = (moreInfosRetrieved == moreInfosRequested) ? true : false; if (!moreInfosDone) { continue; } //If we got here then it means all data for this request has been fetched QList matches = m_fetchedMatches.value(i); emit infoFetched(matches); m_requestKeys.replace(i, "alldone"); } //Check if all requests are complete bool allDone =(m_requestKeys.filter(QRegExp("^alldone")).count() == m_requestKeys.count()); if (allDone) { m_isFetching = false; if (!m_timeout) { m_timer->stop(); emit fetchComplete(); emit fetchComplete(this); } } else if (!m_timeout){ m_timer->start(m_timeoutLength); } } void LastfmInfoFetcher::processOriginalRequest(const KUrl &from, const KUrl to) { //Determine if we got original request and process int originalRequestIndex = m_requestKeys.indexOf(from.prettyUrl()); bool isOriginalRequest = (originalRequestIndex != -1); if (!isOriginalRequest) { return; } //Process results MediaItem mediaItem = m_mediaList.at(originalRequestIndex); QFile file(to.path()); QDomDocument LastfmDoc("Lastfm"); LastfmDoc.setContent(&file); QHash thumbnailUrls; QHash moreInfoUrls; QList fetchedMatches; //Read Artist results if (m_requestType == ArtistRequest) { //Iterate through item nodes of the Lastfm XML document QDomNodeList artists = LastfmDoc.elementsByTagName("artist"); for (int i = 0; i < artists.count(); i++) { MediaItem match = mediaItem; //Clear artwork match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); QDomNodeList nodes = artists.at(i).childNodes(); bool gotThumbnailUrl = false; for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "name") { match.title = element.text(); match.fields["title"] = match.title; QString artistInfoUrlStr = m_artistInfoAPI.arg(match.title); moreInfoUrls.insert(fetchedMatches.count(), artistInfoUrlStr); } else if (element.tagName() == "url") { match.fields["relatedTo"] = QStringList(element.text()); } else if (element.tagName() == "image" && element.attribute("size") == "large") { if (gotThumbnailUrl || !m_updateArtwork) { continue; } QString imageUrl = element.text(); KUrl thumbnailUrl = KUrl(imageUrl); if (thumbnailUrl.isValid()) { thumbnailUrls.insert(fetchedMatches.count(), thumbnailUrl); gotThumbnailUrl = true; break; } } } fetchedMatches.append(match); } } //Read Album results if (m_requestType == AlbumRequest) { //Iterate through item nodes of the Lastfm XML document QDomNodeList albums = LastfmDoc.elementsByTagName("album"); for (int i = 0; i < albums.count(); i++) { MediaItem match = mediaItem; //Clear artwork match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); QDomNodeList nodes = albums.at(i).childNodes(); bool gotThumbnailUrl = false; for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "name") { match.title = element.text(); match.fields["title"] = match.title; } else if (element.tagName() == "wiki") { QDomElement descriptionElement = nodes.at(j).firstChildElement("summary"); match.fields["description"] = descriptionElement.text(); } else if (element.tagName() == "url") { match.fields["relatedTo"] = QStringList(element.text()); } else if (element.tagName() == "image" && element.attribute("size") == "large") { if (gotThumbnailUrl || !m_updateArtwork) { continue; } QString imageUrl = element.text(); KUrl thumbnailUrl = KUrl(imageUrl); if (thumbnailUrl.isValid()) { thumbnailUrls.insert(fetchedMatches.count(), thumbnailUrl); gotThumbnailUrl = true; break; } } } fetchedMatches.append(match); } } if (m_requestType == TrackRequest) { //Iterate through item nodes of the Lastfm XML document QDomNodeList tracks = LastfmDoc.elementsByTagName("track"); for (int i = 0; i < tracks.count(); i++) { MediaItem match = mediaItem; QDomNodeList nodes = tracks.at(i).childNodes(); bool gotThumbnailUrl = false; QStringList artists; QStringList genres; for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "name") { match.title = element.text(); match.fields["title"] = match.title; } else if (element.tagName() == "wiki") { QDomElement descriptionElement = nodes.at(j).firstChildElement("summary"); match.fields["description"] = descriptionElement.text(); } else if (element.tagName() == "artist") { QDomElement artistNameElement = nodes.at(j).firstChildElement("name"); artists.append(artistNameElement.text()); match.fields["artist"] = artists; } else if (element.tagName() == "album") { QDomElement albumTitleElement = nodes.at(j).firstChildElement("title"); match.fields["album"] = albumTitleElement.text(); match.fields["trackNumber"] = element.attribute("position").toInt(); QDomNodeList albumNodes = nodes.at(j).childNodes(); for (int k = 0; k < albumNodes.count(); k++) { if (gotThumbnailUrl || !m_updateArtwork) { continue; } QDomElement albumElement = albumNodes.at(k).toElement(); if (albumElement.tagName() == "image" && albumElement.attribute("size") == "large") { QString imageUrl = albumElement.text(); KUrl thumbnailUrl = KUrl(imageUrl); if (thumbnailUrl.isValid()) { thumbnailUrls.insert(fetchedMatches.count(), thumbnailUrl); gotThumbnailUrl = true; break; } } } } else if (element.tagName() == "duration") { int duration = element.text().toInt(); if (duration > 0) { match.fields["duration"] = duration; match.duration = Utilities::durationString(duration); } } else if (element.tagName() == "url") { match.fields["relatedTo"] = QStringList(element.text()); } else if (element.tagName() == "toptags") { QDomNodeList tagNodes = nodes.at(j).childNodes(); for (int k = 0; k < qMin(3, tagNodes.count()); k++) { QDomElement tagElement = tagNodes.at(k).firstChildElement("name"); QString genre = Utilities::capitalize(tagElement.text()); genres.append(genre); match.fields["genre"] = genres; } } } fetchedMatches.append(match); } } QFile(to.path()).remove(); //Add fetched matches to collection of fetched matches m_fetchedMatches.insert(originalRequestIndex, fetchedMatches); //Launch Thumbnail requests for (int i = 0; i < thumbnailUrls.keys().count(); i++) { int matchIndex = thumbnailUrls.keys().at(i); MediaItem match = fetchedMatches.at(matchIndex); KUrl thumbnailUrl = thumbnailUrls.value(matchIndex); QString key = QString("%1,%2").arg(originalRequestIndex).arg(matchIndex); m_thumbnailKeys.insert(key, thumbnailUrl.prettyUrl()); QString thumbnailTargetFile = QString("bangarang/thumbnails/%1-Lastfm-%2-%3") .arg(match.subType()) .arg(match.fields["LastfmID"].toString()) .arg(thumbnailUrl.fileName()); KUrl thumbnailTargetUrl = KUrl(KStandardDirs::locateLocal("data", thumbnailTargetFile, true)); QFile downloadTarget(thumbnailTargetUrl.path()); downloadTarget.remove(); m_timer->start(m_timeoutLength); emit download(thumbnailUrl, thumbnailTargetUrl); } //Launch More info requests for (int i = 0; i < moreInfoUrls.count(); i++) { int matchIndex = moreInfoUrls.keys().at(i); KUrl moreInfoUrl = moreInfoUrls.value(matchIndex); QString key = QString("%1,%2").arg(originalRequestIndex).arg(matchIndex); m_moreInfoKeys.insert(key,moreInfoUrl.prettyUrl()); QString moreInfoTargetFile = QString("bangarang/temp/LastfmInfo-%1-%2.xml") .arg(key) .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); KUrl moreInfoTargetUrl = KUrl(KStandardDirs::locateLocal("data", moreInfoTargetFile, true)); QFile moreInfoTarget(moreInfoTargetUrl.path()); moreInfoTarget.remove(); m_timer->start(m_timeoutLength); emit download(moreInfoUrl, moreInfoTargetUrl); } //Mark request done m_requestKeys.replace(originalRequestIndex, "done"); } void LastfmInfoFetcher::processThumbnails(const KUrl &from, const KUrl to) { //Determine we got a thumbnail request QString requestKey = m_thumbnailKeys.key(from.prettyUrl()); if (requestKey.isEmpty()) { return; } //Mark thumbnail request done m_thumbnailKeys.insert(requestKey, "done"); //Process results int originalRequestIndex = requestKey.split(",").at(0).toInt(); int matchesIndex = requestKey.split(",").at(1).toInt(); if (!m_fetchedMatches.contains(originalRequestIndex)) { return; } QList matches = m_fetchedMatches.value(originalRequestIndex); MediaItem match = matches.at(matchesIndex); QString thumbnailFile = to.path(); QPixmap thumbnail = QPixmap(thumbnailFile).scaled(200,200, Qt::KeepAspectRatio, Qt::SmoothTransformation); if (!thumbnail.isNull()) { match.artwork = QIcon(thumbnail); match.fields["artworkUrl"] = to.prettyUrl(); match.hasCustomArtwork = true; } else { match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); match.hasCustomArtwork = false; } matches.replace(matchesIndex, match); m_fetchedMatches[originalRequestIndex] = matches; } void LastfmInfoFetcher::processMoreInfo(const KUrl &from, const KUrl to) { //Determine if we got original request and process QString requestKey = m_moreInfoKeys.key(from.prettyUrl()); if (requestKey.isEmpty()) { return; } //Mark more info request done m_moreInfoKeys.insert(requestKey, "done"); //Process results int originalRequestIndex = requestKey.split(",").at(0).toInt(); int matchesIndex = requestKey.split(",").at(1).toInt(); if (!m_fetchedMatches.contains(originalRequestIndex)) { return; } QList matches = m_fetchedMatches.value(originalRequestIndex); MediaItem match = matches.at(matchesIndex); QFile file(to.path()); QDomDocument LastfmDoc("LastfmInfo"); LastfmDoc.setContent(&file); kDebug() << "GOT MORE INFO!!!!"; if (m_requestType == ArtistRequest) { //Iterate through item nodes of the Lastfm XML document QDomNodeList artists = LastfmDoc.elementsByTagName("artist"); if (artists.count() == 0) { return; } match.fields["description"] = QString(); QDomNodeList nodes = artists.at(0).childNodes(); for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "bio") { QDomElement descriptionElement = nodes.at(j).firstChildElement("summary"); QTextEdit converter; converter.setAcceptRichText(true); converter.setHtml(descriptionElement.text()); QString description = converter.toPlainText(); match.fields["description"] = description; } } } QFile(to.path()).remove(); matches.replace(matchesIndex, match); m_fetchedMatches[originalRequestIndex] = matches; } void LastfmInfoFetcher::timeout() { //Return any remaining matches that have not yet been returned if (!m_fetchedMatches.isEmpty()) { foreach (QList matches, m_fetchedMatches) { emit infoFetched(matches); } } InfoFetcher::timeout(); } bangarang-bangarang/src/platform/infofetchers/lastfminfofetcher.h000066400000000000000000000042501166760560600257000ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef LASTFMINFOFETCHER_H #define LASTFMINFOFETCHER_H #include "infofetcher.h" #include #include class Downloader; class LastfmInfoFetcher : public InfoFetcher { Q_OBJECT public: enum RequestType {ArtistRequest = 0, AlbumRequest = 1, TrackRequest = 2}; LastfmInfoFetcher(QObject *parent = 0); bool available(const QString &subType); private: QString m_apiKey; QString m_artistSearchAPI; QString m_artistInfoAPI; QString m_albumInfoAPI; QString m_trackInfoAPI; Downloader * m_downloader; QStringList m_requestKeys; QHash > m_fetchedMatches; QHash m_thumbnailKeys; QHash m_moreInfoKeys; RequestType m_requestType; QDateTime m_lastRequestTime; void processOriginalRequest(const KUrl &from, const KUrl to); void processThumbnails(const KUrl &from, const KUrl to); void processMoreInfo(const KUrl &from, const KUrl to); private slots: void gotLastfmInfo(const KUrl &from, const KUrl &to); void timeout(); signals: void download(const KUrl &from, const KUrl &to); public slots: void fetchInfo(QList mediaList, int maxMatches = 4, bool updatedRequiredFields = true, bool updateArtwork = true);}; #endif // LASTFMINFOFETCHER_H bangarang-bangarang/src/platform/infofetchers/tmdbinfofetcher.cpp000066400000000000000000000540021166760560600256730ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "tmdbinfofetcher.h" #include "../downloader.h" #include "../mediaitemmodel.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include TMDBInfoFetcher::TMDBInfoFetcher(QObject *parent) : InfoFetcher(parent) { m_name = i18n("TMDb"); m_icon = KIcon("bangarang-tmdb"); m_url = KUrl("http://themoviedb.org"); m_about = i18n("Note: This fetcher uses the TMDb API but is not endorsed or certified by TMDb."); QString lang = KGlobal::locale()->language(); if (lang.size() > 2) { lang = lang.left(2); } //NOTE: The API key below must be used only in Bangarang. Please do not use this key in other applications. // API keys can be requested from themoviedb.org. m_apiKey = "efa7a3197ca2ab2b9af306580c42075c"; m_movieSearchAPI = QString("http://api.themoviedb.org/2.1/Movie.search/%1/xml/%2/%3").arg(lang).arg(m_apiKey).arg("%1"); m_movieInfoAPI = QString("http://api.themoviedb.org/2.1/Movie.getInfo/%1/xml/%2/%3").arg(lang).arg(m_apiKey).arg("%1"); m_personSearchAPI = QString("http://api.themoviedb.org/2.1/Person.search/%1/xml/%2/%3").arg(lang).arg(m_apiKey).arg("%1"); m_timeout = 20000; m_downloader = new Downloader(this); connect(this, SIGNAL(download(KUrl,KUrl)), m_downloader, SLOT(download(KUrl,KUrl))); connect(m_downloader, SIGNAL(downloadComplete(KUrl,KUrl)), this, SLOT(gotTMDBInfo(KUrl,KUrl))); //Define fetchable fields m_fetchableFields["Movie"] = QStringList() << "artwork" << "title" << "description" << "actor" << "director" << "writer" << "audienceRating"; m_fetchableFields["Actor"] = QStringList() << "artwork" << "title" << "description"; m_fetchableFields["Director"] = QStringList() << "artwork" << "title" << "description"; m_fetchableFields["Writer"] = QStringList() << "artwork" << "title" << "description"; m_fetchableFields["Producer"] = QStringList() << "artwork" << "title" << "description"; //Define required fields m_requiredFields["Movie"] = QStringList() << "title"; m_requiredFields["Actor"] = QStringList() << "title"; m_requiredFields["Director"] = QStringList() << "title"; m_requiredFields["Writer"] = QStringList() << "title"; m_requiredFields["Producer"] = QStringList() << "title"; m_lastRequestTime = QDateTime::currentDateTime(); } bool TMDBInfoFetcher::available(const QString &subType) { /* * We check if the network is connected. As some distributions use ifup to set up their connection * Solid::Networking may return Unknown, as it only checks NetworkManager, not ifup. * A real check to the TMDb server would be overkill and take too long here. * In general this fetcher should not be available if the TMDb server cannot be reached. * Maybe we get an idea to handle this properly later on, but there's currently the following problem: * A connection test would take some, so maybe the user wouldn't see this infofetcher directly or * even worse this test would block the whole application. */ Solid::Networking::Status state = Solid::Networking::status(); bool networkConnected = ( state == Solid::Networking::Connected || state == Solid::Networking::Unknown ); bool handlesType = (m_requiredFields[subType].count() > 0); return (networkConnected && handlesType); } void TMDBInfoFetcher::fetchInfo(QList mediaList, int maxMatches, bool updateRequiredFields, bool updateArtwork) { //Wait 5 seconds before processing next request //NOTE: This is intended to prevent abuse of the tmdb api during autofetches. while (m_lastRequestTime.secsTo(QDateTime::currentDateTime()) < 5) { sleep(1); } m_updateRequiredFields = updateRequiredFields; m_maxMatches = maxMatches; m_mediaList.clear(); m_requestKeys.clear(); m_fetchedMatches.clear(); m_thumbnailKeys.clear(); m_moreInfoKeys.clear(); m_updateArtwork = updateArtwork; for (int i = 0; i < mediaList.count(); i++) { MediaItem mediaItem = mediaList.at(i); QString searchTerm; QString TMDBUrlStr; if (mediaItem.subType() == "Movie") { m_requestType = MovieRequest; searchTerm = Utilities::titleForRequest(mediaItem.fields["title"].toString()); TMDBUrlStr = m_movieSearchAPI.arg(searchTerm); } else if (mediaItem.subType() == "Actor" || mediaItem.subType() == "Writer" || mediaItem.subType() == "Director" || mediaItem.subType() == "Producer") { m_requestType = PersonRequest; searchTerm = mediaItem.fields["title"].toString(); TMDBUrlStr = m_personSearchAPI.arg(searchTerm); } KUrl TMDBUrl(TMDBUrlStr); if (!TMDBUrl.isEmpty()) { m_mediaList.append(mediaItem); m_requestKeys.append(TMDBUrl.prettyUrl()); //Retrieve TMDB info QString TMDBTargetFile = QString("bangarang/temp/TMDB%1.xml").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzzz")); KUrl TMDBTargetUrl = KUrl(KStandardDirs::locateLocal("data", TMDBTargetFile, true)); QFile TMDBTarget(TMDBTargetUrl.path()); TMDBTarget.remove(); setFetching(); emit download(TMDBUrl, TMDBTargetUrl); } } } void TMDBInfoFetcher::gotTMDBInfo(const KUrl &from, const KUrl &to) { m_lastRequestTime = QDateTime::currentDateTime(); //Process original requests processOriginalRequest(from, to); //Process thumbnails processThumbnails(from, to); //Process more info processMoreInfo(from, to); //Determine if all info for each match set is fetched for (int i = 0; i < m_requestKeys.count(); i++) { //Check if original request is done bool originalRequestDone = (m_requestKeys.at(i) == "done"); if (!originalRequestDone) { continue; } //Check if thumbnail requests for this request are done int thumbnailsRequested = m_thumbnailKeys.keys().count(); QStringList thumbnailValues = m_thumbnailKeys.values(); int thumbnailsRetrieved = thumbnailValues.filter(QRegExp("^done")).count(); bool thumbnailsDone = (thumbnailsRetrieved == thumbnailsRequested) ? true : false; if (!thumbnailsDone) { continue; } //Check if more info requests for this request are done int moreInfosRequested = m_moreInfoKeys.keys().count(); QStringList moreInfoValues = m_moreInfoKeys.values(); int moreInfosRetrieved = moreInfoValues.filter(QRegExp("^done")).count(); bool moreInfosDone = (moreInfosRetrieved == moreInfosRequested) ? true : false; if (!moreInfosDone) { continue; } //If we got here then it means all data for this request has been fetched QList matches = m_fetchedMatches.value(i); emit infoFetched(matches); m_requestKeys.replace(i, "alldone"); } //Check if all requests are complete bool allDone =(m_requestKeys.filter(QRegExp("^alldone")).count() == m_requestKeys.count()); if (allDone) { m_isFetching = false; if (!m_timeout) { m_timer->stop(); emit fetchComplete(); emit fetchComplete(this); } } else if (!m_timeout){ m_timer->start(m_timeoutLength); } } void TMDBInfoFetcher::processOriginalRequest(const KUrl &from, const KUrl to) { //Determine if we got original request and process int originalRequestIndex = m_requestKeys.indexOf(from.prettyUrl()); bool isOriginalRequest = (originalRequestIndex != -1); if (!isOriginalRequest) { return; } //Process results MediaItem mediaItem = m_mediaList.at(originalRequestIndex); QFile file(to.path()); QDomDocument TMDBDoc("TMDB"); TMDBDoc.setContent(&file); QHash thumbnailUrls; QHash moreInfoUrls; QList fetchedMatches; //Read Movie results if (m_requestType == MovieRequest) { //Iterate through item nodes of the TMDB XML document QDomNodeList movies = TMDBDoc.elementsByTagName("movie"); for (int i = 0; i < qMin(movies.count(), m_maxMatches); i++) { MediaItem match = mediaItem; //Clear artwork match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); QDomNodeList nodes = movies.at(i).childNodes(); bool gotThumbnailUrl = false; for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "name") { match.title = element.text(); match.fields["title"] = match.title; } else if (element.tagName() == "overview") { match.fields["description"] = element.text(); } else if (element.tagName() == "released") { QDate releaseDate = QDate::fromString(element.text(), "yyyy-MM-dd"); if (releaseDate.isValid()) { match.fields["releaseDate"] = releaseDate; match.fields["year"] = releaseDate.year(); } } else if (element.tagName() == "url") { match.fields["relatedTo"] = QStringList(element.text()); } else if (element.tagName() == "certification") { match.fields["audienceRating"] = element.text(); } else if (element.tagName() == "id") { QString id = element.text(); match.fields["TMDBID"] = id; QString movieInfoUrlStr = m_movieInfoAPI.arg(id); moreInfoUrls.insert(fetchedMatches.count(), movieInfoUrlStr); } else if (element.tagName() == "images") { QDomNodeList imageNodes = nodes.at(j).childNodes(); for (int k = 0; k < imageNodes.count(); k++) { QDomElement imageElement = imageNodes.at(k).toElement(); if (!(imageElement.tagName() == "image" && imageElement.attribute("type") == "poster" && imageElement.attribute("size") == "cover")) { continue; } if (gotThumbnailUrl || !m_updateArtwork) { continue; } QString imageUrl = imageElement.attribute("url"); KUrl thumbnailUrl = KUrl(imageUrl); if (thumbnailUrl.isValid()) { thumbnailUrls.insert(fetchedMatches.count(), thumbnailUrl); gotThumbnailUrl = true; break; } } } } fetchedMatches.append(match); } } //Read Person results if (m_requestType == PersonRequest) { //Iterate through item nodes of the TMDB XML document QDomNodeList movies = TMDBDoc.elementsByTagName("person"); for (int i = 0; i < movies.count(); i++) { MediaItem match = mediaItem; //Clear artwork match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); QDomNodeList nodes = movies.at(i).childNodes(); bool gotThumbnailUrl = false; for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "name") { match.title = element.text(); match.fields["title"] = match.title; } else if (element.tagName() == "biography") { match.fields["description"] = element.text(); } else if (element.tagName() == "url") { match.fields["relatedTo"] = QStringList(element.text()); } else if (element.tagName() == "images") { QDomNodeList imageNodes = nodes.at(j).childNodes(); for (int k = 0; k < imageNodes.count(); k++) { QDomElement imageElement = imageNodes.at(k).toElement(); if (!(imageElement.tagName() == "image" && imageElement.attribute("type") == "profile" && imageElement.attribute("size") == "profile")) { continue; } if (gotThumbnailUrl || !m_updateArtwork) { continue; } QString imageUrl = imageElement.attribute("url"); KUrl thumbnailUrl = KUrl(imageUrl); if (thumbnailUrl.isValid()) { thumbnailUrls.insert(fetchedMatches.count(), thumbnailUrl); gotThumbnailUrl = true; break; } } } } fetchedMatches.append(match); } } QFile(to.path()).remove(); //Add fetched matches to collection of fetched matches m_fetchedMatches.insert(originalRequestIndex, fetchedMatches); //Launch Thumbnail requests for (int i = 0; i < thumbnailUrls.keys().count(); i++) { int matchIndex = thumbnailUrls.keys().at(i); MediaItem match = fetchedMatches.at(matchIndex); KUrl thumbnailUrl = thumbnailUrls.value(matchIndex); QString key = QString("%1,%2").arg(originalRequestIndex).arg(matchIndex); m_thumbnailKeys.insert(key, thumbnailUrl.prettyUrl()); QString thumbnailTargetFile = QString("bangarang/thumbnails/%1-TMDB-%2-%3") .arg(match.subType()) .arg(match.fields["TMDBID"].toString()) .arg(thumbnailUrl.fileName()); KUrl thumbnailTargetUrl = KUrl(KStandardDirs::locateLocal("data", thumbnailTargetFile, true)); QFile downloadTarget(thumbnailTargetUrl.path()); downloadTarget.remove(); m_timer->start(m_timeoutLength); emit download(thumbnailUrl, thumbnailTargetUrl); } //Launch More info requests for (int i = 0; i < moreInfoUrls.count(); i++) { int matchIndex = moreInfoUrls.keys().at(i); KUrl moreInfoUrl = moreInfoUrls.value(matchIndex); QString key = QString("%1,%2").arg(originalRequestIndex).arg(matchIndex); m_moreInfoKeys.insert(key,moreInfoUrl.prettyUrl()); QString moreInfoTargetFile = QString("bangarang/temp/TMDBInfo-%1-%2.xml") .arg(key) .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); KUrl moreInfoTargetUrl = KUrl(KStandardDirs::locateLocal("data", moreInfoTargetFile, true)); QFile moreInfoTarget(moreInfoTargetUrl.path()); moreInfoTarget.remove(); m_timer->start(m_timeoutLength); emit download(moreInfoUrl, moreInfoTargetUrl); } //Mark request done m_requestKeys.replace(originalRequestIndex, "done"); } void TMDBInfoFetcher::processThumbnails(const KUrl &from, const KUrl to) { //Determine we got a thumbnail request QString requestKey = m_thumbnailKeys.key(from.prettyUrl()); if (requestKey.isEmpty()) { return; } //Mark thumbnail request done m_thumbnailKeys.insert(requestKey, "done"); //Process results int originalRequestIndex = requestKey.split(",").at(0).toInt(); int matchesIndex = requestKey.split(",").at(1).toInt(); if (!m_fetchedMatches.contains(originalRequestIndex)) { return; } QList matches = m_fetchedMatches.value(originalRequestIndex); MediaItem match = matches.at(matchesIndex); QString thumbnailFile = to.path(); QPixmap thumbnail = QPixmap(thumbnailFile).scaled(200,200, Qt::KeepAspectRatio, Qt::SmoothTransformation); if (!thumbnail.isNull()) { match.artwork = QIcon(thumbnail); match.fields["artworkUrl"] = to.prettyUrl(); match.hasCustomArtwork = true; } else { match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); match.hasCustomArtwork = false; } matches.replace(matchesIndex, match); m_fetchedMatches[originalRequestIndex] = matches; } void TMDBInfoFetcher::processMoreInfo(const KUrl &from, const KUrl to) { //Determine if we got original request and process QString requestKey = m_moreInfoKeys.key(from.prettyUrl()); if (requestKey.isEmpty()) { return; } //Mark more info request done m_moreInfoKeys.insert(requestKey, "done"); //Process results int originalRequestIndex = requestKey.split(",").at(0).toInt(); int matchesIndex = requestKey.split(",").at(1).toInt(); if (!m_fetchedMatches.contains(originalRequestIndex)) { return; } QList matches = m_fetchedMatches.value(originalRequestIndex); MediaItem match = matches.at(matchesIndex); QFile file(to.path()); QDomDocument TMDBDoc("TMDBInfo"); TMDBDoc.setContent(&file); //Iterate through item nodes of the TMDB XML document QDomNodeList movies = TMDBDoc.elementsByTagName("movie"); if (movies.count() == 0) { return; } QDomNodeList nodes = movies.at(0).childNodes(); for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "runtime") { int duration = element.text().toInt()*60; //tmdb duration is in minutes match.fields["duration"] = duration; match.duration = Utilities::durationString(duration); } else if (element.tagName() == "categories") { QDomNodeList genreNodes = nodes.at(j).childNodes(); QStringList genres; for (int k = 0; k < genreNodes.count(); k++) { QDomElement genreElement = genreNodes.at(k).toElement(); if (!(genreElement.tagName() == "category" && genreElement.attribute("type").toLower() == "genre")) { continue; } QString genre = genreElement.attribute("name").trimmed(); if (!genre.isEmpty()) { genres.append(genre); } } match.fields["genre"] = genres; } else if (element.tagName() == "cast") { QDomNodeList castNodes = nodes.at(j).childNodes(); QStringList actors; QStringList directors; QStringList writers; QStringList producers; for (int k = 0; k < castNodes.count(); k++) { QDomElement castElement = castNodes.at(k).toElement(); QString job = castElement.attribute("job").toLower(); if (!(castElement.tagName() == "person" && (job == "actor" || job == "screenplay" || job == "writer" || job == "director" || job == "executive producer" || job == "producer"))) { continue; } if (job == "actor") { QString actor = castElement.attribute("name"); if (!actor.isEmpty()) { actors.append(actor); } } if (job == "screenplay" || job == "writer") { QString writer = castElement.attribute("name"); if (!writer.isEmpty()) { writers.append(writer); } } if (job == "director") { QString director = castElement.attribute("name"); if (!director.isEmpty()) { directors.append(director); } } if (job == "execute producer" || job == "producer") { QString producer = castElement.attribute("name"); if (!producer.isEmpty()) { producers.append(producer); } } } match.fields["actor"] = actors; match.fields["director"] = directors; match.fields["writer"] = writers; match.fields["producer"] = producers; } } QFile(to.path()).remove(); matches.replace(matchesIndex, match); m_fetchedMatches[originalRequestIndex] = matches; } void TMDBInfoFetcher::timeout() { //Return any remaining matches that have not yet been returned if (!m_fetchedMatches.isEmpty()) { foreach (QList matches, m_fetchedMatches) { emit infoFetched(matches); } } InfoFetcher::timeout(); } bangarang-bangarang/src/platform/infofetchers/tmdbinfofetcher.h000066400000000000000000000041311166760560600253360ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef TMDBINFOFETCHER_H #define TMDBINFOFETCHER_H #include "infofetcher.h" #include class Downloader; class TMDBInfoFetcher : public InfoFetcher { Q_OBJECT public: enum RequestType {MovieRequest = 0, PersonRequest = 1}; TMDBInfoFetcher(QObject *parent = 0); bool available(const QString &subType); private: QString m_apiKey; QString m_movieSearchAPI; QString m_movieInfoAPI; QString m_personSearchAPI; Downloader * m_downloader; QStringList m_requestKeys; QHash > m_fetchedMatches; QHash m_thumbnailKeys; QHash m_moreInfoKeys; RequestType m_requestType; int m_maxMatches; QDateTime m_lastRequestTime; void processOriginalRequest(const KUrl &from, const KUrl to); void processThumbnails(const KUrl &from, const KUrl to); void processMoreInfo(const KUrl &from, const KUrl to); private slots: void gotTMDBInfo(const KUrl &from, const KUrl &to); void timeout(); signals: void download(const KUrl &from, const KUrl &to); public slots: void fetchInfo(QList mediaList, int maxMatches = 4, bool updateRequiredFields = true, bool updateArtwork = true);}; #endif // TMDBINFOFETCHER_H bangarang-bangarang/src/platform/infofetchers/tvdbinfofetcher.cpp000066400000000000000000000464371166760560600257210ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "tvdbinfofetcher.h" #include "../downloader.h" #include "../mediaitemmodel.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include TVDBInfoFetcher::TVDBInfoFetcher(QObject *parent) : InfoFetcher(parent) { m_name = i18n("TVDB"); m_icon = KIcon("bangarang-tvdb"); m_url = KUrl("http://thetvdb.com"); m_about = i18n("Note: This fetcher uses theTVDB.com API. Please help improve theTVDB.com information by clicking the link."); QString lang = KGlobal::locale()->language(); if (lang.size() > 2) { lang = lang.left(2); } //NOTE: The API key below must be used only in Bangarang. Please do not use this key in other applications. // API keys can be requested from thetvdb.org. m_apiKey = "60DD172338AFC0A1"; m_seriesSearchAPI = QString("http://www.thetvdb.com/api/GetSeries.php?seriesname=%2&language=%1").arg(lang).arg("%1"); m_seriesInfoAPI = QString("%3/api/%1/series/%4/all/%2.xml").arg(m_apiKey).arg(lang).arg("%1").arg("%2"); m_updateRequestAPI = QString("http://www.thetvdb.com/api/Updates.php?type=series&time=%1"); m_mirrorRequestAPI = QString("http://www.thetvdb.com/api/%1/mirrors.xml").arg(m_apiKey); m_serverTimeRequestAPI = QString("http://www.thetvdb.com/api/Updates.php?type=none"); m_timeout = 20000; m_downloader = new Downloader(this); connect(this, SIGNAL(download(KUrl,KUrl)), m_downloader, SLOT(download(KUrl,KUrl))); connect(m_downloader, SIGNAL(downloadComplete(KUrl,KUrl)), this, SLOT(gotTVDBInfo(KUrl,KUrl))); //Define fetchable fields m_fetchableFields["TV Series"] = QStringList() << "artwork" << "title" << "description" << "actor" << "director" << "writer" << "audienceRating"; m_fetchableFields["TV Show"] = QStringList() << "artwork" << "title" << "description"; //Define required fields m_requiredFields["TV Series"] = QStringList() << "title"; m_requiredFields["TV Show"] = QStringList() << "seriesName" << "season" << "episodeNumber"; m_lastRequestTime = QDateTime::currentDateTime(); m_mirror = "http://thetvdb.com"; } bool TVDBInfoFetcher::available(const QString &subType) { /* * We check if the network is connected. As some distributions use ifup to set up their connection * Solid::Networking may return Unknown, as it only checks NetworkManager, not ifup. * A real check to the TVDB server would be overkill and take too long here. * In general this fetcher should not be available if the TVDB server cannot be reached. * Maybe we get an idea to handle this properly later on, but there's currently the following problem: * A connection test would take some, so maybe the user wouldn't see this infofetcher directly or * even worse this test would block the whole application. */ Solid::Networking::Status state = Solid::Networking::status(); bool networkConnected = ( state == Solid::Networking::Connected || state == Solid::Networking::Unknown ); bool handlesType = (m_requiredFields[subType].count() > 0); return (networkConnected && handlesType); } void TVDBInfoFetcher::fetchInfo(QList mediaList, int maxMatches, bool updateRequiredFields, bool updateArtwork) { //Wait 5 seconds before processing next request //NOTE: This is intended to prevent abuse of the TVDB api during autofetches. while (m_lastRequestTime.secsTo(QDateTime::currentDateTime()) < 5) { sleep(1); } m_updateRequiredFields = updateRequiredFields; m_maxMatches = maxMatches; m_mediaList.clear(); m_requestKeys.clear(); m_fetchedMatches.clear(); m_seriesInfoKeys.clear();; m_thumbnailKeys.clear(); m_updateArtwork = updateArtwork; for (int i = 0; i < mediaList.count(); i++) { MediaItem mediaItem = mediaList.at(i); QString searchTerm; QString TVDBUrlStr; if (mediaItem.subType() == "TV Series") { m_requestType = SeriesRequest; searchTerm = Utilities::titleForRequest(mediaItem.fields["title"].toString()); TVDBUrlStr = m_seriesSearchAPI.arg(searchTerm); } else if (mediaItem.subType() == "TV Show") { m_requestType = EpisodeRequest; searchTerm = Utilities::titleForRequest(mediaItem.fields["seriesName"].toString()); TVDBUrlStr = m_seriesSearchAPI.arg(searchTerm); } KUrl TVDBUrl(TVDBUrlStr); if (!TVDBUrl.isEmpty()) { m_mediaList.append(mediaItem); m_requestKeys.append(TVDBUrl.prettyUrl()); //Retrieve TVDB info QString TVDBTargetFile = QString("bangarang/temp/tvdb%1.xml").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzzz")); KUrl TVDBTargetUrl = KUrl(KStandardDirs::locateLocal("data", TVDBTargetFile, true)); QFile TVDBTarget(TVDBTargetUrl.path()); TVDBTarget.remove(); setFetching(); emit download(TVDBUrl, TVDBTargetUrl); } } } void TVDBInfoFetcher::gotTVDBInfo(const KUrl &from, const KUrl &to) { m_lastRequestTime = QDateTime::currentDateTime(); //Process original requests processOriginalRequest(from, to); //Process original requests processSeriesInfoRequest(from, to); //Process thumbnails processThumbnails(from, to); //Determine if all info for each match set is fetched for (int i = 0; i < m_requestKeys.count(); i++) { //Check if original request is done bool originalRequestDone = (m_requestKeys.at(i) == "done"); if (!originalRequestDone) { continue; } //Check if more info requests for this request are done int seriesInfosRequested = m_seriesInfoKeys.keys().count(); QStringList seriesInfoValues = m_seriesInfoKeys.values(); int seriesInfosRetrieved = seriesInfoValues.filter(QRegExp("^done")).count(); bool seriesInfosDone = (seriesInfosRetrieved == seriesInfosRequested) ? true : false; if (!seriesInfosDone) { continue; } //Check if thumbnail requests for this request are done int thumbnailsRequested = m_thumbnailKeys.keys().count(); QStringList thumbnailValues = m_thumbnailKeys.values(); int thumbnailsRetrieved = thumbnailValues.filter(QRegExp("^done")).count(); bool thumbnailsDone = (thumbnailsRetrieved == thumbnailsRequested) ? true : false; if (!thumbnailsDone) { continue; } //If we got here then it means all data for this request has been fetched QList matches = m_fetchedMatches.value(i); emit infoFetched(matches); m_requestKeys.replace(i, "alldone"); } //Check if all requests are complete bool allDone =(m_requestKeys.filter(QRegExp("^alldone")).count() == m_requestKeys.count()); if (allDone) { m_isFetching = false; if (!m_timeout) { m_timer->stop(); emit fetchComplete(); emit fetchComplete(this); } } else if (!m_timeout){ m_timer->start(m_timeoutLength); } } void TVDBInfoFetcher::processOriginalRequest(const KUrl &from, const KUrl to) { //Determine if we got original request and process int originalRequestIndex = m_requestKeys.indexOf(from.prettyUrl()); bool isOriginalRequest = (originalRequestIndex != -1); if (!isOriginalRequest) { return; } //Process results MediaItem mediaItem = m_mediaList.at(originalRequestIndex); QFile file(to.path()); QDomDocument TVDBDoc("TVDB"); TVDBDoc.setContent(&file); QHash seriesInfoUrls; QList fetchedMatches; //Read Series Search results //Iterate through item nodes of the TVDB XML document QDomNodeList series = TVDBDoc.elementsByTagName("Series"); for (int i = 0; i < qMin(series.count(), m_maxMatches); i++) { MediaItem match = mediaItem; //Clear artwork match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); QDomNodeList nodes = series.at(i).childNodes(); for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "SeriesName") { match.title = element.text(); match.fields["title"] = element.text(); } else if (element.tagName() == "seriesid") { QString id = element.text(); match.fields["TVDBID"] = id; QString seriesInfoUrlStr = m_seriesInfoAPI.arg(m_mirror).arg(id); seriesInfoUrls.insert(fetchedMatches.count(), seriesInfoUrlStr); } } fetchedMatches.append(match); } QFile(to.path()).remove(); //Add fetched matches to collection of fetched matches m_fetchedMatches.insert(originalRequestIndex, fetchedMatches); //Launch series info request for (int i = 0; i < seriesInfoUrls.keys().count(); i++) { int matchIndex = seriesInfoUrls.keys().at(i); KUrl seriesInfoUrl = seriesInfoUrls.value(matchIndex); QString key = QString("%1,%2").arg(originalRequestIndex).arg(matchIndex); m_seriesInfoKeys.insert(key,seriesInfoUrl.prettyUrl()); QString seriesInfoTargetFile = QString("bangarang/temp/TVDBInfo-%1-%2.xml") .arg(key) .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); KUrl seriesInfoTargetUrl = KUrl(KStandardDirs::locateLocal("data", seriesInfoTargetFile, true)); QFile seriesInfoTarget(seriesInfoTargetUrl.path()); seriesInfoTarget.remove(); m_timer->start(m_timeoutLength); emit download(seriesInfoUrl, seriesInfoTargetUrl); } //Mark request done m_requestKeys.replace(originalRequestIndex, "done"); } void TVDBInfoFetcher::processSeriesInfoRequest(const KUrl &from, const KUrl to) { kDebug() << "GOT SERIES INFO"; //Determine we got a series info request QString seriesInfoKey = m_seriesInfoKeys.key(from.prettyUrl()); bool isSeriesInfoRequest = !seriesInfoKey.isEmpty(); if (!isSeriesInfoRequest) { return; } //Mark series info request done m_seriesInfoKeys.insert(seriesInfoKey, "done"); //Process results int originalRequestIndex = seriesInfoKey.split(",").at(0).toInt(); int matchesIndex = seriesInfoKey.split(",").at(1).toInt(); QList matches = m_fetchedMatches.value(originalRequestIndex); MediaItem match = matches.at(matchesIndex); QFile file(to.path()); QDomDocument TVDBDoc("TVDB"); TVDBDoc.setContent(&file); QHash thumbnailUrls; bool gotThumbnailUrl = false; //Read Series Info results //Iterate through item nodes of the TVDB XML document if (m_requestType == SeriesRequest) { QDomNodeList series = TVDBDoc.elementsByTagName("Series"); if (series.count() == 0) { return; } //Clear artwork match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); QDomNodeList nodes = series.at(0).childNodes(); for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "SeriesName") { match.title = element.text(); match.fields["title"] = element.text(); } else if (element.tagName() == "Overview") { match.fields["description"] = element.text(); } else if (element.tagName() == "poster") { QString imageUrl = QString("http://thetvdb.com/banners/%1").arg(element.text()); KUrl thumbnailUrl = KUrl(imageUrl); if (thumbnailUrl.isValid()) { thumbnailUrls.insert(matchesIndex, thumbnailUrl); gotThumbnailUrl = true; } } } matches.replace(matchesIndex, match); m_fetchedMatches[originalRequestIndex] = matches; } //Read Episode Info results //Iterate through item nodes of the TVDB XML document if (m_requestType == EpisodeRequest) { QDomNodeList series = TVDBDoc.elementsByTagName("Series"); if (series.count() == 0) { return; } QString seriesArtworkUrl; QDomNodeList nodes = series.at(0).childNodes(); for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "Actors") { match.fields["actor"] = element.text().split("|", QString::SkipEmptyParts); } else if (element.tagName() == "Genre") { match.fields["genre"] = element.text().split("|", QString::SkipEmptyParts); } else if (element.tagName() == "poster") { seriesArtworkUrl = QString("http://thetvdb.com/banners/%1").arg(element.text()); } } QDomNodeList episodes = TVDBDoc.elementsByTagName("Episode"); if (episodes.count() == 0) { return; } int seasonNumber = match.fields["season"].toInt(); int episodeNumber = match.fields["episodeNumber"].toInt(); if (seasonNumber <= 0 || episodeNumber <= 0) { return; } //Clear artwork match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); for (int i = 0; i < episodes.count(); i++) { QDomNodeList nodes = episodes.at(i).childNodes(); bool matchedSeason = false; bool matchedEpisode = false; for (int j = 0; j < nodes.count(); j++) { QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "SeasonNumber" && element.text().toInt() == seasonNumber) { matchedSeason = true; } if (element.tagName() == "EpisodeNumber" && element.text().toInt() == episodeNumber) { matchedEpisode = true; } } if (!matchedSeason || !matchedEpisode) { continue; } for (int j = 0; j < nodes.count(); j++) { if (!nodes.at(j).isElement()) { continue; } QDomElement element = nodes.at(j).toElement(); if (element.tagName() == "EpisodeName") { match.title = element.text(); match.fields["title"] = element.text(); } else if (element.tagName() == "Overview") { match.fields["description"] = element.text(); } else if (element.tagName() == "Director") { match.fields["director"] = element.text().split("|", QString::SkipEmptyParts); } else if (element.tagName() == "Writer") { match.fields["writer"] = element.text().split("|", QString::SkipEmptyParts); } else if (element.tagName() == "filename") { QString imageUrl = QString("http://thetvdb.com/banners/%1").arg(element.text()); KUrl thumbnailUrl = KUrl(imageUrl); if (thumbnailUrl.isValid()) { thumbnailUrls.insert(matchesIndex, thumbnailUrl); gotThumbnailUrl = true; } } } if (!gotThumbnailUrl) { KUrl thumbnailUrl = KUrl(seriesArtworkUrl); if (thumbnailUrl.isValid()) { thumbnailUrls.insert(matchesIndex, thumbnailUrl); gotThumbnailUrl = true; } } break; } matches.replace(matchesIndex, match); m_fetchedMatches[originalRequestIndex] = matches; } QFile(to.path()).remove(); //Launch Thumbnail requests for (int i = 0; i < thumbnailUrls.keys().count(); i++) { int matchIndex = thumbnailUrls.keys().at(i); MediaItem match = matches.at(matchIndex); KUrl thumbnailUrl = thumbnailUrls.value(matchIndex); QString key = QString("%1,%2").arg(originalRequestIndex).arg(matchIndex); m_thumbnailKeys.insert(key, thumbnailUrl.prettyUrl()); QString thumbnailTargetFile = QString("bangarang/thumbnails/%1-TVDB-%2") .arg(match.subType()) .arg(thumbnailUrl.fileName()); KUrl thumbnailTargetUrl = KUrl(KStandardDirs::locateLocal("data", thumbnailTargetFile, true)); QFile downloadTarget(thumbnailTargetUrl.path()); downloadTarget.remove(); m_timer->start(m_timeoutLength); emit download(thumbnailUrl, thumbnailTargetUrl); } } void TVDBInfoFetcher::processThumbnails(const KUrl &from, const KUrl to) { //Determine we got a thumbnail request QString requestKey = m_thumbnailKeys.key(from.prettyUrl()); if (requestKey.isEmpty()) { return; } //Mark thumbnail request done m_thumbnailKeys.insert(requestKey, "done"); //Process results int originalRequestIndex = requestKey.split(",").at(0).toInt(); int matchesIndex = requestKey.split(",").at(1).toInt(); if (!m_fetchedMatches.contains(originalRequestIndex)) { return; } QList matches = m_fetchedMatches.value(originalRequestIndex); MediaItem match = matches.at(matchesIndex); QString thumbnailFile = to.path(); QPixmap thumbnail = QPixmap(thumbnailFile).scaled(200,200, Qt::KeepAspectRatio, Qt::SmoothTransformation); if (!thumbnail.isNull()) { match.artwork = QIcon(thumbnail); match.fields["artworkUrl"] = to.prettyUrl(); match.hasCustomArtwork = true; } else { match.artwork = Utilities::defaultArtworkForMediaItem(match); match.fields["artworkUrl"] = QString(""); match.hasCustomArtwork = false; } matches.replace(matchesIndex, match); m_fetchedMatches[originalRequestIndex] = matches; } void TVDBInfoFetcher::timeout() { //Return any remaining matches that have not yet been returned if (!m_fetchedMatches.isEmpty()) { foreach (QList matches, m_fetchedMatches) { emit infoFetched(matches); } } InfoFetcher::timeout(); } bangarang-bangarang/src/platform/infofetchers/tvdbinfofetcher.h000066400000000000000000000043161166760560600253540ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef TVDBINFOFETCHER_H #define TVDBINFOFETCHER_H #include "infofetcher.h" #include class Downloader; class TVDBInfoFetcher : public InfoFetcher { Q_OBJECT public: enum RequestType {SeriesRequest = 0, EpisodeRequest = 1}; TVDBInfoFetcher(QObject *parent = 0); bool available(const QString &subType); private: QString m_apiKey; QString m_seriesSearchAPI; QString m_seriesInfoAPI; QString m_updateRequestAPI; QString m_mirrorRequestAPI; QString m_serverTimeRequestAPI; QString m_mirror; Downloader * m_downloader; QStringList m_requestKeys; QHash > m_fetchedMatches; QHash m_thumbnailKeys; QHash m_seriesInfoKeys; RequestType m_requestType; int m_maxMatches; QDateTime m_lastRequestTime; void processOriginalRequest(const KUrl &from, const KUrl to); void processSeriesInfoRequest(const KUrl &from, const KUrl to); void processThumbnails(const KUrl &from, const KUrl to); private slots: void gotTVDBInfo(const KUrl &from, const KUrl &to); void timeout(); signals: void download(const KUrl &from, const KUrl &to); public slots: void fetchInfo(QList mediaList, int maxMatches = 4, bool updateRequiredFields = true, bool updateArtwork = true);}; #endif // TVDBINFOFETCHER_H bangarang-bangarang/src/platform/infoitemmodel.cpp000066400000000000000000001561241166760560600227140ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "infoitemmodel.h" #include "mediaitemmodel.h" #include "utilities/utilities.h" #include "infofetchers/dbpediainfofetcher.h" #include "infofetchers/doubaninfofetcher.h" #include "infofetchers/feedinfofetcher.h" #include "infofetchers/filenameinfofetcher.h" #include "infofetchers/lastfminfofetcher.h" #include "infofetchers/tmdbinfofetcher.h" #include "infofetchers/tvdbinfofetcher.h" #include "mediaindexer.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include InfoItemModel::InfoItemModel(QObject *parent) : QStandardItemModel(parent) { connect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); m_defaultEditable = true; m_modified = false; m_suppressFetchOnLoad = false; m_fetchingStatus["progress"] = -1; m_utilThread = new Utilities::Thread(this); connect(m_utilThread, SIGNAL(gotArtworks(QList,MediaItem)), this, SLOT(gotArtworks(QList,MediaItem))); //Store field order m_fieldsOrder["Music"] = QStringList() << "audioType" << "artwork" << "title" << "rating" << "artist" << "composer" << "album" << "trackNumber" << "year" << "genre" << "description" << "tags" << "relatedTo" << "url" << "playCount" << "lastPlayed"; m_fieldsOrder["Audio Clip"] = QStringList() << "audioType" << "artwork" << "title" << "rating" << "description" << "tags" << "relatedTo" << "url" << "playCount" << "lastPlayed"; m_fieldsOrder["Audio Stream"] = QStringList() << "audioType" << "artwork" << "title" << "rating" << "description" << "tags" << "relatedTo" << "url" << "playCount" << "lastPlayed"; m_fieldsOrder["Video Clip"] = QStringList() << "videoType" << "artwork" << "title" << "rating" << "description" << "tags" << "relatedTo" << "url" << "playCount" << "lastPlayed"; m_fieldsOrder["Movie"] = QStringList() << "videoType" << "artwork" << "title" << "rating" << "description" << "actor" << "director" << "writer" << "producer" << "year" << "genre" << "tags" << "relatedTo" << "url" << "playCount" << "lastPlayed"; m_fieldsOrder["TV Show"] = QStringList() << "videoType" << "artwork" << "title" << "rating" << "description" << "seriesName" << "actor" << "director" << "writer" << "producer" << "season" << "episodeNumber" << "year" << "genre" << "tags" << "relatedTo" << "url" << "playCount" << "lastPlayed"; m_fieldsOrder["Artist"] = QStringList() << "artwork" << "title" << "description" << "relatedTo"; m_fieldsOrder["Album"] = QStringList() << "artwork" << "title"; m_fieldsOrder["AudioGenre"] = QStringList() << "artwork" << "title"; m_fieldsOrder["AudioTag"] = QStringList() << "title"; m_fieldsOrder["TV Series"] = QStringList() << "artwork" << "title" << "description"; m_fieldsOrder["TV Season"] = QStringList() << "artwork" << "title" << "season"; m_fieldsOrder["VideoGenre"] = QStringList() << "artwork" << "title"; m_fieldsOrder["Actor"] = QStringList() << "artwork" << "title" << "description" << "relatedTo"; m_fieldsOrder["Director"] = QStringList() << "artwork" << "title" << "description" << "relatedTo"; m_fieldsOrder["VideoTag"] = QStringList() << "title"; m_fieldsOrder["Audio Feed"] = QStringList() << "artwork" << "title" << "description" << "url"; m_fieldsOrder["Video Feed"] = QStringList() << "artwork" << "title" << "description" << "url"; m_fieldsOrder["Basic"] = QStringList() << "title"; m_fieldsOrder["Basic+Artwork"] = QStringList() << "artwork" << "title"; //Store field names m_fieldNames["audioType"] = i18n("Type"); m_fieldNames["artwork"] = i18n("Artwork"); m_fieldNames["title"]= i18n("Title"); m_fieldNames["artist"] = i18n("Artist"); m_fieldNames["composer"] = i18n("Composer"); m_fieldNames["album"] = i18n("Album"); m_fieldNames["trackNumber"] = i18n("Track"); m_fieldNames["year"] = i18n("Year"); m_fieldNames["genre"] = i18n("Genre"); m_fieldNames["tags"] = i18n("Tags"); m_fieldNames["url"] = i18n("Location"); m_fieldNames["videoType"] = i18n("Type"); m_fieldNames["actor"] = i18n("Actor"); m_fieldNames["director"] = i18n("Director"); m_fieldNames["writer"] = i18n("Writer"); m_fieldNames["producer"] = i18n("Producer"); m_fieldNames["seriesName"] = i18n("Series"); m_fieldNames["season"] = i18n("Season"); m_fieldNames["episodeNumber"] = i18n("Episode"); m_fieldNames["relatedTo"] = i18n("Links"); m_fieldNames["playCount"] = i18n("Play Count"); m_fieldNames["lastPlayed"] = i18n("Last Played"); //Store restricted fields m_restrictedFields["Music"] = QStringList() << "url" << "playCount" << "lastPlayed"; m_restrictedFields["Audio Clip"] = QStringList() << "url" << "playCount" << "lastPlayed"; m_restrictedFields["Audio Stream"] = QStringList() << "playCount" << "lastPlayed"; m_restrictedFields["Video Clip"] = QStringList() << "url" << "playCount" << "lastPlayed"; m_restrictedFields["Movie"] = QStringList() << "url" << "playCount" << "lastPlayed"; m_restrictedFields["TV Show"] = QStringList() << "url" << "playCount" << "lastPlayed"; m_restrictedFields["Artist"] = QStringList() << "title"; m_restrictedFields["Album"] = QStringList() << "artwork" << "title"; m_restrictedFields["AudioGenre"] = QStringList() << "title"; m_restrictedFields["AudioTag"] = QStringList() << "artwork" << "title"; m_restrictedFields["TV Series"] = QStringList() << "title"; m_restrictedFields["TV Season"] = QStringList() << "artwork" << "title" << "season"; m_restrictedFields["VideoGenre"] = QStringList() << "title"; m_restrictedFields["Actor"] = QStringList() << "title"; m_restrictedFields["Director"] = QStringList() << "title"; m_restrictedFields["VideoTag"] = QStringList() << "artwork" << "title"; m_restrictedFields["Basic"] = QStringList() << "title"; m_restrictedFields["Basic+Artwork"] = QStringList() << "artwork" << "title"; m_drillLris["Artist"] = "music://albums?artist=%1"; m_drillLris["Album"] = "music://songs?album=%1"; m_drillLris["AudioGenre"] = "music://artists?genre=%1"; m_drillLris["VideoGenre"] = "video://sources?||genre=%1"; m_drillLris["AudioTag"] = "tag://audio?tag=%1"; m_drillLris["VideoTag"] = "tag://video?tag=%1"; m_drillLris["TV Series"] = "video://seasons?||seriesName=%1"; m_drillLris["Actor"] = "video://sources?||actor=%1"; m_drillLris["Director"] = "video://sources?||director=%1"; //Set up drop lists data m_valueListLris["artist"] = "music://artists"; m_valueListLris["album"] = "music://albums"; m_valueListLris["audioGenre"] = "music://genres"; m_valueListLris["seriesName"] = "video://tvshows"; m_valueListLris["actor"] = "video://actors"; m_valueListLris["director"] = "video://directors"; m_valueListLris["videoGenre"] = "video://genres"; m_valueListLris["audioTags"] = "tag://audiotags"; m_valueListLris["videoTags"] = "tag://videotags"; m_valueListLoader = new MediaItemModel(this); connect(m_valueListLoader, SIGNAL(mediaListChanged()), this, SLOT(loadNextValueList())); m_valueListLoader->loadLRI("music://artists"); //Set up InfoFetchers TMDBInfoFetcher * tmdbInfoFetcher = new TMDBInfoFetcher(this); connect(tmdbInfoFetcher, SIGNAL(infoFetched(QList)), this, SLOT(infoFetched(QList))); connect(tmdbInfoFetcher, SIGNAL(fetching()), this, SIGNAL(fetching())); connect(tmdbInfoFetcher, SIGNAL(fetchComplete(InfoFetcher *)), this, SLOT(infoFetcherComplete(InfoFetcher *))); connect(tmdbInfoFetcher, SIGNAL(noResults(InfoFetcher *)), this, SLOT(noResults(InfoFetcher *))); connect(tmdbInfoFetcher, SIGNAL(updateFetchedInfo(int,MediaItem)), this, SLOT(updateFetchedInfo(int,MediaItem))); m_infoFetchers.append(tmdbInfoFetcher); TVDBInfoFetcher * tvdbInfoFetcher = new TVDBInfoFetcher(this); connect(tvdbInfoFetcher, SIGNAL(infoFetched(QList)), this, SLOT(infoFetched(QList))); connect(tvdbInfoFetcher, SIGNAL(fetching()), this, SIGNAL(fetching())); connect(tvdbInfoFetcher, SIGNAL(fetchComplete(InfoFetcher *)), this, SLOT(infoFetcherComplete(InfoFetcher *))); connect(tvdbInfoFetcher, SIGNAL(noResults(InfoFetcher *)), this, SLOT(noResults(InfoFetcher *))); connect(tvdbInfoFetcher, SIGNAL(updateFetchedInfo(int,MediaItem)), this, SLOT(updateFetchedInfo(int,MediaItem))); m_infoFetchers.append(tvdbInfoFetcher); LastfmInfoFetcher * lastfmInfoFetcher = new LastfmInfoFetcher(this); connect(lastfmInfoFetcher, SIGNAL(infoFetched(QList)), this, SLOT(infoFetched(QList))); connect(lastfmInfoFetcher, SIGNAL(fetching()), this, SIGNAL(fetching())); connect(lastfmInfoFetcher, SIGNAL(fetchComplete(InfoFetcher *)), this, SLOT(infoFetcherComplete(InfoFetcher *))); connect(lastfmInfoFetcher, SIGNAL(noResults(InfoFetcher *)), this, SLOT(noResults(InfoFetcher *))); connect(lastfmInfoFetcher, SIGNAL(updateFetchedInfo(int,MediaItem)), this, SLOT(updateFetchedInfo(int,MediaItem))); m_infoFetchers.append(lastfmInfoFetcher); DoubanInfoFetcher * doubanInfoFetcher = new DoubanInfoFetcher(this); connect(doubanInfoFetcher, SIGNAL(infoFetched(QList)), this, SLOT(infoFetched(QList))); connect(doubanInfoFetcher, SIGNAL(fetching()), this, SIGNAL(fetching())); connect(doubanInfoFetcher, SIGNAL(fetchComplete(InfoFetcher *)), this, SLOT(infoFetcherComplete(InfoFetcher *))); connect(doubanInfoFetcher, SIGNAL(noResults(InfoFetcher *)), this, SLOT(noResults(InfoFetcher *))); connect(doubanInfoFetcher, SIGNAL(updateFetchedInfo(int,MediaItem)), this, SLOT(updateFetchedInfo(int,MediaItem))); m_infoFetchers.append(doubanInfoFetcher); /* NOTE: Results returned from DBPedia SPARQL frontend is inconsistent InfoFetcher is disabled until this problem is resolved DBPediaInfoFetcher * dbPediaInfoFetcher = new DBPediaInfoFetcher(this); connect(dbPediaInfoFetcher, SIGNAL(infoFetched(QList)), this, SLOT(infoFetched(QList))); connect(dbPediaInfoFetcher, SIGNAL(fetching()), this, SIGNAL(fetching())); connect(dbPediaInfoFetcher, SIGNAL(fetchComplete(InfoFetcher *)), this, SLOT(infoFetcherComplete(InfoFetcher *))); connect(dbPediaInfoFetcher, SIGNAL(noResults(InfoFetcher *)), this, SLOT(noResults(InfoFetcher *))); connect(dbPediaInfoFetcher, SIGNAL(updateFetchedInfo(int,MediaItem)), this, SLOT(updateFetchedInfo(int,MediaItem))); m_infoFetchers.append(dbPediaInfoFetcher);*/ FeedInfoFetcher * feedInfoFetcher = new FeedInfoFetcher(this); connect(feedInfoFetcher, SIGNAL(infoFetched(QList)), this, SLOT(infoFetched(QList))); connect(feedInfoFetcher, SIGNAL(fetching()), this, SIGNAL(fetching())); connect(feedInfoFetcher, SIGNAL(fetchComplete(InfoFetcher *)), this, SLOT(infoFetcherComplete(InfoFetcher *))); connect(feedInfoFetcher, SIGNAL(noResults(InfoFetcher *)), this, SLOT(noResults(InfoFetcher *))); connect(feedInfoFetcher, SIGNAL(updateFetchedInfo(int,MediaItem)), this, SLOT(updateFetchedInfo(int,MediaItem))); m_infoFetchers.append(feedInfoFetcher); FileNameInfoFetcher * fileNameInfoFetcher = new FileNameInfoFetcher(this); connect(fileNameInfoFetcher, SIGNAL(infoFetched(QList)), this, SLOT(infoFetched(QList))); connect(fileNameInfoFetcher, SIGNAL(fetching()), this, SIGNAL(fetching())); connect(fileNameInfoFetcher, SIGNAL(fetchComplete(InfoFetcher *)), this, SLOT(infoFetcherComplete(InfoFetcher *))); connect(fileNameInfoFetcher, SIGNAL(noResults(InfoFetcher *)), this, SLOT(noResults(InfoFetcher *))); connect(fileNameInfoFetcher, SIGNAL(updateFetchedInfo(int,MediaItem)), this, SLOT(updateFetchedInfo(int,MediaItem))); m_infoFetchers.append(fileNameInfoFetcher); m_selectedFetchedMatch = -1; m_sourceModel = 0; //Setup indexer m_indexer = new MediaIndexer(this); } InfoItemModel::~InfoItemModel() { } void InfoItemModel::loadInfo(const QList & mediaList) { m_modified = false; m_mediaList = mediaList; m_originalList = mediaList; m_fetchedMatches.clear(); cancelFetching(); if (m_mediaList.count() > 0) { Utilities::removeFromImageCache(m_mediaList.at(0)); loadFieldsInOrder(); emit infoChanged(false); //Upon selection of only one media item, launch Autofetch if NO info //is available in the fetchable fields of the media item. //NOTE: Automatic autofetching is more intrusive to the user experience than I'd like. // So it is disabled below. For now I'd rather leave it to the user to decide // when to fetch info. /*if (m_mediaList.count() == 1 && !m_suppressFetchOnLoad) { for (int i = 0; i < m_infoFetchers.count(); i++) { if (autoFetchIsAvailable(m_infoFetchers.at(i))) { QStringList fetchableFields = m_infoFetchers.at(i)->fetchableFields(subType); QStringList requiredFields = m_infoFetchers.at(i)->requiredFields(subType); bool fetchableFieldsEmpty = true; for (int j = 0; j < fetchableFields.count(); j++) { if (!requiredFields.contains(fetchableFields.at(j)) && !isEmpty(fetchableFields.at(j))) { fetchableFieldsEmpty = false; } } if (fetchableFieldsEmpty) { autoFetch(m_infoFetchers.at(i), false, false); break; } } } }*/ } //Fetch on load can only be suppressed for one load m_suppressFetchOnLoad = false; } void InfoItemModel::saveChanges() { //Update Custom Genre Info saveCustomGenreInfo(m_mediaList); //Update File Metadata saveFileMetaData(m_mediaList); //Update source information m_sourceModel->updateSourceInfo(m_mediaList); //Ensure original values in model are updated to reflect saved(no-edits) state loadInfo(m_mediaList); } void InfoItemModel::cancelChanges() { m_suppressFetchOnLoad = true; loadInfo(m_originalList); } QList InfoItemModel::mediaList() { return m_mediaList; } void InfoItemModel::setSourceModel(MediaItemModel * sourceModel) { if (m_sourceModel) { disconnect(m_sourceModel, SIGNAL(updateSourceInfoFinished()), this, SLOT(reloadValueLists())); } m_sourceModel = sourceModel; if (m_sourceModel) { connect(m_sourceModel, SIGNAL(updateSourceInfoFinished()), this, SLOT(reloadValueLists())); } } QHash InfoItemModel::fetchingStatus() { return m_fetchingStatus; } QList InfoItemModel::infoFetchers() { return m_infoFetchers; } QList InfoItemModel::availableInfoFetchers() { QList availableFetchers; for (int i = 0; i < m_infoFetchers.count(); i++) { if (autoFetchIsAvailable(m_infoFetchers.at(i)) || fetchIsAvailable(m_infoFetchers.at(i))) { availableFetchers.append(m_infoFetchers.at(i)); } } return availableFetchers; } bool InfoItemModel::autoFetchIsAvailable(InfoFetcher* infoFetcher) { //Autofetch is only available when required info is available to make //fetch request AND there are no unsaved modifications. bool available = false; if (m_mediaList.count() == 0) { return available; } QString subType = m_mediaList.at(0).subType(); if (!m_modified && infoFetcher->available(subType)) { QStringList requiredFields = infoFetcher->requiredFields(subType); available = true; for (int i =0; i < requiredFields.count(); i++) { if (isEmpty(requiredFields.at(i))) { available = false; break; } } } return available; } bool InfoItemModel::fetchIsAvailable(InfoFetcher* infoFetcher) { //Fetch is only available when enough info is available to make //fetch request AND when only one media item is loaded. bool available = false; if (m_mediaList.count() == 0) { return available; } QString subType = m_mediaList.at(0).subType(); if (m_mediaList.count() == 1 && infoFetcher->available(subType)) { QStringList requiredFields = infoFetcher->requiredFields(subType); available = true; for (int i =0; i < requiredFields.count(); i++) { if (isEmpty(requiredFields.at(i))) { available = false; break; } } } return available; } void InfoItemModel::autoFetch(InfoFetcher* infoFetcher, bool updateRequiredFields, bool updateArtwork) { m_fetchType = AutoFetch; m_fetchedMatches.clear(); m_selectedFetchedMatch = -1; m_itemsToFetch = m_mediaList; fetchBatch(infoFetcher, 1, updateRequiredFields, updateArtwork); m_fetchingStatus["description"] = i18np("Fetching info for %1 item...", "Fetching info for %1 items...", m_mediaList.count()); emit fetchingStatusUpdated(); } void InfoItemModel::fetch(InfoFetcher* infoFetcher) { m_fetchType = Fetch; m_fetchedMatches.clear(); m_selectedFetchedMatch = -1; m_itemsToFetch = m_mediaList; fetchBatch(infoFetcher, 4, true, true); m_fetchingStatus["description"] = i18np("Fetching info for %1 item...", "Fetching info for %1 items...", m_mediaList.count()); emit fetchingStatusUpdated(); } void InfoItemModel::fetchBatch(InfoFetcher *infoFetcher, int maxMatches, bool updateRequiredFields, bool updateArtwork) { //Take next 4 items to fetch QList mediaList; for (int i = 0; i < 4; i++) { if (!m_itemsToFetch.isEmpty()) { mediaList.append(m_itemsToFetch.takeFirst()); } } if (!mediaList.isEmpty()) { m_isFetching = true; infoFetcher->fetchInfo(mediaList, maxMatches, updateRequiredFields, updateArtwork); } } QList InfoItemModel::fetchedMatches() { return m_fetchedMatches; } void InfoItemModel::selectFetchedMatch(int index) { if (index >= m_fetchedMatches.count() || index < 0) { return; } //Find corresponding media item int foundIndex = -1; MediaItem match = m_fetchedMatches.at(index); for (int i = 0; i < m_mediaList.count(); i++) { if (m_mediaList.at(i).url == match.url) { foundIndex = i; break; } } if (foundIndex == -1) { return; } m_selectedFetchedMatch = index; m_mediaList.replace(foundIndex, match); //Update model data for (int i = 0; i < rowCount(); i++) { QString subType = match.subType(); QString field = item(i)->data(InfoItemModel::FieldRole).toString(); bool restricted = m_restrictedFields[subType].contains(field); if (!restricted) { if (field == "audioType" || field == "videoType") { QVariant value; if (subType == "Music" || subType == "Movie") { value = QVariant(0); } else if (subType == "Audio Stream" || subType == "TV Show") { value = QVariant(1); } else if (subType == "Audio Clip" || subType == "Video Clip") { value = QVariant(2); } item(i)->setData(value, Qt::DisplayRole); item(i)->setData(value, Qt::EditRole); } else if (field == "artwork") { //disconnect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); item(i)->setData(match.fields["artworkUrl"], Qt::DisplayRole); item(i)->setData(match.fields["artworkUrl"], Qt::EditRole); item(i)->setData(match.artwork, Qt::DecorationRole); //connect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); } else { item(i)->setData(match.fields[field], Qt::DisplayRole); item(i)->setData(match.fields[field], Qt::EditRole); } } } } void InfoItemModel::setRating(int rating) { if (rating < 0 || rating > 10) { return; } m_indexer->updateRating(m_mediaList, rating); for (int i = 0; i < m_mediaList.count(); i++) { MediaItem mediaItem = m_mediaList.at(i); mediaItem.fields["rating"] = rating; m_mediaList.replace(i, mediaItem); } m_originalList = m_mediaList; for (int i = 0 ; i < rowCount(); i++) { QStandardItem *currentItem = item(i); if (currentItem->data(InfoItemModel::FieldRole).toString() == "rating") { disconnect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); currentItem->setData(rating, Qt::DisplayRole); currentItem->setData(rating, Qt::EditRole); currentItem->setData(rating, InfoItemModel::OriginalValueRole); connect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); break; } } } void InfoItemModel::clearArtwork() { //Clear artwork in mediaItems for (int i = 0; i < m_mediaList.count(); i++) { MediaItem mediaItem = m_mediaList.at(i); mediaItem.fields["artworkUrl"] = QString(""); mediaItem.artwork = Utilities::defaultArtworkForMediaItem(mediaItem); m_mediaList.replace(i, mediaItem); Utilities::removeFromImageCache(mediaItem); } //Find artwork item and reset artwork; for (int i = 0; i < rowCount(); i++) { QString field = item(i)->data(InfoItemModel::FieldRole).toString(); if (field == "artwork") { item(i)->setData(QString(""), Qt::EditRole); getArtwork(item(i),QString("")); break; } } } void InfoItemModel::infoFetched(QList fetchedMatches) { if (!m_isFetching || fetchedMatches.isEmpty()) { return; } //Find corresponding media item int foundIndex = -1; MediaItem match = fetchedMatches.at(0); for (int i = 0; i < m_mediaList.count(); i++) { if (m_mediaList.at(i).url == match.url) { foundIndex = i; break; } } if (foundIndex != -1 && m_fetchType == AutoFetch) { match = Utilities::makeSubtitle(match); m_mediaList.replace(foundIndex, match); } else if (foundIndex != -1 && m_fetchType == Fetch) { m_fetchedMatches = fetchedMatches; selectFetchedMatch(0); } } void InfoItemModel::infoFetcherComplete(InfoFetcher *infoFetcher) { if (!m_isFetching) { return; } if (!m_itemsToFetch.isEmpty()) { //First argument controls the plural m_fetchingStatus["description"] = i18np("Fetched info for %2 of 1 item...", "Fetched info for %2 of %1 items...", m_mediaList.count(), (m_mediaList.count() - m_itemsToFetch.count())); emit fetchingStatusUpdated(); //Fetch info for another batch of items if (m_fetchType == AutoFetch) { fetchBatch(infoFetcher, 1, true, true); } else { fetchBatch(infoFetcher, 4, true, true); } } else { m_isFetching = false; m_fetchingStatus["description"] = i18n("Complete"); emit fetchingStatusUpdated(); m_fetchingStatus["description"] = QString(); emit fetchingStatusUpdated(); emit fetchComplete(); if (m_fetchType == AutoFetch) { QApplication::processEvents(); //make sure all infoFetched signals are processed before saving changes. saveChanges(); } } } void InfoItemModel::noResults(InfoFetcher *infoFetcher) { m_fetchingStatus["description"] = i18n("No Results"); emit fetchingStatusUpdated(); m_fetchingStatus["description"] = QString(); emit fetchingStatusUpdated(); Q_UNUSED(infoFetcher) } void InfoItemModel::updateFetchedInfo(int index, MediaItem match) { if (!m_isFetching) { return; } if (index >= m_fetchedMatches.count() || index < 0) { return; } //Update fetched matches m_fetchedMatches.replace(index, match); //If match is currently selected, update model to reflect updated fetched information if (index == m_selectedFetchedMatch) { selectFetchedMatch(index); } } void InfoItemModel::loadFieldsInOrder() { clear(); QString type = m_mediaList.at(0).type; QString subType = m_mediaList.at(0).subType(); //Load field info in order specified QStringList fieldsOrder = m_fieldsOrder.value(subType, m_fieldsOrder["Basic"]); for (int i = 0; i < fieldsOrder.count(); i++) { QString field = fieldsOrder.at(i); if ((Utilities::isCd(m_mediaList.at(0).url) || Utilities::isDvd(m_mediaList.at(0).url)) && (field == "url")) { addFieldToValuesModel(i18n("Location"), "album", false); //or the user would see the ugly udi } else { QStringList restrictedFields = m_restrictedFields.value(subType, m_restrictedFields["Basic"]); bool isEditable = !restrictedFields.contains(field); addFieldToValuesModel(m_fieldNames[field],field, isEditable); } } } void InfoItemModel::addFieldToValuesModel(const QString &fieldTitle, const QString &field, bool isEditable) { //NOTE: This method must only be called by loadInfo. The reason is that this // method as well as supporting method, commonValue(), use m_mediaList to // store the original value: loadInfo is the only place m_medialist and // m_originalList are set equal. QList rowData; QStandardItem *fieldItem = new QStandardItem(); fieldItem->setData(field, InfoItemModel::FieldRole); fieldItem->setData(fieldTitle, InfoItemModel::FieldNameRole); bool hasMultiple = hasMultipleValues(field); fieldItem->setData(hasMultiple, InfoItemModel::MultipleValuesRole); fieldItem->setEditable(isEditable); //Set artwork if (field == "artwork") { QString artworkUrl = m_mediaList.at(0).fields["artworkUrl"].toString(); fieldItem->setData(artworkUrl, Qt::DisplayRole); fieldItem->setData(artworkUrl, Qt::EditRole); fieldItem->setData(artworkUrl, InfoItemModel::OriginalValueRole); //stores copy of original data //Get artwork for selected items if (getArtwork(fieldItem)) { rowData.append(fieldItem); appendRow(rowData); } return; } if (!hasMultiple) { //Set field value QVariant value = commonValue(field); if (field == "audioType" || field == "videoType") { if (value.toString() == "Music" || value.toString() == "Movie") { value = QVariant(0); } else if (value.toString() == "Audio Stream" || value.toString() == "TV Show") { value = QVariant(1); } else if (value.toString() == "Audio Clip" || value.toString() == "Video Clip") { value = QVariant(2); } } fieldItem->setData(value, Qt::DisplayRole); fieldItem->setData(value, Qt::EditRole); fieldItem->setData(value, InfoItemModel::OriginalValueRole); //stores copy of original data fieldItem->setData(valueList(field), InfoItemModel::ValueListRole); //Store drill lri(s) setDrill(fieldItem, field, value); if (field == "url" || field == "relatedTo" || field == "lastPlayed") { if (value.type() == QVariant::DateTime) { KDateTime dateTime(value.toDateTime()); value = QVariant(KGlobal::locale()->formatDateTime(dateTime.toLocalZone(), KLocale::FancyLongDate)); } fieldItem->setData(value, Qt::ToolTipRole); } } else { //Set default field value QVariant value = m_mediaList.at(0).fields[field]; if (value.type() == QVariant::String) { fieldItem->setData(QString(), Qt::DisplayRole); fieldItem->setData(QString(), Qt::EditRole); fieldItem->setData(QString(), InfoItemModel::OriginalValueRole); fieldItem->setData(valueList(field), InfoItemModel::ValueListRole); } else if (value.type() == QVariant::StringList) { fieldItem->setData(QStringList(), Qt::DisplayRole); fieldItem->setData(QStringList(), Qt::EditRole); fieldItem->setData(QStringList(), InfoItemModel::OriginalValueRole); fieldItem->setData(valueList(field), InfoItemModel::ValueListRole); } else if (value.type() == QVariant::Int) { fieldItem->setData(0, Qt::DisplayRole); fieldItem->setData(0, Qt::EditRole); fieldItem->setData(0, InfoItemModel::OriginalValueRole); } } rowData.append(fieldItem); appendRow(rowData); } bool InfoItemModel::hasMultipleValues(const QString &field) { QVariant value; if (field == "artwork") { if (m_mediaList.count() == 1) { return false; } else { return true; } } for (int i = 0; i < m_mediaList.count(); i++) { if (value.isNull()) { value = m_mediaList.at(i).fields.value(field); } else if (m_mediaList.at(i).fields.value(field) != value) { return true; } } return false; } QVariant InfoItemModel::commonValue(const QString &field) { QVariant value = QVariant(QString()); for (int i = 0; i < m_mediaList.count(); i++) { if (m_mediaList.at(i).fields.contains(field)) { if (value.isNull()) { value = m_mediaList.at(i).fields.value(field); } else if (m_mediaList.at(i).fields.value(field) != value) { QVariant::Type type = m_mediaList.at(i).fields.value(field).type(); if (type == QVariant::String) { value = QVariant(QString()); } else if (type == QVariant::StringList) { value = QVariant(QStringList()); } else { value = QVariant(QString()); } break; } } } return value; } QStringList InfoItemModel::valueList(const QString &field) { QStringList values; QString lookupField = field; QString type; if (m_mediaList.count() > 0) { type = m_mediaList.at(0).type; } if (lookupField == "genre") { if (type == "Audio") { lookupField= "audioGenre"; } else if (type == "Video") { lookupField = "videoGenre"; } } else if (lookupField == "composer") { lookupField = "artist"; } else if (lookupField == "tags") { if (type == "Audio") { lookupField= "audioTags"; } else if (type == "Video") { lookupField = "videoTags"; } } if (m_valueLists.contains(lookupField)) { values = m_valueLists.value(lookupField); } return values; } bool InfoItemModel::isEmpty(const QString &field) { bool isEmpty = true; for (int i = 0; i < m_mediaList.count(); i++) { MediaItem mediaItem = m_mediaList.at(i); if (mediaItem.fields.contains(field)) { QVariant::Type fieldType = mediaItem.fields[field].type(); if (fieldType == QVariant::String) { isEmpty = mediaItem.fields[field].toString().isEmpty(); } else if (fieldType == QVariant::StringList) { isEmpty = mediaItem.fields[field].toStringList().isEmpty(); } else if (fieldType == QVariant::Date) { isEmpty = !mediaItem.fields[field].toDate().isValid(); } else if (fieldType == QVariant::DateTime) { isEmpty = !mediaItem.fields[field].toDateTime().isValid(); } else if (fieldType == QVariant::Int){ isEmpty = !mediaItem.fields[field].isValid(); } else { isEmpty = mediaItem.fields[field].isNull(); } if (isEmpty) { break; } } } return isEmpty; } void InfoItemModel::updateMediaList() { QList updatedList; for (int i = 0; i < m_mediaList.count(); i++) { MediaItem mediaItem = m_mediaList.at(i); for (int row = 0; row < rowCount(); row++) { QStandardItem *currentItem = item(row, 0); QString field = currentItem->data(InfoItemModel::FieldRole).toString(); //Save any field that does not have multiple values. //If multiple items are selected and a field is edited //then the edited field won't have multiple values bool multipleValues = currentItem->data(InfoItemModel::MultipleValuesRole).toBool(); if (!multipleValues) { if (field == "audioType") { int value = currentItem->data(Qt::EditRole).toInt(); if (value == 0) { mediaItem.fields["audioType"] = "Music"; } else if (value == 1) { mediaItem.fields["audioType"] = "Audio Stream"; } else if (value == 2) { mediaItem.fields["audioType"] = "Audio Clip"; } } else if (field == "videoType") { int value = currentItem->data(Qt::EditRole).toInt(); if (value == 0) { mediaItem.fields["videoType"] = "Movie"; } else if (value == 1) { mediaItem.fields["videoType"] = "TV Show"; } else if (value == 2) { mediaItem.fields["videoType"] = "Video Clip"; } } else if (field == "title") { mediaItem.fields["title"] = currentItem->data(Qt::EditRole); mediaItem.title = currentItem->data(Qt::EditRole).toString(); } else if (field == "duration") { int duration = currentItem->data(Qt::EditRole).toInt(); mediaItem.fields["duration"] = currentItem->data(Qt::EditRole); mediaItem.duration = Utilities::durationString(duration); } else if (field == "url") { mediaItem.fields["url"] = currentItem->data(Qt::EditRole); mediaItem.url = currentItem->data(Qt::EditRole).toString(); } else if (field == "artwork") { QString artworkUrl = currentItem->data(Qt::EditRole).toString(); mediaItem.fields["artworkUrl"] = currentItem->data(Qt::EditRole).toString(); if (!artworkUrl.isEmpty() && (mediaItem.subType() == "AudioGenre" || mediaItem.subType() == "VideoGenre")) { mediaItem.artwork = currentItem->data(Qt::DecorationRole).value(); mediaItem.hasCustomArtwork = true; } else if (mediaItem.subType() == "AudioGenre" || mediaItem.subType() == "VideoGenre"){ mediaItem.artwork = KIcon("flag-blue"); mediaItem.hasCustomArtwork = false; } } else if (field == "year") { mediaItem.fields["year"] = currentItem->data(Qt::EditRole); if (!mediaItem.fields["year"].isNull() && mediaItem.fields["year"].toInt() !=0) { mediaItem.fields["releaseDate"] = QDate(mediaItem.fields["year"].toInt(),1, 1); } else { mediaItem.fields["releaseDate"] = QVariant(QVariant::Date); } if (mediaItem.subType() == "Movie" && mediaItem.fields["year"].toInt() != 0) { } } else { mediaItem.fields[field] = currentItem->data(Qt::EditRole); } } } mediaItem = Utilities::makeSubtitle(mediaItem); updatedList << mediaItem; } m_mediaList = updatedList; } void InfoItemModel::itemChanged(QStandardItem *changedItem) { QString field = changedItem->data(InfoItemModel::FieldRole).toString(); if (changedItem->data(Qt::EditRole) != changedItem->data(InfoItemModel::OriginalValueRole)) { m_modified = true; if (field == "artwork") { disconnect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); QString artworkUrl = changedItem->data(Qt::EditRole).toString(); QString originalArtworkUrl = changedItem->data(InfoItemModel::OriginalValueRole).toString(); for (int i = 0; i < m_mediaList.count(); i++) { MediaItem mediaItem = m_mediaList.at(i); if (artworkUrl != originalArtworkUrl && artworkUrl.isEmpty()) { mediaItem.artwork = Utilities::defaultArtworkForMediaItem(mediaItem); m_mediaList.replace(i, mediaItem); } Utilities::removeFromImageCache(mediaItem); } getArtwork(changedItem, artworkUrl); connect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); } else if (field == "url") { disconnect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); QString url = changedItem->data(Qt::EditRole).toString(); changedItem->setData(url, Qt::ToolTipRole); connect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); } else { //Update drill for changed item QVariant value = changedItem->data(Qt::EditRole); disconnect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); setDrill(changedItem, field, value); connect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); } //Since the data has changed then make sure the multipleValues flag is set to false disconnect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); changedItem->setData(false, InfoItemModel::MultipleValuesRole); connect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); } else { m_modified = false; for (int row = 0; row < rowCount(); row++) { QStandardItem *otherItem = item(row, 0); if (otherItem->data(InfoItemModel::FieldRole).toString() != "artwork") { if (otherItem->data(Qt::EditRole) != otherItem->data(InfoItemModel::OriginalValueRole)) { m_modified = true; break; } } } } updateMediaList(); //For type changes load all the fields for the new type if (field == "audioType" || field == "videoType") { int originalType = changedItem->data(InfoItemModel::OriginalValueRole).toInt(); int row = changedItem->row(); loadFieldsInOrder(); disconnect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); setData(index(row, 0), originalType, InfoItemModel::OriginalValueRole); connect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); } emit infoChanged(m_modified); } void InfoItemModel::saveFileMetaData(QList mediaList) { Utilities::saveAllInfoToTag(mediaList); } void InfoItemModel::saveCustomGenreInfo(QList mediaList) { if (mediaList.count() > 0) { if (mediaList.at(0).type == "Category" && (mediaList.at(0).subType() == "AudioGenre" || mediaList.at(0).subType() == "VideoGenre")) { QString localGenreFile = KGlobal::dirs()->locateLocal("data","bangarang/genrerc", true); if (localGenreFile.isEmpty()) { return; } KConfig genreConfig(localGenreFile); for (int i = 0; i < mediaList.count(); i++) { MediaItem mediaItem = mediaList.at(i); if (mediaItem.type == "Category" && (mediaItem.subType() == "AudioGenre" || mediaItem.subType() == "VideoGenre")) { KConfigGroup genreGroup(&genreConfig, mediaItem.fields["title"].toString()); QString artworkUrl = mediaItem.fields["artworkUrl"].toString(); if (artworkUrl.isEmpty()) { if (genreGroup.exists()) { genreGroup.deleteEntry("artworkUrl"); } } else { genreGroup.writeEntry("artworkUrl", artworkUrl); } } } genreConfig.sync(); } } } bool InfoItemModel::getArtwork(QStandardItem *fieldItem, QString artworkUrlOverride) { bool artworkExists = true; bool ignoreCache = m_modified; QList emptyArtworkPixmaps; fieldItem->setData(emptyArtworkPixmaps, InfoItemModel::ArtworkListRole); if (m_mediaList.count() == 1) { MediaItem mediaItem = m_mediaList.at(0); if (!artworkUrlOverride.isNull()) { mediaItem.fields["artworkUrl"] = artworkUrlOverride; } if (mediaItem.type == "Category") { QPixmap artwork = Utilities::getArtworkFromMediaItem(mediaItem, ignoreCache); if (!artwork.isNull()) { fieldItem->setData(QIcon(artwork), Qt::DecorationRole); } else { fieldItem->setData(mediaItem.artwork, Qt::DecorationRole); m_utilThread->getArtworksFromMediaItem(mediaItem, ignoreCache); } } else { //TODO: If Music mediaItems have embedded artwork, this will always return the embedded artwork instead of // specified artworkUrl. FIX in Utilities. QPixmap artwork = Utilities::getArtworkFromMediaItem(mediaItem, ignoreCache); if (!artwork.isNull()) { fieldItem->setData(QIcon(artwork), Qt::DecorationRole); } else { fieldItem->setData(mediaItem.artwork, Qt::DecorationRole); } } } else { if (m_mediaList.at(0).type == "Audio" || m_mediaList.at(0).type == "Video") { QList artworkPixmaps; QImage lastItemArtwork; for (int i = 0; i < qMin(10, m_mediaList.count()); i++) { MediaItem mediaItem = m_mediaList.at(i); if (!artworkUrlOverride.isNull()) { mediaItem.fields["artworkUrl"] = artworkUrlOverride; } QImage itemArtwork = Utilities::getArtworkImageFromMediaItem(mediaItem, ignoreCache); if (!lastItemArtwork.isNull() && !itemArtwork.isNull()) { bool sameImage = Utilities::compareImage(lastItemArtwork, itemArtwork, 50); if (!sameImage) { artworkPixmaps.append(QPixmap::fromImage(itemArtwork)); } } else if (lastItemArtwork.isNull() && !itemArtwork.isNull()) { artworkPixmaps.append(QPixmap::fromImage(itemArtwork)); } else if (itemArtwork.isNull()) { itemArtwork = mediaItem.artwork.pixmap(128,128).toImage(); artworkPixmaps.append(mediaItem.artwork.pixmap(128,128)); } lastItemArtwork = itemArtwork; } if (artworkPixmaps.count() > 0) { fieldItem->setData(artworkPixmaps, InfoItemModel::ArtworkListRole); } else { artworkExists = false; } } else { artworkExists = false; } } return artworkExists; } void InfoItemModel::gotArtworks(QList artworks, MediaItem mediaItem) { if (artworks.isEmpty()) { return; } if (m_mediaList.isEmpty()) { return; } if (m_mediaList.at(0).url != mediaItem.url) { return; } for (int i = 0; i < rowCount(); i++) { QStandardItem * fieldItem = item(i); QString field = fieldItem->data(InfoItemModel::FieldRole).toString(); if (field == "artwork") { //Convert Image list to Pixmap list QList artworkPixmaps; for (int i = 0; i < artworks.count(); i++) { if (!artworks.at(i).isNull()) { artworkPixmaps.append(QPixmap::fromImage(artworks.at(i))); } } if (!artworkPixmaps.isEmpty()) { disconnect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); fieldItem->setData(artworkPixmaps, InfoItemModel::ArtworkListRole); connect(this, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(itemChanged(QStandardItem *))); } break; } } } void InfoItemModel::setDrill(QStandardItem *item, const QString &field, const QVariant &value) { if (value.type() == QVariant::StringList && !categoryTypeForField(field, m_mediaList.at(0).type).isEmpty()) { QStringList values = value.toStringList(); QList drillItems; for (int i = 0; i < values.count(); i++) { MediaItem drillItem = createDrillItem(field, m_mediaList.at(0).type, values.at(i)); if (!drillItem.url.isEmpty()) { drillItems.append(QVariant::fromValue(drillItem)); } else { drillItems.append(QVariant()); } } item->setData(drillItems, InfoItemModel::DrillRole); } else if (!categoryTypeForField(field, m_mediaList.at(0).type).isEmpty()) { MediaItem drillItem = createDrillItem(field, m_mediaList.at(0).type, value.toString()); if (!drillItem.url.isEmpty()) { item->setData(QVariant::fromValue(drillItem), InfoItemModel::DrillRole); } else { item->setData(QVariant(), InfoItemModel::DrillRole); } } } QString InfoItemModel::categoryTypeForField(const QString &field, const QString &type) { QString categoryType; if (field == "artist") { categoryType = "Artist"; } else if (field == "composer") { categoryType = "Artist"; } else if (field == "album") { categoryType = "Album"; } else if (field == "genre" && type == "Audio") { categoryType = "AudioGenre"; } else if (field == "genre" && type == "Video") { categoryType = "VideoGenre"; } else if (field == "tags" && type == "Audio") { categoryType = "AudioTag"; } else if (field == "tags" && type == "Video") { categoryType = "VideoTag"; } else if (field == "seriesName") { categoryType = "TV Series"; } else if (field == "actor") { categoryType = "Actor"; } else if (field == "director") { categoryType = "Director"; } return categoryType; } MediaItem InfoItemModel::createDrillItem(const QString &field, const QString &type, const QString &value) { MediaItem mediaItem; QString categoryType = categoryTypeForField(field, type); if (categoryType == "Artist") { Nepomuk::Resource res(Utilities::artistResource(value)); mediaItem = Utilities::categoryMediaItemFromNepomuk(res, categoryType); mediaItem.url = m_drillLris[categoryType].arg(value); } else if (categoryType == "Actor") { Nepomuk::Resource res(Utilities::actorResource(value)); mediaItem = Utilities::categoryMediaItemFromNepomuk(res, categoryType); mediaItem.url = m_drillLris[categoryType].arg(value); } else if (categoryType == "Director") { Nepomuk::Resource res(Utilities::directorResource(value)); mediaItem = Utilities::categoryMediaItemFromNepomuk(res, categoryType); mediaItem.url = m_drillLris[categoryType].arg(value); } else if (categoryType == "Album") { Nepomuk::Resource res(Utilities::albumResource(value)); mediaItem = Utilities::categoryMediaItemFromNepomuk(res, categoryType); mediaItem.url = m_drillLris[categoryType].arg(value); } else if (categoryType == "TV Series") { Nepomuk::Resource res(Utilities::TVSeriesResource(value)); mediaItem = Utilities::categoryMediaItemFromNepomuk(res, categoryType); mediaItem.url = m_drillLris[categoryType].arg(value); } else if (categoryType == "AudioGenre" || categoryType == "VideoGenre") { mediaItem.type = "Category"; mediaItem.fields["categoryType"] = categoryType; mediaItem.title = value; mediaItem.fields["title"] = mediaItem.title; mediaItem.url = m_drillLris[categoryType].arg(value); mediaItem.fields["artworkUrl"] = Utilities::getGenreArtworkUrl(value); if (categoryType == "AudioGenre") { mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||genre=%1").arg(value)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||genre=%1").arg(value)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||genre=%1").arg(value)); } else { mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||genre=%1").arg(value)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||genre=%1").arg(value)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||genre=%1").arg(value)); } } else if (categoryType == "AudioTag" || categoryType == "VideoTag") { mediaItem.type = "Category"; mediaItem.fields["categoryType"] = categoryType; mediaItem.title = value; mediaItem.fields["title"] = mediaItem.title; mediaItem.url = m_drillLris[categoryType].arg(value); if (categoryType == "AudioTag") { mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?audio||limit=4||tag=%1").arg(value)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?audio||limit=4||tag=%1").arg(value)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?audio||limit=4||tag=%1").arg(value)); } else { mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||tag=%1").arg(value)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||tag=%1").arg(value)); mediaItem.addContext(i18n("Frequently Played"),QString("semantics://frequent?video||limit=4||tag=%1").arg(value)); } } if (mediaItem.title.isEmpty()) { mediaItem.title = value; mediaItem.fields["title"] = value; } return mediaItem; } void InfoItemModel::cancelFetching() { if (m_isFetching) { m_isFetching = false; m_fetchingStatus["description"] = i18n("Fetch Canceled"); emit fetchingStatusUpdated(); m_fetchingStatus["description"] = QString(); emit fetchingStatusUpdated(); emit fetchComplete(); } } Qt::DropActions InfoItemModel::supportedDropActions() const { return Qt::MoveAction | Qt::CopyAction; } QStringList InfoItemModel::mimeTypes() const { QStringList types; types << "text/uri-list" << "image"; return types; } Qt::ItemFlags InfoItemModel::flags(const QModelIndex &index) const { Qt::ItemFlags useFlags = Qt::ItemIsSelectable | Qt::ItemIsEnabled; QStandardItem *item = this->itemFromIndex(index); if (!item) { return useFlags; } if (this->itemFromIndex(index)->isEditable()) { useFlags |= Qt::ItemIsEditable; } QString field = data(index, InfoItemModel::FieldRole).toString(); if (index.isValid() && field == "artwork") { useFlags |= Qt::ItemIsDropEnabled; } return useFlags; } bool InfoItemModel::dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int row, int column, const QModelIndex &parent) { if (parent.column() > 0) { return false; } if (parent.row() < 0 || parent.row() >= this->rowCount()) { return false; } if (action == Qt::IgnoreAction) { return true; } if (!(mimeData->hasUrls() || mimeData->hasImage())) { return false; } QString field = data(index(parent.row(), 0), InfoItemModel::FieldRole).toString(); if (field != "artwork") { return false; } if (mimeData->hasUrls()) { QList urls = mimeData->urls(); if (!urls.isEmpty()) { KUrl url(urls.at(0)); if (url.isLocalFile()) { setData(index(parent.row(), 0), url.prettyUrl(), Qt::EditRole); setData(index(parent.row(), 0), false, InfoItemModel::MultipleValuesRole); return true; } } } if (mimeData->hasImage()) { QImage image = qvariant_cast(mimeData->imageData()); QString thumbnailFilename = QString("bangarang/thumbnails/Dropped-%1.png") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss")); KUrl thumbnailUrl = KUrl(KStandardDirs::locateLocal("data", thumbnailFilename, true)); image.save(thumbnailUrl.path(),"PNG"); setData(index(parent.row(), 0), thumbnailUrl.prettyUrl(), Qt::EditRole); setData(index(parent.row(), 0), false, InfoItemModel::MultipleValuesRole); return true; } return false; Q_UNUSED(parent); Q_UNUSED(row); Q_UNUSED(column); } void InfoItemModel::loadNextValueList() { QString lri = m_valueListLoader->mediaListProperties().lri; QString field = m_valueListLris.key(lri); if (field.isEmpty()) { return; } QStringList valueList; for (int i = 0; i < m_valueListLoader->rowCount(); i++) { valueList.append(m_valueListLoader->mediaItemAt(i).title); } if (!valueList.isEmpty()) { m_valueLists[field] = valueList; } m_loadedValueLists.append(field); QStringList allLoadableFields = m_valueListLris.keys(); for (int i = 0; i < allLoadableFields.count(); i++) { QString loadableField = allLoadableFields.at(i); if (!m_loadedValueLists.contains(loadableField)) { QString lri = m_valueListLris.value(loadableField); m_valueListLoader->loadLRI(lri); break; } } } void InfoItemModel::reloadValueLists() { m_loadedValueLists.clear(); QString lri = m_valueListLris.values().at(0); m_valueListLoader->loadLRI(lri); } bangarang-bangarang/src/platform/infoitemmodel.h000066400000000000000000000203631166760560600223540ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef INFOITEMMODEL_H #define INFOITEMMODEL_H #include #include #include #include "mediaitemmodel.h" class InfoFetcher; class MediaIndexer; namespace Utilities { class Thread; } /* * This model is responsible for storing information contained in a MediaItem or list of MediaItems. * It recognizes shared values across media items and provides InfoFetchers for updating MediaItem * information. It is useful for displaying and editing MediaItem information. If a MediaItemModel * is provided it can request changes to be saved to the source of the MediaItem information. */ class InfoItemModel : public QStandardItemModel { Q_OBJECT public: /** * Roles for storing and accessing data stored by this model. **/ enum InfoItemRoles {FieldRole = Qt::UserRole, FieldNameRole = Qt::UserRole + 1, MultipleValuesRole = Qt::UserRole + 2, OriginalValueRole = Qt::UserRole + 3, ValueListRole = Qt::UserRole + 4, ArtworkListRole = Qt::UserRole + 5, DrillRole = Qt::UserRole + 6}; /** * Type of fetch. **/ enum FetchType {AutoFetch = 0, Fetch = 1}; /** * Constructor **/ InfoItemModel(QObject * parent = 0); /** * Destructor **/ ~InfoItemModel(); /** * Load information into the model for the provided list of MediaItems **/ void loadInfo(const QList & mediaList); /** * Save changes made to the data contained in the model **/ void saveChanges(); /** * Cancel changes made to the data contained in the model **/ void cancelChanges(); /** * Returns the list of MediaItems for which information is stored in the model **/ QList mediaList(); /** * Sets the MediaItemModel which generated the MediaItems provide to this model. * This is the model that is used to save changes made to the information for * provided MediaItems **/ void setSourceModel(MediaItemModel *sourceModel); /** * Returns list of InfoFetchers provided by this model **/ QList infoFetchers(); /** * Returns list of InfoFetchers that are available for fetching info for the * currently load MediaItems. **/ QList availableInfoFetchers(); /** * Returns true if provided InfoFetcher can automatically fetch information for the currently * loaded MediaItems. **/ bool autoFetchIsAvailable(InfoFetcher* infoFetcher); /** * Returns true if provided InfoFetcher can fetch information for the currently * loaded MediaItems. **/ bool fetchIsAvailable(InfoFetcher* infoFetcher); /** * Autofetch information for the currently loaded MediaItems. Changes * will automatically be saved. **/ void autoFetch(InfoFetcher* infoFetcher, bool updateRequiredFields = true, bool updateArtwork = true); /** * Fetch information for the currently loaded MediaItems. Fetched information will * loaded into model as changes - changes are not automatically saved. **/ void fetch(InfoFetcher* infoFetcher); /** * Return list of MediaItems containing matching fetched information. */ QList fetchedMatches(); Qt::DropActions supportedDropActions() const; Qt::ItemFlags flags(const QModelIndex &index) const; bool dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int row, int column, const QModelIndex &parent); QStringList mimeTypes() const; QHash fetchingStatus(); public slots: /** * Selects the index of the MediaItem containing fetched information to load into the model */ void selectFetchedMatch(int index); /** * Set the rating for all currently loaded MediaItems. Rating changes are automatically saved. **/ void setRating(int rating); /** * Clears the current artwork in the artwork field */ void clearArtwork(); /** * Loads fields for currently selected items in order */ void loadFieldsInOrder(); Q_SIGNALS: /** * Emitted when information contained in the model might have been changed. **/ void infoChanged(bool modified); /** * Emitted when information is being fetched for MediaItems contained in the model. **/ void fetching(); /** * Emitted when information fetching has completed. Note that this signal is * also emitted if fetching times out. **/ void fetchComplete(); void fetchingStatusUpdated(); private: QList m_mediaList; QList m_originalList; MediaItemModel * m_sourceModel; QHash m_fieldsOrder; QHash m_fieldNames; QHash m_restrictedFields; QHash m_drillLris; bool m_defaultEditable; bool m_modified; bool m_isFetching; QList m_infoFetchers; FetchType m_fetchType; MediaIndexer * m_indexer; bool m_suppressFetchOnLoad; QList m_itemsToFetch; QList m_fetchedMatches; int m_selectedFetchedMatch; Utilities::Thread * m_utilThread; MediaItemModel * m_valueListLoader; QHash m_valueListLris; QStringList m_loadedValueLists; QHash m_valueLists; void fetchBatch(InfoFetcher *infoFetcher, int maxMatches, bool updateRequiredFields, bool updateArtwork); QHash m_fetchingStatus; void addFieldToValuesModel(const QString &fieldTitle, const QString &field, bool isEditable = false); bool hasMultipleValues(const QString &field); QVariant commonValue(const QString &field); QStringList valueList(const QString &field); bool isEmpty(const QString &field); void updateMediaList(); void saveFileMetaData(QList mediaList); void saveCustomGenreInfo(QList mediaList); bool getArtwork(QStandardItem *fieldItem, QString artworkUrlOverride = QString()); void setDrill(QStandardItem *item, const QString &field, const QVariant &value); QString categoryTypeForField(const QString &field, const QString &type); MediaItem createDrillItem(const QString &field, const QString &type, const QString &value); private Q_SLOTS: void itemChanged(QStandardItem *changedItem); void infoFetched(QList fetchedMatches); void updateFetchedInfo(int index, MediaItem match); void infoFetcherComplete(InfoFetcher *infoFetcher); void noResults(InfoFetcher *infoFetcher); void gotArtworks(QList artworks, MediaItem mediaItem); void cancelFetching(); void loadNextValueList(); void reloadValueLists(); }; #endif // INFOITEMDELEGATE_H bangarang-bangarang/src/platform/listengines/000077500000000000000000000000001166760560600216705ustar00rootroot00000000000000bangarang-bangarang/src/platform/listengines/ampachelistengine.cpp000066400000000000000000000431571166760560600260660ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "../mediaitemmodel.h" #include "ampachelistengine.h" #include "listenginefactory.h" #include "../mediaindexer.h" #include "../utilities/utilities.h" #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include #include #include #include #include AmpacheListEngine::AmpacheListEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { m_fetchingThumbnails = false; m_token = QString(); } AmpacheListEngine::~AmpacheListEngine() { } void AmpacheListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { return; } //Create media list based on engine argument and filter QList mediaList; QString engineArg = m_mediaListProperties.engineArg(); QStringList engineFilterList = m_mediaListProperties.engineFilterList(); if (!engineFilterList.isEmpty()) { QString server = m_mediaListProperties.filterFieldValue("server"); QString request = m_mediaListProperties.filterFieldValue("request"); m_pendingRequest["server"] = server; m_pendingRequest["request"] = request; if (request == "root") { QString username = m_mediaListProperties.filterFieldValue("username"); QString key = m_mediaListProperties.filterFieldValue("key"); //Handshake m_pendingRequest["username"] = username; m_pendingRequest["key"] = key; sendHandshake(server, username, key); } else { QString requestUrlStr = server + m_mediaListProperties.filterFieldValue("requestPath"); KUrl requestUrl(requestUrlStr); if (!requestUrl.isEmpty()) { QString targetFile = QString("bangarang/temp/%1").arg(QString("ampacheResult-%1-%2").arg(m_requestSignature, m_subRequestSignature)); KUrl targetUrl = KUrl(KStandardDirs::locateLocal("data", targetFile, true)); connectDownloader(); emit download(requestUrl, targetUrl); } } //Start event loop to wait for feed results exec(); } else { //Return no results m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count()); m_mediaListProperties.type = QString("Categories"); emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); } } void AmpacheListEngine::downloadComplete(const KUrl &from, const KUrl &to) { if (!m_fetchingThumbnails) { m_mediaList.clear(); m_artworkUrlList.clear(); QFile file(to.path()); QDomDocument feedDoc("feed"); feedDoc.setContent(&file); bool errorExists = false; if (!feedDoc.elementsByTagName("error").isEmpty()) { errorExists = true; QDomElement errorElement = feedDoc.elementsByTagName("error").at(0).toElement(); if (errorElement.attribute("code") == "400") { errorExists = true; } } if (!feedDoc.elementsByTagName("auth").isEmpty()) { QDomElement authElement = feedDoc.elementsByTagName("auth").at(0).toElement(); m_token = authElement.text(); } if (errorExists) { QDomElement errorElement = feedDoc.elementsByTagName("error").at(0).toElement(); MediaItem errorMessage; errorMessage.title = errorElement.text(); errorMessage.type = "Message"; m_mediaList.append(errorMessage); } else if (m_pendingRequest["request"] == "root") { QString server = m_pendingRequest["server"]; MediaItem mediaItem; QString requestPath = QString("/server/xml.server.php?action=artists&auth=%2").arg(m_token); mediaItem.url = QString("ampache://audio?server=%1||requestPath=%2||request=artists").arg(server, requestPath); mediaItem.title = i18n("Artists"); mediaItem.type = QString("Category"); mediaItem.artwork = KIcon("system-users"); mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; m_mediaList.append(mediaItem); requestPath = QString("/server/xml.server.php?action=albums&auth=%2").arg(m_token); mediaItem.url = QString("ampache://audio?server=%1||requestPath=%2||request=albums").arg(server, requestPath); mediaItem.title = i18n("Albums"); mediaItem.type = QString("Category"); mediaItem.artwork = KIcon("media-optical"); mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; m_mediaList.append(mediaItem); requestPath = QString("/server/xml.server.php?action=genres&auth=%2").arg(m_token); mediaItem.url = QString("ampache://audio?server=%1||requestPath=%2||request=genres").arg(server, requestPath); mediaItem.title = i18n("Genres"); mediaItem.type = QString("Category"); mediaItem.artwork = KIcon("flag-blue"); mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; m_mediaList.append(mediaItem); requestPath = QString("/server/xml.server.php?action=playlists&auth=%2").arg(m_token); mediaItem.url = QString("ampache://audio?server=%1||requestPath=%2||request=playlists").arg(server, requestPath); mediaItem.title = i18n("Playlists"); mediaItem.type = QString("Category"); mediaItem.artwork = KIcon("view-media-playlist"); mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; m_mediaList.append(mediaItem); m_pendingRequest.clear(); m_mediaListProperties.summary = i18np("1 item", "%1 items", m_mediaList.count()); m_mediaListProperties.type = QString("Categories"); } else if (m_pendingRequest["request"] == "artists") { QString server = m_pendingRequest["server"]; //Iterate through item nodes of the XML document QDomNodeList items = feedDoc.elementsByTagName("artist"); for (int i = 0; i < items.count(); i++) { MediaItem mediaItem; QString id = items.at(i).toElement().attribute("id"); QString requestPath = QString("/server/xml.server.php?action=artist_songs&auth=%2&filter=%3").arg(m_token, id); mediaItem.url = QString("ampache://audio?server=%1||requestPath=%2||request=songs").arg(server, requestPath); mediaItem.type = QString("Category"); mediaItem.artwork = KIcon("system-users"); QDomNodeList childNodes = items.at(i).childNodes(); for (int j = 0; j < childNodes.count(); j++) { QDomElement element = childNodes.at(j).toElement(); if (element.tagName() == "name") { mediaItem.title = element.text(); mediaItem.fields["title"] = mediaItem.title; } } mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; m_mediaList.append(mediaItem); } m_mediaListProperties.summary = i18np("1 artist", "%1 artists", m_mediaList.count()); m_mediaListProperties.type = QString("Categories"); } else if (m_pendingRequest["request"] == "albums") { QString server = m_pendingRequest["server"]; //Iterate through item nodes of the XML document QDomNodeList items = feedDoc.elementsByTagName("album"); for (int i = 0; i < items.count(); i++) { MediaItem mediaItem; QString id = items.at(i).toElement().attribute("id"); QString requestPath = QString("/server/xml.server.php?action=album_songs&auth=%2&filter=%3").arg(m_token, id); mediaItem.url = QString("ampache://audio?server=%1||requestPath=%2||request=songs").arg(server, requestPath); mediaItem.type = QString("Category"); mediaItem.artwork = KIcon("media-optical"); QString artist; QDomNodeList childNodes = items.at(i).childNodes(); for (int j = 0; j < childNodes.count(); j++) { QDomElement element = childNodes.at(j).toElement(); if (element.tagName() == "name") { mediaItem.title = element.text(); mediaItem.fields["title"] = mediaItem.title; } if (element.tagName() == "artist") { artist = element.text(); } } mediaItem.subTitle = artist; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; m_mediaList.append(mediaItem); } m_mediaListProperties.summary = i18np("1 album", "%1 albums", m_mediaList.count()); m_mediaListProperties.type = QString("Categories"); } else if (m_pendingRequest["request"] == "genres") { QString server = m_pendingRequest["server"]; //Iterate through item nodes of the XML document QDomNodeList items = feedDoc.elementsByTagName("tag"); for (int i = 0; i < items.count(); i++) { MediaItem mediaItem; QString id = items.at(i).toElement().attribute("id"); QString requestPath = QString("/server/xml.server.php?action=genre_songs&auth=%2&filter=%3").arg(m_token, id); mediaItem.url = QString("ampache://audio?server=%1||requestPath=%2||genre=songs").arg(server, requestPath); mediaItem.type = QString("Category"); mediaItem.artwork = KIcon("flag-blue"); QDomNodeList childNodes = items.at(i).childNodes(); for (int j = 0; j < childNodes.count(); j++) { QDomElement element = childNodes.at(j).toElement(); if (element.tagName() == "name") { mediaItem.title = element.text(); mediaItem.fields["title"] = mediaItem.title; } } mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; m_mediaList.append(mediaItem); } m_mediaListProperties.summary = i18np("1 genre", "%1 genres", m_mediaList.count()); m_mediaListProperties.type = QString("Categories"); } else if (m_pendingRequest["request"] == "playlists") { QString server = m_pendingRequest["server"]; //Iterate through item nodes of the XML document QDomNodeList items = feedDoc.elementsByTagName("playlist"); for (int i = 0; i < items.count(); i++) { MediaItem mediaItem; QString id = items.at(i).toElement().attribute("id"); QString requestPath = QString("/server/xml.server.php?action=playlist_songs&auth=%2&filter=%3").arg(m_token, id); mediaItem.url = QString("ampache://audio?server=%1||requestPath=%2||request=songs").arg(server, requestPath); mediaItem.type = QString("Category"); mediaItem.artwork = KIcon("view-media-playlist"); QDomNodeList childNodes = items.at(i).childNodes(); for (int j = 0; j < childNodes.count(); j++) { QDomElement element = childNodes.at(j).toElement(); if (element.tagName() == "name") { mediaItem.title = element.text(); mediaItem.fields["title"] = mediaItem.title; } } mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; m_mediaList.append(mediaItem); } m_mediaListProperties.summary = i18np("1 playlist", "%1 playlists", m_mediaList.count()); m_mediaListProperties.type = QString("Categories"); } else if (m_pendingRequest["request"] == "songs") { //Iterate through item nodes of the XML document QDomNodeList items = feedDoc.elementsByTagName("song"); for (int i = 0; i < items.count(); i++) { MediaItem mediaItem; mediaItem.type = "Audio"; mediaItem.fields["audioType"] = "Audio Stream"; mediaItem.artwork = KIcon("text-html"); QDomNodeList childNodes = items.at(i).childNodes(); QString artist; QString album; for (int j = 0; j < childNodes.count(); j++) { QDomElement element = childNodes.at(j).toElement(); if (element.tagName() == "title") { mediaItem.title = element.text(); mediaItem.fields["title"] = mediaItem.title; } if (element.tagName() == "artist") { artist = element.text(); } if (element.tagName() == "album") { album = element.text(); } if (element.tagName() == "track") { mediaItem.fields["trackNumber"] = element.text(); } if (element.tagName() == "url") { mediaItem.url = element.text(); mediaItem.fields["url"] = mediaItem.url; } if (element.tagName() == "time") { int duration = element.text().trimmed().toInt(); mediaItem.fields["duration"] = duration; mediaItem.duration = Utilities::durationString(duration); } } mediaItem.subTitle = QString("%1 - %2").arg(artist, album); mediaItem.fields["description"] = mediaItem.subTitle; m_mediaList.append(mediaItem); } m_mediaListProperties.summary = i18np("1 song", "%1 songs", m_mediaList.count()); m_mediaListProperties.type = QString("Sources"); } //Return results emit results(m_requestSignature, m_mediaList, m_mediaListProperties, true, m_subRequestSignature); //Consume results file file.remove(); //Launch thumbnail downloads // for (int i = 0; i < m_artworkUrlList.count(); i++) { // KUrl artworkUrl = m_artworkUrlList.at(i); // if (!artworkUrl.isEmpty()) { // m_fetchingThumbnails = true; // QString artworkTargetFile = QString("bangarang/thumbnails/%1").arg(artworkUrl.fileName()); // KUrl artworkTargetUrl = KUrl(KStandardDirs::locateLocal("data", artworkTargetFile, true)); // emit download(artworkUrl, artworkTargetUrl); // } // } // } else { // //Update feed item artwork with thumbnail downloads // int index = m_artworkUrlList.indexOf(from); // if (index != -1) { // MediaItem mediaItem = m_mediaList.at(index); // mediaItem.fields["artworkUrl"] = to.prettyUrl(); // QImage artwork = Utilities::getArtworkImageFromMediaItem(mediaItem); // if (!artwork.isNull()) { // mediaItem.hasCustomArtwork = true; // emit updateArtwork(artwork, mediaItem); // } // m_mediaList.removeAt(index); // m_artworkUrlList.removeAt(index); // if (m_mediaList.count() == 0) { // m_fetchingThumbnails = false; // disconnectDownloader(); // } // } } if (!m_fetchingThumbnails) { //Exit event loop quit(); } Q_UNUSED(from); } void AmpacheListEngine::sendHandshake(const QString server, const QString username, const QString key) { QString timestamp = QString::number(QDateTime::currentDateTime().toTime_t()); QString passPhrase = Utilities::sha256Of(timestamp + key); QString serverUrlStr = QString("%1/server/xml.server.php?action=handshake&auth=%2×tamp=%3&version=350001&user=%4") .arg(server) .arg(passPhrase) .arg(timestamp) .arg(username); KUrl serverUrl(serverUrlStr); if (!serverUrl.isEmpty()) { QString targetFile = QString("bangarang/temp/%1").arg(QString("ampacheResult")); KUrl targetUrl = KUrl(KStandardDirs::locateLocal("data", targetFile, true)); connectDownloader(); emit download(serverUrl, targetUrl); } } bangarang-bangarang/src/platform/listengines/ampachelistengine.h000066400000000000000000000031611166760560600255220ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef AMPACHELISTENGINE_H #define AMPACHELISTENGINE_H #include "nepomuklistengine.h" #include #include #include #include #include #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; class MediaIndexer; class AmpacheListEngine : public NepomukListEngine { Q_OBJECT public: AmpacheListEngine(ListEngineFactory* parent); ~AmpacheListEngine(); void run(); private: QString m_serverPath; QList m_mediaList; QList m_artworkUrlList; bool m_fetchingThumbnails; QString m_token; QHash m_pendingRequest; void sendHandshake(const QString server, const QString username, const QString key); private slots: void downloadComplete(const KUrl &from, const KUrl &to); }; #endif // AMPACHELISTENGINE_H bangarang-bangarang/src/platform/listengines/audioclipslistengine.cpp000066400000000000000000000155071166760560600266220ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "audioclipslistengine.h" #include "listenginefactory.h" #include "../mediaitemmodel.h" #include "../mediavocabulary.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include #include AudioClipsListEngine::AudioClipsListEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { } AudioClipsListEngine::~AudioClipsListEngine() { } void AudioClipsListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { NepomukListEngine::run(); return; } //Create media list based on engine argument and filter QList mediaList; MediaVocabulary mediaVocabulary = MediaVocabulary(); QString engineArg = m_mediaListProperties.engineArg(); QString engineFilter = m_mediaListProperties.engineFilter(); if (m_nepomukInited) { if (engineArg.isEmpty()) { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.artworkBinding()); bindings.append(mediaVocabulary.playCountBinding()); bindings.append(mediaVocabulary.lastPlayedBinding()); //bindings.append(mediaVocabulary.genreBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudio(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional)); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.titleBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Audio Clip"), m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { mediaList.append(mediaItem); } } m_mediaListProperties.summary = i18np("1 clip", "%1 clips", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } else if (engineArg.toLower() == "search") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.artworkBinding()); //bindings.append(mediaVocabulary.genreBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudio(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasTag(MediaQuery::Optional)); query.startFilter(); query.addFilterConstraint(mediaVocabulary.titleBinding(), engineFilter, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.descriptionBinding(), engineFilter, MediaQuery::Contains); query.endFilter(); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.titleBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Audio Clip"), m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { mediaList.append(mediaItem); } } m_mediaListProperties.summary = i18np("1 clip", "%1 clips", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } } emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); //Check if MediaItems in mediaList exist QList mediaItems = Utilities::mediaItemsDontExist(mediaList); if (mediaItems.count() > 0) { emit updateMediaItems(mediaItems); } m_requestSignature = QString(); m_subRequestSignature = QString(); } void AudioClipsListEngine::setFilterForSources(const QString& engineFilter) { //Always return songs m_mediaListProperties.lri = QString("audioclips://?%1").arg(engineFilter); } bangarang-bangarang/src/platform/listengines/audioclipslistengine.h000066400000000000000000000026561166760560600262700ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef AUDIOCLIPSLISTENGINE_H #define AUDIOCLIPSLISTENGINE_H #include "nepomuklistengine.h" #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; /** * This ListEngine retrieves Audio Clips from the nepmuk data store. * List Resource Identifiers handled are: * audioclips:// * audioclips://search?[search term] */ class AudioClipsListEngine : public NepomukListEngine { Q_OBJECT public: AudioClipsListEngine(ListEngineFactory *parent); ~AudioClipsListEngine(); void run(); void setFilterForSources(const QString& engineFilter); }; #endif // AUDIOCLIPSLISTENGINE_H bangarang-bangarang/src/platform/listengines/audiostreamlistengine.cpp000066400000000000000000000154001166760560600267730ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "audiostreamlistengine.h" #include "listenginefactory.h" #include "../mediaitemmodel.h" #include "../mediavocabulary.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include AudioStreamListEngine::AudioStreamListEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { } AudioStreamListEngine::~AudioStreamListEngine() { } void AudioStreamListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { NepomukListEngine::run(); return; } //Create media list based on engine argument and filter QList mediaList; MediaVocabulary mediaVocabulary = MediaVocabulary(); QString engineArg = m_mediaListProperties.engineArg(); QString engineFilter = m_mediaListProperties.engineFilter(); if (m_nepomukInited) { if (engineArg.isEmpty()) { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.artworkBinding()); //bindings.append(mediaVocabulary.genreBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioStream(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.titleBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Audio Stream"), m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { mediaList.append(mediaItem); } } m_mediaListProperties.summary = i18np("1 stream", "%1 streams", mediaList.count()); MediaItem mediaItem; mediaItem.type = "Audio"; mediaItem.url = QString(); mediaItem.title = i18n("New Audio Stream"); mediaItem.subTitle = i18n("Edit info to create new audio stream"); mediaItem.artwork = KIcon("text-html"); mediaItem.fields["title"] = i18n("Untitled"); mediaItem.fields["audioType"] = "Audio Stream"; mediaItem.fields["isTemplate"] = true; mediaList.append(mediaItem); m_mediaListProperties.type = QString("Sources"); } else if (engineArg.toLower() == "search") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.artworkBinding()); //bindings.append(mediaVocabulary.genreBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioStream(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.startFilter(); query.addFilterConstraint(mediaVocabulary.titleBinding(), engineFilter, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.descriptionBinding(), engineFilter, MediaQuery::Contains); query.endFilter(); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.titleBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Audio Stream"), m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { mediaList.append(mediaItem); } } m_mediaListProperties.summary = i18np("1 stream", "%1 streams", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } } emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); m_requestSignature = QString(); m_subRequestSignature = QString(); } void AudioStreamListEngine::setFilterForSources(const QString& engineFilter) { //Always return streams m_mediaListProperties.lri = QString("audiostreams://?%1").arg(engineFilter); } void AudioStreamListEngine::activateAction() { } bangarang-bangarang/src/platform/listengines/audiostreamlistengine.h000066400000000000000000000027311166760560600264430ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef AUDIOSTREAMLISTENGINE_H #define AUDIOSTREAMLISTENGINE_H #include "nepomuklistengine.h" #include #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; /** * This ListEngine retrieves Audio Streams from the nepomuk data store. * List Resource Identifiers handled are: * audiostreams:// * audiostreams://search */ class AudioStreamListEngine : public NepomukListEngine { Q_OBJECT public: AudioStreamListEngine(ListEngineFactory *parent); ~AudioStreamListEngine(); void run(); void setFilterForSources(const QString& engineFilter); void activateAction(); }; #endif // AUDIOSTREAMLISTENGINE_H bangarang-bangarang/src/platform/listengines/cachelistengine.cpp000066400000000000000000000035731166760560600255310ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "../mediaitemmodel.h" #include "cachelistengine.h" #include "../utilities/utilities.h" #include "listenginefactory.h" #include "../medialistcache.h" CacheListEngine::CacheListEngine(ListEngineFactory * parent) : ListEngine(parent) { } CacheListEngine::~CacheListEngine() { } void CacheListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; QList mediaList; MediaListProperties mediaListProperties; QString lri = m_mediaListProperties.engineFilter(); if (!lri.isEmpty()) { if (model()->mediaListCache()->isInCache(lri)) { mediaList = model()->mediaListCache()->mediaList(lri); mediaListProperties = model()->mediaListCache()->mediaListProperties(lri); } } emit results(m_requestSignature, mediaList, mediaListProperties, true, m_subRequestSignature); //Check if MediaItems in mediaList exist QList mediaItems = Utilities::mediaItemsDontExist(mediaList); if (mediaItems.count() > 0) { emit updateMediaItems(mediaItems); } m_requestSignature = QString(); m_subRequestSignature = QString(); } bangarang-bangarang/src/platform/listengines/cachelistengine.h000066400000000000000000000023521166760560600251700ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef CACHELISTENGINE_H #define CACHELISTENGINE_H #include "listengine.h" #include class MediaItem; class MediaListProperties; class ListEngineFactory; /** * This ListEngine retrieves cached media lists from the cache. * List Resource Identifiers handled are: * cache://?[lri] */ class CacheListEngine : public ListEngine { Q_OBJECT public: CacheListEngine(ListEngineFactory *parent); ~CacheListEngine(); void run(); }; #endif // CACHELISTENGINE_H bangarang-bangarang/src/platform/listengines/cdlistengine.cpp000066400000000000000000000073261166760560600250540ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "../mediaitemmodel.h" #include "cdlistengine.h" #include "listenginefactory.h" #include "../mediaindexer.h" #include "../utilities/utilities.h" #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include #include #include #include #include #include CDListEngine::CDListEngine(ListEngineFactory * parent) : ListEngine(parent) { m_mediaObject = new Phonon::MediaObject(this); m_mediaObject->setCurrentSource(Phonon::Cd); connect(m_mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged(Phonon::State, Phonon::State))); m_loadWhenReady = false; qRegisterMetaType("MediaSource"); } CDListEngine::~CDListEngine() { delete m_mediaObject; } void CDListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; //check if Audio CD is present QString udi = m_mediaListProperties.engineArg(); Solid::Device device = Solid::Device( udi ); const Solid::Block* block = device.as(); QList mediaList; if (block->isValid()) { QString dev_str = block->device(); if (!m_loadWhenReady) { m_mediaObject->setCurrentSource(Phonon::MediaSource(Phonon::Cd, dev_str)); m_loadWhenReady = true; } forever { if (m_stop) { return; } if (m_mediaObject->state() == Phonon::LoadingState) { msleep(100); continue; } Phonon::MediaController *mediaController = new Phonon::MediaController(m_mediaObject); int trackCount = mediaController->availableTitles(); //int duration; for (int i = 1; i <= trackCount; i++) { if (m_stop) { return; } KUrl url = Utilities::deviceUrl("cd", udi, QString(), "Audio", i); MediaItem mediaItem = Utilities::mediaItemFromUrl(url); mediaItem.subTitle = i18nc("%1=Total number of tracks on the CD", "Audio CD - %1 Tracks", trackCount); mediaList << mediaItem; } m_mediaListProperties.summary = i18np("1 track", "%1 tracks", mediaList.count()); delete mediaController; break; } } emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); m_requestSignature = QString(); m_subRequestSignature = QString(); m_loadWhenReady = false; //exec(); } void CDListEngine::stateChanged(Phonon::State newState, Phonon::State oldState) { if ((oldState == Phonon::LoadingState) && m_loadWhenReady) { start(); } Q_UNUSED(newState); } bangarang-bangarang/src/platform/listengines/cdlistengine.h000066400000000000000000000027751166760560600245240ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef CDLISTENGINE_H #define CDLISTENGINE_H #include "listengine.h" #include #include #include #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; class MediaIndexer; /** * This ListEngine retrieves CD tracks from an Audio CD. * List Resource Identifiers handled are: * cdaudio:// */ class CDListEngine : public ListEngine { Q_OBJECT public: CDListEngine(ListEngineFactory *parent); ~CDListEngine(); void run(); private: Phonon::MediaObject *m_mediaObject; bool m_loadWhenReady; private slots: void stateChanged(Phonon::State newState, Phonon::State oldState); }; #endif // CDLISTENGINE_H bangarang-bangarang/src/platform/listengines/dvdlistengine.cpp000066400000000000000000000073611166760560600252420ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "../mediaitemmodel.h" #include "dvdlistengine.h" #include "listenginefactory.h" #include "../mediaindexer.h" #include "../utilities/utilities.h" #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include #include #include DVDListEngine::DVDListEngine(ListEngineFactory * parent) : ListEngine(parent) { m_mediaObject = new Phonon::MediaObject(this); m_mediaObject->setCurrentSource(Phonon::Dvd); connect(m_mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged(Phonon::State, Phonon::State))); m_loadWhenReady = false; } DVDListEngine::~DVDListEngine() { delete m_mediaObject; } void DVDListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; QString udi = m_mediaListProperties.engineArg(); Solid::Device device = Solid::Device( udi ); const Solid::Block* block = device.as(); QList mediaList; if (!block->isValid()) { emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); return; } QString dev_str = block->device(); if (!m_loadWhenReady) { m_mediaObject->setCurrentSource(Phonon::MediaSource(Phonon::Dvd, dev_str)); m_loadWhenReady = true; } } void DVDListEngine::stateChanged(Phonon::State newState, Phonon::State oldState) { if ((oldState == Phonon::LoadingState) && m_loadWhenReady) { QString udi = m_mediaListProperties.engineArg(); QString discTitle = Utilities::deviceName(udi, m_mediaObject); Phonon::MediaController *mediaController = new Phonon::MediaController(m_mediaObject); int trackCount = mediaController->availableTitles(); QList mediaList; if (trackCount == 0) { KUrl url = Utilities::deviceUrl("dvd", udi, discTitle, "Video", -1); MediaItem mediaItem = Utilities::mediaItemFromUrl(url); mediaList << mediaItem; } else { for (int i = 1; i <= trackCount; i++) { if (m_stop) { return; } KUrl url = Utilities::deviceUrl("dvd", udi, discTitle, "Video", i); MediaItem mediaItem = Utilities::mediaItemFromUrl(url); if (discTitle.isEmpty()) mediaItem.subTitle = i18nc("%1=Total number of tracks on the DVD", "DVD Video - %1 Titles", trackCount); mediaList << mediaItem; } } delete mediaController; m_mediaListProperties.summary = i18np("1 title", "%1 titles", mediaList.count()); emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); m_requestSignature = QString(); m_subRequestSignature = QString(); m_loadWhenReady = false; } Q_UNUSED(newState); } bangarang-bangarang/src/platform/listengines/dvdlistengine.h000066400000000000000000000031011166760560600246730ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef DVDLISTENGINE_H #define DVDLISTENGINE_H #include "listengine.h" #include #include #include #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; class MediaIndexer; /** * This ListEngine retrieves video Titles from an DVD. * List Resource Identifiers handled are: * dvdvideo:// */ class DVDListEngine : public ListEngine { Q_OBJECT public: DVDListEngine(ListEngineFactory *parent); ~DVDListEngine(); void run(); private: Phonon::MediaObject *m_mediaObject; Phonon::MediaController *m_mediaController; bool m_loadWhenReady; private slots: void stateChanged(Phonon::State newState, Phonon::State oldState); }; #endif // DVDLISTENGINE_H bangarang-bangarang/src/platform/listengines/feedlistengine.cpp000066400000000000000000000446271166760560600253760ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "../mediaitemmodel.h" #include "feedlistengine.h" #include "listenginefactory.h" #include "../mediaindexer.h" #include "../utilities/utilities.h" #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include #include #include FeedListEngine::FeedListEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { m_fetchingThumbnails = false; } FeedListEngine::~FeedListEngine() { } void FeedListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { NepomukListEngine::run(); return; } //Create media list based on engine argument and filter QList mediaList; MediaVocabulary mediaVocabulary = MediaVocabulary(); QString engineArg = m_mediaListProperties.engineArg(); QString engineFilter = m_mediaListProperties.engineFilter(); QStringList engineFilterList = m_mediaListProperties.engineFilterList(); if (m_nepomukInited) { if (engineArg == "audiofeeds") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.artworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioFeed(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings = bindings; query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } QString title = it.binding(mediaVocabulary.titleBinding()).literal().toString().trimmed(); QString description = it.binding(mediaVocabulary.descriptionBinding()).literal().toString().trimmed(); QString feedUrl = it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri().toString(); MediaItem mediaItem; mediaItem.url = QString("feeds://audio?feedUrl=%1").arg(feedUrl); mediaItem.type = "Category"; mediaItem.fields["categoryType"] = QString("Audio Feed"); mediaItem.artwork = KIcon("application-rss+xml"); mediaItem.title = title; mediaItem.fields["title"] = title; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.fields["description"] = description; mediaItem.fields["url"] = feedUrl; mediaItem.fields["resourceUri"] = it.binding(MediaVocabulary::mediaResourceBinding()).uri().toString(); mediaItem.fields["artworkUrl"] = it.binding(MediaVocabulary::artworkBinding()).uri().toString(); mediaItem = Utilities::makeSubtitle(mediaItem); mediaList.append(mediaItem); } MediaItem mediaItem; mediaItem.title = i18n("New audio feed"); mediaItem.subTitle = i18n("Edit info to create new audio feed"); mediaItem.fields["title"] = "Untitled"; mediaItem.fields["url"] = QString(); mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("Audio Feed"); mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.fields["isTemplate"] = true; mediaItem.artwork = KIcon("application-rss+xml"); mediaList.append(mediaItem); m_mediaListProperties.summary = i18np("1 feed", "%1 feeds", mediaList.count()); m_mediaListProperties.type = QString("Categories"); //Return results emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); } else if (engineArg == "videofeeds") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.artworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeVideoFeed(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings = bindings; query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } QString title = it.binding(mediaVocabulary.titleBinding()).literal().toString().trimmed(); QString description = it.binding(mediaVocabulary.descriptionBinding()).literal().toString().trimmed(); QString feedUrl = it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri().toString(); MediaItem mediaItem; mediaItem.url = QString("feeds://video?feedUrl=%1").arg(feedUrl); mediaItem.type = "Category"; mediaItem.fields["categoryType"] = QString("Video Feed"); mediaItem.artwork = KIcon("application-rss+xml"); mediaItem.title = title; mediaItem.fields["title"] = title; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.fields["description"] = description; mediaItem.fields["url"] = feedUrl; mediaItem.fields["resourceUri"] = it.binding(MediaVocabulary::mediaResourceBinding()).uri().toString(); mediaItem.fields["artworkUrl"] = it.binding(MediaVocabulary::artworkBinding()).uri().toString(); mediaItem = Utilities::makeSubtitle(mediaItem); mediaList.append(mediaItem); } MediaItem mediaItem; mediaItem.title = i18n("New video feed"); mediaItem.subTitle = i18n("Edit info to create new video feed"); mediaItem.fields["title"] = i18n("Untitled"); mediaItem.fields["url"] = QString(); mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("Video Feed"); mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.fields["isTemplate"] = true; mediaItem.artwork = KIcon("application-rss+xml"); mediaList.append(mediaItem); m_mediaListProperties.summary = i18np("1 feed", "%1 feeds", mediaList.count()); m_mediaListProperties.type = QString("Categories"); //Return results emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); } else if (engineArg == "audio" || engineArg == "video") { //Get feed url QString feedUrlStr = m_mediaListProperties.filterFieldValue("feedUrl"); KUrl feedUrl(feedUrlStr); if (!feedUrl.isEmpty()) { QString feedTargetFile = QString("bangarang/temp/%1").arg(feedUrl.fileName()); KUrl feedTargetUrl = KUrl(KStandardDirs::locateLocal("data", feedTargetFile, true)); connectDownloader(); emit download(feedUrl, feedTargetUrl); } //Start event loop to wait for feed results exec(); } } } void FeedListEngine::downloadComplete(const KUrl &from, const KUrl &to) { if (!m_fetchingThumbnails) { m_mediaList.clear(); m_artworkUrlList.clear(); QFile file(to.path()); QDomDocument feedDoc("feed"); feedDoc.setContent(&file); //Determine if RSS or Atom based feed bool isRSS = (feedDoc.elementsByTagName("rss").count() > 0); bool isAtom = (feedDoc.elementsByTagName("feed").count() > 0); QString itemTagName = isRSS ? "item" : (isAtom ? "entry" : QString()); //Specify tag preference order QStringList titleTagPref; titleTagPref << "media:title" << "title"; QStringList descriptionTagPref; descriptionTagPref << "media:description" << "itunes:summary" << "description"; QStringList contentTagPref; contentTagPref << "media:content" << "enclosure"; QStringList releaseDateTagPref = QStringList() << "pubDate" << "published"; //Iterate through item nodes of the XML document QDomNodeList items = feedDoc.elementsByTagName(itemTagName); for (int i = 0; i < items.count(); i++) { MediaItem mediaItem; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; bool isAudio = false; bool isVideo = false; QDomNodeList itemNodes = items.at(i).childNodes(); QDomElement releaseDateElement = getPreferredTag(itemNodes, releaseDateTagPref); mediaItem.fields["releaseDate"] = releaseDateElement.text(); mediaItem.semanticComment = releaseDateElement.text(); QList relatedTos = getPreferredTags(itemNodes, QStringList("link")); for (int j = 0; j < relatedTos.count(); j++) { QDomElement relatedTo = relatedTos.at(j); if (!relatedTo.hasAttribute("rel") || (relatedTo.hasAttribute("rel") && relatedTo.attribute("rel").toLower() == "alternate")) { if (relatedTo.hasAttribute("href")) { mediaItem.fields["relatedTo"] = QStringList(relatedTo.attribute("href")); } else { mediaItem.fields["relatedTo"] = QStringList(relatedTo.text()); } } } //Only use media:group nodes in Atom feeds if (isAtom) { QDomElement mediaGroup = getPreferredTag(itemNodes, QStringList("media:group")); if (!mediaGroup.isNull()) { itemNodes = mediaGroup.childNodes(); } } QDomElement titleElement = getPreferredTag(itemNodes, titleTagPref); mediaItem.title = titleElement.text(); mediaItem.fields["title"] = titleElement.text(); QDomElement descriptionElement = getPreferredTag(itemNodes, descriptionTagPref); if (!descriptionElement.text().trimmed().startsWith("<") && !descriptionElement.text().trimmed().endsWith(">")) { //ignore html descriptions mediaItem.fields["description"] = descriptionElement.text(); } QList contentElements = getPreferredTags(itemNodes, contentTagPref); for (int j = 0; j < contentElements.count(); j++) { QDomElement contentElement = contentElements.at(j); if (contentElement.tagName() == "media:content") { int duration = contentElement.attribute("duration").toInt(); if (duration != 0 ) { mediaItem.duration = Utilities::durationString(duration); mediaItem.fields["duration"] = duration; } } KMimeType::Ptr type = KMimeType::mimeType(contentElement.attribute("type").toLower().trimmed()); if (!type.isNull()) { if (Utilities::isAudioMimeType(type)) { isAudio = true; mediaItem.url = contentElement.attribute("url"); mediaItem.fields["url"] = mediaItem.url; mediaItem.type = "Audio"; mediaItem.fields["audioType"] = "Audio Clip"; mediaItem.artwork = KIcon("audio-x-generic"); } if (Utilities::isVideoMimeType(type)) { isVideo = true; mediaItem.url = contentElement.attribute("url"); mediaItem.fields["url"] = mediaItem.url; mediaItem.type = "Video"; mediaItem.fields["videoType"] = "Video Clip"; mediaItem.artwork = KIcon("video-x-generic"); } } } if (mediaItem.duration.isEmpty()) { QDomElement durationElement = getPreferredTag(itemNodes, QStringList("itunes:duration")); if (durationElement.text().contains(":")) { mediaItem.duration = durationElement.text(); } else { int duration = durationElement.text().toInt(); if (duration != 0 ) { mediaItem.duration = Utilities::durationString(duration); mediaItem.fields["duration"] = duration; } } } QDomElement thumbnailElement = getPreferredTag(itemNodes, QStringList("media:thumbnail")); mediaItem = Utilities::makeSubtitle(mediaItem); if (isAudio && m_mediaListProperties.engineArg() == "audio") { m_mediaList.append(mediaItem); m_artworkUrlList.append(KUrl(thumbnailElement.attribute("url"))); } else if (isVideo && m_mediaListProperties.engineArg() == "video") { m_mediaList.append(mediaItem); m_artworkUrlList.append(KUrl(thumbnailElement.attribute("url"))); } } file.remove(); m_mediaListProperties.summary = i18np("1 item", "%1 items", m_mediaList.count()); m_mediaListProperties.type = QString("Sources"); //Return results emit results(m_requestSignature, m_mediaList, m_mediaListProperties, true, m_subRequestSignature); //Launch thumbnail downloads for (int i = 0; i < m_artworkUrlList.count(); i++) { KUrl artworkUrl = m_artworkUrlList.at(i); if (!artworkUrl.isEmpty()) { m_fetchingThumbnails = true; QString artworkTargetFile = QString("bangarang/thumbnails/%1").arg(artworkUrl.fileName()); KUrl artworkTargetUrl = KUrl(KStandardDirs::locateLocal("data", artworkTargetFile, true)); emit download(artworkUrl, artworkTargetUrl); } } } else { //Update feed item artwork with thumbnail downloads int index = m_artworkUrlList.indexOf(from); if (index != -1) { MediaItem mediaItem = m_mediaList.at(index); mediaItem.fields["artworkUrl"] = to.prettyUrl(); QImage artwork = Utilities::getArtworkImageFromMediaItem(mediaItem); if (!artwork.isNull()) { mediaItem.hasCustomArtwork = true; emit updateArtwork(artwork, mediaItem); } m_mediaList.removeAt(index); m_artworkUrlList.removeAt(index); if (m_mediaList.count() == 0) { m_fetchingThumbnails = false; disconnectDownloader(); } } } if (!m_fetchingThumbnails) { //Exit event loop quit(); } } QDomElement FeedListEngine::getPreferredTag(const QDomNodeList &itemNodes, const QStringList &tagPref) { QDomElement preferredElement; for (int i = 0; i < tagPref.count(); i++) { QString tag = tagPref.at(i); for (int j = 0; j < itemNodes.count(); j++) { if (itemNodes.at(j).isElement()) { QDomElement itemElement = itemNodes.at(j).toElement(); if (itemElement.tagName() == tag) { return itemElement; } } } } return preferredElement; } QList FeedListEngine::getPreferredTags(const QDomNodeList &itemNodes, const QStringList &tagPref) { QList preferredElements; bool foundPreferred = false; for (int i = 0; i < tagPref.count(); i++) { QString tag = tagPref.at(i); for (int j = 0; j < itemNodes.count(); j++) { if (itemNodes.at(j).isElement()) { QDomElement itemElement = itemNodes.at(j).toElement(); if (itemElement.tagName() == tag) { preferredElements.append(itemElement); foundPreferred = true; } } } if (foundPreferred) { break; } } return preferredElements; } bangarang-bangarang/src/platform/listengines/feedlistengine.h000066400000000000000000000034051166760560600250300ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef FEEDLISTENGINE_H #define FEEDLISTENGINE_H #include "nepomuklistengine.h" #include #include #include #include #include #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; class MediaIndexer; /** * This ListEngine retrieves a media feeds. */ class FeedListEngine : public NepomukListEngine { Q_OBJECT public: FeedListEngine(ListEngineFactory *parent); ~FeedListEngine(); void run(); private: QString m_feedFilePath; QList m_mediaList; QList m_artworkUrlList; bool m_fetchingThumbnails; QDomElement getPreferredTag(const QDomNodeList &itemNodes, const QStringList &tagPref); QList getPreferredTags(const QDomNodeList &itemNodes, const QStringList &tagPref); private slots: void downloadComplete(const KUrl &from, const KUrl &to); }; #endif // FEEDLISTENGINE_H bangarang-bangarang/src/platform/listengines/filelistengine.cpp000066400000000000000000000417071166760560600254060ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "../mediaitemmodel.h" #include "filelistengine.h" #include "listenginefactory.h" #include "../mediaindexer.h" #include "../utilities/utilities.h" #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include FileListEngine::FileListEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { m_filePlacesModel = new KFilePlacesModel(parent); m_dirModel = new KDirModel(parent); m_dirModel->setDirLister(parent->downloader()->dirLister()); m_dirSortProxyModel = new KDirSortFilterProxyModel(parent); m_dirSortProxyModel->setSourceModel(m_dirModel); m_dirSortProxyModel->setSortFoldersFirst(true); m_updateNepomukOnly = false; } FileListEngine::~FileListEngine() { } void FileListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { //Make sure to crawl dirs if necessary if (m_updateSourceInfo) { QHash status; status["description"] = i18n("Collecting file info..."); status["progress"] = -1; emit updateStatus(status); m_mediaItemsInfoToUpdate = getFiles(m_mediaItemsInfoToUpdate, false, true); } NepomukListEngine::run(); return; } QStringList filterList = m_mediaListProperties.engineFilter().split("||"); if (filterList.count() == 0) { return; } QList mediaList; if (filterList.at(0) == "browseFolder") { QString browseUrl; if (filterList.count() > 1) { browseUrl = filterList.at(1); } if (browseUrl.isEmpty()) { //Load Places if no folder is specified for (int i =0; i < m_filePlacesModel->rowCount(); i ++) { if (m_stop) { return; } if (m_filePlacesModel->isHidden(m_filePlacesModel->index(i,0))) { continue; } QString newBrowseUrl = m_filePlacesModel->url(m_filePlacesModel->index(i,0)).prettyUrl(); if (!newBrowseUrl.isEmpty() && newBrowseUrl != "trash:/") { MediaItem mediaItem; mediaItem.type = "Category"; mediaItem.fields["categoryType"] = "Basic+Artwork"; mediaItem.title = m_filePlacesModel->text(m_filePlacesModel->index(i,0)); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = QString("files://%1?browseFolder||%2") .arg(m_mediaListProperties.engineArg()) .arg(newBrowseUrl); mediaItem.artwork = m_filePlacesModel->icon(m_filePlacesModel->index(i,0)); mediaList.append(mediaItem); } } m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count()); emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); m_requestSignature = QString(); m_subRequestSignature = QString(); } else { //Get folder listing connectDownloader(); emit listDir(KUrl(browseUrl)); exec(); } } else if (filterList.at(0) == "sources") { //Recursively get all relevant files in specified folder if (m_mediaListProperties.engineFilterList().count() > 1) { MediaItem mediaItem; mediaItem.type = "Category"; mediaItem.url = QString("files://%1?browseFolder||%2") .arg(m_mediaListProperties.engineArg()) .arg(m_mediaListProperties.engineFilterList().at(1)); QList listToGetFiles; listToGetFiles.append(mediaItem); mediaList = getFiles(listToGetFiles, true); //Get basic file info first if (m_stop) { return; } m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count()); emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); m_requestSignature = QString(); m_subRequestSignature = QString(); //Get more detailed info for each mediaitem and update; for (int i = 0; i < mediaList.count(); i++) { if (m_stop) { return; } QApplication::processEvents(); MediaItem mediaItem = Utilities::mediaItemFromUrl(KUrl(mediaList.at(i).url), true); mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; emit updateMediaItem(mediaItem); } } } } void FileListEngine::setFilterForSources(const QString& engineFilter) { //Always crawl directory and return files QStringList filterList = engineFilter.split("||"); QString filter; if (filterList.count() == 2) { filter = filterList.at(1); } m_mediaListProperties.lri = QString("files://%1?sources||%2") .arg(m_mediaListProperties.engineArg()) .arg(filter); } void FileListEngine::updateSourceInfo(QList mediaList, bool nepomukOnly) { m_updateNepomukOnly = nepomukOnly; NepomukListEngine::updateSourceInfo(mediaList); } void FileListEngine::listingComplete(const KUrl &url) { QList mediaList; m_dirSortProxyModel->sort(0); for (int i = 0; i < m_dirSortProxyModel->rowCount(); i++) { if (m_stop) { quit(); } MediaItem mediaItem; KFileItem fileItem = m_dirModel->itemForIndex(m_dirSortProxyModel->mapToSource(m_dirSortProxyModel->index(i,0))); if (fileItem.isDir()) { mediaItem.type = "Category"; mediaItem.fields["categoryType"] = "Basic+Artwork"; mediaItem.title = fileItem.text(); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = QString("files://%1?browseFolder||%2") .arg(m_mediaListProperties.engineArg()) .arg(fileItem.url().prettyUrl()); mediaItem.artwork = KIcon(fileItem.iconName()); mediaList.append(mediaItem); } else if (fileItem.isFile()) { if (Utilities::isM3u(fileItem.url().prettyUrl()) || Utilities::isPls(fileItem.url().prettyUrl())) { mediaItem = Utilities::mediaItemFromUrl(fileItem.url()); mediaList.append(mediaItem); } else { if (m_mediaListProperties.engineArg() == "audio" || m_mediaListProperties.engineArg() == "media") { if (Utilities::isAudioMimeType(fileItem.mimeTypePtr())) { mediaItem.url = fileItem.url().prettyUrl(); mediaItem.fields["url"] = mediaItem.url; mediaItem.type = "Audio"; if (Utilities::isMusicMimeType((fileItem.mimeTypePtr()))) { mediaItem.fields["audioType"] = "Music"; } else { mediaItem.fields["audioType"] = "Audio Clip"; } mediaItem.title = fileItem.text(); mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon(fileItem.iconName()); mediaList.append(mediaItem); } } if (m_mediaListProperties.engineArg() == "video" || m_mediaListProperties.engineArg() == "media") { if (Utilities::isVideoMimeType(fileItem.mimeTypePtr())) { mediaItem.url = fileItem.url().prettyUrl(); mediaItem.fields["url"] = mediaItem.url; mediaItem.type = "Video"; mediaItem.fields["videoType"] = "Video Clip"; mediaItem.title = fileItem.text(); mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("video-x-generic"); mediaList.append(mediaItem); } } } } } m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count()); emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); m_requestSignature = QString(); m_subRequestSignature = QString(); disconnectDownloader(); //Get more detailed info for each mediaitem and update; for (int i = 0; i < mediaList.count(); i++) { if (m_stop) { quit(); } QApplication::processEvents(); MediaItem mediaItem = Utilities::mediaItemFromUrl(KUrl(mediaList.at(i).url), true); mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; emit updateMediaItem(mediaItem); } quit(); Q_UNUSED(url); } QList FileListEngine::getFiles(QList mediaList, bool basicInfo, bool emitStatus) { //This routine looks for directories in mediaList, crawls and returns a media list with files only QList crawledList; for (int i = 0; i < mediaList.count(); i++) { while (m_stop) { //wait while m_stop is true QApplication::processEvents(); } if (mediaList.at(i).type == "Category" && !mediaList.at(i).url.isEmpty()) { MediaListProperties categoryProperties; categoryProperties.lri = mediaList.at(i).url; QStringList engineFilterList = categoryProperties.engineFilterList(); QString firstFilter = engineFilterList.at(0); if ((categoryProperties.engine() == "files://") && (engineFilterList.at(0) == "browseFolder")) { KUrl directoryUrl(categoryProperties.engineFilterList().at(1)); if (directoryUrl.isLocalFile()) { QString mimeFilter; QString type; if (categoryProperties.engineArg() == "audio") { mimeFilter = Utilities::audioMimeFilter(); type = "audio"; } else if (categoryProperties.engineArg() == "video") { mimeFilter = Utilities::videoMimeFilter(); type = "video"; } else if (categoryProperties.engineArg() == "media") { mimeFilter = Utilities::audioMimeFilter() + Utilities::videoMimeFilter(); type = "media"; } QFileInfoList fileList = crawlDir(QDir(directoryUrl.path()), categoryProperties.engineArg()); for (int j = 0; j < fileList.count(); ++j) { while (m_stop) { //wait while m_stop is true QApplication::processEvents(); } QFileInfo fileInfo = fileList.at(j); MediaItem mediaItem; if (basicInfo) { mediaItem.url = KUrl(fileInfo.absoluteFilePath()).prettyUrl(); mediaItem.fields["url"] = mediaItem.url; mediaItem.title = fileInfo.fileName(); mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["sourceLri"] = categoryProperties.lri; if (categoryProperties.engineArg() == "audio") { mediaItem.type = "Audio"; if (Utilities::isMusic(mediaItem.url)) { mediaItem.fields["audioType"] = "Music"; mediaItem.artwork = KIcon("audio-mpeg"); } else { mediaItem.fields["audioType"] = "Audio Clip"; mediaItem.artwork = KIcon("audio-x-wav"); } crawledList.append(mediaItem); } else if (categoryProperties.engineArg() == "video") { mediaItem.type = "Video"; mediaItem.fields["videoType"] = "Video Clip"; mediaItem.artwork = KIcon("video-x-generic"); crawledList.append(mediaItem); } else if (categoryProperties.engineArg() == "media") { if (Utilities::isAudio(mediaItem.url)) { mediaItem.type = "Audio"; mediaItem.fields["audioType"] = "Audio Clip"; mediaItem.artwork = KIcon("audio-x-wav"); } if (Utilities::isMusic(mediaItem.url)) { mediaItem.type = "Audio"; mediaItem.fields["audioType"] = "Music"; mediaItem.artwork = KIcon("audio-mpeg"); } if (Utilities::isVideo(mediaItem.url)) { mediaItem.type = "Video"; mediaItem.fields["videoType"] = "Video Clip"; mediaItem.artwork = KIcon("video-x-generic"); } crawledList.append(mediaItem); } } else { KUrl fileUrl = KUrl(fileList.at(j).absoluteFilePath()); MediaItem mediaItem = Utilities::mediaItemFromUrl(fileUrl, true); crawledList.append(mediaItem); } if (emitStatus && (crawledList.count() % 20 == 0)) { QHash status; status["description"] = i18n("Collecting file info (%1 files)...", crawledList.count()); status["progress"] = -1; emit updateStatus(status); } } } } } else if ((mediaList.at(i).type == "Audio" || mediaList.at(i).type == "Video") && !mediaList.at(i).url.isEmpty()) { crawledList.append(mediaList.at(i)); } } return crawledList; } QFileInfoList FileListEngine::crawlDir(const QDir &dir, QString engineArg) { //Crawl through directory specified and return relevant files QFileInfoList returnList; QFileInfoList fileList = dir.entryInfoList(QDir::Files, QDir::Name); QFileInfoList dirList = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); for (int i = 0; i < dirList.count(); ++i) { fileList << crawlDir(QDir(dirList.at(i).absoluteFilePath()), engineArg); } for (int i = 0; i < fileList.count(); ++i) { bool addToList = false; if (engineArg == "audio") { if (Utilities::isAudio(fileList.at(i).absoluteFilePath())) { addToList = true; } } else if (engineArg == "video") { if (Utilities::isVideo(fileList.at(i).absoluteFilePath())) { addToList = true; } } else if (engineArg == "media") { if (Utilities::isAudio(fileList.at(i).absoluteFilePath()) || Utilities::isVideo(fileList.at(i).absoluteFilePath())) { addToList = true; } } if (addToList) { returnList << fileList.at(i); } } return returnList; } bangarang-bangarang/src/platform/listengines/filelistengine.h000066400000000000000000000042021166760560600250400ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef FILELISTENGINE_H #define FILELISTENGINE_H #include "nepomuklistengine.h" #include #include #include #include #include #include #include #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; class MediaIndexer; /** * This ListEngine retrieves media files. * List Resource Identifiers handled are: * files://audio?browseFolder||[folder] * files://video?browseFolder||[folder] */ class FileListEngine : public NepomukListEngine { Q_OBJECT public: FileListEngine(ListEngineFactory *parent); ~FileListEngine(); void run(); void setFilterForSources(const QString& engineFilter); void updateSourceInfo(QList mediaList, bool nepomukOnly = false); private: KUrl::List m_fileList; QString m_directoryPath; KFilePlacesModel *m_filePlacesModel; KDirModel *m_dirModel; KDirSortFilterProxyModel *m_dirSortProxyModel; bool m_updateNepomukOnly; QList getFiles(QList mediaList, bool basicInfo = false, bool emitStatus = false); QFileInfoList crawlDir(const QDir &dir, QString engineArg); private Q_SLOTS: void listingComplete(const KUrl &url); }; #endif // FILELISTENGINE_H bangarang-bangarang/src/platform/listengines/listengine.cpp000066400000000000000000000104061166760560600245360ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "listengine.h" #include "../downloader.h" ListEngine::ListEngine(ListEngineFactory * parent) : QThread(parent) { m_parent = parent; m_stop = false; } ListEngine::~ListEngine() { } void ListEngine::setModel(MediaItemModel * mediaItemModel) { m_mediaItemModel = mediaItemModel; connect(this, SIGNAL(results(QString, QList, MediaListProperties, bool, QString)), m_mediaItemModel, SLOT(addResults(QString, QList, MediaListProperties, bool, QString))); connect(this, SIGNAL(updateMediaItems(QList)), m_mediaItemModel, SLOT(updateMediaItems(QList))); connect(this, SIGNAL(updateMediaItem(MediaItem)), m_mediaItemModel, SLOT(updateMediaItem(MediaItem))); connect(this, SIGNAL(updateArtwork(QImage, MediaItem)), m_mediaItemModel, SLOT(updateArtwork(QImage, MediaItem))); connect(this, SIGNAL(updateMediaListPropertiesCategoryArtwork(QImage, MediaItem)), m_mediaItemModel, SLOT(updateMediaListPropertiesCategoryArtwork(QImage, MediaItem))); connect(this, SIGNAL(updateStatus(QHash)), m_mediaItemModel, SLOT(updateStatus(QHash))); connect(this, SIGNAL(loadOtherEngine(MediaListProperties,QString,QString)), m_parent, SLOT(load(MediaListProperties,QString,QString))); } MediaItemModel * ListEngine::model() { return m_mediaItemModel; } void ListEngine::setMediaListProperties(const MediaListProperties& mediaListProperties) { m_mediaListProperties = mediaListProperties; } const MediaListProperties& ListEngine::mediaListProperties() const { return m_mediaListProperties; } void ListEngine::setRequestSignature(const QString& requestSignature) { m_requestSignature = requestSignature; } const QString& ListEngine::requestSignature() const { return m_requestSignature; } void ListEngine::setSubRequestSignature(const QString& subRequestSignature) { m_subRequestSignature = subRequestSignature; } const QString& ListEngine::subRequestSignature() const { return m_subRequestSignature; } void ListEngine::connectDownloader() { connect(this, SIGNAL(download(const KUrl, const KUrl)), m_parent->downloader(), SLOT(download(const KUrl, const KUrl))); connect(m_parent->downloader(), SIGNAL(downloadComplete(const KUrl, const KUrl)), this, SLOT(downloadComplete(const KUrl, const KUrl))); connect(this, SIGNAL(listDir(KUrl)), m_parent->downloader(), SLOT(listDir(KUrl))); connect(m_parent->downloader(), SIGNAL(listingComplete(KUrl)), this, SLOT(listingComplete(KUrl))); } void ListEngine::disconnectDownloader() { disconnect(this, SIGNAL(download(const KUrl, const KUrl)), m_parent->downloader(), SLOT(download(const KUrl, const KUrl))); disconnect(m_parent->downloader(), SIGNAL(downloadComplete(const KUrl, const KUrl)), this, SLOT(downloadComplete(const KUrl, const KUrl))); disconnect(this, SIGNAL(listDir(KUrl)), m_parent->downloader(), SLOT(listDir(KUrl))); disconnect(m_parent->downloader(), SIGNAL(listingComplete(KUrl)), this, SLOT(listingComplete(KUrl))); } void ListEngine::stop(unsigned long waitToTerminate, bool quitEventLoop) { m_stop = true; if (quitEventLoop) { quit(); } if (waitToTerminate > 0 && isRunning()) { wait(waitToTerminate); terminate(); } } void ListEngine::resume() { m_stop = false; } bangarang-bangarang/src/platform/listengines/listengine.h000066400000000000000000000142201166760560600242010ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef LISTENGINE_H #define LISTENGINE_H #include "../mediaitemmodel.h" #include "listenginefactory.h" #include #include /** * This is the base ListEngine class. * It is a QThread to allow it to run asynchronously without blocking the gui * on long queries. */ class ListEngine : public QThread { Q_OBJECT public: /** * Constructor */ ListEngine(ListEngineFactory *parent); /** * Destructor */ virtual ~ListEngine(); /** * Returns MediaListProperties currently used by the ListEngine */ const MediaListProperties& mediaListProperties() const; /** * Returns the requestSignature currently used by the ListEngine */ const QString& requestSignature() const; /** * Sets the MediaListProperties to be used by the ListEngine * * @param mediaListProperties the MediaListProperties to be used */ void setMediaListProperties(const MediaListProperties& mediaListProperties); /** * Sets the request signature to be used by the ListEngine * * @param requestSignature the request signature to be used */ void setRequestSignature(const QString& requestSignature); /** * Sets the sub-request signature to be used by the ListEngine. * This is used by the MediaItemModel when the ListEngine is used * to retrieve a list of MediaItems corresponding to a "Category" * MediaItem found in while performing MediaItemModel::loadSources(). */ void setSubRequestSignature(const QString& subRequestSignature); /** * Returns the sub-request signature currently used by the ListEngine. * * @param subRequestSignature the sub-request signature to be used */ const QString& subRequestSignature() const; /** * Sets model using this ListEngine * * @param mediaItemModel MediaItemModel using this ListEngine. */ void setModel(MediaItemModel * mediaItemModel); /** * Returns the model used by this ListEngine */ MediaItemModel * model(); /** * Sets the filter to be used when loading only playable MediaItems. * This supports MediaItemModel::loadSources() method. * * @param engineFilter engine filter to be used for loading playable * MediaItems. * */ virtual void setFilterForSources(const QString& engineFilter) { Q_UNUSED(engineFilter); } /** * Method called by MediaItemModel to activate and "Action" MediaItem */ virtual void activateAction(){} /** * Removes information for specified MediaItems from the source of * the mediaItems. * * @param mediaList list of MediaItems whose information should be * removed from the source. */ virtual void removeSourceInfo(QList mediaList) { Q_UNUSED(mediaList); } /** * Update source with information from specified MediaItems. * * @param mediaList list of MediaItems whose information should be * upated in the source. */ virtual void updateSourceInfo(QList mediaList, bool nepomukOnly = false) { Q_UNUSED(mediaList); Q_UNUSED(nepomukOnly); } /** * Stop execution at as soon as possible. Terminate after waitToTerminate millseconds. */ void stop(unsigned long waitToTerminate = 0, bool quitEventLoop = false); /** * Resume execution if possible. This only works for ListEngines designed to resume execution * after stop(0, false) was called. */ void resume(); public Q_SLOTS: virtual void downloadComplete(const KUrl &from, const KUrl &to) { Q_UNUSED(from); Q_UNUSED(to); } virtual void listingComplete(const KUrl & url) { Q_UNUSED(url); } Q_SIGNALS: void results(QString m_requestSignature, QList mediaList, MediaListProperties m_mediaListProperties, bool done, QString m_subRequestSignature); void updateMediaItems(QList mediaList); void updateMediaItem(MediaItem mediaItem); void updateArtwork(QImage artworkImage, MediaItem mediaItem); void updateMediaListPropertiesCategoryArtwork(QImage artworkImage, MediaItem mediaItem); void download(const KUrl &from, const KUrl &to); void listDir(const KUrl &url); void updateStatus(QHash updatedStatus); void loadOtherEngine(const MediaListProperties &mediaListProperties, const QString &requestSignature, const QString &subRequestSignature); protected: ListEngineFactory * m_parent; MediaListProperties m_mediaListProperties; QString m_requestSignature; QString m_subRequestSignature; MediaItemModel * m_mediaItemModel; bool m_stop; void connectDownloader(); void disconnectDownloader(); }; #endif // LISTENGINE_H bangarang-bangarang/src/platform/listengines/listenginefactory.cpp000066400000000000000000000150511166760560600261270ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "listenginefactory.h" #include "../downloader.h" #include "listengine.h" #include "musiclistengine.h" #include "filelistengine.h" #include "videolistengine.h" #include "cdlistengine.h" #include "dvdlistengine.h" #include "savedlistsengine.h" #include "medialistsengine.h" #include "audiostreamlistengine.h" #include "semanticslistengine.h" #include "cachelistengine.h" #include "audioclipslistengine.h" #include "taglistengine.h" #include "feedlistengine.h" #include "ampachelistengine.h" #include ListEngineFactory::ListEngineFactory(MediaItemModel * parent) : QObject(parent) { m_parent = parent; m_engines << EngineDescription(EngineTypeMusic, QString( "music://" )) << EngineDescription(EngineTypeFiles, "files://") << EngineDescription(EngineTypeVideo, "video://") << EngineDescription(EngineTypeCDAudio, "cdaudio://") << EngineDescription(EngineTypeDVDVideo, "dvdvideo://") << EngineDescription(EngineTypeSavedLists, "savedlists://") << EngineDescription(EngineTypeMediaLists, "medialists://") << EngineDescription(EngineTypeAudioStreams, "audiostreams://") << EngineDescription(EngineTypeSemantics, "semantics://") << EngineDescription(EngineTypeCache, "cache://") << EngineDescription(EngineTypeAudioClips, "audioclips://") << EngineDescription(EngineTypeTag, "tag://") << EngineDescription(EngineTypeFeeds, "feeds://") << EngineDescription(EngineTypeAmpache, "ampache://"); m_downloader = new Downloader(this); } ListEngineFactory::~ListEngineFactory() { stopAll(200, true); } ListEngine* ListEngineFactory::createEngine(const EngineType type, MediaItemModel* model) { ListEngine *eng; switch (type) { case EngineTypeMusic: eng = new MusicListEngine(this); break; case EngineTypeFiles: eng = new FileListEngine(this); break; case EngineTypeVideo: eng = new VideoListEngine(this); break; case EngineTypeCDAudio: eng = new CDListEngine(this); break; case EngineTypeDVDVideo: eng = new DVDListEngine(this); break; case EngineTypeSavedLists: eng = new SavedListsEngine(this); break; case EngineTypeMediaLists: eng = new MediaListsEngine(this); break; case EngineTypeAudioStreams: eng = new AudioStreamListEngine(this); break; case EngineTypeSemantics: eng = new SemanticsListEngine(this); break; case EngineTypeCache: eng = new CacheListEngine(this); break; case EngineTypeAudioClips: eng = new AudioClipsListEngine(this); break; case EngineTypeTag: eng = new TagListEngine(this); break; case EngineTypeFeeds: eng = new FeedListEngine(this); break; case EngineTypeAmpache: eng = new AmpacheListEngine(this); break; default: eng = new ListEngine(this); break; } eng->setModel(model); return eng; } QString ListEngineFactory::engineStringFromType(const EngineType type) { for (int i = 0; i < m_engines.count(); i++) { const EngineDescription &cur = m_engines.at(i); if ( cur.first == type ) return cur.second; } return QString(); } EngineType ListEngineFactory::engineTypeFromString(const QString& str) { for (int i = 0; i < m_engines.count(); i++) { const EngineDescription &cur = m_engines.at(i); if ( cur.second == str ) return cur.first; } return EngineTypeUnknown; } ListEngine * ListEngineFactory::availableListEngine(const EngineType type) { for (int i = 0; i < m_initializedEngines.count(); ++i) { const EnginePointerType &cur = m_initializedEngines.at(i); if (cur.second == type && !cur.first->isRunning()) { return cur.first; } } ListEngine *eng = createEngine(type, m_parent); m_initializedEngines << EnginePointerType(eng, type); return eng; } QString ListEngineFactory::generateRequestSignature() { m_requestSignatureSeed = m_requestSignatureSeed + 1; return QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz") + m_requestSignatureSeed; } bool ListEngineFactory::engineExists(const EngineType type) { return ( type != EngineTypeUnknown ); } Downloader * ListEngineFactory::downloader() { return m_downloader; } void ListEngineFactory::stopAll(unsigned long waitToTerminate, bool quitEventLoop) { for (int i = 0; i < m_initializedEngines.count(); ++i) { ListEngine *eng = m_initializedEngines.at(i).first; if (eng->isRunning()) { eng->stop(waitToTerminate, quitEventLoop); } } } void ListEngineFactory::resumeAll() { for (int i = 0; i < m_initializedEngines.count(); ++i) { ListEngine *eng = m_initializedEngines.at(i).first; if (eng->isRunning()) { eng->resume(); } } } void ListEngineFactory::load(MediaListProperties mediaListProperties, const QString &requestSignature, const QString &subRequestSignature) { if (mediaListProperties.engine().isEmpty()) { return; } EngineType type = engineTypeFromString(mediaListProperties.engine()); if (engineExists(type)) { stopAll(); ListEngine * eng = availableListEngine(type); eng->setRequestSignature(requestSignature); eng->setSubRequestSignature(subRequestSignature); eng->setMediaListProperties(mediaListProperties); eng->start(); } } bangarang-bangarang/src/platform/listengines/listenginefactory.h000066400000000000000000000076561166760560600256100ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef LISTENGINEFACTORY_H #define LISTENGINEFACTORY_H #include "../mediaitemmodel.h" #include "../downloader.h" #include #include #include #include #include class ListEngine; enum EngineType { EngineTypeUnknown = -1, EngineTypeMusic, EngineTypeFiles, EngineTypeVideo, EngineTypeCDAudio, EngineTypeDVDVideo, EngineTypeSavedLists, EngineTypeMediaLists, EngineTypeAudioStreams, EngineTypeSemantics, EngineTypeCache, EngineTypeAudioClips, EngineTypeTag, EngineTypeFeeds, EngineTypeAmpache }; typedef QPair EngineDescription; typedef QPair EnginePointerType; /** * This class creates ListEngines as needed for the MediaItemModel. */ class ListEngineFactory : public QObject { Q_OBJECT public: /** * Constructor */ ListEngineFactory(MediaItemModel *parent); /** * Destructor */ ~ListEngineFactory(); /** * Creates an engine of the given type with "model" as the model */ ListEngine *createEngine(const EngineType type, MediaItemModel* model); /** * Returns an available ListEngine for the specified engine`. * ListEngineFactory factory will reuse ListEngines that are * idle and create a new ListEngine if no idle ListEngines * are available. * * @param type the engine type for which a ListEngine should be returned. */ virtual ListEngine* availableListEngine(const EngineType type); /** * Generates a unique request signature the MediaItemModel * can use to uniquely identify a ListEngine load request. */ QString generateRequestSignature(); /** * Returns true if a ListEngine exists for the specified * engine. */ bool engineExists(const EngineType type); /** * Returns the downloader. **/ Downloader * downloader(); /** * Returns the engine type to the specific string */ EngineType engineTypeFromString(const QString &str); /** * Returns the engine string to the specific type */ QString engineStringFromType(const EngineType type); /** * Stop all running list engines as soon as possible. */ void stopAll(unsigned long waitToTerminate = 0, bool quitEventLoop = false); /** * Resume all running list engines if possible. */ void resumeAll(); public Q_SLOTS: /** * Loads specified LRI with an available list engine using the specified request signature */ void load(MediaListProperties mediaListProperties, const QString &requestSignature, const QString &subRequestSignature); private: MediaItemModel * m_parent; int m_requestSignatureSeed; QList m_engines; QList m_initializedEngines; Downloader * m_downloader; }; #endif // LISTENGINEFACTORY_H bangarang-bangarang/src/platform/listengines/medialistsengine.cpp000066400000000000000000000721011166760560600257210ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "../devicemanager.h" #include "../mediaitemmodel.h" #include "medialistsengine.h" #include "listenginefactory.h" #include "../mediaindexer.h" #include "../utilities/utilities.h" #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include #include #include #include #include MediaListsEngine::MediaListsEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { } MediaListsEngine::~MediaListsEngine() { } void MediaListsEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; QList mediaList; if (m_mediaListProperties.engineArg() == "audio") { QStringList contextTitles; QStringList contextLRIs; MediaItem mediaItem; mediaItem.type = "Category"; mediaItem.isSavedList = false; if (m_nepomukInited) { KConfig config; KConfigGroup generalGroup( &config, "General" ); mediaItem.title = i18n("Recently Played"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = semanticsLriForRecent("Audio"); mediaItem.artwork = KIcon("chronometer"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Artists"), "semantics://recent?audio||limit=4||groupBy=artist"); mediaItem.addContext(i18n("Albums"), "semantics://recent?audio||limit=4||groupBy=album"); mediaItem.addContext(i18n("Genres"), "semantics://recent?audio||limit=4||groupBy=genre"); mediaItem.fields["isConfigurable"] = true; mediaList << mediaItem; mediaItem.title = i18n("Highest Rated"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = semanticsLriForHighest("Audio"); mediaItem.artwork = KIcon("rating"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Artists"), "semantics://highest?audio||limit=4||groupBy=artist"); mediaItem.addContext(i18n("Albums"), "semantics://highest?audio||limit=4||groupBy=album"); mediaItem.addContext(i18n("Genres"), "semantics://highest?audio||limit=4||groupBy=genre"); mediaItem.fields["isConfigurable"] = true; mediaList << mediaItem; mediaItem.title = i18n("Frequently Played"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = semanticsLriForFrequent("Audio"); mediaItem.artwork = KIcon("office-chart-bar"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Artists"), "semantics://frequent?audio||limit=4||groupBy=artist"); mediaItem.addContext(i18n("Albums"), "semantics://frequent?audio||limit=4||groupBy=album"); mediaItem.addContext(i18n("Genres"), "semantics://frequent?audio||limit=4||groupBy=genre"); mediaItem.fields["isConfigurable"] = true; mediaList << mediaItem; mediaItem.title = i18n("Recently Added"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = semanticsLriForRecentlyAdded("Audio"); mediaItem.artwork = KIcon("chronometer"); mediaItem.fields["isConfigurable"] = true; mediaItem.clearContexts(); mediaList << mediaItem; mediaItem.title = i18n("Artists"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "music://artists"; mediaItem.artwork = KIcon("system-users"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Played"), "semantics://recent?audio||limit=4||groupBy=artist"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?audio||limit=4||groupBy=artist"); mediaItem.addContext(i18n("Frequently Played"), "semantics://frequent?audio||limit=4||groupBy=artist"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Albums"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "music://albums"; mediaItem.artwork = KIcon("media-optical"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Played"), "semantics://recent?audio||limit=4||groupBy=album"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?audio||limit=4||groupBy=album"); mediaItem.addContext(i18n("Frequently Played"), "semantics://frequent?audio||limit=4||groupBy=album"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Genres"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "music://genres"; mediaItem.artwork = KIcon("flag-blue"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Played"), "semantics://recent?audio||limit=4||groupBy=genre"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?audio||limit=4||groupBy=genre"); mediaItem.addContext(i18n("Frequently Played"), "semantics://frequent?audio||limit=4||groupBy=genre"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Songs"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "music://songs"; mediaItem.fields["categoryType"] = QString("Songs"); mediaItem.artwork = KIcon("audio-mpeg"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Played"), "semantics://recent?audio||limit=4||audioType=music"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?audio||limit=4||audioType=music"); mediaItem.addContext(i18n("Frequently Played"), "semantics://frequent?audio||limit=4||audioType=music"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Clips"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "audioclips://"; mediaItem.fields["categoryType"] = QString("Audio Clips"); mediaItem.artwork = KIcon("audio-x-wav"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Played"), "semantics://recent?audio||limit=4||audioType=audio clip"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?audio||limit=4||audioType=audio clip"); mediaItem.addContext(i18n("Frequently Played"), "semantics://frequent?audio||limit=4||audioType=audio clip"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Audio Streams"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "audiostreams://"; mediaItem.artwork = KIcon("text-html"); mediaItem.fields["categoryType"] = QString("Audio Streams"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Played"), "semantics://recent?audio||limit=4||audioType=audio stream"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?audio||limit=4||audioType=audio stream"); mediaItem.addContext(i18n("Frequently Played"), "semantics://frequent?audio||limit=4||audioType=audio stream"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Audio Feeds"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "feeds://audiofeeds"; mediaItem.artwork = KIcon("application-rss+xml"); mediaItem.clearContexts(); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Tags"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "tag://audiotags"; mediaItem.fields["categoryType"] = QString("Audio Tags"); mediaItem.artwork = KIcon("view-pim-notes"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Played"), "semantics://recent?audio||limit=4||groupBy=tag"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?audio||limit=4||groupBy=tag"); mediaItem.addContext(i18n("Frequently Played"), "semantics://frequent?audio||limit=4||groupBy=tag"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; } mediaItem.title = i18n("Files and Folders"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "files://audio?browseFolder"; mediaItem.artwork = KIcon("document-open-folder"); mediaItem.clearContexts(); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; // Show remote media servers mediaList.append(loadServerList("audio")); //Show Audio CDs if present QList cds = DeviceManager::instance()->deviceList(DeviceManager::AudioType); foreach (Solid::Device cd, cds) { if (m_stop) { return; } mediaItem.title = i18n("Audio CD"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = QString( "cdaudio://%1" ).arg(cd.udi()); mediaItem.artwork = KIcon("media-optical-audio"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; } //Load saved lists from index QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/savedlists", false)); if (indexFile.exists()) { if (indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&indexFile); while (!in.atEnd()) { if (m_stop) { return; } QString line = in.readLine(); QStringList nameUrl = line.split(":::"); if (nameUrl.count() >= 3) { if (nameUrl.at(0) == "Audio") { mediaItem.title = nameUrl.at(1).trimmed(); mediaItem.fields["title"] = mediaItem.title; QString savedLri = nameUrl.at(2).trimmed(); if (savedLri.startsWith("savedlists://")) { mediaItem.url = savedLri; mediaItem.artwork = KIcon("view-list-text"); } else { mediaItem.url = QString("savedlists://?%1").arg(savedLri); mediaItem.artwork = KIcon("view-media-playlist"); } mediaItem.isSavedList = true; mediaItem.fields["isConfigurable"] = true; if (m_nepomukInited) { mediaList << mediaItem; } else { //Only show lists that aren't don't require nepomuk if (mediaItem.url.startsWith("savedlists://")) { mediaList << mediaItem; } } } } } } } } else if (m_mediaListProperties.engineArg() == "video") { QStringList contextTitles; QStringList contextLRIs; MediaItem mediaItem; mediaItem.type = "Category"; mediaItem.isSavedList = false; if (m_nepomukInited) { KConfig config; KConfigGroup generalGroup( &config, "General" ); mediaItem.title = i18n("Recently Played"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = semanticsLriForRecent("Video"); mediaItem.artwork = KIcon("chronometer"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Genres"), "semantics://recent?video||limit=4||groupBy=genre"); mediaItem.addContext(i18n("Actors"), "semantics://recent?video||limit=4||groupBy=actor"); mediaItem.addContext(i18n("Directors"), "semantics://recent?video||limit=4||groupBy=director"); mediaItem.fields["isConfigurable"] = true; mediaList << mediaItem; mediaItem.title = i18n("Highest Rated"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = semanticsLriForHighest("Video"); mediaItem.artwork = KIcon("rating"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Genres"), "semantics://highest?video||limit=4||groupBy=genre"); mediaItem.addContext(i18n("Actors"), "semantics://highest?video||limit=4||groupBy=actor"); mediaItem.addContext(i18n("Directors"), "semantics://highest?video||limit=4||groupBy=director"); mediaItem.fields["isConfigurable"] = true; mediaList << mediaItem; mediaItem.title = i18n("Frequently Played"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = semanticsLriForFrequent("Video"); mediaItem.artwork = KIcon("office-chart-bar"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Genres"), "semantics://frequent?video||limit=4||groupBy=genre"); mediaItem.addContext(i18n("Actors"), "semantics://frequent?video||limit=4||groupBy=actor"); mediaItem.addContext(i18n("Directors"), "semantics://frequent?video||limit=4||groupBy=director"); mediaItem.fields["isConfigurable"] = true; mediaList << mediaItem; mediaItem.title = i18n("Recently Added"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = semanticsLriForRecentlyAdded("Video"); mediaItem.artwork = KIcon("chronometer"); mediaItem.fields["isConfigurable"] = true; mediaItem.clearContexts(); mediaList << mediaItem; mediaItem.title = i18n("Movies"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "video://movies"; mediaItem.artwork = KIcon("tool-animator"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Watched"), "semantics://recent?video||limit=4||videoType=movie"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?video||limit=4||videoType=movie"); mediaItem.addContext(i18n("Frequently Watched"), "semantics://frequent?video||limit=4||videoType=movie"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("TV Shows"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "video://tvshows"; mediaItem.artwork = KIcon("video-television"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Watched"), "semantics://recent?video||limit=4||groupBy=seriesName"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?video||limit=4||groupBy=seriesName"); mediaItem.addContext(i18n("Frequently Watched"), "semantics://frequent?video||limit=4||groupBy=seriesName"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Genres"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "video://genres"; mediaItem.artwork = KIcon("flag-green"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Watched"), "semantics://recent?video||limit=4||groupBy=genre"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?video||limit=4||groupBy=genre"); mediaItem.addContext(i18n("Frequently Watched"), "semantics://frequent?video||limit=4||groupBy=genre"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Actors"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "video://actors"; mediaItem.artwork = KIcon("view-media-artist"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Watched"), "semantics://recent?video||limit=4||groupBy=actor"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?video||limit=4||groupBy=actor"); mediaItem.addContext(i18n("Frequently Watched"), "semantics://frequent?video||limit=4||groupBy=actor"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Directors"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "video://directors"; mediaItem.artwork = KIcon("view-media-artist"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Watched"), "semantics://recent?video||limit=4||groupBy=director"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?video||limit=4||groupBy=director"); mediaItem.addContext(i18n("Frequently Watched"), "semantics://frequent?video||limit=4||groupBy=director"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Video Clips"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "video://clips"; mediaItem.artwork = KIcon("video-x-generic"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Watched"), "semantics://recent?video||limit=4||videoType=video clip"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?video||limit=4||videoType=video clip"); mediaItem.addContext(i18n("Frequently Watched"), "semantics://frequent?video||limit=4||videoType=video clip"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Video Feeds"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "feeds://videofeeds"; mediaItem.artwork = KIcon("application-rss+xml"); mediaItem.clearContexts(); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; mediaItem.title = i18n("Tags"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "tag://videotags"; mediaItem.artwork = KIcon("view-pim-notes"); mediaItem.clearContexts(); mediaItem.addContext(i18n("Recently Watched"), "semantics://recent?video||limit=4||groupBy=tag"); mediaItem.addContext(i18n("Highest Rated"), "semantics://highest?video||limit=4||groupBy=tag"); mediaItem.addContext(i18n("Frequently Watched"), "semantics://frequent?video||limit=4||groupBy=tag"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; } mediaItem.title = i18n("Files and Folders"); mediaItem.fields["title"] = mediaItem.title; mediaItem.url = "files://video?browseFolder"; mediaItem.artwork = KIcon("document-open-folder"); mediaItem.clearContexts(); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; QList dvds = DeviceManager::instance()->deviceList(DeviceManager::VideoType); foreach (Solid::Device dvd, dvds) { if (m_stop) { return; } const Solid::OpticalDisc* disc = dvd.as(); if ( disc == NULL ) continue; QString label = disc->label(); mediaItem.title = label; mediaItem.fields["title"] = mediaItem.title; mediaItem.url = QString( "dvdvideo://%1" ).arg(dvd.udi()); mediaItem.artwork = KIcon("media-optical-dvd"); mediaItem.fields["isConfigurable"] = false; mediaList << mediaItem; } //Load saved lists from index QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/savedlists", false)); if (indexFile.exists()) { if (indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&indexFile); while (!in.atEnd()) { if (m_stop) { return; } QString line = in.readLine(); QStringList nameUrl = line.split(":::"); if (nameUrl.count() >= 3) { if (nameUrl.at(0) == "Video") { mediaItem.title = nameUrl.at(1).trimmed(); mediaItem.fields["title"] = mediaItem.title; QString savedLri = nameUrl.at(2).trimmed(); if (savedLri.startsWith("savedlists://")) { mediaItem.url = savedLri; mediaItem.artwork = KIcon("view-list-text"); } else { mediaItem.url = QString("savedlists://?%1").arg(savedLri); mediaItem.artwork = KIcon("view-media-playlist"); } mediaItem.isSavedList = true; mediaItem.fields["isConfigurable"] = true; if (m_nepomukInited) { mediaList << mediaItem; } else { //Only show lists that aren't don't require nepomuk if (mediaItem.url.startsWith("savedlists://")) { mediaList << mediaItem; } } } } } } } } emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); m_requestSignature = QString(); m_subRequestSignature = QString(); m_loadWhenReady = false; //exec(); } QString MediaListsEngine::semanticsLriForRecent(const QString &type) { QString lri; KConfig config; KConfigGroup generalGroup( &config, "General" ); if (type == "Audio") { int limit = generalGroup.readEntry("RecentAudioLimit", 20); lri = QString("semantics://recent?audio||limit=%1").arg(limit); if (generalGroup.hasKey("RecentAudioPlayed")) { QStringList entry = generalGroup.readEntry("RecentAudioPlayed", QStringList()); QString comp = entry.at(0); QDateTime recentDateTime = QDateTime::fromString(entry.at(1), "yyyyMMddHHmmss"); lri.append(QString("||lastPlayed%1%2").arg(comp).arg(recentDateTime.toString("yyyyMMddHHmmss"))); } } else { int limit = generalGroup.readEntry("RecentVideoLimit", 20); lri = QString("semantics://recent?video||limit=%1").arg(limit); if (generalGroup.hasKey("RecentVideoPlayed")) { QStringList entry = generalGroup.readEntry("RecentVideoPlayed", QStringList()); QString comp = entry.at(0); QDateTime recentDateTime = QDateTime::fromString(entry.at(1), "yyyyMMddHHmmss"); lri.append(QString("||lastPlayed%1%2").arg(comp).arg(recentDateTime.toString("yyyyMMddHHmmss"))); } } return lri; } QString MediaListsEngine::semanticsLriForHighest(const QString &type) { QString lri; KConfig config; KConfigGroup generalGroup( &config, "General" ); if (type == "Audio") { int limit = generalGroup.readEntry("HighestAudioLimit", 20); lri = QString("semantics://highest?audio||limit=%1").arg(limit); if (generalGroup.hasKey("HighestAudioRated")) { QStringList entry = generalGroup.readEntry("HighestAudioRated", QStringList()); QString comp = entry.at(0); int rating = entry.at(1).toInt(); lri.append(QString("||rating%1%2").arg(comp).arg(rating)); } } else { int limit = generalGroup.readEntry("HighestVideoLimit", 20); lri = QString("semantics://highest?video||limit=%1").arg(limit); if (generalGroup.hasKey("HighestVideoRated")) { QStringList entry = generalGroup.readEntry("HighestVideoRated", QStringList()); QString comp = entry.at(0); int rating = entry.at(1).toInt(); lri.append(QString("||rating%1%2").arg(comp).arg(rating)); } } return lri; } QString MediaListsEngine::semanticsLriForFrequent(const QString &type) { QString lri; KConfig config; KConfigGroup generalGroup( &config, "General" ); if (type == "Audio") { int limit = generalGroup.readEntry("FrequentAudioLimit", 20); lri = QString("semantics://frequent?audio||limit=%1").arg(limit); if (generalGroup.hasKey("FrequentAudioPlayed")) { QStringList entry = generalGroup.readEntry("FrequentAudioPlayed", QStringList()); QString comp = entry.at(0); int playCount = entry.at(1).toInt(); lri.append(QString("||playCount%1%2").arg(comp).arg(playCount)); } } else { int limit = generalGroup.readEntry("FrequentVideoLimit", 20); lri = QString("semantics://frequent?video||limit=%1").arg(limit); if (generalGroup.hasKey("FrequentVideoPlayed")) { QStringList entry = generalGroup.readEntry("FrequentVideoPlayed", QStringList()); QString comp = entry.at(0); int playCount = entry.at(1).toInt(); lri.append(QString("||playCount%1%2").arg(comp).arg(playCount)); } } return lri; } QString MediaListsEngine::semanticsLriForRecentlyAdded(const QString &type) { QString lri; KConfig config; KConfigGroup generalGroup( &config, "General" ); if (type == "Audio") { int limit = generalGroup.readEntry("RecentlyAddedAudioLimit", 20); lri = QString("semantics://recentlyadded?audio||limit=%1").arg(limit); } else { int limit = generalGroup.readEntry("RecentlyAddedVideoLimit", 20); lri = QString("semantics://recentlyadded?video||limit=%1").arg(limit); } return lri; } QList MediaListsEngine::loadServerList(QString type) { //Load ampache server list QList mediaList; QFile indexFile(KStandardDirs::locateLocal("data", "bangarang/ampacheservers", false)); if (!indexFile.exists()) { return mediaList; } if (!indexFile.open(QIODevice::ReadOnly | QIODevice::Text)) { return mediaList; } QTextStream in(&indexFile); while (!in.atEnd()) { if (m_stop) { return mediaList; } QString line = in.readLine(); QStringList nameUrl = line.split(":::"); if (nameUrl.count() >= 6) { MediaItem mediaItem; if (nameUrl.at(0).toLower() == type.toLower()) { mediaItem.type = "Category"; mediaItem.artwork = KIcon("repository"); mediaItem.title = nameUrl.at(1).trimmed(); mediaItem.fields["title"] = mediaItem.title; QString server = nameUrl.at(2).trimmed(); QString userName = nameUrl.at(3).trimmed(); QString key = nameUrl.at(4).trimmed(); int pwdLength = nameUrl.at(5).trimmed().toInt(); mediaItem.url = QString("ampache://%1?server=%2||username=%3||key=%4||request=root") .arg(type) .arg(server) .arg(userName) .arg(key); mediaItem.fields["server"] = server; mediaItem.fields["username"] = userName; mediaItem.fields["key"] = key; mediaItem.fields["pwdLength"] = pwdLength; mediaItem.fields["isConfigurable"] = true; mediaList << mediaItem; } } } return mediaList; } bangarang-bangarang/src/platform/listengines/medialistsengine.h000066400000000000000000000033601166760560600253670ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIALISTSENGINE_H #define MEDIALISTSENGINE_H #include "nepomuklistengine.h" #include #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; class MediaIndexer; /** * This ListEngine retrieves a convenient list of "Category" MediaItems. * e.g. Albums, Highest Rated, Movies, Audio CD, etc. * List Resource Identifiers handled are: * medialists://audio * medialists://video */ class MediaListsEngine : public NepomukListEngine { Q_OBJECT public: MediaListsEngine(ListEngineFactory *parent); ~MediaListsEngine(); void run(); private: bool m_loadWhenReady; QString semanticsLriForRecent(const QString &type); QString semanticsLriForHighest(const QString &type); QString semanticsLriForFrequent(const QString &type); QString semanticsLriForRecentlyAdded(const QString &type); QList loadServerList(QString type); }; #endif // MEDIALISTSENGINE_H bangarang-bangarang/src/platform/listengines/musiclistengine.cpp000066400000000000000000000741761166760560600256150ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "musiclistengine.h" #include "../mediaitemmodel.h" #include "listenginefactory.h" #include "../mediavocabulary.h" #include "../mediaquery.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include MusicListEngine::MusicListEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { } MusicListEngine::~MusicListEngine() { } void MusicListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { NepomukListEngine::run(); return; } //Create media list based on engine argument and filter QList mediaList; MediaVocabulary mediaVocabulary = MediaVocabulary(); QString engineArg = m_mediaListProperties.engineArg(); QString engineFilter = m_mediaListProperties.engineFilter(); QStringList engineFilterList = m_mediaListProperties.engineFilterList(); QString artist = m_mediaListProperties.filterFieldValue("artist"); QString artistFilter = m_mediaListProperties.filterForField("artist"); QString album = m_mediaListProperties.filterFieldValue("album"); QString albumFilter = m_mediaListProperties.filterForField("album"); QString genre = m_mediaListProperties.filterFieldValue("genre"); QString genreFilter = m_mediaListProperties.filterForField("genre"); if (m_nepomukInited) { //Retrieve Artists if (engineArg.toLower() == "artists") { MediaQuery query; QStringList bindings; bindings.append(MediaVocabulary::resourceBindingForCategory("Artist")); bindings.append(mediaVocabulary.musicArtistNameBinding()); bindings.append(mediaVocabulary.musicArtistDescriptionBinding()); bindings.append(mediaVocabulary.musicArtistArtworkBinding()); bindings.append(mediaVocabulary.relatedToBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicAnyArtistName(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicAnyArtistDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasMusicArtistArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRelatedTo(mediaVocabulary.artistResourceBinding(), MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings = QStringList(mediaVocabulary.musicArtistNameBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results QStringList urls; QHash relatedTos; int i = 0; while( it.next() ) { if (m_stop) { return; } QString artist = it.binding(mediaVocabulary.musicArtistNameBinding()).literal().toString().trimmed(); if (!artist.isEmpty()) { QString lri = QString("music://albums?artist=%1||%2||%3").arg(artist, albumFilter, genreFilter); if (urls.indexOf(lri) == -1) { //Create new media item MediaItem mediaItem; mediaItem.url = QString("music://albums?artist=%1||%2||%3").arg(artist, albumFilter, genreFilter); mediaItem.title = artist; mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("Artist"); mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("system-users"); mediaItem.fields["title"] = artist; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.fields["description"] = it.binding(mediaVocabulary.musicArtistDescriptionBinding()).literal().toString().trimmed(); mediaItem.fields["artworkUrl"] = it.binding(mediaVocabulary.musicArtistArtworkBinding()).uri().toString(); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); //Provide context info for artist mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaList.append(mediaItem); urls.append(lri); } else { //Update multivalue fields for existing media item MediaItem mediaItem = mediaList.at(urls.indexOf(lri)); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.replace(urls.indexOf(lri), mediaItem); } } ++i; } int totalArtists = mediaList.count(); if (totalArtists != 1) { m_mediaListProperties.name = i18n("Artists"); if (!genre.isEmpty()) { QStringList genreList = genre.split("|OR|"); QString singleGenreName = Utilities::genreFromRawTagGenre(genreList.at(0)); m_mediaListProperties.name = i18nc("%1=Name of Genre", "Artists - %1", singleGenreName); //Add an additional item to show all songs for all artists in this genre MediaItem mediaItem; mediaItem.url = QString("music://songs?%1||%2||%3").arg(albumFilter, artistFilter, genreFilter); mediaItem.title = i18n("All songs"); mediaItem.fields["title"] = singleGenreName; mediaItem.subTitle = QString("%1").arg(singleGenreName); mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("AudioGenre"); mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.fields["artworkUrl"] = Utilities::getGenreArtworkUrl(singleGenreName); mediaItem.artwork = KIcon("audio-x-monkey"); mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaList.append(mediaItem); } m_mediaListProperties.summary = i18np("1 artist", "%1 artists", totalArtists); m_mediaListProperties.type = QString("Categories"); } else { engineArg = "albums"; artist = mediaList.at(0).title; artistFilter = QString("artist=%1").arg(artist); m_mediaListProperties.category = mediaList.at(0); mediaList.clear(); } } //Retrieve Albums if (engineArg.toLower() == "albums") { MediaQuery query; QStringList bindings; bindings.append(MediaVocabulary::resourceBindingForCategory("Album")); bindings.append(mediaVocabulary.musicAlbumTitleBinding()); bindings.append(mediaVocabulary.artistResourceBinding()); bindings.append(mediaVocabulary.musicArtistNameBinding()); bindings.append(mediaVocabulary.relatedToBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicAnyArtistName(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRelatedTo(mediaVocabulary.albumResourceBinding(), MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings(mediaVocabulary.musicAlbumTitleBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results QStringList urls; QHash relatedTos; int i = 0; while( it.next() ) { if (m_stop) { return; } //TODO: For some reason virtuoso SPARQL corrupts string variable non-ascii characters when a filter is specified //WORKAROUND: Prefer artist title using artist resource for now QString artist = Nepomuk::Resource(it.binding(mediaVocabulary.artistResourceBinding()).uri()).property(mediaVocabulary.musicArtistName()).toString(); QString album = it.binding(mediaVocabulary.musicAlbumTitleBinding()).literal().toString().trimmed(); if (!album.isEmpty()) { QString lri = QString("music://songs?album=%1||%2||%3").arg(album, artistFilter, genreFilter); if (urls.indexOf(lri) == -1) { MediaItem mediaItem; mediaItem.url = lri; mediaItem.title = album; mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("Album"); mediaItem.fields["title"] = album; mediaItem.fields["artist"] = artist; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("media-optical-audio"); mediaItem = Utilities::makeSubtitle(mediaItem); //Provide context info for album mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaList.append(mediaItem); urls.append(lri); } else { //Update multivalue fields for existing media item MediaItem mediaItem = mediaList.at(urls.indexOf(lri)); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.replace(urls.indexOf(lri), mediaItem); } } ++i; } int totalAlbmus = mediaList.count(); if (totalAlbmus != 1) { m_mediaListProperties.name = i18n("Albums"); if (!artist.isEmpty()) { m_mediaListProperties.name = i18n("Albums - %1", artist); //Add an additional item to show all songs on all albums for artist MediaItem mediaItem = Utilities::getArtistCategoryItem(artist); mediaItem.url = QString("music://songs?%1||%2||%3").arg(albumFilter, artistFilter, genreFilter); mediaItem.title = QString( " " ) + i18n("All songs"); mediaItem.subTitle = QString(" %1").arg(artist); mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.artwork = KIcon("audio-x-monkey"); mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaList.append(mediaItem); } if (!genre.isEmpty()) { QStringList genreList = genre.split("|OR|"); QString singleGenreName = Utilities::genreFromRawTagGenre(genreList.at(0)); m_mediaListProperties.name = i18n("Albums - %1", singleGenreName); } if (!artist.isEmpty() && !genre.isEmpty()) { QStringList genreList = genre.split("|OR|"); QString singleGenreName = Utilities::genreFromRawTagGenre(genreList.at(0)); m_mediaListProperties.name = i18n("Albums - %1 - %2", artist, singleGenreName); } m_mediaListProperties.summary = i18np("1 album", "%1 albums", totalAlbmus); m_mediaListProperties.type = QString("Categories"); } else { engineArg = "songs"; album = mediaList.at(0).title; albumFilter = QString("album=%1").arg(album); mediaList.clear(); } } //Retrieve Genres if (engineArg.toLower() == "genres") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.genreBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings = bindings; query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results int i = 0; while( it.next() ) { if (m_stop) { return; } QString genre = it.binding(mediaVocabulary.genreBinding()).literal().toString().trimmed(); if (!genre.isEmpty()) { MediaItem mediaItem; mediaItem.url = QString("music://albums?genre=%1||%2||%3").arg(genre, artistFilter, albumFilter); mediaItem.title = genre; mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("AudioGenre"); mediaItem.fields["title"] = genre; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.nowPlaying = false; mediaItem.fields["artworkUrl"] = Utilities::getGenreArtworkUrl(genre); mediaItem.artwork = KIcon("flag-blue"); //Provide context info for genre mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaList.append(mediaItem); } ++i; } if (mediaList.count() != 1) { mediaList = Utilities::sortMediaList(Utilities::mergeGenres(mediaList)); m_mediaListProperties.name = i18n("Genres"); m_mediaListProperties.summary = i18np("1 genre", "%1 genres", mediaList.count()); m_mediaListProperties.type = QString("Categories"); } else { engineArg = "songs"; genre = mediaList.at(0).title; genreFilter = QString("genre=%1").arg(genre); mediaList.clear(); } } //Retrieve Songs if (engineArg.toLower() == "songs") { // Name the newly created media list m_mediaListProperties.name = album + QString(" - ") + artist; if (!album.isEmpty() && !artist.isEmpty()) { m_mediaListProperties.name = QString("%1 - %2").arg(album).arg(artist); } else if (!album.isEmpty()) { m_mediaListProperties.name = QString("%1").arg(album); } else if (!artist.isEmpty()) { m_mediaListProperties.name = QString("%1").arg(artist); } else { m_mediaListProperties.name = i18n("Songs"); } m_mediaListProperties.type = QString("Sources"); //Create and execute query MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.musicArtistNameBinding()); bindings.append(mediaVocabulary.albumResourceBinding()); bindings.append(mediaVocabulary.musicAlbumTitleBinding()); bindings.append(mediaVocabulary.musicTrackNumberBinding()); bindings.append(mediaVocabulary.durationBinding()); bindings.append(mediaVocabulary.musicAlbumYearBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.artworkBinding()); bindings.append(mediaVocabulary.playCountBinding()); bindings.append(mediaVocabulary.lastPlayedBinding()); bindings.append(mediaVocabulary.relatedToBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required)); if (artistFilter.isEmpty()) { query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Optional)); } query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasMusicTrackNumber(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasMusicAlbumYear(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRelatedTo(mediaVocabulary.mediaResourceBinding(), MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.musicArtistNameBinding()); orderByBindings.append(mediaVocabulary.musicAlbumTitleBinding()); orderByBindings.append(mediaVocabulary.musicTrackNumberBinding()); orderByBindings.append(mediaVocabulary.titleBinding()); query.orderBy(orderByBindings); QStringList urls; QList fullMediaList; int limit = 100; int resultSetCount = limit; int resultCount = 0; int offset = 0; query.addLimit(limit); QHash relatedTos; while (resultSetCount >= limit) { if (m_stop) { return; } //Execute Query Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results resultSetCount = 0; while( it.next() ) { if (m_stop) { return; } KUrl url = it.binding(mediaVocabulary.mediaResourceUrlBinding()).uri().isEmpty() ? it.binding(mediaVocabulary.mediaResourceBinding()).uri() : it.binding(mediaVocabulary.mediaResourceUrlBinding()).uri(); int urlsIndex = urls.indexOf(url.prettyUrl()); if (urlsIndex == -1) { //Only create new mediaItem if url is new MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Music"), m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.append(mediaItem); fullMediaList.append(mediaItem); urls.append(mediaItem.url); } } else { MediaItem mediaItem = fullMediaList.at(urlsIndex); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.append(mediaItem); fullMediaList.replace(urlsIndex, mediaItem); } resultSetCount++; } //Emit current result set and increment offset resultCount += mediaList.count(); m_mediaListProperties.summary = i18np("1 song", "%1 songs", resultCount); if (resultSetCount >= limit) { emit results(m_requestSignature, mediaList, m_mediaListProperties, false, m_subRequestSignature); mediaList.clear(); offset += limit; query.addOffset(offset); } } } //Retrieve Search Results if (engineArg.toLower() == "search") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.musicArtistNameBinding()); bindings.append(mediaVocabulary.albumResourceBinding()); bindings.append(mediaVocabulary.musicAlbumTitleBinding()); bindings.append(mediaVocabulary.musicTrackNumberBinding()); bindings.append(mediaVocabulary.durationBinding()); bindings.append(mediaVocabulary.musicAlbumYearBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.artworkBinding()); bindings.append(mediaVocabulary.playCountBinding()); bindings.append(mediaVocabulary.lastPlayedBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasMusicTrackNumber(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasMusicAlbumYear(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional)); query.startFilter(); query.addFilterConstraint(mediaVocabulary.titleBinding(), engineFilter, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.musicArtistNameBinding(), engineFilter, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.musicAlbumTitleBinding(), engineFilter, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.descriptionBinding(), engineFilter, MediaQuery::Contains); query.endFilter(); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.musicArtistNameBinding()); orderByBindings.append(mediaVocabulary.musicAlbumTitleBinding()); orderByBindings.append(mediaVocabulary.musicTrackNumberBinding()); orderByBindings.append(mediaVocabulary.titleBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results QHash relatedTos; while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Music"), m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.append(mediaItem); } } m_mediaListProperties.summary = i18np("1 song", "%1 songs", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } } //Return results emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); //Check if MediaItems in mediaList exist QList mediaItems = Utilities::mediaItemsDontExist(mediaList); if (mediaItems.count() > 0) { emit updateMediaItems(mediaItems); } m_requestSignature = QString(); m_subRequestSignature = QString(); } void MusicListEngine::setFilterForSources(const QString& engineFilter) { //Always return songs m_mediaListProperties.lri = QString("music://songs?%1").arg(engineFilter); } bangarang-bangarang/src/platform/listengines/musiclistengine.h000066400000000000000000000030271166760560600252450ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MUSICLISTENGINE_H #define MUSICLISTENGINE_H #include "nepomuklistengine.h" #include #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; /** * This ListEngine retrieves Music MediaItems from the nepomuk data store. * List Resource Identifiers handled are: * music://artists?[artist]||[album]||[genre] * music://albums?[artist]||[album]||[genre] * music://songs?[artist]||[album]||[genre] * music://search?[search term] */ class MusicListEngine : public NepomukListEngine { Q_OBJECT public: MusicListEngine(ListEngineFactory *parent); ~MusicListEngine(); void run(); void setFilterForSources(const QString& engineFilter); }; #endif // MUSICLISTENGINE_H bangarang-bangarang/src/platform/listengines/nepomuklistengine.cpp000066400000000000000000000072601166760560600261410ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "nepomuklistengine.h" #include "../mediavocabulary.h" #include "../utilities/utilities.h" #include #include #include NepomukListEngine::NepomukListEngine(ListEngineFactory * parent) : ListEngine(parent) { Nepomuk::ResourceManager::instance()->init(); m_nepomukInited = Utilities::nepomukInited(); if (m_nepomukInited) { m_mainModel = Nepomuk::ResourceManager::instance()->mainModel(); } m_removeSourceInfo = false; m_updateSourceInfo = false; m_mediaIndexer = new MediaIndexer(this); } NepomukListEngine::~NepomukListEngine() { } void NepomukListEngine::run() { if (m_removeSourceInfo) { connectIndexer(); m_mediaIndexer->removeInfo(m_mediaItemsInfoToRemove); m_removeSourceInfo = false; m_mediaItemsInfoToRemove.clear(); exec(); disconnectIndexer(); } if (m_updateSourceInfo) { connectIndexer(); m_mediaIndexer->updateInfo(m_mediaItemsInfoToUpdate); m_updateSourceInfo = false; m_mediaItemsInfoToUpdate.clear(); exec(); disconnectIndexer(); } } void NepomukListEngine::removeSourceInfo(QList mediaList) { if (m_nepomukInited) { m_mediaItemsInfoToRemove = mediaList; m_removeSourceInfo = true; start(); } } void NepomukListEngine::updateSourceInfo(QList mediaList, bool nepomukOnly) { if (m_nepomukInited) { m_mediaItemsInfoToUpdate = mediaList; m_updateSourceInfo = true; start(); } Q_UNUSED(nepomukOnly); } void NepomukListEngine::connectIndexer() { connect(m_mediaIndexer, SIGNAL(updateStatus(QHash)), model(), SLOT(updateStatus(QHash))); connect(m_mediaIndexer, SIGNAL(urlInfoRemoved(QString)), model(), SLOT(removeMediaItemByResource(QString))); connect(m_mediaIndexer, SIGNAL(sourceInfoUpdated(MediaItem)), model(), SLOT(updateMediaItem(MediaItem))); connect(m_mediaIndexer, SIGNAL(finished()), model(), SLOT(updateRefresh())); connect(m_mediaIndexer, SIGNAL(allFinished()), model(), SIGNAL(updateSourceInfoFinished())); connect(m_mediaIndexer, SIGNAL(allFinished()), this, SLOT(indexerFinished())); } void NepomukListEngine::disconnectIndexer() { disconnect(m_mediaIndexer, SIGNAL(updateStatus(QHash)), model(), SLOT(updateStatus(QHash))); disconnect(m_mediaIndexer, SIGNAL(urlInfoRemoved(QString)), model(), SLOT(removeMediaItem(QString))); disconnect(m_mediaIndexer, SIGNAL(sourceInfoUpdated(MediaItem)), model(), SLOT(updateMediaItem(MediaItem))); disconnect(m_mediaIndexer, SIGNAL(finished()), model(), SLOT(updateRefresh())); disconnect(m_mediaIndexer, SIGNAL(allFinished()), model(), SIGNAL(updateSourceInfoFinished())); disconnect(m_mediaIndexer, SIGNAL(allFinished()), this, SLOT(indexerFinished())); } void NepomukListEngine::indexerFinished() { exit(); } bangarang-bangarang/src/platform/listengines/nepomuklistengine.h000066400000000000000000000043271166760560600256070ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef NEPOMUKLISTENGINE_H #define NEPOMUKLISTENGINE_H #include "listengine.h" #include "../mediaindexer.h" #include "../mediaitemmodel.h" #include "listenginefactory.h" #include #include #include #include /** This is an abstract base class for all list engines which * use nepomuk. It simply tries to initialize nepomuk during construction * and stores the result in local variables. * It also provides a common interface to update or remove MediaItem * information in the nepomuk datastore. */ class NepomukListEngine : public ListEngine { Q_OBJECT public: NepomukListEngine(ListEngineFactory *parent); virtual ~NepomukListEngine(); virtual void run(); virtual void removeSourceInfo(QList mediaList); virtual void updateSourceInfo(QList mediaList, bool nepomukOnly = false); void connectIndexer(); protected: MediaIndexer* m_mediaIndexer; Soprano::Model * m_mainModel; bool m_nepomukInited; bool m_removeSourceInfo; bool m_updateSourceInfo; QList m_mediaItemsInfoToRemove; QList m_mediaItemsInfoToUpdate; private Q_SLOTS: void disconnectIndexer(); void indexerFinished(); Q_SIGNALS: void updateRemovalStarted(); void updateRemovalComplete(); }; #endif // NEPOMUKLISTENGINE_H bangarang-bangarang/src/platform/listengines/savedlistsengine.cpp000066400000000000000000000157511166760560600257540ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "../mediaitemmodel.h" #include "savedlistsengine.h" #include "listenginefactory.h" #include "../utilities/utilities.h" #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include #include SavedListsEngine::SavedListsEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { } SavedListsEngine::~SavedListsEngine() { } void SavedListsEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { NepomukListEngine::run(); return; } QList mediaList; if (m_mediaListProperties.engineArg().isEmpty() && !m_mediaListProperties.engineFilter().isEmpty()) { MediaListProperties mediaListProperties = m_mediaListProperties; mediaListProperties.lri = m_mediaListProperties.engineFilter(); kDebug() << mediaListProperties.lri; emit loadOtherEngine(mediaListProperties, m_requestSignature, m_subRequestSignature); m_requestSignature = QString(); m_subRequestSignature = QString(); return; } if (!m_mediaListProperties.engineArg().isEmpty()) { QString workingDir; QFile file(KStandardDirs::locateLocal("data", QString("bangarang/%1").arg(m_mediaListProperties.engineArg()), false)); if (file.exists()) { if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); return; } } else { KUrl url(m_mediaListProperties.engineArg()); workingDir = url.directory(KUrl::AppendTrailingSlash); file.setFileName(url.path()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); return; } } //Make sure it's a valid M3U fileref QTextStream in(&file); bool valid = false; bool isM3U = false; bool isPLS = false; if (!in.atEnd()) { QString line = in.readLine(); if (line.trimmed() == "#EXTM3U") { valid = true; isM3U = true; } else if (line.trimmed() == "[playlist]") { valid = true; isPLS = true; } } //Create a MediaItem for each entry if (valid) { while (!in.atEnd()) { if (m_stop) { return; } QString line = in.readLine(); QString title; QString url; int duration = 0; //Read playlist entry to get title and url if ((isM3U) && line.startsWith("#EXTINF:")) { line = line.replace("#EXTINF:",""); QStringList durTitle = line.split(","); if (durTitle.count() == 1) { //No title title = durTitle.at(0); } else { duration = durTitle.at(0).toInt(); title = durTitle.at(1); } url = in.readLine().trimmed(); } else if ((isPLS) && line.startsWith("File")) { url = line.mid(line.indexOf("=") + 1).trimmed(); if (!in.atEnd()) { line = in.readLine(); title = line.mid(line.indexOf("=") + 1).trimmed(); } if (!in.atEnd()) { line = in.readLine(); duration = line.mid(line.indexOf("=") + 1).trimmed().toInt(); } } //Create a basic mediaItem for each entry MediaItem mediaItem; KUrl itemUrl(workingDir, url); if (!url.isEmpty()) { if (!title.isEmpty()) { mediaItem.title = title; } else { mediaItem.title = itemUrl.fileName(); } mediaItem.fields["title"] = mediaItem.title; mediaItem.url = itemUrl.prettyUrl(); mediaItem.fields["url"] = mediaItem.url; if (Utilities::isVideo(mediaItem.url)) { mediaItem.type = "Video"; mediaItem.artwork = KIcon("video-x-generic"); mediaItem.fields["videoType"] = "Video Clip"; } else { mediaItem.type = "Audio"; mediaItem.artwork = KIcon("audio-x-generic"); mediaItem.fields["audioType"] = "Audio Clip"; } if ((duration > 0) && (mediaItem.fields["duration"].toInt() <= 0)) { mediaItem.duration = Utilities::durationString(duration); mediaItem.fields["duration"] = duration; } else if (duration == -1) { mediaItem.duration = QString(); mediaItem.fields["audioType"] = "Audio Stream"; } mediaList << mediaItem; } } } } m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count()); emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); //Get more detailed mediaItem info for (int i = 0; i < mediaList.count(); i++) { if (m_stop) { return; } MediaItem detailedMediaItem = Utilities::mediaItemFromUrl(KUrl(mediaList.at(i).url)); emit updateMediaItem(detailedMediaItem); } //Check if MediaItems in mediaList exist QList mediaItems = Utilities::mediaItemsDontExist(mediaList); if (mediaItems.count() > 0) { emit updateMediaItems(mediaItems); } m_requestSignature = QString(); m_subRequestSignature = QString(); } bangarang-bangarang/src/platform/listengines/savedlistsengine.h000066400000000000000000000027331166760560600254150ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef SAVEDLISTSENGINE_H #define SAVEDLISTSENGINE_H #include "nepomuklistengine.h" #include #include #include #include #include #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; class MediaIndexer; /** * This ListEngine retrieves saved media lists. * List Resource Identifiers handled are: * savedlists://[name] */ class SavedListsEngine : public NepomukListEngine { Q_OBJECT public: SavedListsEngine(ListEngineFactory *parent); ~SavedListsEngine(); void run(); private: Soprano::Model * m_mainModel; }; #endif // SAVEDLISTSENGINE_H bangarang-bangarang/src/platform/listengines/semanticslistengine.cpp000066400000000000000000000574071166760560600264610ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "semanticslistengine.h" #include "../mediaitemmodel.h" #include "listenginefactory.h" #include "../mediavocabulary.h" #include "../mediaquery.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include #include #include #include #include #include #include SemanticsListEngine::SemanticsListEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { } SemanticsListEngine::~SemanticsListEngine() { } void SemanticsListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { NepomukListEngine::run(); return; } //Create media list based on engine argument and filter QList mediaList; MediaVocabulary mediaVocabulary = MediaVocabulary(); QString engineArg = m_mediaListProperties.engineArg(); QString engineFilter = m_mediaListProperties.engineFilter(); QStringList engineFilterList = m_mediaListProperties.engineFilterList(); //Parse filter QString mediaType; QString groupByCategoryType; QString groupByField; QString limitFilter; int originalGenreLimit = 0; if (engineFilterList.count() != 0) { mediaType = engineFilterList.at(0); if (engineFilterList.filter("groupBy=").count() != 0) { QString groupByFilter = engineFilterList.filter("groupBy=").at(0); groupByField = groupByFilter.remove("groupBy=").trimmed(); if (groupByField == "artist") { groupByCategoryType = "Artist"; } else if (groupByField == "album") { groupByCategoryType = "Album"; } else if (groupByField == "genre") { if (mediaType == "audio") { groupByCategoryType = "AudioGenre"; } else if (mediaType == "video") { groupByCategoryType = "VideoGenre"; } } else if (groupByField == "seriesName") { groupByCategoryType = "TV Series"; } else if (groupByField == "actor") { groupByCategoryType = "Actor"; } else if (groupByField == "director") { groupByCategoryType = "Director"; } else if (groupByField == "tag") { if (mediaType == "audio") { groupByCategoryType = "AudioTag"; } else if (mediaType == "video") { groupByCategoryType = "VideoTag"; } } } if (engineFilterList.filter("limit=").count() !=0) { limitFilter = engineFilterList.filter("limit=").at(0); if (groupByField == "genre") { originalGenreLimit = m_mediaListProperties.filterValue(limitFilter).trimmed().toInt(); int originalFilterIndex = engineFilterList.indexOf(limitFilter); limitFilter = QString("%1%2%3").arg(m_mediaListProperties.filterField(limitFilter)) .arg(m_mediaListProperties.filterOperator(limitFilter)) .arg(m_mediaListProperties.filterValue(limitFilter).trimmed().toInt()*3); engineFilterList.replace(originalFilterIndex, limitFilter); } } } if (m_nepomukInited) { if (engineArg.toLower() == "frequent") { mediaList.clear(); if (mediaType == "audio" || mediaType == "video") { MediaQuery query; bool ignoreZeros = false; if (groupByCategoryType.isEmpty()) { QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.playCountBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); if (mediaType == "audio") { query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required)); } else if (mediaType == "video") { query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); } query.addLRIFilterConditions(engineFilterList, mediaVocabulary); if (m_mediaListProperties.filterForField("playCount").isEmpty()) { query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Required, 0, MediaQuery::GreaterThan)); ignoreZeros = true; } query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional)); query.endWhere(); QStringList orderByBindings; QList order; orderByBindings.append(mediaVocabulary.playCountBinding()); order.append(MediaQuery::Descending); orderByBindings.append(mediaVocabulary.lastPlayedBinding()); order.append(MediaQuery::Descending); query.orderBy(orderByBindings, order); } else { QStringList bindings; //NOTE:query.addLRIFilterConditions will automatically add //the groupBy field name to the binding list. QString groupByResourceBinding = MediaVocabulary::resourceBindingForCategory(groupByCategoryType); if (!groupByResourceBinding.isEmpty()) { bindings.append(groupByResourceBinding); } bindings.append(query.fieldBindingDictionary[groupByField]); bindings.append(MediaQuery::aggregateBinding(mediaVocabulary.playCountBinding(), MediaQuery::Sum)); query.select(bindings, MediaQuery::Distinct); query.startWhere(); MediaQuery subQuery; QStringList subBindings; subBindings.append(mediaVocabulary.playCountBinding()); subBindings.append(mediaVocabulary.mediaResourceBinding()); subQuery.select(subBindings, MediaQuery::Distinct); subQuery.startWhere(); if (mediaType == "audio") { subQuery.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required)); } else if (mediaType == "video") { subQuery.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); } if (m_mediaListProperties.filterForField("playCount").isEmpty()) { subQuery.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Required, 0, MediaQuery::GreaterThan)); ignoreZeros = true; } QStringList subQueryLRIFilterList = engineFilterList; subQueryLRIFilterList.removeAll(limitFilter); subQuery.addLRIFilterConditions(subQueryLRIFilterList, mediaVocabulary); subQuery.endWhere(); query.addSubQuery(subQuery); query.endWhere(); query.addLRIFilterCondition(limitFilter, mediaVocabulary); QStringList orderByBindings; QList order; orderByBindings.append(QString("%1_sum").arg(mediaVocabulary.playCountBinding())); order.append(MediaQuery::Descending); query.orderBy(orderByBindings, order); } Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem; if (groupByCategoryType.isEmpty()) { Nepomuk::Resource res = Nepomuk::Resource(it.binding(mediaVocabulary.mediaResourceBinding()).uri()); mediaItem = Utilities::mediaItemFromNepomuk(res, m_mediaListProperties.lri); mediaItem.semanticComment = i18np("played once", "played %1 times", mediaItem.fields["playCount"].toInt()); } else { mediaItem = Utilities::categoryMediaItemFromIterator(it, groupByCategoryType, m_mediaListProperties.lri); int playCount = it.binding(QString("%1_sum").arg(mediaVocabulary.playCountBinding())).literal().toInt(); mediaItem.semanticComment = i18np("played once", "played %1 times", playCount); mediaItem.fields["playCount"] = playCount; } if (!mediaItem.url.startsWith("nepomuk:/")) { if ((ignoreZeros && mediaItem.fields["playCount"].toInt() > 0) || !ignoreZeros) { if (groupByCategoryType == "AudioGenre") { addUniqueGenreGroup("playCount", mediaItem, &mediaList, originalGenreLimit); } else { mediaList.append(mediaItem); } } } } m_mediaListProperties.name = i18n("Frequently Played"); m_mediaListProperties.type = QString("Sources"); } } if (engineArg.toLower() == "recent") { mediaList.clear(); if (!mediaType.isEmpty()) { MediaQuery query; QStringList bindings; if (groupByCategoryType.isEmpty()) { bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.lastPlayedBinding()); } else { //NOTE:query.addLRIFilterConditions will automatically add //the groupBy field name to the binding list. QString groupByResourceBinding = MediaVocabulary::resourceBindingForCategory(groupByCategoryType); if (!groupByResourceBinding.isEmpty()) { bindings.append(groupByResourceBinding); } bindings.append(MediaQuery::aggregateBinding(mediaVocabulary.lastPlayedBinding(), MediaQuery::Max)); } query.select(bindings, MediaQuery::Distinct); query.startWhere(); if (mediaType == "audio") { query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required)); } else if (mediaType == "video") { query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); } query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Required)); query.endWhere(); QStringList orderByBindings; QList order; if (groupByCategoryType.isEmpty()) { orderByBindings.append(mediaVocabulary.lastPlayedBinding()); } else { orderByBindings.append(QString("%1_max").arg(mediaVocabulary.lastPlayedBinding())); } order.append(MediaQuery::Descending); query.orderBy(orderByBindings, order); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem; if (groupByCategoryType.isEmpty()) { Nepomuk::Resource res = Nepomuk::Resource(it.binding(mediaVocabulary.mediaResourceBinding()).uri()); mediaItem = Utilities::mediaItemFromNepomuk(res, m_mediaListProperties.lri); mediaItem.fields["lastPlayed"] = it.binding(mediaVocabulary.lastPlayedBinding()).literal().toDateTime(); } else { mediaItem = Utilities::categoryMediaItemFromIterator(it, groupByCategoryType, m_mediaListProperties.lri); mediaItem.fields["lastPlayed"] = it.binding(QString("%1_max").arg(mediaVocabulary.lastPlayedBinding())).literal().toDateTime(); } mediaItem.semanticComment = Utilities::wordsForTimeSince(mediaItem.fields["lastPlayed"].toDateTime()); if (!mediaItem.url.startsWith("nepomuk:/")) { if (groupByCategoryType == "AudioGenre") { addUniqueGenreGroup("lastPlayed", mediaItem, &mediaList, originalGenreLimit); } else { mediaList.append(mediaItem); } } } m_mediaListProperties.name = i18n("Recently Played"); m_mediaListProperties.type = QString("Sources"); } } if (engineArg.toLower() == "highest") { mediaList.clear(); if (!mediaType.isEmpty()) { bool ignoreZeros = false; MediaQuery query; QStringList bindings; if (groupByCategoryType.isEmpty()) { bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.ratingBinding()); } else { //NOTE:query.addLRIFilterConditions will automatically add //the groupBy field name to the binding list. QString groupByResourceBinding = MediaVocabulary::resourceBindingForCategory(groupByCategoryType); if (!groupByResourceBinding.isEmpty()) { bindings.append(groupByResourceBinding); } bindings.append(MediaQuery::aggregateBinding(mediaVocabulary.ratingBinding(), MediaQuery::Sum)); bindings.append(MediaQuery::aggregateBinding(mediaVocabulary.ratingBinding(), MediaQuery::Count)); } query.select(bindings, MediaQuery::Distinct); query.startWhere(); if (mediaType == "audio") { query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required)); } else if (mediaType == "video") { query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); } query.addLRIFilterConditions(engineFilterList, mediaVocabulary); if (m_mediaListProperties.filterForField("rating").isEmpty()) { query.addCondition(mediaVocabulary.hasRating(MediaQuery::Required, 0, MediaQuery::GreaterThan)); ignoreZeros = true; } query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional)); query.endWhere(); QStringList orderByBindings; QList order; if (groupByCategoryType.isEmpty()) { orderByBindings.append(mediaVocabulary.ratingBinding()); order.append(MediaQuery::Descending); orderByBindings.append(mediaVocabulary.playCountBinding()); order.append(MediaQuery::Descending); } else { orderByBindings.append(QString("%1_sum").arg(mediaVocabulary.ratingBinding())); order.append(MediaQuery::Descending); order.append(MediaQuery::Descending); } query.orderBy(orderByBindings, order); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem; if (groupByCategoryType.isEmpty()) { Nepomuk::Resource res = Nepomuk::Resource(it.binding(mediaVocabulary.mediaResourceBinding()).uri()); mediaItem = Utilities::mediaItemFromNepomuk(res, m_mediaListProperties.lri); } else { mediaItem = Utilities::categoryMediaItemFromIterator(it, groupByCategoryType, m_mediaListProperties.lri); int sum = it.binding(QString("%1_sum").arg(mediaVocabulary.ratingBinding())).literal().toInt(); int count = it.binding(QString("%1_count").arg(mediaVocabulary.ratingBinding())).literal().toInt(); int rating = sum/count; mediaItem.fields["rating"] = rating; } if (!mediaItem.url.startsWith("nepomuk:/")) { if ((ignoreZeros && mediaItem.fields["rating"].toInt() > 0) || !ignoreZeros) { if (groupByCategoryType == "AudioGenre") { addUniqueGenreGroup("rating", mediaItem, &mediaList, originalGenreLimit); } else { mediaList.append(mediaItem); } } } } m_mediaListProperties.name = i18n("Highest Rated"); m_mediaListProperties.type = QString("Sources"); } } if (engineArg.toLower() == "recentlyadded") { mediaList.clear(); if (!mediaType.isEmpty()) { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append("added"); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition("graph ?g { "); if (mediaType == "audio") { query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required)); } else if (mediaType == "video") { query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); } query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.addCondition("} "); query.addCondition("?g nao:created ?added . "); query.endWhere(); QStringList orderByBindings; QList order; orderByBindings.append("added"); order.append(MediaQuery::Descending); query.orderBy(orderByBindings, order); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem; QDateTime added = it.binding("added").literal().toDateTime(); Nepomuk::Resource res = Nepomuk::Resource(it.binding(mediaVocabulary.mediaResourceBinding()).uri()); mediaItem = Utilities::mediaItemFromNepomuk(res, m_mediaListProperties.lri); mediaItem.semanticComment = i18nc("for example, added 3 days ago", "added %1", Utilities::wordsForTimeSince(added)); if (!mediaItem.url.startsWith("nepomuk:/")) { mediaList.append(mediaItem); } } m_mediaListProperties.name = i18n("Recently Added"); m_mediaListProperties.type = QString("Sources"); } } } emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); //Check if MediaItems in mediaList exist QList mediaItems = Utilities::mediaItemsDontExist(mediaList); if (mediaItems.count() > 0) { emit updateMediaItems(mediaItems); } else { //Get any remaining metadata for mediaItems if (mediaType == "video") { for (int i = 0; i < mediaList.count(); i++) { if (m_stop) { return; } MediaItem mediaItem = Utilities::completeMediaItem(mediaList.at(i)); emit updateMediaItem(mediaItem); } } } m_requestSignature = QString(); m_subRequestSignature = QString(); } void SemanticsListEngine::addUniqueGenreGroup(QString field, MediaItem mediaItem, QList* mediaList, int limit) { //Resolve and merge raw genres QString resolvedGenre = Utilities::genreFromRawTagGenre(mediaItem.title); bool genreExists = false; for (int i = 0; i < mediaList->count(); i++) { if (Utilities::genreFromRawTagGenre(mediaList->at(i).title) == resolvedGenre) { genreExists = true; mediaItem.title = resolvedGenre; mediaItem.fields["title"] = mediaItem.title; if (field == "rating") { int oldRating = mediaList->at(i).fields["rating"].toInt(); int currentRating = mediaItem.fields["rating"].toInt(); if (currentRating < oldRating) { mediaItem.fields["rating"] = oldRating; } } else if (field == "lastPlayed") { QDateTime oldLastPlayed = mediaList->at(i).fields["lastPlayed"].toDateTime(); QDateTime currentLastPlayed = mediaItem.fields["lastPlayed"].toDateTime(); if (currentLastPlayed < oldLastPlayed) { mediaItem.fields["lastPlayed"] = oldLastPlayed; mediaItem.semanticComment = Utilities::wordsForTimeSince(mediaItem.fields["lastPlayed"].toDateTime()); } } else if (field == "playCount") { int oldPlayCount = mediaList->at(i).fields["playCount"].toInt(); int newPlayCount = oldPlayCount + mediaItem.fields["playCount"].toInt(); mediaItem.semanticComment = i18np("played once", "played %1 times", newPlayCount); mediaItem.fields["playCount"] = newPlayCount; } mediaList->replace(i, mediaItem); break; } } if (!genreExists && mediaList->count() < limit) { mediaList->append(mediaItem); } } bangarang-bangarang/src/platform/listengines/semanticslistengine.h000066400000000000000000000032661166760560600261200ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef SEMANTICSLISTENGINE_H #define SEMANTICSLISTENGINE_H #include "nepomuklistengine.h" #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; /** * This class retrieves a list of MediaItems based on * playback semantics in the nepomuk data store. * e.g. Highest rated, Frequently played, etc. * List Resource Identifiers handled are: * semantics://frequent?audio * semantics://frequent?video * semantics://recent?audio * semantics://recent?video * semantics://highest?audio * semantics://highest?video */ class SemanticsListEngine : public NepomukListEngine { Q_OBJECT public: SemanticsListEngine(ListEngineFactory *parent); ~SemanticsListEngine(); void run(); private: void addUniqueGenreGroup(QString field, MediaItem mediaItem, QList* mediaList, int limit); }; #endif // SEMANTICSLISTENGINE_H bangarang-bangarang/src/platform/listengines/taglistengine.cpp000066400000000000000000000152151166760560600252350ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Florian Weik (f.weik@web.de) * * * 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 . */ #include "taglistengine.h" #include "../mediaitemmodel.h" #include "listenginefactory.h" #include "../mediavocabulary.h" #include "../mediaquery.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include TagListEngine::TagListEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { } TagListEngine::~TagListEngine() { } void TagListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { NepomukListEngine::run(); return; } //Create media list based on engine argument and filter QList mediaList; QString engineArg = m_mediaListProperties.engineArg(); QString engineFilter = m_mediaListProperties.engineFilter(); QStringList engineFilterList = m_mediaListProperties.engineFilterList(); QString mediaType; MediaVocabulary mediaVocabulary = MediaVocabulary(); if (m_nepomukInited) { if (engineArg == "audiotags" || engineArg == "videotags") { QString mediaType; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.tagBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); if (engineArg == "audiotags") { query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required)); mediaType = "audio"; } else if (engineArg == "videotags") { query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); mediaType = "video"; } query.addCondition(mediaVocabulary.hasTag(MediaQuery::Required)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.tagBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } QString tag = it.binding(mediaVocabulary.tagBinding()).literal().toString().trimmed(); MediaItem mediaItem; mediaItem.url = QString("tag://%1?tag=%2").arg(mediaType).arg(tag); mediaItem.type = "Category"; if (mediaType == "audio") { mediaItem.fields["categoryType"] = "AudioTag"; } else if (mediaType == "video") { mediaItem.fields["categoryType"] = "VideoTag"; } mediaItem.title = tag; mediaItem.fields["title"] = tag; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.artwork = KIcon("view-pim-notes"); mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?%1||limit=4||tag=%2").arg(mediaType).arg(tag)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?%1||limit=4||tag=%2").arg(mediaType).arg(tag)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?%1||limit=4||tag=%2").arg(mediaType).arg(tag)); mediaList.append(mediaItem); } mediaList = Utilities::sortMediaList(mediaList); m_mediaListProperties.name = i18n("Tags"); m_mediaListProperties.summary = i18np("1 tag", "%1 tags", mediaList.count()); m_mediaListProperties.type = QString("Categories"); } else if (engineArg == "audio" || engineArg == "video") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); if (engineArg == "audio") { query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required)); } else if (engineArg == "video") { query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); } query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } Nepomuk::Resource res = Nepomuk::Resource(it.binding(mediaVocabulary.mediaResourceBinding()).uri()); MediaItem mediaItem = Utilities::mediaItemFromNepomuk(res, m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { mediaList.append(mediaItem); } } mediaList = Utilities::sortMediaList(mediaList); m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } } emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); //Check if MediaItems in mediaList exist QList mediaItems = Utilities::mediaItemsDontExist(mediaList); if (mediaItems.count() > 0) { emit updateMediaItems(mediaItems); } m_requestSignature = QString(); m_subRequestSignature = QString(); } bangarang-bangarang/src/platform/listengines/taglistengine.h000066400000000000000000000025221166760560600246770ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Florian Weik (f.weik@web.de) * * * 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 . */ #ifndef TAGLISTENGINE_H #define TAGLISTENGINE_H #include "nepomuklistengine.h" #include #include class MediaItem; class MediaListProperties; class ListEngineFactory; /** * This class retrieves a list of MediaItems based on * their tags in the nepomuk data store. Return a list * of all tags if [tag] is empty * tag://[tag]?audio * tag://[tag]?video */ class TagListEngine : public NepomukListEngine { Q_OBJECT public: TagListEngine(ListEngineFactory *parent); ~TagListEngine(); void run(); }; #endif // TAGLISTENGINE_H bangarang-bangarang/src/platform/listengines/videolistengine.cpp000066400000000000000000001361221166760560600255710ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "../mediaitemmodel.h" #include "videolistengine.h" #include "listenginefactory.h" #include "../mediavocabulary.h" #include "../utilities/utilities.h" #include #include #include #include #include #include #include VideoListEngine::VideoListEngine(ListEngineFactory * parent) : NepomukListEngine(parent) { } VideoListEngine::~VideoListEngine() { } void VideoListEngine::run() { QThread::setTerminationEnabled(true); m_stop = false; if (m_updateSourceInfo || m_removeSourceInfo) { NepomukListEngine::run(); return; } //Create media list based on engine argument and filter QList mediaList; MediaVocabulary mediaVocabulary = MediaVocabulary(); mediaVocabulary.setVocabulary(MediaVocabulary::nmm); mediaVocabulary.setVideoVocabulary(MediaVocabulary::nmm); QString engineArg = m_mediaListProperties.engineArg(); //Parse filter QString engineFilter = m_mediaListProperties.engineFilter(); QStringList engineFilterList = m_mediaListProperties.engineFilterList(); QString searchTerm; if (engineFilterList.count() > 0) { searchTerm = engineFilterList.at(0); } QString genre = m_mediaListProperties.filterFieldValue("genre"); QString genreFilter = m_mediaListProperties.filterForField("genre"); QString seriesName = m_mediaListProperties.filterFieldValue("seriesName"); QString seriesNameFilter = m_mediaListProperties.filterForField("seriesName"); int season = m_mediaListProperties.filterFieldValue("season").trimmed().toInt(); QString seasonFilter = m_mediaListProperties.filterForField("season"); if (m_nepomukInited) { // Retrieve Movies if (engineArg.toLower() == "movies") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.durationBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.releaseDateBinding()); bindings.append(mediaVocabulary.artworkBinding()); bindings.append(mediaVocabulary.playCountBinding()); bindings.append(mediaVocabulary.lastPlayedBinding()); bindings.append(mediaVocabulary.relatedToBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeVideoMovie(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRelatedTo(mediaVocabulary.mediaResourceBinding(), MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.titleBinding()); orderByBindings.append(mediaVocabulary.releaseDateBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results QStringList urls; QHash relatedTos; while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Movie"), m_mediaListProperties.lri); if (urls.indexOf(mediaItem.url) == -1) { if (!mediaItem.url.startsWith("nepomuk:/")) { relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.append(mediaItem); urls.append(mediaItem.url); } } else { //Update multivalue fields for existing media item mediaItem = mediaList.at(urls.indexOf(mediaItem.url)); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.replace(urls.indexOf(mediaItem.url), mediaItem); } kDebug() << mediaItem.fields["duration"].toInt(); kDebug() << mediaItem.duration; } m_mediaListProperties.name = i18n("Movies"); if (!genre.isEmpty()) { m_mediaListProperties.name = i18nc("%1=Genre of the movie", "Movies - %1", genre); } m_mediaListProperties.summary = i18np("1 movie", "%1 movies", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } //Retrieve Video Clips if (engineArg.toLower() == "clips") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.artworkBinding()); bindings.append(mediaVocabulary.playCountBinding()); bindings.append(mediaVocabulary.lastPlayedBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional)); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.titleBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Video Clip"), m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { mediaList.append(mediaItem); } } m_mediaListProperties.name = i18n("Video Clips"); m_mediaListProperties.summary = i18np("1 clip", "%1 clips", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } //Retrieve TV Series if (engineArg.toLower() == "tvshows") { MediaQuery query; QStringList bindings; bindings.append(MediaVocabulary::resourceBindingForCategory("TV Series")); bindings.append(mediaVocabulary.videoSeriesTitleBinding()); bindings.append(mediaVocabulary.videoSeriesDescriptionBinding()); bindings.append(mediaVocabulary.videoSeriesArtworkBinding()); bindings.append(mediaVocabulary.relatedToBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoSeriesDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoSeriesArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRelatedTo(MediaVocabulary::resourceBindingForCategory("TV Series"), MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings(mediaVocabulary.videoSeriesTitleBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results QStringList urls; QHash relatedTos; while( it.next() ) { if (m_stop) { return; } QString seriesName = it.binding(mediaVocabulary.videoSeriesTitleBinding()).literal().toString(); if (!seriesName.isEmpty()) { QString lri = QString("video://seasons?||seriesName=%1||%2").arg(seriesName).arg(genreFilter); if (urls.indexOf(lri) == -1) { MediaItem mediaItem; mediaItem.url = lri; mediaItem.title = seriesName; mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("TV Series"); mediaItem.fields["title"] = seriesName; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.fields["description"] = it.binding(mediaVocabulary.videoSeriesDescriptionBinding()).literal().toString().trimmed(); mediaItem.fields["artworkUrl"] = it.binding(mediaVocabulary.videoSeriesArtworkBinding()).uri().toString(); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("video-television"); //Provide context info for TV series mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||%1||seriesName=%2").arg(genreFilter).arg(seriesName)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||%1||seriesName=%2").arg(genreFilter).arg(seriesName)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||%1||seriesName=%2").arg(genreFilter).arg(seriesName)); mediaList.append(mediaItem); urls.append(lri); } else { //Update multivalue fields for existing media item MediaItem mediaItem = mediaList.at(urls.indexOf(lri)); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.replace(urls.indexOf(lri), mediaItem); } } } /* Check, whether there are videos which have the TV show flag set, * but no series name is entered. If so, add an entry which allows * access to those files. Only do so if no category (Genre) is * specified. */ if (genre.isEmpty()) { MediaQuery query; query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional)); query.startFilter(); query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), QString(), MediaQuery::NotBound); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), "^$", MediaQuery::Contains); query.endFilter(); if(query.executeAsk(m_mainModel)) { MediaItem mediaItem; mediaItem.url = QString("video://episodes?||seriesName=~"); mediaItem.title = i18n("Uncategorized TV Shows"); mediaItem.fields["title"] = i18n("Uncategorized TV Shows"); mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("Basic+Artwork"); mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("video-television"); mediaList.append(mediaItem); } } if(mediaList.count() != 1) { m_mediaListProperties.name = i18n("TV Shows"); m_mediaListProperties.summary = i18np("1 show", "%1 shows", mediaList.count()); m_mediaListProperties.type = QString("Categories"); } else { //engineArg = "episodes"; if (mediaList.at(0).url == "video://episodes?||seriesName=~") { seriesName = "~"; engineArg = "episodes"; } else { seriesName = mediaList.at(0).title; engineArg = "seasons"; } seriesNameFilter = QString("seriesName=%1").arg(seriesName); mediaList.clear(); } } //Retrieve TV Seasons if (engineArg.toLower() == "seasons") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.videoSeasonBinding()); bindings.append(mediaVocabulary.videoSeriesTitleBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); if (seriesName == "~") { query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional)); query.startFilter(); query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), QString(), MediaQuery::NotBound); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), "^$", MediaQuery::Contains); query.endFilter(); } query.endWhere(); QStringList orderByBindings = bindings; query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results int lastSeason = -1; while( it.next() ) { if (m_stop) { return; } int season = it.binding("season").literal().toInt(); MediaItem mediaItem; mediaItem.url = QString("video://episodes?||season=%1||%2||%3") .arg(season).arg(seriesNameFilter).arg(genreFilter); mediaItem.title = seriesName; mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["season"] = season; mediaItem.fields["seriesName"] = seriesName; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("TV Season"); mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("video-television"); mediaItem = Utilities::makeSubtitle(mediaItem); //Provide context info for genre mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||%1||%2||season=%3").arg(genreFilter).arg(seriesNameFilter).arg(season)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||%1||%2||season=%3").arg(genreFilter).arg(seriesNameFilter).arg(season)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||%1||%2||season=%3").arg(genreFilter).arg(seriesNameFilter).arg(season)); mediaList.append(mediaItem); lastSeason = season; } int totalSeasons = mediaList.count(); /* Check, whether there are TV shows, which have no series entered. * If so, add an entry which allows access to those files. */ MediaQuery noSeasonsQuery; noSeasonsQuery.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required)); noSeasonsQuery.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required, seriesName, MediaQuery::Equal)); noSeasonsQuery.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional)); noSeasonsQuery.startFilter(); noSeasonsQuery.addFilterConstraint(mediaVocabulary.videoSeasonBinding(), QString(), MediaQuery::NotBound); noSeasonsQuery.endFilter(); if(noSeasonsQuery.executeAsk(m_mainModel)) { MediaItem mediaItem; mediaItem.url = QString("video://episodes?||season=-1||%1||%2").arg(genreFilter).arg(seriesNameFilter); mediaItem.title = seriesName; mediaItem.fields["title"] = seriesName; mediaItem.fields["seriesName"] = seriesName; mediaItem.subTitle = i18n("Uncategorized seasons"); mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("Basic+Artwork"); mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("video-television"); mediaList.append(mediaItem); } if (totalSeasons != 1) { m_mediaListProperties.name = i18nc("%1=Name of the Series", "Seasons - %1", seriesName); m_mediaListProperties.summary = i18np("1 season", "%1 seasons", totalSeasons); m_mediaListProperties.type = QString("Categories"); } else { engineArg = "episodes"; if (mediaList.at(0).url == QString("video://episodes?||season=-1||%1||%2").arg(genreFilter).arg(seriesNameFilter)) { season = -1; } else { season = lastSeason; } seasonFilter = QString("season=%1").arg(season); mediaList.clear(); } } //Retrieve TV Show Episodes if (engineArg.toLower() == "episodes") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.videoSeriesTitleBinding()); bindings.append(mediaVocabulary.videoSeasonBinding()); bindings.append(mediaVocabulary.videoEpisodeNumberBinding()); bindings.append(mediaVocabulary.durationBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.releaseDateBinding()); bindings.append(mediaVocabulary.artworkBinding()); bindings.append(mediaVocabulary.playCountBinding()); bindings.append(mediaVocabulary.lastPlayedBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); if (seriesName == "~") { query.startFilter(); query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), QString(), MediaQuery::NotBound); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), "^$", MediaQuery::Contains); query.endFilter(); } if (season == -1) { query.startFilter(); query.addFilterConstraint(mediaVocabulary.videoSeasonBinding(), QString(), MediaQuery::NotBound); query.endFilter(); } query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.videoSeriesTitleBinding()); orderByBindings.append(mediaVocabulary.videoSeasonBinding()); orderByBindings.append(mediaVocabulary.videoEpisodeNumberBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("TV Show"), m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { mediaList.append(mediaItem); } } if (seriesName == "~") { m_mediaListProperties.name = i18n("Uncategorized TV Shows"); } else if (season != -1) { m_mediaListProperties.name = i18nc("%1=Name of the series, %2=Number of the Season", "%1 - Season %2", seriesName, season); } else { m_mediaListProperties.name = i18nc("%1=Name of the Series", "%1 - Uncategorized Seasons", seriesName); } m_mediaListProperties.summary = i18np("1 episode", "%1 episodes", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } //Retrieve Genres if (engineArg.toLower() == "genres") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.genreBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings = bindings; query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results while( it.next() ) { if (m_stop) { return; } QString genre = it.binding("genre").literal().toString().trimmed(); if (!genre.isEmpty()) { MediaItem mediaItem; mediaItem.url = QString("video://sources?||genre=%1").arg(genre); mediaItem.title = genre; mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("VideoGenre"); mediaItem.fields["title"] = genre; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("flag-green"); mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||genre=%1").arg(genre)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||genre=%1").arg(genre)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||genre=%1").arg(genre)); mediaList.append(mediaItem); } } m_mediaListProperties.name = i18n("Genres"); m_mediaListProperties.summary = i18np("1 genre", "%1 genres", mediaList.count()); m_mediaListProperties.type = QString("Categories"); } //Retrieve Actors if (engineArg.toLower() == "actors") { MediaQuery query; QStringList bindings; bindings.append(MediaVocabulary::resourceBindingForCategory("Actor")); bindings.append(mediaVocabulary.videoActorBinding()); bindings.append(mediaVocabulary.videoActorDescriptionBinding()); bindings.append(mediaVocabulary.videoActorArtworkBinding()); bindings.append(mediaVocabulary.relatedToBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoActorDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoActorArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRelatedTo(MediaVocabulary::resourceBindingForCategory("Actor"), MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings(mediaVocabulary.videoActorBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results QStringList urls; QHash relatedTos; while( it.next() ) { if (m_stop) { return; } QString actor = it.binding(mediaVocabulary.videoActorBinding()).literal().toString().trimmed(); if (!actor.isEmpty()) { QString lri = QString("video://sources?||actor=%1").arg(actor);; if (urls.indexOf(lri) == -1) { MediaItem mediaItem; mediaItem.url = lri; mediaItem.title = actor; mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("Actor"); mediaItem.fields["title"] = actor; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.fields["description"] = it.binding(mediaVocabulary.videoActorDescriptionBinding()).literal().toString().trimmed(); mediaItem.fields["artworkUrl"] = it.binding(mediaVocabulary.videoActorArtworkBinding()).uri().toString(); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("view-media-artist"); mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||actor=%1").arg(actor)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||actor=%1").arg(actor)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||actor=%1").arg(actor)); mediaList.append(mediaItem); urls.append(lri); } else { //Update multivalue fields for existing media item MediaItem mediaItem = mediaList.at(urls.indexOf(lri)); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.replace(urls.indexOf(lri), mediaItem); } } } m_mediaListProperties.name = i18n("Actors"); m_mediaListProperties.summary = i18np("1 actor", "%1 actors", mediaList.count()); m_mediaListProperties.type = QString("Categories"); } //Retrieve Directors if (engineArg.toLower() == "directors") { MediaQuery query; QStringList bindings; bindings.append(MediaVocabulary::resourceBindingForCategory("Director")); bindings.append(mediaVocabulary.videoDirectorBinding()); bindings.append(mediaVocabulary.videoDirectorDescriptionBinding()); bindings.append(mediaVocabulary.videoDirectorArtworkBinding()); bindings.append(mediaVocabulary.relatedToBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoDirectorDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoDirectorArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRelatedTo(MediaVocabulary::resourceBindingForCategory("Director"), MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings(mediaVocabulary.videoDirectorBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results QStringList urls; QHash relatedTos; while( it.next() ) { if (m_stop) { return; } QString director = it.binding(mediaVocabulary.videoDirectorBinding()).literal().toString().trimmed(); if (!director.isEmpty()) { QString lri = QString("video://sources?||director=%1").arg(director); if (urls.indexOf(lri) == -1) { MediaItem mediaItem; mediaItem.url = lri; mediaItem.title = director; mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("Director"); mediaItem.fields["title"] = director; mediaItem.fields["sourceLri"] = m_mediaListProperties.lri; mediaItem.fields["description"] = it.binding(mediaVocabulary.videoDirectorDescriptionBinding()).literal().toString().trimmed(); mediaItem.fields["artworkUrl"] = it.binding(mediaVocabulary.videoDirectorArtworkBinding()).uri().toString(); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("view-media-artist"); mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||director=%1").arg(director)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||director=%1").arg(director)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||director=%1").arg(director)); mediaList.append(mediaItem); urls.append(lri); } else { //Update multivalue fields for existing media item MediaItem mediaItem = mediaList.at(urls.indexOf(lri)); relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.replace(urls.indexOf(lri), mediaItem); } } } m_mediaListProperties.name = i18n("Directors"); m_mediaListProperties.summary = i18np("1 director", "%1 directors", mediaList.count()); m_mediaListProperties.type = QString("Categories"); } //Retrieve Search Results if (engineArg.toLower() == "search") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.videoSeriesTitleBinding()); bindings.append(mediaVocabulary.videoSeasonBinding()); bindings.append(mediaVocabulary.videoEpisodeNumberBinding()); bindings.append(mediaVocabulary.durationBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.releaseDateBinding()); bindings.append(mediaVocabulary.artworkBinding()); bindings.append(mediaVocabulary.playCountBinding()); bindings.append(mediaVocabulary.lastPlayedBinding()); bindings.append(mediaVocabulary.relatedToBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoProducer(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoWriter(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRelatedTo(mediaVocabulary.mediaResourceBinding(), MediaQuery::Optional)); query.startFilter(); query.addFilterConstraint(mediaVocabulary.titleBinding(), searchTerm, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), searchTerm, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.descriptionBinding(), searchTerm, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.videoWriterBinding(), searchTerm, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.videoDirectorBinding(), searchTerm, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.videoProducerBinding(), searchTerm, MediaQuery::Contains); query.addFilterOr(); query.addFilterConstraint(mediaVocabulary.videoActorBinding(), searchTerm, MediaQuery::Contains); query.endFilter(); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.titleBinding()); orderByBindings.append(mediaVocabulary.videoSeriesTitleBinding()); orderByBindings.append(mediaVocabulary.videoSeasonBinding()); orderByBindings.append(mediaVocabulary.videoEpisodeNumberBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results QHash relatedTos; while( it.next() ) { if (m_stop) { return; } QUrl url = it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri().isEmpty() ? it.binding(MediaVocabulary::mediaResourceBinding()).uri() : it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri(); Nepomuk::Resource res(url); QString type = "Video Clip"; if (res.exists()) { if (res.hasType(mediaVocabulary.typeVideoMovie())) { type = "Movie"; } if (res.hasType(mediaVocabulary.typeVideoTVShow())) { type = "TV Show"; } } MediaItem mediaItem = Utilities::mediaItemFromIterator(it, type, m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.append(mediaItem); } } m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } //Retrieve Video sources of any type if (engineArg.toLower() == "sources") { MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.titleBinding()); bindings.append(mediaVocabulary.videoSeriesTitleBinding()); bindings.append(mediaVocabulary.videoSeasonBinding()); bindings.append(mediaVocabulary.videoEpisodeNumberBinding()); bindings.append(mediaVocabulary.durationBinding()); bindings.append(mediaVocabulary.descriptionBinding()); bindings.append(mediaVocabulary.ratingBinding()); bindings.append(mediaVocabulary.releaseDateBinding()); bindings.append(mediaVocabulary.videoAudienceRatingBinding()); bindings.append(mediaVocabulary.artworkBinding()); bindings.append(mediaVocabulary.playCountBinding()); bindings.append(mediaVocabulary.lastPlayedBinding()); bindings.append(mediaVocabulary.relatedToBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoAudienceRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasRelatedTo(mediaVocabulary.mediaResourceBinding(), MediaQuery::Optional)); query.addLRIFilterConditions(engineFilterList, mediaVocabulary); query.endWhere(); QStringList orderByBindings; orderByBindings.append(mediaVocabulary.videoSeriesTitleBinding()); orderByBindings.append(mediaVocabulary.videoSeasonBinding()); orderByBindings.append(mediaVocabulary.videoEpisodeNumberBinding()); orderByBindings.append(mediaVocabulary.titleBinding()); query.orderBy(orderByBindings); Soprano::QueryResultIterator it = query.executeSelect(m_mainModel); //Build media list from results QHash relatedTos; while( it.next() ) { if (m_stop) { return; } QUrl url = it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri().isEmpty() ? it.binding(MediaVocabulary::mediaResourceBinding()).uri() : it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri(); Nepomuk::Resource res(url); QString type = "Video Clip"; if (res.exists()) { if (res.hasType(mediaVocabulary.typeVideoMovie())) { type = "Movie"; } if (res.hasType(mediaVocabulary.typeVideoTVShow())) { type = "TV Show"; } } MediaItem mediaItem = Utilities::mediaItemFromIterator(it, type, m_mediaListProperties.lri); if (!mediaItem.url.startsWith("nepomuk:/")) { relatedTos = Utilities::multiValueAppend(relatedTos, mediaItem.url, it.binding(mediaVocabulary.relatedToBinding()).uri().toString()); mediaItem.fields["relatedTo"] = relatedTos.value(mediaItem.url); mediaList.append(mediaItem); } } m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count()); m_mediaListProperties.type = QString("Sources"); } } //Return results emit results(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature); //Check if MediaItems in mediaList exist QList mediaItems = Utilities::mediaItemsDontExist(mediaList); if (mediaItems.count() > 0) { emit updateMediaItems(mediaItems); } else { //Get any remaining metadata if (m_nepomukInited) { for (int i = 0; i < mediaList.count(); i++) { if (m_stop) { return; } MediaItem mediaItem = Utilities::completeMediaItem(mediaList.at(i)); emit updateMediaItem(mediaItem); } } } m_requestSignature = QString(); m_subRequestSignature = QString(); } void VideoListEngine::setFilterForSources(const QString& engineFilter) { //Always return videos m_mediaListProperties.lri = QString("video://sources?%1").arg(engineFilter); } bangarang-bangarang/src/platform/listengines/videolistengine.h000066400000000000000000000031441166760560600252330ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef VIDEOLISTENGINE_H #define VIDEOLISTENGINE_H #include "nepomuklistengine.h" #include "../mediavocabulary.h" #include class MediaItem; class MediaListProperties; class ListEngineFactory; /** * This class retrieve video MediaItems from the nepomuk data store. * List Resource Identifiers handled are: * video://clips * video://tvshows?[genre] * video://seasons?[genre]||[series name] * video://episodes?[genre]||[series name]||[season] * video://movies?[genre]||[series name] * video://search?[search term] * video://sources?[genre]||[series name]||[season] */ class VideoListEngine : public NepomukListEngine { Q_OBJECT public: VideoListEngine(ListEngineFactory *parent); ~VideoListEngine(); void run(); void setFilterForSources(const QString& engineFilter); }; #endif // VIDEOLISTENGINE_H bangarang-bangarang/src/platform/mediaindexer.cpp000066400000000000000000000265601166760560600225170ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "mediaindexer.h" #include "mediaitemmodel.h" #include "utilities/utilities.h" #include "mediavocabulary.h" #include #include #include #include #include #include #include #include #include #include #include MediaIndexer::MediaIndexer(QObject * parent) : QObject(parent) { qRegisterMetaType("QProcess::ExitStatus"); m_nepomukInited = Utilities::nepomukInited(); m_state = Idle; m_percent = 0; m_writer = new KProcess(this); m_writer->setOutputChannelMode(KProcess::OnlyStdoutChannel); m_writer->setWorkingDirectory(KStandardDirs::locateLocal("data", "bangarang/", true)); connect(this, SIGNAL(startWriter(QStringList)), this, SLOT(startWriterSlot(QStringList))); connect(m_writer, SIGNAL(readyReadStandardOutput()), this, SLOT(processWriterOutput())); connect(m_writer, SIGNAL(started()), this, SIGNAL(started())); connect(m_writer, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus))); connect(m_writer, SIGNAL(error(QProcess::ProcessError)), this, SLOT(error(QProcess::ProcessError))); } MediaIndexer::~MediaIndexer() { } MediaIndexer::State MediaIndexer::state() { return m_state; } void MediaIndexer::updateInfo(const QList &mediaList) { if (m_state == Running) { return; } if (m_nepomukInited && (mediaList.count() > 0)) { QString filename = QString("bangarang/%1.jb") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); QString path = KStandardDirs::locateLocal("data", filename, true); QFile file(path); if (!file.open(QIODevice::WriteOnly)) { return; } QTextStream out(&file); out << "#Count = " << mediaList.count() << "\n"; QList urls; for (int i = 0; i < mediaList.count(); i++) { writeUpdateInfo(mediaList.at(i), out); out << "\n"; urls << mediaList.at(i).url; } out << "\n" <<"\n"; file.close(); m_mediaList = mediaList; m_urlList = urls; emit startWriter(QStringList(path)); m_status["description"] = i18n("Starting update..."); m_status["progress"] = 0; emit updateStatus(m_status); } } void MediaIndexer::updateInfo(const MediaItem &mediaItem) { QList mediaList; mediaList << mediaItem; updateInfo(mediaList); } void MediaIndexer::removeInfo(const QList &mediaList) { if (m_state == Running) { return; } if (m_nepomukInited && (mediaList.count() > 0)) { QString filename = QString("bangarang/%1.jb") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); QString path = KStandardDirs::locateLocal("data", filename, true); QFile file(path); if (!file.open(QIODevice::WriteOnly)) { return; } QTextStream out(&file); out << "#Count = " << mediaList.count() << "\n"; for (int i = 0; i < mediaList.count(); i++) { writeRemoveInfo(mediaList.at(i), out); out << "\n"; } out << "\n" <<"\n"; file.close(); emit startWriter(QStringList(path)); m_status["description"] = i18n("Starting update..."); m_status["progress"] = 0; emit updateStatus(m_status); } } void MediaIndexer::removeInfo(const MediaItem &mediaItem) { QList mediaList; mediaList << mediaItem; removeInfo(mediaList); } void MediaIndexer::updatePlaybackInfo(const QString &resourceUri, bool incrementPlayCount, const QDateTime &playDateTime) { if (m_state == Running) { return; } if (m_nepomukInited && !resourceUri.isEmpty()) { kDebug() << "Updating playback info..."; QString filename = QString("bangarang/%1.jb") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); QString path = KStandardDirs::locateLocal("data", filename, true); QFile file(path); if (!file.open(QIODevice::WriteOnly)) { return; } QTextStream out(&file); out << "[" << resourceUri << "]\n"; out << "lastPlayed = " << playDateTime.toString("yyyyMMddhhmmss") << "\n"; if (incrementPlayCount) { int playCount = 0; Nepomuk::Resource res(resourceUri); if (res.exists()) { playCount = res.property(MediaVocabulary().playCount()).toInt(); } playCount = playCount + 1; out << "playCount = " << playCount << "\n"; } out << "\n" << "\n"; emit startWriter(QStringList(path)); } } void MediaIndexer::updateRating(const QString & resourceUri, int rating) { if (m_writer->state() == QProcess::Starting || m_state == Running) { return; } if (m_nepomukInited && !resourceUri.isEmpty() && (rating >= 0) && (rating <= 10)) { QString filename = QString("bangarang/%1.jb") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); QString path = KStandardDirs::locateLocal("data", filename, true); QFile file(path); if (!file.open(QIODevice::WriteOnly)) { return; } QTextStream out(&file); out << "[" << resourceUri << "]\n"; out << "rating = " << rating << "\n"; out << "\n" << "\n"; emit startWriter(QStringList(path)); } } void MediaIndexer::updateRating(const QList &mediaList, int rating) { if (!m_nepomukInited) { return; } if (m_writer->state() == QProcess::Starting || m_state == Running) { return; } QString filename = QString("bangarang/%1.jb") .arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz")); QString path = KStandardDirs::locateLocal("data", filename, true); QFile file(path); if (!file.open(QIODevice::WriteOnly)) { return; } QTextStream out(&file); bool validUpdate = false; for (int i = 0; i < mediaList.count(); i++) { QString resourceUri = mediaList.at(i).fields["resourceUri"].toString(); if (!resourceUri.isEmpty() && (rating >= 0) && (rating <= 10)) { out << "[" << resourceUri << "]\n"; out << "rating = " << rating << "\n"; out << "\n" << "\n"; validUpdate = true; } } if (validUpdate) { emit startWriter(QStringList(path)); } } void MediaIndexer::writeRemoveInfo(MediaItem mediaItem, QTextStream &out) { out << "[" << mediaItem.fields["resourceUri"].toString() << "]\n";; out << "type = " << mediaItem.type << "\n";; if (mediaItem.type == "Audio") { out << "audioType = " << mediaItem.fields["audioType"].toString() << "\n"; } else if (mediaItem.type == "Video") { out << "videoType = " << mediaItem.fields["videoType"].toString() << "\n"; } else if (mediaItem.type == "Category") { out << "categoryType = " << mediaItem.fields["categoryType"].toString() << "\n"; } out << "url = " << mediaItem.fields["url"].toString() << "\n"; out << "removeInfo = true" << "\n"; } void MediaIndexer::writeUpdateInfo(MediaItem mediaItem, QTextStream &out) { out << "[" << mediaItem.fields["resourceUri"].toString() << "]\n";; out << "type = " << mediaItem.type << "\n";; QHashIterator i(mediaItem.fields); while (i.hasNext()) { i.next(); if (i.value().type() == QVariant::DateTime) { out << i.key() << " = " << i.value().toDateTime().toString("yyyyMMddhhmmss") << "\n"; } else if (i.value().type() == QVariant::DateTime) { out << i.key() << " = " << i.value().toDateTime().toString("yyyyMMdd") << "\n"; } else if (i.value().type() == QVariant::StringList){ out << i.key() << " = " << i.value().toStringList().join("||") << "\n"; } else { out << i.key() << " = " << i.value().toString() << "\n"; } } } void MediaIndexer::startWriterSlot(const QStringList &args) { m_writer->setProgram("bangarangnepomukwriter", args); m_writer->start(); m_state = Running; } void MediaIndexer::processWriterOutput() { m_writer->setReadChannel(QProcess::StandardOutput); while (!m_writer->atEnd() && m_writer->canReadLine()) { char buffer[1024]; qint64 lineLength = m_writer->readLine(buffer, sizeof(buffer)); if (lineLength == -1) { continue; } QString line = QUrl::fromPercentEncoding(buffer); if (line.startsWith("BangarangProgress:")) { m_percent = line.remove("BangarangProgress:").trimmed().toInt(); } else if (line.startsWith("BangarangSignal:sourceInfoUpdated:")) { QString url = line.remove("BangarangSignal:sourceInfoUpdated:").trimmed(); int index = m_urlList.indexOf(url); if (index == -1) { continue; } MediaItem mediaItem = m_mediaList.at(index); Nepomuk::Resource res(KUrl(mediaItem.url)); if (res.exists()) { mediaItem.fields["resourceUri"] = res.resourceUri().toString(); } emit sourceInfoUpdated(mediaItem); m_status["description"] = i18n("Updated: %1 - %2", mediaItem.title, mediaItem.subTitle); m_status["progress"] = m_percent; emit updateStatus(m_status); } else if (line.startsWith("BangrangSignal:urlInfoRemoved:")) { QString resourceUri = line.remove("BangrangSignal:urlInfoRemoved:").trimmed(); m_status["description"] = i18n("Removing info..."); m_status["progress"] = m_percent; emit updateStatus(m_status); emit urlInfoRemoved(resourceUri); } else if (line.startsWith("BangarangMessage:")) { QString message = line.remove("BangarangMessage:").trimmed(); m_status["description"] = message; m_status["progress"] = m_percent; emit updateStatus(m_status); } else if (line.startsWith("BangarangDebug:")) { kDebug() << line.remove("BangarangDebug:"); } } } void MediaIndexer::finished(int exitCode, QProcess::ExitStatus exitStatus) { m_status["description"] = QString(); m_status["progress"] = -1; emit updateStatus(m_status); emit finished(); m_state = Idle; emit allFinished(); Q_UNUSED(exitCode); Q_UNUSED(exitStatus); } void MediaIndexer::error(QProcess::ProcessError error) { kDebug() << error; } #include "mediaindexer.moc" bangarang-bangarang/src/platform/mediaindexer.h000066400000000000000000000116261166760560600221610ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIAINDEXER_H #define MEDIAINDEXER_H #include #include #include "mediaitemmodel.h" /** * MediaIndexer provides a way to asynchronous write to the nepomuk datastore. */ class MediaIndexer : public QObject { Q_OBJECT public: enum State {Idle = 0, Running = 1}; /** * Constructor */ MediaIndexer(QObject *parent = 0); /** *Destructor */ ~MediaIndexer(); /** * Update information in the Nepomuk datastore using the specified * mediaList. * * @param mediaList List of MediaItems containing updated information. */ void updateInfo(const QList &mediaList); /** * Update information in the Nepomuk datastore using the specified * MediaItem. * * @param mediaItem MediaItem containing updated information. */ void updateInfo(const MediaItem &mediaItem); /** * Remove media information from the Nepomuk datastore corresponding * specified medialist. * * @param mediaList List of MediaItems whose information should be * removed from the datastore. */ void removeInfo(const QList &mediaList); /** * Remove media information from the Nepomuk datastore corresponding * specified MediaItem. * * @param mediaItem MediaItem whose information should be * removed from the datastore. */ void removeInfo(const MediaItem &mediaItem); /** * Update the playback time and/or play count for the specified url. * * @param url url of media item to updateInfo * @param incrementPlayCount if true, the play count will be incremented * @param playDateTime DateTime of playback */ void updatePlaybackInfo(const QString &resourceUri, bool incrementPlayCount, const QDateTime &playDateTime); /** * Update the rating of the specified url. * * @param url Url of MediaItem * @param rating Rating: and integer between 0 and 10 */ void updateRating(const QString &resourceUri, int rating); /** * Update the rating of the specified urls. * * @param List of MediaItems whose rating should be updated * @param rating Rating: and integer between 0 and 10 */ void updateRating(const QList &mediaList, int rating); State state(); Q_SIGNALS: /** * Emitted when the update/removal has started */ void started(); /** * Emitted when the update/removal has finished */ void finished(); /** * Emitted when all update/removal tasks managed by this MediaIndexer * is finished. */ void allFinished(); /** * Emitted when media information for the url has been removed */ void urlInfoRemoved(QString url); /** * Emitted when media information for MediaItem has been updated */ void sourceInfoUpdated(MediaItem mediaItem); /** * Emitted when media information has been updated/removed. */ void updateStatus(QHash updatedStatus); void startWriter(const QStringList &args); private: bool m_nepomukInited; KProcess * m_writer; QList m_mediaList; QStringList m_urlList; State m_state; int m_percent; QHash m_status; void writeRemoveInfo(MediaItem mediaItem, QTextStream &out); void writeUpdateInfo(MediaItem mediaItem, QTextStream &out); private Q_SLOTS: void startWriterSlot(const QStringList &args); void processWriterOutput(); void finished(int exitCode, QProcess::ExitStatus exitStatus); void error(QProcess::ProcessError error); }; #endif // MEDIAINDEXER_H bangarang-bangarang/src/platform/mediaitemmodel.cpp000066400000000000000000001155051166760560600230360ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "mediaitemmodel.h" #include "listengines/listengine.h" #include "listengines/listenginefactory.h" #include "medialistcache.h" #include "utilities/utilities.h" #include #include #include #include #include MediaItemModel::MediaItemModel(QObject * parent) : QStandardItemModel(parent) { m_parent = parent; m_mediaListProperties.lri = QString(); m_filter = QString(); m_listEngineFactory = new ListEngineFactory(this); m_emitChangedAfterDrop = false; m_loadingState = false; connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(synchRemoveRows(const QModelIndex &, int, int))); m_mediaListCache = new MediaListCache(parent); m_cacheThreshold = 5000; //default to 5 second loading threshold for adding to cache m_forceRefreshFromSource = false; m_loadSources = false; m_reload = false; m_suppressNoResultsMessage = false; m_pendingUpdateRefresh = false; m_suppressTooltip = false; setSupportedDragActions(Qt::CopyAction); } MediaItemModel::~MediaItemModel() { delete m_listEngineFactory; } /*QVariant MediaItemModel::headerData (int section, Qt::Orientation orientation, int role) const { if (section == 0) { if (role == Qt::DisplayRole) { return m_mediaListProperties.name; } else if (role == Qt::TextAlignmentRole) { return Qt::AlignLeft; } else { return QVariant(); } } else if (section == 1) { if (role == Qt::DecorationRole) { return KIcon("system-run"); } else if (role == Qt::TextAlignmentRole) { return Qt::AlignRight; } else { return QVariant(); } } else { return QVariant(); } Q_UNUSED(orientation); }*/ QString MediaItemModel::dataEngine() { return m_mediaListProperties.engine(); } QString MediaItemModel::filter() { return m_mediaListProperties.engineFilter(); } MediaListProperties MediaItemModel::mediaListProperties() { return m_mediaListProperties; } void MediaItemModel::setMediaListProperties(const MediaListProperties &mediaListProperties) { if (m_mediaListProperties.lri != mediaListProperties.lri) { setLoadingState(false); } m_mediaListProperties = mediaListProperties; emit propertiesChanged(); emit mediaListPropertiesChanged(); } QList MediaItemModel::mediaList() { return m_mediaList; } MediaItem MediaItemModel::mediaItemAt(int row) { if (row < 0 || row >= m_mediaList.size()) { return MediaItem(); } return m_mediaList.at(row); } int MediaItemModel::rowOfUrl(const QString &url) { return m_urlList.indexOf(url); } int MediaItemModel::rowOfResourceUri(const QString &resourceUri) { return m_resourceUriList.indexOf(resourceUri); } void MediaItemModel::load() { if (!m_mediaListProperties.lri.isEmpty()) { if (m_mediaListCache->isInCache(m_mediaListProperties.lri) && !m_forceRefreshFromSource) { setLoadingState(true); // Load data from from the cache ListEngine * listEngine = m_listEngineFactory->availableListEngine(EngineTypeCache); MediaListProperties cacheListProperties; cacheListProperties.lri = QString("cache://dummyarg?%1").arg(m_mediaListProperties.lri); m_requestSignature = m_listEngineFactory->generateRequestSignature(); listEngine->setRequestSignature(m_requestSignature); listEngine->setMediaListProperties(cacheListProperties); listEngine->start(); kDebug() << "loading from cache for " << m_mediaListProperties.lri; } else { EngineType type = m_listEngineFactory->engineTypeFromString(m_mediaListProperties.engine()); if (m_listEngineFactory->engineExists(type)) { setLoadingState(true); m_listEngineFactory->stopAll(); ListEngine * listEngine = m_listEngineFactory->availableListEngine(type); m_requestSignature = m_listEngineFactory->generateRequestSignature(); listEngine->setRequestSignature(m_requestSignature); listEngine->setMediaListProperties(m_mediaListProperties); m_lriStartTimes.insert(m_mediaListProperties.lri, QTime::currentTime()); listEngine->start(); kDebug() << "started new load for " << m_mediaListProperties.lri; } else { showNoResultsMessage(); } m_forceRefreshFromSource = false; } } m_loadSources = false; } void MediaItemModel::loadLRI(const QString &lri) { clearMediaListData(); setMediaListProperties(MediaListProperties(lri)); load(); } void MediaItemModel::reload() { m_reload = true; if (m_loadSources) { // If the model was populated using loadSource then reload QList mediaList = m_mediaListForLoadSources; clearMediaListData(); loadSources(mediaList); } else if (!m_mediaListProperties.lri.isEmpty()) { clearMediaListData(); m_forceRefreshFromSource = true; load(); } } void MediaItemModel::loadMediaList(const QList &mediaList, bool emitMediaListChanged, bool updateExisting) { for (int i = 0 ; i < mediaList.count() ; ++i) { if (updateExisting) { int rowOfExisting = rowOfUrl(mediaList.at(i).url); if (rowOfExisting != -1) { replaceMediaItemAt(rowOfExisting, mediaList.at(i)); } else { loadMediaItem(mediaList.at(i)); } } else { loadMediaItem(mediaList.at(i)); } } if (emitMediaListChanged) { emit mediaListChanged(); } } void MediaItemModel::loadMediaItem(const MediaItem &mediaItem, bool emitMediaListChanged) { if (rowOfUrl(mediaItem.url) == -1 || mediaItem.url.isEmpty()) { m_mediaList << mediaItem; m_urlList << mediaItem.url; m_resourceUriList << mediaItem.fields["resourceUri"].toString(); appendRow(rowDataFromMediaItem(mediaItem)); if (emitMediaListChanged) { emit mediaListChanged(); } } } void MediaItemModel::categoryActivated(QModelIndex index) { MediaListProperties mediaListProperties; mediaListProperties.lri = itemFromIndex(index)->data(MediaItem::UrlRole).toString(); mediaListProperties.name = m_mediaList.at(index.row()).title; mediaListProperties.category = m_mediaList.at(index.row()); m_mediaListProperties = mediaListProperties; if (m_mediaListCache->isInCache(m_mediaListProperties.lri)) { removeRows(0, rowCount()); setLoadingState(true); // Load data from from the cache m_listEngineFactory->stopAll(); ListEngine * listEngine = m_listEngineFactory->availableListEngine(EngineTypeCache); MediaListProperties cacheListProperties; cacheListProperties.lri = QString("cache://dummyarg?%1").arg(m_mediaListProperties.lri); m_requestSignature = m_listEngineFactory->generateRequestSignature(); listEngine->setRequestSignature(m_requestSignature); listEngine->setMediaListProperties(cacheListProperties); listEngine->start(); } else { EngineType type = m_listEngineFactory->engineTypeFromString(m_mediaListProperties.engine()); if (m_listEngineFactory->engineExists(type)) { removeRows(0, rowCount()); setLoadingState(true); m_listEngineFactory->stopAll(); ListEngine * listEngine = m_listEngineFactory->availableListEngine(type); m_requestSignature = m_listEngineFactory->generateRequestSignature(); listEngine->setRequestSignature(m_requestSignature); listEngine->setMediaListProperties(m_mediaListProperties); m_lriStartTimes.insert(m_mediaListProperties.lri, QTime::currentTime()); listEngine->start(); kDebug()<< "started load for " << m_mediaListProperties.lri; } } } void MediaItemModel::actionActivated(QModelIndex index) { MediaListProperties mediaListProperties; mediaListProperties.lri = itemFromIndex(index)->data(MediaItem::UrlRole).toString(); EngineType type = m_listEngineFactory->engineTypeFromString(mediaListProperties.engine()); if (m_listEngineFactory->engineExists(type)) { m_mediaListProperties = mediaListProperties; removeRows(0, rowCount()); setLoadingState(true); m_listEngineFactory->stopAll(); ListEngine * listEngine = m_listEngineFactory->availableListEngine(type); m_requestSignature = m_listEngineFactory->generateRequestSignature(); listEngine->setRequestSignature(m_requestSignature); listEngine->setMediaListProperties(m_mediaListProperties); listEngine->activateAction(); } } void MediaItemModel::loadSources(const QList &mediaList) { if (mediaList.count() == 0) { return; } //Load data only for media sources m_subRequestMediaLists.clear(); m_subRequestSignatures.clear(); m_subRequestsDone = 0; bool onlySources = true; m_remainingCatsForLoadSources.clear(); m_requestSignature = m_listEngineFactory->generateRequestSignature(); for (int i = 0; i < mediaList.count(); ++i) { if ((mediaList.at(i).type == "Audio") || (mediaList.at(i).type == "Video") || (mediaList.at(i).type == "Image")){ if (!mediaList.at(i).url.isEmpty()) { //url of sources can't be empty loadMediaItem(mediaList.at(i)); } } else if (mediaList.at(i).type == "Category") { onlySources = false; m_remainingCatsForLoadSources.append(mediaList.at(i)); if (mediaList.count() == 1) { MediaListProperties mediaListProperties; mediaListProperties.lri = mediaList.at(i).url; mediaListProperties.name = mediaList.at(i).title; // - Get the lri for loading sources using this category item EngineType type = m_listEngineFactory->engineTypeFromString(mediaListProperties.engine()); ListEngine * listEngine = m_listEngineFactory->availableListEngine(type); listEngine->setMediaListProperties(mediaListProperties); listEngine->setFilterForSources(mediaListProperties.engineFilter()); QString loadSourcesLri = listEngine->mediaListProperties().lri; mediaListProperties.lri = loadSourcesLri; //Just directly load the sources since it's one category m_mediaListProperties = mediaListProperties; } else { //Generate signatures and media list holders for each subrequest //This must be complete for all categories before launching subrequests //to ensure full order of subrequests are available when results are returned MediaListProperties mediaListProperties; mediaListProperties.lri = mediaList.at(i).url; mediaListProperties.name = mediaList.at(i).title; EngineType type = m_listEngineFactory->engineTypeFromString(mediaListProperties.engine()); if (m_listEngineFactory->engineExists(type)) { QString subRequestSignature = m_listEngineFactory->generateRequestSignature(); m_subRequestSignatures.append(subRequestSignature); QList emptyList; m_subRequestMediaLists.append(emptyList); } } } } if (onlySources) { if (rowCount() == 0 && !m_suppressNoResultsMessage) { showNoResultsMessage(); } emit mediaListChanged(); } else if (!m_remainingCatsForLoadSources.isEmpty()){ //Launch load request(s) m_listEngineFactory->stopAll(); int maxSimultaneous = 1; //Limit threads to one. May increase later if stability is better. setLoadingState(true); for (int i = 0; i < maxSimultaneous; i++) { loadSourcesForNextCat(); } } m_loadSources = true; m_mediaListForLoadSources = mediaList; } void MediaItemModel::loadSourcesForNextCat() { if (!m_remainingCatsForLoadSources.isEmpty()) { int subRequestSignatureIndex = m_subRequestSignatures.count() - m_remainingCatsForLoadSources.count(); if (subRequestSignatureIndex < 0) { QString subRequestSignature = m_listEngineFactory->generateRequestSignature(); m_subRequestSignatures.append(subRequestSignature); QList emptyList; m_subRequestMediaLists.append(emptyList); subRequestSignatureIndex = 0; } MediaItem category = m_remainingCatsForLoadSources.takeFirst(); MediaListProperties mediaListProperties; mediaListProperties.lri = category.url; mediaListProperties.name = category.title; EngineType type = m_listEngineFactory->engineTypeFromString(m_mediaListProperties.engine()); if (m_listEngineFactory->engineExists(type)) { ListEngine * listEngine = m_listEngineFactory->availableListEngine(type); listEngine->setMediaListProperties(mediaListProperties); listEngine->setFilterForSources(mediaListProperties.engineFilter()); QString loadSourcesLri = listEngine->mediaListProperties().lri; if (m_mediaListCache->isInCache(loadSourcesLri)) { // Load data from from the cache listEngine = m_listEngineFactory->availableListEngine(EngineTypeCache); MediaListProperties cacheListProperties; cacheListProperties.lri = QString("cache://dummyarg?%1").arg(loadSourcesLri); m_requestSignature = m_listEngineFactory->generateRequestSignature(); listEngine->setRequestSignature(m_requestSignature); if (m_subRequestSignatures.count() > 0) { listEngine->setSubRequestSignature(m_subRequestSignatures.at(subRequestSignatureIndex)); } listEngine->setMediaListProperties(cacheListProperties); listEngine->start(); } else { listEngine->setRequestSignature(m_requestSignature); if (m_subRequestSignatures.count() > 0) { listEngine->setSubRequestSignature(m_subRequestSignatures.at(subRequestSignatureIndex)); } m_lriStartTimes.insert(loadSourcesLri, QTime::currentTime()); listEngine->start(); kDebug()<< "started load for " << loadSourcesLri; } } } } void MediaItemModel::addResults(QString requestSignature, QList mediaList, MediaListProperties mediaListProperties, bool done, QString subRequestSignature) { //Check request signature of results and ignore results with a different signature if (done) kDebug() << "results returned for " << mediaListProperties.lri; if ((mediaListProperties.lri == m_mediaListProperties.lri) || (requestSignature == m_requestSignature)) { if (m_subRequestSignatures.count() == 0) { hideLoadingMessage(); loadMediaList(mediaList, false, true); m_mediaListProperties = mediaListProperties; emit mediaListPropertiesChanged(); if (done) { m_listEngineFactory->resumeAll(); if (rowCount() == 0 && !m_suppressNoResultsMessage) { showNoResultsMessage(); } m_reload = false; m_lriIsLoadable = true; setLoadingState(false); emit mediaListChanged(); } } else { loadSourcesForNextCat(); //Place subrequest results in the correct order int indexOfSubRequest = m_subRequestSignatures.indexOf(subRequestSignature); if (indexOfSubRequest != -1) { //Determine index of subrequest not loaded so far int indexOfFirstEmpty = -1; for (int i = 0; i < m_subRequestMediaLists.count(); i++) { if (m_subRequestMediaLists.at(i).isEmpty()) { indexOfFirstEmpty = i; break; } } //Store subrequest results QList srMediaList = m_subRequestMediaLists.at(indexOfSubRequest); srMediaList.append(mediaList); m_subRequestMediaLists.replace(indexOfSubRequest, srMediaList); if (done) { m_subRequestsDone = m_subRequestsDone + 1; if (m_subRequestsDone == m_subRequestSignatures.count()) { m_listEngineFactory->resumeAll(); setLoadingState(false); //All the subrequests results are in, go ahead and load results in correct order int count = 0; for (int i = 0; i < m_subRequestMediaLists.count(); ++i) { count += m_subRequestMediaLists.at(i).count(); if (i < indexOfFirstEmpty) { continue; } loadMediaList(m_subRequestMediaLists.at(i), false, true); } if (rowCount() == 0 && !m_suppressNoResultsMessage) { showNoResultsMessage(); } //Need a basic lri so updateInfo and removeInfo can be performed by a list engine m_mediaListProperties.lri = mediaListProperties.engine(); if (!m_reload && !m_mediaListProperties.name.contains(i18n("Multiple"))) { m_mediaListProperties.name = i18n("Multiple %1", m_mediaListProperties.name); } m_mediaListProperties.summary = i18np("1 item", "%1 items", count); m_subRequestMediaLists.clear(); m_subRequestSignatures.clear(); m_subRequestsDone = 0; m_reload = false; m_lriIsLoadable = false; emit mediaListChanged(); } else if (indexOfSubRequest == indexOfFirstEmpty) { int count = 0; for (int i = 0; i < m_subRequestMediaLists.count(); i++) { count += m_subRequestMediaLists.at(i).count(); if (i < indexOfFirstEmpty) { continue; } if (m_subRequestMediaLists.at(i).count() > 0) { hideLoadingMessage(); loadMediaList(m_subRequestMediaLists.at(i), false, true); if (!m_reload && !m_mediaListProperties.name.contains(i18n("Multiple"))) { m_mediaListProperties.name = i18n("Multiple %1", m_mediaListProperties.name); } m_mediaListProperties.summary = i18np("1 item", "%1 items", count); emit mediaListPropertiesChanged(); } else { break; } } } } } } } //Cache results if they took long enough to return if (done && m_lriStartTimes.contains(mediaListProperties.lri)) { int elapsedMSecs = m_lriStartTimes.value(mediaListProperties.lri).msecsTo(QTime::currentTime()); if (elapsedMSecs > m_cacheThreshold) { m_mediaListCache->addMediaList(mediaListProperties, m_mediaList); m_lriStartTimes.remove(mediaListProperties.lri); } } } void MediaItemModel::updateMediaItems(QList mediaList) { for (int i = 0; i < mediaList.count(); i++) { MediaItem mediaItem = mediaList.at(i); updateMediaItem(mediaItem); } } void MediaItemModel::updateArtwork(QImage artworkImage, MediaItem mediaItem) { int row = rowOfUrl(mediaItem.url); if (row != -1) { MediaItem updatedMediaItem = mediaItemAt(row); updatedMediaItem.artwork = QIcon(QPixmap::fromImage(artworkImage)); updatedMediaItem.hasCustomArtwork = mediaItem.hasCustomArtwork; replaceMediaItemAt(row, updatedMediaItem); } } void MediaItemModel::updateMediaItem(MediaItem mediaItem) { int row = rowOfUrl(mediaItem.url); if (row != -1) { replaceMediaItemAt(row, mediaItem); } else { if (mediaItem.fields["sourceLri"].toString() == m_mediaListProperties.lri) { m_pendingUpdateRefresh = true; } } } void MediaItemModel::updateMediaListPropertiesCategoryArtwork(QImage artworkImage, MediaItem mediaItem) { if (m_mediaListProperties.category.url == mediaItem.url) { m_mediaListProperties.category.artwork = QIcon(QPixmap::fromImage(artworkImage)); emit mediaListPropertiesChanged(); } } void MediaItemModel::removeMediaItem(QString url) { int row = rowOfUrl(url); if (row != -1) { removeMediaItemAt(row, true); if (rowCount() == 0) { showNoResultsMessage(); } } } void MediaItemModel::removeMediaItemByResource(QString resourceUri) { int row = rowOfResourceUri(resourceUri); if (row != -1) { removeMediaItemAt(row, true); if (rowCount() == 0) { showNoResultsMessage(); } } } void MediaItemModel::clearMediaListData(bool emitMediaListChanged) { disconnect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(synchRemoveRows(const QModelIndex &, int, int))); m_listEngineFactory->stopAll(); removeRows(0, rowCount()); m_mediaList.clear(); m_urlList.clear(); m_resourceUriList.clear(); connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(synchRemoveRows(const QModelIndex &, int, int))); m_loadSources = false; m_mediaListForLoadSources.clear(); if (emitMediaListChanged) { emit mediaListChanged(); } } void MediaItemModel::removeMediaItemAt(int row, bool emitMediaListChanged) { if (row < rowCount()) { disconnect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(synchRemoveRows(const QModelIndex &, int, int))); removeRows(row, 1); m_urlList.removeAt(row); m_resourceUriList.removeAt(row); m_mediaList.removeAt(row); connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(synchRemoveRows(const QModelIndex &, int, int))); } if (emitMediaListChanged) { emit mediaListChanged(); } } void MediaItemModel::replaceMediaItemAt(int row, const MediaItem &mediaItem, bool emitMediaListChanged) { m_mediaList.replace(row, mediaItem); m_urlList.replace(row, mediaItem.url); m_resourceUriList.replace(row, mediaItem.fields["resourceUri"].toString()); QList rowData = rowDataFromMediaItem(mediaItem); for (int i = 0; i < rowData.count(); i++) { setItem(row, i, rowData.at(i)); } if (emitMediaListChanged) { emit mediaListChanged(); } } void MediaItemModel::insertMediaItemAt(int row, const MediaItem &mediaItem, bool emitMediaListChanged) { int existingRow = rowOfUrl(mediaItem.url); if (existingRow == row) { replaceMediaItemAt(row, mediaItem, emitMediaListChanged); return; } m_mediaList.insert(row, mediaItem); m_urlList.insert(row, mediaItem.url); m_resourceUriList.insert(row, mediaItem.fields["resourceUri"].toString()); QList rowData = rowDataFromMediaItem(mediaItem); insertRow(row, rowData); if (existingRow != -1) { if (row <= existingRow) { existingRow++; } removeMediaItemAt(existingRow, false); } if (emitMediaListChanged) { emit mediaListChanged(); } } void MediaItemModel::synchRemoveRows(const QModelIndex &index, int start, int end) { for (int i = start; i <= end; ++i) { m_mediaList.removeAt(start); m_urlList.removeAt(start); m_resourceUriList.removeAt(start); } if (m_emitChangedAfterDrop) { emit mediaListChanged(); m_emitChangedAfterDrop = false; } Q_UNUSED(index); } void MediaItemModel::setLoadingState(bool state) { bool stateChanged = (m_loadingState != state); m_loadingState = state; if (m_loadingState) { showLoadingMessage(); emit loading(); } else { hideLoadingMessage(); } if (stateChanged) { emit loadingStateChanged(m_loadingState); } } bool MediaItemModel::isLoading() { return m_loadingState; } void MediaItemModel::showLoadingMessage() { if (m_loadingState ) { MediaItem loadingMessage; m_loadingProgress += 1; if ((m_loadingProgress > 7) || (m_loadingProgress < 0)) { m_loadingProgress = 0; } QString iconName = QString("bangarang-loading-%1").arg(m_loadingProgress); loadingMessage.artwork = KIcon(iconName); loadingMessage.title = i18n("Loading..."); loadingMessage.type = "Message"; loadingMessage.fields["messageType"] = "Loading"; if (rowCount() == 0) { loadMediaItem(loadingMessage, false); } else if (m_mediaList.at(0).type == "Message" && m_mediaList.at(0).fields["messageType"].toString() == "Loading") { replaceMediaItemAt(0, loadingMessage, false); } QTimer::singleShot(100, this, SLOT(showLoadingMessage())); } } void MediaItemModel::hideLoadingMessage() { int row = -1; for (int i = 0; i < m_mediaList.count(); ++i) { if ((m_mediaList.at(i).fields["messageType"].toString() == "Loading") && (m_mediaList.at(i).type == "Message")) { row = i; break; } } if (row != -1) { if (m_mediaList.count() > 0) { removeMediaItemAt(row, false); } } } void MediaItemModel::showNoResultsMessage() { MediaItem loadingMessage; loadingMessage.title = i18n("No results"); loadingMessage.type = "Message"; loadingMessage.fields["messageType"] = "No Results"; loadMediaItem(loadingMessage, false); } void MediaItemModel::updateStatus(QHash updatedStatus) { m_status = updatedStatus; emit statusUpdated(); } void MediaItemModel::setSuppressTooltip(bool suppress) { m_suppressTooltip = suppress; } QList MediaItemModel::rowDataFromMediaItem(MediaItem mediaItem) { QList rowData; QStandardItem * titleItem = new QStandardItem(mediaItem.artwork, mediaItem.title); titleItem->setData(mediaItem.subTitle, MediaItem::SubTitleRole); titleItem->setData(mediaItem.url, MediaItem::UrlRole); titleItem->setData(mediaItem.type, MediaItem::TypeRole); titleItem->setData(mediaItem.duration, MediaItem::DurationRole); titleItem->setData(mediaItem.playlistIndex, MediaItem::PlaylistIndexRole); titleItem->setData(mediaItem.nowPlaying, MediaItem::NowPlayingRole); titleItem->setData(mediaItem.isSavedList, MediaItem::IsSavedListRole); titleItem->setData(mediaItem.exists, MediaItem::ExistsRole); titleItem->setData(mediaItem.hasCustomArtwork, MediaItem::HasCustomArtworkRole); titleItem->setData(mediaItem.semanticComment, MediaItem::SemanticCommentRole); if (!m_suppressTooltip) { QString tooltip = QString("%1").arg(mediaItem.title); if (!mediaItem.subTitle.isEmpty()) { tooltip.append((QString("
%2").arg(mediaItem.subTitle))); } if (!mediaItem.fields["description"].toString().isEmpty()) { QString description = mediaItem.fields["description"].toString(); if (description.length() > 300) { description.chop(300); description = description + QString("..."); } tooltip.append(QString("
%1").arg(description)); } if (!mediaItem.semanticComment.isEmpty()) { tooltip.append(QString("
%1").arg(mediaItem.semanticComment)); } titleItem->setData(tooltip, Qt::ToolTipRole); } if (!mediaItem.fields["rating"].isNull()) { titleItem->setData(mediaItem.fields["rating"].toInt(), MediaItem::RatingRole); } if (!mediaItem.fields["playCount"].isNull()) { titleItem->setData(mediaItem.fields["playCount"].toInt(), MediaItem::PlayCountRole); } if (!mediaItem.fields["lastPlayed"].isNull()) { titleItem->setData(mediaItem.fields["lastPlayed"].toDateTime(), MediaItem::LastPlayedRole); } if (mediaItem.type == "Category") { titleItem->setData(mediaItem.fields["categoryType"].toString(), MediaItem::SubTypeRole); } rowData << titleItem; return rowData; } Qt::DropActions MediaItemModel::supportedDropActions() const { return Qt::MoveAction | Qt::CopyAction; } Qt::ItemFlags MediaItemModel::flags(const QModelIndex &index) const { Qt::ItemFlags useFlags = Qt::ItemIsSelectable | Qt::ItemIsEnabled; QString type = data(index, MediaItem::TypeRole).toString(); if (index.isValid()) { useFlags |= Qt::ItemIsDropEnabled; if (Utilities::isMedia(type)) { useFlags |= Qt::ItemIsDragEnabled; } } else { useFlags |= Qt::ItemIsDropEnabled; } return useFlags; } QStringList MediaItemModel::mimeTypes() const { QStringList types; types << "text/uri-list" << "text/plain"; return types; } QMimeData *MediaItemModel::mimeData(const QModelIndexList &indexes) const { QMimeData *mimeData = new QMimeData(); QList urls; QString indexList; foreach (QModelIndex index, indexes) { if (index.isValid() && index.column() != 1) { QUrl url = QUrl(data(index, MediaItem::UrlRole).toString()); urls << url; indexList += QString("BangarangRow:%1,").arg(index.row()); } } mimeData->setUrls(urls); mimeData->setText(indexList); return mimeData; } bool MediaItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { if (action == Qt::IgnoreAction) return true; if (!data->hasFormat("text/uri-list")) return false; if (column > 0) return false; int beginRow; if (row != -1) { beginRow = row; } else if (parent.isValid()) { beginRow = parent.row(); } else { beginRow = rowCount(QModelIndex()); } QList urls = data->urls(); bool internalMove = false; QStringList rowsToMove; if (data->text().startsWith("BangarangRow:")) { rowsToMove = data->text().split(",", QString::SkipEmptyParts); internalMove = true; } //insert rows into model QList mediaItemsInserted; int insertionRow = beginRow; for (int i = 0; i < urls.count(); i++) { if (internalMove) { QString rowEntry = rowsToMove.at(i); int rowToMove = rowEntry.remove("BangarangRow:").toInt(); MediaItem mediaItem = mediaItemAt(rowToMove); mediaItemsInserted << mediaItem; QList rowItems = rowDataFromMediaItem(mediaItem); insertRow(insertionRow, rowItems); insertionRow = insertionRow + 1; } else { QString url = urls.at(i).toEncoded(); if (Utilities::isAudio(url) || Utilities::isVideo(url)) { MediaItem mediaItem = Utilities::mediaItemFromUrl(KUrl(url)); mediaItemsInserted << mediaItem; QList rowItems = rowDataFromMediaItem(mediaItem); insertRow(insertionRow, rowItems); insertionRow = insertionRow + 1; } else if (Utilities::isFSDirectory(url)) { MediaItem mediaItem = Utilities::mediaItemFromUrl(KUrl(url)); if (mediaItem.type == "Category") { QList mediaList; mediaList.append(mediaItem); loadSources(mediaList); // no insertion - always add to end. } } } } //Update cached data to reflect inserted rows insertionRow = beginRow; for (int i = 0; i < mediaItemsInserted.count(); i++) { MediaItem mediaItem = mediaItemsInserted.at(i); m_mediaList.insert(insertionRow, mediaItem); m_urlList.insert(insertionRow, mediaItem.url); m_resourceUriList.insert(insertionRow, mediaItem.fields["resourceUri"].toString()); insertionRow = insertionRow + 1; } if (internalMove) { m_emitChangedAfterDrop = true; } else { emit mediaListChanged(); } return true; } void MediaItemModel::removeSourceInfo(const QList &mediaList) { //Group items in list by list engine type of MediaItem sourceLris QHash > typeLists; for (int i = 0; i < mediaList.count(); i++) { MediaListProperties properties(mediaList.at(i).fields["sourceLri"].toString()); EngineType currentType = m_listEngineFactory->engineTypeFromString(properties.engine()); if (currentType == EngineTypeUnknown) { currentType = m_listEngineFactory->engineTypeFromString(m_mediaListProperties.engine()); } if (currentType != EngineTypeUnknown) { QList typeList = typeLists.value(currentType); typeList.append(mediaList.at(i)); typeLists.insert(currentType, typeList); } } //Remove info using appropriate list engine type QList types = typeLists.keys(); for (int i = 0; i < types.count(); i++) { EngineType type = types.at(i); QList list = typeLists.value(type); if (m_listEngineFactory->engineExists(type)) { ListEngine * listEngine = m_listEngineFactory->availableListEngine(type); listEngine->removeSourceInfo(mediaList); } } } void MediaItemModel::updateSourceInfo(const QList &mediaList, bool nepomukOnly) { //Group items in list by list engine type of MediaItem sourceLris QHash > typeLists; for (int i = 0; i < mediaList.count(); i++) { MediaListProperties properties(mediaList.at(i).fields["sourceLri"].toString()); EngineType currentType = m_listEngineFactory->engineTypeFromString(properties.engine()); if (currentType == EngineTypeUnknown) { currentType = m_listEngineFactory->engineTypeFromString(m_mediaListProperties.engine()); } if (currentType != EngineTypeUnknown) { QList typeList = typeLists.value(currentType); typeList.append(mediaList.at(i)); typeLists.insert(currentType, typeList); } } //Update info using appropriate list engine type QList types = typeLists.keys(); for (int i = 0; i < types.count(); i++) { EngineType type = types.at(i); QList list = typeLists.value(type); if (m_listEngineFactory->engineExists(type)) { ListEngine * listEngine = m_listEngineFactory->availableListEngine(type); listEngine->updateSourceInfo(mediaList, nepomukOnly); } } //Always update model info in case list engine is unable to update source of media items //Note that if the list engine doesn't update source of information then data in model will //only last until data is reloaded. updateMediaItems(mediaList); } void MediaItemModel::setCacheThreshold(int msec) { m_cacheThreshold = msec; } int MediaItemModel::cacheThreshold() { return m_cacheThreshold; } void MediaItemModel::setMediaListCache(MediaListCache * mediaListCache) { m_mediaListCache = mediaListCache; } MediaListCache * MediaItemModel::mediaListCache() { return m_mediaListCache; } bool MediaItemModel::lriIsLoadable() { return m_lriIsLoadable; } void MediaItemModel::setSuppressNoResultsMessage(bool suppress) { m_suppressNoResultsMessage = suppress; } QHash MediaItemModel::status() { return m_status; } void MediaItemModel::updateRefresh() { if (m_pendingUpdateRefresh) { m_pendingUpdateRefresh = false; reload(); } } bool MediaItemModel::containsPlayable() { if (rowCount() < 1) return false; MediaItem item = mediaItemAt(0); return ( Utilities::isMedia(item.type) || Utilities::isCategory(item.type) || Utilities::isFeed(item.fields["categoryType"].toString()) ); } MediaSortFilterProxyModel::MediaSortFilterProxyModel(QObject* parent) : QSortFilterProxyModel(parent) { setFilterCaseSensitivity(Qt::CaseInsensitive); } bool MediaSortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { MediaItemModel *model = (MediaItemModel *) sourceModel(); QModelIndex index = model->index(sourceRow, 0, sourceParent); QList search; QString data = model->data(index, Qt::DisplayRole).toString(); QVariant type_variant = model->data(index, MediaItem::TypeRole); if ( type_variant.isValid() ) { QString type = type_variant.toString(); bool isCat = Utilities::isCategory( type ); if ( !Utilities::isMedia( type ) && !isCat ) return true; if ( isCat && data == "Indexer" ) return true; if ( Utilities::isMessage( type ) ) return true; } QStringList pat = filterRegExp().pattern().split(" ", QString::SkipEmptyParts); Qt::CaseSensitivity case_sen = filterRegExp().caseSensitivity(); if (model->data(index, MediaItem::SubTitleRole).isValid()) data += " " + model->data(index, MediaItem::SubTitleRole).toString(); foreach (QString str, pat) { search << QRegExp(str, case_sen); } foreach(QRegExp reg, search) { if (!data.contains(reg)) return false; } return true; }; bangarang-bangarang/src/platform/mediaitemmodel.h000066400000000000000000000743471166760560600225130ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIAITEMMODEL_H #define MEDIAITEMMODEL_H /** @file * This file contains the definition of the MediaItem, MediaListProperties * and MediaItemModel and MediaSortFilterProxyModel. * * @author Andrew Lake */ #include #include #include #include #include #include class MusicListEngine; class FileListEngine; class ListEngineFactory; class MediaListCache; /** * MediaItem is a simple object that can represent any playable * item of media (audio clip, music, video clip, movie, etc.). * MediaItem can also refer to a collection of MediaItems (Artist, * Album, Genre, Movies, TV series, etc.) or an action or a * message. * Multiple MediaItems, a media list, are generally handled with * QList< MediaItem >. */ class MediaItem { public: enum MediaItemRole { UrlRole = Qt::UserRole + 1, /** QStandardItem role containing MediaItem url.*/ SubTitleRole = Qt::UserRole + 2, /** QStandardItem role containing MediaItem sub title.*/ SemanticCommentRole = Qt::UserRole + 3, /** QStandardItem role containing MediaItem sub title.*/ DurationRole = Qt::UserRole + 4, /** QStandardItem role containing MediaItem duration.*/ RatingRole = Qt::UserRole + 5, /** QStandardItem role containing MediaItem rating.*/ PlayCountRole = Qt::UserRole + 6, /** QStandardItem role containing MediaItem play count.*/ LastPlayedRole = Qt::UserRole + 7, /** QStandardItem role containing MediaItem last played time.*/ TypeRole = Qt::UserRole + 8, /** QStandardItem role containing MediaItem type.*/ SubTypeRole = Qt::UserRole + 9, /** QStandardItem role containing MediaItem type.*/ FilterRole = Qt::UserRole + 10, /** QStandardItem role containing MediaItem filter.*/ PlaylistIndexRole = Qt::UserRole + 11, /** QStandardItem role containing Playlist *index of MediaItem.*/ NowPlayingRole = Qt::UserRole + 12, IsSavedListRole = Qt::UserRole + 13, /** QStandardItem role containing whether *or not the media list represented by the *MediaItem is a saved list.*/ ExistsRole = Qt::UserRole + 14, /** QStandardItem role containing whether or *the file the MediaItem.url refers to exists.*/ HasCustomArtworkRole = Qt::UserRole + 15}; /** QStandardItem role containing whether * not artwork is custom(true) or default(false).*/ QString url; /** Url of MediaItem. The may be a standard url representing a * location of a media resource or a List Resource Identifier (lri).*/ QIcon artwork; /** Icon containing artwork representing MediaItem.*/ QString title; /** Title of the Media Item. */ QString subTitle; /** Subtitle of the Media Item. */ QString semanticComment; /** Comment containing info like play count, lastplayed, etc. */ QString duration; /** Displayed representation of duration of the Media Item. */ QString type; /** Type of the Media Item. * "Audio" - MediaItem is a playable audio resource. * "Video" - MediaItem is a playable video resource. * "Category" - MediaItem is a category which refers to other * MediaItems. The url for this type of MediaItem * is an lri that a MediaItemModel can use to * load a list of MediaItems * "Action" - MediaItem is an action. A MediaItemModel can use this * to load a list of MediaItems by means other than * an just an lri. e.g. Open a dialog, etc. * "Message" - MediaItem is a message. A MediaItemModel can use this * to display messages in associated views. * e.g. "Loading...", "No results", etc. * */ QString filter; int playlistIndex; /** Row of Playlist::playListModel() that contains this MediaItem.*/ bool nowPlaying; bool isSavedList; /** If the MediaItem.url is an lri, this bool is true if the lri * refers to a saved media list, otherwise is false.*/ bool exists; /** If the MediaItem.url point to a playable media resource, this * bool is true if the playable media resource exists, otherwise is false. * On DVDs or CDs this value depends on whether the DVD/CD is inserted or not.*/ bool hasCustomArtwork; /** If the artwork property is a default icon this bool is false, * otherwise if artwork property has custom artwork this bool is * true. */ QHash fields; /** Collection of all key, value pairs containing * the metadata fields associated with this MediaItem. * key - A string containing the field name. * value - A variant conatining the value of the field.*/ void addContext(const QString title, const QString lri) { QStringList contextTitles = fields["contextTitles"].toStringList(); QStringList contextLRIs = fields["contextLRIs"].toStringList(); contextTitles.append(title); contextLRIs.append(lri); fields["contextTitles"] = contextTitles; fields["contextLRIs"] = contextLRIs; } void clearContexts() { fields["contextTitles"] = QStringList(); fields["contextLRIs"] = QStringList(); } const QString subType() const { if (type == "Audio") { return fields["audioType"].toString(); } else if (type == "Video"){ return fields["videoType"].toString(); } else { return fields["categoryType"].toString(); } } MediaItem() : nowPlaying(false), isSavedList(false), exists(true), hasCustomArtwork(false) {} }; Q_DECLARE_METATYPE(MediaItem) /** * MediaListProperties contains the properties associated with a list of * MediaItems. */ class MediaListProperties { public: MediaListProperties(QString startingLri = QString()) { lri = startingLri; filterOperators << "!=" << ">=" << "<=" << "=" << ">" << "<" << ".contains."; } ~MediaListProperties(){} QString name; /** Name of media list */ QString summary; /** Summary text describing the number of items in the media list */ QString lri; /** List Resource Identifier associated with media list. This string * is the essentially how the media list is retrieved. */ MediaItem category; /** Category mediaItem associated with the media list. This is * the category mediaItem that was categoryActivated. */ /** * Returns the engine portion of the lri string. */ QString engine() { int idxOfSlashes = lri.indexOf("://"); if (idxOfSlashes != -1) { return lri.left(idxOfSlashes + 3); } else { return QString(); } } /** * Returns the engine argument portion of the lri string. */ QString engineArg() { int endOfArg = (lri.indexOf("?") != -1) ? lri.indexOf("?") - 1: lri.size() - 1; int idxOfSlashes = lri.indexOf("://"); if ((idxOfSlashes != -1) && (idxOfSlashes != lri.size() - 3)) { //return lri.mid(lri.indexOf("://") + 3, lri.size() - endOfArg + 1); return lri.mid(idxOfSlashes + 3, endOfArg - (lri.indexOf("://") + 2)); } else { return QString(); } } /** * Returns the engine filter portion of the lri string. */ QString engineFilter() { int idxOfArgSep = lri.indexOf("?"); if ((lri.indexOf("://") != -1) && (idxOfArgSep != -1) && (idxOfArgSep != lri.size() - 1)){ return lri.right(lri.size() - (idxOfArgSep + 1)); } else { return QString(); } } /** * Returns a parsed list of filters from the enginefilter portion * of the lri string **/ QStringList engineFilterList() { QStringList lriFilterList; QString filter = engineFilter(); if (!filter.isNull()) { QStringList argList = filter.split("||"); for (int i = 0; i < argList.count(); i++) { lriFilterList << argList.at(i); } } return lriFilterList; } /** * Returns field name of specified filter **/ QString filterField(const QString &filter) { QString field; for (int j = 0; j < filterOperators.count(); j ++) { QString oper = filterOperators.at(j); if (filter.indexOf(oper) != -1) { field = filter.left(filter.indexOf(oper)).trimmed(); break; } } return field; } /** * Returns operator of specified filter **/ QString filterOperator(const QString &filter) { QString oper; for (int j = 0; j < filterOperators.count(); j ++) { oper = filterOperators.at(j); if (filter.indexOf(oper) != -1) { break; } } return oper; } /** * Returns value of specified filter **/ QString filterValue(const QString &filter) { QString value; for (int j = 0; j < filterOperators.count(); j ++) { QString oper = filterOperators.at(j); if (filter.indexOf(oper) != -1) { value = filter.mid(filter.indexOf(oper) + oper.length()).trimmed(); break; } } return value; } /** * Returns first value of specified field in filter */ QString filterFieldValue(const QString &field) { QString value; QStringList filterList = engineFilterList(); for (int i = 0; i < filterList.count(); i++) { if (filterField(filterList.at(i)) == field) { value = filterValue(filterList.at(i)); break; } } return value; } /** * Returns first filter corresponding to specified field */ QString filterForField(const QString &field) { QString filter; QStringList filterList = engineFilterList(); for (int i = 0; i < filterList.count(); i++) { if (filterField(filterList.at(i)) == field) { filter = filterList.at(i); break; } } return filter; } QStringList filterOperators; QString type; /** The type of media list. * "Categories" - a list of MediaItems that are categories. * "Sources" - a list of MediaItems that are playable media * resources (files, streams, etc.). */ }; Q_DECLARE_METATYPE(MediaListProperties) class MediaList : QList{}; /** * MediaItemModel contains information for a list of MediaItems * repesented in the form of a model. * It provides facilities for loading a list of MediaItems from a * variety of sources as well as adding, updating or removing * information associated with any MediaItem it contains. * A subclass of QStandardItemModel, MediaItemModel may be used * with a view to visually respresent the information it contains. */ class MediaItemModel : public QStandardItemModel { Q_OBJECT public: /** * Default constructor. */ MediaItemModel(QObject * parent); /** * Default destructor */ ~MediaItemModel(); /** * Clears all information contained in the model. * This includes MediaListProperties which a call to removeRows() * will not clear. * * @param emitMediaListChanged set true to emit the mediaListChanged() * signal after clearing data. Default is * false. */ void clearMediaListData(bool emitMediaListChanged = false); /** * Returns the threshold, in milliseconds, used to cache data loaded by * by the model. * */ int cacheThreshold(); /** * Handler for data that is dropped onto a view associated with the * mdel. */ bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); /** * Flags for items dragged from a view associated with the model. */ Qt::ItemFlags flags(const QModelIndex &index) const; /** * Insert MediaItem at the specified row in the model with the one * provided. * * @param row row of model * @param mediaItem MediaItem to replace with * @param emitMediaListChanged emits mediaListChanged() signal if true, * otherwise don't emit mediaListChanged(). * */ void insertMediaItemAt(int row, const MediaItem &mediaItem, bool emitMediaListChanged = false); /** * Loads list of MediaItems as specified by the MediaListProperties.lri * * Note: Loading is asynchronous. Use mediaListChanged() signal to detect * when loading is complete. */ void load(); /** * Returns loading state. * */ bool isLoading(); /** * Loads list of MediaItems as specified by the provided lri * * Note: Loading is asynchronous. Use mediaListChanged() signal to detect * when loading is complete. This method will clear existing data. */ void loadLRI(const QString &lri); /** * Loads a list of MediaItems directly into the model * * @param mediaList list of MediaItems to load * * Note: After using this method, MediaListProperties returned by * mediaListProperties() is likely stale. * MediaListProperties.lri should either be updated to correspond * to mediaList or set to QString(). */ void loadMediaList(const QList &mediaList, bool emitMediaListChanged = false, bool updateExisting = false); /** * Loads a MediaItem directly into the model * * @param mediaItem MediaItem to load * * Note: After using this method, MediaListProperties returned by * mediaListProperties() is likely stale. * MediaListProperties.lri should either be updated to correspond * to mediaList or set to QString(). */ void loadMediaItem(const MediaItem &mediaItem, bool emitMediaListChanged = false); /** * Loads playable MediaItems into the model. * * @param mediaList mediaList containing MediaItems to load. * If mediaList contains "Category" type MediaItems * then the playable MediaItems associated with that * category (as specified by the lri in MediaItem.url) * will be loaded. * If the mediaList contains playable MediaItems * (type = "Audio" or "Video") then they will be directly * loaded into the model. */ void loadSources(const QList &mediaList); /** * Returns true if lri is loadable **/ bool lriIsLoadable(); /** * Returns the MediaItem associated with the specified row in the model. */ MediaItem mediaItemAt(int row); /** * Returns the list of MediaItems contained in the model. */ QList mediaList(); /** * Returns a pointer to the MediaListCache used by the model. * This is useful for sharing a common cache between different * models. */ MediaListCache * mediaListCache(); /** * Returns the MediaListProperties associated with the media list * contained in the model */ MediaListProperties mediaListProperties(); /** * Returns the QMimeData associated with a list of model indexes */ QMimeData *mimeData(const QModelIndexList &indexes) const; /** * Returns a list of mimetypes associated with items in the model */ QStringList mimeTypes() const; /** * Remove MediaItem at the specified row of the model * * @param row row of model * @param emitMediaListChanged emits mediaListChanged() signal if true, * otherwise don't emit mediaListChanged(). */ void removeMediaItemAt(int row, bool emitMediaListChanged = false); /** * Remove information associated with MediaItems in mediaList from * the source from which the model retrieved the MediaItems. * * @param mediaList list containing the MediaItems whose information * should be removed from the source. * * Note: mediaList does not have to contain the same MediaItems contained * in the model. However, the current model MediaListProperties * should refer to an lri whose ListEngine is capable of removing * information from the source. As a general rule, if the lri * can be used to retrieve the MediaItem, its ListEngine can * remove information for the MediaItem. */ void removeSourceInfo(const QList &mediaList); /** * Replace MediaItem at the specified row in the model with the one * provided. * * @param row row of model * @param mediaItem MediaItem to replace with * @param emitMediaListChanged emits mediaListChanged() signal if true, * otherwise don't emit mediaListChanged(). * */ void replaceMediaItemAt(int row, const MediaItem &mediaItem, bool emitMediaListChanged = false); /** * Return the row of a MediaItem whose url matches the one provided * * @param url url to match * * @return row of model */ int rowOfUrl(const QString &url); /** * Return the row of a MediaItem whose resource uri matches the one provided * * @param resourceUri uri to match * * @return row of model */ int rowOfResourceUri(const QString &resourceUri); /** * Sets the threshold for the cache. * * @param msec cache threshold in milliseconds. * If any load the model performs takes longer * than this threshold it will be stored in the * cache. */ void setCacheThreshold(int msec); /** * Sets the MediaListProperties for the model * * @param mediaListProperties MediaListProperties to be used by the * model. A subsequent load() call will * use the MediaListProperties.lri. */ void setMediaListProperties(const MediaListProperties &mediaListProperties); /** * Sets the cache for the model to use. * This is useful for sharing a common cache between different * models. * * @param mediaListCache pointer to MediaListCache for the * model to use. */ void setMediaListCache(MediaListCache * mediaListCache); /** * Sets the ListEngineFactory for the model to use. * This is mostly useful if using a custom ListEngineFactory. * * @param listEngineFactory ListEngineFactory for the model to use */ void setListEngineFactory(ListEngineFactory * listEngineFactory); /** * Sets suppression of no results message * @param suppress true to suppress message, false otherwise */ void setSuppressNoResultsMessage(bool suppress); /** * Returns model status information. This contains for underlying model * status info like indexing status. */ QHash status(); /** * Returns the DropActions supported by the model */ Qt::DropActions supportedDropActions() const; /** * Update information associated with MediaItems in mediaList in the * the source from which the model retrieved the MediaItems. * * @param mediaList list containing the MediaItems whose information * should be update in the source. * @param nepomukOnly only update the nepomuk store. * * Note: mediaList does not have to contain the same MediaItems contained * in the model. However, the current model MediaListProperties * should refer to an lri whose ListEngine is capable of updating * information in the source. As a general rule, if the lri * can be used to retrieve the MediaItem, its ListEngine can * update information for the MediaItem. */ void updateSourceInfo(const QList &mediaList, bool nepomukOnly = false); QString dataEngine(); QString filter(); Q_SIGNALS: /** * Emitted when the model's MediaListProperties have changed. */ void propertiesChanged(); /** * Emitted when the list of MediaItems in the model have changed. * This signal may be suppressed when using certain methods. */ void mediaListChanged(); /** * Emitted when the model is loading a list of MediaItems. */ void loading(); /** * Emitted when the loading state changes */ void loadingStateChanged(bool loadingState); /** * Emitted when status is updated */ void statusUpdated(); /** * Emitted when MediaListProperties for this model has changed. * Emitted only when changed independent of media list load. */ void mediaListPropertiesChanged(); /** * Emmitted when updateSourceInfo is finished. */ void updateSourceInfoFinished(); public Q_SLOTS: /** * Activate the action associated with "Action" mediaItem * at the specified model index. * * @param index QModelIndex of action. * (This slot is useful for View ItemDelegates to tell the * model to activate the action when clicked. e.g. Open File.) */ void actionActivated(QModelIndex index); /** * Loads the list of MediaItems associated with "Category" mediaItem * at the specified model index. * * @param index QModelIndex of category. The url of the "Category" type * MediaItem associated with the row of this index contains * the lri representing the list of MediaItems to load. * (This slot is useful for View ItemDelegates to tell the * model to load the category when clicked.) */ void categoryActivated(QModelIndex index); /** * Reloads the information in the current model. */ void reload(); /** * Update MediaItem contained in the model to the MediaItem specified * Only MediaItems in the model whose url matches the url of the * specifed MediaItem will be updated. * * @param mediaItem MediaItem with updated information. * * Note: This method only updates the information in the model. It * does not update the source from which the MediaItems were * retrieved. Use updateSourceInfo() method to do that. */ void updateMediaItem(MediaItem mediaItem); /** * Update MediaItems contained in the model to those in the specified * list of MediaItems. Only MediaItems in the model whose url matches * those in the list of MediaItems will be updated. * * @param mediaList List of MediaItems with updated information. * * Note: This method only updates the information in the model. It * does not update the source from which the MediaItems were * retrieved. Use updateSourceInfo() method to do that. */ void updateMediaItems(QList mediaList); /** * Checks if the model contains playble items (media items or feeds) */ bool containsPlayable(); /** * Remove MediaItem in model that matches the url specified. * * @param url url of MediaItem to remove. * * Note: This method only removes the information in the model. It * does not remove information in the source from which the * MediaItems were retrieved. Use removeSourceInfo() method * to do that. */ void removeMediaItem(QString url); /** * Remove MediaItem in model that matches the resource uri specified. * * @param resourceUri uri of MediaItem to remove. * * Note: This method only removes the information in the model. It * does not remove information in the source from which the * MediaItems were retrieved. Use removeSourceInfo() method * to do that. */ void removeMediaItemByResource(QString resourceUri); /** * Update artwork for mediaItem corresponding to the specified MediaItem. * Only MediaItems in the model whose url matches the url of the * specifed MediaItem will be updated. * * @param artworkImage Image of updated artwork. * @param mediaItem MediaItem to update the artwork for. * * Note: This method only updates the information in the model. It * does not update the source from which the MediaItems were * retrieved. Use updateSourceInfo() method to do that. */ void updateArtwork(QImage artworkImage, MediaItem mediaItem); void updateRefresh(); void updateMediaListPropertiesCategoryArtwork(QImage artworkImage, MediaItem mediaItem); void addResults(QString requestSignature, QList mediaList, MediaListProperties mediaListProperties, bool done, QString subRequestSignature); /** * Update model status */ void updateStatus(QHash updatedStatus); /** * Suppress tooltips */ void setSuppressTooltip(bool suppress = true); private Q_SLOTS: void synchRemoveRows(const QModelIndex &index, int start, int end); void showLoadingMessage(); private: void hideLoadingMessage(); void showNoResultsMessage(); QList rowDataFromMediaItem(MediaItem mediaItem); void loadSourcesForNextCat(); QObject * m_parent; QString m_dataEngine; QString m_filter; MediaListProperties m_mediaListProperties; ListEngineFactory * m_listEngineFactory; QString m_requestSignature; QStringList m_subRequestSignatures; QList< QList > m_subRequestMediaLists; int m_subRequestsDone; QStringList m_urlList; QStringList m_resourceUriList; QList m_mediaList; bool m_emitChangedAfterDrop; int m_loadingProgress; bool m_loadingState; void setLoadingState(bool state); int m_cacheThreshold; MediaListCache * m_mediaListCache; bool m_forceRefreshFromSource; QHash m_lriStartTimes; bool m_loadSources; QList m_mediaListForLoadSources; QList m_remainingCatsForLoadSources; bool m_reload; bool m_lriIsLoadable; bool m_suppressNoResultsMessage; bool m_pendingUpdateRefresh; bool m_suppressTooltip; QHash m_status; }; class MediaSortFilterProxyModel : public QSortFilterProxyModel { public: MediaSortFilterProxyModel(QObject* parent = 0); bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; }; #endif // MEDIAITEMMODEL_H bangarang-bangarang/src/platform/medialistcache.cpp000066400000000000000000000051131166760560600230070ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "medialistcache.h" #include MediaListCache::MediaListCache(QObject * parent) : QObject(parent) { } MediaListCache::~MediaListCache() { } void MediaListCache::addMediaList(MediaListProperties mediaListProperties, QList mediaList) { QString lri = mediaListProperties.lri; if (m_lris.indexOf(lri) == -1) { m_mediaListCache.append(mediaList); m_mediaListProperties.append(mediaListProperties); m_mediaListSizes.append(mediaList.count()); m_lris.append(lri); } else { //Only one instance of any lri mediaList can exist in the cache removeMediaList(lri); m_mediaListCache.append(mediaList); m_mediaListProperties.append(mediaListProperties); m_mediaListSizes.append(mediaList.count()); m_lris.append(lri); } } void MediaListCache::removeMediaList(const QString &lri) { if (m_lris.indexOf(lri) != -1) { int index = m_lris.indexOf(lri); m_mediaListCache.removeAt(index); m_mediaListProperties.removeAt(index); m_mediaListSizes.removeAt(index); m_lris.removeAt(index); } } QList MediaListCache::mediaList(const QString &lri) { if (m_lris.indexOf(lri) != -1) { int index = m_lris.indexOf(lri); return m_mediaListCache.at(index); } else { QList emptyList; return emptyList; } } MediaListProperties MediaListCache::mediaListProperties(const QString &lri) { if (m_lris.indexOf(lri) != -1) { int index = m_lris.indexOf(lri); return m_mediaListProperties.at(index); } else { MediaListProperties mediaListProperties; return mediaListProperties; } } bool MediaListCache::isInCache(const QString &lri) { if (m_lris.indexOf(lri) != -1) { return true; } else { return false; } } bangarang-bangarang/src/platform/medialistcache.h000066400000000000000000000032711166760560600224570ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIALISTCACHE_H #define MEDIALISTCACHE_H #include "mediaitemmodel.h" #include /** * This class caches lists of MediaItems. * Media lists are stored with their associated MediaListProperties * and are retrieved from the cache using the lri. */ class MediaListCache : public QObject { Q_OBJECT public: MediaListCache(QObject * parent); ~MediaListCache(); void addMediaList(MediaListProperties mediaListProperties, QList mediaList); void removeMediaList(const QString &lri); QList mediaList(const QString &lri); MediaListProperties mediaListProperties(const QString &lri); bool isInCache(const QString &lri); private: QList< QList > m_mediaListCache; QList m_mediaListProperties; QList m_lris; QList m_mediaListSizes; }; #endif //MEDIALISTCACHE_Hbangarang-bangarang/src/platform/mediaquery.cpp000066400000000000000000000400311166760560600222130ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "mediaquery.h" #include "mediavocabulary.h" #include #include #include #include #include #include #include #include #include MediaQuery::MediaQuery() { m_queryPrefix = QString("PREFIX xesam: <%1> " "PREFIX rdf: <%2> " "PREFIX xls: <%3> " "PREFIX rdfs: <%4> " "PREFIX nmm: " "PREFIX nie: " "PREFIX nfo: ") .arg(Soprano::Vocabulary::Xesam::xesamNamespace().toString()) .arg(Soprano::Vocabulary::RDF::rdfNamespace().toString()) .arg(Soprano::Vocabulary::XMLSchema::xsdNamespace().toString()) .arg(Soprano::Vocabulary::RDFS::rdfsNamespace().toString()); m_filterOperators << "!=" << ">=" << "<=" << "=" << ">" << "<" << ".contains."; m_filterOperatorConstraint["!="] = NotEqual; m_filterOperatorConstraint[">="] = GreaterThanOrEqual; m_filterOperatorConstraint["<="] = LessThanOrEqual; m_filterOperatorConstraint["="] = Equal; m_filterOperatorConstraint[">"] = GreaterThan; m_filterOperatorConstraint["<"] = LessThan; m_filterOperatorConstraint[".contains."] = Contains; fieldBindingDictionary["artist"] = MediaVocabulary::musicArtistNameBinding(); fieldBindingDictionary["album"] = MediaVocabulary::musicAlbumTitleBinding(); fieldBindingDictionary["genre"] = MediaVocabulary::genreBinding(); fieldBindingDictionary["tag"] = MediaVocabulary::tagBinding(); fieldBindingDictionary["seriesName"] = MediaVocabulary::videoSeriesTitleBinding(); fieldBindingDictionary["season"] = MediaVocabulary::videoSeasonBinding(); fieldBindingDictionary["actor"] = MediaVocabulary::videoActorBinding(); fieldBindingDictionary["director"] = MediaVocabulary::videoDirectorBinding(); } MediaQuery::~MediaQuery() { } void MediaQuery::select(const QStringList &bindings, SelectType selectType) { m_querySelect += "SELECT "; if (selectType == Distinct) { m_querySelect += "DISTINCT "; } for (int i = 0; i < bindings.count(); i++) { if (bindings.at(i).contains("SUM(") || bindings.at(i).contains("COUNT(") || bindings.at(i).contains("AVG(") || bindings.at(i).contains("MIN(") || bindings.at(i).contains("MAX(") ) { m_querySelect += bindings.at(i); } else { m_querySelect += QString("?%1 ").arg(bindings.at(i)); } } } void MediaQuery::startWhere() { m_queryWhere += "WHERE { "; } void MediaQuery::addCondition(const QString &condition) { m_queryCondition += condition; } void MediaQuery::startFilter() { m_queryCondition += "FILTER ( "; } void MediaQuery::startSubFilter() { m_queryCondition += "( "; } void MediaQuery::addFilterOr() { m_queryCondition += "|| "; } void MediaQuery::addFilterAnd() { m_queryCondition += "&& "; } void MediaQuery::addFilterConstraint(const QString &binding, const QString &test, MediaQuery::Constraint constraint) { m_queryCondition += filterConstraint(binding, test, constraint); } void MediaQuery::addFilterConstraint(const QString &binding, int test, MediaQuery::Constraint constraint) { m_queryCondition += filterConstraint(binding, test, constraint); } void MediaQuery::addFilterConstraint(const QString &binding, QDate test, MediaQuery::Constraint constraint) { m_queryCondition += filterConstraint(binding, test, constraint); } void MediaQuery::addFilterConstraint(const QString &binding, QDateTime test, MediaQuery::Constraint constraint) { m_queryCondition += filterConstraint(binding, test, constraint); } void MediaQuery::addFilterString(const QString &filterString) { m_queryCondition += filterString; } void MediaQuery::endSubFilter() { m_queryCondition += ") "; } void MediaQuery::endFilter() { m_queryCondition += ") "; } void MediaQuery::endWhere() { m_queryCondition += "} "; } void MediaQuery::orderBy(const QStringList &bindings, QList order) { QString queryOrder = "ORDER BY "; for (int i = 0; i < bindings.count(); i++) { QString orderPrefix; if (order.count() == 0) { orderPrefix = "ASC"; } else if (order.at(i) == Ascending) { orderPrefix = "ASC"; } else if (order.at(i) == Descending) { orderPrefix = "DESC"; } queryOrder += QString("%1( ?%2 ) ") .arg(orderPrefix) .arg(bindings.at(i)); } m_queryOrder = queryOrder; } void MediaQuery::addLimit(int limit) { if (limit > 0) { m_queryLimit = QString("LIMIT %1 ").arg(limit); } } void MediaQuery::addOffset(int offset) { if (offset > 0) { m_queryOffset = QString("OFFSET %1 ").arg(offset); } } void MediaQuery::addSubQuery(MediaQuery subQuery) { bool excludePrefix = true; m_queryCondition += QString("{ %1 } ").arg(subQuery.query(excludePrefix)); } void MediaQuery::addExtra(const QString &extra) { m_querySuffix += extra + QString(" "); } QString MediaQuery::query(bool excludePrefix) { QString query; if (excludePrefix) { query = m_querySelect + m_queryWhere + m_queryCondition + m_queryOffset + m_queryOrder + m_queryLimit + m_querySuffix; } else { query = m_queryPrefix + m_querySelect + m_queryWhere + m_queryCondition + m_queryOrder + m_queryOffset + m_queryLimit + m_querySuffix; } return query; } Soprano::QueryResultIterator MediaQuery::executeSelect(Soprano::Model* model) { return model->executeQuery(query(), Soprano::Query::QueryLanguageSparql); } bool MediaQuery::executeAsk(Soprano::Model* model) { QString query = m_queryPrefix + QString("ASK { %1 } ").arg(m_queryCondition); return model->executeQuery(query, Soprano::Query::QueryLanguageSparql).boolValue(); } void MediaQuery::addLRIFilterConditions(const QStringList &lriFilterList, MediaVocabulary mediaVocabulary) { for (int i = 0; i < lriFilterList.count(); i++) { QString lriFilter = lriFilterList.at(i).trimmed(); addLRIFilterCondition(lriFilter, mediaVocabulary); } } void MediaQuery::addLRIFilterCondition(const QString &lriFilter, MediaVocabulary mediaVocabulary) { //Parse filter QString field; Constraint constraint = Equal; QString value; for (int j = 0; j < m_filterOperators.count(); j ++) { QString oper = m_filterOperators.at(j); if (lriFilter.indexOf(oper) != -1) { constraint = m_filterOperatorConstraint[oper]; field = lriFilter.left(lriFilter.indexOf(oper)).trimmed(); value = lriFilter.mid(lriFilter.indexOf(oper) + oper.length()).trimmed(); break; } } //Special handling for groupBy field if (field == "groupBy") { m_querySelect += QString("?%1 ").arg(fieldBindingDictionary[value]); //Set the field to ensure SPARQL triple match is also added to the query condition field = value; value = QString(); } //Add filter condition if (field == "type" && constraint == Equal) { if (value.toLower() == "audio") { addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required)); } else if (value.toLower() == "video") { addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); } } else if (field == "audioType" && constraint == Equal) { if (value.toLower() == "audio clip") { addCondition(mediaVocabulary.hasTypeAudio(MediaQuery::Required)); } else if (value.toLower() == "music") { addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); } else if (value.toLower() == "audio stream") { addCondition(mediaVocabulary.hasTypeAudioStream(MediaQuery::Required)); } } else if (field == "videoType") { if (value.toLower() == "video clip") { addCondition(mediaVocabulary.hasTypeVideo(MediaQuery::Required)); } else if (value.toLower() == "movie") { addCondition(mediaVocabulary.hasTypeVideoMovie(MediaQuery::Required)); } else if (value.toLower() == "tv show") { addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required)); } } else if (field == "title") { addCondition(mediaVocabulary.hasTitle(MediaQuery::Required, value, constraint)); } else if (field == "tag") { addCondition(mediaVocabulary.hasTag(MediaQuery::Required, value, constraint)); } else if (field == "desription") { addCondition(mediaVocabulary.hasDescription(MediaQuery::Required, value, constraint)); } else if (field == "duration") { addCondition(mediaVocabulary.hasDuration(MediaQuery::Required, value.toInt(), constraint)); } else if (field == "lastPlayed") { QDateTime valueDateTime = QDateTime::fromString(value, "yyyyMMddHHmmss"); addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Required, valueDateTime, constraint)); } else if (field == "playCount") { MediaQuery::Match match = MediaQuery::Required; addCondition(mediaVocabulary.hasPlayCount(match, value.toInt(), constraint)); } else if (field == "created") { QDate valueDate = QDate::fromString(value, "yyyyMMdd"); addCondition(mediaVocabulary.hasCreated(MediaQuery::Required, valueDate, constraint)); } else if (field == "genre") { addCondition(mediaVocabulary.hasGenre(MediaQuery::Required, value, constraint)); } else if (field == "releaseDate") { QDate valueDate = QDate::fromString(value, "yyyyMMdd"); addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Required, valueDate, constraint)); } else if (field == "rating") { MediaQuery::Match match = MediaQuery::Required; addCondition(mediaVocabulary.hasRating(match, value.toInt(), constraint)); } else if (field == "artist") { addCondition(mediaVocabulary.hasMusicAnyArtistName(MediaQuery::Required, value, constraint)); } else if (field == "composer") { addCondition(mediaVocabulary.hasMusicComposerName(MediaQuery::Required, value, constraint)); } else if (field == "album") { addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required, value, constraint)); } else if (field == "albumYear") { addCondition(mediaVocabulary.hasMusicAlbumYear(MediaQuery::Required, value.toInt(), constraint)); } else if (field == "trackNumber") { addCondition(mediaVocabulary.hasMusicTrackNumber(MediaQuery::Required, value.toInt(), constraint)); } else if (field == "seriesName") { if (value != "~") { addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required, value, constraint)); } } else if (field == "synopsis") { addCondition(mediaVocabulary.hasVideoSynopsis(MediaQuery::Required, value, constraint)); } else if (field == "season") { if (value.toInt() != -1) { addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Required, value.toInt(), constraint)); } } else if (field == "episodeNumber") { addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Required, value.toInt(), constraint)); } else if (field == "audienceRating") { addCondition(mediaVocabulary.hasVideoAudienceRating(MediaQuery::Required, value, constraint)); } else if (field == "writer") { addCondition(mediaVocabulary.hasVideoWriter(MediaQuery::Required, value, constraint)); } else if (field == "director") { addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Required, value, constraint)); } else if (field == "assistantDirector") { addCondition(mediaVocabulary.hasVideoAssistantDirector(MediaQuery::Required, value, constraint)); } else if (field == "producer") { addCondition(mediaVocabulary.hasVideoProducer(MediaQuery::Required, value, constraint)); } else if (field == "actor") { addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Required, value, constraint)); } else if (field == "cinematographer") { addCondition(mediaVocabulary.hasVideoCinematographer(MediaQuery::Required, value, constraint)); } else if (field == "limit") { addLimit(value.toInt()); } } bangarang-bangarang/src/platform/mediaquery.h000066400000000000000000000305041166760560600216640ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIAQUERY_H #define MEDIAQUERY_H #include #include #include class MediaVocabulary; class MediaQuery { public: MediaQuery(); ~MediaQuery(); enum SelectType{NonDistinct = 0, Distinct = 1}; enum Constraint {Equal = 0, NotEqual = 1, Contains = 2, GreaterThan = 3, LessThan = 4, GreaterThanOrEqual = 5, LessThanOrEqual = 6, Bound = 7, NotBound = 8}; enum Match {Required = 0, Optional = 1}; enum Order{Ascending = 0, Descending = 1}; enum Aggregate{Sum = 0, Count = 1, Average = 2, Min = 3, Max = 4, CountAverage = 5}; QHash fieldBindingDictionary; void select(const QStringList &bindings, SelectType selectType = NonDistinct); void startWhere(); void addCondition(const QString &condition); void startFilter(); void startSubFilter(); void addFilterOr(); void addFilterAnd(); void addFilterConstraint(const QString &binding, const QString &test, MediaQuery::Constraint constraint); void addFilterConstraint(const QString &binding, int test, MediaQuery::Constraint constraint); void addFilterConstraint(const QString &binding, QDate test, MediaQuery::Constraint constraint); void addFilterConstraint(const QString &binding, QDateTime test, MediaQuery::Constraint constraint); void addFilterString(const QString & filterString); void endSubFilter(); void endFilter(); void endWhere(); void orderBy(const QStringList &bindings, QList order = QList()); void addLimit(int limit); void addOffset(int offset); void addSubQuery(MediaQuery subQuery); void addExtra(const QString &extra); QString query(bool excludePrefix = false); Soprano::QueryResultIterator executeSelect(Soprano::Model* model); bool executeAsk(Soprano::Model* model); void addLRIFilterCondition(const QString &lriFilter, MediaVocabulary mediaVocabulary); void addLRIFilterConditions(const QStringList &lriFilterList, MediaVocabulary mediaVocabulary); static QString aggregateBinding(QString binding, Aggregate agg) { if (agg == Sum) { return QString("SUM(?%1*1) as ?%1_sum ").arg(binding); } else if (agg == Count) { return QString("COUNT(?%1) as ?%1_count ").arg(binding); } else if (agg == Average) { return QString("AVG(?%1*1) as ?%1_avg ").arg(binding); } else if (agg == Min) { return QString("MIN(?%1) as ?%1_min ").arg(binding); } else if (agg == Max) { return QString("MAX(?%1) as ?%1_max ").arg(binding); } else if (agg == CountAverage) { return QString("(AVG(?%1*1)*COUNT(?%1)) as ?%1_countavg ").arg(binding); } else { return QString("dummy"); } } static QString addOptional(const QString &str) { return QString("OPTIONAL { ") + str + "} . "; } static QString hasType(const QString &resourceBinding, const QUrl &type) { return QString("?%1 rdf:type <%2> . ") .arg(resourceBinding) .arg(type.toString()); } static QString excludeType(const QString &resourceBinding, const QUrl &type) { return QString("OPTIONAL { ?%1 rdf:type <%2> . " "?%1 rdf:type ?excludeType . } " "FILTER ( !bound(?excludeType) ) ") .arg(resourceBinding) .arg(type.toString()); } static QString hasProperty(const QString &resourceBinding, const QUrl &property, const QString &propertyBinding) { return QString("?%1 <%2> ?%3 . ") .arg(resourceBinding) .arg(property.toString()) .arg(propertyBinding); } static QString filterConstraint(const QString &binding, const QString &test, MediaQuery::Constraint constraint) { QString statement; if (constraint == MediaQuery::Equal) { statement += QString(" (?%1 = %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::NotEqual) { statement += QString(" (?%1 != %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::Contains) { statement += QString(" (regex(?%1, \"%2\", \"i\")) ") .arg(binding) .arg(test); } else if (constraint == MediaQuery::LessThan) { statement += QString(" (?%1 < %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::GreaterThan) { statement += QString(" (?%1 > %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::LessThanOrEqual) { statement += QString(" (?%1 <= %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::GreaterThanOrEqual) { statement += QString(" (?%1 >= %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::Bound) { statement += QString(" bound(?%1) ") .arg(binding); } else if (constraint == MediaQuery::NotBound) { statement += QString(" !bound(?%1) ") .arg(binding); } return statement; } static QString filterConstraint(const QString &binding, int test, MediaQuery::Constraint constraint) { QString statement; if (constraint == MediaQuery::Equal) { statement += QString(" (?%1 = %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::NotEqual) { statement += QString(" (?%1 != %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::LessThan) { statement += QString(" (?%1 < %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::GreaterThan) { statement += QString(" (?%1 > %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::LessThanOrEqual) { statement += QString(" (?%1 <= %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::GreaterThanOrEqual) { statement += QString(" (?%1 >= %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } return statement; } static QString filterConstraint(const QString &binding, QDate test, MediaQuery::Constraint constraint) { QString statement; if (constraint == MediaQuery::Equal) { statement += QString(" (?%1 = %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::NotEqual) { statement += QString(" (?%1 != %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::LessThan) { statement += QString(" (?%1 < %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::GreaterThan) { statement += QString(" (?%1 > %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::LessThanOrEqual) { statement += QString(" (?%1 <= %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::GreaterThanOrEqual) { statement += QString(" (?%1 >= %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } return statement; } static QString filterConstraint(const QString &binding, QDateTime test, MediaQuery::Constraint constraint) { QString statement; if (constraint == MediaQuery::Equal) { statement += QString(" (?%1 = %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::NotEqual) { statement += QString(" (?%1 != %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::LessThan) { statement += QString(" (?%1 < %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::GreaterThan) { statement += QString(" (?%1 > %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::LessThanOrEqual) { statement += QString(" (?%1 <= %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } else if (constraint == MediaQuery::GreaterThanOrEqual) { statement += QString(" (?%1 >= %2) ") .arg(binding) .arg(Soprano::Node::literalToN3(test)); } return statement; } static QString filterConstraint(const QString &binding, const QUrl &test, MediaQuery::Constraint constraint) { QString statement; if (constraint == MediaQuery::Equal) { statement += QString(" (?%1 = <%2>) ") .arg(binding) .arg(test.toString()); } else { statement += QString(" (?%1 != <%2>) ") .arg(binding) .arg(test.toString()); } return statement; } private: QString m_queryPrefix; QString m_querySelect; QString m_queryWhere; QString m_queryCondition; QString m_queryLimit; QString m_queryOffset; QString m_queryOrder; QString m_querySuffix; QStringList m_filterOperators; QHash m_filterOperatorConstraint; QHash m_fieldBindingDictionary; }; #endif // MEDIAQUERY_H bangarang-bangarang/src/platform/mediavocabulary.cpp000066400000000000000000002315351166760560600232300ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "mediavocabulary.h" #include #include #include #include #include #include #include MediaVocabulary::MediaVocabulary() { if ((KDE::versionMinor() <= 3) && (KDE::versionRelease() < 83)) { m_vocabulary = MediaVocabulary::xesam; m_audioVocabulary = MediaVocabulary::nie; m_musicVocabulary = MediaVocabulary::xesam; } else { m_vocabulary = MediaVocabulary::nmm; m_audioVocabulary = MediaVocabulary::nmm; m_musicVocabulary = MediaVocabulary::nmm; } m_videoVocabulary = MediaVocabulary::nmm; } MediaVocabulary::~MediaVocabulary() { } void MediaVocabulary::setVocabulary(int vocabulary) { if (vocabulary == MediaVocabulary::xesam) { m_vocabulary = MediaVocabulary::xesam; } else if (vocabulary == MediaVocabulary::nie) { m_vocabulary = MediaVocabulary::nie; } else if (vocabulary == MediaVocabulary::nmm) { m_vocabulary = MediaVocabulary::nmm; } } void MediaVocabulary::setAudioVocabulary(int vocabulary) { if (vocabulary == MediaVocabulary::xesam) { m_audioVocabulary = MediaVocabulary::xesam; } else if (vocabulary == MediaVocabulary::nie) { m_audioVocabulary = MediaVocabulary::nie; } else if (vocabulary == MediaVocabulary::nmm) { m_audioVocabulary = MediaVocabulary::nmm; } } void MediaVocabulary::setMusicVocabulary(int vocabulary) { if (vocabulary == MediaVocabulary::xesam) { m_musicVocabulary = MediaVocabulary::xesam; } else if (vocabulary == MediaVocabulary::nid3) { m_vocabulary = MediaVocabulary::nid3; } else if (vocabulary == MediaVocabulary::nmm) { m_musicVocabulary = MediaVocabulary::nmm; } } void MediaVocabulary::setVideoVocabulary(int vocabulary) { if (vocabulary == MediaVocabulary::xesam) { m_videoVocabulary = MediaVocabulary::xesam; } else if (vocabulary == MediaVocabulary::nie) { m_videoVocabulary = MediaVocabulary::nie; } else if (vocabulary == MediaVocabulary::nmm) { m_videoVocabulary = MediaVocabulary::nmm; } } int MediaVocabulary::vocabulary() { return m_vocabulary; } int MediaVocabulary::audioVocabulary() { return m_audioVocabulary; } int MediaVocabulary::musicVocabulary() { return m_musicVocabulary; } int MediaVocabulary::videoVocabulary() { return m_videoVocabulary; } QUrl MediaVocabulary::mediaNamespace(int vocabulary) { QUrl returnUrl = QUrl(); if (vocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::xesamNamespace(); } else if (vocabulary == MediaVocabulary::nie) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#"); } else if (vocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#"); } else if (vocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#"); } return returnUrl; } QUrl MediaVocabulary::typeAudio() { QUrl returnUrl = QUrl(); if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::Audio(); } else if (m_vocabulary == MediaVocabulary::nie) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Audio"); } else if (m_vocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Audio"); } return returnUrl; } QUrl MediaVocabulary::typeAudioMusic() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::Music(); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#ID3Audio"); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#MusicPiece"); } return returnUrl; } QUrl MediaVocabulary::typeAudioStream() { QUrl returnUrl = QUrl(); if (m_audioVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::Audio(); } else if (m_audioVocabulary == MediaVocabulary::nie) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#MediaStream"); } else if (m_audioVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#DigitalRadio"); } return returnUrl; } QUrl MediaVocabulary::typeAudioFeed() { QUrl returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#AudioFeed"); return returnUrl; } QUrl MediaVocabulary::typeVideo() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::Video(); } else if (m_videoVocabulary == MediaVocabulary::nie) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Video"); } else if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#Video"); } return returnUrl; } QUrl MediaVocabulary::typeVideoMovie() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#Movie"); } return returnUrl; } QUrl MediaVocabulary::typeVideoTVShow() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#TVShow"); } return returnUrl; } QUrl MediaVocabulary::typeVideoFeed() { QUrl returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#VideoFeed"); return returnUrl; } QUrl MediaVocabulary::typeTVSeries() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#TVSeries"); } return returnUrl; } QUrl MediaVocabulary::typeImage() { QUrl returnUrl = QUrl(); if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::Image(); } else if (m_vocabulary == MediaVocabulary::nie) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Image"); } else if (m_vocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Image"); } return returnUrl; } QUrl MediaVocabulary::typeMusicArtist() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact"); } return returnUrl; } QUrl MediaVocabulary::typeMusicAlbum() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#MusicAlbum"); } return returnUrl; } QUrl MediaVocabulary::typeNCOContact() { return QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact"); } QUrl MediaVocabulary::title() { QUrl returnUrl = QUrl(); if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::title(); } else if (m_vocabulary == MediaVocabulary::nie) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title"); } else if (m_vocabulary == MediaVocabulary::nmm) { //Draft nmm ontology is extension of nie returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title"); } return returnUrl; } QUrl MediaVocabulary::tag() { QUrl returnUrl = QUrl(); returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/08/15/nao#hasTag"); return returnUrl; } QUrl MediaVocabulary::relatedTo() { return QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#relatedTo"); } QUrl MediaVocabulary::description() { QUrl returnUrl = QUrl(); if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::description(); } else if (m_vocabulary == MediaVocabulary::nie) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#description"); } else if (m_vocabulary == MediaVocabulary::nmm) { //Draft nmm ontology is extension of nie returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#description"); } return returnUrl; } QUrl MediaVocabulary::duration() { QUrl returnUrl = QUrl(); if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::mediaDuration(); } else if (m_vocabulary == MediaVocabulary::nie) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#duration"); } else if (m_vocabulary == MediaVocabulary::nmm) { //Draft nmm ontology is extension of nie returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#duration"); } return returnUrl; } QUrl MediaVocabulary::lastPlayed() { QUrl returnUrl = QUrl(); //TODO:Waiting for Nepmouk ontology for useCount and lastUsed //if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2010/01/25/nuao#lastUsage"); //} return returnUrl; } QUrl MediaVocabulary::playCount() { QUrl returnUrl = QUrl(); //TODO:Waiting for Nepmouk ontology for useCount and lastUsed //if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2010/01/25/nuao#usageCount"); //} return returnUrl; } QUrl MediaVocabulary::artwork() { return QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#hasLogicalPart"); } QUrl MediaVocabulary::created() { QUrl returnUrl = QUrl(); if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::contentCreated(); } else if (m_vocabulary == MediaVocabulary::nie) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentCreated"); } else if (m_vocabulary == MediaVocabulary::nmm) { //Draft nmm ontology is extension of nie returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentCreated"); } return returnUrl; } QUrl MediaVocabulary::releaseDate() { QUrl returnUrl = QUrl(); if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::contentCreated(); } else if (m_vocabulary == MediaVocabulary::nmm) { //Draft nmm ontology is extension of nie returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#releaseDate"); } return returnUrl; } QUrl MediaVocabulary::genre() { QUrl returnUrl = QUrl(); if (m_vocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::genre(); } else if (m_vocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#genre"); } return returnUrl; } QUrl MediaVocabulary::rating() { return Soprano::Vocabulary::NAO::numericRating(); } QUrl MediaVocabulary::ncoFullname() { return QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname"); } QUrl MediaVocabulary::musicArtist() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::artist(); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#creator"); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#leadArtist"); } return returnUrl; } QUrl MediaVocabulary::musicPerformer() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::artist(); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#performer"); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#leadArtist"); } return returnUrl; } QUrl MediaVocabulary::musicComposer() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::artist(); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#composer"); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#leadArtist"); } return returnUrl; } QUrl MediaVocabulary::musicArtistName() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::artist(); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname"); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname"); } return returnUrl; } QUrl MediaVocabulary::musicAlbum() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::album(); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#musicAlbum"); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#albumTitle"); } return returnUrl; } QUrl MediaVocabulary::musicAlbumName() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::album(); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title"); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#albumTitle"); } return returnUrl; } QUrl MediaVocabulary::musicAlbumYear() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::contentCreated(); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#releaseDate"); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#recordingYear"); } return returnUrl; } QUrl MediaVocabulary::musicTrackNumber() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::trackNumber(); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#trackNumber"); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#trackNumber"); } return returnUrl; } QUrl MediaVocabulary::musicGenre() { QUrl returnUrl = QUrl(); if (m_musicVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::genre(); } else if (m_musicVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#genre"); } else if (m_musicVocabulary == MediaVocabulary::nid3) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/05/10/nid3#contentType"); } return returnUrl; } QUrl MediaVocabulary::videoGenre() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::genre(); } else if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#genre"); } return returnUrl; } QUrl MediaVocabulary::videoSeries() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#series"); } return returnUrl; } QUrl MediaVocabulary::videoSeriesTitle() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title"); } return returnUrl; } QUrl MediaVocabulary::videoSynopsis() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::xesam) { returnUrl = Soprano::Vocabulary::Xesam::genre(); } else if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#description"); } return returnUrl; } QUrl MediaVocabulary::videoSeason() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#season"); } return returnUrl; } QUrl MediaVocabulary::videoEpisodeNumber() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#episodeNumber"); } return returnUrl; } QUrl MediaVocabulary::videoAudienceRating() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#audienceRating"); } return returnUrl; } QUrl MediaVocabulary::videoWriter() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#writer"); } return returnUrl; } QUrl MediaVocabulary::videoDirector() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#director"); } return returnUrl; } QUrl MediaVocabulary::videoAssistantDirector() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#assistantDirector"); } return returnUrl; } QUrl MediaVocabulary::videoProducer() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#producer"); } return returnUrl; } QUrl MediaVocabulary::videoActor() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#actor"); } return returnUrl; } QUrl MediaVocabulary::videoCinematographer() { QUrl returnUrl = QUrl(); if (m_videoVocabulary == MediaVocabulary::nmm) { returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#cinematographer"); } return returnUrl; } QString MediaVocabulary::hasTypeAudio(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeAudio()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } statement += MediaQuery::excludeType(resourceBinding, typeAudioMusic()); statement += MediaQuery::excludeType(resourceBinding, typeAudioStream()); statement += MediaQuery::excludeType(resourceBinding, typeAudioFeed()); return statement; } QString MediaVocabulary::hasTypeAudioMusic(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeAudioMusic()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeAudioStream(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeAudioStream()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeAudioFeed(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeAudioFeed()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeAnyAudio(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = QString("{%1} UNION {%2} UNION {%3} ") .arg(MediaQuery::hasType(resourceBinding, typeAudio())) .arg(MediaQuery::hasType(resourceBinding, typeAudioMusic())) .arg(MediaQuery::hasType(resourceBinding, typeAudioStream())); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeVideo(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = QString("{%1} UNION {%2} ") .arg(MediaQuery::hasType(resourceBinding, typeVideo())) .arg(MediaQuery::hasType(resourceBinding, QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Video"))); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } statement += MediaQuery::excludeType(resourceBinding, typeVideoMovie()); statement += MediaQuery::excludeType(resourceBinding, typeVideoTVShow()); statement += MediaQuery::excludeType(resourceBinding, typeVideoFeed()); return statement; } QString MediaVocabulary::hasTypeVideoMovie(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeVideoMovie()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeVideoTVShow(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeVideoTVShow()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeVideoFeed(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeVideoFeed()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeAnyVideo(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = QString("{%1} UNION {%2} UNION {%3} ") .arg(MediaQuery::hasType(resourceBinding, typeVideo())) .arg(MediaQuery::hasType(resourceBinding, typeVideoMovie())) .arg(MediaQuery::hasType(resourceBinding, typeVideoTVShow())); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeImage(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeImage()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeTVSeries(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeTVSeries()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeMusicArtist(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeMusicArtist()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTypeMusicAlbum(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString statement = MediaQuery::hasType(resourceBinding, typeMusicAlbum()); statement += fileUrl(resourceBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasResource(const QString &uri) { QString resourceBinding = mediaResourceBinding(); QString statement = QString("?%1 ?dummyPredicate ?dummyObject ").arg(resourceBinding); statement += QString("FILTER (?%1 = <%2> ) ").arg(resourceBinding) .arg(uri); statement += fileUrl(resourceBinding); return statement; } QString MediaVocabulary::hasUrl(MediaQuery::Match match, const QString &url) { QString statement = QString("?%1 nie:url ?%2 . ") .arg(mediaResourceBinding()) .arg(mediaResourceUrlBinding()); statement += QString("FILTER (?%1 = <%2> ) ") .arg(mediaResourceUrlBinding()) .arg(url); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTitle(MediaQuery::Match match, const QString &title, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = titleBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::title(), propertyBinding); if (!title.isEmpty()) { QStringList titles = title.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < titles.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, titles.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasTag(MediaQuery::Match match, const QString &tag, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString tagResourceBinding = "tr"; QString propertyBinding = tagBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::tag(), tagResourceBinding); statement += QString("?%1 nao:prefLabel ?%2 . ").arg(tagResourceBinding).arg(propertyBinding); if (!tag.isEmpty()) { QStringList tags = tag.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < tags.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, tags.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasDescription(MediaQuery::Match match, const QString &description, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = descriptionBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::description(), propertyBinding); if (!description.isEmpty()) { QStringList descriptions = description.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < descriptions.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, descriptions.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasDuration(MediaQuery::Match match, int duration, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = durationBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::duration(), propertyBinding); if (duration != -2) { statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, duration, constraint); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasLastPlayed(MediaQuery::Match match, const QDateTime &lastPlayed, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = lastPlayedBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::lastPlayed(), propertyBinding); if (lastPlayed.isValid()) { statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, lastPlayed, constraint); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasPlayCount(MediaQuery::Match match, int playCount, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = playCountBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::playCount(), propertyBinding); bool forceOptional = false; QString filter; if (playCount == 0 && (constraint == MediaQuery::Equal || constraint == MediaQuery::LessThanOrEqual || constraint == MediaQuery::LessThan || constraint == MediaQuery::GreaterThanOrEqual)) { filter = QString("FILTER ((bound(?%1) && %2) || !bound(?%1)) ") .arg(propertyBinding) .arg(MediaQuery::filterConstraint(propertyBinding, playCount, constraint)); forceOptional = true; } else if (playCount > 0){ filter = QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, playCount, constraint); } if (match == MediaQuery::Optional || forceOptional) { statement = MediaQuery::addOptional(statement); } statement += filter; return statement; } QString MediaVocabulary::hasArtwork(MediaQuery::Match match) { QString resourceBinding = mediaResourceBinding(); QString artworkResourceBinding = "artworkResource"; QString propertyBinding = artworkBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::artwork(), artworkResourceBinding); statement += QString("?%1 nie:url ?%2 . ").arg(artworkResourceBinding).arg(propertyBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasCreated(MediaQuery::Match match, const QDate &created, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = createdBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::created(), propertyBinding); if (created.isValid()) { statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, created, constraint); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasGenre(MediaQuery::Match match, const QString &genre, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = genreBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::genre(), propertyBinding); if (!genre.isEmpty()) { QStringList genres = genre.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < genres.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, genres.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasReleaseDate(MediaQuery::Match match, const QDate &releaseDate, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = releaseDateBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::releaseDate(), propertyBinding); if (releaseDate.isValid()) { statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, releaseDate, constraint); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasRating(MediaQuery::Match match, int rating, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = ratingBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::rating(), propertyBinding); bool forceOptional = false; QString filter; if (rating == 0 && (constraint == MediaQuery::Equal || constraint == MediaQuery::LessThanOrEqual || constraint == MediaQuery::LessThan || constraint == MediaQuery::GreaterThanOrEqual)) { filter = QString("FILTER ((bound(?%1) && %2) || !bound(?%1)) ") .arg(propertyBinding) .arg(MediaQuery::filterConstraint(propertyBinding, rating, constraint)); forceOptional = true; } else if (rating > 0){ filter = QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, rating, constraint); } if (match == MediaQuery::Optional || forceOptional) { statement = MediaQuery::addOptional(statement); } statement += filter; return statement; } QString MediaVocabulary::hasRelatedTo(const QString &resourceBinding, MediaQuery::Match match, const QUrl &related, MediaQuery::Constraint constraint) { //QString resourceBinding = mediaResourceBinding(); QString propertyBinding = relatedToBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::relatedTo(), propertyBinding); if (related.isValid()) { statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, related, constraint); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicAnyArtistName(MediaQuery::Match match, const QString &artistName, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = musicArtistNameBinding(); QString statement; if (m_musicVocabulary == MediaVocabulary::nmm) { statement = QString("{%1} UNION {%2} UNION {%3} ") .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicArtist(), artistResourceBinding())) .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicPerformer(), artistResourceBinding())) .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicComposer(), artistResourceBinding())); statement += MediaQuery::hasProperty(artistResourceBinding(), MediaVocabulary::musicArtistName(), propertyBinding); } else { statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicArtistName(), propertyBinding); } if (!artistName.isEmpty()) { QStringList artistNames = artistName.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < artistNames.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, artistNames.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicAnyArtistDescription(MediaQuery::Match match, const QString &artistDescription, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = musicArtistDescriptionBinding(); QString statement; statement = QString("{%1} UNION {%2} UNION {%3} ") .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicArtist(), artistResourceBinding())) .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicPerformer(), artistResourceBinding())) .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicComposer(), artistResourceBinding())); statement += MediaQuery::hasProperty(artistResourceBinding(), MediaVocabulary::description(), propertyBinding); if (!artistDescription.isEmpty()) { QStringList artistDescriptions = artistDescription.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < artistDescriptions.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, artistDescriptions.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicArtistName(MediaQuery::Match match, const QString &artistName, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = musicArtistNameBinding(); QString statement; if (m_musicVocabulary == MediaVocabulary::nmm) { statement = QString("{%1} UNION {%2} ") .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicArtist(), artistResourceBinding())) .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicPerformer(), artistResourceBinding())); statement += MediaQuery::hasProperty(artistResourceBinding(), MediaVocabulary::musicArtistName(), propertyBinding); } else { statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicArtistName(), propertyBinding); } if (!artistName.isEmpty()) { QStringList artistNames = artistName.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < artistNames.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, artistNames.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicArtistDescription(MediaQuery::Match match, const QString &artistDescription, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = musicArtistDescriptionBinding(); QString statement; statement = QString("{%1} UNION {%2} ") .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicArtist(), artistResourceBinding())) .arg(MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicPerformer(), artistResourceBinding())); statement += MediaQuery::hasProperty(artistResourceBinding(), MediaVocabulary::description(), propertyBinding); if (!artistDescription.isEmpty()) { QStringList artistDescriptions = artistDescription.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < artistDescriptions.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, artistDescriptions.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicArtistArtwork(MediaQuery::Match match) { QString resourceBinding = artistResourceBinding(); QString artworkResourceBinding = "artworkResource"; QString propertyBinding = musicArtistArtworkBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::artwork(), artworkResourceBinding); statement += QString("?%1 nie:url ?%2 . ").arg(artworkResourceBinding).arg(propertyBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicComposerName(MediaQuery::Match match, const QString &composerName, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = musicComposerNameBinding(); QString statement; if (m_musicVocabulary == MediaVocabulary::nmm) { statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicComposer(), composerResourceBinding()); statement += MediaQuery::hasProperty(composerResourceBinding(), MediaVocabulary::musicArtistName(), propertyBinding); } else { statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicArtistName(), propertyBinding); } if (!composerName.isEmpty()) { QStringList composerNames = composerName.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < composerNames.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, composerNames.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicComposerDescription(MediaQuery::Match match, const QString &composerDescription, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = musicComposerDescriptionBinding(); QString statement; statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicComposer(), composerResourceBinding()); statement += MediaQuery::hasProperty(composerResourceBinding(), MediaVocabulary::description(), propertyBinding); if (!composerDescription.isEmpty()) { QStringList composerDescriptions = composerDescription.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < composerDescriptions.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, composerDescriptions.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicComposerArtwork(MediaQuery::Match match) { QString resourceBinding = composerResourceBinding(); QString artworkResourceBinding = "artworkResource"; QString propertyBinding = musicArtistArtworkBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::artwork(), artworkResourceBinding); statement += QString("?%1 nie:url ?%2 . ").arg(artworkResourceBinding).arg(propertyBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicAlbumTitle(MediaQuery::Match match, const QString &albumTitle, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = musicAlbumTitleBinding(); QString statement; if (m_musicVocabulary == MediaVocabulary::nmm) { statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicAlbum(), albumResourceBinding()); statement += MediaQuery::hasProperty(albumResourceBinding(), MediaVocabulary::musicAlbumName(), propertyBinding); } else { statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicAlbumName(), propertyBinding); } if (!albumTitle.isEmpty()) { QStringList albumTitles = albumTitle.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < albumTitles.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, albumTitles.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicAlbumYear(MediaQuery::Match match, int year, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = musicAlbumYearBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicAlbumYear(), propertyBinding); if (year != 0) { QDate yearDate = QDate(year, 1, 1); statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, yearDate, constraint); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasMusicTrackNumber(MediaQuery::Match match, int trackNumber, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = musicTrackNumberBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicTrackNumber(), propertyBinding); if (trackNumber != 0) { statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, trackNumber, constraint); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoSeriesTitle(MediaQuery::Match match, const QString &seriesTitle, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoSeriesTitleBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoSeries(), videoSeriesResourceBinding()); statement += MediaQuery::hasProperty(videoSeriesResourceBinding(), MediaVocabulary::videoSeriesTitle(), propertyBinding); if (!seriesTitle.isEmpty()) { QStringList seriesTitles = seriesTitle.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < seriesTitles.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, seriesTitles.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoSeriesDescription(MediaQuery::Match match, const QString &seriesDescription, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoSeriesDescriptionBinding(); QString seriesResourceBinding = videoSeriesResourceBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoSeries(), seriesResourceBinding); statement += MediaQuery::hasProperty(seriesResourceBinding, MediaVocabulary::description(), propertyBinding); if (!seriesDescription.isEmpty()) { QStringList seriesDescriptions = seriesDescription.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < seriesDescriptions.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, seriesDescriptions.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoSeriesArtwork(MediaQuery::Match match) { QString resourceBinding = videoSeriesResourceBinding(); QString artworkResourceBinding = "artworkResource"; QString propertyBinding = videoSeriesArtworkBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::artwork(), artworkResourceBinding); statement += QString("?%1 nie:url ?%2 . ").arg(artworkResourceBinding).arg(propertyBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoSynopsis(MediaQuery::Match match, const QString &synopsis, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoSynopsisBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoSynopsis(), propertyBinding); if (!synopsis.isEmpty()) { QStringList synopses = synopsis.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < synopses.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, synopses.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoSeason(MediaQuery::Match match, int season, MediaQuery::Constraint constraint) { //TODO:Modify for new 0.3+ sdo nmm ontology with Series class QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoSeasonBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoSeason(), propertyBinding); if (season != 0) { statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, season, constraint); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoEpisodeNumber(MediaQuery::Match match, int episodeNumber, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoEpisodeNumberBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoEpisodeNumber(), propertyBinding); if (episodeNumber != 0) { statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, episodeNumber, constraint); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoAudienceRating(MediaQuery::Match match, const QString &audienceRating, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoAudienceRatingBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoAudienceRating(), propertyBinding); if (!audienceRating.isEmpty()) { QStringList audienceRatings = audienceRating.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < audienceRatings.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, audienceRatings.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoWriter(MediaQuery::Match match, const QString &writer, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoWriterBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoWriter(), writerResourceBinding()); statement += MediaQuery::hasProperty(writerResourceBinding(), MediaVocabulary::ncoFullname(), propertyBinding); if (!writer.isEmpty()) { QStringList writers = writer.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < writers.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, writers.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoWriterDescription(MediaQuery::Match match, const QString &writerDescription, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoWriterDescriptionBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoWriter(), writerResourceBinding()); statement += MediaQuery::hasProperty(writerResourceBinding(), MediaVocabulary::description(), propertyBinding); if (!writerDescription.isEmpty()) { QStringList writerDescriptions = writerDescription.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < writerDescriptions.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, writerDescriptions.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoWriterArtwork(MediaQuery::Match match) { QString resourceBinding = writerResourceBinding(); QString artworkResourceBinding = "artworkResource"; QString propertyBinding = videoWriterArtworkBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::artwork(), artworkResourceBinding); statement += QString("?%1 nie:url ?%2 . ").arg(artworkResourceBinding).arg(propertyBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoDirector(MediaQuery::Match match, const QString &director, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoDirectorBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoDirector(), directorResourceBinding()); statement += MediaQuery::hasProperty(directorResourceBinding(), MediaVocabulary::ncoFullname(), propertyBinding); if (!director.isEmpty()) { QStringList directors = director.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < directors.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, directors.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoDirectorDescription(MediaQuery::Match match, const QString &directorDescription, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoDirectorDescriptionBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoDirector(), directorResourceBinding()); statement += MediaQuery::hasProperty(directorResourceBinding(), MediaVocabulary::description(), propertyBinding); if (!directorDescription.isEmpty()) { QStringList directorDescriptions = directorDescription.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < directorDescriptions.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, directorDescriptions.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoDirectorArtwork(MediaQuery::Match match) { QString resourceBinding = directorResourceBinding(); QString artworkResourceBinding = "artworkResource"; QString propertyBinding = videoDirectorArtworkBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::artwork(), artworkResourceBinding); statement += QString("?%1 nie:url ?%2 . ").arg(artworkResourceBinding).arg(propertyBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoProducer(MediaQuery::Match match, const QString &producer, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoProducerBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoProducer(), producerResourceBinding()); statement += MediaQuery::hasProperty(producerResourceBinding(), MediaVocabulary::ncoFullname(), propertyBinding); if (!producer.isEmpty()) { QStringList producers = producer.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < producers.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, producers.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoProducerDescription(MediaQuery::Match match, const QString &producerDescription, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoProducerDescriptionBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoProducer(), producerResourceBinding()); statement += MediaQuery::hasProperty(producerResourceBinding(), MediaVocabulary::description(), propertyBinding); if (!producerDescription.isEmpty()) { QStringList producerDescriptions = producerDescription.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < producerDescriptions.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, producerDescriptions.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoProducerArtwork(MediaQuery::Match match) { QString resourceBinding = producerResourceBinding(); QString artworkResourceBinding = "artworkResource"; QString propertyBinding = videoProducerArtworkBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::artwork(), artworkResourceBinding); statement += QString("?%1 nie:url ?%2 . ").arg(artworkResourceBinding).arg(propertyBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoActor(MediaQuery::Match match, const QString &actor, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoActorBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoActor(), actorResourceBinding()); statement += MediaQuery::hasProperty(actorResourceBinding(), MediaVocabulary::ncoFullname(), propertyBinding); if (!actor.isEmpty()) { QStringList actors = actor.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < actors.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, actors.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoActorDescription(MediaQuery::Match match, const QString &actorDescription, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoActorDescriptionBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoActor(), actorResourceBinding()); statement += MediaQuery::hasProperty(actorResourceBinding(), MediaVocabulary::description(), propertyBinding); if (!actorDescription.isEmpty()) { QStringList actorDescriptions = actorDescription.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < actorDescriptions.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, actorDescriptions.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoActorArtwork(MediaQuery::Match match) { QString resourceBinding = actorResourceBinding(); QString artworkResourceBinding = "artworkResource"; QString propertyBinding = videoActorArtworkBinding(); QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::artwork(), artworkResourceBinding); statement += QString("?%1 nie:url ?%2 . ").arg(artworkResourceBinding).arg(propertyBinding); if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoAssistantDirector(MediaQuery::Match match, const QString &assistantDirector, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoAssistantDirectorBinding(); QString contactResourceBinding = "assistantDirectorResource"; QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoAssistantDirector(), contactResourceBinding); statement += MediaQuery::hasProperty(contactResourceBinding, MediaVocabulary::ncoFullname(), propertyBinding); if (!assistantDirector.isEmpty()) { QStringList assistantDirectors = assistantDirector.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < assistantDirectors.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, assistantDirectors.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::hasVideoCinematographer(MediaQuery::Match match, const QString &cinematographer, MediaQuery::Constraint constraint) { QString resourceBinding = mediaResourceBinding(); QString propertyBinding = videoCinematographerBinding(); QString contactResourceBinding = "cinematographerResource"; QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoCinematographer(), contactResourceBinding); statement += MediaQuery::hasProperty(contactResourceBinding, MediaVocabulary::ncoFullname(), propertyBinding); if (!cinematographer.isEmpty()) { QStringList cinematographers = cinematographer.split("|OR|"); statement += QString("FILTER ("); for (int i = 0; i < cinematographers.count(); i++) { statement += QString("%1 || ").arg(MediaQuery::filterConstraint(propertyBinding, cinematographers.at(i), constraint)); } statement.chop(4); statement += QString(") "); } if (match == MediaQuery::Optional) { statement = MediaQuery::addOptional(statement); } return statement; } QString MediaVocabulary::mediaResourceBinding() { return "r"; } QString MediaVocabulary::artistResourceBinding() { return "artistResource"; } QString MediaVocabulary::albumResourceBinding() { return "albumResource"; } QString MediaVocabulary::videoSeriesResourceBinding() { return "videoSeriesResource"; } QString MediaVocabulary::writerResourceBinding() { return "writerResource"; } QString MediaVocabulary::directorResourceBinding() { return "directorResource"; } QString MediaVocabulary::producerResourceBinding() { return "producerResource"; } QString MediaVocabulary::actorResourceBinding() { return "actorResource"; } QString MediaVocabulary::composerResourceBinding() { return "composerResource"; } QString MediaVocabulary::mediaResourceUrlBinding() { return "url"; } QString MediaVocabulary::titleBinding() { return "title"; } QString MediaVocabulary::tagBinding() { return "tag"; } QString MediaVocabulary::descriptionBinding() { return "description"; } QString MediaVocabulary::durationBinding() { return "duration"; } QString MediaVocabulary::lastPlayedBinding() { return "lastPlayed"; } QString MediaVocabulary::playCountBinding() { return "playCount"; } QString MediaVocabulary::artworkBinding() { return "artwork"; } QString MediaVocabulary::createdBinding() { return "created"; } QString MediaVocabulary::genreBinding() { return "genre"; } QString MediaVocabulary::releaseDateBinding() { return "releaseDate"; } QString MediaVocabulary::ratingBinding() { return "rating"; } QString MediaVocabulary::relatedToBinding() { return "relatedTo"; } QString MediaVocabulary::musicArtistBinding() { return "artist"; } QString MediaVocabulary::musicArtistNameBinding() { return "artist"; } QString MediaVocabulary::musicArtistDescriptionBinding() { return "artistDescription"; } QString MediaVocabulary::musicComposerNameBinding() { return "composer"; } QString MediaVocabulary::musicComposerDescriptionBinding() { return "composerDescription"; } QString MediaVocabulary::musicArtistArtworkBinding() { return "artistArtwork"; } QString MediaVocabulary::musicAlbumBinding() { return "album"; } QString MediaVocabulary::musicAlbumTitleBinding() { return "albumTitle"; } QString MediaVocabulary::musicAlbumYearBinding() { return "albumYearDate"; } QString MediaVocabulary::musicTrackNumberBinding() { return "trackNumber"; } QString MediaVocabulary::musicGenreBinding() { return "genre"; } QString MediaVocabulary::videoGenreBinding() { return "genre"; } QString MediaVocabulary::videoSeriesTitleBinding() { return "seriesTitle"; } QString MediaVocabulary::videoSeriesDescriptionBinding() { return "videoSeriesDescription"; } QString MediaVocabulary::videoSeriesArtworkBinding() { return "videoSeriesArtwork"; } QString MediaVocabulary::videoSynopsisBinding() { return "synopsis"; } QString MediaVocabulary::videoSeasonBinding() { return "season"; } QString MediaVocabulary::videoEpisodeNumberBinding() { return "episodeNumber"; } QString MediaVocabulary::videoAudienceRatingBinding() { return "audienceRating"; } QString MediaVocabulary::videoWriterBinding() { return "writer"; } QString MediaVocabulary::videoWriterDescriptionBinding() { return "writerDescription"; } QString MediaVocabulary::videoWriterArtworkBinding() { return "writerArtwork"; } QString MediaVocabulary::videoDirectorBinding() { return "director"; } QString MediaVocabulary::videoDirectorDescriptionBinding() { return "directorDescription"; } QString MediaVocabulary::videoDirectorArtworkBinding() { return "directorArtwork"; } QString MediaVocabulary::videoProducerBinding() { return "producer"; } QString MediaVocabulary::videoProducerDescriptionBinding() { return "producerDescription"; } QString MediaVocabulary::videoProducerArtworkBinding() { return "producerArtwork"; } QString MediaVocabulary::videoActorBinding() { return "actor"; } QString MediaVocabulary::videoActorDescriptionBinding() { return "actorDescription"; } QString MediaVocabulary::videoActorArtworkBinding() { return "actorArtwork"; } QString MediaVocabulary::videoCinematographerBinding() { return "cinematographer"; } QString MediaVocabulary::videoAssistantDirectorBinding() { return "assistantDirector"; } QString MediaVocabulary::resourceBindingForCategory(const QString & categoryType) { if (categoryType == "Artist") { return artistResourceBinding(); } else if (categoryType == "Album") { return albumResourceBinding(); } else if (categoryType == "TV Series") { return videoSeriesResourceBinding(); } else if (categoryType == "Actor") { return actorResourceBinding(); } else if (categoryType == "Director") { return directorResourceBinding(); } else if (categoryType == "Writer") { return writerResourceBinding(); } else if (categoryType == "Producer") { return producerResourceBinding(); } else { return QString(); } } QStringList MediaVocabulary::storageProcedure(QUrl mediaProperty) { if (mediaProperty == artwork()) { return QStringList() << QString("[Resource]::[Property]::[ResourceValue]") << QString("[ResourceValue]::[Type]::%1") .arg("http://http://www.semanticdesktop.org/ontologies/nfo#Image") << QString("[ResourceValue]::%1::[Value]") .arg("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url"); } else if (mediaProperty == musicArtist()) { if (m_musicVocabulary == nmm) { return QStringList() << QString("[Resource]::[Property]::[ResourceValue]") << QString("[ResourceValue]::[Type]::%1").arg(typeMusicArtist().toString()) << QString("[ResourceValue]::%1::[Value]").arg(musicArtistName().toString()); } else { return QStringList() << QString("[Resource]::[Property]::[Value]"); } } else if (mediaProperty == musicAlbum()) { if (m_musicVocabulary == nmm) { return QStringList() << QString("[Resource]::[Property]::[ResourceValue]") << QString("[ResourceValue]::[Type]::%1").arg(typeMusicAlbum().toString()) << QString("[ResourceValue]::%1::[Value]").arg(musicAlbumName().toString()); } else { return QStringList() << QString("[Resource]::[Property]::[Value]"); } } else if (mediaProperty == videoSeries()) { return QStringList() << QString("[Resource]::[Property]::[ResourceValue]") << QString("[ResourceValue]::[Type]::%1").arg(typeTVSeries().toString()) << QString("[ResourceValue]::%1::[Value]").arg(videoSeriesTitle().toString()); } else if (mediaProperty == videoWriter() || mediaProperty == videoDirector() || mediaProperty == videoAssistantDirector() || mediaProperty == videoProducer() || mediaProperty == videoActor() || mediaProperty == videoCinematographer() ) { return QStringList() << QString("[Resource]::[Property]::[ResourceValue]") << QString("[ResourceValue]::[Type]::%1").arg(typeNCOContact().toString()) << QString("[ResourceValue]::%1::[Value]").arg(ncoFullname().toString()); } else { return QStringList() << QString("[Resource]::[Property]::[Value]"); } } QString MediaVocabulary::fileUrl(const QString &resourceBinding) { return MediaQuery::addOptional(QString("?%1 nie:url ?%2 . ") .arg(resourceBinding) .arg(mediaResourceUrlBinding())); } bangarang-bangarang/src/platform/mediavocabulary.h000066400000000000000000000424361166760560600226750ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef MEDIAVOCABULARY_H #define MEDIAVOCABULARY_H #include #include "mediaquery.h" class MediaVocabulary { public: MediaVocabulary(); ~MediaVocabulary(); enum MediaVocabularyNamespace { xesam = Qt::UserRole + 1, nie = Qt::UserRole + 2, nmm = Qt::UserRole + 3, nid3 = Qt::UserRole + 4}; /*enum Constraint {Equal = 0, NotEqual = 1, Contains = 2, GreaterThan = 3, LessThan = 4, GreaterThanOrEqual = 5, LessThanOrEqual = 6}; enum Match {Required = 0, Optional = 1};*/ void setVocabulary(int vocabulary); void setAudioVocabulary(int vocabulary); void setMusicVocabulary(int vocabulary); void setVideoVocabulary(int vocabulary); int vocabulary(); int audioVocabulary(); int musicVocabulary(); int videoVocabulary(); QUrl mediaNamespace(int vocabulary); // Media types QUrl typeAudio(); QUrl typeAudioMusic(); QUrl typeAudioStream(); QUrl typeAudioFeed(); QUrl typeVideo(); QUrl typeVideoMovie(); QUrl typeVideoTVShow(); QUrl typeVideoFeed(); QUrl typeImage(); //Media-related types QUrl typeTVSeries(); QUrl typeMusicArtist(); QUrl typeMusicAlbum(); QUrl typeNCOContact(); //These properties are applicable to all media types QUrl title(); QUrl description(); QUrl duration(); QUrl lastPlayed(); QUrl playCount(); QUrl artwork(); QUrl created(); QUrl genre(); QUrl releaseDate(); QUrl rating(); QUrl ncoFullname(); QUrl tag(); QUrl relatedTo(); //These properties are applicable to Music QUrl musicArtist(); QUrl musicPerformer(); QUrl musicComposer(); QUrl musicArtistName(); QUrl musicAlbum(); QUrl musicAlbumName(); QUrl musicAlbumYear(); QUrl musicTrackNumber(); QUrl musicGenre(); //These properties are applicable to Movie and TV shows QUrl videoGenre(); QUrl videoSeries(); QUrl videoSeriesTitle(); QUrl videoSynopsis(); QUrl videoSeason(); QUrl videoEpisodeNumber(); QUrl videoAudienceRating(); QUrl videoWriter(); QUrl videoDirector(); QUrl videoAssistantDirector(); QUrl videoProducer(); QUrl videoActor(); QUrl videoCinematographer(); //SPARQL condition statements QString hasTypeAudio(MediaQuery::Match match = MediaQuery::Required); QString hasTypeAudioMusic(MediaQuery::Match match = MediaQuery::Required); QString hasTypeAudioStream(MediaQuery::Match match = MediaQuery::Required); QString hasTypeAudioFeed(MediaQuery::Match match = MediaQuery::Required); QString hasTypeAnyAudio(MediaQuery::Match match = MediaQuery::Required); QString hasTypeVideo(MediaQuery::Match match = MediaQuery::Required); QString hasTypeVideoMovie(MediaQuery::Match match = MediaQuery::Required); QString hasTypeVideoTVShow(MediaQuery::Match match = MediaQuery::Required); QString hasTypeVideoFeed(MediaQuery::Match match = MediaQuery::Required); QString hasTypeAnyVideo(MediaQuery::Match match = MediaQuery::Required); QString hasTypeImage(MediaQuery::Match match = MediaQuery::Required); QString hasTypeTVSeries(MediaQuery::Match match = MediaQuery::Required); QString hasTypeMusicArtist(MediaQuery::Match match = MediaQuery::Required); QString hasTypeMusicAlbum(MediaQuery::Match match = MediaQuery::Required); QString hasResource(const QString &uri); QString hasUrl(MediaQuery::Match match, const QString &Url); QString hasTitle(MediaQuery::Match match = MediaQuery::Required, const QString &title = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasTag(MediaQuery::Match match = MediaQuery::Required, const QString &tag = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasDescription(MediaQuery::Match match = MediaQuery::Required, const QString &description = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasResourceDescription(MediaQuery::Match match = MediaQuery::Required, const QString &description = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasDuration(MediaQuery::Match match = MediaQuery::Required, int duration = -2, MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasLastPlayed(MediaQuery::Match match = MediaQuery::Required, const QDateTime &lastPlayed = QDateTime(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasPlayCount(MediaQuery::Match match = MediaQuery::Required, int playCount = -1, MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasArtwork(MediaQuery::Match match = MediaQuery::Required); QString hasCreated(MediaQuery::Match match = MediaQuery::Required, const QDate &created = QDate(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasGenre(MediaQuery::Match match = MediaQuery::Required, const QString &description = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasReleaseDate(MediaQuery::Match match = MediaQuery::Required, const QDate &created = QDate(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasRating(MediaQuery::Match match = MediaQuery::Required, int rating = -1, MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasRelatedTo(const QString&resourceBinding, MediaQuery::Match match = MediaQuery::Required, const QUrl &related = QUrl(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasMusicAnyArtistName(MediaQuery::Match match = MediaQuery::Required, const QString &artistName = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasMusicAnyArtistDescription(MediaQuery::Match match = MediaQuery::Required, const QString &artistDescription = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasMusicArtistName(MediaQuery::Match match = MediaQuery::Required, const QString &artistName = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasMusicArtistDescription(MediaQuery::Match match = MediaQuery::Required, const QString &artistDescription = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasMusicArtistArtwork(MediaQuery::Match match = MediaQuery::Required); QString hasMusicComposerName(MediaQuery::Match match = MediaQuery::Required, const QString &composerName = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasMusicComposerDescription(MediaQuery::Match match = MediaQuery::Required, const QString &composerDescription = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasMusicComposerArtwork(MediaQuery::Match match = MediaQuery::Required); QString hasMusicAlbumTitle(MediaQuery::Match match = MediaQuery::Required, const QString &albumTitle = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasMusicAlbumYear(MediaQuery::Match match = MediaQuery::Required, int year = 0, MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasMusicTrackNumber(MediaQuery::Match match = MediaQuery::Required, int trackNumber = 0, MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoSeriesTitle(MediaQuery::Match match = MediaQuery::Required, const QString &seriesTitle = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoSeriesDescription(MediaQuery::Match match = MediaQuery::Required, const QString &seriesDescription = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoSeriesArtwork(MediaQuery::Match match = MediaQuery::Required); QString hasVideoSynopsis(MediaQuery::Match match = MediaQuery::Required, const QString &synopsis = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoSeason(MediaQuery::Match match = MediaQuery::Required, int season = 0, MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoEpisodeNumber(MediaQuery::Match match = MediaQuery::Required, int episodeNumber = 0, MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoAudienceRating(MediaQuery::Match match = MediaQuery::Required, const QString &audienceRating = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoWriter(MediaQuery::Match match = MediaQuery::Required, const QString &writer = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoWriterDescription(MediaQuery::Match match = MediaQuery::Required, const QString &writerDescription = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoWriterArtwork(MediaQuery::Match match = MediaQuery::Required); QString hasVideoDirector(MediaQuery::Match match = MediaQuery::Required, const QString &director = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoDirectorDescription(MediaQuery::Match match = MediaQuery::Required, const QString &directorDescription = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoDirectorArtwork(MediaQuery::Match match = MediaQuery::Required); QString hasVideoProducer(MediaQuery::Match match = MediaQuery::Required, const QString &producer = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoProducerDescription(MediaQuery::Match match = MediaQuery::Required, const QString &producerDescription = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoProducerArtwork(MediaQuery::Match match = MediaQuery::Required); QString hasVideoActor(MediaQuery::Match match = MediaQuery::Required, const QString &actor = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoActorDescription(MediaQuery::Match match = MediaQuery::Required, const QString &actorDescription = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoActorArtwork(MediaQuery::Match match = MediaQuery::Required); QString hasVideoAssistantDirector(MediaQuery::Match match = MediaQuery::Required, const QString &assistantDirector = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); QString hasVideoCinematographer(MediaQuery::Match match = MediaQuery::Required, const QString &cinematographer = QString(), MediaQuery::Constraint constraint = MediaQuery::Equal); //SPARQL binding names static QString mediaResourceBinding(); static QString mediaResourceUrlBinding(); static QString artistResourceBinding(); static QString composerResourceBinding(); static QString albumResourceBinding(); static QString videoSeriesResourceBinding(); static QString writerResourceBinding(); static QString directorResourceBinding(); static QString producerResourceBinding(); static QString actorResourceBinding(); static QString titleBinding(); static QString descriptionBinding(); static QString durationBinding(); static QString lastPlayedBinding(); static QString playCountBinding(); static QString artworkBinding(); static QString createdBinding(); static QString genreBinding(); static QString releaseDateBinding(); static QString ratingBinding(); static QString tagBinding(); static QString relatedToBinding(); static QString musicArtistBinding(); static QString musicArtistNameBinding(); static QString musicArtistDescriptionBinding(); static QString musicComposerNameBinding(); static QString musicComposerDescriptionBinding(); static QString musicArtistArtworkBinding(); static QString musicAlbumBinding(); static QString musicAlbumTitleBinding(); static QString musicAlbumYearBinding(); static QString musicTrackNumberBinding(); static QString musicGenreBinding(); static QString videoGenreBinding(); static QString videoSeriesTitleBinding(); static QString videoSeriesDescriptionBinding(); static QString videoSeriesArtworkBinding(); static QString videoSynopsisBinding(); static QString videoSeasonBinding(); static QString videoEpisodeNumberBinding(); static QString videoAudienceRatingBinding(); static QString videoWriterBinding(); static QString videoWriterDescriptionBinding(); static QString videoWriterArtworkBinding(); static QString videoDirectorBinding(); static QString videoDirectorDescriptionBinding(); static QString videoDirectorArtworkBinding(); static QString videoProducerBinding(); static QString videoProducerDescriptionBinding(); static QString videoProducerArtworkBinding(); static QString videoActorBinding(); static QString videoActorDescriptionBinding(); static QString videoActorArtworkBinding(); static QString videoAssistantDirectorBinding(); static QString videoCinematographerBinding(); static QString resourceBindingForCategory(const QString & categoryType); //RDF storage procedure lookup QStringList storageProcedure(QUrl mediaProperty); private: int m_vocabulary; int m_audioVocabulary; int m_videoVocabulary; int m_musicVocabulary; QUrl m_namespace; QUrl m_audioNameSpace; QUrl m_musicNameSpace; QUrl m_videoNameSpace; QString fileUrl(const QString &resourceBinding); }; #endif // MEDIAVOCABULARY_H bangarang-bangarang/src/platform/nepomukwriter/000077500000000000000000000000001166760560600222575ustar00rootroot00000000000000bangarang-bangarang/src/platform/nepomukwriter/CMakeLists.txt000066400000000000000000000010001166760560600250060ustar00rootroot00000000000000set(BangarangNepomukWriterSources main.cpp nepomukwriter.cpp # ../mediaitemmodel.cpp ../mediavocabulary.cpp ../mediaquery.cpp ) kde4_add_executable(bangarangnepomukwriter ${BangarangNepomukWriterSources}) target_link_libraries(bangarangnepomukwriter ${QT_QTCORE_LIBRARY} ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} ${NEPOMUK_LIBRARIES} ${SOPRANO_LIBRARIES} ) ########### install files ############### install(TARGETS bangarangnepomukwriter ${INSTALL_TARGETS_DEFAULT_ARGS}) bangarang-bangarang/src/platform/nepomukwriter/main.cpp000066400000000000000000000045711166760560600237160ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "nepomukwriter.h" #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include #include static KAboutData aboutData( "bangarangnepomukwriter", 0, KLocalizedString(), "2.0", KLocalizedString(), KAboutData::License_GPL_V3, ki18n("Copyright 2011, Andrew Lake"), KLocalizedString(), "" ); int main(int argc, char *argv[]) { QTextStream cout(stdout, QIODevice::WriteOnly); cout << "started nepomukwriter\n"; cout.flush(); KCmdLineArgs::init( argc, argv, &aboutData ); KCmdLineOptions options; options.add("+[URL]", ki18n( "File directive" )); KCmdLineArgs::addCmdLineOptions( options ); KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); KApplication application; bool nepomukInited = Nepomuk::ResourceManager::instance()->initialized(); if (!nepomukInited) { Nepomuk::ResourceManager::instance()->init(); nepomukInited = Nepomuk::ResourceManager::instance()->initialized(); } if (args->count() > 0 && nepomukInited) { QFile file(args->arg(0)); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { cout << QString("BangarangError:Couldn't open %1\n").arg(args->arg(0)); return 0; } NepomukWriter nepomukWriter; nepomukWriter.processJob(&file); } else { cout << "You didn't provide an argument OR Nepomuk is not active!\n"; } cout.flush(); return 0; } bangarang-bangarang/src/platform/nepomukwriter/nepomukwriter.cpp000066400000000000000000001160301166760560600256770ustar00rootroot00000000000000#include "../mediavocabulary.h" #include "../mediaquery.h" #include "nepomukwriter.h" #include #include #include #include #include NepomukWriter::NepomukWriter(QObject *parent) : QObject(parent) { } void NepomukWriter::processJob(QFile *jobFile) { //Parse job file and write each field value to nepomuk QTextStream in(jobFile); QHash fields; QString line; int count = 0; int processed = 0; while (!in.atEnd()) { if (!line.isEmpty()) { if (line.startsWith("#Count")) { count = line.split("=").at(1).trimmed().toInt(); } else if (line.startsWith("[") && line.endsWith("]")) { QString resourceUri = line.mid(1, line.length()-2); fields.insert("resourceUri",resourceUri); } else { int equalLocation = line.indexOf("="); QString field; QString value; if (equalLocation != -1) { field = line.left(equalLocation).trimmed(); value = line.mid(equalLocation+1).trimmed(); } if (field == "duration" || field == "trackNumber" || field == "year" || field == "season" || field == "episodeNumber" || field == "rating" || field == "playCount") { fields.insert(field, value.toInt()); } else if (field == "lastPlayed") { fields.insert(field, QDateTime::fromString(value, "yyyyMMddhhmmss")); } else { fields.insert(field, value); } } } line = in.readLine().trimmed(); //Update the resource once all provided fields for a resource is read. if ((line.startsWith("[") && line.endsWith("]")) || in.atEnd()) { if (fields.count() > 0) { writeToNepomuk(fields); fields.clear(); processed = processed + 1; if (count > 0) { outputMessage(Progress, QString("%1").arg(processed*100/count)); } } } } //Remove unused property resources removeUnusedPropertyResources(); jobFile->close(); //Consume job file when done jobFile->remove(); } void NepomukWriter::writeToNepomuk(QHash fields) { if (fields["removeInfo"].toString() == "true") { removeInfo(fields); } else { updateInfo(fields); } } void NepomukWriter::removeInfo(QHash fields) { MediaVocabulary mediaVocabulary = MediaVocabulary(); QString resourceUri = fields["resourceUri"].toString(); QString type = fields["type"].toString(); Nepomuk::Resource res = Nepomuk::Resource(QUrl::fromEncoded(resourceUri.toUtf8())); if (fields["removeInfo"].toString() == "true") { //Remove metadata for media from nepomuk store if (!res.exists()) { return; } if (type == "Audio") { // Update the media type QUrl audioType; if (fields["audioType"] == "Music") { audioType = mediaVocabulary.typeAudioMusic(); } else if (fields["audioType"] == "Audio Stream") { audioType = mediaVocabulary.typeAudioStream(); } else if (fields["audioType"] == "Audio Clip") { audioType = mediaVocabulary.typeAudio(); } if (res.hasType(audioType)) { removeType(res, audioType); } // Update the properties if (res.hasProperty(mediaVocabulary.title())){ res.removeProperty(mediaVocabulary.title()); } if (res.hasProperty(mediaVocabulary.description())) { res.removeProperty(mediaVocabulary.description()); } if (res.hasProperty(mediaVocabulary.artwork())) { res.removeProperty(mediaVocabulary.artwork()); } if (fields["audioType"] == "Music") { if (res.hasProperty(mediaVocabulary.musicArtist())) { res.removeProperty(mediaVocabulary.musicArtist()); } res.removeProperty(mediaVocabulary.musicPerformer()); res.removeProperty(mediaVocabulary.musicComposer());; if (res.hasProperty(mediaVocabulary.musicAlbum())) { res.removeProperty(mediaVocabulary.musicAlbum()); } if (res.hasProperty(mediaVocabulary.genre())) { res.removeProperty(mediaVocabulary.genre()); } if (res.hasProperty(mediaVocabulary.musicTrackNumber())) { res.removeProperty(mediaVocabulary.musicTrackNumber()); } if (res.hasProperty(mediaVocabulary.duration())) { res.removeProperty(mediaVocabulary.duration()); } if (res.hasProperty(mediaVocabulary.created())) { res.removeProperty(mediaVocabulary.created()); } if (res.hasProperty(mediaVocabulary.releaseDate())) { res.removeProperty(mediaVocabulary.releaseDate()); } } else if ((fields["audioType"] == "Audio Stream") || (fields["audioType"] == "Audio Clip")) { } } else if (type == "Video") { mediaVocabulary.setVocabulary(MediaVocabulary::nmm); //Update the media type if (res.hasType(mediaVocabulary.typeVideo())) { removeType(res, mediaVocabulary.typeVideo()); } if (res.hasType(mediaVocabulary.typeVideoMovie())) { removeType(res, mediaVocabulary.typeVideoMovie()); } if (res.hasType(mediaVocabulary.typeVideoTVShow())) { removeType(res, mediaVocabulary.typeVideoTVShow()); } //Update the properties if (res.hasProperty(mediaVocabulary.title())){ res.removeProperty(mediaVocabulary.title()); } if (res.hasProperty(mediaVocabulary.description())) { res.removeProperty(mediaVocabulary.description()); } if (res.hasProperty(mediaVocabulary.artwork())) { res.removeProperty(mediaVocabulary.artwork()); } if ((fields["videoType"] == "Movie") || (fields["videoType"] == "TV Show")) { if (res.hasProperty(mediaVocabulary.genre())) { res.removeProperty(mediaVocabulary.genre()); } if (res.hasProperty(mediaVocabulary.videoSynopsis())) { res.removeProperty(mediaVocabulary.videoSynopsis()); } if (res.hasProperty(mediaVocabulary.created())) { res.removeProperty(mediaVocabulary.created()); } if (res.hasProperty(mediaVocabulary.releaseDate())) { res.removeProperty(mediaVocabulary.releaseDate()); } if (res.hasProperty(mediaVocabulary.videoWriter())) { res.removeProperty(mediaVocabulary.videoWriter()); } if (res.hasProperty(mediaVocabulary.videoDirector())) { res.removeProperty(mediaVocabulary.videoDirector()); } if (res.hasProperty(mediaVocabulary.videoProducer())) { res.removeProperty(mediaVocabulary.videoProducer()); } if (res.hasProperty(mediaVocabulary.videoActor())) { res.removeProperty(mediaVocabulary.videoActor()); } if (fields["videoType"] == "TV Show") { if (res.hasProperty(mediaVocabulary.videoSeries())) { res.removeProperty(mediaVocabulary.videoSeries()); } if (res.hasProperty(mediaVocabulary.videoSeason())) { res.removeProperty(mediaVocabulary.videoSeason()); } if (res.hasProperty(mediaVocabulary.videoEpisodeNumber())) { res.removeProperty(mediaVocabulary.videoEpisodeNumber()); } } } } else if (type == "Category") { if (fields["categoryType"] == "Audio Feed") { removeType(res, mediaVocabulary.typeAudioFeed()); //res.remove(); } else if (fields["categoryType"] == "Video Feed") { removeType(res, mediaVocabulary.typeVideoFeed()); //res.remove(); } //Update the properties if (res.hasProperty(mediaVocabulary.title())){ res.removeProperty(mediaVocabulary.title()); } if (res.hasProperty(mediaVocabulary.description())) { res.removeProperty(mediaVocabulary.description()); } if (res.hasProperty(mediaVocabulary.artwork())) { res.removeProperty(mediaVocabulary.artwork()); } } outputMessage(InfoRemoved, QUrl::toPercentEncoding(resourceUri)); } } void NepomukWriter::updateInfo(QHash fields) { MediaVocabulary mediaVocabulary = MediaVocabulary(); QString resourceUri = fields["resourceUri"].toString(); QString type = fields["type"].toString(); QString url = fields["url"].toString(); //Find corresponding Nepomuk resource Nepomuk::Resource res; if (!resourceUri.isEmpty()) { res = Nepomuk::Resource(QUrl::fromEncoded(resourceUri.toUtf8())); } //If Nepomuk resource doesn't exist for local file, ask Strigi to index file first //TODO: Disabled currently since it does not appear to work. Investigate for Bangarang 2.1 /*if (!res.exists() && KUrl(url).isValid() && KUrl(url).isLocalFile()) { outputMessage(Debug, "ASKING STRIGI TO INDEX FILE:" + url); QDBusInterface strigi( "org.kde.nepomuk.services.nepomukstrigiservice", "/nepomukstrigiservice", "org.kde.nepomuk.Strigi"); if (strigi.isValid()) { strigi.call("indexFile", KUrl(url).path()); } res = Nepomuk::Resource(QUrl::fromEncoded(url.toUtf8())); outputMessage(Debug, QString("RESOURCE EXISTS:%1").arg(res.exists())); } else { outputMessage(Debug, QString("RESOURCE EXISTS:%1").arg(res.exists())); }*/ if (type == "Category" && fields["categoryType"] != "Audio Feed" && fields["categoryType"] != "Video Feed") { QUrl categoryProperty; if (fields["categoryType"] == "Artist") { categoryProperty = mediaVocabulary.musicArtist(); } else if (fields["categoryType"] == "Album") { categoryProperty = mediaVocabulary.musicAlbum(); } else if (fields["categoryType"] == "TV Series") { categoryProperty = mediaVocabulary.videoSeries(); } else if (fields["categoryType"] == "Actor") { categoryProperty = mediaVocabulary.videoActor(); } else if (fields["categoryType"] == "Director") { categoryProperty = mediaVocabulary.videoDirector(); } else if (fields["categoryType"] == "Writer") { categoryProperty = mediaVocabulary.videoWriter(); } else if (fields["categoryType"] == "Producer") { categoryProperty = mediaVocabulary.videoProducer(); } res = findPropertyResourceByTitle(categoryProperty, fields["title"].toString(), true); } // Update the media type { if (type == "Audio") { QUrl audioType; if (fields["audioType"] == "Music") { audioType = mediaVocabulary.typeAudioMusic(); if (!res.exists()) { res = Nepomuk::Resource(url, audioType); } removeType(res, mediaVocabulary.typeAudioStream()); removeType(res, mediaVocabulary.typeAudio()); } else if (fields["audioType"] == "Audio Stream") { audioType = mediaVocabulary.typeAudioStream(); if (!res.exists()) { res = Nepomuk::Resource(url, audioType); } removeType(res, mediaVocabulary.typeAudioMusic()); removeType(res, mediaVocabulary.typeAudio()); } else if (fields["audioType"] == "Audio Clip") { audioType = mediaVocabulary.typeAudio(); if (!res.exists()) { res = Nepomuk::Resource(url, audioType); } removeType(res, mediaVocabulary.typeAudioMusic()); removeType(res, mediaVocabulary.typeAudioStream()); } if (!res.hasType(audioType)) { res.addType(audioType); } } else if (type == "Video") { //Update the media type mediaVocabulary.setVocabulary(MediaVocabulary::nmm); QUrl videoType; if (fields["videoType"] == "Movie") { videoType = mediaVocabulary.typeVideoMovie(); if (!res.exists()) { res = Nepomuk::Resource(url, videoType); } removeType(res, mediaVocabulary.typeVideoTVShow()); removeType(res, mediaVocabulary.typeVideo()); } else if (fields["videoType"] == "TV Show") { videoType = mediaVocabulary.typeVideoTVShow(); if (!res.exists()) { res = Nepomuk::Resource(url, videoType); } removeType(res, mediaVocabulary.typeVideoMovie()); removeType(res, mediaVocabulary.typeVideo()); } else if (fields["videoType"] == "Video Clip") { videoType = mediaVocabulary.typeVideo(); if (!res.exists()) { res = Nepomuk::Resource(url, videoType); } removeType(res, mediaVocabulary.typeVideoMovie()); removeType(res, mediaVocabulary.typeVideoTVShow()); } if (!res.hasType(videoType)) { res.addType(videoType); } } else if (type == "Category") { if (fields["categoryType"] == "Audio Feed") { if (!res.exists()) { res = Nepomuk::Resource(url, mediaVocabulary.typeAudioFeed()); } else { if (!res.hasType(mediaVocabulary.typeAudioFeed())) { res.addType(mediaVocabulary.typeAudioFeed()); } } } else if (fields["categoryType"] == "Video Feed") { if (!res.exists()) { res = Nepomuk::Resource(url, mediaVocabulary.typeVideoFeed()); } else { if (!res.hasType(mediaVocabulary.typeVideoFeed())) { res.addType(mediaVocabulary.typeVideoFeed()); } } } } } //Set properties common to all types { if (fields.contains("description")) { QString description = fields["description"].toString(); res.setProperty(mediaVocabulary.description(), Nepomuk::Variant(description)); } if (fields.contains("artworkUrl")) { QString artworkUrl = fields["artworkUrl"].toString(); if (!artworkUrl.isEmpty()) { Nepomuk::Resource artworkRes(artworkUrl); if (!artworkRes.exists()) { artworkRes = Nepomuk::Resource(QUrl(artworkUrl), QUrl("http://http://www.semanticdesktop.org/ontologies/nfo#Image")); } res.setProperty(mediaVocabulary.artwork(), Nepomuk::Variant(artworkRes)); } else { if (res.hasProperty(mediaVocabulary.artwork())) { res.removeProperty(mediaVocabulary.artwork()); } } } if (!url.isEmpty()) { //the url may has changed (e.g. with audio streams), so update it in any case res.setProperty(QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url"), QUrl(url)); } if (fields.contains("title")) { QString title = fields["title"].toString(); res.setProperty(mediaVocabulary.title(), Nepomuk::Variant(title)); } if (fields.contains("rating")) { unsigned int rating = fields["rating"].toInt(); if (rating != res.rating()) { res.setRating(rating); } } if (fields.contains("playCount")) { int playCount = fields["playCount"].toInt(); res.setProperty(mediaVocabulary.playCount(), Nepomuk::Variant(playCount)); } if (fields.contains("duration")) { int duration = fields["duration"].toInt(); res.setProperty(mediaVocabulary.duration(), Nepomuk::Variant(duration)); } if (fields.contains("lastPlayed")) { Nepomuk::Variant value; QDateTime lastPlayed = fields["lastPlayed"].toDateTime(); if (lastPlayed.isValid()) { value = Nepomuk::Variant(lastPlayed); } res.setProperty(mediaVocabulary.lastPlayed(), value); } if (fields.contains("tags")) { QStringList tagStrList = fields["tags"].toString().split("||", QString::SkipEmptyParts); QList tags; QList currentTags = res.tags(); bool tagsChanged = false; for (int i = 0; i < tagStrList.count(); i++) { Nepomuk::Tag tag(tagStrList.at(i).trimmed()); tag.setLabel(tagStrList.at(i).trimmed()); tags.append(tag); if (currentTags.indexOf(tag) == -1) { tagsChanged = true; } } if (tags.count() != currentTags.count()) { tagsChanged = true; } if (tagsChanged) { res.setTags(tags); } } if (fields.contains("associatedImage")) { QString associatedImage = fields["associatedImage"].toString(); if (!associatedImage.isEmpty()) { Nepomuk::Resource associatedImageRes(associatedImage); if (!associatedImageRes.exists()) { associatedImageRes = Nepomuk::Resource(QUrl(associatedImage), QUrl("http://http://www.semanticdesktop.org/ontologies/nfo#Image")); } res.setProperty(mediaVocabulary.artwork(), Nepomuk::Variant(associatedImageRes)); } else { if (res.hasProperty(mediaVocabulary.artwork())) { res.removeProperty(mediaVocabulary.artwork()); } } } if (fields.contains("dataSourceUrl")) { QString dataSourceUrl = fields["dataSourceUrl"].toString(); QUrl property = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#dataSource"); if (!dataSourceUrl.isEmpty()) { Nepomuk::Resource dataSourceRes(dataSourceUrl); if (dataSourceRes.exists()) { res.setProperty(property, Nepomuk::Variant(dataSourceRes)); } } else { if (res.hasProperty(property)) { res.removeProperty(property); } } } if (fields.contains("isLogicalPartOfUrl")) { QString isLogicalPartOfUrl = fields["isLogicalPartOfUrl"].toString(); QUrl property = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#isLogicalPartOf"); if (!isLogicalPartOfUrl.isEmpty()) { Nepomuk::Resource isLogicalPartOfRes(isLogicalPartOfUrl); if (isLogicalPartOfRes.exists()) { res.setProperty(property, Nepomuk::Variant(isLogicalPartOfRes)); } } else { if (res.hasProperty(property)) { res.removeProperty(property); } } } if (fields.contains("relatedTo")) { QUrl relatedProperty("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#relatedTo"); QStringList related = fields["relatedTo"].toString().split("||", QString::SkipEmptyParts); res.removeProperty(relatedProperty); if (!related.isEmpty()) { QList relatedUrls; for (int i = 0; i < related.count(); i++) { outputMessage(Debug, related.at(i)); relatedUrls.append(QUrl(related.at(i))); } res.setProperty(relatedProperty, relatedUrls); } } } //Set Audio properties if (type == "Audio") { if (fields["audioType"] == "Music") { if (fields.contains("artist")) { QStringList artists = fields["artist"].toString().split("||", QString::SkipEmptyParts); res.removeProperty(mediaVocabulary.musicArtist()); if (!artists.isEmpty()) { QList artistResources; for (int i = 0; i < artists.count(); i++) { Nepomuk::Resource artistResource = findPropertyResourceByTitle(mediaVocabulary.musicArtist(), artists.at(i), true); artistResources.append(artistResource); } res.setProperty(mediaVocabulary.musicPerformer(), artistResources); } else { if (res.hasProperty(mediaVocabulary.musicPerformer())) { res.removeProperty(mediaVocabulary.musicPerformer()); } } } if (fields.contains("composer")) { QStringList composers = fields["composer"].toString().split("||", QString::SkipEmptyParts); if (!composers.isEmpty()) { QList composerResources; for (int i = 0; i < composers.count(); i++) { if (!composers.at(i).isEmpty()) { Nepomuk::Resource composerResource = findPropertyResourceByTitle(mediaVocabulary.musicComposer(), composers.at(i), true); composerResources.append(composerResource); } } res.setProperty(mediaVocabulary.musicComposer(), composerResources); } else { if (res.hasProperty(mediaVocabulary.musicComposer())) { res.removeProperty(mediaVocabulary.musicComposer()); } } } if (fields.contains("album")) { QString album = fields["album"].toString(); if (!album.isEmpty()) { Nepomuk::Resource albumResource = findPropertyResourceByTitle(mediaVocabulary.musicAlbum(), album, true); res.setProperty(mediaVocabulary.musicAlbum(), Nepomuk::Variant(albumResource)); } else { if (res.hasProperty(mediaVocabulary.musicAlbum())) { res.removeProperty(mediaVocabulary.musicAlbum()); } } } if (fields.contains("genre")) { QStringList genres = fields["genre"].toString().split("||", QString::SkipEmptyParts); res.setProperty(mediaVocabulary.genre(), variantListFromStringList(genres)); } if (fields.contains("trackNumber")) { int track = fields["trackNumber"].toInt(); if (track != 0) { res.setProperty(mediaVocabulary.musicTrackNumber(), Nepomuk::Variant(track)); } else { if (res.hasProperty(mediaVocabulary.musicTrackNumber())) { res.removeProperty(mediaVocabulary.musicTrackNumber()); } } } if (fields.contains("duration")) { int duration = fields["duration"].toInt(); if (duration != 0) { res.setProperty(mediaVocabulary.duration(), Nepomuk::Variant(duration)); } else { if (res.hasProperty(mediaVocabulary.duration())) { res.removeProperty(mediaVocabulary.duration()); } } } if (fields.contains("year")) { int year = fields["year"].toInt(); if (year != 0) { QDate releaseDate = QDate(year, 1, 1); res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate)); } else { if (res.hasProperty(mediaVocabulary.releaseDate())) { res.removeProperty(mediaVocabulary.releaseDate()); } } } } else if ((fields["audioType"] == "Audio Stream") || (fields["audioType"] == "Audio Clip")) { } } //Set Video properties if (type == "Video") { mediaVocabulary.setVocabulary(MediaVocabulary::nmm); if ((fields["videoType"] == "Movie") || (fields["videoType"] == "TV Show")) { if (fields.contains("genre")) { QStringList genres = fields["genre"].toString().split("||", QString::SkipEmptyParts); res.setProperty(mediaVocabulary.genre(), variantListFromStringList(genres)); } if (fields.contains("synopsis")) { QString synopsis = fields["synopsis"].toString(); res.setProperty(mediaVocabulary.videoSynopsis(), Nepomuk::Variant(synopsis)); } if (fields.contains("year")) { int year = fields["year"].toInt(); if (year != 0) { QDate releaseDate = QDate(year, 1, 1); res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate)); } else { if (res.hasProperty(mediaVocabulary.releaseDate())) { res.removeProperty(mediaVocabulary.releaseDate()); } } } if (fields.contains("releaseDate")) { Nepomuk::Variant value; QDate releaseDate = fields["releaseDate"].toDate(); if (releaseDate.isValid()) { value = Nepomuk::Variant(releaseDate); } res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate)); } if (fields.contains("writer")) { QStringList writers = fields["writer"].toString().split("||", QString::SkipEmptyParts); if (!writers.isEmpty()) { QList writerResources; for (int i = 0; i < writers.count(); i++) { Nepomuk::Resource writerResource = findPropertyResourceByTitle(mediaVocabulary.videoWriter(), writers.at(i), true); writerResources.append(writerResource); } res.setProperty(mediaVocabulary.videoWriter(), writerResources); } else { if (res.hasProperty(mediaVocabulary.videoWriter())) { res.removeProperty(mediaVocabulary.videoWriter()); } } } if (fields.contains("director")) { QStringList directors = fields["director"].toString().split("||", QString::SkipEmptyParts); if (!directors.isEmpty()) { QList directorResources; for (int i = 0; i < directors.count(); i++) { Nepomuk::Resource directorResource = findPropertyResourceByTitle(mediaVocabulary.videoDirector(), directors.at(i), true); directorResources.append(directorResource); } res.setProperty(mediaVocabulary.videoDirector(), directorResources); } else { if (res.hasProperty(mediaVocabulary.videoDirector())) { res.removeProperty(mediaVocabulary.videoDirector()); } } } if (fields.contains("producer")) { QStringList producers = fields["producer"].toString().split("||", QString::SkipEmptyParts); if (!producers.isEmpty()) { QList producerResources; for (int i = 0; i < producers.count(); i++) { Nepomuk::Resource producerResource = findPropertyResourceByTitle(mediaVocabulary.videoProducer(), producers.at(i), true); producerResources.append(producerResource); } res.setProperty(mediaVocabulary.videoProducer(), producerResources); } else { if (res.hasProperty(mediaVocabulary.videoProducer())) { res.removeProperty(mediaVocabulary.videoProducer()); } } } if (fields.contains("actor")) { QStringList actors = fields["actor"].toString().split("||", QString::SkipEmptyParts); if (!actors.isEmpty()) { QList actorResources; for (int i = 0; i < actors.count(); i++) { Nepomuk::Resource actorResource = findPropertyResourceByTitle(mediaVocabulary.videoActor(), actors.at(i), true); actorResources.append(actorResource); } res.setProperty(mediaVocabulary.videoActor(), actorResources); } else { if (res.hasProperty(mediaVocabulary.videoActor())) { res.removeProperty(mediaVocabulary.videoActor()); } } } if (fields["videoType"] == "TV Show") { if (fields.contains("seriesName")) { QString seriesName = fields["seriesName"].toString(); if (!seriesName.isEmpty()) { Nepomuk::Resource seriesResource = findPropertyResourceByTitle(mediaVocabulary.videoSeries(), seriesName, true); res.setProperty(mediaVocabulary.videoSeries(), Nepomuk::Variant(seriesResource)); } else { if (res.hasProperty(mediaVocabulary.videoSeries())) { res.removeProperty(mediaVocabulary.videoSeries()); } } } if (fields.contains("season")) { int season = fields["season"].toInt(); if (season != 0) { res.setProperty(mediaVocabulary.videoSeason(), Nepomuk::Variant(season)); } else { if (res.hasProperty(mediaVocabulary.videoSeason())) { res.removeProperty(mediaVocabulary.videoSeason()); } } } if (fields.contains("episodeNumber")) { int episodeNumber = fields["episodeNumber"].toInt(); if (episodeNumber != 0) { res.setProperty(mediaVocabulary.videoEpisodeNumber(), Nepomuk::Variant(episodeNumber)); } else { if (res.hasProperty(mediaVocabulary.videoEpisodeNumber())) { res.removeProperty(mediaVocabulary.videoEpisodeNumber()); } } } } } } outputMessage(InfoUpdated, QUrl::toPercentEncoding(url)); } void NepomukWriter::removeType(Nepomuk::Resource res, QUrl mediaType) { QList types = res.types(); for (int i = 0; i < types.count(); i++) { if (types.at(i).toString() == mediaType.toString()) { types.removeAt(i); break; } } res.setTypes(types); } void NepomukWriter::outputMessage(MessageType messageType, QString urlOrProgressOrMessage) { QTextStream cout(stdout, QIODevice::WriteOnly); if (messageType == InfoRemoved) { cout << "BangrangSignal:urlInfoRemoved:" << urlOrProgressOrMessage << "\n"; } else if (messageType == InfoUpdated) { cout << "BangarangSignal:sourceInfoUpdated:" << urlOrProgressOrMessage << "\n"; } else if (messageType == Progress) { cout << "BangarangProgress:" << urlOrProgressOrMessage << "\n"; } else if (messageType == Message) { cout << "BangarangMessage:" << urlOrProgressOrMessage << "\n"; } else if (messageType == Debug) { cout << "BangarangDebug:" << urlOrProgressOrMessage << "\n"; } else if (messageType == Error) { cout << "BangarangError:" << urlOrProgressOrMessage << "\n"; } cout.flush(); } Nepomuk::Resource NepomukWriter::findPropertyResourceByTitle(QUrl property, QString title, bool createIfMissing) { //First look in cache to see if this resource was previously found QString cacheKey = QString("%1:%2").arg(property.toString()).arg(title); if (m_propertyResourceCache.contains(cacheKey)) { return Nepomuk::Resource::fromResourceUri(m_propertyResourceCache.value(cacheKey)); } //Query nepomuk store for resource MediaVocabulary mediaVocabulary; QUrl resourceProperty; QUrl resourceType; if (property == mediaVocabulary.musicArtist()) { resourceProperty = mediaVocabulary.musicArtistName(); resourceType = mediaVocabulary.typeMusicArtist(); } else if (property == mediaVocabulary.musicComposer()) { resourceProperty = mediaVocabulary.musicArtistName(); resourceType = mediaVocabulary.typeMusicArtist(); } else if (property == mediaVocabulary.musicAlbum()) { resourceProperty = mediaVocabulary.musicAlbumName(); resourceType = mediaVocabulary.typeMusicAlbum(); } else if (property == mediaVocabulary.videoSeries()) { resourceProperty = mediaVocabulary.videoSeriesTitle(); resourceType = mediaVocabulary.typeTVSeries(); } else if (property == mediaVocabulary.videoWriter() || property == mediaVocabulary.videoDirector() || property == mediaVocabulary.videoAssistantDirector() || property == mediaVocabulary.videoProducer() || property == mediaVocabulary.videoActor() || property == mediaVocabulary.videoCinematographer() ) { resourceProperty = mediaVocabulary.ncoFullname(); resourceType = mediaVocabulary.typeNCOContact(); } QString resourceBinding = "pres"; QString valueBinding = "title"; QString typeBinding = "type"; MediaQuery query; QStringList bindings; bindings.append(resourceBinding); bindings.append(typeBinding); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(MediaQuery::hasProperty(resourceBinding, resourceProperty, valueBinding)); query.addCondition(MediaQuery::addOptional(MediaQuery::hasProperty(resourceBinding, Soprano::Vocabulary::RDF::type(), typeBinding))); query.startFilter(); query.addFilterConstraint(valueBinding, title, MediaQuery::Equal); query.endFilter(); query.endWhere(); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); KUrl propertyResource; QUrl type; while( it.next() ) { propertyResource = it.binding(resourceBinding).uri(); type = it.binding(typeBinding).uri(); if (!type.isEmpty() && type == resourceType) { break; //There should only be one resource of the specified type with the specified title. } } if (!propertyResource.isEmpty()) { m_propertyResourceCache[cacheKey] = propertyResource; Nepomuk::Resource resource; resource = Nepomuk::Resource::fromResourceUri(propertyResource); //If found resource has no type, assign the correct type and use it. if (type.isEmpty()) { resource.addType(resourceType); } return resource; } else if (createIfMissing){ Nepomuk::Resource resource; resource.setProperty(resourceProperty, Nepomuk::Variant(title)); resource.addType(resourceType); m_propertyResourceCache[cacheKey] = resource.resourceUri(); return resource; } else { return Nepomuk::Resource(); } } void NepomukWriter::removeUnusedPropertyResources() { outputMessage(Message, i18n("Identifying unused resources...")); MediaVocabulary mediaVocabulary; QString resourceBinding = "pres"; QString playableResourceBinding = "r"; QString playableResourceProperty = "p"; MediaQuery query; QStringList bindings; bindings.append(resourceBinding); bindings.append("name"); query.select(bindings, MediaQuery::Distinct); query.startWhere(); QString typeUnion = QString("{%1} UNION {%2} UNION {%3} UNION {%4} ") .arg(MediaQuery::hasType(resourceBinding, mediaVocabulary.typeMusicArtist())) .arg(MediaQuery::hasType(resourceBinding, mediaVocabulary.typeMusicAlbum())) .arg(MediaQuery::hasType(resourceBinding, mediaVocabulary.typeTVSeries())) .arg(MediaQuery::hasType(resourceBinding, mediaVocabulary.typeNCOContact())); query.addCondition(typeUnion); query.addCondition(MediaQuery::addOptional(MediaQuery::hasProperty(resourceBinding, mediaVocabulary.musicArtistName(), "name"))); query.addCondition(MediaQuery::addOptional(QString("?%1 ?%2 ?%3 . ") .arg(playableResourceBinding) .arg(playableResourceProperty) .arg(resourceBinding))); query.startFilter(); query.addFilterConstraint(playableResourceProperty, QString(), MediaQuery::NotBound); query.endFilter(); query.endWhere(); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); outputMessage(Message, i18n("Tidying up unused resources...")); while( it.next() ) { QUrl propertyResource = it.binding(resourceBinding).uri(); Nepomuk::Resource resource = Nepomuk::Resource::fromResourceUri(propertyResource); QString name = it.binding("name").literal().toString().trimmed(); outputMessage(Message, i18n("Tidying up unused resources: %1", name)); resource.remove(); } } QList NepomukWriter::variantListFromStringList(const QStringList &stringList) { QList variantList; for (int i = 0; i < stringList.count(); i++) { variantList.append(Nepomuk::Variant(stringList.at(i))); } return variantList; } bangarang-bangarang/src/platform/nepomukwriter/nepomukwriter.h000066400000000000000000000024351166760560600253470ustar00rootroot00000000000000#ifndef NEPOMUKWRITER_H #define NEPOMUKWRITER_H #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include class NepomukWriter : public QObject { Q_OBJECT public: enum MessageType {InfoRemoved = 1, InfoUpdated = 2, Progress = 3, Message = 4, Debug = 5, Error = 6}; explicit NepomukWriter(QObject *parent = 0); void processJob(QFile *jobFile); signals: public slots: private: QHash m_propertyResourceCache; void writeToNepomuk(QHash fields); void removeInfo(QHash fields); void updateInfo(QHash fields); void removeType(Nepomuk::Resource res, QUrl mediaType); void outputMessage(MessageType messageType, QString urlOrProgressOrMessage = QString()); Nepomuk::Resource findPropertyResourceByTitle(QUrl property, QString title, bool createIfMissing = false); void removeUnusedPropertyResources(); QList variantListFromStringList(const QStringList &stringList); }; #endif // NEPOMUKWRITER_H bangarang-bangarang/src/platform/ontologyupdater.cpp000066400000000000000000000501261166760560600233130ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "ontologyupdater.h" #include "mediavocabulary.h" #include "mediaquery.h" #include "utilities/utilities.h" #include #include #include #include #include #include #include #include #include #include #include OntologyUpdater::OntologyUpdater(QObject * parent) : QObject(parent) { } OntologyUpdater::~OntologyUpdater() { } void OntologyUpdater::start() { QApplication::processEvents(); Soprano::Model *m_mainModel; bool m_nepomukInited = Utilities::nepomukInited(); if (m_nepomukInited) { m_mainModel = Nepomuk::ResourceManager::instance()->mainModel(); } else { return; } m_stopUpdate = false; MediaVocabulary mediaVocabulary; //Update audio QString queryPrefix = QString("PREFIX xesam: <%1> " "PREFIX rdf: <%2> " "PREFIX xls: <%3> " "PREFIX nmm: " "PREFIX nie: " "PREFIX nfo: ") .arg(Soprano::Vocabulary::Xesam::xesamNamespace().toString()) .arg(Soprano::Vocabulary::RDF::rdfNamespace().toString()) .arg(Soprano::Vocabulary::XMLSchema::xsdNamespace().toString()); QString queryStr = queryPrefix + QString("SELECT ?r " "WHERE { {?r rdf:type } " "UNION " "{?r rdf:type } " "UNION " "{?r rdf:type } " "UNION " "{?r rdf:type } " "UNION " "{?r rdf:type <%1>} " "UNION " "{?r rdf:type <%2>} " "UNION " "{?r rdf:type <%3>} }") .arg(mediaVocabulary.typeAudio().toString()) .arg(mediaVocabulary.typeAudioMusic().toString()) .arg(mediaVocabulary.typeAudioStream().toString()); Soprano::QueryResultIterator it = m_mainModel->executeQuery(queryStr, Soprano::Query::QueryLanguageSparql); emit infoMessage(i18n("Updating audio types and properties
0 items updated...")); QApplication::processEvents(); int i = 0; while( it.next() && !m_stopUpdate) { QApplication::processEvents(); i++; Nepomuk::Resource resource = Nepomuk::Resource(it.binding("r").uri()); //Update types QUrl type = QUrl("http://www.semanticdesktop.org/ontologies/nfo#Audio"); if (resource.hasType(type)) { removeType(resource, type); if (!resource.hasType(mediaVocabulary.typeAudio())) { resource.addType(mediaVocabulary.typeAudio()); } } type = QUrl("http://www.semanticdesktop.org/ontologies/nmm#MusicPiece"); if (resource.hasType(type)) { removeType(resource, type); if (!resource.hasType(mediaVocabulary.typeAudioMusic())) { resource.addType(mediaVocabulary.typeAudioMusic()); } //Update properties QUrl property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#musicAlbum"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.musicAlbum(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#trackNumber"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.musicTrackNumber(), value); } } type = QUrl("http://www.semanticdesktop.org/ontologies/nmm#DigitalRadio"); if (resource.hasType(type)) { removeType(resource, type); if (!resource.hasType(mediaVocabulary.typeAudioStream())) { resource.addType(mediaVocabulary.typeAudioStream()); } } type = QUrl("http://www.semanticdesktop.org/ontologies/nmm#MusicAlbum"); if (resource.hasType(type)) { removeType(resource, type); if (!resource.hasType(mediaVocabulary.typeMusicAlbum())) { resource.addType(mediaVocabulary.typeMusicAlbum()); } } //Update common properties QUrl property = QUrl("http://www.semanticdesktop.org/ontologies/nfo#duration"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.duration(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#artwork"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.artwork(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#genre"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.genre(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#releaseDate"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.releaseDate(), value); } property = Soprano::Vocabulary::Xesam::useCount(); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.playCount(), value); } property = Soprano::Vocabulary::Xesam::lastUsed(); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.lastPlayed(), value); } emit infoMessage(i18n("Updating audio types and properties
%1 audio items done...", i)); QApplication::processEvents(); } //Update video queryStr = queryPrefix + QString("SELECT ?r " "WHERE { {?r rdf:type } " "UNION " "{?r rdf:type } " "UNION " "{?r rdf:type } " "UNION " "{?r rdf:type } " "UNION " "{?r rdf:type <%1>} " "UNION " "{?r rdf:type <%2>} " "UNION " "{?r rdf:type <%3>} }") .arg(mediaVocabulary.typeVideo().toString()) .arg(mediaVocabulary.typeVideoMovie().toString()) .arg(mediaVocabulary.typeVideoTVShow().toString()); it = m_mainModel->executeQuery(queryStr, Soprano::Query::QueryLanguageSparql); emit infoMessage(i18n("Updating audio types and properties
0 items updated...")); QApplication::processEvents(); i = 0; while( it.next() && !m_stopUpdate) { QApplication::processEvents(); i++; Nepomuk::Resource resource = Nepomuk::Resource(it.binding("r").uri()); //Update types QUrl type = QUrl("http://www.semanticdesktop.org/ontologies/nfo#Video"); if (resource.hasType(type)) { removeType(resource, type); if (!resource.hasType(mediaVocabulary.typeVideo())) { resource.addType(mediaVocabulary.typeVideo()); } } type = QUrl("http://www.semanticdesktop.org/ontologies/nmm#Movie"); if (resource.hasType(type)) { removeType(resource, type); if (!resource.hasType(mediaVocabulary.typeVideoMovie())) { resource.addType(mediaVocabulary.typeVideoMovie()); } //Update properties QUrl property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#synopsis"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoSynopsis(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#writer"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoWriter(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#actor"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoActor(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#director"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoDirector(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#producer"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoProducer(), value); } } type = QUrl("http://www.semanticdesktop.org/ontologies/nmm#TVShow"); if (resource.hasType(type)) { removeType(resource, type); if (!resource.hasType(mediaVocabulary.typeVideoTVShow())) { resource.addType(mediaVocabulary.typeVideoTVShow()); } //Update properties QUrl property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#series"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoSeries(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#synopsis"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoSynopsis(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#season"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoSeason(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#episodeNumber"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoEpisodeNumber(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#writer"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoWriter(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#actor"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoActor(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#director"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoDirector(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#producer"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.videoProducer(), value); } } type = QUrl("http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#TVSeries"); if (resource.hasType(type)) { removeType(resource, type); if (!resource.hasType(mediaVocabulary.typeTVSeries())) { resource.addType(mediaVocabulary.typeTVSeries()); } } //Update common properties QUrl property = QUrl("http://www.semanticdesktop.org/ontologies/nfo#duration"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.duration(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#artwork"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.artwork(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#genre"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.genre(), value); } property = QUrl("http://www.semanticdesktop.org/ontologies/nmm#releaseDate"); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.releaseDate(), value); } property = Soprano::Vocabulary::Xesam::useCount(); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.playCount(), value); } property = Soprano::Vocabulary::Xesam::lastUsed(); if (resource.hasProperty(property)) { Nepomuk::Variant value = resource.property(property); resource.removeProperty(property); resource.setProperty(mediaVocabulary.lastPlayed(), value); } emit infoMessage(i18n("Updating video types and properties
%1 video items done...", i)); QApplication::processEvents(); } //Fix screwed up properties MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.ratingBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasRating(MediaQuery::Required, 10, MediaQuery::GreaterThan)); query.endWhere(); it = m_mainModel->executeQuery(query.query(), Soprano::Query::QueryLanguageSparql); emit infoMessage(i18n("Updating audio types and properties
0 items updated...")); QApplication::processEvents(); i = 0; while( it.next() && !m_stopUpdate) { QApplication::processEvents(); i++; Nepomuk::Resource resource = Nepomuk::Resource(it.binding("r").uri()); QUrl property = QUrl("http://www.semanticdesktop.org/ontologies/2007/08/15/nao#numericRating"); if (resource.hasProperty(property)) { int rating = resource.property(property).toInt(); if (rating > 10) { resource.removeProperty(property); } } emit infoMessage(i18n("Cleaning up erroneous audio properties
%1 audio items done...", i)); QApplication::processEvents(); } MediaQuery query1; bindings.clear(); bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.ratingBinding()); query1.select(bindings, MediaQuery::Distinct); query1.startWhere(); query1.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query1.addCondition(mediaVocabulary.hasRating(MediaQuery::Required, 10, MediaQuery::GreaterThan)); query1.endWhere(); it = m_mainModel->executeQuery(query.query(), Soprano::Query::QueryLanguageSparql); emit infoMessage(i18n("Updating audio types and properties
0 items updated...")); QApplication::processEvents(); i = 0; while( it.next() && !m_stopUpdate) { QApplication::processEvents(); i++; Nepomuk::Resource resource = Nepomuk::Resource(it.binding("r").uri()); QUrl property = QUrl("http://www.semanticdesktop.org/ontologies/2007/08/15/nao#numericRating"); if (resource.hasProperty(property)) { int rating = resource.property(property).toInt(); if (rating > 10) { resource.removeProperty(property); } } emit infoMessage(i18n("Cleaning up erroneous video properties
%1 video items done...", i)); QApplication::processEvents(); } if (!m_stopUpdate) { emit infoMessage(i18n("Update complete.")); } else { emit infoMessage(i18n("Update stopped.")); } emit done(); } void OntologyUpdater::stopUpdate() { m_stopUpdate = true; } void OntologyUpdater::removeType(Nepomuk::Resource res, QUrl mediaType) { QList types = res.types(); for (int i = 0; i < types.count(); i++) { if (types.at(i).toString() == mediaType.toString()) { types.removeAt(i); break; } } res.setTypes(types); } bangarang-bangarang/src/platform/ontologyupdater.h000066400000000000000000000035401166760560600227560ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef ONTOLOGYUPDATER_H #define ONTOLOGYUPDATER_H #include #include /* This class is used to update ontology of the types and properties used to * store media data in nepomuk. Bangarang may be released using draft ontologies * to store media data in nepomuk. When these ontologies are finally released, * they may differ from the draft. This class is intended to be updated, along with * MediaVocabulary, to reflect the released ontology and provide a mechanism to * update existing nepomuk media data to the match the released ontology. */ class OntologyUpdater : public QObject { Q_OBJECT public: /** * Constructor */ OntologyUpdater(QObject *parent); /** * Destructor */ ~OntologyUpdater(); public slots: void start(); void stopUpdate(); signals: void infoMessage(QString message); void done(); private: void removeType(Nepomuk::Resource res, QUrl mediaType); bool m_stopUpdate; }; #endif // ONTOLOGYUPDATER_H bangarang-bangarang/src/platform/playlist.cpp000066400000000000000000001127501166760560600217170ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #include "playlist.h" #include "mediaitemmodel.h" #include "utilities/utilities.h" #include "mediavocabulary.h" #include "mediaindexer.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include Playlist::Playlist(QObject * parent, Phonon::MediaObject * mediaObject) : QObject(parent) { m_parent = parent; m_mediaController = NULL; m_currentPlaylist = new MediaItemModel(this); m_currentPlaylist->setSuppressNoResultsMessage(true); m_nowPlaying = new MediaItemModel(this); m_nowPlaying->setSuppressTooltip(true); m_nowPlaying->setSuppressNoResultsMessage(true); m_queue = new MediaItemModel(this); m_queue->setSuppressNoResultsMessage(true); playWhenPlaylistChanges = false; m_shuffle = false; m_repeat = false; m_queueDepth = 10; m_state = Playlist::Finished; m_hadVideo = false; m_notificationRestrictions = 0; m_filterProxyModel = new MediaSortFilterProxyModel(); m_playbackInfoChecks = 0; m_powerManagementCookie = -1; setMediaObject(mediaObject); m_nepomukInited = Utilities::nepomukInited(); if (m_nepomukInited) { m_mediaIndexer = new MediaIndexer(this); } connect(m_currentPlaylist, SIGNAL(mediaListChanged()), this, SLOT(playlistChanged())); connect(m_currentPlaylist, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(playlistModelItemChanged(QStandardItem*))); } Playlist::~Playlist() { delete m_notificationRestrictions; } MediaItemModel * Playlist::playlistModel() { return m_currentPlaylist; } MediaItemModel * Playlist::queueModel() { return m_queue; } MediaItemModel * Playlist::nowPlayingModel() { return m_nowPlaying; } Phonon::MediaObject * Playlist::mediaObject() { return m_mediaObject; } //---------------------------------------- //--- Primary playback control methods --- //---------------------------------------- void Playlist::playItemAt(int row, Model model) { bool isQueue = (model == QueueModel); MediaItem nextMediaItem = isQueue ? m_queue->mediaItemAt(row) : m_currentPlaylist->mediaItemAt(row); if (!isQueue) { nextMediaItem.playlistIndex = row; } nextMediaItem.nowPlaying = true; //Update Queue Model if (!m_shuffle) { //Just build a new queue from the row of the item in the playlist buildQueueFrom(nextMediaItem.playlistIndex); } else { int rowInQueue = isQueue ? row : m_queue->rowOfUrl(nextMediaItem.url); //Add currently playing item to history if (rowInQueue > 0 && m_nowPlaying->rowCount() > 0) { if (m_nowPlaying->mediaItemAt(0).type == "Audio" || m_nowPlaying->mediaItemAt(0).type == "Video") { int nowPlayingIndex = m_nowPlaying->mediaItemAt(0).playlistIndex; m_playlistIndicesHistory.append(nowPlayingIndex); m_playlistUrlHistory.append(m_nowPlaying->mediaItemAt(0).url); if (m_queue->rowCount() > 1) { m_queue->removeMediaItemAt(0); rowInQueue--; } } } //Remove requested item from history bool inHistory = (m_playlistIndicesHistory.indexOf(nextMediaItem.playlistIndex) != -1); if ( inHistory ) { //remove from history int idx = m_playlistIndicesHistory.indexOf(row); m_playlistIndicesHistory.removeAt(idx); m_playlistUrlHistory.removeAt(idx); } //Place requested item at front of queue QList queueMediaList = m_queue->mediaList(); if ( rowInQueue > 0 ) { //in queue, but not at first place, so move it queueMediaList.move(rowInQueue, 0); } else if (rowInQueue < 0) { //not in queue, so add it at first place queueMediaList.insert(0, nextMediaItem); if (queueMediaList.count() > m_queueDepth) { queueMediaList.removeLast(); } } //else it is already at first place in the queue m_queue->clearMediaListData(); m_queue->loadMediaList(queueMediaList, true); //Fill out queue shuffle(); } //Play media Item m_mediaObject->clearQueue(); m_currentStream.clear(); QString subType; if (nextMediaItem.type == "Audio") { subType = nextMediaItem.fields["audioType"].toString(); } else if(nextMediaItem.type == "Video") { subType = nextMediaItem.fields["videoType"].toString(); } m_currentUrl = nextMediaItem.url; bool isDiscTitle = Utilities::isDisc( nextMediaItem.url ); if (isDiscTitle) { Solid::Device device = Solid::Device( Utilities::deviceUdiFromUrl(nextMediaItem.url) ); if (!device.isValid()) { stop(); return; } const Solid::Block* block = device.as(); Phonon::DiscType discType = (subType == "CD Track") ? Phonon::Cd : Phonon::Dvd; Phonon::MediaSource src = Phonon::MediaSource(discType, block->device()); int title = nextMediaItem.fields["trackNumber"].toInt(); if (m_mediaObject->currentSource().discType() != src.discType() || m_mediaObject->currentSource().deviceName() != src.deviceName()) { m_mediaObject->setCurrentSource(src); } if (title != -1) { m_mediaController->setCurrentTitle(title); m_mediaController->setAutoplayTitles(true); } m_mediaObject->play(); } else if (subType == "Audio Stream") { m_currentStream = nextMediaItem.url; m_streamListUrls.clear(); if (Utilities::isPls(nextMediaItem.url) || Utilities::isM3u(nextMediaItem.url)) { QList streamList = Utilities::mediaListFromSavedList(nextMediaItem); for (int i = 0; i < streamList.count(); i++) { m_streamListUrls << streamList.at(i).url; if (i == 0) { m_currentUrl = streamList.at(i).url; } else { m_mediaObject->enqueue(Phonon::MediaSource(QUrl::fromPercentEncoding(streamList.at(i).url.toUtf8()))); } } } else { m_streamListUrls << nextMediaItem.url; } m_mediaObject->setCurrentSource(Phonon::MediaSource(QUrl::fromPercentEncoding(m_currentUrl.toUtf8()))); m_mediaObject->play(); } else { m_mediaObject->setCurrentSource(Phonon::MediaSource(QUrl::fromEncoded(m_currentUrl.toUtf8()))); m_mediaObject->play(); } m_state = Playlist::Playing; } void Playlist::playNext() { if (m_mediaObject->state() == Phonon::PlayingState || m_mediaObject->state() == Phonon::PausedState || m_mediaObject->state() == Phonon::LoadingState || m_mediaObject->state() == Phonon::ErrorState) { //Add currently playing item to history if (m_queue->rowCount() > 1) { playItemAt(1, Playlist::QueueModel); } } } void Playlist::playPrevious() { if (m_mediaObject->state() == Phonon::PlayingState || m_mediaObject->state() == Phonon::PausedState || m_mediaObject->state() == Phonon::LoadingState) { if (m_playlistIndicesHistory.count() > 0) { //Get previously played item and remove from history int previousRow = m_playlistIndicesHistory.last(); m_playlistIndicesHistory.removeLast(); m_playlistUrlHistory.removeLast(); MediaItem previousItem = m_currentPlaylist->mediaItemAt(previousRow); previousItem.playlistIndex = previousRow; m_queue->insertMediaItemAt(0, previousItem); playItemAt(0, Playlist::QueueModel); } } } void Playlist::start() { m_playlistIndices.clear(); m_playlistIndicesHistory.clear(); m_playlistUrlHistory.clear(); m_queue->clearMediaListData(); for (int i = 0; i < m_currentPlaylist->rowCount(); ++i) { m_playlistIndices.append(i); } if (!m_shuffle) { orderByPlaylist(); } else { shuffle(); } playItemAt(0, Playlist::QueueModel); } void Playlist::stop() { m_hadVideo = false; m_mediaObject->stop(); m_queue->clearMediaListData(); if (m_nowPlaying->rowCount() > 0) { int oldItemRow = m_nowPlaying->mediaItemAt(0).playlistIndex; m_nowPlaying->removeMediaItemAt(0, true); if ((oldItemRow >= 0) && (oldItemRow < m_currentPlaylist->rowCount())) { //Cycle through true and false to ensure data change forces update m_currentPlaylist->item(oldItemRow,0)->setData(true, MediaItem::NowPlayingRole); m_currentPlaylist->item(oldItemRow,0)->setData(false, MediaItem::NowPlayingRole); } } m_state = Playlist::Finished; emit playlistFinished(); } void Playlist::playMediaList(const QList &mediaList) { //Clear playlist clearPlaylist(); //Load playlist with all media items //Note: Because playlist loads asynchronously we have to //wait for signal from playlist model that loading is //complete (playlistChanged) before starting playback // - hence the use of playWhenPlaylistChanges. playWhenPlaylistChanges = true; m_state = Playlist::Loading; emit loading(); m_currentPlaylist->loadSources(mediaList); } //---------------------------------------- //--- Playlist data control methods --- //---------------------------------------- void Playlist::addMediaList(const QList &mediaList) { m_currentPlaylist->loadSources(mediaList); } void Playlist::addMediaItem(const MediaItem &mediaItem) { QList mediaList; mediaList.append(mediaItem); m_currentPlaylist->loadSources(mediaList); } void Playlist::removeMediaItemAt(int row, bool emitMediaListChange) { int foundAt = m_playlistIndices.indexOf(row); if (foundAt != -1) { m_playlistIndices.removeAt(foundAt); } foundAt = m_queue->rowOfUrl(m_currentPlaylist->mediaItemAt(row).url); if (foundAt != -1) { m_queue->removeMediaItemAt(foundAt); } foundAt = m_playlistIndicesHistory.indexOf(row); if (foundAt != -1) { m_playlistIndicesHistory.removeAt(foundAt); m_playlistUrlHistory.removeAt(foundAt); } m_currentPlaylist->removeMediaItemAt(row, emitMediaListChange); } void Playlist::removeMediaListItems(const QList< MediaItem >& list) { int count = list.count(); for (int i = 0; i < count; i++) { const MediaItem &item = list.at(i); if (Utilities::isMedia(item.type)) { int playlistRow = m_currentPlaylist->rowOfUrl(item.url); if (playlistRow != -1) { removeMediaItemAt(playlistRow, (i == count -1 ) ); } } } } void Playlist::insertMediaItemAt(int row, Model model, const MediaItem &mediaItem) { if (model == PlaylistModel) { if (row >= m_currentPlaylist->rowCount()) { return; } m_currentPlaylist->insertMediaItemAt(row, mediaItem, true); } else { if (row >= m_queue->rowCount()) { return; } //Update history int playlistIndex = m_currentPlaylist->rowOfUrl(mediaItem.url); if (m_playlistIndicesHistory.contains(playlistIndex)) { m_playlistIndicesHistory.removeAll(playlistIndex); m_playlistUrlHistory.removeAll(mediaItem.url); } if (m_playlistIndices.contains(playlistIndex)) { m_playlistIndices.removeAll(playlistIndex); } //Update Playlist int playlistRow = -1; if (m_shuffle) { m_currentPlaylist->loadMediaItem(mediaItem, false); playlistRow = m_currentPlaylist->rowCount() - 1; } else { MediaItem itemAtRow = m_queue->mediaItemAt(row); playlistRow = m_currentPlaylist->rowOfUrl(itemAtRow.url); if (playlistRow != -1) { m_currentPlaylist->insertMediaItemAt(playlistRow, mediaItem, false); } } //Update queue MediaItem queueItem = mediaItem; queueItem.playlistIndex = playlistRow; m_queue->insertMediaItemAt(row, queueItem); if (m_queue->rowCount() > m_queueDepth) { m_queue->removeMediaItemAt(m_queue->rowCount() - 1); } if (row == 0 && (m_mediaObject->state() == Phonon::PlayingState || m_mediaObject->state() == Phonon::PausedState)) { playItemAt(0, QueueModel); } } } void Playlist::insertMediaListAt(int row, Model model, const QList &mediaList) { for (int i = mediaList.count()-1; i >= 0; i--) { insertMediaItemAt(row, model, mediaList.at(i)); } } bool Playlist::isInPlaylist(const MediaItem &mediaItem) { int row = m_currentPlaylist->rowOfUrl(mediaItem.url); if (row != -1) { return true; } else { return false; } } void Playlist::clearPlaylist() { stop(); m_currentPlaylist->clearMediaListData(true); m_queue->clearMediaListData(); m_nowPlaying->clearMediaListData(); m_playlistIndices.clear(); m_playlistIndicesHistory.clear(); m_playlistUrlHistory.clear(); } void Playlist::setMediaObject(Phonon::MediaObject *mediaObject) { //NOTE:Not disconnecting signals here. Calling routing is responsible for deletion/disconnection of old media object. If object is not deleted/disconnected, playlist slot will continue to respond to old media object signals. if (m_mediaController != NULL) { delete m_mediaController; } m_mediaObject = mediaObject; m_mediaController = new Phonon::MediaController(m_mediaObject); connect(m_mediaObject, SIGNAL(tick(qint64)), this, SLOT(updatePlaybackInfo(qint64))); connect(m_mediaObject, SIGNAL(aboutToFinish()), this, SLOT(queueNextPlaylistItem())); connect(m_mediaObject, SIGNAL(finished()), this, SLOT(confirmPlaylistFinished())); connect(m_mediaObject, SIGNAL(currentSourceChanged (const Phonon::MediaSource & )), this, SLOT(currentSourceChanged(const Phonon::MediaSource & ))); connect(m_mediaObject, SIGNAL(stateChanged (Phonon::State, Phonon::State)), this, SLOT(stateChanged(Phonon::State, Phonon::State))); connect(m_mediaObject, SIGNAL(metaDataChanged()), this, SLOT(metaDataChanged())); connect(m_mediaController, SIGNAL(titleChanged (int)), this, SLOT(titleChanged(int))); } QSortFilterProxyModel * Playlist::filterProxyModel() { return m_filterProxyModel; } void Playlist::setShuffleMode(bool shuffleMode) { m_shuffle = shuffleMode; if (m_currentPlaylist->rowCount() > 0) { if (m_mediaObject->state() == Phonon::PlayingState || m_mediaObject->state() == Phonon::PausedState || m_mediaObject->state() == Phonon::LoadingState) { //Rebuild queue after currently playing item if (!m_shuffle) { if (m_queue->rowCount() > 1) { buildQueueFrom(m_queue->mediaItemAt(0).playlistIndex); } else { orderByPlaylist(); } } else { MediaItem nowPlayingItem; if (m_queue->rowCount() > 1) { m_queue->removeRows(1, m_queue->rowCount() - 1); nowPlayingItem = m_queue->mediaItemAt(0); } m_playlistIndices.clear(); m_playlistIndicesHistory.clear(); m_playlistUrlHistory.clear(); for (int i = 0; i < m_currentPlaylist->rowCount(); ++i) { if (nowPlayingItem.url.isEmpty() || m_currentPlaylist->mediaItemAt(i).url != nowPlayingItem.url) { m_playlistIndices.append(i); } } shuffle(); } } else { //Rebuild queue from scratch m_queue->clearMediaListData(); if (!m_shuffle) { orderByPlaylist(); } else { shuffle(); } } } emit shuffleModeChanged(m_shuffle); } bool Playlist::shuffleMode() { return m_shuffle; } void Playlist::setRepeatMode(bool repeat) { bool wasRepeat = m_repeat; m_repeat = repeat; //If switching from repeat to not-repeat make sure queue is only built to end of playlist. //NOTE: In shuffle mode repeat the end of the playlist is ambiguous so no need to alter queue. if (wasRepeat && !repeat && !m_shuffle && m_queue->rowCount() > 0) { buildQueueFrom(m_queue->mediaItemAt(0).playlistIndex); } if (!m_shuffle) { orderByPlaylist(); } else { shuffle(); } emit repeatModeChanged(m_repeat); } bool Playlist::repeatMode() { return m_repeat; } Playlist::State Playlist::state() { return m_state; } int Playlist::rowOfNowPlaying() { int row = -1; if (m_nowPlaying->rowCount() > 0) { MediaItem nowPlayingItem = m_nowPlaying->mediaItemAt(0); if (nowPlayingItem.type == "Audio" || nowPlayingItem.type == "Video") { row = nowPlayingItem.playlistIndex; } } return row; } //---------------------------------------- //--- Media Object/Controller SLOTS --- //---------------------------------------- void Playlist::queueNextPlaylistItem() // connected to MediaObject::aboutToFinish() { //NOTE:This is the handler for the aboutToFinish signal from the mediaObject. //The aboutToFinish signal is only emitted when setAutoplayTitles is false. //i.e. This slot is only called when the next mediaItem is not the next title // on a disc (a different title or a new url). if (m_queue->rowCount() == 1 && !m_repeat) { //Playlist is finished m_state = Playlist::Finished; } else { if (m_queue->rowCount() > 0 && Utilities::isAudioStream(m_queue->mediaItemAt(0).fields["audioType"].toString())){ return; } m_queue->removeMediaItemAt(0); addToQueue(); if (m_queue->rowCount() > 0) { //Load next queued item MediaItem nextMediaItem = m_queue->mediaItemAt(0); if (nextMediaItem.fields["audioType"].toString() == "CD Track") { QList queue; queue << Phonon::MediaSource(Phonon::Cd); m_mediaObject->setQueue(queue); } else if (nextMediaItem.fields["videoType"].toString() == "DVD Title") { QList queue; queue << Phonon::MediaSource(Phonon::Dvd); m_mediaObject->setQueue(queue); } else { QList queue; queue << QUrl::fromPercentEncoding(nextMediaItem.url.toUtf8()); m_mediaObject->setQueue(queue); } } } } void Playlist::currentSourceChanged(const Phonon::MediaSource & newSource) //connected to MediaObject::currentSourceChanged { //Update currentUrl and check next mediaItem to decide how to setAutoplayTitles if (newSource.type() == Phonon::MediaSource::Disc) { if (m_queue->rowCount() > 0) { if (Utilities::isDisc(m_queue->mediaItemAt(0).url)) { m_currentUrl = m_queue->mediaItemAt(0).url; if (m_queue->rowCount() >1) { m_mediaController->setAutoplayTitles((m_queue->mediaItemAt(1).fields["trackNumber"].toInt() == m_mediaController->currentTitle() + 1)); } } } } else { m_currentUrl = newSource.url().toString(); } updateNowPlaying(); } void Playlist::titleChanged(int newTitle) //connected to MediaController::titleChanged { if ((m_queue->rowCount() > 1)) { MediaItem mediaItem = m_queue->mediaItemAt(1); if ((mediaItem.fields["trackNumber"].toInt() == newTitle) && (m_mediaObject->currentSource().type() == Phonon::MediaSource::Disc)) { m_currentUrl = mediaItem.url; m_queue->removeMediaItemAt(0); } } updateNowPlaying(); } void Playlist::confirmPlaylistFinished() //connected to MediaObject::finished() { if (m_state == Playlist::Finished) { m_mediaObject->stop(); //Refresh playlist model to ensure views get updated int row = -1; if (m_nowPlaying->rowCount() > 0) { row = m_nowPlaying->mediaItemAt(0).playlistIndex; } if ((row >= 0) && (row < m_currentPlaylist->rowCount())) { m_currentPlaylist->item(row,0)->setData(true, MediaItem::NowPlayingRole); m_currentPlaylist->item(row,0)->setData(false, MediaItem::NowPlayingRole); } //Clear nowPlaying and queue and emit playlistFinished m_nowPlaying->removeMediaItemAt(0); m_queue->removeMediaItemAt(0); m_playlistIndicesHistory.clear(); m_playlistUrlHistory.clear(); emit playlistFinished(); } } void Playlist::stateChanged(Phonon::State newstate, Phonon::State oldstate) { /* Change power profile only if the current media has video. * Since this slot is called only if the state of the current * media changes, it should be known whether it has video or not, * so no connecting to Phonon::MediaObject::hasVideoChanged() is * necessary. */ if (!m_mediaObject->hasVideo()) { //Re-enable screensaver delete m_notificationRestrictions; m_notificationRestrictions = 0; return; } if (m_hadVideo && m_mediaObject->hasVideo()) { return; } //If a pls or m3u based stream starts playing and there are other streams in the playlist //clear the queue to allow the other playlist streams to accessed. if (newstate == Phonon::PlayingState && nowPlayingModel()->rowCount() > 0) { if (Utilities::isAudioStream(nowPlayingModel()->mediaItemAt(0).fields["audioType"].toString())) { m_mediaObject->clearQueue(); m_streamListUrls.clear(); } } if (newstate == Phonon::PlayingState || newstate == Phonon::PausedState) { m_hadVideo = m_mediaObject->hasVideo(); /* The commented code below will be used to test phonon external subtitle support * when phonon is updated to provide this function. QString directoryPath = KUrl(m_nowPlaying->mediaItemAt(0).url).directory(); kDebug() << directoryPath; QDir dir(directoryPath); dir.setNameFilters(QStringList("*.srt")); QStringList dirList = dir.entryList(QDir::Files, QDir::Name);; if (dirList.count() > 0) { kDebug() << dirList.at(0); QHash properties; properties.insert("type", "file"); properties.insert("name", directoryPath + QString("/") +dirList.at(0)); int newSubtitleId = m_mediaController->availableSubtitles().count(); Phonon::SubtitleDescription newSubtitle(newSubtitleId, properties); m_mediaController->setCurrentSubtitle(newSubtitle); } QList subtitles = m_mediaController->availableSubtitles(); foreach (Phonon::SubtitleDescription cur, subtitles) { kDebug() << cur.name(); }*/ } //NOTE: In KDE 4.6, below is not the correct way to disable power saving. //TODO: Update to use new Solid power status api in KDE 4.6 and later. bool isKDE46OrGreater = false; if ((KDE::versionMinor() >= 6)) { isKDE46OrGreater = true; } if ((newstate == Phonon::PlayingState || newstate == Phonon::PausedState) && oldstate != Phonon::PlayingState && oldstate != Phonon::PausedState) { if (isKDE46OrGreater) { m_powerManagementCookie = Solid::PowerManagement::beginSuppressingScreenPowerManagement(i18n("Video Playback")); } else { QDBusInterface iface( "org.kde.kded", "/modules/powerdevil", "org.kde.PowerDevil"); iface.call("setProfile", "Presentation"); } //Disable screensaver delete m_notificationRestrictions; //just to make sure more than one KNotificationRestrictions isn't created. m_notificationRestrictions = new KNotificationRestrictions(KNotificationRestrictions::ScreenSaver); } else if (newstate == Phonon::StoppedState && (oldstate == Phonon::PlayingState || oldstate == Phonon::PausedState)){ if (isKDE46OrGreater) { Solid::PowerManagement::stopSuppressingScreenPowerManagement(m_powerManagementCookie); } else { QDBusInterface iface( "org.kde.kded", "/modules/powerdevil", "org.kde.PowerDevil"); iface.call("refreshStatus"); } if (m_notificationRestrictions) { delete m_notificationRestrictions; m_notificationRestrictions = 0; } } } void Playlist::updatePlaybackInfo(qint64 time) { if (m_playbackInfoWritten) { return; } //Check to make sure playback passed through both the 5 second and 10 second mark. if (time >= 5000 && time <= 6000 && m_playbackInfoChecks == 0) { m_playbackInfoChecks++; } else if (time >= 10000 && time <= 11000 && m_playbackInfoChecks == 1) { m_playbackInfoChecks++; } if (m_playbackInfoChecks == 2) { //Update last played date and play count after 10 seconds if (m_nepomukInited && m_nowPlaying->rowCount() > 0) { MediaItem nowPlayingItem = m_nowPlaying->mediaItemAt(0); Nepomuk::Resource res(nowPlayingItem.url); nowPlayingItem.fields["playCount"] = nowPlayingItem.fields["playCount"].toInt() + 1; nowPlayingItem.fields["lastPlayed"] = QDateTime::currentDateTime(); m_nowPlaying->replaceMediaItemAt(0, nowPlayingItem); if (res.exists()) { m_mediaIndexer->updatePlaybackInfo(m_nowPlaying->mediaItemAt(0).fields["resourceUri"].toString(), true, nowPlayingItem.fields["lastPlayed"].toDateTime()); } } m_playbackInfoWritten = true; } } //-------------------------------- //--- MediaItemModel SLOTS --- //-------------------------------- void Playlist::playlistChanged() { m_state = Playlist::Finished; if (playWhenPlaylistChanges && m_currentPlaylist->rowCount() > 0) { //Start playing with clean playlist, queue and history playWhenPlaylistChanges = false; if (m_currentPlaylist->mediaItemAt(0).type == "Audio" || m_currentPlaylist->mediaItemAt(0).type == "Video") { start(); } else { if (m_currentPlaylist->mediaItemAt(0).fields["messageType"].toString() == "No Results") { m_currentPlaylist->removeMediaItemAt(0,false); } m_mediaObject->stop(); emit playlistFinished(); } } else if (m_currentPlaylist->rowCount() > 0){ //if playlist mode is normal (sequential) // - rebuild history to just before currently playing/paused url // - rebuild queue from currently playing item to queue depth // - rebuild playlist indices using remaining items if (!m_shuffle) { int currentRow = 0; if ((m_mediaObject->state() == Phonon::PlayingState) || (m_mediaObject->state() == Phonon::PausedState)) { //Starting with the currently playing item, check to see if item //is in the new playlist. If not continue through the existing queue //until an item is found in the playlist. for (int i = 0; i < m_queue->rowCount(); i++) { QString url = m_queue->mediaItemAt(i).url; currentRow = m_currentPlaylist->rowOfUrl(url); if (currentRow != -1) { break; } } } else { currentRow = 0; } buildQueueFrom(currentRow); } else { //if playlist mode is shuffle // - remove from history any items NOT in the current playlist // - remove from queue any items NOT in the current playlist // - rebuild playlist indices using remaining items // - add items to queu to fill queue depth QList oldPlaylistUrlHistory = m_playlistUrlHistory; m_playlistIndicesHistory.clear(); m_playlistUrlHistory.clear(); for (int i = 0; i < oldPlaylistUrlHistory.count(); i++) { int rowOfUrl = m_currentPlaylist->rowOfUrl(oldPlaylistUrlHistory.at(i)); if (rowOfUrl != -1) { m_playlistIndicesHistory.append(rowOfUrl); m_playlistUrlHistory.append(oldPlaylistUrlHistory.at(i)); } } QList newQueueMediaList; for (int i = 0; i < m_queue->rowCount(); i++) { MediaItem mediaItem = m_queue->mediaItemAt(i); QString urlToSearch = mediaItem.url; int rowOfUrl = m_currentPlaylist->rowOfUrl(urlToSearch); if (rowOfUrl != -1) { newQueueMediaList.append(mediaItem); } } m_queue->clearMediaListData(); m_queue->loadMediaList(newQueueMediaList); m_playlistIndices.clear(); for (int i = 0; i < m_currentPlaylist->rowCount(); i++) { if (m_playlistIndicesHistory.indexOf(i) == -1) { MediaItem mediaItem = m_currentPlaylist->mediaItemAt(i); QString urlToSearch = mediaItem.url; int rowInQueue = m_queue->rowOfUrl(urlToSearch); if (rowInQueue == -1) { m_playlistIndices.append(i); } } } for (int i = m_queue->rowCount(); i < m_queueDepth; i++) { addToQueue(); } } //if currently playing url is not at front of queueMediaList // stop playing and play item at front of queue if ((m_mediaObject->state() == Phonon::PlayingState) || (m_mediaObject->state() == Phonon::PausedState)) { if (m_currentUrl != QUrl::fromEncoded(m_queue->mediaItemAt(0).url.toUtf8()).toString()) { m_mediaObject->stop(); playItemAt(0, Playlist::QueueModel); } } } else { //playlist was cleared stop(); } } //-------------------------------- //--- Private Methods --- //-------------------------------- void Playlist::updateNowPlaying() { //ACTUALLY UPDATE THE NOW PLAYING MODEL HERE! //THIS SHOULD BE THE ONLY PLACE THAT UPDATES THE NOW PLAYING MODEL! //Get row and url of previously playing item and add to history int oldItemRow = -1; if (m_nowPlaying->rowCount() > 0) { oldItemRow = m_nowPlaying->mediaItemAt(0).playlistIndex; } //Find matching item in queue int queueRow = -1; for (int i = 0; i < m_queue->rowCount(); i++) { if (Utilities::isAudioStream(m_queue->mediaItemAt(i).fields["audioType"].toString())) { if (m_currentStream == m_queue->mediaItemAt(i).url) { queueRow = i; break; } } else { if (m_currentUrl == QUrl::fromEncoded(m_queue->mediaItemAt(i).url.toUtf8()).toString()) { queueRow = i; break; } } } //Update Now Playing model MediaItem nowPlayingItem; if (queueRow != -1) { nowPlayingItem = m_queue->mediaItemAt(queueRow); //Get artwork QPixmap artwork = Utilities::getArtworkFromMediaItem(nowPlayingItem); if (!artwork.isNull()) { nowPlayingItem.artwork = KIcon(artwork); } //Create a file containing artwork so that it can, for example, //be exposed through the MPRIS dbus interface. if (nowPlayingItem.fields["artworkUrl"].toString().isEmpty()) { QString thumbnailTargetFile = QString("bangarang/thumbnails/nowPlaying-artwork.png"); KUrl thumbnailTargetUrl = KUrl(KStandardDirs::locateLocal("data", thumbnailTargetFile, true)); nowPlayingItem.artwork.pixmap(200,200).save(thumbnailTargetUrl.path(), "PNG"); nowPlayingItem.fields["artworkUrl"] = thumbnailTargetUrl.path(); } //Update model if (m_nowPlaying->rowCount() > 0) { m_nowPlaying->replaceMediaItemAt(0, nowPlayingItem, true); } else { m_nowPlaying->loadMediaItem(nowPlayingItem, true); } } //Refresh playlist model to ensure views get updated int row = -1; if (m_nowPlaying->rowCount() > 0) { row = m_nowPlaying->mediaItemAt(0).playlistIndex; } if ((row >= 0) && (row < m_currentPlaylist->rowCount())) { m_currentPlaylist->item(row,0)->setData(false, MediaItem::NowPlayingRole); m_currentPlaylist->item(row,0)->setData(true, MediaItem::NowPlayingRole); } if ((oldItemRow != row && oldItemRow >= 0) && (oldItemRow < m_currentPlaylist->rowCount())) { //Cycle through true and false to ensure data change forces update m_currentPlaylist->item(oldItemRow,0)->setData(true, MediaItem::NowPlayingRole); m_currentPlaylist->item(oldItemRow,0)->setData(false, MediaItem::NowPlayingRole); } if (!Utilities::isDisc(nowPlayingItem.url)) { //Update last played date and play count if (m_nepomukInited && m_nowPlaying->rowCount() > 0) { m_playbackInfoChecks = 0; m_playbackInfoWritten = false; // Written 10 seconds later with updatePlaybackInfo() } } } void Playlist::shuffle() { srand((unsigned)time(0)); int numberToAdd = m_queueDepth - m_queue->rowCount(); for (int i = 0; i < numberToAdd; ++i) { addToQueue(); } } void Playlist::orderByPlaylist() { int numberToAdd = m_queueDepth - m_queue->rowCount(); for (int i = 0; i < numberToAdd; ++i) { addToQueue(); } } void Playlist::addToQueue() { if ((m_playlistIndices.count() == 0) && (m_repeat)) { for (int i = 0; i < m_currentPlaylist->rowCount(); ++i) { m_playlistIndices.append(i); } } if (m_playlistIndices.count() > 0) { int nextIndex; if (!m_shuffle) { nextIndex = m_playlistIndices.takeAt(0); } else { nextIndex = m_playlistIndices.takeAt(rand()%m_playlistIndices.count()); } MediaItem nextMediaItem = m_currentPlaylist->mediaItemAt(nextIndex); nextMediaItem.playlistIndex = nextIndex; m_queue->loadMediaItem(nextMediaItem); } } void Playlist::buildQueueFrom(int playlistRow) { if (playlistRow < m_currentPlaylist->rowCount()) { m_playlistIndices.clear(); m_playlistIndicesHistory.clear(); m_playlistUrlHistory.clear(); m_queue->clearMediaListData(); for (int i = 0; i < playlistRow; ++i) { m_playlistIndicesHistory.append(i); m_playlistUrlHistory.append(m_currentPlaylist->mediaItemAt(i).url); } createUrlHistoryFromIndices(); for (int j = playlistRow; j < m_currentPlaylist->rowCount(); ++j) { m_playlistIndices.append(j); } orderByPlaylist(); } } void Playlist::createUrlHistoryFromIndices() { m_playlistUrlHistory.clear(); for (int i = 0; i < m_playlistIndicesHistory.count(); i++) { m_playlistUrlHistory.append(m_currentPlaylist->mediaItemAt(m_playlistIndicesHistory.at(i)).url); } } void Playlist::metaDataChanged() { if (m_nowPlaying->rowCount()>0) { MediaItem mediaItem = m_nowPlaying->mediaItemAt(0); if ((mediaItem.type == "Audio") && (mediaItem.fields["audioType"].toString() == "Audio Stream")) { mediaItem.subTitle = m_mediaObject->metaData("TITLE").join(" "); m_nowPlaying->replaceMediaItemAt(0, mediaItem, true); } } } void Playlist::playlistModelItemChanged(QStandardItem *item) { //Update corresponding items in queue and now playing models MediaItem changedMediaItem = m_currentPlaylist->mediaItemAt(item->row()); int rowInQueue = m_queue->rowOfUrl(changedMediaItem.url); if (rowInQueue != -1) { changedMediaItem.playlistIndex = item->row(); m_queue->replaceMediaItemAt(rowInQueue,changedMediaItem); } int rowInNowPlaying = m_nowPlaying->rowOfUrl(changedMediaItem.url); if (rowInNowPlaying != -1) { QPixmap artwork = Utilities::getArtworkFromMediaItem(changedMediaItem); if (!artwork.isNull()) { changedMediaItem.artwork = KIcon(artwork); } m_nowPlaying->replaceMediaItemAt(rowInNowPlaying, changedMediaItem); } } bangarang-bangarang/src/platform/playlist.h000066400000000000000000000232221166760560600213570ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef PLAYLIST_H #define PLAYLIST_H #include #include #include #include #include class MediaItemModel; class MediaItem; class MediaIndexer; class MediaSortFilterProxyModel; class QSortFilterProxyModel; /** * This class provides MediaItemModels for a playlist and a queue. * It additionally provides an interface to playback MediaItems * in the playlist or the queue, shuffle and repeat. It also * provides a MediaItemModel containing the currently playing * MediaItem. * * The queue MediaItemModel contains MediaItems in the order they * will be played. * The playlist MediaItemModel is the model from which MediaItems * are added to the queue according to the Playlist::Mode. */ class Playlist : public QObject { Q_OBJECT public: enum Model { PlaylistModel = 0, QueueModel = 1}; enum State { Finished = 0, Loading = 1, Playing = 2}; /** * Constructor * * @param mediaObject MediaObject the Playlist should use for playback */ Playlist(QObject * parent, Phonon::MediaObject * mediaObject); /** * Destructor */ ~Playlist(); /** * Adds a list of MediaItems to the playlist * * @param mediaList List of MediaItems to add */ void addMediaList(const QList &mediaList); /** * Adds a MediaItem to playlist. * * @param mediaItem MediaItem to add. */ void addMediaItem(const MediaItem &mediaItem); /** * Clears the playlist */ void clearPlaylist(); /** * Return the playlist row of the currently playing item **/ int rowOfNowPlaying(); /** * Returns the Phonon::MediaObject used by Playlist. */ Phonon::MediaObject * mediaObject(); /** * Returns the MediaItemModel containing the currently * playing MediaItem. */ MediaItemModel * nowPlayingModel(); /** * Returns the filter proxy model used */ QSortFilterProxyModel * filterProxyModel(); /** * Insert item at specified row of the specified model * * @param row row of the specified model * @param model either Playlist::PlaylistModel or Playlist::QueueModel * @param mediaItem MediaItem to insert. */ void insertMediaItemAt(int row, Model model, const MediaItem &mediaItem); /** * Insert item at specified row of the specified model * * @param row row of the specified model * @param model either Playlist::PlaylistModel or Playlist::QueueModel * @param mediaList MediaList to insert. */ void insertMediaListAt(int row, Model model, const QList &mediaList); /** * Returns true if mediaItem is in playlist * * @param mediaItem MediaItem to check. **/ bool isInPlaylist(const MediaItem &mediaItem); /** * Plays item at the specified row of the specified model * * @param row row of the specified model * @param model either Playlist::PlaylistModel or Playlist::QueueModel */ void playItemAt(int row, Model model); /** * Returns the MediaItemModel containing the list of MediaItems * in the playlist. */ MediaItemModel * playlistModel(); /** * Plays the specified list of MediaItems * * @param mediaList list of MediaItems to play */ void playMediaList(const QList &mediaList); /** * Returns the MediaItemModel containing the list of MediaItems * in the queue. */ MediaItemModel * queueModel(); /** * Removes MediaItem corresponding to the specified row in the * playlist model. * * @param row row of playlist model * @param emitMediaListChange whether the model/playlist should be notified about the change. * This should only be false if you remove more than one item. For the last this should be true in any case. */ void removeMediaItemAt(int row, bool emitMediaListChange = true); /** * Removes a complete list of MediaItems from the playlist. * @param list The list of items to be removed */ void removeMediaListItems(const QList &list); /** * Sets the Media Object the playlist should use * * @param mediaObject media object that playlist will use */ void setMediaObject(Phonon::MediaObject *mediaObject); /** * Returns true if repeat is on, false otherwise */ bool repeatMode(); /** * Sets whether or playback should repeat after playing * all items in the playlist. * * @param repeat true to repeat, false to end playback * when all items in the playlist has * been played. */ void setRepeatMode(bool repeat); /** * Sets whether or not to shuffle playlist items into queue * @param shuffle true to shuffle, false to add sequentially */ void setShuffleMode(bool shuffle); /** * Returns true if shuffle is on, false otherwise */ bool shuffleMode(); /** * Returns the loading state of the Playlist. * * @returns Playlist::State (see enum) */ Playlist::State state(); /** * Returns the media controller object * @returns Phonon::MediaController */ Phonon::MediaController *mediaController() { return m_mediaController; } /** * Builds an url of the item currently playing * @returns A mediaItem Url */ QString currentUrl() { return m_currentUrl; } public slots: /** * Play next MediaItem in queue. */ void playNext(); /** * Play previous MediaItem in queue. */ void playPrevious(); /** * Start playback. */ void start(); /** * Stop playback */ void stop(); Q_SIGNALS: /** * Emitted when loading MediaItems into the playlist. */ void loading(); /** * Emitting when all items in playlist have been played. */ void playlistFinished(); /** * Emitted when mode changes * @param mode true if shuffle is on, false otherwise */ void shuffleModeChanged(bool shuffle); /** * Emitted when repeat is changed * @param repeat true if repeat is on, false otherwise */ void repeatModeChanged(bool repeat); private: QObject * m_parent; MediaItemModel * m_currentPlaylist; MediaItemModel * m_nowPlaying; MediaItemModel * m_queue; MediaSortFilterProxyModel *m_filterProxyModel; bool m_shuffle; bool m_repeat; int m_queueDepth; int m_oldPlaylistLength; QList m_playlistIndices; QList m_playlistIndicesHistory; QList m_playlistUrlHistory; Phonon::MediaObject * m_mediaObject; Phonon::MediaController * m_mediaController; bool playWhenPlaylistChanges; bool m_playlistFinished; void createUrlHistoryFromIndices(); void updateNowPlaying(); bool m_nepomukInited; Playlist::State m_state; MediaIndexer * m_mediaIndexer; bool m_playbackInfoWritten; int m_playbackInfoChecks; void buildQueueFrom(int playlistRow); void shuffle(); void orderByPlaylist(); void addToQueue(); bool m_hadVideo; KNotificationRestrictions * m_notificationRestrictions; QList m_streamListUrls; QString m_currentUrl; QString m_currentStream; int m_powerManagementCookie; private slots: void currentSourceChanged(const Phonon::MediaSource & newSource); void titleChanged(int newTitle); void playlistChanged(); void queueNextPlaylistItem(); void confirmPlaylistFinished(); void stateChanged(Phonon::State newstate, Phonon::State oldstate); void updatePlaybackInfo(qint64 time); void metaDataChanged(); void playlistModelItemChanged(QStandardItem *item); }; #endif // PLAYLIST_H bangarang-bangarang/src/platform/utilities/000077500000000000000000000000001166760560600213575ustar00rootroot00000000000000bangarang-bangarang/src/platform/utilities/artwork.cpp000066400000000000000000000650511166760560600235630ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_ARTWORK_CPP #define UTILITIES_ARTWORK_CPP #include "general.h" #include "artwork.h" #include "typechecks.h" #include "filetags.h" #include "mediaitems.h" #include "../mediaitemmodel.h" #include "../mediaquery.h" #include "../mediavocabulary.h" #include #include #include #include #include #include #include #include #include #include #include #include #include QPixmap Utilities::getArtworkFromMediaItem(const MediaItem &mediaItem, bool ignoreCache) { int artworkSize = 164; QPixmap pixmap = QPixmap(); if (!ignoreCache && artworkIsInCache(mediaItem)) { QImage image = findArtworkInCache(mediaItem); pixmap = QPixmap::fromImage(image); return pixmap; } if (Utilities::isMusic(mediaItem.url)) { pixmap = Utilities::getArtworkFromTag(mediaItem.url); } if (mediaItem.subType() == "Album") { QImage image = getAlbumArtwork(mediaItem.fields["title"].toString()); if (!image.isNull()) { pixmap = QPixmap::fromImage(image); } } if (pixmap.isNull()) { QString artworkUrl = mediaItem.fields["artworkUrl"].toString(); if (!artworkUrl.isEmpty()) { QPixmap rawPixmap= QPixmap(KUrl(artworkUrl).path()); if (!rawPixmap.isNull()) { //Always scale height to artwork size qreal widthScale = (qreal)artworkSize/rawPixmap.height(); int width = rawPixmap.width()*widthScale; pixmap = rawPixmap.scaled(width, artworkSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); } } if (pixmap.isNull()) { artworkUrl = Utilities::getArtworkUrlFromExternalImage(mediaItem.url, mediaItem.fields["album"].toString()); if (!artworkUrl.isEmpty()) { QPixmap rawPixmap= QPixmap(artworkUrl); if (!rawPixmap.isNull()) { //Always scale height to artwork size qreal widthScale = (qreal)artworkSize/rawPixmap.height(); int width = rawPixmap.width()*widthScale; pixmap = rawPixmap.scaled(width, artworkSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); } } } } if (!ignoreCache) { updateImageCache(mediaItem, pixmap.toImage()); } return pixmap; } QImage Utilities::getArtworkImageFromMediaItem(const MediaItem &mediaItem, bool ignoreCache) { int artworkSize = 164; QImage image = QImage(); if (!ignoreCache && artworkIsInCache(mediaItem)) { image = findArtworkInCache(mediaItem); return image; } if (Utilities::isMusic(mediaItem.url)) { image = Utilities::getArtworkImageFromTag(mediaItem.url); } if (mediaItem.subType() == "Album") { image = getAlbumArtwork(mediaItem.fields["title"].toString()); } if (image.isNull()) { QString artworkUrl = mediaItem.fields["artworkUrl"].toString(); if (!artworkUrl.isEmpty()) { QImage rawImage= QImage(KUrl(artworkUrl).path()); if (!rawImage.isNull()) { //Always scale height to artwork size qreal widthScale = (qreal)artworkSize/rawImage.height(); int width = rawImage.width()*widthScale; image = rawImage.scaled(width, artworkSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); } } else { artworkUrl = Utilities::getArtworkUrlFromExternalImage(mediaItem.url, mediaItem.fields["album"].toString()); if (!artworkUrl.isEmpty()) { QImage rawImage = QImage(artworkUrl); if (!rawImage.isNull()) { //Always scale height to artwork size qreal widthScale = (qreal)artworkSize/rawImage.height(); int width = rawImage.width()*widthScale; image = rawImage.scaled(width, artworkSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); } } } } if (!ignoreCache) { updateImageCache(mediaItem, image); } return image; } QImage Utilities::getAlbumArtwork(const QString &album, bool ignoreCache) { if (album.isEmpty()) { return QImage(); } MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.artworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required, album, MediaQuery::Equal)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.endWhere(); query.addLimit(5); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); while( it.next() ) { MediaItem artworkMediaItem = Utilities::mediaItemFromIterator(it, QString("Music")); QImage artwork = Utilities::getArtworkImageFromMediaItem(artworkMediaItem, ignoreCache); if (!artwork.isNull()) { return artwork; } } return QImage(); } QList Utilities::getGenreArtworks(const QString &genre, const QString &type, bool ignoreCache) { QList artworks; if (genre.isEmpty()) { return artworks; } if (type == "audio" || type == "music") { //Get album artworks associated with genre MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.musicAlbumTitleBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required, Utilities::genreFilter(genre), MediaQuery::Equal)); query.endWhere(); QStringList orderByBindings(mediaVocabulary.musicAlbumTitleBinding()); query.orderBy(orderByBindings); query.addLimit(8); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); //Build media list from results while( it.next() ) { QString album = it.binding(mediaVocabulary.musicAlbumTitleBinding()).literal().toString().trimmed(); if (!album.isEmpty()) { QImage artwork = getAlbumArtwork(album, ignoreCache); if (!artwork.isNull()) { artworks.append(artwork); } } } } else if (type == "video") { MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.artworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required, genre, MediaQuery::Equal)); query.endWhere(); query.addLimit(5); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); while( it.next() ) { MediaItem artworkMediaItem = Utilities::mediaItemFromIterator(it, QString("Video Clip")); QImage artwork = Utilities::getArtworkImageFromMediaItem(artworkMediaItem, ignoreCache); if (!artwork.isNull()) { artworks.append(artwork); } } } return artworks; } QList Utilities::getArtistArtworks(const QString &artist, bool ignoreCache) { QList artworks; if (artist.isEmpty()) { return artworks; } //Get album artworks associated with artist MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.musicAlbumTitleBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Required, artist, MediaQuery::Equal)); query.endWhere(); QStringList orderByBindings(mediaVocabulary.musicAlbumTitleBinding()); query.orderBy(orderByBindings); query.addLimit(8); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); //Build media list from results while( it.next() ) { QString album = it.binding(mediaVocabulary.musicAlbumTitleBinding()).literal().toString().trimmed(); if (!album.isEmpty()) { QImage artwork = getAlbumArtwork(album, ignoreCache); if (!artwork.isNull()) { artworks.append(artwork); } } } return artworks; } QList Utilities::getTagArtworks(const QString &tag, const QString &type, bool ignoreCache) { QList artworks; if (tag.isEmpty()) { return artworks; } if (type == "audio" || type == "music") { //Get album artworks associated with tag MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.musicAlbumTitleBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTag(MediaQuery::Required, tag, MediaQuery::Equal)); query.endWhere(); QStringList orderByBindings(mediaVocabulary.musicAlbumTitleBinding()); query.orderBy(orderByBindings); query.addLimit(8); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); //Build media list from results while( it.next() ) { QString album = it.binding(mediaVocabulary.musicAlbumTitleBinding()).literal().toString().trimmed(); if (!album.isEmpty()) { QImage artwork = getAlbumArtwork(album, ignoreCache); if (!artwork.isNull()) { artworks.append(artwork); } } } } else if (type == "video") { MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.artworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasTag(MediaQuery::Required, tag, MediaQuery::Equal)); query.endWhere(); query.addLimit(8); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); while( it.next() ) { MediaItem artworkMediaItem = Utilities::mediaItemFromIterator(it, QString("Video Clip")); QImage artwork = Utilities::getArtworkImageFromMediaItem(artworkMediaItem, ignoreCache); if (!artwork.isNull()) { artworks.append(artwork); } } } return artworks; } QList Utilities::getTVSeriesArtworks(const QString &seriesTitle, bool ignoreCache) { QList artworks; if (seriesTitle.isEmpty()) { return artworks; } MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.artworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required, seriesTitle, MediaQuery::Equal)); query.endWhere(); query.addLimit(8); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); while( it.next() ) { MediaItem artworkMediaItem = Utilities::mediaItemFromIterator(it, QString("TV Show")); QImage artwork = Utilities::getArtworkImageFromMediaItem(artworkMediaItem, ignoreCache); if (!artwork.isNull()) { artworks.append(artwork); } } return artworks; } QList Utilities::getTVSeasonArtworks(const QString &seriesTitle, int season, bool ignoreCache) { QList artworks; if (seriesTitle.isEmpty() || season < 1) { return artworks; } MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.artworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required, seriesTitle, MediaQuery::Equal)); query.addCondition((mediaVocabulary.hasVideoSeason(MediaQuery::Required, season, MediaQuery::Equal))); query.endWhere(); query.addLimit(8); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); while( it.next() ) { MediaItem artworkMediaItem = Utilities::mediaItemFromIterator(it, QString("TV Show")); QImage artwork = Utilities::getArtworkImageFromMediaItem(artworkMediaItem, ignoreCache); if (!artwork.isNull()) { artworks.append(artwork); } } return artworks; } QList Utilities::getActorArtworks(const QString &actor, bool ignoreCache) { QList artworks; if (actor.isEmpty()) { return artworks; } MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.artworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Required, actor, MediaQuery::Equal)); query.endWhere(); query.addLimit(8); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); while( it.next() ) { MediaItem artworkMediaItem = Utilities::mediaItemFromIterator(it, QString()); QImage artwork = Utilities::getArtworkImageFromMediaItem(artworkMediaItem, ignoreCache); if (!artwork.isNull()) { artworks.append(artwork); } } return artworks; } QList Utilities::getDirectorArtworks(const QString &director, bool ignoreCache) { QList artworks; if (director.isEmpty()) { return artworks; } MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.artworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Required, director, MediaQuery::Equal)); query.endWhere(); query.addLimit(8); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); while( it.next() ) { MediaItem artworkMediaItem = Utilities::mediaItemFromIterator(it, QString()); QImage artwork = Utilities::getArtworkImageFromMediaItem(artworkMediaItem, ignoreCache); if (!artwork.isNull()) { artworks.append(artwork); } } return artworks; } bool Utilities::compareImage(const QImage &image1, const QImage image2, int strength) { //Do the gross comparisons first if (image1.size() != image2.size()) { return false; } int width = image1.width(); int height = image1.height(); int xCheckIncrement = strength*((1-width/2)/100) + width/2; if (xCheckIncrement == 0) { xCheckIncrement = 1; } int yCheckIncrement = strength*((1-height/2)/100) + height/2; if (yCheckIncrement == 0) { yCheckIncrement = 1; } bool same = true; for (int x = xCheckIncrement; x < width; x = x + xCheckIncrement) { for (int y = yCheckIncrement; y < height; y = y + yCheckIncrement) { //QColor pixel1(image1.color(image1.pixelIndex(x, y))); //QColor pixel2(image2.color(image2.pixelIndex(x, y))); QColor pixel1(image1.pixel(x, y)); QColor pixel2(image2.pixel(x, y)); if (!((pixel1.red() > pixel2.red() - 10) && (pixel1.red() < pixel2.red() + 10) && (pixel1.blue() > pixel2.blue() - 10) && (pixel1.blue() < pixel2.blue() + 10) && (pixel1.green() > pixel2.green() - 10) && (pixel1.green() < pixel2.green() + 10) && (pixel1.alpha() > pixel2.alpha() - 10) && (pixel1.alpha() < pixel2.alpha() + 10))) { return false; } } } return same; } QString Utilities::getArtworkUrlFromExternalImage(const QString& url, const QString& album) { if (url.isNull() || url.isEmpty()) { return QString(); } QMutexLocker locker(&mutex); //kDebug() << "Url submitted:" << url; KUrl pathUrl(url); if (!pathUrl.isValid() || !pathUrl.isLocalFile()) { return QString(); } QString path = pathUrl.directory(KUrl::AppendTrailingSlash); if (path.isEmpty()) { return QString(); } //kDebug() << "Directory determined:" << path; QDir dir(path); QStringList files = dir.entryList(QStringList() << "*.jpg" << "*.jpeg" << "*.gif" << "*.png"); if (files.count() == 1) { //kDebug() << "Found 1 file:" << path + files[0]; return path + files[0]; } else if (files.count() >= 1) { for (int i = files.count() - 1; i >= 0; i--) { //TODO: find better match cases //since windows media player stores more then one file, //we are forced to choose the right one (e.g folder is better then //albumartsmall) if (files[i].contains(i18n("folder")) || files[i].contains("album")) { kDebug() << "Found multiple files, picking name [folder/album]:" << path + files[i]; return path + files[i]; } if (!album.isEmpty() && files[i].contains(album, Qt::CaseInsensitive)) kDebug() << "Found multiple files, picking name [album name]:" << path + files[i]; return path + files[i]; } //still here? take the first one //kDebug() << "Found multiple files, picking first one:" << path + files[0]; return path + files[0]; } return QString(); } QString Utilities::getGenreArtworkUrl(const QString &genre) { if (genre.isEmpty()) { return QString(); } QString artworkUrl; QString localGenreFile = KGlobal::dirs()->locateLocal("data","bangarang/genrerc", false); if (!localGenreFile.isEmpty()) { if (QFile::exists(localGenreFile)) { KConfig genreConfig(localGenreFile); KConfigGroup genreGroup(&genreConfig, genre); artworkUrl = KGlobal::dirs()->locate("data", genreGroup.readEntry("artworkUrl", "|||").trimmed()); if (artworkUrl.isEmpty()) { KUrl testUrl(genreGroup.readEntry("artworkUrl", QString())); if (!testUrl.isEmpty() && testUrl.isLocalFile()) { artworkUrl = testUrl.path(); if (!QFile::exists(artworkUrl)) { artworkUrl = QString(); } } } } } if (artworkUrl.isEmpty()) { QString defaultGenreFile = KGlobal::dirs()->locate("data","bangarang/genrerc"); if (!defaultGenreFile.isEmpty()) { KConfig genreConfig(defaultGenreFile); KConfigGroup genreGroup(&genreConfig, genre); artworkUrl = KGlobal::dirs()->locate("data", genreGroup.readEntry("artworkUrl", "|||").trimmed()); } } return artworkUrl; } QIcon Utilities::defaultArtworkForMediaItem(const MediaItem &mediaItem) { QIcon artwork; if (mediaItem.type == "Audio") { if (mediaItem.subType() == "Audio Clip") { artwork = KIcon("audio-x-generic"); } else if (mediaItem.subType() == "Music") { artwork = KIcon("audio-mp4"); } else if (mediaItem.subType() == "Audio Stream") { artwork = KIcon("text-html"); } } else if (mediaItem.type == "Video") { if (mediaItem.subType() == "Video Clip") { artwork = KIcon("video-x-generic"); } else if (mediaItem.subType() == "Movie") { artwork = KIcon("tool-animator"); } else if (mediaItem.subType() == "TV Show") { artwork = KIcon("video-television"); } } else if (mediaItem.type == "Category") { if (mediaItem.subType() == "Artist") { artwork = KIcon("system-users"); } else if (mediaItem.subType() == "Album") { artwork = KIcon("media-optical-audio"); } else if (mediaItem.subType().endsWith(" Feed")) { artwork = KIcon("application-rss+xml"); } else if (mediaItem.subType() == "AudioGenre") { artwork = KIcon("flag-blue"); } else if (mediaItem.subType() == "VideoGenre") { artwork = KIcon("flag-green"); } else if (mediaItem.subType() == "Actor" || mediaItem.subType() == "Director" || mediaItem.subType() == "Writer" || mediaItem.subType() == "Producer") { artwork = KIcon("view-media-artist"); } } return artwork; } QPixmap Utilities::reflection(QPixmap &pixmap) { QMatrix flipMatrix; QPixmap reflection = pixmap.transformed(flipMatrix.scale(1, -1)); QPixmap alphamask(pixmap.size()); alphamask.fill(Qt::transparent); QPainter painter1(&alphamask); QLinearGradient linearGrad(QPointF(0, 0), QPointF(0, pixmap.height())); QColor transBlack = Qt::black; transBlack.setAlpha(100); linearGrad.setColorAt(0, transBlack); transBlack.setAlpha(30); linearGrad.setColorAt(0.2, transBlack); linearGrad.setColorAt(0.32, Qt::transparent); QBrush brush(linearGrad); painter1.fillRect(0, 0, pixmap.width(), pixmap.height(), brush); painter1.setCompositionMode(QPainter::CompositionMode_SourceIn); painter1.drawPixmap(QPoint(0,0), reflection); painter1.end(); return alphamask; } KIcon Utilities::turnIconOff(KIcon icon, QSize size) { QImage image = KIcon(icon).pixmap(size).toImage(); KIconEffect::toGray(image, 0.8); return KIcon(QPixmap::fromImage(image)); } QImage Utilities::findArtworkInCache(const MediaItem & mediaItem) { QString key = QString("%1:%2").arg(mediaItem.subType(), mediaItem.url); return imageCache.value(key, QImage()); } bool Utilities::artworkIsInCache(const MediaItem &mediaItem) { QString key = QString("%1:%2").arg(mediaItem.subType(), mediaItem.url); return imageCache.contains(key); } void Utilities::updateImageCache(const MediaItem &mediaItem, const QImage &image) { QString key = QString("%1:%2").arg(mediaItem.subType(), mediaItem.url); imageCache.insert(key, image); } void Utilities::removeFromImageCache(const MediaItem &mediaItem) { QString key = QString("%1:%2").arg(mediaItem.subType(), mediaItem.url); imageCache.remove(key); } void Utilities::clearSubTypesFromImageCache(const QString &subType) { QStringList keys = imageCache.keys(); for (int i = 0; i < keys.count(); i++ ) { if (keys.at(i).startsWith(QString("%1:").arg(subType))) { imageCache.remove(keys.at(i)); } } } #endif //UTILITIES_ARTWORK_CPP bangarang-bangarang/src/platform/utilities/artwork.h000066400000000000000000000056061166760560600232300ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_ARTWORK_H #define UTILITIES_ARTWORK_H #include #include #include #include #include class MediaItem; /** * This namespace provides a list of convenience functions * used throughout bangarang. */ namespace Utilities { /** * Getting the album cover from an image stored within the same location as the media item (url). * Returns the path (without url.scheme) to the image or an empty string. */ QString getArtworkUrlFromExternalImage(const QString& url, const QString& album = QString()); QPixmap getArtworkFromMediaItem(const MediaItem &mediaItem, bool ignoreCache = false); QImage getArtworkImageFromMediaItem(const MediaItem &mediaItem, bool ignoreCache = false); QImage getAlbumArtwork(const QString &album, bool ignoreCache = false); QList getGenreArtworks(const QString &genre, const QString &type, bool ignoreCache = false); QList getArtistArtworks(const QString &artist, bool ignoreCache = false); QList getTagArtworks(const QString &tag, const QString &type, bool ignoreCache = false); QList getTVSeriesArtworks(const QString &seriesTitle, bool ignoreCache = false); QList getTVSeasonArtworks(const QString &seriesTitle, int season, bool ignoreCache = false); QList getActorArtworks(const QString &actor, bool ignoreCache = false); QList getDirectorArtworks(const QString &director, bool ignoreCache = false); bool compareImage(const QImage &image1, const QImage image2, int strength = 20); QString getGenreArtworkUrl(const QString &genre); QIcon defaultArtworkForMediaItem(const MediaItem &mediaItem); QPixmap reflection(QPixmap &pixmap); KIcon turnIconOff(KIcon icon, QSize size); static QHash imageCache; QImage findArtworkInCache(const MediaItem & mediaItem); bool artworkIsInCache(const MediaItem & mediaItem); void updateImageCache(const MediaItem & mediaItem, const QImage & image); void removeFromImageCache(const MediaItem & mediaItem); void clearSubTypesFromImageCache(const QString & subType); } #endif // UTILITIES_ARTWORK_H bangarang-bangarang/src/platform/utilities/filetags.cpp000066400000000000000000000763051166760560600236740ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_FILETAGS_CPP #define UTILITIES_FILETAGS_CPP #include "general.h" #include "filetags.h" #include "typechecks.h" #include "mediaitems.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include QPixmap Utilities::getArtworkFromTag(const QString &url, QSize size) { QImage attachedImage = getArtworkImageFromTag(url, size); return QPixmap::fromImage(attachedImage); } QImage Utilities::getArtworkImageFromTag(const QString &url, QSize size) { QMutexLocker locker(&mutex); QImage attachedImage; KUrl kUrl(url); KMimeType::Ptr type = KMimeType::findByUrl(kUrl, 0, true); if (kUrl.isValid() && (type->is("audio/mpeg") || type->is("audio/MPA") || type->is("audio/mpa-robust") || type->is("audio/mp4") || type->is("video/mp4") || type->is("application/mp4"))) { TagLib::MPEG::File mpegFile(kUrl.path().toLocal8Bit().constData(), false); TagLib::ID3v2::Tag *id3tag = mpegFile.ID3v2Tag(false); if (!id3tag || id3tag->isEmpty()) { return QImage(); } TagLib::ID3v2::AttachedPictureFrame *selectedFrame = Utilities::attachedPictureFrame(id3tag); if (!selectedFrame) { // Could occur for encrypted picture frames. return QImage(); } QByteArray pictureData = QByteArray(selectedFrame->picture().data(), selectedFrame->picture().size()); attachedImage = QImage::fromData(pictureData); if (size != attachedImage.size() && !attachedImage.isNull()) { attachedImage = attachedImage.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); } } return attachedImage; } QString Utilities::tagType(const QString &url) { QMutexLocker locker(&mutex); KMimeType::Ptr type = KMimeType::findByUrl(KUrl(url), 0, true); if (isMusic(url)) { if (type->is("audio/ogg") || type->is("application/ogg") || type->is("audio/vorbis") || type->is("audio/speex")) { TagLib::Ogg::Vorbis::File vorbisFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::Ogg::XiphComment *oggTag = vorbisFile.tag(); if (oggTag && !oggTag->isEmpty()) { return "OGG"; } } if (type->is("audio/x-flac") || type->is("audio/flac")) { TagLib::FLAC::File flacFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::Ogg::XiphComment *oggTag = flacFile.xiphComment(false); if (oggTag && !oggTag->isEmpty()) { return "FLACOGG"; } TagLib::ID3v2::Tag *id3v2Tag = flacFile.ID3v2Tag(false); if (id3v2Tag && !id3v2Tag->isEmpty()) { return "FLACID3V2"; } TagLib::ID3v1::Tag *id3v1Tag = flacFile.ID3v1Tag(false); if (id3v1Tag && !id3v1Tag->isEmpty()) { return "FLACID3V1"; } } TagLib::MPEG::File mpegFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::ID3v2::Tag *id3v2Tag = mpegFile.ID3v2Tag(false); if (id3v2Tag && !id3v2Tag->isEmpty()) { return "ID3V2"; } TagLib::ID3v1::Tag *id3v1Tag = mpegFile.ID3v1Tag(false); if (id3v1Tag && !id3v1Tag->isEmpty()) { return "ID3V1"; } TagLib::APE::Tag *apeTag = mpegFile.APETag(false); if (apeTag && !apeTag->isEmpty()) { return "APE"; } } return QString(); } MediaItem Utilities::getAllInfoFromTag(const QString &url, MediaItem templateItem) { MediaItem mediaItem = templateItem; mediaItem.url = url; mediaItem.fields["url"] = url; TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); if (!file.isNull()) { QString title = TStringToQString(file.tag()->title()).trimmed(); QString artist = TStringToQString(file.tag()->artist()).trimmed(); QString album = TStringToQString(file.tag()->album()).trimmed(); QString genre = TStringToQString(file.tag()->genre()).trimmed(); QByteArray encodingname = "utf-8"; if (KUrl(mediaItem.url).path().endsWith(".mp3")) { // detect encoding for mpeg id3v2 QString tmp = title + artist + album + genre; KEncodingProber prober(KEncodingProber::Universal); KEncodingProber::ProberState result = prober.feed(tmp.toAscii()); if (result != KEncodingProber::NotMe) { encodingname = prober.encoding().toLower(); if ( prober.confidence() > 0.47 && ( ( encodingname == "gb18030" ) || ( encodingname == "big5" ) || ( encodingname == "euc-kr" ) || ( encodingname == "euc-jp" ) || ( encodingname == "koi8-r" ) ) ) { title = QTextCodec::codecForName(encodingname)->toUnicode(title.toAscii()); artist = QTextCodec::codecForName(encodingname)->toUnicode(artist.toAscii()); album = QTextCodec::codecForName(encodingname)->toUnicode(album.toAscii()); genre = QTextCodec::codecForName(encodingname)->toUnicode(genre.toAscii()); } else if ((prober.confidence() < 0.3 || encodingname != "utf-8") && QTextCodec::codecForLocale()->name().toLower() != "utf-8") { title = QTextCodec::codecForLocale()->toUnicode(title.toAscii()); artist = QTextCodec::codecForLocale()->toUnicode(artist.toAscii()); album = QTextCodec::codecForLocale()->toUnicode(album.toAscii()); genre = QTextCodec::codecForLocale()->toUnicode(genre.toAscii()); encodingname = QTextCodec::codecForLocale()->name().toLower(); } else { encodingname = "utf-8"; } } } QStringList artists(artist); QStringList genres(genre); QStringList composers; int track = file.tag()->track(); int duration = file.audioProperties()->length(); int year = file.tag()->year(); //Read tag type specific fields QString tag = tagType(url); if (tag == "ID3V2" || tag == "FLACID3V2") { if (tag == "ID3V2") { TagLib::MPEG::File mpegFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::ID3v2::Tag *id3v2 = mpegFile.ID3v2Tag(); if (id3v2 && !id3v2->isEmpty()) { artists = getID3V2TextFrameFields(id3v2, "TPE1"); composers = getID3V2TextFrameFields(id3v2, "TCOM"); genres = getID3V2TextFrameFields(id3v2, "TCON"); // Convert from decoded encoding if ( encodingname != "utf-8" ) { for ( int i = 0; i != artists.size(); ++i ) { artists[i] = QTextCodec::codecForName(encodingname)->toUnicode(artists[i].toAscii()); } for ( int i = 0; i != composers.size(); ++i ) { composers[i] = QTextCodec::codecForName(encodingname)->toUnicode(composers[i].toAscii()); } for ( int i = 0; i != genres.size(); ++i ) { genres[i] = QTextCodec::codecForName(encodingname)->toUnicode(genres[i].toAscii()); } } } } else { TagLib::FLAC::File flacFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::ID3v2::Tag *id3v2 = flacFile.ID3v2Tag(); if (id3v2 && !id3v2->isEmpty()) { artists = getID3V2TextFrameFields(id3v2, "TPE1"); composers = getID3V2TextFrameFields(id3v2, "TCOM"); genres = getID3V2TextFrameFields(id3v2, "TCON"); } } } else if (tag == "OGG" || tag == "FLACOGG") { if (tag == "OGG") { TagLib::Ogg::Vorbis::File vorbisFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::Ogg::XiphComment *xiph = vorbisFile.tag(); if (xiph && !xiph->isEmpty()) { artists = getXiphTextFields(xiph, "ARTIST"); composers = getXiphTextFields(xiph, "COMPOSER"); genres = getXiphTextFields(xiph, "GENRE"); } } else { TagLib::FLAC::File flacFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::Ogg::XiphComment *xiph = flacFile.xiphComment(); if (xiph && !xiph->isEmpty()) { artists = getXiphTextFields(xiph, "ARTIST"); composers = getXiphTextFields(xiph, "COMPOSER"); genres = getXiphTextFields(xiph, "GENRE"); } } } if (!title.isEmpty()) { mediaItem.title = title; } mediaItem.duration = Utilities::durationString(duration); mediaItem.fields["duration"] = duration; mediaItem.fields["title"] = title; mediaItem.fields["artist"] = artists; mediaItem.fields["composer"] = composers; mediaItem.fields["album"] = album; mediaItem.fields["genre"] = genresFromRawTagGenres(genres); mediaItem.fields["trackNumber"] = track; mediaItem.fields["year"] = year; } mediaItem = Utilities::makeSubtitle(mediaItem); return mediaItem; } QString Utilities::getArtistFromTag(const QString &url) { QString artist; if (Utilities::isMusic(url)) { TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); artist = TStringToQString(file.tag()->artist()).trimmed(); } return artist; } QString Utilities::getAlbumFromTag(const QString &url) { QString album; if (Utilities::isMusic(url)) { TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); album = TStringToQString(file.tag()->album()).trimmed(); } return album; } QString Utilities::getTitleFromTag(const QString &url) { QString title; if (Utilities::isMusic(url)) { TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); title = TStringToQString(file.tag()->title()).trimmed(); } return title; } QString Utilities::getGenreFromTag(const QString &url) { QString genre; if (Utilities::isMusic(url)) { TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); genre = TStringToQString(file.tag()->genre()).trimmed(); } return genre; } int Utilities::getYearFromTag(const QString &url) { int year = 0; if (Utilities::isMusic(url)) { TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); year = file.tag()->year(); } return year; } int Utilities::getDurationFromTag(const QString &url) { int duration = 0; if (Utilities::isMusic(url)) { TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); duration = file.audioProperties()->length(); } return duration; } int Utilities::getTrackNumberFromTag(const QString &url) { int track = 0; if (Utilities::isMusic(url)) { TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); track = file.tag()->track(); } return track; } QStringList Utilities::getID3V2TextFrameFields(TagLib::ID3v2::Tag *id3v2, const TagLib::ByteVector &type) { QStringList values; if (!id3v2->frameListMap()[type].isEmpty()) { TagLib::ID3v2::TextIdentificationFrame *tFrame = dynamic_cast(id3v2->frameListMap()[type].front()); TagLib::StringList tValues = tFrame->fieldList(); if (!tValues.isEmpty()) { for (uint j = 0; j < tValues.size(); j++) { values.append(TStringToQString(tValues[j])); } } } return values; } QStringList Utilities::getXiphTextFields(TagLib::Ogg::XiphComment *xiph, const TagLib::ByteVector &type) { QStringList values; TagLib::StringList tValues = xiph->fieldListMap()[type]; if (!tValues.isEmpty()) { for (uint j = 0; j < tValues.size(); j++) { values.append(TStringToQString(tValues[j])); } } return values; } void Utilities::saveAllInfoToTag(const QList &mediaList) { for (int i = 0; i < mediaList.count(); i++) { MediaItem mediaItem = mediaList.at(i); if ( (mediaItem.type != "Audio") || (mediaItem.fields["audioType"] != "Music")) { continue; } QString url = mediaList.at(i).url; if (!Utilities::isMusic(url)) { continue; } QString artworkUrl = mediaItem.fields["artworkUrl"].toString(); if (!artworkUrl.isEmpty()) { Utilities::saveArtworkToTag(mediaList.at(i).url, artworkUrl); } TagLib::FileRef file(KUrl(mediaList.at(i).url).path().toLocal8Bit().constData()); if (file.isNull()) { continue; } QString title = mediaItem.fields["title"].toString(); if (!title.isEmpty()) { TagLib::String tTitle(title.trimmed().toUtf8().data(), TagLib::String::UTF8); file.tag()->setTitle(tTitle); } QStringList artists = mediaItem.fields["artist"].toStringList(); if (!artists.isEmpty()) { TagLib::String tArtist(artists.at(0).trimmed().toUtf8().data(), TagLib::String::UTF8); file.tag()->setArtist(tArtist); } QString album = mediaItem.fields["album"].toString(); if (!album.isEmpty()) { TagLib::String tAlbum(album.trimmed().toUtf8().data(), TagLib::String::UTF8); file.tag()->setAlbum(tAlbum); } int year = mediaItem.fields["year"].toInt(); if (year != 0) { file.tag()->setYear(year); } int trackNumber = mediaItem.fields["trackNumber"].toInt(); if (trackNumber != 0) { file.tag()->setTrack(trackNumber); } QStringList genres = mediaItem.fields["genre"].toStringList(); if (!genres.isEmpty()) { TagLib::String tGenre(genres.at(0).trimmed().toUtf8().data(), TagLib::String::UTF8); file.tag()->setGenre(tGenre); } file.save(); //Save tag type specific fields QStringList composers = mediaItem.fields["composer"].toStringList(); QString tag = tagType(url); if (tag == "ID3V2" || tag == "FLACID3V2") { if (tag == "ID3V2") { TagLib::MPEG::File mpegFile(KUrl(mediaList.at(i).url).path().toLocal8Bit().constData()); TagLib::ID3v2::Tag *id3v2 = mpegFile.ID3v2Tag(); setID3V2TextFrameFields(id3v2, "TPE1", artists); setID3V2TextFrameFields(id3v2, "TCOM", composers); setID3V2TextFrameFields(id3v2, "TCON", genres); mpegFile.save(); } else { TagLib::FLAC::File flacFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::ID3v2::Tag *id3v2 = flacFile.ID3v2Tag(); setID3V2TextFrameFields(id3v2, "TPE1", artists); setID3V2TextFrameFields(id3v2, "TCOM", composers); setID3V2TextFrameFields(id3v2, "TCON", genres); flacFile.save(); } } else if (tag == "OGG" || tag == "FLACOGG") { if (tag == "OGG") { TagLib::Ogg::Vorbis::File vorbisFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::Ogg::XiphComment *xiph = vorbisFile.tag(); setXiphTextFields(xiph, "ARTIST", artists); setXiphTextFields(xiph, "PERFORMER", artists); setXiphTextFields(xiph, "COMPOSER", composers); setXiphTextFields(xiph, "GENRE", genres); vorbisFile.save(); } else { TagLib::FLAC::File flacFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::Ogg::XiphComment *xiph = flacFile.xiphComment(); setXiphTextFields(xiph, "ARTIST", artists); setXiphTextFields(xiph, "PERFORMER", artists); setXiphTextFields(xiph, "COMPOSER", composers); setXiphTextFields(xiph, "GENRE", genres); flacFile.save(); } } } } bool Utilities::saveArtworkToTag(const QString &url, const QPixmap *pixmap) { TagLib::MPEG::File mpegFile(KUrl(url).path().toLocal8Bit().constData()); TagLib::ID3v2::Tag *id3tag = mpegFile.ID3v2Tag(true); TagLib::ID3v2::AttachedPictureFrame *frame = Utilities::attachedPictureFrame(id3tag, true); QByteArray data; QBuffer buffer(&data); buffer.open(QIODevice::WriteOnly); pixmap->save(&buffer, "PNG"); frame->setMimeType(TagLib::String("image/png")); frame->setPicture(TagLib::ByteVector(data.data(), data.size())); frame->setDescription("Cover Image"); return mpegFile.save(); } bool Utilities::saveArtworkToTag(const QString &url, const QString &imageurl) { KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true); if (result->is("audio/mpeg")) { TagLib::MPEG::File mpegFile(KUrl(url).path().toLocal8Bit().constData()); if (mpegFile.isValid()) { TagLib::ID3v2::Tag *id3tag = mpegFile.ID3v2Tag(true); TagLib::ID3v2::AttachedPictureFrame *frame = Utilities::attachedPictureFrame(id3tag, true); QFile file(KUrl(imageurl).path()); file.open(QIODevice::ReadOnly); QByteArray data = file.readAll(); KMimeType::Ptr result = KMimeType::findByUrl(KUrl(imageurl), 0, true); if (result->is("image/png")) { frame->setMimeType("image/png"); } else if (result->is("image/jpeg")) { frame->setMimeType("image/jpeg"); } frame->setPicture(TagLib::ByteVector(data.data(), data.size())); frame->setDescription("Cover Image"); return mpegFile.save(); } else { return false; } } else { return false; } } void Utilities::setArtistTag(const QString &url, const QString &artist) { if (Utilities::isMusic(url)) { TagLib::String tArtist(artist.trimmed().toUtf8().data(), TagLib::String::UTF8); TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); file.tag()->setArtist(tArtist); file.save(); } } void Utilities::setAlbumTag(const QString &url, const QString &album) { if (Utilities::isMusic(url)) { TagLib::String tAlbum(album.trimmed().toUtf8().data(), TagLib::String::UTF8); TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); file.tag()->setAlbum(tAlbum); file.save(); } } void Utilities::setTitleTag(const QString &url, const QString &title) { if (Utilities::isMusic(url)) { TagLib::String tTitle(title.trimmed().toUtf8().data(), TagLib::String::UTF8); TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); file.tag()->setTitle(tTitle); file.save(); } } void Utilities::setGenreTag(const QString &url, const QString &genre) { if (Utilities::isMusic(url)) { TagLib::String tGenre(genre.trimmed().toUtf8().data(), TagLib::String::UTF8); TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); file.tag()->setGenre(tGenre); file.save(); } } void Utilities::setYearTag(const QString &url, int year) { if (Utilities::isMusic(url)) { TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); file.tag()->setYear(year); file.save(); } } void Utilities::setTrackNumberTag(const QString &url, int trackNumber) { if (Utilities::isMusic(url)) { TagLib::FileRef file(KUrl(url).path().toLocal8Bit().constData()); file.tag()->setTrack(trackNumber); file.save(); } } void Utilities::setID3V2TextFrameFields(TagLib::ID3v2::Tag *id3v2, const TagLib::ByteVector &type, const QStringList &values) { if (!values.isEmpty()) { TagLib::StringList tValues; for (int j = 0; j < values.count(); j++) { TagLib::String tValue(values.at(j).toUtf8().data(), TagLib::String::UTF8); tValues.append(tValue); } if (!id3v2->frameListMap()[type].isEmpty()) { TagLib::ID3v2::TextIdentificationFrame *tFrame = dynamic_cast(id3v2->frameListMap()[type].front()); tFrame->setText(tValues); } else { TagLib::ID3v2::TextIdentificationFrame *tFrame = new TagLib::ID3v2::TextIdentificationFrame(type, TagLib::String::UTF8); id3v2->addFrame(tFrame); tFrame->setText(tValues); } } else { if (!id3v2->frameListMap()[type].isEmpty()) { id3v2->removeFrames(type); } } } void Utilities::setXiphTextFields(TagLib::Ogg::XiphComment *xiph, const TagLib::ByteVector &type, const QStringList &values) { xiph->removeField(type); if (!values.isEmpty()) { for (int i = 0; i < values.count(); i++) { TagLib::String tValue(values.at(i).toUtf8().data(), TagLib::String::UTF8); xiph->addField(type, tValue, false); } } } TagLib::ID3v2::AttachedPictureFrame *Utilities::attachedPictureFrame(TagLib::ID3v2::Tag *id3tag, bool create) { // Look for attached picture frames. TagLib::ID3v2::FrameList frames = id3tag->frameListMap()["APIC"]; if (frames.isEmpty()) { if (create) { TagLib::ID3v2::AttachedPictureFrame *selectedFrame = new TagLib::ID3v2::AttachedPictureFrame(); id3tag->addFrame(selectedFrame); return selectedFrame; } else { return 0; } } // According to the spec attached picture frames have different types. // So we should look for the corresponding picture depending on what // type of image (i.e. front cover, file info) we want. If only 1 // frame, just return that (scaled if necessary). TagLib::ID3v2::AttachedPictureFrame *selectedFrame = 0; if (frames.size() != 1) { TagLib::ID3v2::FrameList::Iterator it = frames.begin(); for (; it != frames.end(); ++it) { // This must be dynamic_cast<>, TagLib will return UnknownFrame in APIC for // encrypted frames. TagLib::ID3v2::AttachedPictureFrame *frame = dynamic_cast(*it); // Both thumbnail and full size should use FrontCover, as // FileIcon may be too small even for thumbnail. if (frame && frame->type() != TagLib::ID3v2::AttachedPictureFrame::FrontCover) { continue; } selectedFrame = frame; break; } } // If we get here we failed to pick a picture, or there was only one, // so just use the first picture. if (!selectedFrame) { selectedFrame = dynamic_cast(frames.front()); } if (!selectedFrame) { // Could occur for encrypted picture frames. if (create) { TagLib::ID3v2::AttachedPictureFrame *selectedFrame = new TagLib::ID3v2::AttachedPictureFrame(); id3tag->addFrame(selectedFrame); return selectedFrame; } else { return 0; } } return selectedFrame; } QHash Utilities::tagGenreDictionary() { QHash genreDictionary; genreDictionary[0] = "Blues"; genreDictionary[1] = "Classic Rock"; genreDictionary[2] = "Country"; genreDictionary[3] = "Dance"; genreDictionary[4] = "Disco"; genreDictionary[5] = "Funk"; genreDictionary[6] = "Grunge"; genreDictionary[7] = "Hip-Hop"; genreDictionary[8] = "Jazz"; genreDictionary[9] = "Metal"; genreDictionary[10] = "New Age"; genreDictionary[11] = "Oldies"; genreDictionary[12] = "Other"; genreDictionary[13] = "Pop"; genreDictionary[14] = "R&B"; genreDictionary[15] = "Rap"; genreDictionary[16] = "Reggae"; genreDictionary[17] = "Rock"; genreDictionary[18] = "Techno"; genreDictionary[19] = "Industrial"; genreDictionary[20] = "Alternative"; genreDictionary[21] = "Ska"; genreDictionary[22] = "Death Metal"; genreDictionary[23] = "Pranks"; genreDictionary[24] = "Soundtrack"; genreDictionary[25] = "Euro-Techno"; genreDictionary[26] = "Ambient"; genreDictionary[27] = "Trip-Hop"; genreDictionary[28] = "Vocal"; genreDictionary[29] = "Jazz+Funk"; genreDictionary[30] = "Fusion"; genreDictionary[31] = "Trance"; genreDictionary[32] = "Classical"; genreDictionary[33] = "Instrumental"; genreDictionary[34] = "Acid"; genreDictionary[35] = "House"; genreDictionary[36] = "Game"; genreDictionary[37] = "Sound Clip"; genreDictionary[38] = "Gospel"; genreDictionary[39] = "Noise"; genreDictionary[40] = "Alternative Rock"; genreDictionary[41] = "Bass"; genreDictionary[42] = "Soul"; genreDictionary[43] = "Punk"; genreDictionary[44] = "Space"; genreDictionary[45] = "Meditative"; genreDictionary[46] = "Instrumental Pop"; genreDictionary[47] = "Instrumental Rock"; genreDictionary[48] = "Ethnic"; genreDictionary[49] = "Gothic"; genreDictionary[50] = "Darkwave"; genreDictionary[51] = "Techno-Industrial"; genreDictionary[52] = "Electronic"; genreDictionary[53] = "Pop-Folk"; genreDictionary[54] = "Eurodance"; genreDictionary[55] = "Dream"; genreDictionary[56] = "Southern Rock"; genreDictionary[57] = "Comedy"; genreDictionary[58] = "Cult"; genreDictionary[59] = "Gangsta"; genreDictionary[60] = "Top40"; genreDictionary[61] = "Christian Rap"; genreDictionary[62] = "Pop/Funk"; genreDictionary[63] = "Jungle"; genreDictionary[64] = "Native American"; genreDictionary[65] = "Cabaret"; genreDictionary[66] = "New Wave"; genreDictionary[67] = "Psychedelic"; genreDictionary[68] = "Rave"; genreDictionary[69] = "Showtunes"; genreDictionary[70] = "Trailer"; genreDictionary[71] = "Lo-Fi"; genreDictionary[72] = "Tribal"; genreDictionary[73] = "Acid Punk"; genreDictionary[74] = "Acid Jazz"; genreDictionary[75] = "Polka"; genreDictionary[76] = "Retro"; genreDictionary[77] = "Musical"; genreDictionary[78] = "Rock & Roll"; genreDictionary[79] = "Hard Rock"; genreDictionary[80] = "Folk"; genreDictionary[81] = "Folk-Rock"; genreDictionary[82] = "National Folk"; genreDictionary[83] = "Swing"; genreDictionary[84] = "Fast Fusion"; genreDictionary[85] = "Bebob"; genreDictionary[86] = "Latin"; genreDictionary[87] = "Revival"; genreDictionary[88] = "Celtic"; genreDictionary[89] = "Bluegrass"; genreDictionary[90] = "Avantgarde"; genreDictionary[91] = "Gothic Rock"; genreDictionary[92] = "Progressive Rock"; genreDictionary[93] = "Psychedelic Rock"; genreDictionary[94] = "Symphonic Rock"; genreDictionary[95] = "Slow Rock"; genreDictionary[96] = "Big Band"; genreDictionary[97] = "Chorus"; genreDictionary[98] = "Easy Listening"; genreDictionary[99] = "Acoustic"; genreDictionary[100] = "Humour"; genreDictionary[101] = "Speech"; genreDictionary[102] = "Chanson"; genreDictionary[103] = "Opera"; genreDictionary[104] = "Chamber Music"; genreDictionary[105] = "Sonata"; genreDictionary[106] = "Symphony"; genreDictionary[107] = "Booty Bass"; genreDictionary[108] = "Primus"; genreDictionary[109] = "Porn Groove"; genreDictionary[110] = "Satire"; genreDictionary[111] = "Slow Jam"; genreDictionary[112] = "Club"; genreDictionary[113] = "Tango"; genreDictionary[114] = "Samba"; genreDictionary[115] = "Folklore"; genreDictionary[116] = "Ballad"; genreDictionary[117] = "Power Ballad"; genreDictionary[118] = "Rhythmic Soul"; genreDictionary[119] = "Freestyle"; genreDictionary[120] = "Duet"; genreDictionary[121] = "Punk Rock"; genreDictionary[122] = "Drum Solo"; genreDictionary[123] = "A capella"; genreDictionary[124] = "Euro-House"; genreDictionary[125] = "Dance Hall"; return genreDictionary; } QString Utilities::genreFromRawTagGenre(QString rawTagGenre) { QHash genreDictionary = tagGenreDictionary(); QString genre = rawTagGenre; //if (rawTagGenre.startsWith("(") && rawTagGenre.endsWith(")")) { QString tagGenreNoParenth = rawTagGenre.remove("(").remove(")").trimmed(); bool ok; int tagGenreNo = tagGenreNoParenth.toInt(&ok); if (ok) { genre = genreDictionary[tagGenreNo]; } //} return genre; } QString Utilities::rawTagGenreFromGenre(QString genre) { QHash genreDictionary = tagGenreDictionary(); QString tagGenre = genre; int tagGenreNo = genreDictionary.key(genre, -1); if (tagGenreNo != -1) { tagGenre = QString("(%1)").arg(tagGenreNo); } return tagGenre; } QStringList Utilities::genresFromRawTagGenres(QStringList rawTagGenres) { QStringList genres; for (int i = 0; i < rawTagGenres.count(); i++) { QString genre = genreFromRawTagGenre(rawTagGenres.at(i)); if (genres.indexOf(genre) == -1 && !genre.isEmpty()) { genres.append(genre); } } return genres; } QStringList Utilities::rawTagGenresFromGenres(QStringList genres) { QStringList rawTagGenres; for (int i = 0; i < genres.count(); i++) { QString rawTagGenre = rawTagGenreFromGenre(genres.at(i)); if (rawTagGenres.indexOf(rawTagGenre) == -1 && !rawTagGenre.isEmpty()) { rawTagGenres.append(rawTagGenre); } } return rawTagGenres; } QString Utilities::genreFilter(QString genre) { QHash genreDictionary = tagGenreDictionary(); QString genreFilter = genre; int tagGenreNo = genreDictionary.key(genre, -1); if (tagGenreNo != -1) { genreFilter += QString("|OR|(%1)|OR|%1").arg(tagGenreNo); } return genreFilter; } #endif //UTILITIES_FILETAGS_CPP bangarang-bangarang/src/platform/utilities/filetags.h000066400000000000000000000064121166760560600233310ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_FILETAGS_H #define UTILITIES_FILETAGS_H #include "../mediaitemmodel.h" #include #include #include #include #include #include #include #include /** * This namespace provides a list of convenience functions * used throughout bangarang. */ namespace Utilities { QPixmap getArtworkFromTag(const QString &url, QSize size = QSize(164, 164)); QImage getArtworkImageFromTag(const QString &url, QSize size = QSize(164, 164)); QString tagType(const QString &url); MediaItem getAllInfoFromTag(const QString &url, MediaItem templateItem = MediaItem()); QString getArtistFromTag(const QString &url); QString getAlbumFromTag(const QString &url); QString getTitleFromTag(const QString &url); QString getGenreFromTag(const QString &genre); int getYearFromTag(const QString &url); int getDurationFromTag(const QString &url); int getTrackNumberFromTag(const QString &url); QStringList getID3V2TextFrameFields(TagLib::ID3v2::Tag *id3v2, const TagLib::ByteVector &type); QStringList getXiphTextFields(TagLib::Ogg::XiphComment *xiph, const TagLib::ByteVector &type); void saveAllInfoToTag(const QList &mediaList); bool saveArtworkToTag(const QString &url, const QPixmap *pixmap); bool saveArtworkToTag(const QString &url, const QString &imageUrl); void setArtistTag(const QString &url, const QString &artist); void setAlbumTag(const QString &url, const QString &album); void setTitleTag(const QString &url, const QString &title); void setGenreTag(const QString &url, const QString &genre); void setYearTag(const QString &url, int year); void setDurationTag(const QString &url, int duration); void setTrackNumberTag(const QString &url, int trackNumber); void setID3V2TextFrameFields(TagLib::ID3v2::Tag *id3v2, const TagLib::ByteVector &type, const QStringList &values); void setXiphTextFields(TagLib::Ogg::XiphComment *xiph, const TagLib::ByteVector &type, const QStringList &values); TagLib::ID3v2::AttachedPictureFrame *attachedPictureFrame(TagLib::ID3v2::Tag *id3Tag, bool create = false); QHash tagGenreDictionary(); QString genreFromRawTagGenre(QString rawTagGenre); QString rawTagGenreFromGenre(QString genre); QStringList genresFromRawTagGenres(QStringList rawTagGenres); QStringList rawTagGenresFromGenres(QStringList genres); QString genreFilter(QString genre); } #endif //UTILITIES_FILETAGS_H bangarang-bangarang/src/platform/utilities/general.cpp000066400000000000000000000360501166760560600235040ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_GENERAL_CPP #define UTILITIES_GENERAL_CPP #include "general.h" #include "sha256.h" #include "../mediaitemmodel.h" #include "../mediavocabulary.h" #include "../mediaquery.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include QString Utilities::mergeLRIs(const QString &lri, const QString &lriToMerge) { QString mergedLRI; MediaListProperties targetProperties(lri); MediaListProperties sourceProperties(lriToMerge); if (targetProperties.engine() == sourceProperties.engine() && targetProperties.engineArg() == sourceProperties.engineArg()) { mergedLRI = targetProperties.engine() + targetProperties.engineArg() + QString("?"); QStringList targetFilterList = targetProperties.engineFilterList(); QStringList sourceFilterList = sourceProperties.engineFilterList(); QString mergedFilter; for (int i = 0; i < targetFilterList.count(); i++) { QString targetFilter = targetFilterList.at(i); QString field = targetProperties.filterField(targetFilter); QString sourceFilter = sourceProperties.filterForField(field); if (sourceFilter.isEmpty() || sourceFilter == targetFilter) { mergedFilter = targetFilter; } else if (!sourceFilter.isEmpty()) { mergedFilter = field + targetProperties.filterOperator(targetFilter) + targetProperties.filterValue(targetFilter) + QString("|OR|") + sourceProperties.filterValue(sourceFilter); } if (!mergedFilter.isEmpty()) { mergedLRI += QString("%1||").arg(mergedFilter); } } MediaListProperties mergedProperties(mergedLRI); mergedFilter = QString(); for (int i = 0; i < sourceFilterList.count(); i++) { QString sourceFilter = sourceFilterList.at(i); QString field = sourceProperties.filterField(sourceFilter); if (mergedProperties.filterForField(field).isEmpty() && mergedProperties.engineFilterList().indexOf(sourceFilter) == -1) { mergedFilter = sourceFilter; } if (!mergedFilter.isEmpty()) { mergedLRI += QString("%1||").arg(mergedFilter); } } } return mergedLRI; } QUrl Utilities::artistResource(const QString &artistName) { MediaVocabulary mediaVocabulary = MediaVocabulary(); MediaQuery query; QStringList bindings; bindings.append("r"); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(QString("{?pr <%1> ?r. } UNION {?pr <%2> ?r . } UNION {?pr <%3> ?r . } ") .arg(mediaVocabulary.musicArtist().toString()) .arg(mediaVocabulary.musicPerformer().toString()) .arg(mediaVocabulary.musicComposer().toString())); query.addCondition(QString("?r <%1> ?name . ").arg(mediaVocabulary.ncoFullname().toString())); query.startFilter(); query.addFilterConstraint("name", artistName, MediaQuery::Equal); query.endFilter(); query.endWhere(); Soprano::Model * mainModel = Nepomuk::ResourceManager::instance()->mainModel(); Soprano::QueryResultIterator it = query.executeSelect(mainModel); QUrl resource; while (it.next()) { resource = it.binding("r").uri(); } return resource; } QUrl Utilities::albumResource(const QString &albumName) { MediaVocabulary mediaVocabulary = MediaVocabulary(); MediaQuery query; QStringList bindings; bindings.append("r"); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(QString("?r rdf:type <%1> . ").arg(mediaVocabulary.typeMusicAlbum().toString())); query.addCondition(QString("?r <%1> ?name . ").arg(mediaVocabulary.musicAlbumName().toString())); query.startFilter(); query.addFilterConstraint("name", albumName, MediaQuery::Equal); query.endFilter(); query.endWhere(); Soprano::Model * mainModel = Nepomuk::ResourceManager::instance()->mainModel(); Soprano::QueryResultIterator it = query.executeSelect(mainModel); QUrl resource; while (it.next()) { resource = it.binding("r").uri(); } return resource; } QUrl Utilities::TVSeriesResource(const QString &seriesName) { MediaVocabulary mediaVocabulary = MediaVocabulary(); MediaQuery query; QStringList bindings; bindings.append("r"); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(QString("?r rdf:type <%1> . ").arg(mediaVocabulary.typeTVSeries().toString())); query.addCondition(QString("?r <%1> ?name . ").arg(mediaVocabulary.videoSeriesTitle().toString())); query.startFilter(); query.addFilterConstraint("name", seriesName, MediaQuery::Equal); query.endFilter(); query.endWhere(); Soprano::Model * mainModel = Nepomuk::ResourceManager::instance()->mainModel(); Soprano::QueryResultIterator it = query.executeSelect(mainModel); QUrl resource; while (it.next()) { resource = it.binding("r").uri(); } return resource; } QUrl Utilities::actorResource(const QString &actorName) { MediaVocabulary mediaVocabulary = MediaVocabulary(); MediaQuery query; QStringList bindings; bindings.append("r"); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(QString("?pr <%1> ?r . ").arg(mediaVocabulary.videoActor().toString())); query.addCondition(QString("?r <%1> ?name . ").arg(mediaVocabulary.ncoFullname().toString())); query.startFilter(); query.addFilterConstraint("name", actorName, MediaQuery::Equal); query.endFilter(); query.endWhere(); Soprano::Model * mainModel = Nepomuk::ResourceManager::instance()->mainModel(); Soprano::QueryResultIterator it = query.executeSelect(mainModel); QUrl resource; while (it.next()) { resource = it.binding("r").uri(); } return resource; } QUrl Utilities::directorResource(const QString &directorName) { MediaVocabulary mediaVocabulary = MediaVocabulary(); MediaQuery query; QStringList bindings; bindings.append("r"); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(QString("?pr <%1> ?r . ").arg(mediaVocabulary.videoDirector().toString())); query.addCondition(QString("?r <%1> ?name . ").arg(mediaVocabulary.ncoFullname().toString())); query.startFilter(); query.addFilterConstraint("name", directorName, MediaQuery::Equal); query.endFilter(); query.endWhere(); Soprano::Model * mainModel = Nepomuk::ResourceManager::instance()->mainModel(); Soprano::QueryResultIterator it = query.executeSelect(mainModel); QUrl resource; while (it.next()) { resource = it.binding("r").uri(); } return resource; } KUrl Utilities::deviceUrl(const QString &type, const QString& udi, const QString& name, QString content, int title ) { KUrl url = QString("device://%1%2").arg(type, udi); QString query; if (!name.isEmpty()) query += QString("?name=%1").arg(name); if (!content.isEmpty()) { if ( query.isEmpty() ) query = "?"; else query += "&"; query += QString("content=%1").arg(content); } if (!query.isEmpty()) url.setQuery(query); if (title != invalidTitle()) url.setFragment(QString("%1").arg(title)); return url; } QString Utilities::deviceNameFromUrl(const KUrl& url) { return url.queryItemValue("name"); } int Utilities::deviceTitleFromUrl(const KUrl& url) { if (!url.hasFragment()) return invalidTitle(); bool ok = false; int title = url.fragment().toInt(&ok, 0); return ok ? title : invalidTitle(); } QString Utilities::deviceUdiFromUrl(const KUrl& url) { return url.path(); } int Utilities::invalidTitle() { return -1; } QString Utilities::deviceName(QString udi, Phonon::MediaObject *mobj) { QString name; const Solid::OpticalDisc *disc = Solid::Device( udi ).as(); if ( disc != NULL ) name = disc->label(); if ( !name.isEmpty() || mobj == NULL) return name; else if (!mobj->metaData("TITLE").isEmpty()) return mobj->metaData("TITLE").join(""); else return QString(); } bool Utilities::nepomukInited() { bool nepomukInited = Nepomuk::ResourceManager::instance()->initialized(); if (!nepomukInited) { Nepomuk::ResourceManager::instance()->init(); nepomukInited = Nepomuk::ResourceManager::instance()->initialized(); } return nepomukInited; } QStringList Utilities::cleanStringList(QStringList stringList) { QStringList returnList; stringList.removeDuplicates(); for (int i = 0; i < stringList.count(); i++) { QString string = stringList.at(i); if (!string.isEmpty()) { returnList.append(string); } } return returnList; } QString Utilities::removeRangesFromString(const QString &str, QString begin, QString end) { QString edited = str; int bPos = edited.indexOf(begin), ePos, endLen = end.length(); while ( bPos >= 0 ) { ePos = edited.indexOf(end, bPos); if ( ePos <= bPos ) { //e.g. -1 if not found break; } edited = edited.remove(bPos, ePos - bPos + endLen); //including the end str bPos = edited.indexOf(begin); } return edited.trimmed(); } QString Utilities::titleForRequest(const QString& title) { QString edited = title, tmp; //Chop filename extension int extLen = edited.length() - edited.lastIndexOf("."); //if no "." is found extLen is greater than title.length() if ( extLen < 5 && extLen < edited.length() ) { edited.chop(extLen); } //Remove square brackets as filenames may contain information about the track in it // as [1080p;x286;AUD_en,de;SUB_en] tmp = Utilities::removeRangesFromString(edited, "[", "]"); if ( !tmp.isEmpty() ) { edited = tmp; } //As this is only for requesting data we will also remove normal brackets //user like to store year, etc in it which is NOT the real title //if they are relevant for the fetching the user will see the choices anyway. tmp = Utilities::removeRangesFromString(edited, "(", ")"); if ( !tmp.isEmpty() ) { edited = tmp; } //Replace underscores with spaces tmp = edited.replace('_', ' ').trimmed(); if ( !tmp.isEmpty() ) { edited = tmp; } //Remove "the" from front of name if (edited.startsWith("the", Qt::CaseInsensitive) && KGlobal::locale()->language().startsWith("en")) { tmp = edited.mid(4).trimmed(); } if ( !tmp.isEmpty() ) { edited = tmp; } return edited; } QString Utilities::wordsForTimeSince(const QDateTime &dateTime) { QDateTime currentDateTime = QDateTime::currentDateTime(); if (!dateTime.isValid() && dateTime > currentDateTime) { return QString(); } int secsSince = dateTime.secsTo(currentDateTime); int minutesSince = secsSince/60; int hoursSince = minutesSince/60; int daysSince = dateTime.daysTo(currentDateTime); int weeksSince = daysSince/7; int monthsSince = 0; int yearsSince = (daysSince < 366) ? 0 : currentDateTime.date().year() - dateTime.date().year(); if (currentDateTime.date().month() != dateTime.date().month() && weeksSince >= 4) { if (yearsSince == 0) { monthsSince = currentDateTime.date().month() - dateTime.date().month(); } else { monthsSince = 12*yearsSince + (currentDateTime.date().month() - dateTime.date().month()); } } QString words; if (yearsSince > 0) { words = i18np("a year ago", "%1 years ago", yearsSince); } else if (monthsSince > 0){ words = i18np("a month ago", "%1 months ago", monthsSince); } else if (weeksSince > 0) { words = i18np("a week ago", "%1 weeks ago", weeksSince); } else if (daysSince > 0) { words = i18np("a day ago", "%1 days ago", daysSince); } else if (hoursSince > 0) { words = i18np("an hour ago", "%1 hours ago", hoursSince); } else if (minutesSince > 0) { words = i18np("a minute ago", "%1 minutes ago", minutesSince); } else { words = i18n("a few seconds ago"); } return words; } QString Utilities::capitalize(const QString &text) { QStringList capWords; QStringList words = text.split(" "); for (int i=0; i < words.count(); i++) { QString capWord = words.at(i).left(1).toUpper() + words.at(i).mid(1); capWords.append(capWord); } return capWords.join(" "); } QHash Utilities::multiValueAppend(QHash multiValues, QString key, QString newValue) { QStringList multiValue = multiValues.value(key); if (!multiValue.contains(newValue)) { multiValue.append(newValue); multiValues.insert(key, multiValue); } return multiValues; } QString Utilities::durationString(int seconds) { QTime durTime(seconds/(60*60), (seconds / 60) % 60, (seconds) % 60); int minutes = 0; int remSeconds = 0; minutes = durTime.hour()*60 + durTime.minute(); remSeconds = durTime.second(); QString displayTime; if (remSeconds < 10) { displayTime = QString("%1:0%2").arg(minutes).arg(remSeconds); } else { displayTime = QString("%1:%2").arg(minutes).arg(remSeconds); } return displayTime; } QString Utilities::sha256Of( QString in ) { // Copied from Amarok /src/services/ampache/AmpacheAccountLogin.cpp unsigned char digest[ SHA512_DIGEST_SIZE]; unsigned char* toHash = (unsigned char*)in.toUtf8().data(); sha256( toHash , qstrlen( ( char* )toHash ), digest ); // this part copied from main() in sha256.cpp unsigned char output[2 * SHA512_DIGEST_SIZE + 1]; int i; output[2 * SHA256_DIGEST_SIZE ] = '\0'; for (i = 0; i < SHA256_DIGEST_SIZE ; i++) { sprintf((char *) output + 2*i, "%02x", digest[i]); } return QString::fromAscii( (const char*)output ); } #endif //UTILITIES_GENERAL_CPP bangarang-bangarang/src/platform/utilities/general.h000066400000000000000000000054541166760560600231550ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_GENERAL_H #define UTILITIES_GENERAL_H #include #include #include #include #include namespace Phonon { class MediaObject; } /** * @def SAVE_DELETE_OBJ * This macro deletes an object only if the pointer isn't NULL and sets it NULL after deletion */ //note that the do/while loop is only inserted as the macro should look as a function, terminated //with ; (semicolon) which wouldn't be possible otherwise. The compiler will optimize it any way //so it doesn't influence the speed #define SAVE_DELETE_OBJ(obj) \ do { \ if (obj != NULL) { \ delete obj; \ obj = NULL; \ } \ } while( false ) /** * This namespace provides a list of convenience functions * used throughout bangarang. */ namespace Utilities { static QMutex mutex; QString mergeLRIs(const QString &lri, const QString &lriToMerge); QUrl artistResource(const QString &artistName); QUrl albumResource(const QString &albumName); QUrl TVSeriesResource(const QString &seriesName); QUrl actorResource(const QString &actorName); QUrl directorResource(const QString &directorName); KUrl deviceUrl(const QString &type, const QString &udi, const QString& name = QString(), QString content = QString(), int title = -1 ); int deviceTitleFromUrl(const KUrl &url); QString deviceUdiFromUrl(const KUrl &url); QString deviceNameFromUrl(const KUrl &url); int invalidTitle(); QString deviceName( QString udi, Phonon::MediaObject *mobj = NULL ); bool nepomukInited(); QStringList cleanStringList(QStringList stringList); QString removeRangesFromString(const QString& str, QString begin, QString end); QString titleForRequest(const QString &title); QString wordsForTimeSince(const QDateTime & dateTime); QString capitalize(const QString & text); QHash multiValueAppend(QHash multiValues, QString key, QString newValue); QString durationString(int seconds); QString sha256Of(QString in); } #endif //UTILITIES_GENERAL_H bangarang-bangarang/src/platform/utilities/mediaitems.cpp000066400000000000000000002163661166760560600242220ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_MEDIAITEMS_CPP #define UTILITIES_MEDIAITEMS_CPP #include "mediaitems.h" #include "filetags.h" #include "typechecks.h" #include "general.h" #include "../mediaitemmodel.h" #include "../mediavocabulary.h" #include "../mediaquery.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include MediaItem Utilities::getArtistCategoryItem(const QString &artist) { MediaItem mediaItem; MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.musicArtistNameBinding()); bindings.append(mediaVocabulary.musicArtistDescriptionBinding()); bindings.append(mediaVocabulary.musicArtistArtworkBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required)); query.addCondition(mediaVocabulary.hasMusicAnyArtistName(MediaQuery::Required, artist, MediaQuery::Equal)); query.addCondition(mediaVocabulary.hasMusicAnyArtistDescription(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasMusicArtistArtwork(MediaQuery::Optional)); query.endWhere(); query.addLimit(1); Soprano::QueryResultIterator it = query.executeSelect(Nepomuk::ResourceManager::instance()->mainModel()); while( it.next() ) { QString artist = it.binding(mediaVocabulary.musicArtistNameBinding()).literal().toString().trimmed(); if (!artist.isEmpty()) { mediaItem.url = QString("music://albums?artist=%1").arg(artist); mediaItem.title = artist; mediaItem.type = QString("Category"); mediaItem.fields["categoryType"] = QString("Artist"); mediaItem.nowPlaying = false; mediaItem.artwork = KIcon("system-users"); mediaItem.fields["title"] = artist; mediaItem.fields["description"] = it.binding(mediaVocabulary.musicArtistDescriptionBinding()).literal().toString().trimmed(); mediaItem.fields["artworkUrl"] = it.binding(mediaVocabulary.musicArtistArtworkBinding()).uri().toString(); } } return mediaItem; } MediaItem Utilities::mediaItemFromUrl(KUrl url, bool preferFileMetaData) { MediaItem mediaItem; if(isDisc(url)) { bool dvd = isDvd(url); QString album = dvd ? "DVD Video" : "Audio CD"; QString discTitle = deviceNameFromUrl(url); int track = deviceTitleFromUrl(url); QString title; if (track != invalidTitle()) title = i18n(dvd ? "Title %1" : "Track %1", track); else title = i18n("Full Disc"); mediaItem.url = url.url(); mediaItem.artwork = dvd ? KIcon("media-optical-dvd") : KIcon("media-optical-audio"); mediaItem.title = title; mediaItem.fields["url"] = mediaItem.url; mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["discTitle"] = discTitle; if ( dvd ) mediaItem.fields["videoType"] = "DVD Title"; else mediaItem.fields["audioType"] = "CD Track"; mediaItem.fields["album"] = album; mediaItem.type = dvd ? "Video" : "Audio"; mediaItem.fields["trackNumber"] = track; mediaItem = makeSubtitle(mediaItem); return mediaItem; } if (url.prettyUrl().startsWith("filex:/")) { url = urlForFilex(url); } MediaVocabulary mediaVocabulary = MediaVocabulary(); if (url.isLocalFile() && (Utilities::isM3u(url.url()) || Utilities::isPls(url.url()))) { mediaItem.artwork = KIcon("audio-x-scpls"); mediaItem.url = QString("savedlists://%1").arg(url.url()); mediaItem.title = url.fileName(); mediaItem.fields["title"] = url.fileName(); mediaItem.subTitle = i18n("Playlist"); mediaItem.type = "Category"; mediaItem.fields["categoryType"] = "Basic+Artwork"; return mediaItem; } if (url.isLocalFile() && Utilities::isFSDirectory(url.url())) { mediaItem.artwork = KIcon("folder"); mediaItem.url = QString("files://media?browseFolder||%1").arg(url.prettyUrl()); mediaItem.title = url.directory(); mediaItem.fields["title"] = mediaItem.title; mediaItem.type = "Category"; mediaItem.fields["categoryType"] = "Basic+Artwork"; return mediaItem; } mediaItem.url = url.prettyUrl(); mediaItem.title = url.fileName(); mediaItem.fields["url"] = mediaItem.url; mediaItem.fields["title"] = mediaItem.title; //Determine type of file - nepomuk is primary source bool foundInNepomuk = false; if (nepomukInited()) { //Try to find the corresponding resource in Nepomuk Nepomuk::Resource res = mediaResourceFromUrl(url); if (res.exists() && (res.hasType(mediaVocabulary.typeAudio()) || res.hasType(mediaVocabulary.typeAudioMusic()) || res.hasType(mediaVocabulary.typeAudioStream()) || res.hasType(mediaVocabulary.typeVideo()) || res.hasType(mediaVocabulary.typeVideoMovie()) || res.hasType(mediaVocabulary.typeVideoTVShow())) ) { mediaItem = mediaItemFromNepomuk(res); foundInNepomuk = true; } //Get mediaItem from Nepomuk if file Metadata is not preferred OR // is of type for which we are unable to read metadata if (foundInNepomuk && (!preferFileMetaData || res.hasType(mediaVocabulary.typeVideo()) || res.hasType(mediaVocabulary.typeVideoMovie()) || res.hasType(mediaVocabulary.typeVideoTVShow()))) { mediaItem = mediaItemFromNepomuk(res); } } if (!foundInNepomuk || mediaItem.type.isEmpty()) { mediaItem.type == "Audio"; // default to Audio; if (isAudio(mediaItem.url)) { mediaItem.type = "Audio"; mediaItem.fields["audioType"] = "Audio Clip"; } if (isMusic(mediaItem.url)) { mediaItem.type = "Audio"; mediaItem.fields["audioType"] = "Music"; } if (isVideo(mediaItem.url)){ mediaItem.type = "Video"; mediaItem.fields["videoType"] = "Video Clip"; } if (!url.isLocalFile()) { //Audio streams are mostly internet radio and so on //It's nicer for the user to see the server he's getting the stream from than anything //else as e.g. radios have their own website/servers mediaItem.title = url.host() + " - " + url.fileName(); mediaItem.fields["title"] = mediaItem.title; mediaItem.type = "Audio"; mediaItem.fields["audioType"] = "Audio Stream"; mediaItem.fields["sourceLri"] = "audiostreams://"; //Set sourceLri so that any MediaItemModel will know how to save info } } if (mediaItem.type == "Audio") { if (mediaItem.fields["audioType"] == "Audio Clip") { mediaItem.artwork = KIcon("audio-x-generic"); } else if (mediaItem.fields["audioType"] == "Music") { mediaItem.artwork = KIcon("audio-mp4"); if (!foundInNepomuk || preferFileMetaData) { mediaItem = Utilities::getAllInfoFromTag(mediaItem.url, mediaItem); } } else if (mediaItem.fields["audioType"] == "Audio Stream") { mediaItem.artwork = KIcon("text-html"); if (mediaItem.title.isEmpty()) { mediaItem.title = url.prettyUrl(); } } } else if (mediaItem.type == "Video") { if (mediaItem.fields["videoType"] == "Video Clip") { mediaItem.artwork = KIcon("video-x-generic"); } } //Lookup nepomuk metadata not stored with file if (nepomukInited() && preferFileMetaData) { Nepomuk::Resource res(KUrl(mediaItem.url)); QUrl nieUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url"); mediaItem.fields["rating"] = res.rating(); QStringList tags; foreach (Nepomuk::Tag tag, res.tags()) { tags.append(tag.label()); } mediaItem.fields["tags"] = tags; mediaItem.fields["playCount"] = res.property(mediaVocabulary.playCount()).toInt(); if (res.property(mediaVocabulary.lastPlayed()).isValid()) { QDateTime lastPlayed = res.property(mediaVocabulary.lastPlayed()).toDateTime(); if (lastPlayed.isValid()) { mediaItem.fields["lastPlayed"] = lastPlayed; } } mediaItem.fields["artworkUrl"] = res.property(mediaVocabulary.artwork()).toResource() .property(nieUrl).toString(); mediaItem.fields["relatedTo"] = Utilities::getLinksForResource(res); } return mediaItem; } QStringList Utilities::mediaListUrls(const QList &mediaList) { QStringList urls; for (int i = 0; i < mediaList.count(); i++) { urls << mediaList.at(i).url; } return urls; } int Utilities::mediaListDuration(const QList &mediaList) { int duration = 0; for (int i = 0; i < mediaList.count(); i++) { duration += mediaList.at(i).fields["duration"].toInt(); } return duration; } QString Utilities::mediaListDurationText(const QList &mediaList) { int duration = mediaListDuration(mediaList); if (duration == 0) { return QString(); } int hours = duration/3600; int minutes = (duration - (hours*3600))/60; int seconds = duration - (hours*3600) - (minutes*60); QString min = minutes < 10 ? QString("0%1").arg(minutes): QString("%1").arg(minutes); QString sec = seconds < 10 ? QString("0%1").arg(seconds): QString("%1").arg(seconds); return QString("%1:%2:%3").arg(hours).arg(min).arg(sec); } QList Utilities::mediaItemsDontExist(const QList &mediaList) { QList items; for (int i = 0; i < mediaList.count(); i++) { MediaItem mediaItem = mediaList.at(i); bool dvdNotFound = false; QString url_string = mediaItem.url; if (isDisc(url_string)) { bool dvd = isDvd(url_string); continue; dvdNotFound = true; Q_UNUSED(dvd); } KUrl url = KUrl(QUrl::toPercentEncoding(url_string).data()); if (dvdNotFound || (url.isValid() && url.isLocalFile() && !QFile(url.path()).exists()) || url_string.startsWith("trash:/") ) { mediaItem.exists = false; kDebug() << mediaItem.url << " missing"; items << mediaItem; } } return items; } MediaItem Utilities::mediaItemFromNepomuk(Nepomuk::Resource res, const QString &sourceLri) { MediaVocabulary mediaVocabulary = MediaVocabulary(); QString type; //Check types beyond the current vocabulary to detect basic Audio type indexed by Strigi if (res.hasType(Soprano::Vocabulary::Xesam::Audio()) || res.hasType(QUrl("http://www.semanticdesktop.org/ontologies/nfo#Audio"))) { type = "Audio Clip"; } if (res.hasType(mediaVocabulary.typeAudioMusic())) { type = "Music"; } if (res.hasType(mediaVocabulary.typeAudioStream())) { type = "Audio Stream"; } //Check types beyond the current vocabulary to detect basic Video type indexed by Strigi if (res.hasType(mediaVocabulary.typeVideo()) || res.hasType(QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Video")) || res.hasType(Soprano::Vocabulary::Xesam::Video())) { type = "Video Clip"; } if (res.hasType(mediaVocabulary.typeVideoMovie())) { type = "Movie"; } if (res.hasType(mediaVocabulary.typeVideoTVShow())) { type = "TV Show"; } QUrl nieUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url"); KUrl url(res.property(nieUrl).toUrl()); url = decodedUrl(url).prettyUrl(); if (url.prettyUrl().startsWith("filex:/")) { url = urlForFilex(url); } //If nepomuk resource type is not recognized try recognition by mimetype if (type.isEmpty()) { if (isAudio(url.prettyUrl())) { type = "Audio Clip"; } if (isMusic(url.prettyUrl())) { type = "Music"; } if (isVideo(url.prettyUrl())){ type = "Video Clip"; } } MediaItem mediaItem; mediaItem.url = url.prettyUrl(); mediaItem.exists = !url.prettyUrl().startsWith("filex:/"); //if url is still a filex:/ url mark not exists. mediaItem.fields["url"] = mediaItem.url; mediaItem.fields["resourceUri"] = res.resourceUri().toString(); mediaItem.fields["sourceLri"] = sourceLri; mediaItem.title = res.property(mediaVocabulary.title()).toString(); mediaItem.fields["title"] = mediaItem.title; if (mediaItem.title.isEmpty()) { if (KUrl(mediaItem.url).isLocalFile()) { mediaItem.title = KUrl(mediaItem.url).fileName(); mediaItem.fields["title"] = KUrl(mediaItem.url).fileName(); } else { mediaItem.title = mediaItem.url; mediaItem.fields["title"] = mediaItem.url; } } mediaItem.fields["description"] = res.property(mediaVocabulary.description()).toString(); int duration = res.property(mediaVocabulary.duration()).toInt(); if (duration != 0) { mediaItem.duration = Utilities::durationString(duration); mediaItem.fields["duration"] = duration; } QStringList rawGenres = res.property(mediaVocabulary.genre()).toStringList(); mediaItem.fields["genre"] = genresFromRawTagGenres(rawGenres); mediaItem.fields["rating"] = res.rating(); QStringList tags; foreach (Nepomuk::Tag tag, res.tags()) { tags.append(tag.label()); } mediaItem.fields["tags"] = tags; mediaItem.fields["playCount"] = res.property(mediaVocabulary.playCount()).toInt(); if (res.property(mediaVocabulary.lastPlayed()).isValid()) { QDateTime lastPlayed = res.property(mediaVocabulary.lastPlayed()).toDateTime(); if (lastPlayed.isValid()) { mediaItem.fields["lastPlayed"] = lastPlayed; } } mediaItem.fields["artworkUrl"] = res.property(mediaVocabulary.artwork()).toResource() .property(nieUrl).toString(); mediaItem.fields["relatedTo"] = Utilities::getLinksForResource(res); if (type == "Audio Clip" || type == "Audio Stream" || type == "Music") { mediaItem.type = "Audio"; mediaItem.fields["audioType"] = type; mediaItem.artwork = KIcon("audio-x-wav"); if (type == "Audio Stream") { mediaItem.artwork = KIcon("text-html"); } else if (type == "Music") { mediaItem.artwork = KIcon("audio-mpeg"); QStringList artists; QList artistResources = res.property(mediaVocabulary.musicArtist()).toResourceList(); for (int i = 0; i < artistResources.count(); i++) { artists.append(artistResources.at(i).property(mediaVocabulary.musicArtistName()).toString()); } artistResources = res.property(mediaVocabulary.musicPerformer()).toResourceList(); for (int i = 0; i < artistResources.count(); i++) { artists.append(artistResources.at(i).property(mediaVocabulary.musicArtistName()).toString()); } artists = cleanStringList(artists); mediaItem.fields["artist"] = artists; QStringList composers; QList composerResources = res.property(mediaVocabulary.musicComposer()).toResourceList(); for (int i = 0; i < composerResources.count(); i++) { composers.append(composerResources.at(i).property(mediaVocabulary.musicArtistName()).toString()); } composers = cleanStringList(composers); mediaItem.fields["composer"] = composers; QString album = res.property(mediaVocabulary.musicAlbum()).toResource() .property(mediaVocabulary.musicAlbumName()).toString(); if (!album.isEmpty()) { mediaItem.fields["album"] = album; } if (res.property(mediaVocabulary.musicAlbumYear()).isValid()) { QDate yearDate = res.property(mediaVocabulary.musicAlbumYear()).toDate(); if (yearDate.isValid()) { mediaItem.fields["year"] = yearDate.year(); } else { mediaItem.fields["year"] = QVariant(QVariant::Int); } } int trackNumber = res.property(mediaVocabulary.musicTrackNumber()).toInt(); if (trackNumber != 0) { mediaItem.fields["trackNumber"] = trackNumber; } else { mediaItem.fields["trackNumber"] = QVariant(QVariant::Int); } } } else if (type == "Video Clip" || type == "Movie" || type == "TV Show") { mediaItem.type = "Video"; mediaItem.fields["videoType"] = type; mediaItem.artwork = KIcon("video-x-generic"); if (type == "Movie" || type == "TV Show") { mediaItem.artwork = KIcon("tool-animator"); if (res.property(mediaVocabulary.releaseDate()).isValid()) { QDate releaseDate = res.property(mediaVocabulary.releaseDate()).toDate(); if (releaseDate.isValid()) { mediaItem.fields["releaseDate"] = releaseDate; mediaItem.fields["year"] = releaseDate.year(); } else { mediaItem.fields["releaseDate"] = QVariant(QVariant::Date); mediaItem.fields["year"] = QVariant(QVariant::Int); } } else { mediaItem.fields["releaseDate"] = QVariant(QVariant::Date); mediaItem.fields["year"] = QVariant(QVariant::Int); } QStringList writers; QList writerResources = res.property(mediaVocabulary.videoWriter()).toResourceList(); for (int i = 0; i < writerResources.count(); i++) { QString name = writerResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { writers.append(name); } } writers = cleanStringList(writers); mediaItem.fields["writer"] = writers; QStringList directors; QList directorResources = res.property(mediaVocabulary.videoDirector()).toResourceList(); for (int i = 0; i < directorResources.count(); i++) { QString name = directorResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { directors.append(name); } } directors = cleanStringList(directors); mediaItem.fields["director"] = directors; QStringList producers; QList producerResources = res.property(mediaVocabulary.videoProducer()).toResourceList(); for (int i = 0; i < producerResources.count(); i++) { QString name = producerResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { producers.append(name); } } producers = cleanStringList(producers); mediaItem.fields["producer"] = producers; QStringList actors; QList actorResources = res.property(mediaVocabulary.videoActor()).toResourceList(); for (int i = 0; i < actorResources.count(); i++) { QString name = actorResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { actors.append(name); } } actors = cleanStringList(actors); mediaItem.fields["actor"] = actors; if (type == "TV Show") { mediaItem.artwork = KIcon("video-television"); QString seriesName = res.property(mediaVocabulary.videoSeries()).toResource() .property(mediaVocabulary.videoSeriesTitle()).toString(); if (!seriesName.isEmpty()) { mediaItem.fields["seriesName"] = seriesName; } int season = res.property(mediaVocabulary.videoSeason()).toInt(); if (season !=0 ) { mediaItem.fields["season"] = season; } else { mediaItem.fields["season"] = QVariant(QVariant::Int); } int episodeNumber = res.property(mediaVocabulary.videoEpisodeNumber()).toInt(); if (episodeNumber != 0) { mediaItem.fields["episodeNumber"] = episodeNumber; } else { mediaItem.fields["episodeNumber"] = QVariant(QVariant::Int); } } } } mediaItem = makeSubtitle(mediaItem); return mediaItem; } MediaItem Utilities::mediaItemFromIterator(Soprano::QueryResultIterator &it, const QString &type, const QString &sourceLri) { MediaItem mediaItem; MediaVocabulary mediaVocabulary; Nepomuk::Resource res(it.binding(MediaVocabulary::mediaResourceBinding()).uri()); KUrl url = it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri().isEmpty() ? it.binding(MediaVocabulary::mediaResourceBinding()).uri() : it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri(); url = decodedUrl(url); if (url.prettyUrl().startsWith("filex:/")) { url = urlForFilex(url); } mediaItem.url = url.prettyUrl(); mediaItem.exists = !url.prettyUrl().startsWith("filex:/"); //if url is still a filex:/ url mark not exists. mediaItem.fields["url"] = mediaItem.url; mediaItem.fields["resourceUri"] = it.binding(MediaVocabulary::mediaResourceBinding()).uri().toString(); mediaItem.fields["sourceLri"] = sourceLri; mediaItem.title = it.binding(MediaVocabulary::titleBinding()).literal().toString(); mediaItem.fields["title"] = mediaItem.title; if (mediaItem.title.isEmpty()) { if (KUrl(mediaItem.url).isLocalFile()) { mediaItem.title = KUrl(mediaItem.url).fileName(); mediaItem.fields["title"] = KUrl(mediaItem.url).fileName(); } else { mediaItem.title = mediaItem.url; mediaItem.fields["title"] = mediaItem.url; } } mediaItem.fields["description"] = it.binding(MediaVocabulary::descriptionBinding()).literal().toString(); int duration = it.binding(MediaVocabulary::durationBinding()).literal().toInt(); if (duration != 0) { mediaItem.duration = Utilities::durationString(duration); mediaItem.fields["duration"] = duration; } QStringList rawGenres = res.property(mediaVocabulary.genre()).toStringList(); mediaItem.fields["genre"] = genresFromRawTagGenres(rawGenres); mediaItem.fields["rating"] = it.binding(MediaVocabulary::ratingBinding()).literal().toInt(); QStringList tags; foreach (Nepomuk::Tag tag, res.tags()) { tags.append(tag.label()); } mediaItem.fields["tags"] = tags; mediaItem.fields["playCount"] = it.binding(MediaVocabulary::playCountBinding()).literal().toInt(); if (it.binding(MediaVocabulary::lastPlayedBinding()).isValid()) { QDateTime lastPlayed = it.binding(MediaVocabulary::lastPlayedBinding()).literal().toDateTime(); if (lastPlayed.isValid()) { mediaItem.fields["lastPlayed"] = lastPlayed; } } mediaItem.fields["artworkUrl"] = it.binding(MediaVocabulary::artworkBinding()).uri().toString(); //mediaItem.fields["relatedTo"] = Utilities::getLinksForResource(res); if (type == "Audio Clip" || type == "Audio Stream" || type == "Music") { mediaItem.type = "Audio"; mediaItem.fields["audioType"] = type; mediaItem.artwork = KIcon("audio-x-wav"); if (type == "Audio Stream") { mediaItem.artwork = KIcon("text-html"); } else if (type == "Music") { mediaItem.artwork = KIcon("audio-mpeg"); QStringList artists; QList artistResources = res.property(mediaVocabulary.musicArtist()).toResourceList(); for (int i = 0; i < artistResources.count(); i++) { artists.append(artistResources.at(i).property(mediaVocabulary.musicArtistName()).toString()); } artistResources = res.property(mediaVocabulary.musicPerformer()).toResourceList(); for (int i = 0; i < artistResources.count(); i++) { artists.append(artistResources.at(i).property(mediaVocabulary.musicArtistName()).toString()); } artists = cleanStringList(artists); mediaItem.fields["artist"] = artists; QStringList composers; QList composerResources = res.property(mediaVocabulary.musicComposer()).toResourceList(); for (int i = 0; i < composerResources.count(); i++) { composers.append(composerResources.at(i).property(mediaVocabulary.musicArtistName()).toString()); } composers = cleanStringList(composers); mediaItem.fields["composer"] = composers; //TODO: For some reason virtuoso SPARQL corrupts string variable non-ascii characters when a filter is specified //WORKAROUND: Prefer album title using album resource for now QString album; Nepomuk::Resource albumRes(it.binding(MediaVocabulary::albumResourceBinding()).uri()); if (res.exists()) { album = albumRes.property(mediaVocabulary.musicAlbumName()).toString(); } else { album = it.binding(MediaVocabulary::musicAlbumTitleBinding()).literal().toString(); } if (!album.isEmpty()) { mediaItem.fields["album"] = album; } if (it.binding(MediaVocabulary::musicAlbumYearBinding()).isValid()) { QDate yearDate = it.binding(MediaVocabulary::musicAlbumYearBinding()).literal().toDate(); if (yearDate.isValid()) { mediaItem.fields["year"] = yearDate.year(); } else { mediaItem.fields["year"] = QVariant(QVariant::Int); } } int trackNumber = it.binding(MediaVocabulary::musicTrackNumberBinding()).literal().toInt(); if (trackNumber != 0) { mediaItem.fields["trackNumber"] = trackNumber; } else { mediaItem.fields["trackNumber"] = QVariant(QVariant::Int); } } } else if (type == "Video Clip" || type == "Movie" || type == "TV Show") { mediaItem.type = "Video"; mediaItem.fields["videoType"] = type; mediaItem.artwork = KIcon("video-x-generic"); if (type == "Movie" || type == "TV Show") { mediaItem.artwork = KIcon("tool-animator"); if (it.binding(MediaVocabulary::releaseDateBinding()).isValid()) { QDate releaseDate = it.binding(MediaVocabulary::releaseDateBinding()).literal().toDate(); if (releaseDate.isValid()) { mediaItem.fields["releaseDate"] = releaseDate; mediaItem.fields["year"] = releaseDate.year(); } else { mediaItem.fields["releaseDate"] = QVariant(QVariant::Date); mediaItem.fields["year"] = QVariant(QVariant::Int); } } else { mediaItem.fields["releaseDate"] = QVariant(QVariant::Date); mediaItem.fields["year"] = QVariant(QVariant::Int); } QStringList writers; QList writerResources = res.property(mediaVocabulary.videoWriter()).toResourceList(); for (int i = 0; i < writerResources.count(); i++) { QString name = writerResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { writers.append(name); } } writers = cleanStringList(writers); mediaItem.fields["writer"] = writers; QStringList directors; QList directorResources = res.property(mediaVocabulary.videoDirector()).toResourceList(); for (int i = 0; i < directorResources.count(); i++) { QString name = directorResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { directors.append(name); } } directors = cleanStringList(directors); mediaItem.fields["director"] = directors; QStringList producers; QList producerResources = res.property(mediaVocabulary.videoProducer()).toResourceList(); for (int i = 0; i < producerResources.count(); i++) { QString name = producerResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { producers.append(name); } } producers = cleanStringList(producers); mediaItem.fields["producer"] = producers; QStringList actors; QList actorResources = res.property(mediaVocabulary.videoActor()).toResourceList(); for (int i = 0; i < actorResources.count(); i++) { QString name = actorResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { actors.append(name); } } actors = cleanStringList(actors); mediaItem.fields["actor"] = actors; if (type == "TV Show") { mediaItem.artwork = KIcon("video-television"); QString seriesName = it.binding(MediaVocabulary::videoSeriesTitleBinding()).literal().toString(); if (!seriesName.isEmpty()) { mediaItem.fields["seriesName"] = seriesName; } int season = it.binding(MediaVocabulary::videoSeasonBinding()).literal().toInt(); if (season !=0 ) { mediaItem.fields["season"] = season; } else { mediaItem.fields["season"] = QVariant(QVariant::Int); } int episodeNumber = it.binding(MediaVocabulary::videoEpisodeNumberBinding()).literal().toInt(); if (episodeNumber != 0) { mediaItem.fields["episodeNumber"] = episodeNumber; } else { mediaItem.fields["episodeNumber"] = QVariant(QVariant::Int); } } } } mediaItem = makeSubtitle(mediaItem); return mediaItem; } MediaItem Utilities::categoryMediaItemFromNepomuk(Nepomuk::Resource &res, const QString &type, const QString &sourceLri) { MediaVocabulary mediaVocabulary; MediaItem mediaItem; if (type == "Artist" || type == "Album" || type == "TV Series" || type == "Actor" || type == "Director") { mediaItem.type = "Category"; mediaItem.fields["categoryType"] = type; mediaItem.nowPlaying = false; mediaItem.fields["resourceUri"] = res.resourceUri().toString(); mediaItem.fields["relatedTo"] = Utilities::getLinksForResource(res); if (type =="Artist") { QString artist = res.property(mediaVocabulary.musicArtistName()).toString(); QString artistFilter = artist.isEmpty() ? QString(): QString("artist=%1").arg(artist); QString artworkUrl; if (res.hasProperty(mediaVocabulary.artwork())) { Nepomuk::Resource artworkResource = res.property(mediaVocabulary.artwork()).toResource(); artworkUrl = artworkResource.property(QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url")).toString(); } mediaItem.url = QString("music://albums?%1") .arg(artistFilter); mediaItem.title = artist; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("system-users"); mediaItem.fields["artworkUrl"] = artworkUrl; mediaItem.fields["description"] = res.property(mediaVocabulary.description()).toString(); //Provide context info for artist mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||artist=%1").arg(artist)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||artist=%1").arg(artist)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||artist=%1").arg(artist)); } else if (type == "Album") { QString album = res.property(mediaVocabulary.musicAlbumName()).toString(); QString albumFilter = album.isEmpty() ? QString(): QString("album=%1").arg(album); //TODO: Get corresponding artist name mediaItem.url = QString("music://songs?%1") .arg(albumFilter); mediaItem.title = album; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("media-optical-audio"); //Provide context info for album mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||album=%1").arg(album)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||album=%1").arg(album)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||album=%1").arg(album)); } else if (type == "TV Series") { QString seriesName = res.property(mediaVocabulary.videoSeriesTitle()).toString(); QString seriesNameFilter = seriesName.isEmpty() ? QString(): QString("seriesName=%1").arg(seriesName); QString artworkUrl; if (res.hasProperty(mediaVocabulary.artwork())) { Nepomuk::Resource artworkResource = res.property(mediaVocabulary.artwork()).toResource(); artworkUrl = artworkResource.property(QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url")).toString(); } mediaItem.url = QString("video://seasons?||%1") .arg(seriesNameFilter); mediaItem.title = seriesName; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("video-television"); mediaItem.fields["artworkUrl"] = artworkUrl; mediaItem.fields["description"] = res.property(mediaVocabulary.description()).toString(); //Provide context info for TV series mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||seriesName=%1").arg(seriesName)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||seriesName=%1").arg(seriesName)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||seriesName=%1").arg(seriesName)); } else if (type == "Actor") { QString actor = res.property(mediaVocabulary.ncoFullname()).toString(); QString actorFilter = actor.isEmpty() ? QString(): QString("actor=%1").arg(actor); QString artworkUrl; if (res.hasProperty(mediaVocabulary.artwork())) { Nepomuk::Resource artworkResource = res.property(mediaVocabulary.artwork()).toResource(); artworkUrl = artworkResource.property(QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url")).toString(); } mediaItem.url = QString("video://sources?||%1") .arg(actorFilter); mediaItem.title = actor; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("view-media-artist"); mediaItem.fields["artworkUrl"] = artworkUrl; mediaItem.fields["description"] = res.property(mediaVocabulary.description()).toString(); mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||actor=%1").arg(actor)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||actor=%1").arg(actor)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||actor=%1").arg(actor)); } else if (type == "Director") { QString director = res.property(mediaVocabulary.ncoFullname()).toString(); QString directorFilter = director.isEmpty() ? QString(): QString("director=%1").arg(director); QString artworkUrl; if (res.hasProperty(mediaVocabulary.artwork())) { Nepomuk::Resource artworkResource = res.property(mediaVocabulary.artwork()).toResource(); artworkUrl = artworkResource.property(QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url")).toString(); } mediaItem.url = QString("video://sources?||%1") .arg(directorFilter); mediaItem.title = director; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("view-media-artist"); mediaItem.fields["artworkUrl"] = artworkUrl; mediaItem.fields["description"] = res.property(mediaVocabulary.description()).toString(); mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||director=%1").arg(director)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||director=%1").arg(director)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||director=%1").arg(director)); } mediaItem.fields["sourceLri"] = sourceLri; } mediaItem = makeSubtitle(mediaItem); return mediaItem; } MediaItem Utilities::categoryMediaItemFromIterator(Soprano::QueryResultIterator &it, const QString &type, const QString &lri, const QString &sourceLri) { MediaItem mediaItem; if (type == "Artist" || type == "Album" || type == "AudioGenre" || type == "AudioTag" || type == "TV Series" || type == "VideoGenre" || type == "Actor" || type == "Director"|| type == "VideoTag") { mediaItem.type = "Category"; mediaItem.fields["categoryType"] = type; mediaItem.nowPlaying = false; if (!MediaVocabulary::resourceBindingForCategory(type).isEmpty()) { Nepomuk::Resource res(it.binding(MediaVocabulary::resourceBindingForCategory("Artist")).uri()); if (res.exists()) { mediaItem.fields["relatedTo"] = Utilities::getLinksForResource(res); } } if (type =="Artist") { QString artist = it.binding(MediaVocabulary::musicArtistNameBinding()).literal().toString(); QString album = it.binding(MediaVocabulary::musicAlbumTitleBinding()).literal().toString(); QString genre = it.binding(MediaVocabulary::genreBinding()).literal().toString(); QString artistFilter = artist.isEmpty() ? QString(): QString("artist=%1").arg(artist); QString albumFilter = album.isEmpty() ? QString(): QString("album=%1").arg(album); QString genreFilter = genre.isEmpty() ? QString(): QString("genre=%1").arg(genre); mediaItem.url = QString("music://albums?%1||%2||%3") .arg(artistFilter) .arg(albumFilter) .arg(genreFilter); mediaItem.title = artist; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("system-users"); //Provide context info for artist mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); } else if (type == "Album") { QString artist = it.binding(MediaVocabulary::musicArtistNameBinding()).literal().toString(); QString album = it.binding(MediaVocabulary::musicAlbumTitleBinding()).literal().toString(); QString genre = it.binding(MediaVocabulary::genreBinding()).literal().toString(); QString artistFilter = artist.isEmpty() ? QString(): QString("artist=%1").arg(artist); QString albumFilter = album.isEmpty() ? QString(): QString("album=%1").arg(album); QString genreFilter = genre.isEmpty() ? QString(): QString("genre=%1").arg(genre); mediaItem.url = QString("music://songs?%1||%2||%3") .arg(artistFilter) .arg(albumFilter) .arg(genreFilter); mediaItem.title = album; mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["artist"] = artist; mediaItem.artwork = KIcon("media-optical-audio"); //Provide context info for album mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); } else if (type == "AudioGenre") { QString artist = it.binding(MediaVocabulary::musicArtistNameBinding()).literal().toString(); QString album = it.binding(MediaVocabulary::musicAlbumTitleBinding()).literal().toString(); QString genre = it.binding(MediaVocabulary::genreBinding()).literal().toString(); genre = Utilities::genreFromRawTagGenre(genre); QString artistFilter = artist.isEmpty() ? QString(): QString("artist=%1").arg(artist); QString albumFilter = album.isEmpty() ? QString(): QString("album=%1").arg(album); QString genreFilter = genre.isEmpty() ? QString(): QString("genre=%1").arg(genre); mediaItem.url = QString("music://albums?%1||%2||%3") .arg(artistFilter) .arg(albumFilter) .arg(genreFilter); mediaItem.title = genre; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("flag-blue"); //Provide context info for genre mediaItem.addContext(i18n("Recently Played Songs"), QString("semantics://recent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Highest Rated Songs"), QString("semantics://highest?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); mediaItem.addContext(i18n("Frequently Played Songs"), QString("semantics://frequent?audio||limit=4||artist=%1||album=%2||genre=%3").arg(artist).arg(album).arg(genre)); } else if (type == "AudioTag") { QString tag = it.binding(MediaVocabulary::tagBinding()).literal().toString(); QString tagFilter = tag.isEmpty() ? QString(): QString("tag=%1").arg(tag); mediaItem.url = QString("tag://audio?%1") .arg(tagFilter); mediaItem.title = tag; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("view-pim-notes");; //Provide context info for tag mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?audio||limit=4||tag=%1").arg(tag)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?audio||limit=4||tag=%1").arg(tag)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?audio||limit=4||tag=%1").arg(tag)); } else if (type == "TV Series") { QString genre = it.binding(MediaVocabulary::genreBinding()).literal().toString(); QString seriesName = it.binding(MediaVocabulary::videoSeriesTitleBinding()).literal().toString(); QString season = it.binding(MediaVocabulary::videoSeasonBinding()).literal().toString(); QString genreFilter = genre.isEmpty() ? QString(): QString("genre=%1").arg(genre); QString seriesNameFilter = seriesName.isEmpty() ? QString(): QString("seriesName=%1").arg(seriesName); QString seasonFilter = season.isEmpty() ? QString(): QString("season=%1").arg(season); mediaItem.url = QString("video://seasons?||%1||%2||%3") .arg(genreFilter) .arg(seriesNameFilter) .arg(seasonFilter); mediaItem.title = seriesName; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("video-television"); //Provide context info for TV series mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||%1||seriesName=%2").arg(genreFilter).arg(seriesName)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||%1||seriesName=%2").arg(genreFilter).arg(seriesName)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||%1||seriesName=%2").arg(genreFilter).arg(seriesName)); } else if (type == "TV Season") { QString genre = it.binding(MediaVocabulary::genreBinding()).literal().toString(); QString seriesName = it.binding(MediaVocabulary::videoSeriesTitleBinding()).literal().toString(); QString season = it.binding(MediaVocabulary::videoSeasonBinding()).literal().toString(); QString genreFilter = genre.isEmpty() ? QString(): QString("genre=%1").arg(genre); QString seriesNameFilter = seriesName.isEmpty() ? QString(): QString("seriesName=%1").arg(seriesName); QString seasonFilter = season.isEmpty() ? QString(): QString("season=%1").arg(season); mediaItem.url = QString("video://seasons?||%1||%2||%3") .arg(genreFilter) .arg(seriesNameFilter) .arg(seasonFilter); mediaItem.title = seriesName; mediaItem.fields["title"] = mediaItem.title; mediaItem.fields["season"] = season; mediaItem.artwork = KIcon("video-television"); //Provide context info for genre mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||%1||%2||season=%3").arg(genreFilter).arg(seriesNameFilter).arg(season)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||%1||%2||season=%3").arg(genreFilter).arg(seriesNameFilter).arg(season)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||%1||%2||season=%3").arg(genreFilter).arg(seriesNameFilter).arg(season)); } else if (type == "VideoGenre") { QString genre = it.binding(MediaVocabulary::genreBinding()).literal().toString(); mediaItem.url = QString("video://sources?||genre=%1").arg(genre); mediaItem.title = genre; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("flag-green"); mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||genre=%1").arg(genre)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||genre=%1").arg(genre)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||genre=%1").arg(genre)); } else if (type == "Actor") { QString actor = it.binding(MediaVocabulary::videoActorBinding()).literal().toString(); mediaItem.url = QString("video://sources?||actor=%1").arg(actor); mediaItem.title = actor; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("view-media-artist"); mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||actor=%1").arg(actor)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||actor=%1").arg(actor)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||actor=%1").arg(actor)); } else if (type == "Director") { QString director = it.binding(MediaVocabulary::videoDirectorBinding()).literal().toString(); mediaItem.url = QString("video://sources?||director=%1").arg(director); mediaItem.title = director; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("view-media-artist"); mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||director=%1").arg(director)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||director=%1").arg(director)); mediaItem.addContext(i18n("Frequently Played"), QString("semantics://frequent?video||limit=4||director=%1").arg(director)); } else if (type == "VideoTag") { QString tag = it.binding(MediaVocabulary::tagBinding()).literal().toString(); QString tagFilter = tag.isEmpty() ? QString(): QString("tag=%1").arg(tag); mediaItem.url = QString("tag://video?%1") .arg(tagFilter); mediaItem.title = tag; mediaItem.fields["title"] = mediaItem.title; mediaItem.artwork = KIcon("view-pim-notes");; //Provide context info for tag mediaItem.addContext(i18n("Recently Played"), QString("semantics://recent?video||limit=4||tag=%1").arg(tag)); mediaItem.addContext(i18n("Highest Rated"), QString("semantics://highest?video||limit=4||tag=%1").arg(tag)); mediaItem.addContext(i18n("Frequently Played"),QString("semantics://frequent?video||limit=4||tag=%1").arg(tag)); } /*if (!lri.isEmpty()) { mediaItem.url = lri; }*/ Q_UNUSED(lri); mediaItem.fields["sourceLri"] = sourceLri; } mediaItem = makeSubtitle(mediaItem); return mediaItem; } Nepomuk::Resource Utilities::mediaResourceFromUrl(KUrl url) { MediaVocabulary mediaVocabulary = MediaVocabulary(); MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasUrl(MediaQuery::Required, url.url())); query.endWhere(); Soprano::Model * mainModel = Nepomuk::ResourceManager::instance()->mainModel(); Soprano::QueryResultIterator it = query.executeSelect(mainModel); Nepomuk::Resource res = Nepomuk::Resource(); while (it.next()) { res = Nepomuk::Resource(it.binding(mediaVocabulary.mediaResourceBinding()).uri()); if (res.exists() && (res.hasType(mediaVocabulary.typeAudio()) || res.hasType(mediaVocabulary.typeAudioMusic()) || res.hasType(mediaVocabulary.typeAudioStream()) || res.hasType(mediaVocabulary.typeVideo()) || res.hasType(mediaVocabulary.typeVideoMovie()) || res.hasType(mediaVocabulary.typeVideoTVShow())) ) { break;//returns first media resource found } } return res; } QList Utilities::mediaListFromSavedList(const MediaItem &savedListMediaItem) { QList mediaList; bool originNotLocal = false; //Download playlist if it is remote KUrl location = KUrl(savedListMediaItem.url); if (!location.isLocalFile() && (Utilities::isPls(savedListMediaItem.url) || Utilities::isM3u(savedListMediaItem.url))) { originNotLocal = true; QString tmpFile; if( KIO::NetAccess::download(location, tmpFile, 0)) { location = KUrl(tmpFile); } else { return mediaList; } } QFile file(location.path()); if (file.exists()) { if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return mediaList; } } //Make sure it's a valid M3U or PLSfileref QTextStream in(&file); bool valid = false; bool isM3U = false; bool isPLS = false; if (!in.atEnd()) { QString line = in.readLine(); if (line.trimmed() == "#EXTM3U") { valid = true; isM3U = true; } else if (line.trimmed() == "[playlist]") { valid = true; isPLS = true; } } //Create a MediaItem for each entry if (valid) { while (!in.atEnd()) { QString line = in.readLine(); if ((isM3U)) { bool add = false; QString title; int duration = 0; QString url; //some internet radios only list mirrors without any #EXTINF. //so if it hasn't #EXTINF check if it was an internet stream, take the mirror and //copy the title of the original item if(line.startsWith("#EXTINF:")) { add = true; line = line.replace("#EXTINF:",""); QStringList durTitle = line.split(","); if (durTitle.count() == 1) { //No title duration = 0; title = durTitle.at(0); } else { duration = durTitle.at(0).toInt(); title = durTitle.at(1); } url = in.readLine().trimmed(); } else if (originNotLocal) { title = savedListMediaItem.title; duration = -1; add = true; url = line; } if (add) { MediaItem mediaItem; KUrl itemUrl(url); if (!url.isEmpty()) { mediaItem = Utilities::mediaItemFromUrl(itemUrl); } else { continue; } if (mediaItem.title == itemUrl.fileName()) { mediaItem.title = title; } if ((duration > 0) && (mediaItem.fields["duration"].toInt() <= 0)) { mediaItem.duration = Utilities::durationString(duration); mediaItem.fields["duration"] = duration; } else if (duration == -1) { mediaItem.duration = QString(); mediaItem.fields["audioType"] = "Audio Stream"; } mediaList << mediaItem; } } if ((isPLS) && line.startsWith("File")) { QString url = line.mid(line.indexOf("=") + 1).trimmed(); QString title; if (!in.atEnd()) { line = in.readLine(); title = line.mid(line.indexOf("=") + 1).trimmed(); } int duration = 0; if (!in.atEnd()) { line = in.readLine(); duration = line.mid(line.indexOf("=") + 1).trimmed().toInt(); } MediaItem mediaItem; KUrl itemUrl(url); if (!url.isEmpty()) { mediaItem = Utilities::mediaItemFromUrl(itemUrl); } else { continue; } if (mediaItem.title == itemUrl.fileName()) { mediaItem.title = title; } if ((duration > 0) && (mediaItem.fields["duration"].toInt() <= 0)) { mediaItem.duration = Utilities::durationString(duration); mediaItem.fields["duration"] = duration; } else if (duration == -1) { mediaItem.duration = QString(); mediaItem.fields["audioType"] = "Audio Stream"; } mediaList << mediaItem; } } } return mediaList; } MediaItem Utilities::completeMediaItem(const MediaItem & sourceMediaItem) { MediaItem mediaItem = sourceMediaItem; QString resourceUri = sourceMediaItem.fields["resourceUri"].toString(); QString subType = mediaItem.fields["videoType"].toString(); if (subType == "Movie" || subType == "TV Show") { MediaVocabulary mediaVocabulary; MediaQuery query; QStringList bindings; bindings.append(mediaVocabulary.mediaResourceBinding()); bindings.append(mediaVocabulary.mediaResourceUrlBinding()); bindings.append(mediaVocabulary.videoAudienceRatingBinding()); bindings.append(mediaVocabulary.videoWriterBinding()); bindings.append(mediaVocabulary.videoDirectorBinding()); bindings.append(mediaVocabulary.videoProducerBinding()); bindings.append(mediaVocabulary.videoActorBinding()); if (subType == "TV Show") { bindings.append(mediaVocabulary.videoSeriesTitleBinding()); bindings.append(mediaVocabulary.videoSeasonBinding()); bindings.append(mediaVocabulary.videoEpisodeNumberBinding()); } query.select(bindings, MediaQuery::Distinct); query.startWhere(); query.addCondition(mediaVocabulary.hasResource(resourceUri)); query.addCondition(mediaVocabulary.hasVideoAudienceRating(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoWriter(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoProducer(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Optional)); if (subType == "TV Show") { query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional)); query.addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Optional)); } query.endWhere(); Soprano::Model * mainModel = Nepomuk::ResourceManager::instance()->mainModel(); Soprano::QueryResultIterator it = query.executeSelect(mainModel); while (it.next()) { Nepomuk::Resource res(it.binding(MediaVocabulary::mediaResourceBinding()).uri()); QStringList writers; QList writerResources = res.property(mediaVocabulary.videoWriter()).toResourceList(); for (int i = 0; i < writerResources.count(); i++) { QString name = writerResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { writers.append(name); } } writers = cleanStringList(writers); mediaItem.fields["writer"] = writers; QStringList directors; QList directorResources = res.property(mediaVocabulary.videoDirector()).toResourceList(); for (int i = 0; i < directorResources.count(); i++) { QString name = directorResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { directors.append(name); } } directors = cleanStringList(directors); mediaItem.fields["director"] = directors; QStringList producers; QList producerResources = res.property(mediaVocabulary.videoProducer()).toResourceList(); for (int i = 0; i < producerResources.count(); i++) { QString name = producerResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { producers.append(name); } } producers = cleanStringList(producers); mediaItem.fields["producer"] = producers; QStringList actors; QList actorResources = res.property(mediaVocabulary.videoActor()).toResourceList(); for (int i = 0; i < actorResources.count(); i++) { QString name = actorResources.at(i).property(mediaVocabulary.ncoFullname()).toString(); if (!name.isEmpty()) { actors.append(name); } } actors = cleanStringList(actors); mediaItem.fields["actor"] = actors; if (subType == "TV Show") { mediaItem.artwork = KIcon("video-television"); QString seriesName = it.binding(MediaVocabulary::videoSeriesTitleBinding()).literal().toString(); if (!seriesName.isEmpty()) { mediaItem.fields["seriesName"] = seriesName; } int season = it.binding(MediaVocabulary::videoSeasonBinding()).literal().toInt(); if (season !=0 ) { mediaItem.fields["season"] = season; } else { mediaItem.fields["season"] = QVariant(QVariant::Int); } int episodeNumber = it.binding(MediaVocabulary::videoEpisodeNumberBinding()).literal().toInt(); if (episodeNumber != 0) { mediaItem.fields["episodeNumber"] = episodeNumber; } else { mediaItem.fields["episodeNumber"] = QVariant(QVariant::Int); } } break; } } mediaItem = makeSubtitle(mediaItem); return mediaItem; } QString Utilities::lriFilterFromMediaListField(const QList &mediaList, const QString &mediaItemField, const QString &filterFieldName, const QString &lriFilterOperator) { QString lriFilter; for (int i = 0; i < mediaList.count(); i++) { lriFilter = lriFilter + QString("||") + filterFieldName + lriFilterOperator + mediaList.at(i).fields[mediaItemField].toString(); } return lriFilter; } QList Utilities::mergeGenres(QList genreList) { for (int i = 0; i < genreList.count(); i++) { MediaItem genreItem = genreList.at(i); if (genreItem.type == "Category" && genreItem.fields["categoryType"] == "AudioGenre") { QString rawGenre = genreItem.title; QString convertedGenre = Utilities::genreFromRawTagGenre(rawGenre); if (convertedGenre != rawGenre) { bool matchFound = false; for (int j = 0; j < genreList.count(); j++) { if (genreList.at(j).title == convertedGenre) { matchFound = true; MediaItem matchedGenre = genreList.at(j); MediaListProperties matchedGenreProperties; matchedGenreProperties.lri = matchedGenre.url; QString newUrl = QString("%1%2?") .arg(matchedGenreProperties.engine()) .arg(matchedGenreProperties.engineArg()); QString mergedFilter; for (int k = 0; k < matchedGenreProperties.engineFilterList().count(); k++) { QString filter = matchedGenreProperties.engineFilterList().at(k); if (matchedGenreProperties.filterField(filter) == "genre") { mergedFilter.append(QString("%1|OR|%2||") .arg(filter) .arg(rawGenre)); } else { mergedFilter.append(filter); } } newUrl.append(mergedFilter); matchedGenre.url = newUrl; genreList.replace(j, matchedGenre); genreList.removeAt(i); i = -1; } } if (!matchFound) { genreItem.title = convertedGenre; genreList.replace(i, genreItem); } } } } return genreList; } QList Utilities::sortMediaList(QList mediaList) { QList sortedList; QMap sortedIndices; for (int i = 0; i < mediaList.count(); i++) { sortedIndices[mediaList.at(i).title.toLower()] = i; } QMapIterator it(sortedIndices); while (it.hasNext()) { it.next(); sortedList.append(mediaList.at(it.value())); } return sortedList; } MediaItem Utilities::makeSubtitle(const MediaItem & mediaItem) { MediaItem updatedItem = mediaItem; QString subType = mediaItem.subType(); if (subType == "Music") { updatedItem.subTitle.clear(); QStringList artists = mediaItem.fields["artist"].toStringList(); if (artists.count() == 1) { updatedItem.subTitle = artists.at(0); } QString album = mediaItem.fields["album"].toString(); if (!album.isEmpty()) { if (!updatedItem.subTitle.isEmpty()) { updatedItem.subTitle += " - "; } updatedItem.subTitle += album; } } else if (subType == "Album") { updatedItem.subTitle = mediaItem.fields["artist"].toString(); } else if (subType == "Movie") { updatedItem.subTitle.clear(); int year = mediaItem.fields["year"].toInt(); if (year > 0) { updatedItem.subTitle = QString("%1").arg(year); } } else if (subType == "TV Show") { updatedItem.subTitle.clear(); QString seriesName = mediaItem.fields["seriesName"].toString(); if (!seriesName.isEmpty()) { updatedItem.subTitle = seriesName; } int season = mediaItem.fields["season"].toInt(); if (season > 0 ) { if (!updatedItem.subTitle.isEmpty()) { updatedItem.subTitle += " - "; } updatedItem.subTitle += i18n("Season %1", season); } int episodeNumber = mediaItem.fields["episodeNumber"].toInt(); if (episodeNumber > 0) { if (!updatedItem.subTitle.isEmpty()) { updatedItem.subTitle += " - "; } updatedItem.subTitle += i18n("Episode %1", episodeNumber); } } else if (subType == "TV Season") { updatedItem.subTitle.clear(); int season = mediaItem.fields["season"].toInt(); if (season > 0 ) { updatedItem.subTitle = i18nc("%1=Number of the Season", "Season %1", season); } } else if (subType == "Audio Feed" || subType == "Video Feed") { QString description = mediaItem.fields["description"].toString(); updatedItem.subTitle = QString("%1...").arg(description.left(50)); } else if (subType == "DVD Title"){ updatedItem.subTitle = i18n("DVD Video"); QString discTitle = mediaItem.fields["discTitle"].toString(); if (!discTitle.isEmpty()) { updatedItem.subTitle += " - "; updatedItem.subTitle += discTitle; } } else if (subType == "CD Track") { updatedItem.subTitle = i18n("Audio CD"); } return updatedItem; } QStringList Utilities::getLinksForResource(Nepomuk::Resource &res) { QStringList related; QUrl relatedProperty("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#relatedTo"); QList relatedUrls = res.property(relatedProperty).toUrlList(); for (int i = 0; i < relatedUrls.count(); i++) { related.append(KUrl(relatedUrls.at(i)).prettyUrl()); } return related; } bool Utilities::isTemporaryAudioStream(const MediaItem& item) { if (item.type != "Audio") { return false; } if (item.fields["audioType"] != "Audio Stream") { return false; } const QVariant &rscUri = item.fields["resourceUri"]; if (rscUri.isValid() && !rscUri.isNull()) { return false; } return true; } KUrl Utilities::urlForFilex(KUrl url) { Solid::StorageAccess *storage = 0; QString solidQuery = QString::fromLatin1( "[ StorageVolume.usage=='FileSystem' AND StorageVolume.uuid=='%1' ]" ) .arg(url.host().toLower()); QList devices = Solid::Device::listFromQuery(solidQuery); if (!devices.isEmpty()) { storage = devices.first().as(); } QString normalUrl; if (storage && storage->isAccessible()) { normalUrl = QString("%1/%2").arg(storage->filePath()).arg(url.path()); } else { normalUrl = url.prettyUrl(); } return KUrl(normalUrl); } KUrl Utilities::decodedUrl(QUrl rawUrl) { //NOTE: This undoes two layers of percent encoding. This means that locations that // actually have "%[0-9]" in the path may be incorrectly changed. QString rawUrlString = QUrl::fromPercentEncoding(rawUrl.toString().toUtf8()); return KUrl(rawUrlString); } #endif //UTILITIES_MEDIAITEMS_CPP bangarang-bangarang/src/platform/utilities/mediaitems.h000066400000000000000000000052771166760560600236640ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_MEDIAITEMS_H #define UTILITIES_MEDIAITEMS_H #include #include #include class MediaItem; /** * This namespace provides a list of convenience functions * used throughout bangarang. */ namespace Utilities { MediaItem getArtistCategoryItem(const QString &artist); MediaItem mediaItemFromUrl(KUrl url, bool preferFileMetaData = false); QStringList mediaListUrls(const QList &mediaList); int mediaListDuration(const QList &mediaList); QString mediaListDurationText(const QList &mediaList); QList mediaItemsDontExist(const QList &mediaList); MediaItem mediaItemFromNepomuk(Nepomuk::Resource res, const QString &sourceLri = QString()); MediaItem mediaItemFromIterator(Soprano::QueryResultIterator &it, const QString &type, const QString &sourceLri = QString()); MediaItem categoryMediaItemFromNepomuk(Nepomuk::Resource &res, const QString &type, const QString &sourceLri = QString()); MediaItem categoryMediaItemFromIterator(Soprano::QueryResultIterator &it, const QString &type, const QString &lri = QString(), const QString &sourceLri = QString()); Nepomuk::Resource mediaResourceFromUrl(KUrl Url); QString lriFilterFromMediaListField(const QList &mediaList, const QString &mediaItemField, const QString &filterFieldName, const QString &lriFilterOperator); QList mediaListFromSavedList(const MediaItem &savedListMediaItem); MediaItem completeMediaItem(const MediaItem & sourceMediaItem); QList mergeGenres(QList genreList); QList sortMediaList(QList mediaList); MediaItem makeSubtitle(const MediaItem & mediaItem); QStringList getLinksForResource(Nepomuk::Resource &res); bool isTemporaryAudioStream(const MediaItem &item); KUrl urlForFilex(KUrl url); KUrl decodedUrl(QUrl url); } #endif // UTILITIES_MEDIAITEMS_H bangarang-bangarang/src/platform/utilities/sha256.cpp000066400000000000000000000362751166760560600231100ustar00rootroot00000000000000/**************************************************************************************** * Copyright (c) 2005 Olivier Gay * * Copyright (c) 2009 Leo Franchi * * * * 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 2 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 . * ****************************************************************************************/ #if 0 #define UNROLL_LOOPS /* Enable loops unrolling */ #endif #include "sha256.h" #include #define SHFR(x, n) (x >> n) #define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) #define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) #define CH(x, y, z) ((x & y) ^ (~x & z)) #define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) #define SHA256_F1(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) #define SHA256_F2(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) #define SHA256_F3(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHFR(x, 3)) #define SHA256_F4(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHFR(x, 10)) #define UNPACK32(x, str) \ { \ *((str) + 3) = (uint8_t) ((x) ); \ *((str) + 2) = (uint8_t) ((x) >> 8); \ *((str) + 1) = (uint8_t) ((x) >> 16); \ *((str) + 0) = (uint8_t) ((x) >> 24); \ } #define PACK32(str, x) \ { \ *(x) = ((uint32_t) *((str) + 3) ) \ | ((uint32_t) *((str) + 2) << 8) \ | ((uint32_t) *((str) + 1) << 16) \ | ((uint32_t) *((str) + 0) << 24); \ } #define UNPACK64(x, str) \ { \ *((str) + 7) = (uint8_t) ((x) ); \ *((str) + 6) = (uint8_t) ((x) >> 8); \ *((str) + 5) = (uint8_t) ((x) >> 16); \ *((str) + 4) = (uint8_t) ((x) >> 24); \ *((str) + 3) = (uint8_t) ((x) >> 32); \ *((str) + 2) = (uint8_t) ((x) >> 40); \ *((str) + 1) = (uint8_t) ((x) >> 48); \ *((str) + 0) = (uint8_t) ((x) >> 56); \ } #define PACK64(str, x) \ { \ *(x) = ((uint64_t) *((str) + 7) ) \ | ((uint64_t) *((str) + 6) << 8) \ | ((uint64_t) *((str) + 5) << 16) \ | ((uint64_t) *((str) + 4) << 24) \ | ((uint64_t) *((str) + 3) << 32) \ | ((uint64_t) *((str) + 2) << 40) \ | ((uint64_t) *((str) + 1) << 48) \ | ((uint64_t) *((str) + 0) << 56); \ } /* Macros used for loops unrolling */ #define SHA256_SCR(i) \ { \ w[i] = SHA256_F4(w[i - 2]) + w[i - 7] \ + SHA256_F3(w[i - 15]) + w[i - 16]; \ } #define SHA256_EXP(a, b, c, d, e, f, g, h, j) \ { \ t1 = wv[h] + SHA256_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \ + sha256_k[j] + w[j]; \ t2 = SHA256_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \ wv[d] += t1; \ wv[h] = t1 + t2; \ } uint32_t sha256_h0[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; uint32_t sha256_k[64] = {0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; /* SHA-256 functions */ void sha256_transf(sha256_ctx *ctx, unsigned char *message, unsigned int block_nb) { uint32_t w[64]; uint32_t wv[8]; uint32_t t1, t2; unsigned char *sub_block; unsigned int i; #ifndef UNROLL_LOOPS int j; #endif for (i = 1; i <= block_nb; i++) { sub_block = message + ((i - 1) << 6); #ifndef UNROLL_LOOPS for (j = 0; j < 16; j++) { PACK32(&sub_block[j << 2], &w[j]); } for (j = 16; j < 64; j++) { SHA256_SCR(j); } for (j = 0; j < 8; j++) { wv[j] = ctx->h[j]; } for (j = 0; j < 64; j++) { t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + sha256_k[j] + w[j]; t2 = SHA256_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]); wv[7] = wv[6]; wv[6] = wv[5]; wv[5] = wv[4]; wv[4] = wv[3] + t1; wv[3] = wv[2]; wv[2] = wv[1]; wv[1] = wv[0]; wv[0] = t1 + t2; } for (j = 0; j < 8; j++) { ctx->h[j] += wv[j]; } #else PACK32(&sub_block[ 0], &w[ 0]); PACK32(&sub_block[ 4], &w[ 1]); PACK32(&sub_block[ 8], &w[ 2]); PACK32(&sub_block[12], &w[ 3]); PACK32(&sub_block[16], &w[ 4]); PACK32(&sub_block[20], &w[ 5]); PACK32(&sub_block[24], &w[ 6]); PACK32(&sub_block[28], &w[ 7]); PACK32(&sub_block[32], &w[ 8]); PACK32(&sub_block[36], &w[ 9]); PACK32(&sub_block[40], &w[10]); PACK32(&sub_block[44], &w[11]); PACK32(&sub_block[48], &w[12]); PACK32(&sub_block[52], &w[13]); PACK32(&sub_block[56], &w[14]); PACK32(&sub_block[60], &w[15]); SHA256_SCR(16); SHA256_SCR(17); SHA256_SCR(18); SHA256_SCR(19); SHA256_SCR(20); SHA256_SCR(21); SHA256_SCR(22); SHA256_SCR(23); SHA256_SCR(24); SHA256_SCR(25); SHA256_SCR(26); SHA256_SCR(27); SHA256_SCR(28); SHA256_SCR(29); SHA256_SCR(30); SHA256_SCR(31); SHA256_SCR(32); SHA256_SCR(33); SHA256_SCR(34); SHA256_SCR(35); SHA256_SCR(36); SHA256_SCR(37); SHA256_SCR(38); SHA256_SCR(39); SHA256_SCR(40); SHA256_SCR(41); SHA256_SCR(42); SHA256_SCR(43); SHA256_SCR(44); SHA256_SCR(45); SHA256_SCR(46); SHA256_SCR(47); SHA256_SCR(48); SHA256_SCR(49); SHA256_SCR(50); SHA256_SCR(51); SHA256_SCR(52); SHA256_SCR(53); SHA256_SCR(54); SHA256_SCR(55); SHA256_SCR(56); SHA256_SCR(57); SHA256_SCR(58); SHA256_SCR(59); SHA256_SCR(60); SHA256_SCR(61); SHA256_SCR(62); SHA256_SCR(63); wv[0] = ctx->h[0]; wv[1] = ctx->h[1]; wv[2] = ctx->h[2]; wv[3] = ctx->h[3]; wv[4] = ctx->h[4]; wv[5] = ctx->h[5]; wv[6] = ctx->h[6]; wv[7] = ctx->h[7]; SHA256_EXP(0,1,2,3,4,5,6,7, 0); SHA256_EXP(7,0,1,2,3,4,5,6, 1); SHA256_EXP(6,7,0,1,2,3,4,5, 2); SHA256_EXP(5,6,7,0,1,2,3,4, 3); SHA256_EXP(4,5,6,7,0,1,2,3, 4); SHA256_EXP(3,4,5,6,7,0,1,2, 5); SHA256_EXP(2,3,4,5,6,7,0,1, 6); SHA256_EXP(1,2,3,4,5,6,7,0, 7); SHA256_EXP(0,1,2,3,4,5,6,7, 8); SHA256_EXP(7,0,1,2,3,4,5,6, 9); SHA256_EXP(6,7,0,1,2,3,4,5,10); SHA256_EXP(5,6,7,0,1,2,3,4,11); SHA256_EXP(4,5,6,7,0,1,2,3,12); SHA256_EXP(3,4,5,6,7,0,1,2,13); SHA256_EXP(2,3,4,5,6,7,0,1,14); SHA256_EXP(1,2,3,4,5,6,7,0,15); SHA256_EXP(0,1,2,3,4,5,6,7,16); SHA256_EXP(7,0,1,2,3,4,5,6,17); SHA256_EXP(6,7,0,1,2,3,4,5,18); SHA256_EXP(5,6,7,0,1,2,3,4,19); SHA256_EXP(4,5,6,7,0,1,2,3,20); SHA256_EXP(3,4,5,6,7,0,1,2,21); SHA256_EXP(2,3,4,5,6,7,0,1,22); SHA256_EXP(1,2,3,4,5,6,7,0,23); SHA256_EXP(0,1,2,3,4,5,6,7,24); SHA256_EXP(7,0,1,2,3,4,5,6,25); SHA256_EXP(6,7,0,1,2,3,4,5,26); SHA256_EXP(5,6,7,0,1,2,3,4,27); SHA256_EXP(4,5,6,7,0,1,2,3,28); SHA256_EXP(3,4,5,6,7,0,1,2,29); SHA256_EXP(2,3,4,5,6,7,0,1,30); SHA256_EXP(1,2,3,4,5,6,7,0,31); SHA256_EXP(0,1,2,3,4,5,6,7,32); SHA256_EXP(7,0,1,2,3,4,5,6,33); SHA256_EXP(6,7,0,1,2,3,4,5,34); SHA256_EXP(5,6,7,0,1,2,3,4,35); SHA256_EXP(4,5,6,7,0,1,2,3,36); SHA256_EXP(3,4,5,6,7,0,1,2,37); SHA256_EXP(2,3,4,5,6,7,0,1,38); SHA256_EXP(1,2,3,4,5,6,7,0,39); SHA256_EXP(0,1,2,3,4,5,6,7,40); SHA256_EXP(7,0,1,2,3,4,5,6,41); SHA256_EXP(6,7,0,1,2,3,4,5,42); SHA256_EXP(5,6,7,0,1,2,3,4,43); SHA256_EXP(4,5,6,7,0,1,2,3,44); SHA256_EXP(3,4,5,6,7,0,1,2,45); SHA256_EXP(2,3,4,5,6,7,0,1,46); SHA256_EXP(1,2,3,4,5,6,7,0,47); SHA256_EXP(0,1,2,3,4,5,6,7,48); SHA256_EXP(7,0,1,2,3,4,5,6,49); SHA256_EXP(6,7,0,1,2,3,4,5,50); SHA256_EXP(5,6,7,0,1,2,3,4,51); SHA256_EXP(4,5,6,7,0,1,2,3,52); SHA256_EXP(3,4,5,6,7,0,1,2,53); SHA256_EXP(2,3,4,5,6,7,0,1,54); SHA256_EXP(1,2,3,4,5,6,7,0,55); SHA256_EXP(0,1,2,3,4,5,6,7,56); SHA256_EXP(7,0,1,2,3,4,5,6,57); SHA256_EXP(6,7,0,1,2,3,4,5,58); SHA256_EXP(5,6,7,0,1,2,3,4,59); SHA256_EXP(4,5,6,7,0,1,2,3,60); SHA256_EXP(3,4,5,6,7,0,1,2,61); SHA256_EXP(2,3,4,5,6,7,0,1,62); SHA256_EXP(1,2,3,4,5,6,7,0,63); ctx->h[0] += wv[0]; ctx->h[1] += wv[1]; ctx->h[2] += wv[2]; ctx->h[3] += wv[3]; ctx->h[4] += wv[4]; ctx->h[5] += wv[5]; ctx->h[6] += wv[6]; ctx->h[7] += wv[7]; #endif /* !UNROLL_LOOPS */ } } void sha256(unsigned char *message, unsigned int len, unsigned char *digest) { sha256_ctx ctx; sha256_init(&ctx); sha256_update(&ctx, message, len); sha256_final(&ctx, digest); } void sha256_init(sha256_ctx *ctx) { #ifndef UNROLL_LOOPS int i; for (i = 0; i < 8; i++) { ctx->h[i] = sha256_h0[i]; } #else ctx->h[0] = sha256_h0[0]; ctx->h[1] = sha256_h0[1]; ctx->h[2] = sha256_h0[2]; ctx->h[3] = sha256_h0[3]; ctx->h[4] = sha256_h0[4]; ctx->h[5] = sha256_h0[5]; ctx->h[6] = sha256_h0[6]; ctx->h[7] = sha256_h0[7]; #endif /* !UNROLL_LOOPS */ ctx->len = 0; ctx->tot_len = 0; } void sha256_update(sha256_ctx *ctx, unsigned char *message, unsigned int len) { unsigned int block_nb; unsigned int new_len, rem_len; unsigned char *shifted_message; rem_len = SHA256_BLOCK_SIZE - ctx->len; memcpy(&ctx->block[ctx->len], message, rem_len); if (ctx->len + len < SHA256_BLOCK_SIZE) { ctx->len += len; return; } new_len = len - rem_len; block_nb = new_len / SHA256_BLOCK_SIZE; shifted_message = message + rem_len; sha256_transf(ctx, ctx->block, 1); sha256_transf(ctx, shifted_message, block_nb); rem_len = new_len % SHA256_BLOCK_SIZE; memcpy(ctx->block, &shifted_message[block_nb << 6], rem_len); ctx->len = rem_len; ctx->tot_len += (block_nb + 1) << 6; } void sha256_final(sha256_ctx *ctx, unsigned char *digest) { unsigned int block_nb; unsigned int pm_len; unsigned int len_b; #ifndef UNROLL_LOOPS int i; #endif block_nb = (1 + ((SHA256_BLOCK_SIZE - 9) < (ctx->len % SHA256_BLOCK_SIZE))); len_b = (ctx->tot_len + ctx->len) << 3; pm_len = block_nb << 6; memset(ctx->block + ctx->len, 0, pm_len - ctx->len); ctx->block[ctx->len] = 0x80; UNPACK32(len_b, ctx->block + pm_len - 4); sha256_transf(ctx, ctx->block, block_nb); #ifndef UNROLL_LOOPS for (i = 0 ; i < 8; i++) { UNPACK32(ctx->h[i], &digest[i << 2]); } #else UNPACK32(ctx->h[0], &digest[ 0]); UNPACK32(ctx->h[1], &digest[ 4]); UNPACK32(ctx->h[2], &digest[ 8]); UNPACK32(ctx->h[3], &digest[12]); UNPACK32(ctx->h[4], &digest[16]); UNPACK32(ctx->h[5], &digest[20]); UNPACK32(ctx->h[6], &digest[24]); UNPACK32(ctx->h[7], &digest[28]); #endif /* !UNROLL_LOOPS */ } #ifdef TEST_VECTORS /* FIPS 180-2 Validation tests */ #include #include void test(unsigned char *vector, unsigned char *digest, unsigned int digest_size) { unsigned char output[2 * SHA512_DIGEST_SIZE + 1]; int i; output[2 * digest_size] = '\0'; for (i = 0; i < digest_size ; i++) { sprintf((char *) output + 2*i, "%02x", digest[i]); } printf("H: %s\n", output); if (strcmp((char *) vector, (char *) output)) { fprintf(stderr, "Test failed.\n"); exit(1); } } int main() { static unsigned char *vectors[] = { /* SHA-256 */ (unsigned char*)"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", (unsigned char*)"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", (unsigned char*)"cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0", (unsigned char*)"aa1be65302aee963cb2aa2b0f5cc50cf4ab63a31633b95b08cf90ae84f601084", }; static unsigned char message1[] = "abc"; static unsigned char message2[] = "abcdbcdecdefdefgefghfghighijhi" "jkijkljklmklmnlmnomnopnopq"; static unsigned char message2b[] = "abcdefghbcdefghicdefghijdefghijkefghij" "klfghijklmghijklmnhijklmnoijklmnopjklm" "nopqklmnopqrlmnopqrsmnopqrstnopqrstu"; static unsigned char message4[] = "musicpass"; unsigned char *message3; unsigned int message3_len = 1000000; unsigned char digest[SHA512_DIGEST_SIZE]; message3 = (unsigned char*)malloc(message3_len); if (message3 == NULL) { fprintf(stderr, "Can't allocate memory\n"); return -1; } memset(message3, 'a', message3_len); printf("SHA-2 FIPS 180-2 Validation tests\n\n"); printf("SHA-256 Test vectors\n"); sha256(message1, strlen((char *) message1), digest); test(vectors[0], digest, SHA256_DIGEST_SIZE); sha256(message2, strlen((char *) message2), digest); test(vectors[1], digest, SHA256_DIGEST_SIZE); sha256(message3, message3_len, digest); test(vectors[2], digest, SHA256_DIGEST_SIZE); sha256(message4, strlen((char *) message4), digest); test(vectors[3], digest, SHA256_DIGEST_SIZE); printf("\n"); printf("All tests passed.\n"); return 0; } #endif /* TEST_VECTORS */ bangarang-bangarang/src/platform/utilities/sha256.h000066400000000000000000000041551166760560600225450ustar00rootroot00000000000000/**************************************************************************************** * Copyright (c) 2005 Olivier Gay * * Copyright (c) 2009 Leo Franchi * * * * 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 2 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 . * ****************************************************************************************/ #ifndef SHA256_H #define SHA256_H #define SHA256_DIGEST_SIZE (256 / 8) #define SHA512_DIGEST_SIZE (512 / 8) #define SHA256_BLOCK_SIZE ( 512 / 8) #include #ifdef __cplusplus extern "C" { #endif typedef struct { unsigned int tot_len; unsigned int len; unsigned char block[2 * SHA256_BLOCK_SIZE]; uint32_t h[8]; } sha256_ctx; void sha256_init(sha256_ctx * ctx); void sha256_update(sha256_ctx *ctx, unsigned char *message, unsigned int len); void sha256_final(sha256_ctx *ctx, unsigned char *digest); void sha256(unsigned char *message, unsigned int len, unsigned char *digest); #ifdef __cplusplus } #endif #endif /* !SHA256_H */ bangarang-bangarang/src/platform/utilities/thread.cpp000066400000000000000000000062761166760560600233450ustar00rootroot00000000000000#include "thread.h" #include "artwork.h" #include Utilities::Thread::Thread(QObject *parent) : QThread(parent) { } Utilities::Thread::~Thread() { } void Utilities::Thread::run() { if (m_action == "getArtworks") { if (m_mediaItem.type == "Audio" || m_mediaItem.type == "Video" || (m_mediaItem.type == "Category" && (m_mediaItem.subType() == "AudioFeed" || m_mediaItem.subType() == "VideoFeed"))) { QImage artwork = Utilities::getArtworkImageFromMediaItem(m_mediaItem, m_ignoreCache); QList artworks; artworks.append(artwork); emit gotArtworks(artworks, m_mediaItem); } else if (m_mediaItem.type == "Category") { QList artworks; QString itemTitle = m_mediaItem.fields["title"].toString(); if (m_mediaItem.subType() == "AudioGenre") { artworks = Utilities::getGenreArtworks(itemTitle, "audio", m_ignoreCache); } else if (m_mediaItem.subType() == "VideoGenre") { artworks = Utilities::getGenreArtworks(itemTitle, "video", m_ignoreCache); } else if (m_mediaItem.subType() == "Artist") { artworks = Utilities::getArtistArtworks(itemTitle, m_ignoreCache); } else if (m_mediaItem.subType() == "Album") { artworks.append(Utilities::getAlbumArtwork(itemTitle, m_ignoreCache)); } else if (m_mediaItem.subType() == "AudioTag") { artworks = Utilities::getTagArtworks(itemTitle, "audio", m_ignoreCache); } else if (m_mediaItem.subType() == "VideoTag") { artworks = Utilities::getTagArtworks(itemTitle, "video", m_ignoreCache); } else if (m_mediaItem.subType() == "TV Series") { artworks = Utilities::getTVSeriesArtworks(itemTitle, m_ignoreCache); } else if (m_mediaItem.subType() == "TV Season") { QString seriesName = m_mediaItem.fields["seriesName"].toString(); int season = m_mediaItem.fields["season"].toInt(); artworks = Utilities::getTVSeasonArtworks(seriesName, season, m_ignoreCache); } else if (m_mediaItem.subType() == "Actor") { artworks = Utilities::getActorArtworks(itemTitle, m_ignoreCache); } else if (m_mediaItem.subType() == "Director") { artworks = Utilities::getDirectorArtworks(itemTitle, m_ignoreCache); } emit gotArtworks(artworks, m_mediaItem); } } else if (m_action == "getArtwork") { QImage artwork = Utilities::getArtworkImageFromMediaItem(m_mediaItem); emit gotArtwork(artwork, m_mediaItem); } } void Utilities::Thread::getArtworksFromMediaItem(const MediaItem &mediaItem, bool ignoreCache) { if (!isRunning()) { m_action = "getArtworks"; m_ignoreCache = ignoreCache; m_mediaItem = mediaItem; start(); } } void Utilities::Thread::getArtworkFromMediaItem(const MediaItem &mediaItem, bool ignoreCache) { if (!isRunning()) { m_action = "getArtwork"; m_ignoreCache = ignoreCache; m_mediaItem = mediaItem; start(); } } bangarang-bangarang/src/platform/utilities/thread.h000066400000000000000000000030251166760560600227770ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_THREAD_H #define UTILITIES_THREAD_H #include "../mediaitemmodel.h" #include #include #include namespace Utilities { class Thread : public QThread { Q_OBJECT public: explicit Thread(QObject *parent = 0); ~Thread(); void run(); void getArtworksFromMediaItem(const MediaItem &mediaItem, bool ignoreCache = false); void getArtworkFromMediaItem(const MediaItem &mediaItem, bool ignoreCache = false); private: MediaItem m_mediaItem; QString m_action; bool m_ignoreCache; signals: void gotArtworks(QList artworks, MediaItem mediaItem); void gotArtwork(const QImage &artwork, const MediaItem &mediaItem); }; } #endif // UTLITIES_THREAD_H bangarang-bangarang/src/platform/utilities/typechecks.cpp000066400000000000000000000206731166760560600242350ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_TYPECHECKS_CPP #define UTILITIES_TYPECHECKS_CPP #include "typechecks.h" #include "../mediaitemmodel.h" #include bool Utilities::isMusic(const QString &url) { if (!url.isEmpty()) { KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true); return isMusicMimeType(result); } else { return false; } } bool Utilities::isMusicMimeType(KMimeType::Ptr type) { return (type->is("audio/mpeg") || type->is("audio/mp4") || type->is("audio/mp3") || type->is("audio/ogg") || type->is("audio/flac") || type->is("application/ogg") || type->is("audio/x-flac") || type->is("audio/x-musepack") || type->is("audio/x-oma") || type->is("audio/x-m4a") || type->is("audio/x-monkeys-audio") || type->is("audio/x-wv") || type->is("audio/x-ms-wma") || type->is("audio/aac") || type->is("audio/3gpp") || type->is("audio/3gpp2")); } bool Utilities::isAudio(const QString &url) { if (!url.isEmpty()) { KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true); return isAudioMimeType(result); } else { return false; } } bool Utilities::isAudioMimeType(KMimeType::Ptr type) { return (type->is("audio/mpeg") || type->is("audio/mp4") || type->is("audio/ogg") || type->is("audio/vorbis") || type->is("audio/aac") || type->is("audio/ac3") || type->is("audio/aiff") || type->is("audio/basic") || type->is("audio/flac") || type->is("audio/mp2") || type->is("audio/mp3") || type->is("audio/vnd.rn-realaudio") || type->is("audio/wav") || type->is("application/ogg") || type->is("audio/x-ac3") || type->is("audio/x-flac") || type->is("audio/x-musepack") || type->is("audio/x-m4a") || type->is("audio/x-oma") || type->is("audio/x-monkeys-audio") || type->is("audio/x-wv") || type->is("audio/x-ms-asf") || type->is("audio/x-ms-wma") || type->is("audio/3gpp") || type->is("audio/3gpp2")); } bool Utilities::isVideo(const QString &url) { if (!url.isEmpty()) { KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true); //NOTE: Special handling for .wma extensions //It turns out that wma files may pass the "video/x-ms-asf" mimetype test. //Per Microsoft KB284094, the only way to distinguish between audio-only //and audio+video content is to look at the file extenstion. if (result->is("video/x-ms-asf") && KUrl(url).fileName().endsWith(".wma")) { return false; } return isVideoMimeType(result); } else { return false; } } bool Utilities::isVideoMimeType(KMimeType::Ptr type) { return (type->is("video/mp4") || type->is("video/mpeg") || type->is("video/ogg") || type->is("video/quicktime") || type->is("video/msvideo") || type->is("video/x-theora") || type->is("video/x-theora+ogg") || type->is("video/x-ogm")|| type->is("video/x-ogm+ogg") || type->is("video/divx") || type->is("video/x-msvideo") || type->is("video/x-ms-asf") || type->is("video/x-ms-wmv") || type->is("video/x-wmv") || type->is("video/x-flv") || type->is("video/x-matroska")) || type->is("video/3gpp") || type->is("video/3gpp2"); } bool Utilities::isM3u(const QString &url) { if (!url.isEmpty()) { KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true); return (result->is("audio/m3u") || result->is("application/vnd.apple.mpegurl") || result->is("audio/x-mpegurl")); } else { return false; } } bool Utilities::isPls(const QString &url) { if (!url.isEmpty()) { KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true); return result->is("audio/x-scpls"); } else { return false; } } bool Utilities::isDvd(const KUrl& url) { return (deviceTypeFromUrl(url) == "dvd"); } bool Utilities::isCd(const KUrl& url) { return (deviceTypeFromUrl(url) == "cd"); } bool Utilities::isDisc(const KUrl& url) { return (isDvd(url) || isCd(url)); } bool Utilities::isFSDirectory(const QString& url) { if (!url.isEmpty()) { KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true); return result->is("inode/directory"); } else { return false; } } bool Utilities::isMediaItem(const QModelIndex *index) { QString type = index->data(MediaItem::TypeRole).toString(); return Utilities::isMedia(type); } bool Utilities::isMedia(const QString& type) { return ( (type == "Audio") || (type == "Video") ); } bool Utilities::isFeed(const QString& categoryType) { return (categoryType == "Audio Feed" || categoryType == "Video Feed"); } bool Utilities::isAudioStream(const QString& audioType) { return (audioType == "Audio Stream"); } bool Utilities::isCategory(const QString& type) { return (type == "Category"); } bool Utilities::isMessage(const QString& type) { return (type == "Message"); } bool Utilities::isAction(const QString& type) { return (type == "Action"); } QString Utilities::audioMimeFilter() { QStringList supportedList = Phonon::BackendCapabilities::availableMimeTypes().filter("audio"); QStringList appList = Phonon::BackendCapabilities::availableMimeTypes().filter("application"); QStringList ambiguousList; for (int i = 0; i < appList.count(); i++) { if (!appList.at(i).contains("video") && !appList.at(i).contains("audio")) { ambiguousList.append(appList.at(i)); } } supportedList << ambiguousList; supportedList << "audio/m3u" << "audio/x-mpegurl" << "audio/x-scpls" << "application/vnd.apple.url"; //add playlist mimetypes return supportedList.join(" "); /* This section might be useful if Phonon doesn't report * supported mimetypes correctly. For now I'll assume it * does so it is disabled. */ /*QString mimeFilter = QString("audio/mpeg audio/mp4 audio/ogg audio/vorbis audio/aac audio/aiff audio/basic audio/flac audio/mp2 audio/mp3 audio/vnd.rn-realaudio audio/wav application/ogg audio/x-flac audio/x-musepack "); mimeFilter += supportedList.join(" "); return mimeFilter;*/ } QString Utilities::videoMimeFilter() { QStringList supportedList = Phonon::BackendCapabilities::availableMimeTypes().filter("video"); QStringList appList = Phonon::BackendCapabilities::availableMimeTypes().filter("application"); QStringList ambiguousList; for (int i = 0; i < appList.count(); i++) { if (!appList.at(i).contains("video") && !appList.at(i).contains("audio")) { ambiguousList.append(appList.at(i)); } } supportedList << ambiguousList; return supportedList.join(" "); /* This section might be useful if Phonon doesn't report * supported mimetypes correctly. For now I'll assume it * does so it is disabled. */ /*QString mimeFilter = QString("video/mp4 video/mpeg video/ogg video/quicktime video/msvideo video/x-theora video/x-theora+ogg video/x-ogm video/x-ogm+ogg video/divx video/x-msvideo video/x-wmv video/x-flv video/flv"); mimeFilter += supportedList.join(" "); return mimeFilter;*/ } QString Utilities::deviceTypeFromUrl(const KUrl& url) { return url.authority(); } #endif //UTILITIES_TYPECHECKS_CPP bangarang-bangarang/src/platform/utilities/typechecks.h000066400000000000000000000036031166760560600236740ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2010 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_TYPECHECKS_H #define UTILITIES_TYPECHECKS_H #include #include #include /** * This namespace provides a list of convenience functions * used throughout bangarang. */ namespace Utilities { bool isMusic(const QString &url); bool isMusicMimeType(KMimeType::Ptr type); bool isAudio(const QString &url); bool isAudioMimeType(KMimeType::Ptr type); bool isVideo(const QString &url); bool isVideoMimeType(KMimeType::Ptr type); bool isM3u(const QString &url); bool isPls(const QString &url); bool isDvd(const KUrl& url); bool isCd(const KUrl& url); bool isDisc(const KUrl& url); bool isMediaItem(const QModelIndex *index); bool isMedia(const QString& type); bool isCategory(const QString& type); bool isMessage(const QString& type); bool isAction(const QString& type); bool isFeed(const QString& categoryType); bool isAudioStream(const QString& audioType); bool isFSDirectory(const QString& url); QString audioMimeFilter(); QString videoMimeFilter(); QString deviceTypeFromUrl(const KUrl &url); } #endif // UTILITIES_TYPECHECKS_H bangarang-bangarang/src/platform/utilities/utilities.h000066400000000000000000000016741166760560600235530ustar00rootroot00000000000000/* BANGARANG MEDIA PLAYER * Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com) * * * 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 . */ #ifndef UTILITIES_H #define UTILITIES_H #include "filetags.h" #include "typechecks.h" #include "artwork.h" #include "mediaitems.h" #include "general.h" #include "thread.h" #endif //UTILITIES_H