pax_global_header00006660000000000000000000000064115736367520014531gustar00rootroot0000000000000052 comment=5f010ba90d56523889cc5391e6138a321b28dda6 qmpdclient-1.2.2/000077500000000000000000000000001157363675200136735ustar00rootroot00000000000000qmpdclient-1.2.2/.gitignore000066400000000000000000000001461157363675200156640ustar00rootroot00000000000000/.ui /.moc /.res /.obj *~ /Makefile* /qtc-gdbmacros /qmpdclient.pro.user /qmpdclient /lang/*.qm build qmpdclient-1.2.2/AUTHORS000066400000000000000000000003111157363675200147360ustar00rootroot00000000000000Håvard Tautra Knutsen havtknut@tihlde.org Main developer Voker57 voker57@gmail.com Developer, qmpdclient-ne maintainer Roman (Ky6uk) Nuritdinov ky6uk.kun@gmail.com Developer qmpdclient-1.2.2/CMakeLists.txt000066400000000000000000000154041157363675200164370ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) find_package(Qt4 4.4.0 COMPONENTS QtCore QtGui QtNetwork QtXml QtXmlPatterns REQUIRED QtDBus) if(UNIX) if(NOT MAC) find_package(X11 REQUIRED) endif() endif() SET (QT_USE_QTNETWORK TRUE) SET (QT_USE_QTXMLPATTERNS TRUE) SET (QT_USE_QTXML TRUE) if(NOT DEFINED VERSION) find_program (GIT_CMD git) execute_process (COMMAND "${GIT_CMD}" describe OUTPUT_VARIABLE VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT VERSION) set(VERSION 1.2.2) endif() message (STATUS "Current version: ${VERSION}") endif() set(NAMEVER "QMPDClient ${VERSION}") set(QMPDClient_srcs src/aafilter.cpp src/aboutdialog.cpp src/abstractmodel.cpp src/abstractview.cpp src/albumview.cpp src/artistview.cpp src/clickablelabel.cpp src/config.cpp src/controlpanel.cpp src/coverartdialog.cpp src/directorymodel.cpp src/directorypanel.cpp src/directoryview.cpp src/dynamicplaylist.cpp src/fileview.cpp src/headerview.cpp src/iconmanager.cpp src/idealbar.cpp src/idealsplitter.cpp src/lastfmsubmitter.cpp src/libmpdclient.c src/librarypanel.cpp src/lineedit.cpp src/lyricsdialog.cpp src/mainwindow.cpp src/metainfodialog.cpp src/mpdcache.cpp src/mpdconnection.cpp src/mpd.cpp src/mpddirectory.cpp src/mpdentities.cpp src/mpdoutput.cpp src/mpdsong.cpp src/mpdsonglist.cpp src/mpdsongmodel.cpp src/mpdsongview.cpp src/mpdstats.cpp src/mpdstatus.cpp src/notifications.cpp src/passivepopup.cpp src/pausabletimer.cpp src/playlistitemdelegate.cpp src/playlistmodel.cpp src/playlistpanel.cpp src/playlistspanel.cpp src/playlistsview.cpp src/playlistview.cpp src/plconview.cpp src/plsfile.cpp src/preferencesdialog.cpp src/qmpdclient.cpp src/radiopanel.cpp src/radioview.cpp src/reconnect.cpp src/serverinfo.cpp src/servermodel.cpp src/shortcutmodel.cpp src/shortcuts.cpp src/shoutcastmodel.cpp src/shoutcastpanel.cpp src/shoutcastview.cpp src/shoutcastfetcher.cpp src/shoutcaststation.cpp src/songview.cpp src/stringlistmodel.cpp src/stringlistview.cpp src/tagguesser.cpp src/tagmodel.cpp src/timelabel.cpp src/timeslider.cpp src/trayicon.cpp src/traysonginfo.cpp src/verticalbutton.cpp) # src/qmpdclient_mac.cpp # src/qmpdclient_win.cpp # src/qmpdclient_x11.cpp # src/notifications_dbus.cpp # src/notifications_nodbus.cpp set(QMPDClient_hdrs src/aafilter.h src/aboutdialog.h src/abstractmodel.h src/abstractview_defn.h src/abstractview.h src/abstractview_impl.h src/albumview.h src/artistview.h src/clickablelabel.h src/config.h src/controlpanel.h src/coverartdialog.h src/debug.h src/directorymodel.h src/directorypanel.h src/directoryview.h src/dynamicplaylist.h src/fileview.h src/headerview.h src/iconmanager.h src/idealbar.h src/idealsplitter.h src/lastfmsubmitter.h src/libmpdclient.h src/librarypanel.h src/lineedit.h src/lyricsdialog.h src/macroexpander.h src/mainwindow.h src/metainfodialog.h src/mpdcache.h src/mpdcache_p.h src/mpdconnection.h src/mpddirectory.h src/mpdentities.h src/mpd.h src/mpdoutput.h src/mpd_p.h src/mpdsong.h src/mpdsonglist.h src/mpdsongmodel.h src/mpdsongview.h src/mpdstats.h src/mpdstatus.h src/notifications.h src/passivepopup.h src/pausabletimer.h src/playlistitemdelegate.h src/playlistmodel.h src/playlistpanel.h src/playlistspanel.h src/playlistsview.h src/playlistview.h src/plconview.h src/plsfile.h src/preferencesdialog.h src/qmpdclient.h src/radiopanel.h src/radioview.h src/reconnect.h src/richtext.h src/serverinfo.h src/servermodel.h src/shortcutmodel.h src/shortcuts.h src/shoutcastpanel.h src/shoutcastview.h src/shoutcastmodel.h src/shoutcastfetcher.h src/shoutcaststation.h src/songview.h src/stringlistmodel.h src/stringlistview.h src/tagguesser.h src/tagmodel.h src/timelabel.h src/timeslider.h src/trayicon.h src/traysonginfo.h src/verticalbutton.h) SET(QMPDClient_uis ui/aboutdialog.ui ui/addradiodialog.ui ui/controlpanel.ui ui/coverartdialog.ui ui/directorypanel.ui ui/librarypanel.ui ui/lyricsdialog.ui ui/mainwindow.ui ui/metainfodialog.ui ui/playlistpanel.ui ui/playlistspanel.ui ui/preferencesdialog.ui ui/radiopanel.ui ui/shoutcastpanel.ui) if(UNIX) if(NOT MAC) if(QT_QTDBUS_FOUND) message(STATUS "QtDBus found") SET (QT_USE_QTDBUS TRUE) list(APPEND QMPDClient_srcs src/notifications_dbus.cpp) list(APPEND QMPDClient_srcs src/qdbus_adaptor.cpp) list(APPEND QMPDClient_hdrs src/qdbus_adaptor.h) add_definitions("-DWITH_DBUS") else() message(STATUS "QtDBus not found") list(APPEND QMPDClient_srcs src/notifications_nodbus.cpp) endif() list(APPEND QMPDClient_srcs src/qmpdclient_x11.cpp) else() list(APPEND QMPDClient_srcs src/notifications_nodbus.cpp src/qmpdclient_mac.cpp) endif() endif() if(WIN32) list(APPEND QMPDClient_srcs src/notifications_nodbus.cpp src/qmpdclient_win.cpp) endif() include(${QT_USE_FILE}) qt4_wrap_cpp(QMPDClient_ppd_hdrs ${QMPDClient_hdrs}) qt4_add_resources(QMPDClient_ppd_res qmpdclient.qrc) qt4_wrap_ui(QMPDClient_ppd_uis ${QMPDClient_uis}) include_directories (${CMAKE_CURRENT_BINARY_DIR} src) SET (TRANSLATIONS lang/cs_CZ.ts lang/de_DE.ts lang/es_ES.ts lang/fr_FR.ts lang/it_IT.ts lang/nl_NL.ts lang/nn_NO.ts lang/no_NO.ts lang/pt_BR.ts lang/ru_RU.ts lang/sv_SE.ts lang/tr_TR.ts lang/uk_UA.ts lang/zh_CN.ts lang/zh_TW.ts) SET (COMPILED_TRANSLATIONS lang/cs_CZ.qm lang/de_DE.qm lang/es_ES.qm lang/fr_FR.qm lang/it_IT.qm lang/nl_NL.qm lang/nn_NO.qm lang/no_NO.qm lang/pt_BR.qm lang/ru_RU.qm lang/sv_SE.qm lang/tr_TR.qm lang/uk_UA.qm lang/zh_CN.qm lang/zh_TW.qm) ADD_CUSTOM_COMMAND (OUTPUT ${COMPILED_TRANSLATIONS} COMMAND "${QT_LRELEASE_EXECUTABLE}" ${TRANSLATIONS} DEPENDS ${TRANSLATIONS} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) add_definitions(-DNAMEVER="${NAMEVER}" -DPREFIX="${CMAKE_INSTALL_PREFIX}" -DVERSION="${VERSION}") add_executable(qmpdclient ${QMPDClient_srcs} ${QMPDClient_ppd_hdrs} ${QMPDClient_ppd_uis} ${QMPDClient_ppd_res} ${COMPILED_TRANSLATIONS}) target_link_libraries(qmpdclient ${QT_LIBRARIES}) if(UNIX) if(NOT MAC) target_link_libraries(qmpdclient ${X11_LIBRARIES}) endif() endif() install(TARGETS qmpdclient DESTINATION bin) if(UNIX) install(FILES qmpdclient.desktop DESTINATION share/applications) install(FILES icons/64x64/qmpdclient.png DESTINATION share/icons/hicolor/64x64/apps/) install(FILES icons/48x48/qmpdclient.png DESTINATION share/icons/hicolor/48x48/apps/) install(FILES icons/22x22/qmpdclient.png DESTINATION share/icons/hicolor/22x22/apps/) install(FILES icons/16x16/qmpdclient.png DESTINATION share/icons/hicolor/16x16/apps/) install(FILES icons/svg/qmpdclient.svg DESTINATION share/icons/hicolor/scalable/apps/) install(FILES ${COMPILED_TRANSLATIONS} DESTINATION share/QMPDClient/translations) endif() if(WIN32) install(FILES ${COMPILED_TRANSLATIONS} DESTINATION translations) endif() qmpdclient-1.2.2/COPYING000066400000000000000000000435341157363675200147370ustar00rootroot00000000000000(c) 2005-2008, Håvard Tautra Knutsen (c) 2008-2009, Voker57 (c) 2009, Roman (Ky6uk) Nuritdinov This program is distributed under the terms of the GPL v2. GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey 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 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, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. qmpdclient-1.2.2/Changelog000066400000000000000000000131271157363675200155110ustar00rootroot000000000000001.1.0 New features - Added Last.Fm tracks submission 1.0.10 New features - Lyrics display from LyricWiki [http://lyricwiki.org] - Added max height and width for cover art in preferences - Normalized sorting (ignores leading 'The ') Bug fixes - Window with cover art do not resize - Playlists are not refreshed if one was deleted - Automatic deletion of songs in dynamic playlist doesn't work - Opening of multiple about dialogs is possible 1.0.9 New features - Cover art support (Thanks to David Bitseff) - Volume slider in tray menu - Middle click on tray icon toggles pause - New tray icon art (Thanks to Gleb Pekny) Bug fixes - A few missing translations were added - Finally proper transparent tray icon with Qt 4.3 - Wheel over tray icon works with Qt 4.3 - Comment tag is now shown, and can be searched on like all others - Server settings were not properly saved - Server settings are now saved in clear text - Fixed segfault on start on some archs (Thanks to Rene Hausleitner) - Fixed several cache problems - Fixed bug where double-click action was performed twice for some lists 1.0.8 New features - Queue support (Thanks to David Bitseff) - Iconset support - Style support (Qt 4.3+) - Configurable shortcuts - Freedesktop notifications via dbus - Caching of database - Performance improvements - Multimedia keys support on win32 - Option to filter songs on albums only - Support Disc, Comment and Performer tags Bug fixes - Prettier tray icon on win32 and osx - Fixed tray icon tool tip on win32 and osx - Better eliding of artist/album title - Don't bind all modifiers of multimedia keys - Fixed problem with removing playing songs with dynamic playlist - Translations can be changed without restarting the client - and lots more.. 1.0.7 New features: - Trayicon on win32 and mac os x - Inline clear button in filter lines - Can now rescan single directories from directory browser - XMMS-like playlist with user definable markup - Alternating row colors are optional - Can choose to display remaning time by clicking the time label Bugfixes: - Fixed changing port in server list - Fixed OpenBSD crash - When adding albums, files are now sorted by track number Other stuff: - Use Qt's ResizeToContents and Stretch in combination for simpler autoresizecolumn code - Use qrand/qsrand to pick random songs in dyamic playlist, this seems to prevent - Prevent two instances of qmpdclient from choosing the same songs at the same time. - Implicit Data Sharing in most data classes. - Use qSort with LessThan funciton instead of own implementation. 1.0.6.2 Bugfixes: - Saved playlists not showing with older MPD versions. - Two Play/Enqueue actions in radio menu. - Multiple entries in songlist after filter. - Multiple "Not tagged" entries in album list. - Added keyboard shortcut for deleting radio stations. 1.0.6.1 Bugfixes: - Build problem with Qt 4.2 - Notification positioning on X11 with Qt 4.2 - Endless event loop in timeslider (Thanks to Bernhard Walle) 1.0.6 New features: - Vertical tabs, views can be hidden. - Optional column auto resizing. - View contents of saved playlists. - Mousewheel over tray icon adjusts volume. - Middle mousebutton makes continuous selections. - Multiple selections in artist, album and directory list. - Auto scroll playlist while drag and dropping. - Escape key minimizes to tray, if trayicon enabled. - Multiple output devices support. - Translations are now optional. - Moved column configuration to context menu. - Optional opaque splitter resizing to improve snappiness. - Improved right click behaviour in lists. Bugfixes: - Fixed crash when disconnected from mpd/mpd is stopped. - Sort song view on startup, and correct sort on empty columns. - Fixed drag and drop of utf8 charcters. - Font changing work again. - Multimedia keys work again. - Fixed saving playlist with the same name bug. - Now shows time as h:m:ss if song is more than an hour. 1.0.5 - Added shuffle queue. - Moving several files upwards in queue reversed order of songs. Fixed. - Fixed dropline in queue view. - Configurable timeout. - Configurable popup-positions and duration. - Fixed infinite recursion problem in directory browser. - Tray icon will now reinstall itself if systray dissapears, and reapperars. - Filters for artist and album views. - Option for ensure current playing song visible. - Which columns are visible, and their order is now configurable. - Multiple files in Information dialog. - Lots of shortcuts and text strings were changed to conform, and to suit i18n better. - Dynamic playlist. 1.0.4 - Queueview jumps to top when changed. Mayother bugs for all itemviews. - Width of titles and such are now calculated from the window size. - Reworked time-slider to make it look better with motif theme. - Sorting in song view. - Fixed too sensitive systray tooltips. - Maybe fixed connection closed issue. 1.0.3 - Dim tray-icon when disconnected. - Option for auto-reconnect, with user-specifiable interval. - Optional recursive view in directory browser. - Fixed drag and drop of strange filenames, by changing from qurl, to qstring. - Systray actions work again. - Timeslider reflects streaming status. 1.0.2 - Disable minimize to systray check when systray is disabled. - Maintain order of tracks when adding to queue. - Draw drag'n'drop dropspot. - Drop item is the middle of the queue. - Directories splitter size was saved wrong if never shown. 1.0.1 - Search in files. - Made pretty tooltip. - Remember list-header sizes. - Implemented minimizing to system tray. - Disabled timeslider and labels for streams. - Fixes win32 time slider glitches. - Made tool-tips on trayicon work again. - Removed unneccesary Q_OBJECT macros to reduce compile time qmpdclient-1.2.2/INSTALL000066400000000000000000000013421157363675200147240ustar00rootroot00000000000000*nix ---- 1. Change PREFIX in qmpdclient.pro if /usr/local is not desirable 2. qmake 3. make (gmake on some platforms) 4. su -c "make install" Eventual extra datafiles go into the following locations: /usr/local/share/QMPDClient/[styles|iconsets|translations] (Substitute /usr/local for appropriate prefix) or $HOME/.local/share/QMPDClient/[styles|iconsets|translations] Win32 ----- Use installer, or: qmake make Copy release\qmpdclient.exe to an appropriate location (INSTDIR). Eventual extra datafiles go into the following locations: C:\Program Files\QMPDClient\[styles|iconsets|translations] (Substitute C:\Prog.. for install dir) or C:\Documents and Settings\Username\Application Data\QMPDClient\[styles|iconsets|translations] qmpdclient-1.2.2/README000066400000000000000000000004011157363675200145460ustar00rootroot00000000000000QMPDClient, an MPD client written in Qt 4. (c) 2005-2008, Håvard Tautra Knutsen http://havtknut.tihlde.org/qmpdclient/ (c) 2008-2009 by Voker57 http://bitcheese.net/wiki/QMPDClient QMPDClient-ng by Ky6uk (c) 2009 http://github.com/Ky6uk/qmpdclient-ng qmpdclient-1.2.2/THANKSTO000066400000000000000000000012421157363675200150500ustar00rootroot00000000000000Christoph Rudorff David Bitseff Gleb Pekny Magnus Tautra Knutsen Marcel Kilgus Vladimir Bezhenar Ziling Zhao (zhaoz) Adrian Czerniak (Abaddon) Marcus Hennig (marcus) Magne P Zachrisen (m2k) Translations: Diony (Chinese simplified) Trevor (Chinese traditional) Tijn Buijs (Dutch) Rich Coombs (French) Jürgen Landsmann (German) Giancarlo Bianchi (Italian) Håvard Tautra Knutsen (Norwegian Bokmål) Håvard Tautra Knutsen (Norwegian Nynorsk) Renan Birck (Portugese) Alexander Danilov (Russian) Roman Nuritdinov (Ky6uk) (Russian) Henrik Segesten (Swedish) Serdar Soytetir (Turkish) Alexander Kovalenko (Ukrainian) qmpdclient-1.2.2/icons/000077500000000000000000000000001157363675200150065ustar00rootroot00000000000000qmpdclient-1.2.2/icons/16x16/000077500000000000000000000000001157363675200155735ustar00rootroot00000000000000qmpdclient-1.2.2/icons/16x16/qmpdclient.png000066400000000000000000000011021157363675200204330ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDAT8K[aDM)jE,ڥH[*[iS7"n)hd."BP_PB?(bx5W`>\?rysDU ̬>:@as:j6( VAP{wushUәh o(BZ@-EU񈙵+$Fb9#s0}$e /mOfƩQϦ%VqpZn_Q m~^Сt@;„+ݳB]} ~MQ6<vi^;'B8FGy_ubv^#TϩN넉;@n SׂKL'Љڽ۸˹~~@;B/7AK/Z"IENDB`qmpdclient-1.2.2/icons/16x16/qmpdclientd.png000066400000000000000000000012161157363675200206050ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDAT8MHTaql4,]TDD ZA"mBEP eZT⦦ 4 a: IAZ 4"Aň3Ӣ6czVwx߇;|GѓhVPA`;Bn7i IEnQ]Ah/_ٳE_u"DmÄc;7PH {Ȏs*Zi*2P[SxWr-ʛosyWO6DmDD׍D=m%N3ms; (˲8OX6)M-J,21|xlwvwPhmpObcL3]WyFl)٥{IjwiM{r]=wXZDf 5;8m']n_ݍpl;g(ər2ÅRﵤÉ4|kxS(fRڀ"u,Қ>$="&cR f QH2 Zӵ@3rϮO&mFG68JAN CTTxK0+D dgg9whs]/Kݚ#V<_LSKMxXkWNYC֜[U"pgl̛oP(3-+9wEEū_~jy:5OpG`iwPo$)"seEhژDjWi^6=BO DXkb)f!JW[!^^LU}E/.r$Wk /01z*6_~b@c#= "|&*no1՗]Ts3>=2 Zl[Em6%gaPfb*aea S1pHCZsFTs@N]ĀBJ #Z|GniTDIx>4Q)Sv{m {,Lm[R_G)݉ f8UP-C5>G"6 R`M8qML 9%ݿ.+3?Ig :&_UJagYjfV&j @mLg?Lzh.u:@ [, x"*F (ą|RZ_a4Ѭ{lf_̌暸ª WB#Dն^[ ߳lwNgu%ao >hAɫN KV[yvoShzۍIn>cIci` ,VP$EE1h ^]kh/Jxݏ0Z/'% }ve(;0tݏ0v~JˌZSF@'- [Lm VbzGxߺA閞')+Q !h l)sc5LuB)JBP+ȉIENDB`qmpdclient-1.2.2/icons/48x48/000077500000000000000000000000001157363675200156055ustar00rootroot00000000000000qmpdclient-1.2.2/icons/48x48/qmpdclient.png000066400000000000000000000025661157363675200204640ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME Ʀ"IDAThՙ[lU3gwloiK@ @D 1AQMĨĄ)l/eH"[V(9>" 3NN||Hy3T1P@$p ,);t}Ò؄`wD#s i~,;9<n΁GobmRGsyȈiHlڌ5jH 4B@ 1+ixn@Ϭy !ڔ>ֺB~S-.[cQ,=Wz] ȿm#k{Iۿ`GpR7ٞ W|ڻRWRë.fH$rg$Yawg] , \22'?N[[[;L2Ŗun  <Ͽh``09^')d=3}W iXW}iazK6]Œ/y@GXVqb2NŲg2N7?Ԫy@ŵ4Sx_'CeYVAOOX7d}k=cY֊u4 6qy;2i#W uBwx}T9ퟴj\+IENDB`qmpdclient-1.2.2/icons/64x64/000077500000000000000000000000001157363675200156015ustar00rootroot00000000000000qmpdclient-1.2.2/icons/64x64/qmpdclient.png000066400000000000000000000043071157363675200204530ustar00rootroot00000000000000PNG  IHDR<= sBIT|d pHYs }eYtEXtSoftwarewww.inkscape.org<DIDATh͛}lg?َc',Κ6ivM kiTZB bڴ: R(*j1i @?ԭcW4tRUԍ ^ں@";uk/NrᏳ3u<[H)I p?eRFf4 1EL_x x׀C@F%EL1t)w-%3,bR-$-;2IB$EL+6h?n\1= | $.d4rڍR@~̛(bǍ+"? p[?sw_wJvlXRa7VX_uqfodVJtCnk4M TZ[[*++ooy0fi1n 6N?Z$jVTWUU!jua3o޼G{zzȚrv2ջ|>_N/V>i&4m3z`0(bW è*o u6555MS.ZhK"Zyy,oZ432ప###MӬG1 0 /LTw[ZZVUfZoqUUGBJIQc+W  }Μ$oXԲ /066vTJ%!PUu MӚ%I}*www?d&wRI iSLTj+j&tOӴ ֚1UUGF]@aeVnK7 㳀R+| WGM 01YiB\fى9PvU 6pAR +XtB~4 ݊ip&7L<4$]ٳܛN{[0' )K+W~)e~A*q@ PbŊ, NTYa&tZ !Kf[fݺu-`0JP%i8 %լr|…z;w@J '} >\(a9EEY) @_'Z)e 'f.dwBz\zp`Ok4Mx<B+M!ĬZ꟝ mM|C; r_^aÆCБ;Ez_lmm}m۶sI^UU.iWZb랺&5JئoջMMZ > \6h$ɸ(L&nƍkkk )rF+,XBeeWۏ>Gs܊!eԥ---D"2wަp8d(s=BL?sap2|=.7NVr0d< t[[ۖC~?S~ W(bfCБp8D"Q6O&k2pBU ^_=sgH[ ֦w-kkk;W iޒ%K>wvbyG?\b͂󵩛yv>Zv,mb^t@-pj$vr-#Kxe7<_&&䈘epgQxz9 Pt뜇3c }i/ށeܝ1 Qpcnח;)D3ծ h"pF)O%Й Y`TF#PX%õxE(Yi('_[4EKF#_+AHP< <pX$'g>3' ފ5]5jlLo2ɽ /gbS}[F#/T}ޡ27 6|MB Z$5p~(Y r> IENDB`qmpdclient-1.2.2/icons/COPYING000066400000000000000000000001631157363675200160410ustar00rootroot00000000000000Audioscrobbler icon (as.png) Copyright: © 2005-2009 Last.fm Ltd Distributed under terms of GPL v2 (see ../COPYING)qmpdclient-1.2.2/icons/add.png000066400000000000000000000010021157363675200162350ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME " OIDAT8˕J@f S+RPb}և)&]t]p)Z,mr;s ~ߜ.}|rnb*GQ;L3 w#rIVX²xgu଴ 0Ya1@hk{WiYi1M;tw@^;LՔ^i%w/tF (\_ݎaYM7/ё}kSOL54lOp䣣8G:xB9Äj&T}ΙϾTB|ו7x{m 0| IENDB`qmpdclient-1.2.2/icons/as.png000066400000000000000000000047331157363675200161260ustar00rootroot00000000000000PNG  IHDR szz vpAg bKGDԂ pHYsHHFk> fIDATXåW pU}Kޒ6Adc ) t+Vҕ.X[etuڂ3e8JQ($,ݭ_?y|; mN %CqR+z\>A$+J3]c]-UwbW<T4+yzƏ!e!3 K`tvC;_XՉxMV$#0cJ&*CBk fzJGCPql-6"FrB0Et{v_ xul!}3oo2tC}R>;t!C{!Ho./.lj#;B^,Z Ji6XdNowY/mۧGN}xßx4<z[7"܍[.yѾC3* G.߸y3|ݒg^d)!Ĵcvن 3}ֱn=.umižQ4{YS$^@6zS&y\VHKL-ϲyJXH!)dh˞%jn!_lt$n.m+++%Yp=0J2PƠ]dmTn =cZP“: >+9ؽO-JHPTJ=봌<bmUoPRGO)Fuf$9/eOC6~gīePi~RdMs.:WD"D좙$m+@ E2"`9=7xKɘ61~')">J`j5zPko;N)߭9Emz,زZVSVJ76;։.G$c[!!t ѡ#ELSʻR<+~ _&T*S dHA-8b3sbH;UQT72LmKP I4{ldp7]%íL4HX~Y\OBMz򲑸x; c7']5u/ AL;!O.7?/|y*l&Lzm$&23Ty ̢r(%ٶb [x`Ӑ;ϺN74?cj[*YwYUi?oQC9de)62]XsߌH86;AOOEծ̄,㻶- |ug΄xj_~(i=SB\ ;s~ ToZe9Ez >ZlͫuN?5RV^R<:7˜/^tkX9N;icLZ~+WP;#oK^*-qa)ȢQȕH -;վ|Ƕ(m_L$Eq[=(UT>Q4Kl)2lڽ!'yDn_6ܵǫVA?lqׯf:tC, [pɸҢ T k H [<\'~)?@Cɴ_NP0 I]( 224Lƚ-:9:j1BÇyo7^499,t&k*/tYݱ;.EdIENDB`qmpdclient-1.2.2/icons/crop.png000066400000000000000000000013041157363675200164550ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME %i0QIDAT8˅KqƟ]~)4@k~::t1СB^(R$%[2g89r(4!G!賾_/-c/xD/O)E)`ss\&ss⑈lNMiboCT,F@) YSJ z;lBTPZ^^OLpQ?Doozeqb.^^Vvb8v:mnct₇D}Z-  3~Ɵs :77ݓyl рh@ Ήt$4Hek a5 MNR9!4G zζ sv21s5 O%4cE2F^/}r&I3!sey׿q={$I@H0eqNGTo?mTi\_'T Y1(_ChԘf×IENDB`qmpdclient-1.2.2/icons/crystal_amarok/000077500000000000000000000000001157363675200200215ustar00rootroot00000000000000qmpdclient-1.2.2/icons/crystal_amarok/add.png000066400000000000000000000010021157363675200212500ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME " OIDAT8˕J@f S+RPb}և)&]t]p)Z,mr;s ~ߜ.}|rnb*GQ;L3 w#rIVX²xgu଴ 0Ya1@hk{WiYi1M;tw@^;LՔ^i%w/tF (\_ݎaYM7/ё}kSOL54lOp䣣8G:xB9Äj&T}ΙϾTB|ו7x{m 0| IENDB`qmpdclient-1.2.2/icons/crystal_amarok/amarok/000077500000000000000000000000001157363675200212735ustar00rootroot00000000000000qmpdclient-1.2.2/icons/crystal_amarok/amarok/COPYING000066400000000000000000000434641157363675200223410ustar00rootroot00000000000000This copyright and license notice covers the images in this directory. Program copyright 2003-2005 Mark Kretschmann (markey AT web.de) and The AmaroK Team. This program is distributed under the terms of the GPL v2. GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey 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 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, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. qmpdclient-1.2.2/icons/crystal_amarok/amarok/collection.png000066400000000000000000000017421157363675200241400ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME*$moIDAT8u_huǿw.M^\Mݿ:]ꬸ:tPC cA(APTj*)2l6]kӤ&frŗ~6F_=y|ࡑWdY Ȣof?|ļꉷގy$bOEG_ZhL ]ů|-`9o|ͥ{Fm-L's@Nܧ8ۉ7x\o>2Zf R\3|^A(8$BrpWcC{v* )b2m jJO]XQc9[+q g'-.ª IઽO%Q]2alV0ـ^,W'f涪| _%rh<#T \vJ D 9]˔k.Eq*:%ZM8,X(%x8C[aYԛ&IyTc8h/XMH.j;v O'38f Y:$* JmASv#hZ8&'.}'',҅ 46-P]Ѷ:֋|pSqt5 ~aL]R¿ en?n&t{,{!m4eFPrK?[lRͭ#hj著m0>ݨ.z9 Ss/Nz-H-%RE=ر,xv(Re@ gu`OoWf0J M M\yhTy]G"{l}f/^.~Zw\B]IENDB`qmpdclient-1.2.2/icons/crystal_amarok/amarok/playlist.png000066400000000000000000000014411157363675200236420ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME#IDAT8mkioM/ZW PBF 7n\+ q!(H7b)qQ Rj:PkX4|E1$gp~(m=o_,JL~cަ5ەee K#7|)v&0d3yT˷Wv-Ǹ;>lڭ9 gVȿCv.1+"J{{7~VSװWr{Xʦ0ecloHYJ(011f(EZT˖*4. R|U1ZrnwCgڮ:qƲƫټ$ܿ-|TqgE]q=KBz=CYe+gEtwwcYV `*)B@ƨp8 @&cHƖfUDZ\KǞ2@*  1p9]~c>'XYF``py))Bv(V[fl>bьU@P؁1H$4jQ,U{,H `kЎ`B?õ0 |5lol4NtUo2iDݙٵ>Ut2~]ȖTK[k0"E5F?G}` bT<ұ[>{UUIENDB`qmpdclient-1.2.2/icons/crystal_amarok/amarok/random.png000066400000000000000000000015671157363675200232720ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe< IDAT8SKLSA}}ijKB֖*Wg嫶ĸ`BX)] {I7qA%B˜\qE $g1;gΜs/: #3/,/l]2jVF",;Z]Unt4c4 dgD EQ$ag4C. XZZ&F}u90do"z2*U{{LL#j0OMae:<.91>6ide+(ɗg>O>$Ӄ^D"at4#e#*PȴT2[ N`ppDsc3A).S<}6*lŰQ@$pl{3>>xPYQ C"UjF-8li"hNֽ{044T lnfԪ4cggv7vzpj$cqC LlI %Sn—/,&$dzq cE^*L*:;<888i_% zFSCns |IWHSs0ilm&tccc#4b5I 96}[f+A1d۬&>]3g`/Gu=,ntd3 ǵv yBSN:8Hu2U: q4m'eKMz+A ER=`$/&I6 9SwOQæD RIENDB`qmpdclient-1.2.2/icons/crystal_amarok/amarok/repeat.png000066400000000000000000000015741157363675200232700ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8S[H`aEFe-C>/=[3͖Ք"h-/h$TCWL ej3眙a-7҉;h`C@t:]ꜪW)ug+n2K!WLBLDP쎢K}ZV$qFDVVwnFT<ׯk=Y8|p­%WO x&D> uOii%80Dxb )HHfmtw R( ɠmیU˗| {a2 B)N ''&B9H9"nV,]6uMh2i?HT*Zϟ199%N%Xl1,ftr9q*\JJ R@0ػeJhoLJN ?z@q\.f(Ɔ'$$DȰQQ~/Y-Ϟ&m᠈8 篻0Wb[]w={8E-LA7D" T21H$n"J6  DE IǵMIENDB`qmpdclient-1.2.2/icons/crystal_amarok/amarok/shuffle.png000066400000000000000000000017041157363675200234370ustar00rootroot00000000000000PNG  IHDRa pHYs  gAMA|Q cHRMz%u0`:o_F:IDATxtoSe?{Nϵku[˘~  1 DÅ^xi"1ZARm3æ!st]wzn==@\|yvbb>;mpS'$I@H0eqNGTo?mTi\_'T Y1(_ChԘf×IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/000077500000000000000000000000001157363675200215025ustar00rootroot00000000000000qmpdclient-1.2.2/icons/crystal_amarok/crystal/COPYING000066400000000000000000000662521157363675200225500ustar00rootroot00000000000000This copyright and license notice covers the images in this directory. Note the license notice contains an add-on. ************************************************************************** KDE Crystal theme icons. Copyright (C) 2002 and following years KDE Artists This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 2.1 of the License. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA **** NOTE THIS ADD-ON **** The GNU Lesser General Public License or LGPL is written for software libraries in the first place. We expressly want the LGPL to be valid for this artwork library too. KDE Crystal theme icons is a special kind of software library, it is an artwork library, it's elements can be used in a Graphical User Interface, or GUI. Source code, for this library means: - for vectors svg; - for pixels, if applicable, the multi-layered formats xcf or psd, or otherwise png. The LGPL in some sections obliges you to make the files carry notices. With images this is in some cases impossible or hardly useful. With this library a notice is placed at a prominent place in the directory containing the elements. You may follow this practice. The exception in section 6 of the GNU Lesser General Public License covers the use of elements of this art library in a GUI. kde-artists [at] kde.org ++++++++++++++++++++++++++++++++++++++++++++ Below is the text of the LGPL version 2.1 ********************************************************************** GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! qmpdclient-1.2.2/icons/crystal_amarok/crystal/clear.png000066400000000000000000000053221157363675200233000ustar00rootroot00000000000000PNG  IHDR $sRGB7MS tiCCPiccxgPi CN% 9' Ef00!+HR\pu (DA,ʺ܌~>ݗۿ[txWN$`C<WfHh;(@#i)^@P½_{z,"' 8p8a>!A; \Cw~(rpدL8*䨯L=%dv/n~o}&h72Iz xTF|R^<p^s1*g {vn:{gQ*@);-C `)d`0 g|@ādY ԁF ΃Q4x ; A"C4HR!]bA63CP q ( AeP5T5C@ hzMBsGI0V5`ÞpSl8W ) ߂Ga>^DBD2G Cb)D* A{G>0(CYP(6*UFDuQP4-E[!Xt]nBwGw Ęc0LsӎLaX VkFbӱ*)EvG)q.0zq#2^9|#?_&H4 քBaFJ !*D 1XIr3 )ML_]#CFSlDOQS6R);yqxvs4 # dbT,ULPǨWS4Jsiii:Iw'Ћ?Ӈ TI -5$ pg$1JgcR RRR{ڤF ۥG?0eeetCK?OKA~/IFFyF=Fk&vYcu&&&GLLM~637㙵͙Gך,_V1byfg,ҳJj]&zM)kHzk & V6ҶǮn^>+CCÒ6KNSӐ39йKK˂k%7~qww{6~O:jg^:^<oZܵ]>_MT0~~5~smZײ]C@I@ JPxPsRSpY0? d[ȭP0lXPXSzOmܰeÍ6^Dl:"8%SOdCb{Tmۑ}c)E[GEXǔZwPx"q%)8=|K&r7+n޲y8E7 jz0ukJ6u 2&3m2k2ge"epֽ[g]r9}ʹr'om޷CuG靮;O"Ju;0,= ;~p@W0jOݏڻzo/›EEE72}1JJbJcm,(.:}Y^Xঃ7*L*eWzUvWUV}qi[tsxݑ:G>wlh89yycPq&٦'''O777ȷ­sO6vF{ip:_"~;y,lۯv: ;έ ]q]szz:~y5$/z{W.f_\rir婾M}\?tk.׮ \n} nnv29h:qvǐP;w- |޵o {0>y00G@O>RTiڿ&&{x=?>M?'?Qi5=?2w/S^.)g+WeBk땿ȼ9mߢw ˼?acǙOO?|2"r \@"D. r \@"]A!89x('g%zTXtauthorxxZXXZRWZR_Ltb&IDAT(ύP 0@ ! XT4HTP0BD4ߊ##Nz{?FQ5ܸ]XeĘ_0r98>}'IEQ.|su0MTUu]<ϰ9S{~mM5M\pRS,Ϥ~adQ 7WW[E`xAggLuu50{υ̻_Z͛XYky{j~NKEE@bfx=×o=93}gx |54DD}``exÇ/ w$O1r 1& A((9: I 14˗/@ ?999yy4~BHL0AD$D}dexm_L/@ʲ[?}ؿ/ܦQ _ L?Xra@1kk[ǿ^`GC_>*gkƗ€g`diʑ3 l322  ¿ r7NQL[}0G_f`} ȸ ^`6i9[03gx#KDpzZh-N{/ 0{~ax`a&IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/connect.png000066400000000000000000000017531157363675200236470ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<}IDATxAuS}FE o_~ۂe&+m+π˿3[/o%#)$&_;Nj\wg1|R+$+P__uhiEʙ0  0)3(0pq13+PYílLK_t Ĥ >#5ݘV&& _6&V&}ϊl@1* Zm >ɰaa9):g?\+ff@1{@YfWK0I22>>و!6,q1>ǎfx 8`Á e1P`ppSgt/L\Ca?Jȥ /=u ng?(2Ï A2' !o2 XXYY~-fou=6o 4_`b%I66`S0gҲA* ,3P1 M?bػ.õ2sw  x`fab`dblvA`? N w70*n GI݌1qˏ0 AF˷ /*IPg-H@ Xܸ(k?0HeX,=lY!ᓏl̢ =Ă6Ae{w{7oZ%$q&l1,~o_`YcIENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/disconnect.png000066400000000000000000000017771157363675200243550ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb,hu߿)L>a_Fǯ ?`2 &n^>^>Nmÿ~2_YSb/S7FSו,qVg8s~ b.?z 1^Ǐ31X:(2@'>a?|MdYOU삂^e_ R r2ҏxV&f0CER7P3## 6LYU!*DAYf#0L`##JÏ  F P#3@Cd<}L~?G:+DV&FF!L £Z9- l<s`cl'@1+)y33ӛnq#_䟮-f&/5PA@O-Q5/$YS0<6{E}YARK^TbPf`eaxPy @,虃=Ja$! ,f ̨A g=ЛeIENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/exit.png000066400000000000000000000014761157363675200231710ustar00rootroot00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT81lWo[H. v F$!20w #+HV !ni넄qؿX]9:s'cnP*=̥Ry:~{ms<57],-рhQJ)s:zm2dS.s8=1{&Ov:(Ɛi4{" ˌ2i6(Ϟ%ekm Y]%Z=F̙3Lܸə~}2YRt\("XYAE{u>)\/O"/^p:ћĴ*^1u";aXP9֌ul?~LjQvɅ<{F둮T&9ϟgg}ﶷv:H.(}Ztu 2(zqΑAD/_F>GVpΡbkIΝ$h="8΀N&IW*|`<" ~M2ĝ;YYᏥ%rF)R0U6ZњVcKԓ'{HyO6#}pa*!$Ẕ5*n1~IƄ!UG(%(#Gr>-/-- uJA  2F}^]EbL$BjmQf! Z;m></4IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/filter.png000066400000000000000000000014641157363675200235020ustar00rootroot00000000000000PNG  IHDRa pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb? @4---3 999$ V @`BFFGdջ^z:gΜ֬YWZw  0' ;?))鿦AqWWAzlܹs׽|DDyyyB---r֭@olWRR°_YYÇ q7^/^|dȑ#G£iii x57g ƍ?؝0 b۷߿>}?Nn"+  sÆ K. F7  EҥKO8w RÀ@z CAѱ XH/@H0g ej`;WW(Pt32c AzL1q@@7Uы/mS a^aaa(dKǏ?TB @`h.V4(߿Ȩ. \ PАB}}@&@0()~IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/goto.png000066400000000000000000000006401157363675200231600ustar00rootroot00000000000000PNG  IHDRabKGD pHYs ,tIME&#\-IDAT8ˍ=΂@!JD,4k3po8GoX٘ $L2fws4# B8!V} QJY),fcZA vd l6]ӯt2i(~w(v;zm+5IkcǷv[^!P)G*<˺lTJeCbfq<ϲh,3zRT7s{<jih)g@΁寡_+^p`<~?\،IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/help.png000066400000000000000000000013521157363675200231410ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  #utIME 1q,(wIDATxuKawgFS#aFC:P@iUܹp^Z¶pmY,#$hS"[:::;-tF*=p6眗8ú$$BTJ܈JV y*} ]XS]lH4cjTRmPw ]\16˿ [|]uлRXe#L_GpDXZfAENxc 0Yc_N=M$d -8~G`;@Q#WP0*pa2, ڤw vE#0t Iȱl @h]20Q]E_Bрg9h39tCKajݽ-ucQ%\Cj| B&8FHeD!F#_EpHʚQC Kmk̲CbQx6G$Ɲ c[{s*^S9. Wnu8?&~lډaڧ%TҼe)Mbmܛp;iCwB.~+b<|ǂӂfvKL-YHC. !e1]̕2ekbڸs;*IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/icons.png000066400000000000000000000016371157363675200233320ustar00rootroot00000000000000PNG  IHDRa pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?% &zA쀀_|ygE/1225, w|c_|`k?y鿟tׂ"``e`0ǰxb&̙3]@, ͩ g'Po ϟFwGv/ Ƿ/3Y5ASCh0m ?~|khlld,**/&&PQQ@0vgu-M_>p 8כ Tq)I ?1}l˷wBToa 0@|r1t˗/ 030g#?~_`02be +V`4 wTq 1XYH18ç ^1|xpL[`w 9 -WQvANfI~V+o2ڿbh.g`t k ߫0|@c“f2arm.(C{㑅D#ÿ@C1DtfX|)#@1:;;WVV DGFF_>QaNׯ pr 1 ( `Z[;/^LU@3ş10PSc`6>~ 䤉DAQ+ 73̟"CB%A^ FlY\Ah7 FDD}a&?7 z",aIENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/info.png000066400000000000000000000016501157363675200231450ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  d_tIME %9tEXtCommentCreated with The GIMPd%n IDATxeMh\eΝ;3ɤI̤FMZSVP'J PӅ.EnE•l "]KR`6`(EZCM:!3M&sHZ=r8G|12~ܖ@-J+կݱ7}{^l7n}׏va.j$8e& _>nZ?;28"a4[[SXa=F+xgLng>4(GG_z᩽M)rJHY)p*1G=];_:IW > Cp"{i(UPJst\=.^~'=݃\ODbpQk-RJ(DJHP~\S`yR"{z[ٿ+GkKuԣɃ=]o*V dbGl\V"r FKtR !@RHၵ8kY)d-sn4TRaA͢O=0a4Rk\VqA6{R[,pdW1S,/JB*tJ~fK̙;ukbB :x}m/ǶgwҜzGn m:.={0&-΁dJ@h,[~x[ھ*Cks鍊}WӕTm9sB&J(1qlQ"LihAkqۯ9oʮY{wjC6\y[qQ@)j:Z shCJ#*1J^>H͛Y]M5RKߵ_M& X;Sal] 4\=(e997ӆslX'_/S0S< -\f1yNzch&Iy!KB1s8r9Mo\~)z8l{{_^}\Ӓk Dd,E38V$Ls0Y 陝a<~^Tz/'pj&7#W 9wIi_wF8q.IZ-1kVێ\a9 dV94D"#$[Kh8gc!IXA( +2Y 92^bQzi?txbiGrK vR`1JPZ"hmPʥfRE|2L2[8K:[OѨցOcrLY-"nҾGd3 枿/IRɀ}'آ$ւR|=zr QU. D >+zZ̛P(O9F&r;h|,t+,CXH71Q٩dfVn^KS7 `Bh%!q uC,\1`U]/8I<$Exz}~ ;Ɗd0Zj+I:PX9y\%&"@USv ʑ iBi8("UZYLk֧X(@,:!UʱÞ-V AWU^#.l%A-YԁURVE+D뚠4'(%3֢4>xPJlJ[cTmc"(R5d>q"m40ZF񃩂C)te2;S (TF%D @ e5ڄB+j%{^n4oFZOK2W&= B#r r[Ki_=LfuI9%+4f&e"+^"hNSBWd|EK$ޔVR mPar7蛋+NҜI" bRhc^[7$/yP kR?%RX*x7ʌ\.>;vpCosFbJEKƤ$}ظNC2|Do BdntB#'czqw^:ۚ˕ɗ*ʤW ƬO610xlͷl>7wnhki&[_GC}:y/[lL1rtfsWΖ/8pg_ ,ƚl},u,3lyKY4?.4IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/key_bindings.png000066400000000000000000000013061157363675200246550ustar00rootroot00000000000000PNG  IHDRagAMA7}IDATxϋU?9q_4ΝfRC][(BEHZ*H"VlZHk"j*JD!tFm;}{sZ wyx?%OOs;*hOPң֔ˋ։<6ג{)*w{jZIәlSQt"0Ta@rnlGI̭?y~L)$E *>woxZnk)cL( ˻NuyOHB?0kp6dvvcǏب™o+SXh𠽇I{|te8xP#_7{|lff졃^K.ר| woDg)},7?9&W'>LDTQ JQ}VA>( `29]hmy" 4MOJ!FȌA)ò2& D91FbcJYKe4 gmmVֱkPHazz:TAW> 55("zee5Z8PZxW e,XCKy9RJ~T(Rڽ^w/":C/|t]l:IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/locale.png000066400000000000000000000014531157363675200234520ustar00rootroot00000000000000PNG  IHDRagAMA7IDATxMhgvf&F I4c4֕6@IL,,VEW@RA='`- mQz(nMluQкM5&nvg3_/4>}y/O{7MN:Z*%uڄ)p|5ߛKz"N>ζ95-`X<7TS_$х5+gW4< rx9UY'k[z m}Pj"~h'@_U/P})Kڍ~=*/a}ׯ4ZmHȫWS)EuAT0Q^de-x[zKms>VQ;z{=28NԞX |>r;'i(9a.% LMM%ܩg`uu!;@Lws 'N;~qr@x."˗K'sD>'#={) 3=ka;6>$kɼ}2CR"x%tLtGV 5*eYH37iXn'9 #O1ܲnvmwUQOyjeG2 ,Jz.8pR_@XOۦfxKYJhxQ\Pfa06j?oGrZԮB2w hP9;!C 2d\IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/looknfeel.png000066400000000000000000000015121157363675200241650ustar00rootroot00000000000000PNG  IHDRagAMA7IDATxkeǾnD+ZER@6`1 J҃(EPx+H T%\DZ6%I6f>_zpNsfx_h@LMM&IR}RkVO;MN+Շ`*oll>GK{њ^4&W8^t($><3::>s%R\NBk%lAxxkZk۝.| ԋ*R1˼Z4c߷F(>{BIAJ)*! |,9Qubk6<Ɯ|b}ݞ!!y5QMbpCgU盝!%J MPWhm'< o2Z?l+NH!A Rb56]t1X#R-(V).H%D Ir$HڭMVffXjO2ss v2$ BU(W'\s_YRQczvJ@VDkw~gBHBM'[F^feBi*$BG:k]n,;dT)!% I|n@J+&zUP[ 9lH<~jwH‰C/4 8Bh`mR 8\: 4E쟘T*1c]r!lۛӟ'~IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/saveas.png000066400000000000000000000021201157363675200234650ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb??Ç>~ ?} d2]`l}AIj'x{7.pz/7 @@L3ׯ?7Cwwz gq_.'BHN8?@\PT? _~ ×/߀ e`< w3dY h?bXO?iˎɞG`>=517L4?|7Éw0°Û/_ w0<|+Р?~2|3h@E@ge8~'7 ? @C!;++#?" qil e8^ /×ϯ0(>gPc0Ֆ8', pL~>4ޫ kϞ(   ߿d/ë@W * \ ?0y/^~e ` ?/0 /pS(mp?t> ~ ɯtw7o1q3|F)cp毟.-H`| wb%YP&*tO`f7މh1fd?~A3p9 X| ?U~hO?0q10@1cb/1Y ~P|fW ׏ ʱc``2>vIENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/server.png000066400000000000000000000007121157363675200235160ustar00rootroot00000000000000PNG  IHDRa pHYs  gAMA|Q cHRMz%u0`:o_F@IDATxb?:Ȭߍ)]d2Ψp ]=@0AݳGlk`<@4DЀn qA+ ʀ"h!@@8s2 %e`dQٳg3|b [Ȉ5|_32&b( gϞ?wJJJΞ=ˠ;;;Ǐ?Pfff&&Dxrqq1tuu1}ݻw ?d(..f @ # į5M!@!% ,IENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/stream.png000066400000000000000000000013261157363675200235050ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME4VCcIDAT8ˍ]HamjSr2]FB I!(n 0o#@*1ANL j}ahnt1 <<9 `3a*5yL0;.-Y8=Fϣd0ZӀ])yIn?X'<!\mVM52wd\(,r7I26+i@^uӶ i9 7 /lrwWZ?~ 1 ե+(=Hb (Lͷx;XTR}qdU Uqk.^>M q]=4 rwwS11,*Xs:7]yXMǠA֡ X1EXn,a@ 7sYNA>S*eSCȷ8_w:j An3Gu=WPo$ΪzE"z(2l- 1 hh7Ԯ ~!! ιљE ̥߰B$Yq! weil")4(TWE} `>XGI2;YwaUW@[Ӏ=1i_  rfIENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/stream32.png000066400000000000000000000032521157363675200236520ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME29X7IDATX[L\s̙ bK0C l&mݴQ8ȖRU_SCHUVEU8jSr&ll6  `f>}8`c` -mmmi_b6_fSr(;-[ [z%ĜzٞPS4(ltF[(-*Z?J8b##/ȭ̌3e+ioԛƷj0i x 6#py;` pi`u;xFo [ 1g:(ٿdF N-p/8G$>H094w[Z:̯犊o~+gcCY2wvCi8/&&_N WÖ~@8Gѵ.--@DAvu^჌_ V-yuLteہl&h*-bv>B a̿\ ܺ1n qb{ʉpȌLv|X –?"/p6@هc#W+#G<:nM}Kubyz~vio.u_kv׺ћWuFw5:d}_8aC#g֗ ,CA0b01e$!pY=+^Y|eo= .5Rgv*sB9]e+i_:J^S_%e@w(۸P;dĢi"ٻ?;XXVF"w7%tR` ?] 0(x;k+gq$Gl:֝ DygX"qϐC%?ՈK0?}9HlTdj\)TQenbqk7 æL?$TH'pixmSE"Bqz;?C7CF U~J9quiQX>'l;VkwY1b0$7s:"0WDP l& (5Ueч$;6,ɖ-ۜ\`=TvrA#d#_!hTh0Xw/^B f]Ɋ֚b³argsG.9蘀 Ѧ䖕6KZ !a1׬<g/_BE`2Ƿձ%+h=1u#CMrgi~ѩE,#ۄM'#9476C$F=$6%˱ 2X8D4hDMdѥ rej^Z-}t,>t/Lb> g. 096͝+W( ̐pS F}FPre{hӅ D{ףO嗗 PHM=CÇ<nIAVKsb+Dr>N윁y ܀tts˲L''{yTq=򯫋_$=5w;zو1GsMV_br.qIENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/style.png000066400000000000000000000016131157363675200233510ustar00rootroot00000000000000PNG  IHDRa pHYs  ~gAMA|Q cHRMz%u0`:o_FIDATxb?2|Jeˣcxܫ{]' PSa' 1#z4`u:yFntv'g!f1 fFV@L Ppě^fq X$5D2Zw @e 0 9R$"vXA^ҟ>\a8 ʾ1P/Lw$@ ?g/0[%<2L!xt^_9 j` ˘% gblw w);qVgpО!İW ' ]m gg2L;Ę!l g 3N[3H00󛁓GABـ!Y/@^gdd Fc1hIf_, BZLQWP߿?`>;Cß0 Eς3 >ï =!_DEE ~e4GVshD &%%%Va '' %%Ő`?2| 1A>|_Td0?0~û~ 2 rk3Wٿp)<`7| ŀ_!ma0=1r"ԽEB1H< /oh ҬkI_`νIENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/time.png000066400000000000000000000020311157363675200231420ustar00rootroot00000000000000PNG  IHDRa pHYs  gAMA|Q cHRMz%u0`:o_FIDATxbd@*o*?}ߟ?^M 9{;8ß=p#_ן|O⻋`zԒW6&~6FV0ccc\@ }}P@LE) 6Ro~2|zEk@'@1XߞnYj" ʲ@00pꙇ r@g30:|*r''5O ī} "BtTp;eN =SqS { VE g&FIENDB`qmpdclient-1.2.2/icons/crystal_amarok/crystal/tree.png000066400000000000000000000011411157363675200231440ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME&1IDATxڥ?OTQv<e( 1R,V64XH֘bDteaagf,.*{&9slLۢjׂbNpwR)j]kUeԕR HF(SLQ5|P47Pbl-5 P5a8"FE(H@׋x/YA"D#`hw9,<\t?hJPUDRQQ`M?C| ]@5xAgooNC۝bIA dEDQV%ʲbA/lإ3 eY !w0K8P`vMfcc,@fs_ +t%l n fmgpOXX0+h4ln> '-!*ͮpD)G^ w*J-cL Oe`@"ч(p%=_2ChIENDB`qmpdclient-1.2.2/icons/crystal_amarok/dynamic.png000066400000000000000000000136611157363675200221620ustar00rootroot00000000000000PNG  IHDR``GgAMA abKGD pHYs  tIME ,P=.IDATx]iWWF]݈ -DH Fc&28~y89'p0F0(nl@oToyU齫 9NwWݺ}{ h4.]/hkkÙ3g2/E1めҥKի gJv| ^/e6IWWW k4I\S7o$Oo)Ӓ.`}}QqyB@oo/Ųofg6S𨩩I,]]]y&Y__\.iii4|C:IO> Y)&Ϸ~2Lq(`aaTVz?$󤩩)/#E,t:FN:d*} 'X ~b M-TKR b t ~H8!1M\SyիW)l (޽{Ikkkʴv??\|e)B7%J~Q:2U)$ݻX]];FƏ̒j%o*E($)~^'gϞUMH$&`\ܺu/D<*p"1|ii SlbTۢJ g p8ȱcǒueww71LFCde<ŋd2.\LmNzlT,)˲r˔X,r8I`Rp5 ) "se7êh>89 @n1=w\y KpaR[[1 |-EAGz(O>^/Ia&''S:ylv=,,,DoOy@>sNAzϧ|Sbl8vX㖜M!X^^ƞ={R;p8@(W^Q}mU:t(o&w1uTx%y`0m||>9A}+vttiEH+PXz׃yByzzzZ)LNN J@8 upYe4WO*&)]QQAzzzBjn>ёwZTN#E555hhhI.|ޤHEzN#_}v{F5O2IWWW.yMvKh[OO_ %r,嵆x<^PEQĉ' eUM`vD&UB!* /~6Mue"]JayA C],..."HxcN?f`I="666^O9R0igSSSxE^d/'+JG%l~a`X(?ۈb_{,ʠ!-?̌&p8w F;w6X,RtN n[Daj)":;;AFeL3"7"SNJuu5766{Q׮]bDsNExw k׮aee. vrI9M Iy`0H QykD@UUUQȲ,"Hn%y[]v4y$#,P:x^*vυn_-)BeDI"pv6%PQQA>SEJ<籴@ X,TTT'N( qJ'z, ;VP9 @։yVWWQVVv%zIEzqqu`pVUmn_޿jE---y^~~P,pNqβ,&&&PhY(JMMMѶYE Rs:.:EO^+bt(լi JRSmA{T!>>VqBh6ۗ Ƚq<v{w$/-G $oT444łi0 3zfȑ#r)nD`y̻"genzzZQh033:E ɓ1LX,yÉB-%7DB ߥdJj``駟!}`Yvfrr2g^!ܞnFАSttѦyirZm Ut(Q,lnnfU6177O/N״D`2,(>}1[:Vt.CD"Bؐ#h=F#rE24M Dm[μ e@jjjh04kڱ d2frhւ(^ٷo˷ukʶ ^Oh޽{!:WVVB!EZMſM|aD!4[} yXV|'ty #x̛h%;D"GBiCjttjHvލ]l[fnLMMviPx^2@דC89FliZz ˲z~QR`0`Ϟ=p\T`068SKUAD"1#i5˲0 }s2Q X,`YWa:.ASyx!)dVӂqڠI?Ąi̼5I0~cjj k޲f(vfi>400h4Z0t+V9I^~_ލ)E41cnn###E79qL&fGQ `ZF6ǭӒVWWɓ`Zq9Fl|qY"|X\\DYYu^VVvfqqr#Q oNMMp8 a :et<ǏիW;bADrUUU裏4TD@QXMYciF mv0" mIV -iEQ8x p/.,,BHH-..yNCeetfDF;e/~2|N'N'xݻwgdJ=& php'TUUI)ÁñύD" MMLLLL&t:Zf:| Ðw eX󨯯6?H4"DQT[r'&&>p\Evo B5ŭ"b)544P(aP0U-fBN< ^y0VWW[, YtQKzSٳga2%J+0l6/@YYnۊh|>pqd"nJ `QEB`/xh4O>q%WDxxs ^/B(!H$1Yw~R*D"޽{5wZR$^|x<xXMF`{ESSbX<099 QK:,Rc37'Tn͔V|>^| Q#_ ytV000QGCђ͕R#N8N͕ͷl2$qX[[5+>H?ݻyIqX,MV8N*ySRth(.9ׯ_ߵYzVAL&r\Hmҁ3s3nZeYyF.%< -PL8C]]fĻ`͖U73,{ii /_C,2p>a$K Ày<~'PM6H+>Eb^>L3M2I# R0Bo:֔Zd"/z]Tcff&Tz0 ***pa~K擦i auuM;,K7n`mmM5^ ,|OׯXwJ-IɃ%3JmqAS̡:%' (//DZcT1@KCҋPwK RweNt+>iAyyyF &Hd0y_Iݎ:-p|v'<0EK҆k_gW/YؤEIENDB`qmpdclient-1.2.2/icons/crystal_amarok/iconset.conf000066400000000000000000000025251157363675200223400ustar00rootroot00000000000000[Iconset] Name="Crystal + Amarok" Author="KDE team, Amarok team and Håvard Tautra Knutsen." License="See icon subfolder 'COPYING' files." Description="The default icon set. Based on Crystal and Amarok icons." [Icons] enqueue=add.png information=crystal/info.png prev=prev.png play=play.png pause=pause.png stop=stop.png next=next.png volume=volume.png time=crystal/time.png connect=crystal/connect.png disconnect=crystal/disconnect.png rescan=reload.png preferences=crystal/configure.png quit=crystal/exit.png playlist=amarok/playlist.png library=amarok/collection.png directories=crystal/tree.png radio=crystal/stream.png playlists=amarok/playlist.png clearline=crystal/clear.png random=amarok/random.png repeat=amarok/repeat.png jumpto=crystal/goto.png queue=add.png dequeue=remove.png shuffle=amarok/shuffle.png dynamicon=crystal/goto.png saveas=crystal/saveas.png remove=remove.png crop=crop.png clear=removeall.png delete=remove.png dynamic=dynamic.png server=crystal/server.png lookandfeel=crystal/looknfeel.png icons=crystal/icons.png styles=crystal/style.png language=crystal/locale.png dynamicplaylist=dynamic.png notifications=crystal/info.png shortcuts=crystal/key_bindings.png tagguesser=crystal/help.png coverart=crystal/icons.png newstation=add.png deletestation=remove.png addradiodialog=crystal/stream32.png metainfodialog=crystal/info32.png qmpdclient-1.2.2/icons/crystal_amarok/next.png000066400000000000000000000012361157363675200215070ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME &kF+IDAT8˕oHqǿ~s:nwpz ) ED FFw$G6(eE@"pz)I+d6]oZ50_x^=|>|qx@tI%|w}o6 ~t6O7K)\f2G p{!.ӛkUEao@#cذkeZWh8H+mo>ԫݖcVRZ3ifG õ9og(UE"9IDɡ"U9-'FtOHr QEC>]e=xRX4+YLmg'6&aȋ n7&0L ,MP*+ $Sbg]!A˶&MX|&~?SK>*lC9WoIK?|YiAE@X S,PeL~"N#_ JR;|8$ `E@IT<g q htęBBS+Eg~E"IENDB`qmpdclient-1.2.2/icons/crystal_amarok/pause.png000066400000000000000000000007041157363675200216450ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME ,;ɚQIDAT8ˍ=KPO I:4m]A:*-*.qsѹJ;JAb鐴ơ4`9=;۵zquyG'zi>>Hڨnej /o_9W6E@鎹0Nw~`qCr  S09tD `hZ0da(@BGR #'sAePVG;ギaqz&yziUm73 Bq(OIv_\54=.cЂ-w vQg--tu>*9EJ/`g3[q wx}ytڭD# )IENDB`qmpdclient-1.2.2/icons/crystal_amarok/play.png000066400000000000000000000011061157363675200214720ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME )T=}ϭh*&!D~fC{)5c= Q;ϐn>'n81Yx7pI2|'#SPPǷA2ƞ "   &!l<};vtT>~3p0)ʘ0s ~yyݟ1*G"*~}~̺koN.k*|94e3jPTvyՀ\ 3yK9884";^d z3WQ.۩t^}G&N'jjԉv[ Ѻ%NrYC[R׆IDZe,~N%n߸TφO*B 8=1YQbo[=y[lh8;i7d[IENDB`qmpdclient-1.2.2/icons/crystal_amarok/reload.png000066400000000000000000000013631157363675200220000ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME wtQIDAT8˝_HSqϚ;m隳U2QVTR 3 1*L^|cDaC(`TJNf!mn{篗a+&1k `[fj}S'p(ZOQNϴ||?1=\/DeO"_[;C!4)6u%">XY{  wHEylPqRhsK9X@Yǰ(CM}ߺ_~)Sc1 01nQ[[Z<=JׁD _/Qft8BO~KǕN՗Ԋ^O!ľ ng+'7hU3ۆG]'\\Y^wE :<զNJJc)O;ǂkI?@#3\ RήlvsL,մO-b1H  /"mLkajVSN7 X S+ . %^ 7ߗГGzETbŸ#ʀc Fؙ~Ņ9!a,mɃՀw xtdߣ#`\֗*-B u1uYLx\SMcL.m;#AA y0X/_1r~mtG~(3(335c wP 2If/wIENDB`qmpdclient-1.2.2/icons/next.png000066400000000000000000000012361157363675200164740ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME &kF+IDAT8˕oHqǿ~s:nwpz ) ED FFw$G6(eE@"pz)I+d6]oZ50_x^=|>|qx@tI%|w}o6 ~t6O7K)\f2G p{!.ӛkUEao@#cذkeZWh8H+mo>ԫݖcVRZ3ifG õ9og(UE"9IDɡ"U9-'FtOHr QEC>]e=xRX4+YLmg'6&aȋ n7&0L ,MP*+ $Sbg]!A˶&MX|&~?SK>*lC9WoIK?|YiAE@X S,PeL~"N#_ JR;|8$ `E@IT<g q htęBBS+Eg~E"IENDB`qmpdclient-1.2.2/icons/oxygen/000077500000000000000000000000001157363675200163175ustar00rootroot00000000000000qmpdclient-1.2.2/icons/oxygen/application-exit.png000066400000000000000000000033401157363675200222770ustar00rootroot00000000000000PNG  IHDR szz pHYs^tIME kbKGDmIDATxW[lTU]ޙR>JUbĆ"HH0 ["9=g̙ kSY+͋AMSLhU:;3}}f9-I4Zuu eԨ}'O&ޡ rzM0^]h65 Pшn6\߉D]=R |֏P!|uh‘A'͜938S"? ep;MJ29g{[1b*;Vś_@ h`#obrV$WO j (_{O}E,)ą!b6=IΙqX)d>[kBaB&ۖSU,bz {w ;UD2Il/&e"RD[Oq XKY(Uasze 'WQ-lm%e1pgU1P, w׆h zZ̲yPH" Ȥ !@@{RA|ϞGDLop:>  ?͓"*8c1!oj07:,Gb /pC>Z2YDÜ.ЭWh4W{Q#(Ep%MsШ x .1=6tl,Ϧ {t ENXqitDu8>Ў0n/ye{f7vDhIENDB`qmpdclient-1.2.2/icons/oxygen/configure.png000066400000000000000000000031071157363675200210070ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs^tIME)%FUIDATXõmPϾ, xv7`L't|)m1m^<'PtH[dS2PjaFd$DH\%[`a}|љr,SsuC ݦ?~y!!!#UU hKʼ}^qE{o'vxA,R}nkvkEn#nk֮V&MxFcPXyu%@8 ɀ~CSo? ʀ&!HJJJGgQJ 9#s@IR04lkeF ( 93/o.Ah?kw>w;#!p\z<ል޳dʃG QӔtpKnO5ūWƆ.mmmLfBB j)++k,! ߧEfLN65t:eV$Ikjj@%O>HK$͙Zbc%&R'Ujf2QT\,7?v}jH$j|C[ y̑`c縊5Kc—/[1EQ[^ÍuVݲy500pӇZ{7n kO:3U""*ZPPPuτ)f;+_D~p1!C̙;W8jv6@Ⱥ?~{cs+'SqcEr|f4$GJΆq8a*Ćo_~ u }_w477EQx O^fPw岹T>dO++l6zIݖxnW^/]o04l@-.4b#.*;vwmz&)v /~ɷ3;;s䜳L#jLQB(qd00(A!Vc ƈ1KL c[JfOPɕV2 kCvTM O47&v.׼@2cKyh*M/jU0t44h`"@EO2WG8k2!#6+}pھLƁ }iXZ#@my-/ ]Bֆ;`XCJ3j:y|8GYؔ0$\!Pݳo:xtmp"x s͖!(C0zS>߈c8C)p5P B7uC""f{ԙ>ص{8Lݐ)"~ Z`0JȀ } OU8\Rͽ81w1­`9G>0xHD]~'QD-amt]Mƀ  {5f1F@XH,0"HHj-.P鬍q7 .* qxwO=3L,f:Ea41 A3;a۶4N|pZEآE:Ύ= : Rj(6opx+' c eE=eq"TܯzrFٗR6}JD*6"ޠ9iX%QWB' e EޙsdoC>}؀)&j' Ar MsUm5:T]xh>XsѪjDR|(R ׀eS E׆cF.:[F0p@ ri d^q1cDZ2ʃ0pbbpAsׅl5urw&g6ѵɅBYw 檇YpQ7? 6eO6IENDB`qmpdclient-1.2.2/icons/oxygen/document-save-as.png000066400000000000000000000041501157363675200222000ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxWkpUonnCI v4EZ1L[V[0€JCˀm;@ mGej -Mt*㨥*L eZ0$%BH>rO=瞳w&65Ov߷;2c ɘn9< ͍GV knYE5H,j, Ѳ  HtGg6S(.."̛p rYCf:Z]>ϒ, ZJ#H&ڱX"fG?X(LRA^tu?jzŲ 9 +'P^.yYh&8ExnRq ;S$L1P5܃ γ@e@2-:w7{5va-5GBU6ᖕ+a1+3'f@OFa B.uC"FGqJd"6M0kz L˜ň7-<;:=SGPo l߸8䭕յ %a(MM z8`z4aW <{TR?R 4/O43m!]cPWЋӈk ~u>!L_)h/9X G{o@UU~huwJϐ);3wFYF3N4$4R<PXDYi]`^S))vih6Ψ:#P1۞x/> EH'I_#4l:oC$=u_}аP[|C/>9 ~iI eyZiSMCoN9¼.kxxB&kf@Œ7#~wD|.8WVx=JC U}qOjaNZ_&: hضaYB*pg"[V-WV=T=,Fn\dD{:ynĴH D5{/l\Y ӟ\}#2xJ!lMsVÝ瀹<_lZꄖJw qjϛնnb? u<|*%!Am8Cen[ )v9pU AM[nuAߢi|)"| M,L& jl`eanV3֟}d8ГCG oC(*,41@L*}=yvCס4E8Z2vj4ѳ-V0ztׂdʟ{/9ŵ#-+W % H% wp CV4%A]{CR2YǠt!)sa NS3 EU9{6 \BQF~At8k"E,x xzhp}Īarvk9`!A8ݎff],[p/ Y c >^˦ :WbfQ7nr-|0j#Ac*NS_`Cssu3ٌ_/R=%0X A5 ۍ8Q%] #0Xwt'm#.g"EqΈݎKfD"kK~<<_?C#GT)WfZ\ ^iCuQCtvE 4Q#N 4 nh Iӑs#"*Z2SWV؅Fy~޾S,ܫ#7[{^ΝDF`Ll9“ie!jyԢ $0tJ8h)L;Cn㘦$ʹmjQAo>L41S?ڰr%=*ϻ# 9õZDO*|BF?ȓKќBFJ̀tf0&Ɔ{`A]VRY^ql4@ss37v=7g%EqN YNeV'oʃ@ӥ,M T'z_J?7@Nur\Q EMMXF9nmj$k3` %2%5*Ld:PU=Ɍ] 145cK48lHl;&M %]Uu:xq_1;IENDB`qmpdclient-1.2.2/icons/oxygen/edit-copy.png000066400000000000000000000015341157363675200207250ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<2PLTECEEMQO_bbcfeZ^\gljjnkЍtRNS%;EKLxё{IDATxڍ]KQg u$ ,7B #J$#HM={N3gY]yxyg B# \E׀p7<,/O` "*i0 _@y`LPQӪ<%N[VE gLT- \0\r#"0u0*\nŪHId`iSYkn Z [%h@%ag٢*0# D)-[zc¨=j89 ]Pnhtco&u _*M>c״/g1OhUPOF癹Vn*%UY/~m*E;8t;jIyFWi ~H(M,3nCFK7J~=,⦍)媚ٳĉ .d@ 89Ll:;G-@ebtoR1ܥI(DR0ղ1ՓPlV 1bDRh nȕ2;nY,{eJ0 QxP q k]W!(¾H;Z4Հ^;]3~Bnۭ6 j4bjLor <@b_8R?:)}jiHt8v Ip.bq/˃> *![IM&p9>ap<@D`qYm1vZ){4QF-t;2S]D<8]& LA8 8oa6c͎{.IĊOa\F:8cxA) h9a{+x} *ʀM=qjZ@TEEJp[jlpݐdΣ1̊mKnLS"([ bdkVIENDB`qmpdclient-1.2.2/icons/oxygen/edit-paste.png000066400000000000000000000016511157363675200210670ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<&IDATxڥWKkQ>Լ@ Zlt}@ܺP(kXJj hCBnٝuҮ-Xɫ;9w8vr/\Ν{ι37eYi6 c/8Jarrrhn:t@0\y`ii7r{-L XXXDt5pyt:ijߪ2̻!F|>P C8a{~\|ݎvvvkLL˯l6 `'g>66vMLB"}jM*vm~ j#/۵1BZ? b1hZZ4VQ\Vyw"uS ζjU\.?#U4{gzAe3X*X,0 j I߅ 8s+u&Dkp O' 8 px gY'rc!ȵ )):oyqYť6!&1d3Rt1}I.BLu?єi؀9l;R,Rhbgc }\q.2:t2߇p( WH&ZY^Nu3 Z=>;pp`‹gVⰺ!Nm6n6o;VzPt?%\{ fc o߃ϟPwEMtݥS r+ݤnGdjD,/K@ݱVo?Ew[p;QBR$N^2E,-K J%ׅIENDB`qmpdclient-1.2.2/icons/oxygen/feed-subscribe.png000066400000000000000000000031001157363675200217010ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵW}HW^W3{D+4PckJq0%4s3 6ȶApE`?m0Bte:no={~t7< ͶFjj˖-iY\\iڕMqqq@8`4m&{秦8o/c8033 ~zLhh>/?55uN7'&&hvv5ӫ  'O\"5ά)vl+}=z_+{k3O asFǏKb%Dwp9D!Vnts2'xСC|3*} :IB|4,6 Jjk8!؁*7Ӏ_B 8&,F7JH\qL… a<,^*Kt?j 1;5,`|DXD P(33Spr(܎b C-:;;Ç+%WV=z$t[T8~8-B^"''gJ;_鋳2'p@ ԉ"?k7"`MʆDqq?y9٨Gv효YYY\W"_ Iq,CE^s6S'"wC0`^F$w'O||-𮀏NLjYF2,~L %г 7ޫFƊ{E 'IENDB`qmpdclient-1.2.2/icons/oxygen/fill-color.png000066400000000000000000000047141157363675200210750ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IIDATxڭ PTW/1b7FpAQD8(#Q˚8jlhL4-'TDEAaEDT6W@7Ȣ{ w;Ӆ#1Ss>^}9{`^f/[I S 3K}gm"JUbrnnh؏7̺`$g3N+KZ|^;r?վr\p,??F,0p;sf/sv9;w{ތo TrHMMEhh(Çw<{);=`Ɵw2q/d3<yyy++ksj5mmmhjjBUU>|4ܸq8z(p%+WB("|;ޯ ?sa_'%=Uvtt```hnnsN>dOwA܀31#%ʚmgg'.(J$''֭[8w<==|~D.l+ 9A#%EDQ( uu5DF}}=')rebc@BE?#+K%Iee% %%%@/?c!}řE=.ÃmKFܹs<#!u;DC(d)t?>U}(ڶ dw< `&KD[[[H-^)hk E&+ʎA P ۆLFSM$=Dn߰m)** Y} ԅ^h G#;do V.4)ooH_?+!i?b 26"gobLMLEECۙ tAgT4ŌC]5ZLwCM@g/Y[Pi„2V0`DD cW 9bGN_CC/C]vf1ȿ0ձhDUb^BGI{P Y|RFSa ciV B#ĠEWcS& Ev,=EypPOe3h3c+V1~xlݺ5:x!Ç^SїiImP-@C {RQt\ ]sHB,stycT )XHE9*o KP=y@&} ...k`5cK/ƬsӦMG h9BC·_ámKrmѕf edTP HƏpO }M5M΋D"פ$a MdGctDNhx$#T m^2ն|cC;Qtj~{*` P{g 'i?1j޼yw}aaaē'Ox$yqrМlP]{CTpb܈-Q-UA5k|6lz$wL( d)))ͨ ɩ)C͓({111?~Έclu'{2Oϖoou͙3N$Bٳ *:~oJau*} .VXX[HpslllƏQ=cihxUd-\YٴH,AH<qcҲeN?qℜ :twĉ'5Ch'~̘pȘ3ߧS?ɌE'LMM]gp"U7o .k]Kl=>vlU:8ӧrLV,$^'K9\[u5#Lo J@IENDB`qmpdclient-1.2.2/icons/oxygen/folder-sound.png000066400000000000000000000022371157363675200214320ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx]Te9su4W]ֲ, , / ꮮo o>@0)\6Yrיsv4gpv#os?fQUn$ 8/wGfE.Jhǧ幷FV\0b<O1W'o]?ݽVBtS q۪\ #lyW}~I@峀KZaţ3Dmʜ'??XVHׁ" z\G܉tYM`xO+I\1vb^1iB&Κ~AsL.ʡxd{ S" LqZc¦^> '. \l]Ҽ6@,a}'D 05*a*d({5n׷YԘ$΀VswọKG,<=(FDIB'V\lȊ:+mgt6“6a1fߓEuvc@R<"[amYXSrqVE#$k vb͹l(G>96 p^;+J"d7Ĥ ` +X1<:e .`D'/! <I%CIfg\m΁-@B'%.A iyOҮc*F; "[HRhXhV"bo1VpN(Y1 :ĥlSd:3~̙Ӝ;M8oDCs>ZXX8~mewY?Z qtI:59|9CmxWjs'~d4j!U!@X̋,D-(ca]~QO h%mZZB{rk+l?W?/K\7-vjsGh7@N=@:ʀf 0UU#ZֶuIENDB`qmpdclient-1.2.2/icons/oxygen/games-config-background.png000066400000000000000000000037241157363675200235070ustar00rootroot00000000000000PNG  IHDR szz pHYs oybKGDFIDATX͗ˎfG ?\tOd)e$P$)OĚ`=OJ$Dab"Bg.rΩY;Da%vU._ʶ?53Qs8UT5zws7}13O^}m @E&|zks9<_`^ x*G@6pvbE } C9W?^ 1! A9bUtK ( xC !ITGQh5b:S\)U8N j&*h6bH#ZEE*! 3"=&W{(~ ɟ_f3N3:XR ,ΐ %CRT(4O?w;S&.u@dJ=N,WAE!'H@UmTa=FD+oѢOp9h 4BSx 6cv;Db` `<, eXp pq k*X@ )#"):ZD$׵PA';HX3C,R] "3BexON3 .6…ci6{.0;YxeU XfoA"t{$_"ˈkPEB`A`Lh|@$".a>#M BT7{ϠО3ħ<݌>2t0ay7L+]B"Dr $~9“jeNx<$M=!FA$m[w+_Un1?e1nilby8ζaQѻ%Bkvz凑i2BȤX!2Klaa²1N'{';c FJV33Piq!/G`G206=q"@ɉ# 11"!Lw{i=fF΅3%H xo=;'8[''0 n;1>2.s(].jf( Vs| w/7ml:.w0LJJ8L-kǘpށ@}wo(V XI0$? \V ۩̀-8Gj~sw?|gt*yk+o;|:"QD5Q?xQ/3VwslufN{flm&G/?Vjϧ7;;hwÃ%^I>זK_bӖhΩi}'o)m%rgm'(oY6ϻ @MD-ZvBxĔޫMŝĒId8t;t57ڋnsRLHeobOb.^_>ARΝ:C)(*=#U$v.{ToN8aOn`H#fH%T!o~sS+3[zRmD&OX*%Tʘm8/z{Tdt>^̸nY{gZ+s@`l֙G- UF.4id2F9l^\4R=Mn!T[ߤ|-Zj5n[Bvvߩ>7M]s>O)Eis`kJј8q$n_鴄7ZaD[N,fcn=%+V\6킁I4l9lj~ԛbޝ&6d xW3J#C 8xMN?FD`pauVw oãTQ}Boc/Ty@"[i ,rzau,ܹw.Θ^97+<&,#`\`5N`h„ T\ZLpjXmGeTN/.VgӮ@3bv]#t`er kM~FR^ŸҒR2;Q]7c+aGF^DZe|+6 :ε-41DV9B?diSgj4(990zR'^+]!003A NYYYVKNZpG)h5Z2 [e '>d28OC,\$J)--N{ ѵg{xǰXdkaaNh^_z 98$LXE-4:B5w;K< NTz tXƚLqڇxM0E H$21l սk;&[ -r "5FC/ ́ 'h+fBgEdG*AW_aox(>QOB*,Ğ bCTў`d `f}A * OZFۖb[Κ“22ď`X-ya3 %Cx Jk!"m yxx܈JJJBdd$kBqab3cc1 7qhqCň]33Srxϐ1шcX8φaͰQʒB,\DϺ"~"zTXtSoftwarex+//.NN,H/J6XS\IENDB`qmpdclient-1.2.2/icons/oxygen/go-jump.png000066400000000000000000000013361157363675200204060ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<[IDATxkQgmMK<jMӓJ]JڒS\x/xA$)ZI/zSE XȥAֆ7lXB !fv?̼Dz}o ,/`Bď_~i\k5 ?V*{٬GfPO #z CgC'G>/..躀rl[!bFc@bbg|/ng@WL}lѹe\c^ć,1P Ѳ"Y%];p=BfW"ȘR0{Б`0ǘXQ drjnIXƷD4zu Q*_hmo~{ss y6=9qwS: /LnzX{7@+J}`| 4t:icc=jg= |6?ҵûa?" t8<577%]3avn׋pMSSxQs. 8 q€=q3E{P-(fHОaۓ+pOz+=iD8IENDB`qmpdclient-1.2.2/icons/oxygen/iconset.conf000066400000000000000000000027341157363675200206400ustar00rootroot00000000000000[Iconset] Name="Oxygen-ne" Author="Oxygen team" License="See icon subfolder 'COPYING' files." Description="New default iconset for qmpdclient-ne. Based on Oxygen icons from KDE4" [Icons] enqueue=list-add.png information=dialog-information.png prev=media-skip-backward.png play=media-playback-start.png pause=media-playback-pause.png stop=media-playback-stop.png next=media-skip-forward.png volume=player-volume.png time=player-time.png connect=network-connect.png disconnect=network-disconnect.png rescan=view-refresh.png preferences=configure.png quit=application-exit.png playlist=view-media-playlist.png library=folder-sound.png directories=view-list-tree.png radio=x-media-podcast.png playlists=view-media-playlist.png clearline=edit-clear.png random=roll.png repeat=task-recurring.png dynamicon=games-solve.png jumpto=go-jump.png queue=list-add.png dequeue=list-remove.png shuffle=roll.png saveas=document-save-as.png remove=list-remove.png crop=edit-cut.png clear=edit-clear.png delete=list-remove.png server=network-server.png lookandfeel=fill-color.png icons=preferences-desktop-icons.png styles=preferences-desktop-theme.png language=preferences-desktop-locale.png dynamicplaylist=games-solve.png notifications=preferences-desktop-notification.png shortcuts=preferences-desktop-keyboard.png tagguesser=feed-subscribe.png coverart=games-config-background.png newstation=list-add.png deletestation=list-remove.png addradiodialog=x-media-podcast.png metainfodialog=dialog-information.png qmpdclient-1.2.2/icons/oxygen/list-add.png000066400000000000000000000027171157363675200205350ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<LIDATxŗoTEǿ3sΞni @C1B "D0i|21ÓȋP#ojOK !BjD@)KK={ficbҘf93ngW03wok~lhֿ #h˭{z `Cbmz[k u=wK{S@N>)M{>ա~V)'I^a\kA퇘ęط-LaTiwIF3+/W153 E(<]2#5!$!uVG16@ !BGXcYd`,ji֞j bD:^MyN\69wAdCJHw81!2Ơv9b ul{<_uF56ڞNE_Ti=mA[$lʹ8wMXؘ%@D^ck(pW564֞hGoFwmׁ`.Au\ܓ5 r,?!$p{GQP҃'{g !܉nύw#zڻ0T-4 QJJ7(Y 'LJXLx"2XQ:4yLvrƦ02uEQNVpH̲Dm0xúz̕1} gGF0md|T[k8 $K+A8dTV0 10o J(2Vv@RYf ^ ?Ll>I2,]G D"hÓ!h"DS@W.N.-Aw .@9 A$H('܇5H-rkea;Q73L9)[cUe1edu~qBkx1P +)^ {zVT3 !%B.j!%=@YyK B&cY, 0@M`;SU\kC}%@{DxNڹDвNg|M2 G*Jr$ ;#RMH&bb|Lh@)p3 TJXF+E( 8P2JR1 (DF+F! , k<)D q*VPĮ,fdz^FAEQKڴU)@=1B.Rgނk3nRDVނF8K6@)-Ȗ"C"ivB.sѱH3xݙy3e,h0D~~st8H/CNֹg޺+ĵ` ăB͛'Ol. X_ǻׯCNMRB7braA47qPښ|v4ɽwt<ܹcW^|Ul4>?\yp =GN"!MT2S{Ur?GBժU[|)pAvv֓ahB2`p~ cX;;?Ϥ1eeBZWZZ>^YQ숧#'L S~cxR"`ǾV6/ ZK(‡׮ybYT9A*5r5~Z#%Oӧ<2Ge174 ;\fM?G V~ vozpnŽo/j͌<74X% $%Ѥb0Jk5 =زKȐZYI%mI"4`E~=BFEB&) `,cX'ߝ"zTXtSoftwarex+//.NN,H/J6XS\IENDB`qmpdclient-1.2.2/icons/oxygen/media-playback-pause.png000066400000000000000000000021711157363675200230040ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx}Oh\Ud&3ɤd`R n:ͪ ,.#S•VE7P]! )08ҙLf&pGr>o|{@}' rN>#+^'HN  Ӝ.⁄ 9 %i2fZKX.TSZlPB!PTg^Ѡܲ;FcኯthpA )a_Ya"9uwj}Š(9]qBWJ6MFD#cl W}Uy\(%#8!^إC[ ~f%Yv?jANj-WgXB\ w O(Q[-6(GgH?f5;Rq^>L@:-h1IEH 2UPsn1F>lxgSyV_OK׳`v<Х{,!ğHK%O0;9 nqy O!-Iz:qY"ߥŎM6 #!+(RӉ0MyxtM ;F'`D)LQG$0*ŕEIFcun2N4: DDEl@70;-V cS I 0d@ncKyDn? /l%aqɮ=Sj 9 zǼUSVp))HȈ>`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`qmpdclient-1.2.2/icons/oxygen/media-playback-stop.png000066400000000000000000000022151157363675200226530ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATx}UMh\U}o^2Q30VAu#DmV]_wB\2D Qq+2VE7PB6J)d潙KB8̽sw5;eFb'[JS  >r7>`*] #'  JaX5+KӐo#>,P ^7ñW%2gݝ">&]k! !܆u~60WBvC]+ߘ l '2*e9ҐoVP:gjPE?`[b̉u7p(V qL:y+x);Y4@/ᘟyOQŧYCGe,J`-=)(JY/浊M7E!?cT1f+T{7wƼd:BV"O*Glݞ 3ƅ-`)Ƙx2"<#gkJ اYO"UκJk0sv9?[܆D5ݥc$pl̪"?#C'^Őf8ZE ׫暡P%ǀu  x ! +3(hs\u,B?WA[/(Ӕtx}Vz)_09[O?fخzJ(=+ݔTt" SjA3V606#>; ^%WM} ?O_^*"ҙZ|L3ϧno*-dm-,ːlX%M0A3M d(ZPW\#TE{##jLHcS÷0X(n)j*5j`,5>DxpxBXv.â,ʐyO#U %^z^6Bgx]=!2ub'[8{~aQ }$*,+v—R&Ox\Uꇗ˨^8q=$),%q!C ?K` IENDB`qmpdclient-1.2.2/icons/oxygen/media-skip-backward.png000066400000000000000000000022731157363675200226300ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<:IDATx}Mh\UsgI&V%cAA(1k A.KTCPDKVOm]dE7 he*Ad{>_p&|sr3:㝜v1HY@UkM:`lKHШ`"ocŘ6MZ$x8C79ՙr588`_pBUT(ZոBU^fnyj6+-2>ɇkg-J<ǖt" b%O̴F/ٺP5d<.6h0JE@dx)H4 qp/l]Zg@j1j|{YtܭYݗZ:ȦP?qExDhd`M4dv\D7EbA+۝I00VED;4T~Qߩ*ގL8Y_Nؑ`\8~:MAqT ,I/z|_Y^dmQOIȇ 27i!'0Z\a?T}I3)3Yp6J&C:P4: 7yzE^&&X ҼRv"21G zCc<Ģ92fOW[ t7 MkTy.幏MX]ne-}R'nU2̙74鼭{w\"'$ $MzWTuɿLnh{T-;x B'!EY}٩]o u4^iWrXLgXG/t\,Ňa+sq\Sb%4_N6MJLHiKKɴr]r{/g~ f^vr+(HDN9Ub;%;eN$'eڴtoQA)"tXP0[DQ@+HyX#m.)7ps";,( .Ⱒ|Y-t4)a5~B(T:U Qporux+Iԋ'𴕸IQć[P'\mAy]FrUzUAw}\'K">;Avg߭0K"Ed0+tP*զ|/3@.7^R99\NMjS uHhYWrX?YCqpk:yFj),F##ބ# <<0ڎ gpaPHa`B}nвj6)wXu_fWIENDB`qmpdclient-1.2.2/icons/oxygen/network-connect.png000066400000000000000000000032171157363675200221500ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATxWYLUW=NiSQR9Imbگw~%6VA)NLB@Pʤ8(ݵN^o.$&} s;{g%"O/L r{*6nAhhh[zzhHHH*|.^jշnnnSF`ӦMWYY)W^K.ipEczuuGk>>>G===W̙3gjlٲ .˗Fjkkƍ:>> CgΜR___)K ݻFRUU%Xےϟ?/ׯ_k׮NWv[n޼i Jww0$u-Joss)!u{irܹs nyccNHHOOsݻw7 ^ CŋFMMMԄSzk׮Z(]߽{ qGGIИ>|H р͛1Fmmm4h,=XzzjjڵkgL=m۶Hpdd /H`ID:{ӧ%11qMӡr$qqqHлN644İk0d$##É~R)Q|޽{ƣ(Y ~0"yff)iR"`"(nF#$Aexx -gsԩSQ?O0BΝ;=D ]VVuSBϳu```dNCz;lb.X!DIg2J$r3;vũY*Je_>KJJ@ϭ4@\Yb޿.**"18{2t\P*OV\WXX8’b[%h¢A6 $VN gt9s,ϙ=$0RIrrDDD .`4"T j̈́oF[ o/ S'k'oAnR< srRuVx^'wYέm%ڑuuuӤJgi nq¾Ɍ Ԫ3(#ղ0֕"|5Ɨ "*$4TGtRNS  !#$%&'()))+,1233448:?ABDEEIMNOPUWX___dory{|}Oa+IDAT8c`ʧ) |$S@֎]`[*0s*04g#Mh=6 T]p֙wZ=sw cOtM[nuU3vwymjS6m;|_tƯضq WM^C.\~`ĥjӁ8T[oE+,|ժVG@靻h-K0\wy߼[7bo.>wҾꝱSieSf^4FNEihXפjKYEik20xWMq¦_͝ 0 7ǞRX9D%UT%D9XL"JZzfV6vV&F:Z\ ao>IENDB`qmpdclient-1.2.2/icons/oxygen/network-server.png000066400000000000000000000020401157363675200220160ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsuultEXtSoftwarewww.inkscape.org<IDATxڵUOGfo(8`'@r9sPQ'CzFBB=J=[D: IKpwٝ'6ڬvӌgggy{oR !iV&/K(Jr/pm8C6pNL8oy =F&,E2CbjttK}~xq"Dd. @àG0m;]1! jj, KL$ Ams;}4M6^Q{pzzT* {O>Eu^R զir/,6]qgacOqg8 'N = 0o>/,=z@{+efffs=q)1 ی wQ"م{Tlmmwwqcddd011J|>o+!jJo4=T_Wnެ|¹8WaW?~dSSS?X\\_(FL"RڂGiH ۶[@Xkcc+50777}`s^ÏK Fv ?s7+s}~{E?~\ٰa5xҥK>{f͍6>377Ν;H`ӦM}MFHHRSSQYQEA~JPCɸp2o޼X!2kۑ-""4ƵGٰ{o>߈݋pTU u^x8DGGr@"""Ϟ=CB|fQ߈wl>}צzB4͛7Wƍ7fС2ek++f!?/_5!;svr28+O<ΰRvnw())Aks+ݻ6- 5t8v^4i҇ѣG?ɓ_z^ 0YFP~u wUgDܾ 3g/zp}ضͰgQN'-[,X 0k׮9r1UeO"C"'#Uee*/G(?/elbBGE!zKqJaCL2}EVc5Hh4EH$0ɚJoo@dd"IǏj7_%/+ yy{D]X+1h?x!e().AmM-$MCƛ ܺy驩JmUPK33{I]/egFE˗kiT ֖VH]1c|xb$% V rrP/ -_vphDx|tޫjbQwT_- P+ãTנcJ7 0m4ṂHEST9bJtP'Ib֮Ega)LNjn|!%D4z|} BKrUAe(dQ#2ӡ]qVK&d]]ү];;JL zG%X9ӛ"o7AzK33R m,--~#<,b@E}=JРg ޽oq ~s0J/i=DZ/vr /Ν;`\ nlhGa3|8mn{[[j(oP|2A jKsxM%ֶW^}59sfSq(/}ᄌ?".޿?XEoccJ]]]Ԥ)aI'<ٿ;6Tz3._R $ ^nfKX(8vJ9# ]tR+ziiiQ iGq #F;w..}'Yvb "؀;VD Ex'TUH$,ŀmNg2il ~{ =_\zLrssTmŦ"/)&zl L&t{>|8бQ~b0tfΐB<ĭ[BVyƯ999:Ғ8V<6+˘󨫫,|>rGة5<GZ qIDcQFld 튉H8_W._Amm1z\M4 彗u###xqTWWq#;'h !L4 FGzTg_KU`IԳ.299f҂5űhR@$ #σ066v\pCCC/% z.1>i0*B~/<=Xѽ9dhpP/iP+^Y(")Џ0QL0<bјULuzLs {nWi3ې |An\dշq8ѹI Sb \HRe基paTr&\vM;XoS39ӹ-$iA++3dIU7 &+TIrp/FkjjLVEOӳ4:";77 IO .,,,s[oHii(~ȹΝ;Ai;Ԕ\Q_RRšp! {ǻ@B™pɸ9 BIdK* p=ΚƗEEE|L'&D-|<;!AJTJZ*\au7\k_ŔO4{mHeۼZpHLd*5C,y%km[:L/]E w׌;IENDB`qmpdclient-1.2.2/icons/oxygen/preferences-desktop-icons.png000066400000000000000000000044711157363675200241140ustar00rootroot00000000000000PNG  IHDR szz pHYs'_'_jtIME + bKGDIDATxڵV PHjujیcZFRZ$vQbPJ "JDDGx* )kE/a屼vjs˸Im7w9{YMMͦOչWVV,//YXXhf#H޵k״ӧOo'~BOs c c1&55uuwOϳ.jBGG{z{ׇg(pE8ZQQG&m^y_ 3Ǯ݂m $ET*:;;A"X$ 9V;TZZ%<''猚TUHNA+.BJ UUUL$R1<<hPhjEgG'h3L.ԔEo|"LirA+ W A appoj MASeN\.&/nd޼y&L,**!nJ!2hRAG$ &cb@mu-墼 ---jBDɃRr1 ӡ ) hiQPPBtYL،}Çj҈ȡ5wnDN`Ar*L"}Rf6D||YYY%i%@WGk?kEFFI&rB"Y)=ybw 9297VBE C{nJ.; N/G]f=5M( qŋ 7/ۜ#apdu؃vs>Bny `Af{<]4~( H5cd!Q9׮]"$_.8T `o"[` 2&O4Ϗ#m8ːr8Ξ2JQf=rȟE^|[|X3X[-Z걕̳1[m 剣!-44NB@@ P0={c͛{]`+ j`4ux7YO~ipjkkRٳg`ٲeigW켚2:~wuK˒9qMMMndɒ1TU|NydDWWW8:Ξ= wkqOL,ޫi<ѦgΜiJ~^VVjuO k˙e ~LlM3-MyB¥#S􂌌 )N!arE 8qX ħ!1.]!QG=?",,^ >>>tmHM6yavO~,rn)Mŧыq}؏ȁ Pѿ^n8{ht򋜑{gf~ϝPx_ wq6lﰟH)̩Ѝ囶4dyΠz^CPPP9"GXDžk 3ĉM^zl7Ĉl"y_\&X`4 ;ϭYƕ~ o^;>2c,Z{$B;9Ggaa70FIENDB`qmpdclient-1.2.2/icons/oxygen/preferences-desktop-keyboard.png000066400000000000000000000015131157363675200245730ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxjA[]=c~ dBЅ Ņ ݹP}'.ABnŀ ѬDILOwyL Poj5~*TNg7ITѡ#Vz$ 7nDl斦'bKN8<92Z7)CíFb[Ih匑 5R:fS{0%F*zT0.K,FgsW\B O͓pc1DA_mLm jWPZǀe&1)mgOŐ^iL mҶeK6lnk0Aj\DOUUMNS1HZؠ)w}f Nު4CR|H.~k#t'8t&Xק[ү?:9%Կ,ܞQx|a#?\OxM&} (yT4\iO O)9NK @ *-0ѵbFgUb+7+,MY!q[Noyڳ*o"GhcfA+.+f9Aa3:g%d8TLјkijtׁrr8G]!N }P꓅1YVHnk{%w% F7MYe"7sǀn$蟛IENDB`qmpdclient-1.2.2/icons/oxygen/preferences-desktop-locale.png000066400000000000000000000046121157363675200242350ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATx]\e9ggvwvwn?ݖXJP #1 A11z ^DILxgo4x` RtݏNgg{Μwg \/'OΌ0q>{W]-Iۿ*%yzs&-R㩔3JzńzSJyhʼn0jNK,@}P@7 whYוԕvN2_7&LH3I7[gdBF}8ZGq̕2dR\:1$Lqۂ?eZ:1cD` œv q!?m)J#m%Z nϑ8"!i~ZXE>qEH%=ǞRHH:|: ;m>IІ|.] ),!hCFx,^z+ak*wI9u6;,ձFqy@0WaS: |vg;8Rذ[_tR999b'X|ޭ,z=X⡻rp2^!tDSsLŌ(lC  uBv֐,n2INeX$01($7mZ_^嵳K,W\y1Վd4A=ޙjuAJbXH";A5R`L@kmlaZCp8,n: ?~iѡ4[G3yp\++ ^n(%*ZĴ>K#&$#!v~yXdqT sovki(_} iE!0gb.y̐ N-S`""6% $E"3*K!- -7H꘷^?+dRuC y`/ndJ Eg= 9Vi1qp!$DbXiԆfu*c(*_ƋK<.ϟ_o/'c|Ñ=L g#A`0EިyUR--4Roo/m0ƋT>k7̥О˾.'uW߼bM#l0mԮr+6qVN!z{V!ů 0W )^9u.~ꢻZ5ӫwM1^1ݡlbdR}>5 D_GjQtVj BZRa iZX\]̞}c^5Ž1f5 ò ?!xQO]SX֮,uuՍL:kR dU kam~umbuҙʕT/:%ZQ8:iQVH:tf;.m9c06b-ʖ`l}ܲgAv:(JM!lhvvm zKhu(͆G/_$G|ɿU~kIENDB`qmpdclient-1.2.2/icons/oxygen/preferences-desktop-notification.png000066400000000000000000000040021157363675200254550ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڝWkl\Gf޻{cNMPhSHxD!UAI(*$$ U!H%D?h*j/@ICJ DДR uowݽ{<7M\wsΙ\!=m;suޑ˦z2T=<_)_//\Y:=1?_m`EoC}oAlk BA(  *JPGantv|{v>z*M G4dڃР+';顃?u`hhiBZ=4Y*gXBE-̼&΍a|ə#gV0$ڡ+usDA ؼ~%_@hT@Ja,&'&pg ťV_vK@A#7ӽCtbrBὩ>i85/Ř'U濗ˮBgx MhBRn~L-J׬~ &L[RCqj 4fX75g8΋D4 zǮM]6krVQy*Өx!zVcKf.Z z=Imgֽ,ÑBmQ4'V< V4ZU߿  nPW^ϥʓq2w<ظ8*%J"`KGH,|q87ۮ_Ja,/V$Jo A.{+&xix;$\#:nǚM@`TV>c=`m}`vȟξ HR^/+ oUTl wO? ̜xC(5}`"pHe̪S\:^O_LȶmNJrDV2VzڌLHGC%pkUV{٫O Ҙ:u*|Gfd''X!oR ܮ &'kNxRN:( o0B ԫ后nԂ=,a!';EfEe咢l1Z$"*[Pꐸ4 M8?_iFIENDB`qmpdclient-1.2.2/icons/oxygen/preferences-desktop-theme.png000066400000000000000000000020661157363675200241010ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs^tIME  _5\IDATxݗOL#UǿoM m.c&Qlj1&d/!N\Bgcԋћ'oȁDHH떺AŦN?닓6zK^߼~fY[[%x˜._p eR. &\4-r>".,,n?!=~{"0n~? j"g'ydݬY={whtx{Ef`p\mBhsJLMAI%P^Ykv#?\n9K ü~* "ce꼀v;"π"8mBaVS\aTĭ[~8 D0p!cXMȣx<,~'Lha,NH$022ҁP#xy2e T%eGz;`rrfm A)\HH8 u-^ێ?t5677 أP(|>BBo6663pppP(I`"Ӿ)0z@^G7lmmazzJzM)UՂ/R}i "~&I*mjjG3;3;2Ľf9s^hvY;Wk~;yloM0ROveV_"VYs/Αg'kgG݃2$H+ lcQ-4$xZ1Xʣ<:poQK5xJ' bKX1^"(kS+5is5]$ ʕN(2@І$Mu Ƨ\Dw\llq$F[\_cRωs Zcш>vs$R"nq9 z=VG8LKR0dD&r"_qlbFW{,:4G7yTm)LuVi"b9$BMعh7DŽ‹XGa$x 1.eE֩j[alDd`;o34"nx*m %%Dh 0À(Hv0F `Dp s8ȓ_("T8"?#(fY2NoJ):!O6ΠË&V>>g`d2$67_lWE 7HKC鲛NABY"#Z84ƛ=+Ffx"D1 bX[D_UsƿrUuٳ(~`ɼá`cm:S1jXX]WkF9)#N'tDXerDjbL! [(tl%{,VwiSӳQYԇH:V']Ηg qVGBb'IB+E-Uj4k>H#LIENDB`qmpdclient-1.2.2/icons/oxygen/task-recurring.png000066400000000000000000000042061157363675200217670ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŗ{Wǿy}߽w(`Dj"?4!&H4 b J4!XRbe7sg̜s;eY|ɽ}{~wNH)񿈀;m5|*o\[X\R\nKBػ7"?_5n dIg;/^^ѻNX0%Jc8<^>r=d^d;ݷ9k箽{5uM}eU>UJpqGJ'ؼn qĖnq} U j 9+6c_[`0$7:Ѕs-g&nun^яTq((1048(d s,vb^aJ2u-8Hծs%\K(Gw(\fѕB,11 l23WT!0I(vd7/OE-&mKN xK'XNʬ8PoQcC: 6:[0M] 9q <|@J22 ?Ly[ S =3b@d?n;/&t A^cwFj^N+qeFz'369005EpT9(`sdΫo9f$ h$FPlP zbӑr9}ЬjƍGP QU@҃FXr/G}8jء"hG6j$-H,nCa):D*qƢC;C"₰'@4fm( i,d>)ja2:NA M ^$5 6}Dm]?-x賔V G(6` F.0O6q,EvLyUNiW9Lnpld;n9*3+~%s{"wEng*iR~[NbD@Hj Hb< V(` hӸV)G8ԻVP #efXFB!\!!ՀZj+Ca`x$Tl_M<6)0JSCP)wilrs_7^l6PIl_mVZPՅf\$()BD,YAUbp 'RZ^ VvTiQr 1MҤ!n })@6a\\T\aBD\2I }0!ߩY>)'9 RF)Pc 둥!Q].ndnIEh.ڟ 9m .-| yL\Y ^/tl~#ƋSS#0B]3DKk`R M󯗤#ɧ790r23-)oq-: B2tAyVO,R|NQ`3 @v)I0JbE#M; &4a٘- KCŋ͈qʦiU{Pݮ[tuEnȃq6_;~NuhفBW#O''- sBXD"G=!`J*1t +}(JR~p39Rëן4ͧsl0?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`qmpdclient-1.2.2/icons/oxygen/view-refresh.png000066400000000000000000000042061157363675200214350ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŗ{Wǿy}߽w(`Dj"?4!&H4 b J4!XRbe7sg̜s;eY|ɽ}{~wNH)񿈀;m5|*o\[X\R\nKBػ7"?_5n dIg;/^^ѻNX0%Jc8<^>r=d^d;ݷ9k箽{5uM}eU>UJpqGJ'ؼn qĖnq} U j 9+6c_[`0$7:Ѕs-g&nun^яTq((1048(d s,vb^aJ2u-8Hծs%\K(Gw(\fѕB,11 l23WT!0I(vd7/OE-&mKN xK'XNʬ8PoQcC: 6:[0M] 9q <|@J22 ?Ly[ S =3b@d?n;/&t A^cwFj^N+qeFz'369005EpT9(`sdΫo9f$ h$FPlP zbӑr9}ЬjƍGP QU@҃FXr/G}8jء"hG6j$-H,nCa):D*qƢC;C"₰'@4fm( i,d>)ja2:NA M ^$5 6}Dm]?-x賔V G(6` F.0O6q,EvLyUNiW9Lnpld;n9*3+~%s{"wEng*iR~[NbD@Hj Hb< V(` hӸV)G8ԻVP #efXFB!\!!ՀZj+Ca`x$Tl_M<6)0JSCP)wilrs_7^l6PIl_mVZPՅf\$()BD,YAUbp 'RZ^ VvTiQr 1MҤ!n })@6a\\T\aBD\2I }0!ߩY>)'9 RF)Pc 둥!Q].ndnIEh.ڟ 9m .-| yL\Y ^/tl~#ƋSS#0B]3DKk`R M󯗤#ɧ790r23-)oq-: B2tAyVO,R|NQ`3 @v)I0JbE#M; &4a٘- KCŋ͈Fy! vyb"6uVǕc3rW(! G7@uM=̆gOs!AVH PS[-b07I{m<>G.tGJ|0 0okpNX`,'S&QO{=[𦓼\ֹӔ0}j]wk\U[Qϲsbf]y$vY1|UXkP@ P墳.qe ]xOk |  HRxo ‹u6uT(uFk|7DΙ @;|"?5@I6:dv|{.N.Rx} uV3g=A8 [|~og<0R "-t||fGX%>Hڨnej /o_9W6E@鎹0Nw~`qCr  S09tD `hZ0da(@BGR #'sAePVG;ギaqz&yziUm73 Bq(OIv_\54=.cЂ-w vQg--tu>*9EJ/`g3[q wx}ytڭD# )IENDB`qmpdclient-1.2.2/icons/play.png000066400000000000000000000011061157363675200164570ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME )T=}ϭh*&!D~fC{)5c= Q;ϐn>'n81Yx7pI2|'#SPPǷA2ƞ "   &!l<};vtT>~3p0)ʘ0s ~yyݟ1*G"*~}~̺koN.k*|94e3jPTvyՀ\ 3yK9884";^d z3WQ.۩t^}G&N'jjԉv[ Ѻ%NrYC[R׆IDZe,~N%n߸TφO*B 8=1YQbo[=y[lh8;i7d[IENDB`qmpdclient-1.2.2/icons/qmpdclient.icns000066400000000000000000000620101157363675200200230ustar00rootroot00000000000000icnsdics#H??p??pis32-Ҕssֆlhgm ~j-'i c d b0DE(cɃ e56f f34f c\>?Sc a_bb 2$ov&::tqi/ czydp %ncbb"xSf,ZPż '## :1ʃ f0z~o ._b4 'F\^* LypsiS Ȳyl܂ ZijiU yފ޷ BndzE>n^O6D''v yZZ 5= A- h %v / A hSσ t |a%r "u 10, [UU5X}mK~s8mk ؋!:µeGGe<*~9Ə8-7ߘ5,434۫30 =rv: d58`} "z~cn,.kc+,FZ^B,+̼XUUQ\c.^KICN#??pp88=yy9?<>??pp88=yy9?<>il32cAc[^cBIOgPIEfg\[gfF LegfR_?_RfgcO\gbONdg[WggHKggWZg]u^gYaggWVgg`dgg^`ggc\geUUgg`WgZGS^gYRgSUgSRgQQgRTgVXgTYg_VVcgX_ggYZgg\cgg^]gg_ZfgTUg_fTge__fgTPgg^^geUUggWWggS [ggZWd`XZggYZgT?iN[gO)@_RggQYgbZy]g]}ZSS58xz s򧺱 ֪/D3(% c1URw\ߪbqǺ OƎRƃj܌Y=$݇ڇه෇ߋωϋɉ̋ֈBыڇ݋އ҇ ԍ꺃Ս[ٖΏ gVѦ?ÿuə3=΅l8mknطr $iDNiHIzyw{Uasochu ,uP>7S EQ(6? T\~w_T9qw<L"Q\&L''4*037:Օ9=;8G>*=^e@*M$)MhCfn)-z36Eċ$M. %sc$PKit32  $8HRY_fd^YRG7#%Dag`B#>cgb;  KgIg` dg0 fge%gaHg0>g9 g\cgb:g'5g,bgX`gY)g /gNgS]gAfg&3g`(gegKgLYg>bg(7gV gfgf"gO\g8g- =g*Ng'g@aggT g`ge gN\g7g=Jg( Dg)8g6Jg$g<Pg gB VggH \g gNbgfgUgbg[g]gagXegf gR`ggQ^g gVcgg[gfg`gbdgeg]^g gYXggTRggPLggE  Fg"1g5 >g5 Dg$)gH VggZegegf gbUg gTAg%4g>+gCQg gbgfg+gVUgANg:5g`fgg(geZgCSgC7gf g gHTgXKg"g.gNYgeZg)gB"g\ agdTgPXg4g@Kg^Jg.8g'`g-2gU#g?Ega JgV ZgfTgd(+eg3^ga;=bgJeg R+  ,\gQagaPUfgF_g= Xg9>gZ`gf84dgU5`g',IegR5IYg;  bg"gb 7gWNgB]g*ege-g[DgJWg0 bgf!g^9gOPg8^gQL   BdcA C{x@  qk   md ,! \Myx s\C)*D]t~_  am  d3 7L  ;U\&#  +   w  R9    r "X ,  C X ph  iG aQ K; V/ u D ^I- p Jc  > " eSnM+Gt # < cnIzL eb&Cm-x #          )9|~>Y` pa{CJ $"  ; uD_qNz ;#  2O  u i ` 4-Ix yd2)  # >U 3 / Kv  ?  _.uU fH  T [ @s }3 J  N] k o " M/ 0O #~ ogq/7f  _  aG P,al %53(?  9 ey L  '!  R |Y ,  =  if 8 *   (Z˱Y' ]X  &   >-~k      Ѝ ~^9;_  FLNJiRs4 1=  Ĉ Ĉ rʈM   0z!>] x    bo   gQvA†  ]e &> ݆f-V.sh;c0R +eh 5]Ɔ>Ն0 #   #)    چ +ˆ9(NV{ ]gԆ2,  ҆*Q^ jȆR0E l ӆ†I(>e߆ φ" E9 ц 0 VtG  ܆AhV ! χ  ۇ@    sct  }X    "  +ވG щek% + / kA "Dm 1 ( ڣ  B  L  * bo >  %3IE7'&WO!   ‡ i6-q   ؇{ "=U  ƇN:t8mk@ 4\Ŵc; Uaב1 ]n& Jf*@结kD4& '4Elne!$h BF(x z4/X]O9jl[;Y/(,S 5cÌa4 :ijeq%5G?;{,U238$/%*cs!'.6?E5Noe<+qkD0146ݫdF")Ge? 261vuxgO3t"cxV$Ec!7;OQzgbuK-- ^r:<2H& #1?}|ZNbo #u x>TqM\qH'x6I .$E #`?$5r6 Ij! ? * 7];8|mH|oICe'IF<H /"!0ѳ5' fg Z *[7=#D>6W_d*o@+(=( 0 `:[`ihjPsaQB]yb@)oy]BZ #YATwLoT= [d% {Ki< *=l#?+5crP /DHXvL./My/B2%])z $!0$ x Q %2?QMB4"d/Gw<2eJ!K[qmpdclient-1.2.2/icons/qmpdclient.ico000066400000000000000000000021761157363675200176500ustar00rootroot00000000000000 h(  K6MҙU`5KƐPwW0q>.G^\ɓQ mO,[B% I\ߢZ\_`FcU>" IX^םWIUHU֜V]걁GQp |Z2rS.ߢZڠXnP,i:j:pQ-۠XݡYhL*uU/+,~FF^JZ_bK^^|EB,+cĐOn]n=,p>s?p>.]ÏOkc̕R\`5\3^4a6]˔R~˕R}\b6 _5b6d7"]ʔRzNd]u@5zD~EwB8^ᅨM` l;=^Nr  %ÎOv^i:: , 4ٞW\ٗn=3n=4\؞W 30l<7[\ϗSϗS\[Ғj;5*~xX09ԚU[[ԚUxW08-:e G Ge< !qmpdclient-1.2.2/icons/reload.png000066400000000000000000000013631157363675200167650ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME wtQIDAT8˝_HSqϚ;m隳U2QVTR 3 1*L^|cDaC(`TJNf!mn{篗a+&1k `[fj}S'p(ZOQNϴ||?1=\/DeO"_[;C!4)6u%">XY{  wHEylPqRhsK9X@Yǰ(CM}ߺ_~)Sc1 01nQ[[Z<=JׁD _/Qft8BO~KǕN՗Ԋ^O!ľ ng+'7hU3ۆG]'\\Y^wE :<զNJJc)O;ǂkI?@#3\ RήlvsL,մO-b1H  /"mLkajVSN7 X S+ . %^ 7ߗГGz image/svg+xml Q qmpdclient-1.2.2/icons/svg/qmpdclient_not-connected.svg000066400000000000000000000233321157363675200233110ustar00rootroot00000000000000 image/svg+xml Q qmpdclient-1.2.2/icons/volume.png000066400000000000000000000007471157363675200170330ustar00rootroot00000000000000PNG  IHDRabKGD pHYsGltIME 1ktIDAT8c` 0gktA%:%KD`````!R#a^TFEg/?2g#ch<\K~Ao20000|,FaE ʆo~30y .v 630;s2s3ETbŸ#ʀc Fؙ~Ņ9!a,mɃՀw xtdߣ#`\֗*-B u1uYLx\SMcL.m;#AA y0X/_1r~mtG~(3(335c wP 2If/wIENDB`qmpdclient-1.2.2/lang/000077500000000000000000000000001157363675200146145ustar00rootroot00000000000000qmpdclient-1.2.2/lang/cs_CZ.ts000066400000000000000000002053521157363675200161740ustar00rootroot00000000000000 AboutDialog About QMPDClient O 'QMPDClient' &About O &aplikaci A&uthors A&utoři &Thanks to &Poděkování &License agreement &Licenční ujednání &OK &OK AbstractView Not connected Nepřipojeno AddRadioDialog New radio station Nová stanice rádia Title: Název: URL: URL: &OK &OK &Cancel Z&rušit ControlPanel Seek forward Vpřed Seek backward Zpět Increase volume Zvýšit hlasitost Decrease volume Snížit hlasitost Not connected qmpdclient is not connected to MPD Nepřipojeno Skip to previous song Přeskočit na předchozí skladbu Ctrl+PgUp Ctrl+PgUp Play Spustit Ctrl+Ins Ctrl+Ins Pause Pozastavit Ctrl+Home Ctrl+Home Stop Zastavit Ctrl+End Ctrl+End Skip to next song Přeskočit na další skladbu Ctrl+PgDown Ctrl+PgDown Lyrics Text písně DirectoryPanel &Filter: Filter directory contents &Filtr: DirectoryView &Enqueue &Zařadit do fronty &Information... &Informace... &Rescan directory &Znovu prohledat adresář &Play &Spustit JumpToSongDialog Jump to song Skočit na skladbu &Filter: &Filtr: &Jump &Skočit &Cancel &Zrušit LastFmSubmitter Will scrobble this track. Proběhně odeslání této skladby. Scrobbling %1 songs... Posílá se %1 skladeb... Last.Fm authentication failed: check your credentials Last.Fm autentizace selhala: zkontrolujte své přihlašovací údaje Cannot submit to Last.Fm: system clock is skewed Nelze odeslat do Last.Fm: systémové hodiny jsou zkresleny Successfully scrobbled Úspěšně odesláno Now Playing sent Právě hraná skladba odeslána Last.Fm error: %1 Last.Fm chyba: %1 LibraryPanel &Artist filter: Filtr &umělce: Al&bum filter: Filtr &alba: Son&g filter: Filtr &skladby: LineEdit Clear the filter Vyčistit filtr LyricsDialog Getting lyrics from server... Stahování textu ze serveru... Dialog Dialog Artist Umělec Title Název Search Hledat MPDCache Reading albums Čtení alb Reading songs Čtení skladeb Filtering songs Filtrování skladeb Caching songs Ukládání skladeb do vyrovnávací paměti MPDConnection Could not connect to server Nepodařilo se připojit na server Could not connect to server %1:%2 Nepodařilo se připojit na server %1:%2 Authentication failed Autentizace selhala MPDSongView &Enqueue &Zařadit do fronty &Information... &Informace... &Play &Spustit MainWindow &Playlist &Seznam skladeb &Library &Knihovna &Directories &Adresáře &Internet Radio &Internetové rádio Pla&ylists &Seznamy skladeb &Shoutcast Directory S&houtcast adresář Minimize to tray Minimalizovat do systémové lišty Error Chyba Connect to first server Připojit k prvnímu serveru Ctrl+C Ctrl+C Library: %1, %2, %3. (%4 %5 %6 ) Knihovna: %1, %2, %3. (%4 %5 %6 ) %n artists %n umělec %n umělci %n umělců %n albums %n album %n alba %n alb %n songs %n skladba %n skladby %n skladeb %n days %n den %n dny %n dnů %n hours %n hodina %n hodiny %n hodin %n minutes %n minuta %n minuty %n minut %n days, %n den, %n dny, %n dnů, %n hours, %n hodina, %n hodiny, %n hodin, %n minutes, %n minuta, %n minuty, %n minut, %n seconds. %n vteřina. %n vteřiny. %n vteřin. Library: %1 %2, %3 %4, %5 %6. (%7 %8 %9 %10 %11 %12) Knihovna: %1 %2, %3 %4, %5 %6. (%7 %8 %9 %10 %11 %12) artists umělců albums alb songs skladeb days dnů hours hodin minutes minut Done Dokončeno Playlist: Seznam skladeb: %1 days, %1 dnů, %1 hours, %1 hodin, %1 minutes, %1 minut, %1 seconds. %1 vteřin. &MPD &MPD &Connect to... &Připojit k... &Help &Nápověda &About... O &aplikaci... About... O aplikaci... F1 F1 About &Qt... O &Qt... About Qt... O Qt... Shift+F1 Shift+F1 &Disconnect &Odpojit Disconnect from server Odpojit od serveru Ctrl+D Ctrl+D &Rescan library &Znovu prohledat knihovnu Rescan songs Znovu prohledat skladby Ctrl+R Ctrl+R L&ocate current song &Najít aktuální skladbu Locate current song in library... Najít aktuální skladbu v knihovně... Ctrl+O Ctrl+O &Preferences... &Nastavení... Show preferences dialog... Ukázat dialog s nastavením... Ctrl+P Ctrl+P &Quit &Ukončit Quit QMPDClient Ukončit QMPDClient Ctrl+Q Ctrl+Q MetaInfoDialog (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 z %2) File information Informace o souboru Track #: Číslo skladby: Artist: Umělec: Title: Název: Date: Datum: Length: Délka: URL: URL: Composer: Skladatel: Album: Album: Genre: Žánr: Disc: Disk: Comment: Komentář: Performer: Interpret: &Previous &Předchozí &Next &Další &OK &OK PlaylistPanel Toggle random mode Přepnout náhodný režim Toggle repeat playlist Přepnout opakování seznamu skladeb Toggle dynamic playlist Přepnout dynamický seznam skladeb Jump to song... Skočit na skladbu... Shuffle playlist Zamíchat seznam skladeb Save playlist... Uložit seznam skladeb... Remove selected songs from playlist Odstranit ze seznamu skladeb označené skladby Remove all but selected songs from playlist Odstranit ze seznamu skladeb vše kromě vybraných skladeb Remove all songs from playlist Odstranit ze seznamu skladeb všechny skladby PlaylistView &Crop playlist Oříznout &seznam skladeb &Information... &Informace... J&ump to song... S&kočit na skladbu... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+K Ra&ndom play &Náhodný režim &Remove &Odstranit Remove &all Odstranit &vše Re&peat play &Režim opakování &Save playlist... &Uložit seznam skladeb... S&huffle playlist &Zamíchat seznam skladeb Add to queue Přidat do fronty Q This is the shortcut for 'Add to queue' Q Focus playlist Zaměřit seznam skladeb Save playlist as... Uložit seznam skladeb jako... Playlist name: Název seznamu skladeb: Attention! Pozor! A playlist with that name already exists. Overwrite? Seznam skladeb s tímto jménem již existuje. Přepsat? A playlist with that name already exists. Please use another name: Seznam skladeb s tímto názvem již existuje. Použijte prosím jiný název: PlaylistsPanel Fil&ter: Filter the list of saved playlists Fil&tr: &Filter: Filter the contents of saved playlists &Filtr: Delete selected playlists Smazat vybrané seznamy skladeb D&elete playlists &Smazat seznam skladeb PlaylistsView &Delete &Smazat PreferencesDialog Default style Výchozí styl Use system locale Použít systémové nastavení lokalizace Connection Spojení Look and feel Vzhled a chování Library Knihovna Directories Adresáře Playlist Seznam skladeb Icons Ikony Cover art Obrázek alba Language Jazyk Dynamic playlist Dynamický seznam skladeb Notifications Upozornění Shortcuts Klávesové zkratky Tag guesser Hádání tagů Tray icon Ikona v systémové liště Last.Fm Last.Fm Title Název Date Datum Artist Umělec Composer Skladatel Album Album Filename Název souboru Track Skladba URL URL Genre Žánr Styles Styly bold tučně italic kurzíva Preferences Nastavení Servers Servery A&dd &Přídat De&lete &Smazat A&uto connect to first server on startup Při s&tartu automaticky připojit k prvnímu serveru Connection &timeout: Časový &limit spojení: seconds vteřin &Reconnect to MPD if connection is lost Z&novu připojit k MPD při ztrátě spojení S&econds between reconnect attempts: Počet &vteřin před pokusem o připojení: Cross&fade on song change &Prolínat při změně skladby Cro&ssfade for: &Doba prolínání: Output devices Výstupní zařízení Enabled Povoleno Name Název Double click / enter action Dvojklik / Enter akce &Play item &Přehrát položku &Enqueue item Zařadit do &fronty A&lternating row colors &Střídající se barva řádků A&uto resize columns &Automaticky změnit šířku sloupců Opa&que splitter resizing &Neprůhledná změna velikosti oddělovače Font: Písmo: C&hoose... &Vybrat... Filter songs by... Filtrovat skladby podle... selected &artist and album vybraného &umělce a alba selected al&bum only pouze vybraného &alba &Show 'All' and 'Not tagged' (Slow) &Ukazovat 'Vše' a 'Neotagováno' (pomalé) Disregard leading 'The ' when sorting Ignorovat počáteční 'The ' při řazení &Recursive directory view (Slow) &Rekurzivní adresářový pohled (pomalé) Title format Formát názvu Title &format: &Formát názvu: Center playing &song &Vystředit hrající skladbu Show album c&over art &Ukazovat obrázek alba &Path to MPD music root: &Cesta k hudební MPD kořenové složce: Max Height: Maximální výška: 1024 1024 Max Width: Maximální šířka: 768 768 &Fill up playlist with random songs &Naplnit seznam souborů náhodnými skladbami &When less than that songs left: &Pokud zbývá méně skladeb než: &Remove played songs from playlist &Odstranit přehrané skladby z seznamu skladeb Enable &translations &Povolit překlady &Enable notifications &Povolit upozornění &Notifier: &Upozorňovač: &Show for: &Zobrazit po dobu: Position Pozice Bottom-right Vpravo dole Desktop Plocha Right-middle Vpravo uprostřed Top-right Vpravo nahoře Bottom-middle Dole uprostřed Top-middle Nahoře uprostřed Left-middle Vlevo uprostřed Top-left Vlevo nahoře Bottom-left Vlevo dole &Enable tag guesser &Povolit hádání tagů &Guess pattern: &Vzor pro hádání: &Test filename: Název &testovacího souboru: %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Skupina/Umělec %a = Album %n = Číslo skladby %t = Název %i = Ignorovat část jména souboru Guess results Výsledek hádání Track: Skladba: Title: Název: Album: Album: Artist: Umělec: &Enable tray icon &Povolit ikonu v systémové liště Close button &minimizes to tray Zavírací tlačítko &minimalizuje do systémové lišty Start QMPDClient &hidden &Startovat QMPDClient schovaný Enable extended song info Povolit rozšířené informace o skladbě Submit played tracks to Last.Fm Odesílat hrané skladby do Last.Fm Username: Uživatelské jméno: Password Heslo Plain Prostý text MD5 MD5 Calculate MD5 Spočítat MD5 Timer Časovač Percent of song played: Procent skladby odehráno: &Close &Zavřít QObject No cover art found. Žádný obrázek alba nebyl nalezen. Directory This is used as the header of directory-tree in directory view Adresář Title Název Track Skladba Artist Umělec Album Album Length Délka URL URL Filename Název souboru Genre Žánr Date Datum Comment Komentář Disc Disk Composer Skladatel Performer Interpret Root This is the name of the root directory in the directory browser Kořenový adresář Playlist Seznam skladeb Stream Proud Name Název Address Adresa Port Port Password Heslo Action Akce Shortcut Zkratka Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Neotagováno All This is the first item in the artist and album views, meaning "All artists" or "All albums" Vše Not tagged Neotagováno RadioPanel &Filter: Filter radio stations &Filtr: Add new radio station... Přidat stanici rádia... &New radio station... &Nová stanice rádia... Delete selected radio stations Smazat vybrané stanice rádia D&elete radio stations &Smazat stanice rádia RadioView &New... &Nová... &Delete &Smazat ShoutcastModel Name Název Bitrate Datový tok Listeners Posluchačů Please wait... Čekejte prosím… bps bps Please wait Čekejte prosím ShoutcastView &Enqueue &Zařadit do fronty &Information... &Informace... &Play &Spustit StringListView &Enqueue &Zařadit do fronty &Information... &Informace... &Play &Spustit TimeSlider Streaming Přehrávání proudu TrayIcon Hide Schovat Show Ukázat Previuos Předchozí Play Spustit Pause Pozastavit Stop Zastavit Next Další Quit Ukončit Volume Hlasitost Not playing This is for the trayicon tooltip, indicating that no song is playing Zastaveno TraySongInfo Not playing Zastaveno from Means some song `from` some album z alba qmpdclient-1.2.2/lang/de_DE.ts000066400000000000000000001657711157363675200161450ustar00rootroot00000000000000 AboutDialog About QMPDClient Über QMPDClient &About Ü&ber A&uthors &Autoren &Thanks to &Dank an &License agreement &Lizenzabkommen &OK &OK AbstractView Not connected Nicht verbunden AddRadioDialog New radio station neues Webradio Title: Titel: URL: URL: &OK &OK &Cancel &Abbrechen ControlPanel Ctrl+Home Ctrl+Home Ctrl+End Ctrl+End Ctrl+PgUp Ctrl+PgUp Ctrl+Ins Ctrl+Ins Ctrl+PgDown Ctrl+PgDown Not connected qmpdclient is not connected to MPD Nicht verbunden Seek forward Suche Vorwärts Seek backward Suche rückwärts Increase volume Lautstärke erhöhen Decrease volume Lautstärke verringern Skip to previous song Zum vorherigen Titel springen Play Abspielen Pause Pause Stop Stopp Skip to next song Zum nächsten Titel springen Lyrics Lyrics DirectoryPanel &Filter: &Filter: &Filter: Filter directory contents &Filter: &Filter: DirectoryView &Enqueue &Einreihen &Play &Abspielen &Information... &Information... &Rescan directory Ve&rzeichnis neu laden JumpToSongDialog Jump to song Zu Titel springen &Jump &Springen &Cancel &Abbrechen &Filter: &Filter: LibraryPanel &Artist filter: &Künstler: Al&bum filter: &Album: Son&g filter: T&itel: LineEdit Clear the filter Filter löschen LyricsDialog Getting lyrics from server... Lade Lyrics vom Server ... Dialog Dialog Artist Künstler Title Titel Search Suche MPDCache Reading albums Lese Alben Filtering songs Filtere Einträge Reading songs Lese Einträge Caching songs Einträge werden zwischengespeichert MPDConnection Could not connect to server Verbindung zum Server nicht möglich Authentication failed Anmeldung fehlgeschlegen MPDSongView &Enqueue &Einreihen &Play &Abspielen &Information... &Information... MainWindow &Library &Bibliothek &Directories &Verzeichnisse &Help &Hilfe &About... &Über... About... Über... F1 F1 About &Qt... Über &Qt... About Qt... Über Qt... Shift+F1 Shift+F1 Ctrl+C Ctrl+C Library: %1 %2, %3 %4, %5 %6. (%7 %8 %9 %10 %11 %12) Bibliothek: %1 %2, %3 %4, %5 %6. (%7 %8 %9 %10 %11 %12) artists Künstler albums Alben songs Titel days Tage hours Stunden minutes Minuten &Disconnect &Trennen Ctrl+D Ctrl+D &Rescan library &Bibliothek neu einlesen &Preferences... &Einstellungen... Ctrl+P Ctrl+P &Quit &Beenden Quit QMPDClient QMPDClient beenden Ctrl+Q Ctrl+Q L&ocate current song aktuellen Titel l&okalisieren &Playlist Wiedergabe&liste Ctrl+R Ctrl+R Pla&ylists &Wiedergabelisten &Internet Radio Web&radio Error Fehler &Connect to... &Verbinden mit... &MPD &MPD Playlist: Playlist: %1 days, %1 Tag(e), %1 hours, %1 Stunde(n), %1 minutes, %1 Minute(n), %1 seconds. %1 Sekunde(n). Done Fertig Minimize to tray In Tray minimieren Disconnect from server Vom Server trennen Rescan songs Einträge neu lesen Show preferences dialog... Einstellungsdialog anzeigen... Connect to first server Zum ersten Server verbinden MetaInfoDialog &OK &OK File information Dateiinformationen &Previous &Vorheriger &Next &Nächster (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 von %2) Genre: Genre: Title: Titel: Track #: Track #: Artist: Künstler: Composer: Komponist: Length: Länge: URL: URL: Album: Album: Date: Datum: Disc: CD: Comment: Kommentar: Performer: Performer: PlaylistPanel Toggle random mode Zufallswiedergabe ein/aus Toggle repeat playlist Wiedergabeliste wiederholen ein/aus Jump to song... Springe zu Titel... Shuffle playlist Wiedergabeliste mischen Save playlist... Wiedergabeliste speichern... Remove selected songs from playlist markierte Einträge aus der Wiedergabeliste löschen Remove all but selected songs from playlist nicht markierte Einträge aus der Wiedergabeliste löschen Remove all songs from playlist alle Einträge aus der Wiedergabeliste löschen PlaylistView &Remove Entfe&rnen Remove &all &alle entfernen Save playlist as... Wiedergabeliste speichern als... Playlist name: Name der Wiedergabeliste: S&huffle playlist Wiedergabeliste misc&hen &Save playlist... Wiedergabeliste &speichern... &Crop playlist Wiedergabeliste abs&chneiden J&ump to song... Z&u Titel springen... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U Ra&ndom play &Zufällige Wiedergabe Re&peat play &Wiedergabe wiederholen &Information... &Information... A playlist with that name already exists. Please use another name: Eine Liste mit diesem Namen existiert bereits! Bite geben sie einen anderen Namen an: Add to queue in Liste einreihen Remove from queue aus Liste entfernen Focus playlist Wiedergabeliste auswählen Attention! Achtung! A playlist with that name already exists. Overwrite? Eine Playlist mit diesem Namen existiert bereits. Überschreiben? PlaylistsPanel Delete selected playlists ausgewählte Listen löschen D&elete playlists &Listen löschen Fil&ter: Listen fil&tern: &Filter: &Filter: Fil&ter: Filter the list of saved playlists Listen fil&tern: &Filter: Filter the contents of saved playlists &Filter: PlaylistsView &Delete &Löschen PreferencesDialog Connection Verbindung Look and feel Erscheinungsbild Tag guesser Tag-Vorschläge Tray icon Tray Icon Cross&fade on song change &Crossfade bei Titelwechsel C&hoose... Auswä&hlen... Double click action Aktion bei Doppelklick &Enable tag guesser Tag Vo&rschläge aktivieren %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Band/Künstler %a = Album %n = Tracknummer %t = Songtitel %i = Teil des Dateinamens ignorieren Guess results Ergebnisse erraten Track: Track: Title: Titel: Album: Album: Artist: Künstler: &Enable tray icon T&ray Icon aktivieren Close button &minimizes to tray Beenden &minimiert in Tray Start QMPDClient &hidden QMPDClient minimiert &starten Position Position Bottom-right Unten rechts Desktop Desktop Right-middle Mitte rechts Top-right Oben rechts Bottom-middle Unten Mitte Top-middle Oben Mitte Left-middle Mitte links Top-left Oben links Bottom-left Unten links bold Fett italic Kursiv Artist Künstler Album Album Track Track Title Titel Dynamic playlist Dyn. Wiedergabeliste Notifications Benachrichtigungen &Reconnect to MPD if connection is lost Bei Verbindungsabbruch erneut zu MPD ve&rbinden &Play item Eintrag &abspielen &Enqueue item Eintrag &einreihen &Enable notifications Benac&hrichtigungen aktivieren A&dd random songs to playlist &Zufällige Titelauswahl zur Wiedergabeliste hinzufügen &Remove played songs from playlist Abgespielte Titel aus Wiedergabeliste &löschen Preferences Einstellungen Font: Schriftart: &Guess pattern: &Muster erraten: &Test filename: &Dateiname testen: &When playing song (from end): &Bei Wiedergabe eines Titels (vom Ende): &Number of songs to add: A&nzahl hinzuzufügender Titel: seconds Sekunden S&econds between reconnect attempts: S&ekunden bis zum erneuten Wiederverbinden: &Show for: &Anzeigedauer: Cro&ssfade for: Cro&ssfade: Language Sprache Output devices Ausgabegeräte Enabled Aktiviert Name Name A&uto resize columns Spaltenbreite a&utomatisch anpassen Center playing &song aktuellen Titel &zentrieren Use system locale Systemvariable verwenden Enable &translations Übersetzungen ak&tivieren Servers Server A&dd Hinzufü&gen De&lete &Löschen A&uto connect to first server on startup A&utomatisch mit erstem Server verbinden Connection &timeout: Zei&tlimit für erfolglosen Verbindungsversuch: Opa&que splitter resizing Transparenz bei Größenänderun&g Date Datum Composer Komponist Filename Dateiname URL URL Genre Genre Playlist Wiedergabeliste A&lternating row colors Wechselnde Zei&lenfarben Title format Titelformat Title &format: Titel&format: Icons Icons Styles Stil Default style Standard Stil &Close &Schließen Library Bibliothek Directories Verzeichnisse Filter songs by... Titel filtern nach... selected &artist and album &Ausgewählter Künstler und Album selected al&bum only Nur ausgewähltes Al&bum &Show 'All' and 'Not tagged' (Slow) 'Alle' und 'kein Tag' &anzeigen (langsam) &Recursive directory view (Slow) &Rekursive Verzeichnisanzeige (langsam) &Notifier: Be&nachrichtigung: Shortcuts Verknüpfungen Cover art Cover Art Last.Fm Last.Fm Show album c&over art Album C&over Art anzeigen &Path to MPD music root: &Pfad zum MPD Musikverzeichnis: Max Height: Max. Höhe: Max Width: Max. Breite: &Fill up playlist with random songs Playlist mit zufälligen Songs auf&füllen &When less than that songs left: Falls &weniger als: Submit played songs to Last.Fm Abgespielte Songs an Last.Fm übertragen (scrobbeln) Username: Benutzername: Password: Passwort: Double click / enter action Aktion bei Doppelklick / Enter Disregard leading 'The ' when sorting Führendes 'The ' beim Sortieren außer Acht lassen Enable extended song info Erweiterte Titelinformationen Percent of song played: Prozent des Titels gespielt: Timer Timer Password Passwort Submit played tracks to Last.Fm Gerade gespielte Titel an Last.Fm übermitteln (scrobblen) Calculate MD5 MD5 berechnen Plain Klartext MD5 MD5 QObject All This is the first item in the artist and album views, meaning "All artists" or "All albums" Alle Directory This is used as the header of directory-tree in directory view Verzeichnis Root This is the name of the root directory in the directory browser Root Name Name Port Port Password Passwort Stream Stream Title Titel Track Track Artist Künstler Album Album Length Länge URL URL Filename Dateiname Genre Genre Date Datum Composer Komponist Playlist Wiedergabeliste Comment Kommentar Disc CD Action Aktion Shortcut Verknüpfung Address Adresse Performer Performer Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" kein Tag No cover art found. Keine Cover Art gefunden. Not tagged kein Tag RadioPanel Add new radio station... Neues Webradio hinzufügen... &New radio station... &Neues Webradio... Delete selected radio stations ausgewählte Webradios löschen D&elete radio stations W&ebradios löschen &Filter: &Filter: &Filter: Filter radio stations &Filter: RadioView &Delete &Löschen &New... &Neu... StringListView &Enqueue &Einreihen &Play &Abspielen &Information... &Information... TimeSlider Streaming Streaming TrayIcon Next Nächster Play Abspielen Pause Pause Stop Stopp Previuos Vorhergender Quit Beenden Not playing This is for the trayicon tooltip, indicating that no song is playing Keine Wiedergabe Hide Verstecken Show Anzeigen Volume Lautstärke qmpdclient-1.2.2/lang/es_ES.ts000066400000000000000000002053361157363675200161730ustar00rootroot00000000000000 AboutDialog About QMPDClient Sobre QMPDClient &About &Acerca de A&uthors A&utores &Thanks to A&gradecimientos a &License agreement Acuerdo de &licencia &OK &OK AbstractView Not connected Desconectado AddRadioDialog New radio station Nueva estación de radio Title: Título: URL: &OK &OK &Cancel &Cancelar ControlPanel Skip to previous song Saltar a la canción previa Ctrl+PgUp Ctrl+AvPág Play Reproducir Ctrl+Ins Ctrl+Ins Pause Pausar Ctrl+Home Ctrl+Inicio Stop Detener Ctrl+End Ctrl+Fin Skip to next song Saltar a la canción siguiente Ctrl+PgDown Ctrl+RePág Lyrics Letras Seek forward Buscar hacia adelante Seek backward Buscar hacia atrás Increase volume Subir Volumen Decrease volume Bajar volumen Not connected qmpdclient is not connected to MPD qmpdclient no está conectado a MPD Desconectado DirectoryPanel &Filter: Filter directory contents &Filtro: DirectoryView &Enqueue Agregar a &cola &Information... &Información... &Rescan directory &Reexplorar directorio &Play Re&producir LastFmSubmitter Will scrobble this track. Se hará scrobbling a esta pista. Scrobbling %1 songs... Haciendo scrobbling a %1 canciones... Last.Fm authentication failed: check your credentials La autenticación a Last.Fm fracasó: verifique sus credenciales Cannot submit to Last.Fm: system clock is skewed No se puede enviar a Las.Fm: el reloj del sistema está desajustado Successfully scrobbled Se hizo scrobbling exitosamente Now Playing sent Ahora Escuchando enviado Last.Fm error: %1 Error de Last.Fm: %1 LibraryPanel &Artist filter: Filtrar por &artista: Al&bum filter: Filtrar por ál&bum: Son&g filter: Filtrar por &canción: LineEdit Clear the filter Limpiar el filtro LyricsDialog Dialog Diálogo Artist Artista Title Título Search Busqueda about:blank about:blank Getting lyrics from server... Obteniendo letras del servidor... MPDCache Reading albums Leyendo álbumes Reading songs Leyendo canciones Filtering songs Filtrando canciones Caching songs Almacenando canciones en caché MPDConnection Could not connect to server %1:%2 No se pudo conectar al servidor %1:%2 Authentication failed La autenticación falló MPDSongView &Enqueue Poner en la &cola &Information... &Información... &Play Re&producir MainWindow &MPD &MPD &Connect to... &Conectar a... &Help A&yuda &About... &Acerca de... About... Acerca... F1 F1 About &Qt... Acerca de &Qt... About Qt... Acerca de Qt... Shift+F1 Shift+F1 &Disconnect &Desconectar Disconnect from server Desconectar del servidor Ctrl+D Ctrl+D &Rescan library &Reexplorar biblioteca Rescan songs Reexplorar canciones Ctrl+R Ctrl+R L&ocate current song L&ocalizar la canción actual Locate current song in library... Localizar la canción actual en la biblioteca... Ctrl+O Ctrl+O &Preferences... &Preferencias... Show preferences dialog... Muestra el diálogo de preferencias... Ctrl+P Ctrl+P &Quit &Salir Quit QMPDClient Salir de QMPDClient Ctrl+Q Ctrl+Q &Playlist &Lista de reproducción &Library &Biblioteca &Directories &Directorios &Internet Radio &Radio de internet Pla&ylists Lis&tas de reproducción &Shoutcast Directory Directorio &Shoutcast Minimize to tray Minimizar a bandeja Error Error Connect to first server Conectarse al primer servidor Ctrl+C Ctrl+C Library: %1, %2, %3. (%4 %5 %6 ) Biblioteca: %1, %2, %3, (%4 %5 %6 ) %n artists %n artista %n artistas %n albums %n álbum %n álbumes %n songs %n canción %n canciones %n days %n día %n días %n hours %n hora %n horas %n minutes %n minuto %n minutos Done Hecho Playlist: Lista de reproducción: %n days, %n día, %n días, %n hours, %n hora, %n horas, %n minutes, %n minuto, %n minutos, %n seconds. %n segundo. %n segundos. MetaInfoDialog File information Información del archivo Track #: Pista #: Artist: Artista: Title: Título: Date: Fecha: Length: Longitud: URL: URL: Composer: Compositor: Album: Álbum: Genre: Género: Disc: Disco: Comment: Comentario: Performer: Intérprete: &Previous &Previa &Next &Siguiente &OK &OK (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 de %2) PlaylistPanel &Filter: &Filtrar: Toggle random mode Cambiar a modo al ázar Toggle repeat playlist Activar repetición de lista de reproducción Toggle dynamic playlist Cambiar a lista de reproducción dinámica Shuffle playlist Mezclar lista de reproducción Save playlist... Guardar lista de reproducción... Remove selected songs from playlist Quitar las canciones seleccionadas de la lista de reproducción Remove all but selected songs from playlist Quitar todas las canciones de la lista de reproducción excepto las seleccionadas Remove all songs from playlist Quitar todas las canciones de la lista de reproducción PlaylistView &Crop playlist Re&cortar la lista de reproducción &Information... &Información... Ra&ndom play Reproducción a&leatoria &Remove &Quitar Remove &all Quitar &todo Re&peat play Re&petir reproducción &Save playlist... &Guardar la lista de reproducción... S&huffle playlist &Mezclar lista de reproducción Add to queue Agregar a la cola Q This is the shortcut for 'Add to queue' Q Focus playlist Enfocar lista de reproducción Save playlist as... Guardar lista de reproducción como... Playlist name: Nombre de la lista de reproducción: Attention! ¡Atención! A playlist with that name already exists. Overwrite? Ya existe una lista de reproducción con ese nombre. ¿Sobreescribirla? A playlist with that name already exists. Please use another name: Ya existe una lista de reproducción con ese nombre. Por favor, use otro nombre: PlaylistsPanel Fil&ter: Filter the list of saved playlists Fil&trar: &Filter: Filter the contents of saved playlists &Filtrar: Delete selected playlists Eliminar las listas de reproducción seleccionadas D&elete playlists &Eliminar las listas de reproducción PlaylistsView &Delete &Eliminar PreferencesDialog Preferences Preferencias Servers Servidores A&dd A&gregar De&lete &Eliminar A&uto connect to first server on startup Conectarse a&utomáticamente al primer servidor al inicio Connection &timeout: &Tiempo de espera de la conexión: seconds segundos &Reconnect to MPD if connection is lost &Reconectar a MPD si la conección se pierde S&econds between reconnect attempts: S&egundos entre los intentos de reconexión: Cross&fade on song change &Fundir al cambiar canción Cro&ssfade for: Fu&ndir por: Output devices Dispositivos de salida Enabled Habilitado Name Nombre Double click / enter action Acción de doble clic/botón intro &Play item Re&producir ítem &Enqueue item Agregar ítem a la &cola A&lternating row colors A&lternando colores de fila A&uto resize columns &Cambiar el tamaño de columnas automáticamente Opa&que splitter resizing &Opacar el divisor al cambiar de tamaño Save transient settings Guardar configuración transitoria Font: Fuente: C&hoose... E&legir... Filter songs by... Filtrar canciones por... selected &artist and album &Artista y álbum seleccionado selected al&bum only Solo al&bum seleccionado &Show 'All' and 'Not tagged' (Slow) &Mostrar "Todo" y "no etiquetado" (Lento) Disregard leading 'The ' when sorting Descartar primer "The" al ordenar &Recursive directory view (Slow) Vista de directorios &recursiva (Lento) Title format Formato de título Title &format: &Formato de título: Center playing &song Centrar la &canción que se reproduce Show album c&over art Mostrar el arte de &tapa del álbum &Path to MPD music root: &Ruta a la raíz de música de MPD: Max Height: Altura máxima: Max Width: Ancho máxima: Filename format: Formato de nombre de archivo: &Fill up playlist with random songs &Llenar la lista de reproducción con canciones aleatorias &When less than that songs left: Cuando queden me&nos canciones que: &Add whole albums &Agregar álbumes completos &Remove played songs from playlist &Quitar las canciones reproducidas de la lista de reproducción Enable &translations Habilitar &traducciones &Enable notifications &Habilitar notificaciones &Notifier: &Notificador: &Show for: &Mostrar durante: Position Posición Bottom-right Abajo a la derecha Desktop Escritorio Right-middle En el medio a la derecha Top-right Arriba a la derecha Bottom-middle Abajo en el medio Top-middle Arriba al medio Left-middle En la izquierda al medio Top-left Arriba a la izquierda Bottom-left Abajo a la izquierda &Enable tag guesser &Habilitar el adivinador de etiquetas &Guess pattern: &Patrón de estimación: &Test filename: Pro&bar nombre de archivo: %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Banda/Artista %a = Álbum %n = Número de pista %t = Título %i = Ignorar parte del nombre de archivo Guess results Adivinar resultados Track: Pista: Title: Título: Album: Álbum: Artist: Artista: &Enable tray icon &Habilitar ícono en la bandeja Close button &minimizes to tray El botón de cerrar &minimiza a la bandeja Start QMPDClient &hidden Iniciar &oculto QMPDclient Enable extended song info Habilitar información extendida de canción Submit played tracks to Last.Fm Enviar pistar reproducidas a Last.Fm Username: Nombre de usuario: Password Contraseña Plain Simple MD5 MD5 Calculate MD5 Calcular MD5 Timer Contador Percent of song played: Porcentaje reproducido de la canción: Server Servidor <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audioscrobbler endpoint (can be used to scrobble to <a href="http://libre.fm"><span style=" text-decoration: underline; color:#48ff00;">libre.fm</span></a> etc)</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { espacio en blanco: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Punto final del Audioscrobbler (puede ser usado para hacer scrobbling a <a href="http://libre.fm"><span style=" text-decoration: underline; color:#48ff00;">libre.fm</span></a> etc)</p></body></html> Last.fm Last.fm Libre.fm Libre.fm &Close &Cerrar Default style Estilo por defecto Use system locale Usar configuración regional del sistema Connection Conexión Look and feel Apariencia Library Biblioteca Directories Directorios Playlist Lista de reproducción Icons Íconos Cover art Arte de tapa Language Idioma Dynamic playlist Lista de reproducción dinámica Notifications Notificaciones Shortcuts Atajos Tag guesser Adivino de etiquetas Tray icon Ícono de bandeja Last.Fm Last.Fm Title Título Date Fecha Artist Artista Composer Compositor Album Álbum Filename Nomrbe de archivo Track Pista URL URL Genre Género Styles Estilos bold negrita italic cursiva QObject No cover art found. No se encontró el arte de tapa. Directory This is used as the header of directory-tree in directory view Directorio Title Título Track Pista Artist Artista Album Álbum Length Longitud URL URL Filename Nombre de archivo Genre Género Date Fecha Comment Comentario Disc Disco Composer Compositor Performer Intérprete Root This is the name of the root directory in the directory browser Raíz Playlist Lista de reproducción Stream Volcado Name Nombre Address Dirección Port Puerto Password Contraseña Action Acción Shortcut Atajo Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" No etiquetadas All This is the first item in the artist and album views, meaning "All artists" or "All albums" Todos Not tagged No etiquetado RadioPanel &Filter: Filter radio stations &Filtrar: Add new radio station... Agregar nueva estación de radio... &New radio station... &Nueva estación de radio... Delete selected radio stations Eliminar estaciones de radio seleccionadas D&elete radio stations &Eliminar estaciones de radio RadioView &New... &Nuevo... &Delete &Eliminar ShoutcastModel Name Nombre Bitrate Tasa de bits Listeners Escuchas Please wait... Por favor espere... bps bps Please wait Por favor espere ShoutcastView &Enqueue &Agregar a cola &Information... &Información... &Play Re&producir StringListView &Enqueue &Agregar a cola &Information... &Información... &Play Re&producir TimeSlider Streaming Volcando TrayIcon Hide Ocultar Show Mostrar Previuos Previa Play Reproducir Pause Pausar Stop Detener Next Siguiente Quit Salir Volume Volumen Not playing This is for the trayicon tooltip, indicating that no song is playing No hay reproducción TraySongInfo Not playing No hay reproducción from Means some song `from` some album de qmpdclient-1.2.2/lang/fr_FR.ts000066400000000000000000001601571157363675200161740ustar00rootroot00000000000000 AboutDialog About QMPDClient À propos de QMPDClient &About &À Propos A&uthors A&uteurs &Thanks to &Remerciements &License agreement Accord de &licence &OK &OK AbstractView Not connected Non connecté AddRadioDialog New radio station Nouvelle radio Title: Titre: URL: URL: &OK &OK &Cancel &Annuler ControlPanel Seek forward Avancer Seek backward Reculer Increase volume Augmenter le volume Decrease volume Diminuer le volume Not connected qmpdclient is not connected to MPD Non connecté Skip to previous song Morceau précédent Ctrl+PgUp Ctrl+PgUp Play Lecture Ctrl+Ins Ctrl+Ins Pause Pause Ctrl+Home Ctrl+Home Stop Arret Ctrl+End Ctrl+End Skip to next song Morceau suivant Ctrl+PgDown Ctrl+PgDown Lyrics DirectoryPanel &Filter: &Filtre: &Filter: Filter directory contents &Filtre: DirectoryView &Enqueue M&ettre en file d'attente &Information... &Informations... &Rescan directory &Rescanner répertoire &Play &Lecture JumpToSongDialog Jump to song Aller au morceau &Filter: &Filtre: &Jump &Saut &Cancel &Annuler LibraryPanel &Artist filter: Filtrer &Artiste: Al&bum filter: Filtrer Al&bum: Son&g filter: Filtrer Mor&ceau: LineEdit Clear the filter Effacer le filtre LyricsDialog Getting lyrics from server... Dialog Artist Artiste Title Titre Search MPDCache Reading albums Lecture albums Reading songs Lecture morceaux Filtering songs Filtrage morceaux Caching songs Mise en cache morceaux MPDConnection Could not connect to server Authentication failed MPDSongView &Enqueue M&ettre en file d'attente &Information... &Informations... &Play &Lecture MainWindow &Playlist &Liste de lecture &Library &Collection &Directories &Repertoires &Internet Radio R&adio internet Pla&ylists Li&stes de lecture Minimize to tray Minimiser Error Erreur Ctrl+C Ctrl+C artists artistes albums albums songs morceaux days jours hours heures minutes minutes Done Fini &MPD &MPD &Connect to... &Connexion... &Help &Aide &About... À &Propos... About... À Propos... F1 F1 About &Qt... À Propos de &Qt... About Qt... À Propos de Qt... Shift+F1 Shift+F1 &Disconnect &Deconnexion Disconnect from server Déconnexion du serveur Ctrl+D Ctrl+D &Rescan library &Rescanner la collection Rescan songs Rescanner les morceaux Ctrl+R Ctrl+R &Preferences... &Préférences... Show preferences dialog... Voir l'écran des préférences... Ctrl+P Ctrl+P &Quit &Quitter Quit QMPDClient Quitter QMPDClient Ctrl+Q Ctrl+Q Connect to first server MetaInfoDialog (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 de %2) File information Informations sur le fichier Track #: Morceau #: Artist: Artiste: Title: Titre: Date: Date: Length: Durée: URL: URL: Composer: Compositeur: Album: Album: Genre: Genre: Disc: Disque: Comment: Commentaire: Performer: InterprÚte: &Previous &Précédent &Next &Suivant &OK &OK PlaylistPanel Toggle random mode Basculer le mode aléatoire Toggle repeat playlist Basculer la répétition de la liste de lecture Jump to song... Aller au morceau... Shuffle playlist Désordonner la liste de lecture Save playlist... Sauver la liste de lecture... Remove selected songs from playlist Enlever les morceaux sélectionnés de la liste de lecture Remove all but selected songs from playlist Tout enlever sauf les morceaux sélectionnés de la liste de lecture Remove all songs from playlist Enlever tous les morceaux de la liste de lecture PlaylistView &Crop playlist Ré&colter la liste de lecture &Information... &Informations... J&ump to song... Aller au morcea&u... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U Ra&ndom play Lecture aléat&oire &Remove Enleve&r Remove &all Enlever &tout Re&peat play Lecture en &boucle &Save playlist... Enregi&strer la liste de lecture... S&huffle playlist &Mélanger la liste de lecture Add to queue Ajouter à la file d'attente Remove from queue Retirer de la file d'attente Focus playlist Focaliser la liste de lecture Save playlist as... Sauver la liste de lecture sous... Playlist name: Nom de la liste de lecture: A playlist with that name already exists. Please use another name: Une liste de lecture de ce nom existe déja. Utilisez un autre nom: Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Fil&ter: Fil&tre: &Filter: &Filtre: Delete selected playlists Effacer les listes de lecture sélectionnées D&elete playlists &Effacer les listes de lecture Fil&ter: Filter the list of saved playlists Fil&tre: &Filter: Filter the contents of saved playlists &Filtre: PlaylistsView &Delete &Effacer PreferencesDialog Default style Style par défaut Use system locale Utiliser la localisation systÚme Connection Connexion Look and feel Apparence Library Collection Directories Répertoires Playlist Liste de lecture Icons Icones Language Langue Dynamic playlist Liste de lecture dynamique Notifications Notifications Shortcuts Raccourcis Tag guesser Devineur d'étiquettes Tray icon Icone de statut Title Titre Date Date Artist Artiste Composer Compositeur Album Album Filename Nom de fichier Track Piste URL URL Genre Genre Styles Styles bold gras italic italique Preferences Préférences Servers Serveurs A&dd A&jouter De&lete E&ffacer A&uto connect to first server on startup Connexion a&utomatique au premier serveur lors du démarage Connection &timeout: Délai de conne&xion: seconds secondes &Reconnect to MPD if connection is lost &Recontacter MPD si la connexion est perdue S&econds between reconnect attempts: S&econdes entre les tentatives de reconnexion: Cross&fade on song change &Fondu entre les pistes Cro&ssfade for: Durée du f&ondu: Output devices Dispositifs de sortie Enabled Activé Name Nom Double click action Action du double clic &Play item &Lire article &Enqueue item &Mettre l'article en file d'attente A&lternating row colors Couleurs de lignes a&lternatives A&uto resize columns Redimentionnement a&utomatique des colonnes Opa&que splitter resizing Redimentionnement opa&que des séparations Font: Police: C&hoose... C&hoisir... Filter songs by... Filtrer les morceaux par... selected &artist and album &artiste et album sélectionnés selected al&bum only al&bum sélectionné uniquement &Show 'All' and 'Not tagged' (Slow) &Montrer 'Tous' et 'Non annotés' (Lent) &Recursive directory view (Slow) Vue &récursive des répertoires (Lent) Title format Format du titre Title &format: &Format du titre: Center playing &song Centrer le morceau en cour&s A&dd random songs to playlist Ajo&uter des morceaux aléatoires à la liste de lecture &When playing song (from end): &Pendant la lecture (depuis la fin): &Number of songs to add: &Nombre de morceaux à ajouter: &Remove played songs from playlist &Enlever les morceaux lus de la playlist Enable &translations Activer les &traductions &Enable notifications &Activer les notifications &Notifier: &Notificateur: &Show for: &Montrer pendant: Position Position Bottom-right Bas-droite Desktop Bureau Right-middle Milieu-droite Top-right Haut-droite Bottom-middle Bas-milieu Top-middle Haut-milieu Left-middle Milieu-gauche Top-left Haut-gauche Bottom-left Bas-gauche &Enable tag guesser Activ&er le devineur d'étiquettes &Guess pattern: Mot&if de devinettes: &Test filename: Nom de ficher de &test: %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Groupe/Artiste %a = Album %n = Numéro de piste %t = Titre %i = Ignorer cette parti du nom de fichier Guess results Résultats des devinettes Track: Piste: Title: Titre: Album: Album: Artist: Artiste: &Enable tray icon Activ&er l'icone de statut Close button &minimizes to tray Le bouton fermer &minimise dans la zone de notification Start QMPDClient &hidden Démarer QMPDClient cac&hé &Close &Fermer Cover art Last.Fm Show album c&over art &Path to MPD music root: Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject Directory This is used as the header of directory-tree in directory view Répertoire Title Titre Track Piste Artist Artiste Album Album Length Durée URL URL Filename Nom de fichier Genre Genre Date Date Comment Commentaire Disc Disque Composer Compositeur Performer InterprÚte Root This is the name of the root directory in the directory browser Racine Playlist Liste de lecture Stream Flux Name Nom Address Adresse Port Port Password Mot de passe Action Action Shortcut Raccourci Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Aucune étiquette All This is the first item in the artist and album views, meaning "All artists" or "All albums" Tous No cover art found. Not tagged Aucune étiquette RadioPanel &Filter: &Filtre: Add new radio station... Ajouter une nouvelle radio... &New radio station... Ajouter une &nouvelle radio... Delete selected radio stations Effacer les radios sélectionnées D&elete radio stations &Effacer les radios &Filter: Filter radio stations &Filtre: RadioView &New... &Nouveau... &Delete &Effacer StringListView &Enqueue M&ettre en file d'attente &Information... &Informations... &Play &Lecture TimeSlider Streaming Streaming TrayIcon Hide Cacher Show Afficher Previuos Précédent Play Lecture Pause Pause Stop Arret Next Suivant Quit Quitter Not playing This is for the trayicon tooltip, indicating that no song is playing À l'arret Volume qmpdclient-1.2.2/lang/it_IT.ts000066400000000000000000001573011157363675200162030ustar00rootroot00000000000000 AboutDialog About QMPDClient Informazioni su QMPDClient &About Informazioni &su A&uthors &Autori &Thanks to &Ringraziamenti &License agreement Accordo di &licenza &OK &OK AbstractView Not connected Non connesso AddRadioDialog New radio station Nuova stazione radio Title: Titolo: URL: URL: &OK &OK &Cancel &Cancella ControlPanel Ctrl+Home Ctrl+Home Ctrl+End Ctrl+End Ctrl+PgUp Ctrl+PgUp Ctrl+Ins Ctrl+Ins Ctrl+PgDown Ctrl+PgDown Not connected qmpdclient is not connected to MPD Non connesso Seek forward Cerca avanti Seek backward Cerca indietro Increase volume Aumenta volume Decrease volume Diminuisci volume Skip to previous song Salta al brano precedente Play Riproduci Pause Pausa Stop Interrompi Skip to next song Salta al brano successivo Lyrics DirectoryPanel &Filter: &Filtro: &Filter: Filter directory contents &Filtro: DirectoryView &Enqueue &Accoda &Play &Riproduci &Information... &Informazioni... &Rescan directory Nuova &scansione della directory JumpToSongDialog Jump to song Salta al brano &Jump &Salta &Cancel &Cancella &Filter: &Filtro: LibraryPanel &Artist filter: &Filtro per artista: Al&bum filter: Filtro per al&bum: Son&g filter: Filtro per &titolo: LineEdit Clear the filter Pulisci il filtro LyricsDialog Getting lyrics from server... Dialog Artist Artista Title Titolo Search MPDCache Reading albums Lettura album Filtering songs Filtraggio brani Reading songs Lettura brani Caching songs Archiviazione brani MPDConnection Could not connect to server Authentication failed MPDSongView &Enqueue &Accoda &Play &Riproduci &Information... &Informazioni... MainWindow &Library &Collezione &Directories &Cartelle &Help &Aiuto &About... &Informazioni su... About... Informazioni su... F1 F1 About &Qt... Informazioni su &Qt... About Qt... Informazioni su Qt... Shift+F1 Shift+F1 Ctrl+C Ctrl+C &Disconnect &Disconnetti Ctrl+D Ctrl+D &Rescan library &Ripeti la scansione della libreria &Preferences... &Preferenze... Ctrl+P Ctrl+P &Quit &Esci Quit QMPDClient Esci da QMPDClient Ctrl+Q Ctrl+Q artists artisti albums album songs brani days giorni hours ore minutes minuti &Playlist &Playlist Ctrl+R Ctrl+R Pla&ylists Pla&ylists &Internet Radio Web &Radio Error Errore &Connect to... &Connetti a... &MPD &MPD Done Fatto Minimize to tray Minimizza nel vassoio Disconnect from server Disconnetti dal server Rescan songs Ripeti la scansione dei brani Show preferences dialog... Mostra la finestra delle preferenze... Connect to first server MetaInfoDialog &OK &OK File information Informazioni sul file &Previous &Precedente &Next &Successivo (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 di %2) Genre: Genere: Title: Titolo: Track #: Traccia #: Artist: Artista: Composer: Compositore: Length: Lunghezza: URL: URL: Album: Album: Date: Data: Disc: Disco: Comment: Commento: Performer: Esecutore: PlaylistPanel Toggle random mode Attiva/Disattiva la riproduzione casuale Toggle repeat playlist Attiva/Disattiva la ripetizione della playlist Jump to song... Salta al brano... Shuffle playlist Mescola la playlist Save playlist... Salva la playlist... Remove selected songs from playlist Rimuovi i brani selezionati dalla playlist Remove all but selected songs from playlist Rimuovi dalla playlist tutti i brani tranne quelli selezionati Remove all songs from playlist Rimuovi tutti i brani dalla playlist PlaylistView &Remove &Rimuovi Remove &all Rimuovi &tutti Save playlist as... Salva playlist come... Playlist name: Nome playlist: S&huffle playlist &Mescola la playlist &Save playlist... &Salva playlist... &Crop playlist &Pulisci la playlist J&ump to song... Salta al &brano... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U Ra&ndom play Riproduzione &casuale Re&peat play Ripeti la ri&produzione &Information... &Informazioni... A playlist with that name already exists. Please use another name: Una playlist con questo nome esiste già. Per favore, usa un altro nome: Add to queue Aggiungi alla coda Remove from queue Rimuovi dalla coda Focus playlist Metti a fuoco la playlist Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Delete selected playlists Elimina le playlist selezionate D&elete playlists &Elimina le playlist Fil&ter: Fil&tro: &Filter: &Filtro: Fil&ter: Filter the list of saved playlists Fil&tro: &Filter: Filter the contents of saved playlists &Filtro: PlaylistsView &Delete &Elimina PreferencesDialog Connection Connessione Look and feel Aspetto Tag guesser Stima tag Tray icon Vassoio di sistema Cross&fade on song change &Crossfade al cambio di brano C&hoose... &Scegliere... Double click action Azione al doppio click &Enable tag guesser Abilita la &stima dei tag %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Complesso/Artista %a = Album %n = Numero di traccia %t = Titolo %i = Ignora una parte del nome del file Guess results Risultato della stima Track: Traccia: Title: Titolo: Album: Album: Artist: Artista: &Enable tray icon Abilita l'icona nel &vassoio di sistema Close button &minimizes to tray Il pulsante di chiusura &minimizza nel vassoio di sistema Start QMPDClient &hidden Avvia QMPDClient &minimizzato Position Posizione Bottom-right In basso a destra Desktop Desktop Right-middle In mezzo a destra Top-right In alto a destra Bottom-middle In basso al centro Top-middle In alto al centro Left-middle In mezzo a sinistra Top-left In alto a sinistra Bottom-left In basso a sinistra bold grassetto italic corsivo Artist Artista Album Album Track Traccia Title Titolo Dynamic playlist Playlist dinamica Notifications Notfiche &Reconnect to MPD if connection is lost &Riconnetti a MPD se disconnesso &Play item Ri&produci elemento &Enqueue item Accoda &elemento &Enable notifications Abilita &notifiche A&dd random songs to playlist Aggiungi brani &casuali alla playlist &Remove played songs from playlist &Rimuovi dalla playlist i brani già riprodotti Preferences Preferenze Font: Tipo di carattere: &Guess pattern: Mo&dello per la stima: &Test filename: Nome f&ile di esempio: &When playing song (from end): Quando riproduce un &brano (dalla fine): &Number of songs to add: &Numero di brani da aggiungere: seconds secondi S&econds between reconnect attempts: S&econdi tra due tentativi di riconnessione: &Show for: Mo&stra per: Cro&ssfade for: Cro&ssfade per: Language Lingua Output devices Dispositivo di output Enabled Attivo Name Nome A&uto resize columns Ridimensionamento a&utomatico delle colonne Center playing &song Centra il brano in &riproduzione Use system locale Utilizza la localizzazione di sistema Enable &translations Abilita &traduzioni Servers Server A&dd A&ggiungi De&lete E&limina A&uto connect to first server on startup Connessione a&utomatica al primo server all'avvio Connection &timeout: &Timeout di connessione: Opa&que splitter resizing Ridimensionamento o&paco dei separatori Date Data Composer Compositore Filename Nome file URL URL Genre Genere Playlist Playlist A&lternating row colors Colori a&lternati delle righe Title format Formato del titolo Title &format: &Formato del titolo: Icons Icone Styles Stili Default style Stile di default &Close &Chiudi Library Libreria Directories Cartelle Filter songs by... Filtra i brani per... selected &artist and album &artista e album selezionati selected al&bum only solo l'al&bum selezionato &Show 'All' and 'Not tagged' (Slow) Mo&stra 'Tutti' e 'Non etichettati' (lento) &Recursive directory view (Slow) Vista &ricorsiva della directory (lento) &Notifier: &Notificatore: Shortcuts Collegamenti Cover art Last.Fm Show album c&over art &Path to MPD music root: Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject All This is the first item in the artist and album views, meaning "All artists" or "All albums" Tutti Directory This is used as the header of directory-tree in directory view Directory Root This is the name of the root directory in the directory browser Radice Name Nome Port Porta Password Password Stream Stream Title Titolo Track Traccia Artist Artista Album Album Length Lunghezza URL URL Filename Nome file Genre Genere Date Data Composer Compositore Playlist Playlist Comment Commento Disc Disco Action Azione Shortcut Collegamento Address Indirizzo Performer Esecutore Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Non classificato No cover art found. Not tagged Non classificato RadioPanel Add new radio station... Aggiungi una stazione radio... &New radio station... &Nuova stazione radio... Delete selected radio stations Elimina le stazioni radio selezionate D&elete radio stations &Elimina le stazioni radio &Filter: &Filtro: &Filter: Filter radio stations &Filtro: RadioView &Delete &Elimina &New... &Nuova... StringListView &Enqueue &Accoda &Play &Riproduci &Information... &Informazioni... TimeSlider Streaming Streaming TrayIcon Next Successivo Play Riproduci Pause Pausa Stop Interrompi Previuos Precedente Quit Esci Not playing This is for the trayicon tooltip, indicating that no song is playing Non in riproduzione Hide Nascondi Show Mostra Volume qmpdclient-1.2.2/lang/nl_NL.ts000066400000000000000000001566211157363675200162010ustar00rootroot00000000000000 AboutDialog About QMPDClient About QMPDClient &About &About A&uthors A&uteurs &Thanks to &Dankwoord &License agreement &Licensie overeenkomst &OK &OK AbstractView Not connected Niet verbonden AddRadioDialog New radio station Nieuw radio station Title: Titel: URL: URL: &OK &OK &Cancel &Annuleren ControlPanel Seek forward Spring vooruit Seek backward Spring achteruit Increase volume Verhoog volume Decrease volume Verlaag volume Not connected qmpdclient is not connected to MPD Niet verbonden Skip to previous song Ga na vorig nummer Ctrl+PgUp Ctrl+PgUp Play Speel Ctrl+Ins Ctrl+Ins Pause Pauze Ctrl+Home Ctrl+Home Stop Stop Ctrl+End Ctrl+End Skip to next song Ga naar volgend nummer Ctrl+PgDown Ctrl+PgDown Lyrics DirectoryPanel &Filter: &Filter: &Filter: Filter directory contents &Filter: DirectoryView &Enqueue &Voeg toe &Information... &Informatie... &Rescan directory &Herindexeer directory &Play &Speel JumpToSongDialog Jump to song Ga naar nummer &Filter: &Filter: &Jump &Ga naar &Cancel &Annuleer LibraryPanel &Artist filter: &Artiest filter: Al&bum filter: Al&bum filter: Son&g filter: &Nummer filter: LineEdit Clear the filter Leeg het filter LyricsDialog Getting lyrics from server... Dialog Artist Artiest Title Titel Search MPDCache Reading albums Inlezen albums Reading songs Inlezen nummers Filtering songs Filteren nummers Caching songs Bufferen nummers MPDConnection Could not connect to server Authentication failed MPDSongView &Enqueue &Voeg toe &Information... &Informatie... &Play &Speel MainWindow &Playlist &Speellijst &Library &Bibliotheek &Directories &Mappenlijst &Internet Radio &Internet Radio Pla&ylists S&peellijsten Minimize to tray Minimaliseer naar systeemvak Error Foutmelding Ctrl+C Ctrl+C artists artiesten albums albums songs nummers days dagen hours uren minutes minuten Done Klaar &MPD &MPD &Connect to... &Verbind naar... &Help &Help &About... &About... About... About... F1 F1 About &Qt... About &Qt... About Qt... About Qt... Shift+F1 Shift+F1 &Disconnect &Verbreek verbinding Disconnect from server Verbreek verbinding met server Ctrl+D Ctrl+D &Rescan library &Herindex bibliotheek Rescan songs Herindexeer nummers Ctrl+R Ctrl+R &Preferences... &Instellingen... Show preferences dialog... Toon instellingen scherm... Ctrl+P Ctrl+P &Quit &Sluiten Quit QMPDClient Sluit QMPDClient Ctrl+Q Ctrl+Q Connect to first server MetaInfoDialog (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 van de %2) File information Bestands informatie Track #: Nummer #: Artist: Artiest: Title: Titel: Date: Datum: Length: Lengte: URL: URL: Composer: Componist: Album: Album: Genre: Genre: Disc: Disk: Comment: Opmerking: Performer: Uitvoerder: &Previous &Vorige &Next V&olgende &OK &OK PlaylistPanel Toggle random mode Schakel willekeurige modus Toggle repeat playlist Schakel herhaal speellijst Jump to song... Ga naar nummer... Shuffle playlist Schud speellijst door elkaar Save playlist... Bewaars speellijst... Remove selected songs from playlist Verwijder geselecteerde nummers uit de speellijst Remove all but selected songs from playlist Verwijder alle nummers, behalve de geselecteerde, uit de speellijst Remove all songs from playlist Verwijder alle nummers uit de speellijst PlaylistView &Crop playlist &Verklein speellijst &Information... &Informatie... J&ump to song... &Spring naar nummer... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+S Ra&ndom play &Willekeurig afspelen &Remove &Verwijder Remove &all &Verwijder &alles Re&peat play &Herhaald afspelen &Save playlist... &Bewaar speellijst... S&huffle playlist S&chud speellijst Add to queue Voeg toe aan wachtrij Remove from queue Verwijder uit wachtrij Focus playlist Bekijk speellijst Save playlist as... Bewaar speellijst als... Playlist name: Speellijst naam: A playlist with that name already exists. Please use another name: Er bestaat al een speellijst met deze naam Gebruik een andere naam alsteblieft: Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Fil&ter: Fil&ter: &Filter: &Filter: Delete selected playlists Verwijder geselecteerde speellijsten D&elete playlists &Verwijder speellijsten Fil&ter: Filter the list of saved playlists Fil&ter: &Filter: Filter the contents of saved playlists &Filter: PlaylistsView &Delete &Verwijder PreferencesDialog Default style Standaard stijl Use system locale Gebruik systeem locale Connection Verbinding Look and feel Uiterlijk en instellingen Library Bibliotheek Directories Mappen Playlist Speellijst Icons Iconen Language Taal Dynamic playlist Dynamische speellijst Notifications Meldingen Shortcuts Snelkoppelingen Tag guesser Tag voorspeller Tray icon Systeemvak icoon Title Titel Date Datum Artist Artiest Composer Componist Album Album Filename Bestandsnaam Track Nummer URL URL Genre Genre Styles Stijl bold vet italic cursief Preferences Instellingen Servers Servers A&dd &Voeg toe De&lete V&erwijder A&uto connect to first server on startup Ve&rbind automatisch met de eerste server bij het opstarten Connection &timeout: Connectie &timeout: seconds seconden &Reconnect to MPD if connection is lost &Herverbind met MPD als de verbinding wordt verbroken S&econds between reconnect attempts: &Aantal seconden tussen connectiepogingen: Cross&fade on song change Cross&fade naar het volgende nummer Cro&ssfade for: Cro&ssfade duur: Output devices Uitgang apparaten Enabled Aan Name Naam Double click action Dubbelklik actie &Play item &Speel item &Enqueue item &Voeg item toe A&lternating row colors vers&pringende rij kleuren A&uto resize columns A&utomatisch kolommen de goede grootte geven Opa&que splitter resizing &Doorzichtig splitsers andere grootte geven Font: Lettertype: C&hoose... &Kies... Filter songs by... Filter nummers op... selected &artist and album &Geselecteerde artiest en album selected al&bum only Alleen geselec&teerde album &Show 'All' and 'Not tagged' (Slow) &Toon 'Alles' en 'Geen tag' (Langzaam) &Recursive directory view (Slow) &Recursieve mappenlijst (Langzaam) Title format Titel vormgeving Title &format: Titel &Vormgeving: Center playing &song Centreer &spelend nummer A&dd random songs to playlist Voeg willekeurig nummers toe aan &de speellijst &When playing song (from end): A&ls het nummer speelt (vanaf het einde): &Number of songs to add: Aantal &nummers dat toegevoegd wordt: &Remove played songs from playlist Verwijde&r gespeelde nummers uit de speellijst Enable &translations Zet ver&talingen aan &Enable notifications Zet m&eldingen aan &Notifier: Me&lder: &Show for: T&oon voor zoveel seconden: Position Positie Bottom-right Rechts-onder Desktop Bureaublad Right-middle Rechts-midden Top-right Rechts-boven Bottom-middle Midden-onder Top-middle Midden-midden Left-middle Links-midden Top-left Links-boven Bottom-left Links-onder &Enable tag guesser Tag rad&er aan &Guess pattern: &Gok patroon: &Test filename: &Test bestandsnaam: %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Band/Artiest %a = Album %n = Nummer op disk %t = Titel %i = Negeer stuk van de bestandsnaam Guess results Gok resultaten Track: Nummer: Title: Titel: Album: Album: Artist: Artiest: &Enable tray icon Syst&eemvak icoon aan Close button &minimizes to tray Sluit knop &minimaliseert naar systeemvak Start QMPDClient &hidden Start QMPDClient &verborgen &Close &Sluit Cover art Last.Fm Show album c&over art &Path to MPD music root: Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject Directory This is used as the header of directory-tree in directory view Map Title Titel Track Nummer Artist Artiest Album Album Length Lengte URL URL Filename Bestandsnaam Genre Genre Date Datum Comment Opmerking Disc Disk Composer Componist Performer Uitvoerder Root This is the name of the root directory in the directory browser Root Playlist Speellijst Stream Stream Name Naam Address Adres Port Poort Password Wachtwoord Action Actie Shortcut Snelkoppeling Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Niet toegewezen All This is the first item in the artist and album views, meaning "All artists" or "All albums" Alles No cover art found. Not tagged Niet toegewezen RadioPanel &Filter: &Filter: Add new radio station... Voeg nieuw radio station toe... &New radio station... &Nieuw radio station... Delete selected radio stations Verwijder geselecteerde radio stations D&elete radio stations &Verwijder radio stations &Filter: Filter radio stations &Filter: RadioView &New... &Nieuw... &Delete &Verwijder StringListView &Enqueue &Voeg toe &Information... &Informatie... &Play &Speel af TimeSlider Streaming Streaming TrayIcon Hide Verberg Show Toon Previuos Vorige Play Volgende Pause Pauze Stop Stop Next Volgende Quit Sluit Not playing This is for the trayicon tooltip, indicating that no song is playing Niet aan het spelen Volume qmpdclient-1.2.2/lang/nn_NO.ts000066400000000000000000001545211157363675200162030ustar00rootroot00000000000000 AboutDialog About QMPDClient Om QMPDClient &About O&m A&uthors &Forfattarar &Thanks to &Takk til &License agreement &Lisensavtale &OK &OK AbstractView Not connected Ikkje tilkopla AddRadioDialog New radio station Ny radiostasjon Title: Tittel: URL: URL: &OK &OK &Cancel &Avbryt ControlPanel Ctrl+Home Ctrl+Home Ctrl+End Ctrl+End Ctrl+PgUp Ctrl+PgUp Ctrl+Ins Ctrl+Ins Ctrl+PgDown Ctrl+PgDown Not connected qmpdclient is not connected to MPD Ikkje tilkopla Seek forward Spol framover Seek backward Spol bakover Increase volume Øk lydnivå Decrease volume Senk lydnivå Skip to previous song Bytt til forrige song Play Spel Pause Pause Stop Stopp Skip to next song Bytt til neste song Lyrics DirectoryPanel &Filter: Filter directory contents &Filter: DirectoryView &Enqueue &Legg i kø &Play &Spel &Information... &Informasjon... &Rescan directory L&es katalog på nytt JumpToSongDialog Jump to song Hopp til song &Jump &Hopp &Cancel &Avbryt &Filter: &Filter: LibraryPanel &Artist filter: &Artist filter: Al&bum filter: A&lbum filter: Son&g filter: Son&g filter: LineEdit Clear the filter Fjern filteret LyricsDialog Getting lyrics from server... Dialog Artist Artist Title Tittel Search MPDCache Reading albums Les album Filtering songs Filtrerer songar Reading songs Les songar Caching songs Legg songar i hurtigbuffer MPDConnection Could not connect to server Kunne ikkje kople til tenar Authentication failed Autentisering feilet MPDSongView &Enqueue &Legg i kø &Play &Spel &Information... &Informasjon... MainWindow &Library &Bibliotek &Directories &Katalogar &Help &Hjelp &About... &Om... About... Om... F1 F1 About &Qt... Om &Qt... About Qt... Om Qt... Shift+F1 Shift+F1 Ctrl+C Ctrl+C &Disconnect Kople &frå Ctrl+D Ctrl+D &Rescan library &Les bibliotek på nytt &Preferences... &Innstillingar... Ctrl+P Ctrl+P &Quit &Avslutt Quit QMPDClient Avlutt QMPDClient Ctrl+Q Ctrl+Q artists artistar albums album songs songar days dagar hours timar minutes minutt &Playlist &Speleliste Ctrl+R Ctrl+R Pla&ylists S&pelelister &Internet Radio &Internettradio Error Feil &Connect to... &Kople til... &MPD &MPD Done Ferdig Minimize to tray Minimér til systemstatusfelt Disconnect from server Kople frå tenar Rescan songs Les biblioitek på nytt Show preferences dialog... Vis instillingsdialog... Connect to first server Kople til første tenar MetaInfoDialog &OK &OK File information Filinformasjon &Previous &Forrige &Next &Neste (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 av %2) Genre: Sjanger: Title: Tittel: Track #: Spor #: Artist: Artist: Composer: Komponist: Length: Lengde: URL: URL: Album: Album: Date: Dato: Disc: CD: Comment: Kommentar: Performer: Framførar: PlaylistPanel Toggle random mode Slå tilfeldig-modus av/på Toggle repeat playlist Slå gjenta-modus av/på Jump to song... Hopp til song... Shuffle playlist Stokk om spelelista Save playlist... Lagre spelelista... Remove selected songs from playlist Fjern valde songar frå spelelista Remove all but selected songs from playlist Fjern alle forutan valde songar frå spelelista Remove all songs from playlist Fjern alle songane fra spelelista PlaylistView &Remove &Fjern Remove &all Fjern &alle Save playlist as... Lagre speleliste som... Playlist name: Namn på speleliste: S&huffle playlist &Stokk om speleliste &Save playlist... &Lagre speleliste... &Crop playlist &Beskjær spilleliste J&ump to song... &Hopp til song... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U Ra&ndom play &Tilfeldig-modus Re&peat play &Gjenta-modus &Information... &Informasjon... A playlist with that name already exists. Please use another name: Ei speleliste med det namnet finns frå før. Vennlegst velg eit nytt namn: Add to queue Legg i kø Remove from queue Fjern frå kø Focus playlist Gje fokus tli spelelista Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Delete selected playlists Slett valde spelelister D&elete playlists S&lett spelelister Fil&ter: Filter the list of saved playlists Fil&ter: &Filter: Filter the contents of saved playlists &Filter: PlaylistsView &Delete &Slett PreferencesDialog Connection Forbindelse Look and feel Utsjånad og åtferd Tag guesser Tag-gissar Tray icon Statusikon Cross&fade on song change &Gli over i neste song C&hoose... &Vel... Double click action Dobbeltklikkhandling &Enable tag guesser B&ruk tag-gissar %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Band/Artist %a = Album %n = Spor-nummer %t = Songtittel %i = Oversjå del av filnamn Guess results Resultat av giss Track: Spor: Title: Tittel: Album: Album: Artist: Artist: &Enable tray icon B&ruk systemstatusfeltikon Close button &minimizes to tray Lukkeknapp &minimerer til systemstatusfelt Start QMPDClient &hidden Start QMPDClient &skjult Position Posisjon Bottom-right Nede til høgre Desktop Skrivebord Right-middle Midt på til høgre Top-right Oppe til høgre Bottom-middle Midt på nede Top-middle Midt på oppe Left-middle Midt på til venstre Top-left Oppe til venstre Bottom-left Nede til venstre bold fét italic kursiv Artist Artist Album Album Track Spor Title Tittel Dynamic playlist Dynamisk speleliste Notifications Notisar &Reconnect to MPD if connection is lost &Kople til MPD på nytt om forbindelsen brytast &Play item &Spel song &Enqueue item &Legg song i kø &Enable notifications B&ruk notisar A&dd random songs to playlist &Legg tilfeldige songar til spelelista &Remove played songs from playlist &Fjern spelte songar frå spelelista Preferences Innstillingar Font: Skrifttype: &Guess pattern: &Gissemønster: &Test filename: &Testfilnavn: &When playing song (from end): &Når song nr (fra botnen) spelast: &Number of songs to add: Antal &songar å legge til: seconds sekund S&econds between reconnect attempts: S&ekund mellom gjentilkoplingsforsøk: &Show for: &Vis i: Cro&ssfade for: G&li over i: Language Språk Output devices Utputt einheter Enabled Aktiv Name Namn A&uto resize columns A&utojustér kolonnebredder Center playing &song &Midtstill spelande song Use system locale Bruk systemvalgt språk Enable &translations Overse&tt Servers Tenarar A&dd Le&gg til De&lete &Slett A&uto connect to first server on startup Kople til &første tenar ved oppstart Connection &timeout: &Tidsavbrot: Opa&que splitter resizing Vis innhald medan &du dreg i splittarar Date Dato Composer Komponist Filename Filnamn URL URL Genre Sjanger Playlist Speleliste A&lternating row colors V&ekslande radfarger Title format Tittelformat Title &format: Tittel&format: Icons Ikon Styles Stil Default style Standard stil &Close &Lukk Library Bibliotek Directories Katalogar Filter songs by... Filtrer songar på... selected &artist and album vald &artist og album selected al&bum only kun vald al&bum &Show 'All' and 'Not tagged' (Slow) Vi&s 'Alle' og 'Ikkje tagga' (Treigt) &Recursive directory view (Slow) &Rekrusiv katalogvising (Treigt) &Notifier: &Notifikator: Shortcuts Hurtigtastar Show album c&over art Vis albumc&over-bilde &Path to MPD music root: Sti til M&PD musikkrot: Cover art Cover-bilde Last.Fm Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject All This is the first item in the artist and album views, meaning "All artists" or "All albums" Alle Directory This is used as the header of directory-tree in directory view Katalog Root This is the name of the root directory in the directory browser Rot Name Namn Port Port Password Passord Stream Internettstasjon Title Tittel Track Spor Artist Artist Album Album Length Lengde URL URL Filename Filnamn Genre Sjanger Date Dato Composer Komponist Playlist Speleliste Comment Kommentar Disc CD Action Handling Shortcut Hurtigtast Address Adresse Performer Framførar Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Ikkje tagga No cover art found. Fant ikkje cover-bilde. Not tagged Ikkje tagga RadioPanel Add new radio station... Legg til ny radiostasjon... &New radio station... &Ny radiostasjon... Delete selected radio stations Slett valde radiostasjonar D&elete radio stations S&lett radiostasjonar &Filter: Filter radio stations &Filter: RadioView &Delete &Slett &New... &Ny... StringListView &Enqueue &Legg i kø &Play &Spel &Information... &Informasjon... TimeSlider Streaming Radio TrayIcon Next Neste Play Spel Pause Pause Stop Stopp Previuos Forrige Quit Avslutt Not playing This is for the trayicon tooltip, indicating that no song is playing Spelar ikkje Hide Skjul Show Vis Volume Lydnivå qmpdclient-1.2.2/lang/no_NO.ts000066400000000000000000001546131157363675200162060ustar00rootroot00000000000000 AboutDialog About QMPDClient Om QMPDClient &About O&m A&uthors &Forfattere &Thanks to &Takk til &License agreement &Lisensavtale &OK &OK AbstractView Not connected Ikke tilkoblet AddRadioDialog New radio station Ny radiostasjon Title: Tittel: URL: URL: &OK &OK &Cancel &Avbryt ControlPanel Ctrl+Home Ctrl+Hjem Ctrl+End Ctrl+End Ctrl+PgUp Ctrl+PgUp Ctrl+Ins Ctrl+Ins Ctrl+PgDown Ctrl+PgDown Not connected qmpdclient is not connected to MPD Ikke tilkoblet Seek forward Spol fremover Seek backward Spol bakover Increase volume Øk volumet Decrease volume Senk volumet Skip to previous song Bytt til forrige sang Play Spill Pause Pause Stop Stopp Skip to next song Bytt til neste sang Lyrics DirectoryPanel &Filter: Filter directory contents &Filter: DirectoryView &Enqueue &Legg i kø &Play &Spill &Information... &Informasjon... &Rescan directory L&es katalog på nytt JumpToSongDialog Jump to song Hopp til sang &Jump &Hopp &Cancel &Avbryt &Filter: &Filter: LibraryPanel &Artist filter: &Artist filter: Al&bum filter: A&lbum filter: Son&g filter: Son&g filter: LineEdit Clear the filter Fjern filteret LyricsDialog Getting lyrics from server... Dialog Artist Artist Title Tittel Search MPDCache Reading albums Leser album Filtering songs Filtrerer sanger Reading songs Leser sanger Caching songs Legger sanger i hurtigbuffer MPDConnection Could not connect to server Kunne ikke koble til tjener Authentication failed Autentisering feilet MPDSongView &Enqueue &Legg i kø &Play &Spill &Information... &Informasjon... MainWindow &Library &Bibliotek &Directories &Kataloger &Help &Hjelp &About... &Om... About... Om... F1 F1 About &Qt... Om &Qt... About Qt... Om Qt... Shift+F1 Shift+F1 Ctrl+C Ctrl+C &Disconnect Koble &fra Ctrl+D Ctrl+D &Rescan library &Les bibliotek på nytt &Preferences... &Innstillinger... Ctrl+P Ctrl+P &Quit &Avslutt Quit QMPDClient Avslutt QMPDClient Ctrl+Q Ctrl+Q artists artister albums album songs sanger days dager hours timer minutes minutt &Playlist &Spilleliste Ctrl+R Ctrl+R Pla&ylists S&pillelister &Internet Radio &Internettradio Error Feil &Connect to... &Koble til... &MPD &MPD Done Ferdig Minimize to tray Minimér til systemstatusfelt Disconnect from server Koble fra tjener Rescan songs Les bibliotek på nytt Show preferences dialog... Vis instillingsdialog... Connect to first server Koble til første tjener MetaInfoDialog &OK &OK File information Filinformasjon &Previous &Forrige &Next &Neste (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 av %2) Genre: Sjanger: Title: Tittel: Track #: Spor #: Artist: Artist: Composer: Komponist: Length: Lengde: URL: URL: Album: Album: Date: Dato: Disc: CD: Comment: Kommentar: Performer: Fremfører: PlaylistPanel Toggle random mode Slå tilfeldig-modus av/på Toggle repeat playlist Slå gjenta-modus av/på Jump to song... Hopp til sang... Shuffle playlist Stokk om spillelisten Save playlist... Lagre spillelisten... Remove selected songs from playlist Fjern valgte sanger fra spillelisten Remove all but selected songs from playlist Fjern alle untatt valgte sanger fra spillelisten Remove all songs from playlist Fjern alle sangene fra spillelisten PlaylistView &Remove &Fjern Remove &all Fjern &alle Save playlist as... Lagre spillelisten som... Playlist name: Navn på spillelisten: S&huffle playlist &Stokk om spillelisten &Save playlist... &Lagre spillelisten... &Crop playlist &Beskjær spillelisten J&ump to song... &Hopp til sang... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U Ra&ndom play &Tilfeldig-modus Re&peat play &Gjenta-modus &Information... &Informasjon... A playlist with that name already exists. Please use another name: En spilleliste med det navnet finnes allerede. Vennligst velg et annet navn: Add to queue Legg i kø Remove from queue Fjern fra kø Focus playlist Gi fokus tli spillelisten Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Delete selected playlists Slett valgte spillelister D&elete playlists S&lett spillelister Fil&ter: Filter the list of saved playlists Fil&ter: &Filter: Filter the contents of saved playlists &Filter: PlaylistsView &Delete &Slett PreferencesDialog Connection Forbindelse Look and feel Utseende og oppførsel Tag guesser Tag-gjetter Tray icon Statusikon Cross&fade on song change &Gli over i neste sang C&hoose... &Velg... Double click action Dobbeltklikkhandling &Enable tag guesser B&ruk tag-gjetter %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Band/Artist %a = Album %n = Spor-nummer %t = Sangtittel %i = Overse del av filnavn Guess results Resultat av gjett Track: Spor: Title: Tittel: Album: Album: Artist: Artist: &Enable tray icon B&ruk systemstatusfeltikon Close button &minimizes to tray Lukkeknapp &minimerer til systemstatusfelt Start QMPDClient &hidden Start QMPDClient &skjult Position Posisjon Bottom-right Nede til høyre Desktop Skrivebord Right-middle Midt på til høyre Top-right Oppe til høyre Bottom-middle Midt på nede Top-middle Midt på oppe Left-middle Midt på til venstre Top-left Oppe til venstre Bottom-left Nede til venstre bold fét italic kursiv Artist Artist Album Album Track Spor Title Tittel Dynamic playlist Dynamisk spilleliste Notifications Notiser &Reconnect to MPD if connection is lost &Koble til MPD på nytt om forbindelsen brytes &Play item &Spill sang &Enqueue item &Legg sang i kø &Enable notifications B&ruk notiser A&dd random songs to playlist &Legg tilfeldige sanger til spillelisten &Remove played songs from playlist &Fjern spilte sanger fra spillelisten Preferences Innstillinger Font: Skrifttype: &Guess pattern: &Gjettemønster: &Test filename: &Testfilnavn: &When playing song (from end): &Når sang nr (fra bunnen) spilles: &Number of songs to add: Antall &sanger å legge til: seconds sekund S&econds between reconnect attempts: S&ekund mellom gjentilkoblingsforsøk: &Show for: &Vis i: Cro&ssfade for: G&li over i: Language Språk Output devices Spilleenheter Enabled Påslått Name Navn A&uto resize columns A&utojustér kolonnestørrelse Center playing &song &Midtstill spillende sang Use system locale Bruk systemspråk Enable &translations Overse&tt Servers Tjenere A&dd Le&gg til De&lete &Slett A&uto connect to first server on startup Koble til første t&jener ved oppstart Connection &timeout: &Tidsabrudd før tilkobling brytes: Opa&que splitter resizing V&is innhold mens du drar i splittere Date Dato Composer Komponist Filename Filnavn URL URL Genre Sjanger Playlist Spilleliste A&lternating row colors Al&ternerende radfarger Title format Tittelformat Title &format: Tittel&format: Icons Ikoner Styles Stiler Default style Standard stil &Close &Lukk Library Bibliotek Directories Kataloger Filter songs by... Filtrer sanger på... selected &artist and album valgte &artist og album selected al&bum only kun valgt al&bum &Show 'All' and 'Not tagged' (Slow) Vi&s 'Alle' og 'Ikke tagget' (Tregt) &Recursive directory view (Slow) &Rekursiv katalogvisning (Tregt) &Notifier: &Notifikator: Shortcuts Hurtigtaster Show album c&over art Vis albumc&over-bilde &Path to MPD music root: Stil til M&PD musikkrot: Cover art Cover-bilde Last.Fm Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject All This is the first item in the artist and album views, meaning "All artists" or "All albums" Alle Directory This is used as the header of directory-tree in directory view Katalog Root This is the name of the root directory in the directory browser Rot Name Navn Port Port Password Passord Stream Internettstasjon Title Tittel Track Spor Artist Artist Album Album Length Lengde URL URL Filename Filnavn Genre Sjanger Date Dato Composer Komponist Playlist Spilleliste Comment Kommentar Disc CD Action Handling Shortcut Hurtigtast Address Adresse Performer Fremfører Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Ikke tagget No cover art found. Fant ikke cover-bilde. Not tagged Ikke tagget RadioPanel Add new radio station... Legg til ny radiostasjon... &New radio station... &Ny radiostasjon... Delete selected radio stations Slett valgte radiostasjoner D&elete radio stations S&lett radiostasjoner &Filter: Filter radio stations &Filter: RadioView &Delete &Slett &New... &Ny... StringListView &Enqueue &Legg i kø &Play &Spill &Information... &Informasjon... TimeSlider Streaming Radio TrayIcon Next Neste Play Spill Pause Pause Stop Stopp Previuos Forrige Quit Avslutt Not playing This is for the trayicon tooltip, indicating that no song is playing Spiller ikke Hide Skjul Show Vis Volume Lydnivå qmpdclient-1.2.2/lang/pt_BR.ts000066400000000000000000001560251157363675200162030ustar00rootroot00000000000000 AboutDialog About QMPDClient Sobre o QMPDClient &About &Sobre A&uthors A&utores &Thanks to &Grato à &License agreement C&ontrato de licença &OK &OK AbstractView Not connected Não conectado AddRadioDialog New radio station Nova estação de rádio Title: Título: URL: URL: &OK &OK &Cancel &Cancelar ControlPanel Seek forward Buscar à frente Seek backward Buscar para trás Increase volume Aumentar o volume Decrease volume Baixar o volume Not connected qmpdclient is not connected to MPD Não conectado Skip to previous song Retroceder à música anterior Ctrl+PgUp Ctrl+PgUp Play Reproduzir Ctrl+Ins Ctrl+Ins Pause Pausar Ctrl+Home Ctrl+Home Stop Parar Ctrl+End Ctrl+End Skip to next song Avançar à próxima música Ctrl+PgDown Ctrl+PgDown Lyrics DirectoryPanel &Filter: Filter directory contents &Filtro: DirectoryView &Enqueue &Colocar na fila &Information... &Informações... &Rescan directory &Reescanear diretório &Play &Reproduzir JumpToSongDialog Jump to song Pular para a música &Filter: &Filtro: &Jump &Pular &Cancel &Cancelar LibraryPanel &Artist filter: Filtro de &artista: Al&bum filter: Filtro de á&lbum: Son&g filter: Filtro de &música: LineEdit Clear the filter Limpar o filtro LyricsDialog Getting lyrics from server... Dialog Artist Artista Title Título Search MPDCache Reading albums Lendo álbuns Reading songs Lendo músicas Filtering songs Filtrando músicas Caching songs Colocando músicas no cache MPDConnection Could not connect to server Não foi possível conectar ao servidor Authentication failed A autenticação falhou MPDSongView &Enqueue C&olocar na fila &Information... &Informação... &Play &Tocar MainWindow &Playlist &Lista de Reprodução &Library &Biblioteca &Directories &Diretórios &Internet Radio &Rádio na Internet Pla&ylists Li&stas de reprodução Minimize to tray Minimizar para a bandeja Error Erro Connect to first server Conectar ao primeiro servidor Ctrl+C Ctrl+C artists artistas albums álbuns songs músicas days dias hours horas minutes minutos Done PRonto &MPD &MPD &Connect to... &Conectar à... &Help A&juda &About... S&obre... About... Sobre... F1 F1 About &Qt... Sobre o &Qt... About Qt... Sobre o Qt... Shift+F1 Shift+F1 &Disconnect &Desconectar Disconnect from server Desconectar do servidor Ctrl+D Ctrl+D &Rescan library &Reescanear a biblioteca Rescan songs Reescanear músicas Ctrl+R Ctrl+R &Preferences... &Preferências... Show preferences dialog... Mostrar o diálogo de preferências... Ctrl+P Ctrl+P &Quit &Sair Quit QMPDClient Sair do QMPDClient Ctrl+Q Ctrl+Q MetaInfoDialog (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 de %2) File information Informações do arquivo Track #: Número da faixa: Artist: Artista: Title: Título: Date: Data: Length: Duração: URL: URL: Composer: Compositor: Album: Álbum: Genre: Gênero: Disc: Disco: Comment: Comentário: Performer: Executada por: &Previous &Anterior &Next &Próximo &OK &OK PlaylistPanel Toggle random mode Ligar/desligar modo aleatório Toggle repeat playlist Ligar/desligar repetir a lista Jump to song... Pular para a faixa... Shuffle playlist Embaralhar a lista Save playlist... Salvar a lista... Remove selected songs from playlist Remover músicas selecionadas da lista Remove all but selected songs from playlist Remover todas as músicas da lista, exceto as selecionadas Remove all songs from playlist Remover todas as músicas da lista PlaylistView &Crop playlist &Truncar a lista &Information... &Informações... J&ump to song... P&ular para a música... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U Ra&ndom play Reprod&ução aleatória &Remove R&emover Remove &all Remover t&udo Re&peat play Repetir a r&eprodução &Save playlist... S&alvar a lista... S&huffle playlist E&mbaralhar a lista Add to queue Adicionar à fila Remove from queue Remover da fila Focus playlist Focalizar a lista Save playlist as... Salvar a lista... Playlist name: Nome da lista: A playlist with that name already exists. Please use another name: Uma lista com esse nome já existe. Por favor use outro nome: Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Fil&ter: Filter the list of saved playlists Fil&tro: &Filter: Filter the contents of saved playlists &Filtro: Delete selected playlists Deletar as listas selecionadas D&elete playlists D&eletar listas PlaylistsView &Delete D&eletar PreferencesDialog Default style Estilo padrão Use system locale Usar a linguagem do sistema Connection Conexão Look and feel Aparência Library Biblioteca Directories Diretórios Playlist Lista de reprodução Icons Ícones Cover art Capas de álbuns Language Idioma Dynamic playlist Lista de reprodução dinâmica Notifications Notificações Shortcuts Atalhos Tag guesser Dedutor de tags Tray icon Ícone na bandeja Title Título Date Data Artist Artista Composer Compositor Album Álbum Filename Nome do arquivo Track Faixa URL URL Genre Gênero Styles Estilos bold negrito italic itálico Preferences Preferências Servers Servidores A&dd A&dicionar De&lete De&letar A&uto connect to first server on startup Conectar-se automaticamente a&o primeiro servidor na inicialização Connection &timeout: Timeout da cone&xão em: seconds segundos &Reconnect to MPD if connection is lost &Reconectar ao MPD se a conexão cair S&econds between reconnect attempts: Se&gundos entre tentativas de reconexão: Cross&fade on song change Cross&fade na mudança de faixa Cro&ssfade for: Cro&ssfade por: Output devices Dispositivos de saída Enabled Ativado Name Nome Double click action Ação no duplo clique &Play item R&eproduzir o item &Enqueue item C&olocar o item na fila A&lternating row colors Cores das filas a&lternadas A&uto resize columns Redi&mensionar colunas automaticamente Opa&que splitter resizing Redimensionamento opaco dos se&paradores Font: Fonte: C&hoose... E&scolher... Filter songs by... Filtrar faixas por... selected &artist and album &artista e álbum escolhidos selected al&bum only á&lbum somente &Show 'All' and 'Not tagged' (Slow) &Mostrar todos e 'não etiquetados' (lento) &Recursive directory view (Slow) Visão recurs&iva do diretório (lento) Title format Formato do título Title &format: For&mato do título: Center playing &song Centralizar a música sendo &tocada Show album c&over art Mostrar capa do á&lbum &Path to MPD music root: &Pasta-raiz das músicas do MPD: A&dd random songs to playlist Adici&onar faixas aleatórias à lista &When playing song (from end): &Quando tocando a música (contando a partir do fim): &Number of songs to add: &Número de faixas para adicionar: &Remove played songs from playlist R&emover músicas tocadas da lista Enable &translations Ativar t&raduções &Enable notifications A&tivar notificações &Notifier: &Notificador: &Show for: Mostrar po&r: Position Posição Bottom-right Em baixo à direita Desktop Desktop Right-middle No meio à direita Top-right Em cima à direita Bottom-middle No meio em baixo Top-middle No meio em cima Left-middle No meio à esquerda Top-left Em cima à esquerda Bottom-left Em baixo à esquerda &Enable tag guesser Ativar o &dedutor de tags &Guess pattern: Padrã&o de deduções: &Test filename: Nome de arquivo de &teste: %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = banda/artista %a = álbum %n = número da faixa %t = título %i = ignorar parte do nome do arquivo Guess results Resultados da dedução Track: Faixa: Title: Título: Album: Álbum: Artist: Artista: &Enable tray icon A&tivar ícone da bandeja Close button &minimizes to tray Botão de fechar minimiza para a &bandeja Start QMPDClient &hidden Iniciar o QMPDClient escondi&do &Close F&echar Last.Fm Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject No cover art found. Capa do álbum não encontrada. Directory This is used as the header of directory-tree in directory view Diretório Title Título Track Faixa Artist Artista Album Álbum Length Duração URL URL Filename Nome do arquivo Genre Gênero Date Data Comment Comentário Disc Disco Composer Compositor Performer Executada por Root This is the name of the root directory in the directory browser Diretório-base Playlist Lista de faixas Stream Stream Name Nome Address Endereço Port Porta Password Senha Action Ação Shortcut Atalho Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Não etiquetado All This is the first item in the artist and album views, meaning "All artists" or "All albums" Todos Not tagged Não etiquetado RadioPanel &Filter: Filter radio stations F&iltro: Add new radio station... Adicionar nova estáção de rádio... &New radio station... Nova &estação de rádio... Delete selected radio stations Deletar estações de rádio selecionadas D&elete radio stations D&eletar estações de rádio RadioView &New... N&ovo... &Delete &Deletar StringListView &Enqueue E&nfileirar &Information... I&nformação... &Play R&eproduzir TimeSlider Streaming Streaming TrayIcon Hide Esconder Show Mostrar Previuos Anterior Play Reproduzir Pause Pausar Stop Parar Next Próxima Quit Sair Volume Volume Not playing This is for the trayicon tooltip, indicating that no song is playing Não está tocando qmpdclient-1.2.2/lang/ru_RU.ts000066400000000000000000001470151157363675200162300ustar00rootroot00000000000000 AboutDialog About QMPDClient О программе QMPDClient &About &О программе A&uthors &Авторы &Thanks to &Благодарность &License agreement &Лицензионное соглашение &OK &OK AbstractView Not connected Нет соединения AddRadioDialog New radio station Новая радиостанция Title: Название: URL: Расположение: &OK &OK &Cancel О&тмена ControlPanel Not connected qmpdclient is not connected to MPD Нет соединения Skip to previous song in playlist (Ctrl+Page Up) На предыдущую песню (Ctrl+Page Up) Ctrl+PgUp Ctrl+PgUp Play (Ctrl+Insert) Играть (Ctrl+Insert) Ctrl+Ins Ctrl+Ins Pause (Ctrl+Home) Пауза (Ctrl+Home) Ctrl+Home Ctrl+Home Stop (Ctrl+End) Стоп (Ctrl+End) Ctrl+End Ctrl+End Skip to next song in playlist (Ctrl+Page Down) На следующую песню (Ctrl+Page Down) Ctrl+PgDown Ctrl+PgDown Adjust volume (Ctrl+Up/Down) Изменение громкости (Ctrl+Вверх/Вниз) 0:00 0:00 Seek in playing song (Ctrl+Left/Right) Перемотка проигрываемой песни (Ctrl+Влево/Вправо) Seek forward Перемотка вперед Seek backward Перемотка назад Increase volume Увеличить громкость Decrease volume Уменьшить громкость Skip to previous song К предыдущей песне Play Играть Pause Пауза Stop Стоп Skip to next song К следующей песне Lyrics Текст DirectoryPanel &Filter: &Фильтр: &Filter: Filter directory contents &Выбрать: DirectoryView &Enqueue &В очередь &Play &Играть &Rescan directory &Пересканировать каталог &Information... Сведени&я... JumpToSongDialog Jump to song Переход на песню &Filter: &Фильтр: &Jump &Переход &Cancel &Отмена LastFmSubmitter Will scrobble this track. Этот трек будет скробблен. Scrobbling %1 songs... Скробблинг композиций в количестве %1... Successfully scrobbled Скробблинг прошёл успешено Last.Fm authentication failed: check your credentials Аутентификация на Last.Fm завершилась ошибкой: проверьте свои данные Cannot submit to Last.Fm: system clock is skewed Немозможно отправить на Last.Fm: системное время искажено Now Playing sent Проигрываемая композиция отправлена на Last.Fm Last.Fm error: %1 Ошибка Last.Fm: %1 LibraryPanel &Artist filter: Фильтр по &исполнителю: Al&bum filter: Фильтр по &альбому: Son&g filter: Фильтр по &песне: LineEdit Clear the filter Очистить LyricsDialog Getting lyrics from server... Получение текста композиции с сервера... Dialog Диалог Artist Исполнитель Title Название Search Поиск MPDCache Reading albums Обновление альбомов Reading songs Обновление песен Filtering songs Выбор песен Caching songs Кэширование песен MPDConnection Could not connect to server Невозможно соединиться с сервером Authentication failed Соединение отклонено Could not connect to unix socket Невозможно соединиться с unix-сокетом Could not connect to server Невозможно соединиться с сервером MPDSongView &Enqueue В &очередь &Play &Воспроизведение &Information... Сведени&я... MainWindow &Playlist &Список &Library &Библиотека &Directories &Каталог &Internet Radio &Интернет-радио Pla&ylists &Списки Error Ошибка Ctrl+C Ctrl+C artists исполнителей albums альбомов songs песен days дней hours часов minutes минут Reading library Обновление библиотеки Done reading library Закончено обновление библиотеки &MPD &Музыкальный сервер &Connect to... С&оединиться с ... &Help &Справка &About... &О программе... About... О программе... Show about dialog... Показать справку о программе... F1 F1 About &Qt... Про &Qt... About Qt... Про Qt... Show about Qt dialog... Показать информацию о Qt... Shift+F1 Shift+F1 &Disconnect &Отключиться Disconnect from MPD server Отключиться от MPD-сервера Ctrl+D Ctrl+D &Rescan library &Пересмотреть библиотеку Rescan library Пересмотреть библиотеку Rescan songs and tag information Пересмотреть информацию о песнях и метках Ctrl+R Ctrl+R &Preferences... &Настройки... Preferences... Настройки... Open preferences dialog... Открыть диалог настроек... Ctrl+P Ctrl+P &Quit &Выход Quit QMPDClient Закрыть QMPDClient Ctrl+Q Ctrl+Q Minimize to tray Свернуть в трей Connect to first server Соединиться с первым сервером Done Завершено Disconnect from server Отключиться от сервера Rescan songs Пересмотреть песни Show preferences dialog... Показать диалог настроек... &Jump to current song &Перейти на текущий трек Jump to current song... Перейти на текущий трек... Ctrl+J Ctrl+J Connect to selected server Соединиться с выделенным сервером Show about QMPDClient dialog... Показать информацию о QMPDClient... L&ocate current song &Найти текущую песню Locate current song in library... Найти текущую песню в библиотеке... Ctrl+O Library: %1 %2, %3 %4, %5 %6. (%7 %8 %9 %10 %11 %12) Библиотека: %1 %2, %3 %4, %5 %6. (%7 %8 %9 %10 %11 %12) Playlist: Плейлист: %1 days, %1 дней, %1 hours, %1 часов, %1 minutes, %1 минут, %1 seconds. %1 секунд. MetaInfoDialog (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 из %2) File information Сведения о файле Genre: Жанр: Title: Название: Track #: Дорожка №: Artist: Исполнитель: Composer: Композитор: Length: Длина: URL: Расположение: Album: Альбом: Date: Дата: &Previous &Предыдущий &Next &Следующий &OK &OK Disc: Диск: Comment: Комментарий: Performer: Исполнитель: PlaylistPanel Toggle random mode Переключить случайный режим Toggle repeat playlist Переключить повторение списка Jump to song... Перейти к песне... Shuffle playlist Перемешать список Save playlist... Сохранить список... Remove selected songs from playlist Удалить выделенные песни из списка Remove all but selected songs from playlist Удалить невыделенные песни из списка Remove all songs from playlist Удалить все песни из списка Toggle dynamic playlist Переключить динамический плейлист PlaylistView J&ump to song... &Перейти к песне... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U &Remove &Удалить &Crop playlist &Обрезать список Remove &all Удалить &всё Ra&ndom play &Проигрывать вперемешку Re&peat play &Повторять S&huffle playlist &Случайный список &Save playlist... &Сохранить список... &Information... Сведени&я... Save playlist as... Сохранить список как... Playlist name: Название списка: A playlist with that name already exists. Please use another name: Список воспроизведения с таким названием существует. Пожалуйста используйте другое название: Add to queue Добавить в очередь Remove from queue Удалить из очереди Focus playlist Показать список Attention! Внимание! A playlist with that name already exists. Overwrite? Плейлист с таким именем уже существует. Перезаписать? Q This is the shortcut for 'Add to queue' Q PlaylistsPanel Fil&ter: &Фильтр: &Filter: &Выбрать: Delete selected playlists Удалить выделенный список D&elete playlists &Удалить список Fil&ter: Filter the list of saved playlists &Фильтр: &Filter: Filter the contents of saved playlists &Фильтр: PlaylistsView &Delete &Удалить PreferencesDialog Preferences Настройки Title Название Date Дата Artist Исполнитель Composer Композитор Album Альбом Filename Имя файла Track Дорожка URL Расположение Genre Жанр bold жирный italic курсив Preferences Dialog Настройки Connection Соединение Server settings Установки сервера Look and feel Внешний вид Playlist Список воспроизведения Language Язык Dynamic playlist Динамический список Notifications Уведомления Tag guesser Запрос по меткам Tray icon Значок в трее Servers Сервера A&dd &Добавить De&lete &Удалить A&uto connect to first server on startup &Автоматическое соединение с первым по списку сервером Connection &timeout: Задержка &подключения: seconds секунды &Reconnect to MPD if connection is lost &Соединиться с MPD при потере соединения S&econds between reconnect attempts: &Задержка переподключения: Cross&fade on song change &Задержка при смене песни Cro&ssfade for: &Задержка: Output devices Устройства вывода Enabled Задействовать Name Название Double click action Действие при двойном клике &Play item &Играть песню &Enqueue item Песню &в очередь A&lternating row colors Альтернативные цв&ета A&uto resize columns Автоматическая &ширина колонок Opa&que splitter resizing Видимое перемещение &разделителей &Recursive directory view Просмотр вложенных &каталогов Font: Шрифт: C&hoose... В&ыбор... Title format Формат заголовка Title &format: &Формат заголовка: Center playing &song &Центрировать играемую песню Enable &translations &Использовать перевод Use system locale Системные настройки языка Note: You need to restart QMPDClient for language changes to take effect. Важно: Вы должны перезапустить QMPDClient для того, что бы использовался перевод. A&dd random songs to playlist &Добавить случайную песню в список &When playing song (from end): &Проигрываемая песня (в конец): &Number of songs to add: Число песен для &добавления: &Remove played songs from playlist &Удалять прослушанную композицию из списка &Enable notifications &Включить уведомление &Show for: &Показывать: Position Положение Bottom-right Внизу справа Desktop Рабочий стол Right-middle Справа по середине Top-right Вверху справа Bottom-middle Внизу по середине Top-middle Вверху по середине Left-middle Слева по середине Top-left Вверху слева Bottom-left Внизу слева &Enable tag guesser &Включить запрос по меткам &Guess pattern: &Шаблон запроса: &Test filename: &Образец названия: %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Группа/Исполнитель %a = Альбом %n = Дорожка %t = Название %i = Игнорировать часть названия Guess results Результат запроса Track: Дорожка: Title: Название: Album: Альбом: Artist: Исполнитель: &Enable tray icon &Включить значок в трее Close button &minimizes to tray Кнопка закрыть &сворачивает в трей Start QMPDClient &hidden Запускать QMPDClient &свернутым &OK &OK &Apply &Применить &Cancel &Отмена Default style Стиль по умолчанию Library Библиотека Directories Каталог Icons Значки Cover art Обложка Shortcuts Ссылки Styles Стили Filter songs by... Выбрать песни по... selected &artist and album &Исполнтелю и альбому selected al&bum only &Альбому &Show 'All' and 'Not tagged' (Slow) Показывать "&Все" и "Без тэгов" (Медленно) &Recursive directory view (Slow) Просмотр вложенных &каталогов (Медленно) Show album c&over art Показывать &обложку альбома &Path to MPD music root: &Путь к каталогу с музыкой MPD: &Notifier: &Уведомитель: &Close &Закрыть Last.Fm &Fill up playlist with random songs &Заполнить список случайными композициями &When less than that songs left: &Когда до конца списка их не менее чем: Submit played songs to Last.Fm Отправлять проигрываемую композицию на Last.Fm Username: Пользователь: Password: Пароль: Max Height: Максимальная высота: 1024 1024 Max Width: Максимальная ширина: 768 768 Overwrite playlist if exist &Перезаписать список, если существует. &Overwrite playlist if exist &Перезаписать список, если существует Submit played song to Last.Fm Отправлять проигрываемую композицию на Last.Fm Double click / enter action Действие по двойному клику / Enter Disregard leading 'The ' when sorting Не обращать внимания на 'The ' в начале при сортировке Enable extended song info Включить дополнительную информацию о песне Submit played tracks to Last.Fm Передавать проигранные треки на Last.Fm Password Пароль Plain Открытым текстом MD5 MD5 Calculate MD5 Вычислить MD5 Timer Таймер Percent of song played: Процентов от песни проиграно: QObject Directory This is used as the header of directory-tree in directory view Каталог Playlist Список воспроизведения Stream Поток Title Название Track Дорожка Artist Исполнитель Album Альбом Length Длина URL Расположение Filename Имя файла Genre Жанр Date Дата Composer Композитор Root This is the name of the root directory in the directory browser Корень Name Название Host address Адрес Port Порт Password Пароль All This is the first item in the artist and album views, meaning "All artists" or "All albums" Все Not tagged This is the second item in the artist and album views, meaning "Files belonging to no artist or no albums" Не отмечено No cover art found. Обложка не найдена. Comment Комментарий Disc Диск Performer Исполнитель Address Адрес Action Действие Shortcut Ссылка Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Не отмечено Not tagged Не отмечено RadioPanel &Filter: &Фильтр: Add new radio station... Добавить новую радиостанцию... &New radio station... &Новая радиостанция... Delete selected radio stations Удалить выбранную радиостанцию D&elete radio stations &Удалить радиостанции &Filter: Filter radio stations &Фильтр: RadioView &New... &Новый... &Delete &Удалить StringListView &Enqueue &В очередь &Play &Играть &Information... Сведени&я... TimeSlider Streaming Поток TrayIcon Next Следующий Play Играть Pause Пауза Stop Стоп Previuos Предыдущий Quit Выход Not playing This is for the trayicon tooltip, indicating that no song is playing Не играет Hide Спрятать Show Показать Volume Громкость TraySongInfo Not playing Не играю from Means some song `from` some album с qmpdclient-1.2.2/lang/sv_SE.ts000066400000000000000000001563011157363675200162110ustar00rootroot00000000000000 AboutDialog About QMPDClient Om QMPDClient &About &Om A&uthors &Upphovsmän &Thanks to &Tack till &License agreement &Licens &OK &OK AbstractView Not connected Ej ansluten AddRadioDialog New radio station Ny radiostation Title: Titel: URL: URL: &OK &OK &Cancel &Avbryt ControlPanel Seek forward Spola framåt Seek backward Spola bakåt Increase volume Höj volymen Decrease volume Sänk volymen Not connected qmpdclient is not connected to MPD Ej ansluten Skip to previous song Hoppa till föregående spår Ctrl+PgUp Ctrl+PgUp Play Spela Ctrl+Ins Ctrl+Ins Pause Pausa Ctrl+Home Ctrl+Home Stop Stoppa Ctrl+End Ctrl+End Skip to next song Hoppa till nästa spår Ctrl+PgDown Ctrl+PgDown Lyrics DirectoryPanel &Filter: &Filter: &Filter: Filter directory contents &Filter: DirectoryView &Enqueue &Köa &Information... &Information... &Rescan directory &Genomsök katalog &Play &Spela JumpToSongDialog Jump to song Hoppa till låt &Filter: &Filter: &Jump &Hoppa &Cancel &Avbryt LibraryPanel &Artist filter: &Artistfilter: Al&bum filter: A&lbumfilter: Son&g filter: L&åtfilter: LineEdit Clear the filter Rensa filtret LyricsDialog Getting lyrics from server... Dialog Artist Artist Title Titel Search MPDCache Reading albums Läser album Reading songs Läser låtar Filtering songs Filtrerar låtar Caching songs Buffrar låtar MPDConnection Could not connect to server Authentication failed MPDSongView &Enqueue &Köa &Information... &Information... &Play &Spela MainWindow &Playlist &Spellista &Library &Bibliotek &Directories &Kataloger &Internet Radio &Internetradio Pla&ylists &Spellistor Minimize to tray Minimera till systemfält Error Fel Ctrl+C Ctrl+C artists artister albums album songs låtar days dagar hours timmar minutes minuter Done Klar &MPD &MPD &Connect to... &Anslut till... &Help &Hjälp &About... &Om... About... Om... F1 F1 About &Qt... Om &Qt... About Qt... Om Qt... Shift+F1 Shift+F1 &Disconnect &Koppla ifrån Disconnect from server Koppla ifrån server Ctrl+D Ctrl+D &Rescan library &Omsök bibliotek Rescan songs Omsök låtar Ctrl+R Ctrl+R &Preferences... &Inställningar... Show preferences dialog... Visa inställningar... Ctrl+P Ctrl+P &Quit &Avsluta Quit QMPDClient Avsluta QMPDClient Ctrl+Q Ctrl+Q Connect to first server MetaInfoDialog (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 av %2) File information Filinformation Track #: Spår #: Artist: Artist: Title: Titel: Date: Datum: Length: Längd: URL: URL: Composer: Kompositör: Album: Album: Genre: Genre: Disc: Skiva: Comment: Kommentar: Performer: Framförare: &Previous &Föregående &Next &Nästa &OK &OK PlaylistPanel Toggle random mode Växla slumpvis avspelning Toggle repeat playlist Växla repetera spellista Jump to song... Hoppa till låt... Shuffle playlist Blanda spellistan Save playlist... Spara spellistan... Remove selected songs from playlist Ta bort valda låtar från spellistan Remove all but selected songs from playlist Ta bort alla utom valda låtar från spellistan Remove all songs from playlist Ta bort alla låtar från spellistan PlaylistView &Crop playlist &Beskär spellistan &Information... &Information... J&ump to song... &Hoppa till låt... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U Ra&ndom play &Slumpvis avspelning &Remove &Ta bort Remove &all T&a bort alla Re&peat play &Upprepa låt &Save playlist... S&para spellista... S&huffle playlist &Blanda spellista Add to queue Lägg till i kön Remove from queue Ta bort från kön Focus playlist Fokusera spellista Save playlist as... Spara spellista som... Playlist name: Spellistnamn: A playlist with that name already exists. Please use another name: En spelista med det namnet existerar redan. Vänligen välj ett annat namn: Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Fil&ter: Fil&ter: &Filter: &Filter: Delete selected playlists Ta bort valda spellistor D&elete playlists &Ta bort spellistor Fil&ter: Filter the list of saved playlists Fil&ter: &Filter: Filter the contents of saved playlists &Filter: PlaylistsView &Delete &Ta bort PreferencesDialog Default style Standardstil Use system locale Använd systemets inställningar Connection Anslutning Look and feel Utseende Library Bibliotek Directories Kataloger Playlist Spellista Icons Ikoner Language Språk Dynamic playlist Dynamisk spellista Notifications Meddelande Shortcuts Genvägar Tag guesser Gissa etikett Tray icon Systemfältsikon Title Titel Date Datum Artist Artist Composer Kompositör Album Album Filename Filnamn Track Spår URL URL Genre Genre Styles Stil bold fet italic kursiv Preferences Inställningar Servers Servrar A&dd &Lägg till De&lete &Ta bort A&uto connect to first server on startup &Anslut automatiskt till den första servern vid uppstart Connection &timeout: A&nslutningstimeout: seconds sekunder &Reconnect to MPD if connection is lost &Återanslut till MPD om anslutning går ner S&econds between reconnect attempts: &Sekunder mellan återanslutningsförsök: Cross&fade on song change &Crossfade vid låtbyte Cro&ssfade for: C&rossfade för: Output devices Utmatningsenheter Enabled Påslagen Name Namn Double click action Dubbelklickshändelse &Play item &Spela upp post &Enqueue item &Köa post A&lternating row colors A&lternera radfärger A&uto resize columns A&utomatisk kolumnbredd Opa&que splitter resizing O&pak avdelarstorleksändring Font: Typsnitt: C&hoose... &Välj... Filter songs by... Filtrera låtar efter... selected &artist and album val&d artist och album selected al&bum only &endast valt album &Show 'All' and 'Not tagged' (Slow) V&isa 'Alla' och 'Ej etiketterade' (Långsamt) &Recursive directory view (Slow) &Rekursiv katalogvisning (Långsam) Title format Titelformat Title &format: &Titelformat: Center playing &song &Centrera aktuell låt A&dd random songs to playlist Lä&gg till slumpvisa låtar till spellista &When playing song (from end): &När låt spelar (från slutet): &Number of songs to add: Antal l&åtar att lägga till: &Remove played songs from playlist Ta &bort spelade låtar från spellista Enable &translations Aktivera &översättningar &Enable notifications &Aktivera notifieringar &Notifier: &Notifierare: &Show for: &Visa för: Position Position Bottom-right Nere-höger Desktop Skrivbord Right-middle Höger-mitten Top-right Uppe-höger Bottom-middle Nere-mitten Top-middle Uppe-mitten Left-middle Vänster-mitten Top-left Upp-vänster Bottom-left Nere-vänster &Enable tag guesser &Aktivera gissa etikett &Guess pattern: &Gissningsmönster: &Test filename: &Testfilnamn: %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Grupp/Artist %a = Album %n = Spårnummer %t = Titel %i = Ignorera del av filnamn Guess results Gissa resultat Track: Spår: Title: Titel: Album: Album: Artist: Artist: &Enable tray icon &Aktivera statusfältsikon Close button &minimizes to tray Stängknapp &minimerar till systemfält Start QMPDClient &hidden Starta QMPDClient &gömt &Close &Stäng Cover art Last.Fm Show album c&over art &Path to MPD music root: Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject Directory This is used as the header of directory-tree in directory view Katalog Title Titel Track Spår Artist Artist Album Album Length Längd URL URL Filename Filnamn Genre Genre Date Datum Comment Kommentar Disc Skiva Composer Kompositör Performer Framförare Root This is the name of the root directory in the directory browser Rot Playlist Spellista Stream Ström Name Namn Address Adress Port Port Password Lösenord Action Aktion Shortcut Genväg Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Ej etiketterad All This is the first item in the artist and album views, meaning "All artists" or "All albums" Alla No cover art found. Not tagged Ej etiketterad RadioPanel &Filter: &Filter: Add new radio station... Lägg till ny radiostation... &New radio station... &Ny radiostation... Delete selected radio stations Ta bort valda radiostationer D&elete radio stations &Ta bort radiostationer &Filter: Filter radio stations &Filter: RadioView &New... N&y... &Delete Ta &bort StringListView &Enqueue &Köa &Information... &Information... &Play &Spela TimeSlider Streaming Strömmande TrayIcon Hide Göm Show Visa Previuos Föregående Play Spela Pause Pausa Stop Stoppa Next Nästa Quit Avsluta Not playing This is for the trayicon tooltip, indicating that no song is playing Spelar inte Volume qmpdclient-1.2.2/lang/tr_TR.ts000066400000000000000000001574501157363675200162320ustar00rootroot00000000000000 AboutDialog About QMPDClient QMPDClient Hakkında &About H&akkında A&uthors &Yazarlar &Thanks to &Teşekkürler &License agreement &Lisans Anlaşması &OK &TAMAM AbstractView Not connected Bağlı değil AddRadioDialog New radio station Yeni radyo istasyonu Title: Başlık: URL: Adres: &OK &TAMAM &Cancel &İptal ControlPanel Seek forward İleri git Seek backward Geri git Increase volume Sesi yükselt Decrease volume Sesi alçalt Not connected qmpdclient is not connected to MPD Bağlı değil Skip to previous song Önceki parçaya geç Ctrl+PgUp Ctrl+PgUp Play Çal Ctrl+Ins Ctrl+Ins Pause Pause Ctrl+Home Ctrl+Home Stop Dur Ctrl+End Ctrl+End Skip to next song Sonraki parçaya geç Ctrl+PgDown Ctrl+PgDown Lyrics DirectoryPanel &Filter: &Filtrele: &Filter: Filter directory contents &Filtrele: DirectoryView &Enqueue &Kuyruğa ekle &Information... &Bilgiler... &Rescan directory &Dizini yeniden tara &Play &Çal JumpToSongDialog Jump to song Parçaya geç &Filter: &Filtrele: &Jump &Atla &Cancel &İptal LibraryPanel &Artist filter: &Sanatçı filtresi: Al&bum filter: &Albüm filtresi: Son&g filter: &Parça filtresi: LineEdit Clear the filter Filtreyi temizle LyricsDialog Getting lyrics from server... Dialog Artist Sanatçı Title Başlık Search MPDCache Reading albums Albümler okunuyor Reading songs Parçalar okunuyor Filtering songs Parçalar filtreleniyor Caching songs Parçalar önbelleğe alınıyor MPDConnection Could not connect to server Authentication failed MPDSongView &Enqueue &Kuyruğa ekle &Information... &Bilgiler... &Play &Çal MainWindow &Playlist &Parça Listesi &Library &Koleksiyon &Directories &Dizinler &Internet Radio &İnternet Radyosu Pla&ylists Parça Li&steleri Minimize to tray Sistem çekmecesine küçült Error Hata Ctrl+C Ctrl+C artists sanatçılar albums albümler songs parçalar days gün hours saat minutes dakika Done Tamam &MPD &MPD &Connect to... &Buraya bağlan... &Help &Yardım &About... H&akkında... About... Hakkında... F1 F1 About &Qt... &Qt Hakkında... About Qt... Qt Hakkında... Shift+F1 Shift+F1 &Disconnect &Bağlantıyı kes Disconnect from server Sunucudan bağlantıyı kes Ctrl+D Ctrl+D &Rescan library &Koleksiyonu yeniden tara Rescan songs Parçaları yeniden tara Ctrl+R Ctrl+R &Preferences... &Tercihler... Show preferences dialog... Tercihler penceresini göster... Ctrl+P Ctrl+P &Quit &Çık Quit QMPDClient QMPDClient Uygulamasından Çık Ctrl+Q Ctrl+Q Connect to first server MetaInfoDialog (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%2 nin %1 kadarı) File information Dosya bilgileri Track #: Parça #: Artist: Sanatçı: Title: Başlık: Date: Tarihi: Length: Uzunluk: URL: Adres: Composer: Besteci: Album: Albüm: Genre: Tür: Disc: Disk: Comment: Açıklama: Performer: Söyleyen: &Previous &Önceki &Next &Sonraki &OK &TAMAM PlaylistPanel Toggle random mode Rastgele kipine geç / rastgele kipinden çık Toggle repeat playlist Parça listesini tekrarla / tekrarlama Jump to song... Parçaya geç... Shuffle playlist Parça listesini karıştır Save playlist... Parça Listesini kaydet... Remove selected songs from playlist Seçilen parçaları parça listesinden sil Remove all but selected songs from playlist Seçilen parçalar hariç tümünü parça listesinden sil Remove all songs from playlist Tüm parçalar parça listesinden siliniyor PlaylistView &Crop playlist Parça listesini &kes &Information... &Bilgiler... J&ump to song... Parçaya &geç... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+G Ra&ndom play Ras&tgele çal &Remove &Sil Remove &all Tümünü k&aldır Re&peat play Tekra&rla &Save playlist... Parça liste&sini kaydet... S&huffle playlist Parça listesini karı&tır Add to queue Kuyruğa ekle Remove from queue Kuyruktan sil Focus playlist Parça listesini odakla Save playlist as... Parça Listesini farklı kaydet... Playlist name: Parça listesi adı: A playlist with that name already exists. Please use another name: Parça listesi adı zaten var. Lütfen başka bir isim seçin: Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Fil&ter: &Filtrele: &Filter: &Filtrele: Delete selected playlists Seçilen parça listelerini sil D&elete playlists Parça list&elerini sil Fil&ter: Filter the list of saved playlists &Filtrele: &Filter: Filter the contents of saved playlists &Filtrele: PlaylistsView &Delete &Sil PreferencesDialog Default style Öntanımlı biçim Use system locale Sistem yerelini kullan Connection Bağlantı Look and feel Görünüm ve tema Library Koleksiyon Directories Dizinler Playlist Parça Listesi Icons Simgeler Language Dil Dynamic playlist Değişken parça listesi Notifications Bildirimler Shortcuts Kısayollar Tag guesser Etiket tahminleyici Tray icon Sistem çekmecesi simgesi Title Başlık Date Tarih Artist Sanatçı Composer Besteci Album Albüm Filename Dosya adı Track Parça URL Adres Genre Tür Styles Biçimler bold kalın italic yatık Preferences Seçenekler Servers Sunucular A&dd &Ekle De&lete &Sil A&uto connect to first server on startup Başlangıçta ilk sunucuya &otomatik olarak bağlan Connection &timeout: Bağlantı &zaman aşımı: seconds saniye &Reconnect to MPD if connection is lost &Bağlantı koptuğunda MPD uygulamasına yeniden bağlan S&econds between reconnect attempts: Y&eniden bağlanma denemeleri için aralık: Cross&fade on song change Parça değiştirilirken bitme e&fekti ver Cro&ssfade for: Bunun için &bitme efekti: Output devices Çıktı aygıtları Enabled Etkin Name İsim Double click action Çift tıklama eylemi &Play item &Ögeyi çal &Enqueue item Ögeyi &kuyruğa ekle A&lternating row colors &Değişken satır renkleri A&uto resize columns &Sütunları otomatik olarak boyutlandır Opa&que splitter resizing &Mat ayırıcı yeniden boyutlandırması Font: Yazıtipi: C&hoose... Se&ç... Filter songs by... Parçaları buna göre filtrele... selected &artist and album seçilen s&anatçı ve albüm selected al&bum only sadece seçilen al&büm &Show 'All' and 'Not tagged' (Slow) 'Tümünü' ve 'Etiketlenmemiş olanları' &göster (Yavaş) &Recursive directory view (Slow) &Özyinelemeli dizin görünümü (Yavaş) Title format Başlık biçimi Title &format: Başlık &biçimi: Center playing &song Çalan parçayı &ortala A&dd random songs to playlist Parça &listesine rastgele parça ekle &When playing song (from end): Parça &çalınırken (sonundan): &Number of songs to add: Eklenecek parçanın &numarası: &Remove played songs from playlist Çalınan parçayı parça listesinden kaldı&r Enable &translations Çevirileri e&tkinleştir &Enable notifications Bildirimleri &etkinleştir &Notifier: &Bildirici: &Show for: &Göster: Position Konum Bottom-right Alt-sağ Desktop Masaüstü Right-middle Sağ-orta Top-right Üst-sağ Bottom-middle Alt-orta Top-middle Üst-orta Left-middle Sol-orta Top-left Üst-sol Bottom-left Alt-sol &Enable tag guesser &Etiket tahminleyicisini etkinleştir &Guess pattern: &Tahmin deseni: &Test filename: &Test dosyasının adı: %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Band/Sanatçı %a = Albüm %n = Parça numarası %t = Başlık %i = Dosya adının parçasını yoksay Guess results Tahmin sonuçları Track: Parça: Title: Başlık: Album: Albüm: Artist: Sanatçı: &Enable tray icon Sist&em çekmecesi simgesini etkinleştir Close button &minimizes to tray Kapatma düğmesi sistem çek&mecesine küçültsün Start QMPDClient &hidden QMPDClient uygulamasını &gizleyerek başlat &Close &Kapat Cover art Last.Fm Show album c&over art &Path to MPD music root: Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject Directory This is used as the header of directory-tree in directory view Dizin Title Başlık Track Parça Artist Sanatçı Album Albüm Length Uzunluk URL Adres Filename Dosya adı Genre Tür Date Tarih Comment Yorum Satırı Yap Disc Disk Composer Besteci Performer Söyleyen Root This is the name of the root directory in the directory browser Kök Playlist Parça Listesi Stream Yayın Name İsim Address Adres Port Port Password Parola Action Davranış Shortcut Kısayol Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Etiketlenmemiş All This is the first item in the artist and album views, meaning "All artists" or "All albums" Tümü No cover art found. Not tagged Etiketlenmemiş RadioPanel &Filter: &Filtrele: Add new radio station... Yeni radyo istasyonu ekle... &New radio station... Ye&ni radyo istasyonu... Delete selected radio stations Seçilen radyo istasyonunu sil D&elete radio stations Radyo istasyonlarını &sil &Filter: Filter radio stations &Filtrele: RadioView &New... &Yeni... &Delete &Sil StringListView &Enqueue &Kuyruğa ekle &Information... &Bilgiler... &Play &Çal TimeSlider Streaming Yayınlanıyor TrayIcon Hide Gizle Show Göster Previuos Önceki Play Çal Pause Pause Stop Dur Next Sonraki Quit Çık Not playing This is for the trayicon tooltip, indicating that no song is playing Çalmıyor Volume qmpdclient-1.2.2/lang/uk_UA.ts000066400000000000000000001645061157363675200162040ustar00rootroot00000000000000 AboutDialog About QMPDClient Про QMPDClient &About &Про A&uthors &Автори &Thanks to П&одяки &License agreement &Ліцензійна угода &OK &Гаразд AbstractView Not connected Не з'єднаний AddRadioDialog New radio station Нова радіостанція Title: Назва: URL: Адреса: &OK &Гаразд &Cancel &Скасувати ControlPanel Seek forward Шукати попереду Seek backward Шукати позаду Increase volume Збільшити гучність Decrease volume Зменшити гучність Not connected qmpdclient is not connected to MPD Не з'єднаний Skip to previous song Пропустити попередню пісню Ctrl+PgUp Ctrl+PgUp Play Грати Ctrl+Ins Ctrl+Ins Pause Призупинити Ctrl+Home Ctrl+Home Stop Зупинити Ctrl+End Ctrl+End Skip to next song Пропустити до наступної пісні Ctrl+PgDown Ctrl+PgDown Lyrics DirectoryPanel &Filter: Filter directory contents &Фільтр: DirectoryView &Enqueue &Додати в чергу &Information... &Інформація... &Rescan directory &Переглянути теку &Play &Грати JumpToSongDialog Jump to song Перейти до пісні &Filter: &Фільтр: &Jump &Перейти &Cancel &Скасувати LibraryPanel &Artist filter: &Фільтр артистів: Al&bum filter: Фільтр &альбомів: Son&g filter: Фільтр &пісень: LineEdit Clear the filter Очистити фільтр LyricsDialog Getting lyrics from server... Dialog Artist Артист Title Назва Search MPDCache Reading albums Читаються альбоми Reading songs Читаються пісні Filtering songs Фільтруються пісні Caching songs Кешуються пісні MPDConnection Could not connect to server Неможливо з'єднатись з сервером Authentication failed Аутентифікація не вдалась MPDSongView &Enqueue &Додати в чергу &Information... &Інформація... &Play &Грати MainWindow &Playlist &Перелік програвання &Library &Збірка &Directories &Теки &Internet Radio &Інтернет радіо Pla&ylists П&ереліки програвання Minimize to tray Зменшити до системного лотка Error Помилка Connect to first server З'єднатись з першим сервером Ctrl+C Ctrl+C artists артисти albums альбоми songs пісні days дб hours год minutes хв Done Виконано &MPD &MPD &Connect to... &З'єднатись з... &Help &Допомога &About... &Про... About... Про... F1 F1 About &Qt... Про &Qt... About Qt... Про Qt... Shift+F1 Shift+F1 &Disconnect &Від'єднатись Disconnect from server Від'єднатись від сервера Ctrl+D Ctrl+D &Rescan library &Переглянути збірку Rescan songs Переглянути пісні Ctrl+R Ctrl+R &Preferences... &Налаштування... Show preferences dialog... Показати діалог налаштувань... Ctrl+P Ctrl+P &Quit &Вийти Quit QMPDClient Вийти з QMPDClient Ctrl+Q Ctrl+Q MetaInfoDialog (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%1 з %2) File information Інформація файлу Track #: Доріжка №: Artist: Артист: Title: Назва: Date: Рік: Length: Довжина: URL: URL: Composer: Композитор: Album: Альбом: Genre: Жанр: Disc: Диск: Comment: Коментар: Performer: Виконавець: &Previous &Попередня &Next &Наступна &OK &Гаразд PlaylistPanel Toggle random mode Змінити випадковий режим Toggle repeat playlist Змінити повторення переліку програвання Jump to song... Перейти до пісні... Shuffle playlist Перемішати перелік програвання Save playlist... Зберегти перелік програвання... Remove selected songs from playlist Вилучити вибрані пісні з переліку програвання Remove all but selected songs from playlist Вилучити всі окрім вибраних пісень з переліку програвання Remove all songs from playlist Вилучити всі пісні з переліку програвання PlaylistView &Crop playlist &Вирізати перелік програвання &Information... &Інформація... J&ump to song... &Перейти до пісні... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U Ra&ndom play &Випадкове програвання &Remove &Вилучити Remove &all Вилучити &все Re&peat play &Повторити програвання &Save playlist... &Зберегти перелік програвання... S&huffle playlist &Перемішати перелік програвання Add to queue Додати до черги Remove from queue Вилучити з черги Focus playlist Зосередитись на переліку програвання Save playlist as... Зберегти перелік програвання як... Playlist name: Назва переліку програвання: A playlist with that name already exists. Please use another name: Вже існує перелік програвання з такою назвою. Будь ласка, змініть назву: Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Fil&ter: Filter the list of saved playlists &Фільтр: &Filter: Filter the contents of saved playlists &Фільтр: Delete selected playlists Вилучити вибрані переліки програвання D&elete playlists &Вилучити переліки програвання PlaylistsView &Delete &Вилучити PreferencesDialog Default style Стиль за замовчуванням Use system locale Використовувати системну мову Connection З'єднання Look and feel Зовнішній вигляд Library Збірка Directories Теки Playlist Перелік програвання Icons Піктограми Cover art Обкладинки Language Мова Dynamic playlist Динамічний перелік програвання Notifications Сповіщення Shortcuts Скорочення Tag guesser Вгадування теґів Tray icon Піктограма в системному лотку Title Назва Date Рік Artist Артист Composer Композитор Album Альбом Filename Назва файлу Track Доріжка URL URL Genre Жанр Styles Стиль bold жирний italic курсив Preferences Налаштування Servers Сервер A&dd &Додати De&lete &Видалити A&uto connect to first server on startup &Автоматично з'єднуватись з першим сервером після запуску Connection &timeout: &Час очікування на з'єднання: seconds с &Reconnect to MPD if connection is lost &Перез'єднатись з MPD, якщо з'єднання втрачене S&econds between reconnect attempts: &Час між спробами з'єднання (с): Cross&fade on song change &Змішування пісень при зміні Cro&ssfade for: З&мішувати для: Output devices Пристрої виведення Enabled Ввімкнено Name Назва Double click action Дія на подвійне клацання &Play item &Грати елемент &Enqueue item &Додати елемент до черги A&lternating row colors &Альтернативні кольори рядків A&uto resize columns А&втоматично змінювати розмір стовпців Opa&que splitter resizing &Робити роздільник непрозорим під час зміни розміру Font: Шрифт: C&hoose... &Вибрати... Filter songs by... Фільтрувати пісні по... selected &artist and album вибрані &артист та альбом selected al&bum only тільки вибраний а&льбом &Show 'All' and 'Not tagged' (Slow) &Показати 'Всі' та 'Нерозпізнані' (повільно) &Recursive directory view (Slow) &Переглядати теки рекурсивно (повільно) Title format Формат назви Title &format: &Формат назви: Center playing &song &Показувати посередині пісню, що грає Show album c&over art Показувати &обкладинки альбомів &Path to MPD music root: &Шлях до кореню музики MPD: A&dd random songs to playlist &Додати випадкові пісні до переліку &When playing song (from end): &Коли грає пісня (з кінця): &Number of songs to add: &Номер пісні, яку необхідно додати: &Remove played songs from playlist &Вилучити програні пісні з переліку Enable &translations &Ввімкнути переклади &Enable notifications &Ввімкнути сповіщення &Notifier: &Сповіщувач: &Show for: &Показувати: Position Місцезнаходження Bottom-right Зверху праворуч Desktop Стільниця Right-middle Праворуч посередині Top-right Праворуч зверху Bottom-middle Знизу посередині Top-middle Зверху посередині Left-middle Ліворуч посередині Top-left Зверху ліворуч Bottom-left Знизу ліворуч &Enable tag guesser &Ввімкнути вгадування теґів &Guess pattern: &Шаблон для вгадування: &Test filename: &Тестова назва файлу: %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = Група/Артист %a = Альбом %n = Номер доріжки %t = Назва %i = Ігнорована частина назви Guess results Наслідки вгадування Track: Доріжка: Title: Назва: Album: Альбом: Artist: Артист: &Enable tray icon &Ввімкнути піктограму в системному лотку Close button &minimizes to tray &Закриття зменшує до системного лотка Start QMPDClient &hidden &Запустити QMPDClient схованим &Close &Закрити Last.Fm Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject No cover art found. Не знайдено обкладинки. Directory This is used as the header of directory-tree in directory view Тека Title Назва Track Доріжка Artist Артист Album Альбом Length Довжина URL URL Filename Назва файлу Genre Жанр Date Рік Comment Коментар Disc Диск Composer Композитор Performer Виконавець Root This is the name of the root directory in the directory browser Корінь Playlist Перелік програвання Stream Потік Name Назва Address Адреса Port Порт Password Пароль Action Дія Shortcut Скорочення Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" Без теґів All This is the first item in the artist and album views, meaning "All artists" or "All albums" Всі Not tagged Без теґів RadioPanel &Filter: Filter radio stations &Фільтр: Add new radio station... Додати нову радіостанцію... &New radio station... &Нова радіостанція... Delete selected radio stations Вилучити вибрані радіостанції D&elete radio stations &Вилучити радіостанції RadioView &New... &Нова... &Delete &Видалити StringListView &Enqueue &Додати в чергу &Information... &Інформація... &Play &Грати TimeSlider Streaming Потік TrayIcon Hide Сховати Show Показати Previuos Попередня Play Грати Pause Наступна Stop Зупинити Next Наступна Quit Вийти Volume Гучність Not playing This is for the trayicon tooltip, indicating that no song is playing Не грати qmpdclient-1.2.2/lang/zh_CN.ts000066400000000000000000001565011157363675200161750ustar00rootroot00000000000000 AboutDialog About QMPDClient 关于 QMPDClient &About 关于(&A) A&uthors 作者(&U) &Thanks to 致谢(&T) &License agreement 许可协议(&L) &OK 确定(&O) AbstractView Not connected 未连接至MPD服务器 AddRadioDialog New radio station 新建在线电台 Title: 标题: URL: URL: &OK 确定(&O) &Cancel 取消(&C) ControlPanel Seek forward 快进 Seek backward 快退 Increase volume 增加音量 Decrease volume 减小音量 Not connected qmpdclient is not connected to MPD 未连接至MPD服务器 Skip to previous song 上一首 Ctrl+PgUp Play 播放 Ctrl+Ins Pause 暂停 Ctrl+Home Stop 停止 Ctrl+End Skip to next song 下一首 Ctrl+PgDown Lyrics DirectoryPanel &Filter: 过滤器(&F): &Filter: Filter directory contents 过滤器(&F): DirectoryView &Enqueue 队列(&E) &Information... 信息(&I)... &Rescan directory 重新扫描目录(&R) &Play 播放(&P) JumpToSongDialog Jump to song 跳转至歌曲 &Filter: 过滤器(&F): &Jump 跳转(&J) &Cancel 取消(&C) LibraryPanel &Artist filter: 艺术家过滤器(&A): Al&bum filter: 专辑过滤器(&B): Son&g filter: 歌曲过滤器(&G): LineEdit Clear the filter 清空过滤器 LyricsDialog Getting lyrics from server... Dialog Artist 艺术家 Title 标题 Search MPDCache Reading albums 正在读取专辑 Reading songs 正在读取歌曲 Filtering songs 正在过滤歌曲 Caching songs 正在缓存歌曲 MPDConnection Could not connect to server Authentication failed MPDSongView &Enqueue 队列(&E) &Information... 信息(&I)... &Play 播放(&P) MainWindow &Playlist 播放列表(&P) &Library 歌曲库(&L) &Directories 文件目录(&D) &Internet Radio 在线电台(&I) Pla&ylists 播放列表(&Y) Minimize to tray 最小化到托盘 Error 错误 Ctrl+C artists 艺术家 albums 专辑 songs 歌曲 days hours minutes Done 完成 &MPD &MPD &Connect to... 连接至(&C)... &Help 帮助(&H) &About... 关于(&A) About... 关于 F1 About &Qt... 关于QT(&Q) About Qt... 关于QT Shift+F1 &Disconnect 断开(&D) Disconnect from server 从服务器断开 Ctrl+D &Rescan library 重新扫描歌曲库(&R) Rescan songs 重新扫描歌曲 Ctrl+R &Preferences... 首选项(&P) Show preferences dialog... 显示首选项对话框 Ctrl+P &Quit 退出(&Q) Quit QMPDClient 退出 QMPDClient Ctrl+Q Connect to first server MetaInfoDialog (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%2个 中的 %1个) File information 文件信息 Track #: 音轨 #: Artist: 艺术家: Title: 标题: Date: 日期: Length: 长度: URL: URL: Composer: 作曲: Album: 专辑: Genre: 流派: Disc: 光盘: Comment: 备注: Performer: 发行者: &Previous 上一首(&P) &Next 下一首(&N) &OK 确定(&O) PlaylistPanel Toggle random mode 切换至随机模式 Toggle repeat playlist 切换至重复播放列表 Jump to song... 跳转至歌曲... Shuffle playlist 乱序播放列表 Save playlist... 保存播放列表... Remove selected songs from playlist 移除选中的歌曲 Remove all but selected songs from playlist 移除除选中外的歌曲 Remove all songs from playlist 移除所有歌曲 PlaylistView &Crop playlist 移除其他歌曲(&C) &Information... 信息(&I)... J&ump to song... 跳转至歌曲(&J)... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ra&ndom play 随机播放(&N) &Remove 移除(&R) Remove &all 移除全部(&A) Re&peat play 重复播放(&P) &Save playlist... 保存播放列表(&S) S&huffle playlist 乱序播放列表(&H) Add to queue 添加到队列 Remove from queue 从队列中移除 Focus playlist 激活播放列表 Save playlist as... 播放列表另存为... Playlist name: 播放列表名称: A playlist with that name already exists. Please use another name: 同名播放列表已存在 请选择其他名字: Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Fil&ter: 过滤器:(&T) &Filter: 过滤器(&F): Delete selected playlists 删除选中的播放列表 D&elete playlists 删除播放列表(&E) Fil&ter: Filter the list of saved playlists 过滤器:(&T) &Filter: Filter the contents of saved playlists 过滤器(&F): PlaylistsView &Delete 删除(&D) PreferencesDialog Default style 默认风格 Use system locale 使用系统语言设置 Connection 连接 Look and feel 外观与样式 Library 歌曲库 Directories 文件目录 Playlist 播放列表 Icons 图标 Language 语言 Dynamic playlist 动态播放列表 Notifications 通知区域 Shortcuts 快捷键 Tag guesser 自动命名器 Tray icon 通知区域图标 Title 标题 Date 日期 Artist 艺术家 Composer 作曲 Album 专辑 Filename 文件名 Track 音轨 URL URL Genre 流派 Styles 风格 bold 粗体 italic 斜体 Preferences 首选项 Servers 服务器列表 A&dd 添加(&D) De&lete 删除(&L) A&uto connect to first server on startup 启动时自动连接到第一个服务器(&U) Connection &timeout: 连接超时(&T): seconds &Reconnect to MPD if connection is lost 失去到MPD的连接时自动重连(&R) S&econds between reconnect attempts: 重连间隔(秒)(&E): Cross&fade on song change 改变歌曲时淡入淡出(&F) Cro&ssfade for: 淡入淡出(&S): Output devices 输出设备 Enabled 允许 Name 名称 Double click action 双击动作 &Play item 播放选中的(&P) &Enqueue item 队列选中的(&E) A&lternating row colors 交替列颜色(&L) A&uto resize columns 自动改变列大小 Opa&que splitter resizing 不透明改变布局大小(&Q) Font: 字体: C&hoose... 选择(&H)... Filter songs by... 用...过滤歌曲 selected &artist and album 选择艺术家与专辑 selected al&bum only 只选择专辑 &Show 'All' and 'Not tagged' (Slow) 显示"全部"和"未标记"的(慢)(&S) &Recursive directory view (Slow) 递归显示目录(慢)(&R) Title format 标题格式 Title &format: 标题格式(&F): Center playing &song 居中播放中的歌曲(&S) A&dd random songs to playlist 随机添加歌曲至播放列表(&D) &When playing song (from end): 播放歌曲时(从尾部)(&W): &Number of songs to add: 添加歌曲数量(&N): &Remove played songs from playlist 从列表中移除已播放歌曲(&R) Enable &translations 开启多语言支持(&T) &Enable notifications 允许提示(&E) &Notifier: 通知(&E): &Show for: 在以下情况显示(&S): Position 位置: Bottom-right 右下角 Desktop 桌面 Right-middle 右居中 Top-right 右上角 Bottom-middle 下居中 Top-middle 上居中 Left-middle 左居中 Top-left 左上角 Bottom-left 左下角 &Enable tag guesser 允许自动命名器(&E) &Guess pattern: 自动命名规则(&G): &Test filename: 测试文件名(&T): %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = 乐队/艺术家 %a = 专辑 %n = 音轨编号 %t = 标题 %i = 忽略部分文件名 Guess results 自动命名结果 Track: 音轨: Title: 标题: Album: 专辑: Artist: 艺术家: &Enable tray icon 允许托盘图标(&E) Close button &minimizes to tray 关闭时最小化到托盘(&M) Start QMPDClient &hidden 启动时隐藏主窗口(&H) &Close 关闭(&C) Cover art Last.Fm Show album c&over art &Path to MPD music root: Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject Directory This is used as the header of directory-tree in directory view 目录 Title 标题 Track 音轨 Artist 艺术家 Album 专辑 Length 长度 URL URL Filename 文件名 Genre 流派 Date 日期 Comment 注释 Disc 光盘 Composer 作曲 Performer 发行者: Root This is the name of the root directory in the directory browser 根目录 Playlist 播放列表 Stream 音频流 Name 名称 Address 地址 Port 端口 Password 密码 Action 动作 Shortcut 快捷键 Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" 无音轨信息 All This is the first item in the artist and album views, meaning "All artists" or "All albums" 全部 No cover art found. Not tagged 无音轨信息 RadioPanel &Filter: 过滤器(&F): Add new radio station... 添加新在线电台 &New radio station... 新在线电台(&N) Delete selected radio stations 删除选择的电台 D&elete radio stations 删除在线电台(&E) &Filter: Filter radio stations 过滤器(&F): RadioView &New... 新建(&N)... &Delete 删除(&D) StringListView &Enqueue 队列(&E) &Information... 信息(&I)... &Play 播放(&P) TimeSlider Streaming TrayIcon Hide 隐藏 Show 显示 Previuos 上一首 Play 播放 Pause 暂停 Stop 停止 Next 下一首 Quit 退出 Not playing This is for the trayicon tooltip, indicating that no song is playing 停止中 Volume qmpdclient-1.2.2/lang/zh_TW.ts000066400000000000000000001566531157363675200162370ustar00rootroot00000000000000 AboutDialog About QMPDClient 關於 QMPDClient &About 關於(&A) A&uthors 作者(&U) &Thanks to 感謝(&T) &License agreement 授權宣告(&L) &OK 關閉(&O) AbstractView Not connected 尚未連線 AddRadioDialog New radio station 新網路電台 Title: 標題: URL: 網址: &OK 確定(&O) &Cancel 取消(&C) ControlPanel Skip to previous song 上一曲目 Ctrl+PgUp Ctrl+PgUp Play 播放 Ctrl+Ins Ctrl+Ins Pause 暫停 Ctrl+Home Ctrl+Home Stop 停止 Ctrl+End Ctrl+End Skip to next song 下一曲目 Ctrl+PgDown Ctrl+PgDown Seek forward 前進 Seek backward 後退 Increase volume 增加音量 Decrease volume 減少音量 Not connected qmpdclient is not connected to MPD 尚未連線 Lyrics DirectoryPanel &Filter: 過濾器(&F): &Filter: Filter directory contents 過濾器(&F): DirectoryView &Enqueue 加入播放清單(&E) &Information... 曲目資訊(&I)... &Rescan directory 重新掃描資料夾(&R) &Play 播放(&P) JumpToSongDialog Jump to song 指定播放 &Filter: 過濾器(&F): &Jump 確定(&J) &Cancel 取消(&C) LibraryPanel &Artist filter: 藝人過濾器(&A): Al&bum filter: 專輯過濾器(&B): Son&g filter: 曲目過濾器(&G): LineEdit Clear the filter 清除此項過濾 LyricsDialog Getting lyrics from server... Dialog Artist 藝人 Title 標題 Search MPDCache Reading songs 曲目讀取 Caching songs 曲目快取 Reading albums 專輯讀取 Filtering songs 曲目過濾 MPDConnection Could not connect to server Authentication failed MPDSongView &Enqueue 加入播放清單(&E) &Information... 曲目資訊(&I)... &Play 播放(&P) MainWindow &MPD MPD(&M) &Connect to... 連線到(&C)... &Help 說明(&H) &About... 關於(&A)... About... 關於... F1 F1 About &Qt... 關於 Qt(&Q)... About Qt... 關於 Qt... Shift+F1 Shift+F1 &Disconnect 中斷連線(&D) Disconnect from server 中斷與伺服器的連線 Ctrl+D Ctrl+D &Rescan library 重新掃描音樂庫(&R) Rescan songs 重新掃描曲目 Ctrl+R Ctrl+R &Preferences... 設定(&P)... Show preferences dialog... 顯示設定對話框... Ctrl+P Ctrl+P &Quit 離開(&Q) Quit QMPDClient 離開 QMPDClient Ctrl+Q Ctrl+Q &Playlist 播放清單(&P) &Library 音樂庫(&L) &Directories 資料夾(&D) &Internet Radio 網路電台(&I) Pla&ylists 播放清單(&Y) Minimize to tray 最小化到系統匣 Error 錯誤 Ctrl+C Ctrl+C artists 位藝人 albums 張專輯 songs 首歌曲 days hours 小時 minutes 分鐘 Done 完成 Connect to first server MetaInfoDialog File information 檔案資訊 Track #: 曲目號: Artist: 藝人: Title: 標題: Date: 年份: Length: 長度: URL: 位置: Composer: 作曲者: Album: 專輯: Genre: 風格: Disc: 碟片編號: Comment: 評論: Performer: 表演者: &Previous 上一曲目(&P) &Next 下一曲目(&N) &OK 關閉(&O) (%1 of %2) This is used in the context 'File number (%1 of %2)'. (%2 之 %1) PlaylistPanel Toggle random mode 隨機播放 Toggle repeat playlist 重覆播放 Jump to song... 指定播放... Shuffle playlist 重新排列 Save playlist... 儲存播放清單... Remove selected songs from playlist 移除選取的曲目 Remove all but selected songs from playlist 移除未選取的曲目 Remove all songs from playlist 移除全部曲目 PlaylistView &Crop playlist 移除未選取(&C) &Information... 曲目資訊(&I)... J&ump to song... 指定播放(&U)... Ctrl+U This is the shortcut for 'Jump to song in playlist' Ctrl+U Ra&ndom play 隨機播放(&N) &Remove 移除(&R) Remove &all 移除全部(&A) Re&peat play 重覆播放(&P) &Save playlist... 儲存播放清單(&S)... S&huffle playlist 重新排列(&H) Add to queue 放入播放佇列 Remove from queue 從播放佇列中移除 Focus playlist 焦點移至播放清單 Save playlist as... 另存播放清單為... Playlist name: 播放清單名稱: A playlist with that name already exists. Please use another name: 已有相同名稱的播放清單。 請使用其他名稱: Attention! A playlist with that name already exists. Overwrite? PlaylistsPanel Fil&ter: 過濾器(&T): &Filter: 過濾器(&F): Delete selected playlists 移除選取的播放清單 D&elete playlists 移除播放清單(&E) Fil&ter: Filter the list of saved playlists 過濾器(&T): &Filter: Filter the contents of saved playlists 過濾器(&F): PlaylistsView &Delete 移除(&D) PreferencesDialog Preferences 設定 Servers 伺服器 A&dd 新增(&D) De&lete 刪除(&L) A&uto connect to first server on startup 啟動時自動連線到首個伺服器(&U) Connection &timeout: 連線等待時間(&T): seconds &Reconnect to MPD if connection is lost 中斷時,重新連線到 MPD(&R) S&econds between reconnect attempts: 嘗試連線的間隔秒數(&S): Cross&fade on song change 變換曲目時使用淡出淡入(&F) Cro&ssfade for: 淡出淡入(&S): Output devices 輸出設備 Enabled 已啟用 Name 名稱 Double click action 雙擊滑鼠行為 &Play item 播放(&P) &Enqueue item 加入播放清單(&E) A&lternating row colors 每列交替用色(&L) A&uto resize columns 自動縮放分欄(&A) Opa&que splitter resizing 分隔線移動時顯示視窗內容(&Q) Font: 字型: C&hoose... 選擇(&H)... Filter songs by... 以哪種方式過濾曲目... selected &artist and album 以選取的藝術家與專輯(&A) selected al&bum only 只以選取的專輯(&B) &Show 'All' and 'Not tagged' (Slow) 顯示「全部」與「未標籤」(慢)(&S) &Recursive directory view (Slow) 迴遞檢視資料夾(慢)(&R) Title format 標題格式 Title &format: 標題格式(&F): Center playing &song 置中顯示播放曲目(&S) A&dd random songs to playlist 新增隨機曲目到播放清單(&D) &When playing song (from end): 在播放倒數第幾首時新增(&W): &Number of songs to add: 新增曲目數量(&N): &Remove played songs from playlist 將播放過的曲目移出播放清單(&R) Enable &translations 啟用翻譯(&T) &Enable notifications 啟用通知訊息(&E) &Notifier: 通知器(&N): &Show for: 顯示時間(&S): Position 顯示位置 Bottom-right 右下 Desktop 桌面 Right-middle 右中 Top-right 右上 Bottom-middle 正下 Top-middle 正上 Left-middle 左中 Top-left 左上 Bottom-left 左下 &Enable tag guesser 啟用標籤推測(&E) &Guess pattern: 推測樣式(&G): &Test filename: 測試檔名(&T): %b = Band/Artist %a = Album %n = Track number %t = Title %i = Ignore part of file name %b = 樂團/藝人 %a = 專輯 %n = 曲目號 %t = 標題 %i = 檔案名稱忽略部份 Guess results 推測結果 Track: 曲目號: Title: 標題: Album: 專輯: Artist: 藝人: &Enable tray icon 啟用系統匣圖示(&E) Close button &minimizes to tray 按關閉鈕時最小化到系統匣(&M) Start QMPDClient &hidden 啟動 QMPDClient 後隱藏播放器(&H) &Close 關閉(&C) Default style 預設風格 Use system locale 使用系統環境設置 Connection 連線 Look and feel 外觀 Library 音樂庫 Directories 資料夾 Playlist 播放清單 Icons 圖示 Language 語言 Dynamic playlist 動態播放清單 Notifications 通知訊息 Shortcuts 快捷鍵 Tag guesser 標籤推測 Tray icon 系統匣圖示 Title 標題 Date 年份 Artist 藝人 Composer 作曲者 Album 專輯 Filename 檔案名稱 Track 曲目號 URL 位置 Genre 風格 Styles 風格 bold 粗體 italic 斜體 Cover art Last.Fm Show album c&over art &Path to MPD music root: Max Height: Max Width: &Fill up playlist with random songs &When less than that songs left: Submit played songs to Last.Fm Username: Password: QObject Directory This is used as the header of directory-tree in directory view 資料夾 Title 標題 Track 曲目號 Artist 藝人 Album 專輯 Length 長度 URL 位置 Filename 檔案名稱 Genre 風格 Date 年份 Comment 評論 Disc 碟片編號 Composer 作曲者 Performer 表演者 Root This is the name of the root directory in the directory browser 音樂庫 Playlist 播放清單 Stream 串流 Name 名稱 Address 位址 Port 埠號 Password 密碼 Action 動作 Shortcut 快捷鍵 Not tagged This is the second item in the artist and album views, meaning "Songs belonging to no artist or no albums" 未標籤 All This is the first item in the artist and album views, meaning "All artists" or "All albums" 全部 No cover art found. Not tagged 未標籤 RadioPanel &Filter: 過濾器(&F): Add new radio station... 增加一個新的網路電台... &New radio station... 新增網路電台(&N)... Delete selected radio stations 移除選取的網路電台 D&elete radio stations 移除網路電台(&D) &Filter: Filter radio stations 過濾器(&F): RadioView &New... 新增(&N)... &Delete 移除(&D) StringListView &Enqueue 加入播放清單(&E) &Information... 曲目資訊(&I)... &Play 播放(&P) TimeSlider Streaming 讀取串流 TrayIcon Hide 隱藏播放器 Show 顯示播放器 Previuos 上一曲目 Play 播放 Pause 暫停 Stop 停止 Next 下一曲目 Quit 離開 Not playing This is for the trayicon tooltip, indicating that no song is playing 未播放歌曲 Volume qmpdclient-1.2.2/qmpdclient.desktop000066400000000000000000000002711157363675200174260ustar00rootroot00000000000000[Desktop Entry] Type=Application Name=QMPDClient GenericName=Qt4 based MPD client Comment=A nicer MPD client Exec=qmpdclient Categories=Qt;Network;Music; Icon=qmpdclient Terminal=false qmpdclient-1.2.2/qmpdclient.pro000066400000000000000000000163621157363675200165650ustar00rootroot00000000000000# installation prefix on *nix/osx PREFIX = /usr/local # Most people need not muck about below here #!contains(QT_MAJOR_VERSION, 4):error(QMPDClient requires Qt 4) CONFIG += qt debug # addition ldflags for release build QMAKE_LFLAGS_RELEASE += -O2 -g0 -s # CONFIG -= debug # Needed to avoid console on win32 TEMPLATE = app RESOURCES = qmpdclient.qrc VERSION = 1.2.2 DEFINES += NAMEVER='"\\"QMPDClient \ $$VERSION\\""' DEFINES += VERSION='"\\"$$VERSION\\""' INCLUDEPATH += src QT += network xml xmlpatterns FORMS += ui/aboutdialog.ui \ ui/addradiodialog.ui \ ui/controlpanel.ui \ ui/coverartdialog.ui \ ui/directorypanel.ui \ ui/librarypanel.ui \ ui/mainwindow.ui \ ui/metainfodialog.ui \ ui/playlistpanel.ui \ ui/playlistspanel.ui \ ui/preferencesdialog.ui \ ui/radiopanel.ui \ ui/shoutcastpanel.ui \ ui/lyricsdialog.ui HEADERS += src/aafilter.h \ src/aboutdialog.h \ src/abstractmodel.h \ src/abstractview.h \ src/abstractview_defn.h \ src/abstractview_impl.h \ src/albumview.h \ src/artistview.h \ src/clickablelabel.h \ src/config.h \ src/controlpanel.h \ src/coverartdialog.h \ src/lyricsdialog.h \ src/debug.h \ src/directorymodel.h \ src/directorypanel.h \ src/directoryview.h \ src/dynamicplaylist.h \ src/fileview.h \ src/headerview.h \ src/iconmanager.h \ src/idealbar.h \ src/idealsplitter.h \ src/libmpdclient.h \ src/librarypanel.h \ src/lineedit.h \ src/macroexpander.h \ src/mainwindow.h \ src/metainfodialog.h \ src/mpd.h \ src/mpd_p.h \ src/mpdcache.h \ src/mpdcache_p.h \ src/mpdconnection.h \ src/mpddirectory.h \ src/mpdentities.h \ src/mpdoutput.h \ src/mpdsong.h \ src/mpdsonglist.h \ src/mpdsongmodel.h \ src/mpdsongview.h \ src/mpdstats.h \ src/mpdstatus.h \ src/notifications.h \ src/passivepopup.h \ src/pausabletimer.h \ src/playlistitemdelegate.h \ src/playlistmodel.h \ src/playlistspanel.h \ src/playlistsview.h \ src/plsfile.h \ src/preferencesdialog.h \ src/qmpdclient.h \ src/playlistpanel.h \ src/playlistview.h \ src/plconview.h \ src/radiopanel.h \ src/radioview.h \ src/reconnect.h \ src/richtext.h \ src/serverinfo.h \ src/servermodel.h \ src/shortcutmodel.h \ src/shortcuts.h \ src/shoutcastpanel.h \ src/shoutcastview.h \ src/shoutcastmodel.h \ src/shoutcastfetcher.h \ src/shoutcaststation.h \ src/songview.h \ src/stringlistmodel.h \ src/stringlistview.h \ src/tagmodel.h \ src/tagguesser.h \ src/timelabel.h \ src/timeslider.h \ src/trayicon.h \ src/traysonginfo.h \ src/verticalbutton.h \ src/lastfmsubmitter.h SOURCES += src/aafilter.cpp \ src/aboutdialog.cpp \ src/abstractmodel.cpp \ src/abstractview.cpp \ src/albumview.cpp \ src/artistview.cpp \ src/clickablelabel.cpp \ src/config.cpp \ src/controlpanel.cpp \ src/coverartdialog.cpp \ src/lyricsdialog.cpp \ src/directorymodel.cpp \ src/directorypanel.cpp \ src/directoryview.cpp \ src/dynamicplaylist.cpp \ src/fileview.cpp \ src/headerview.cpp \ src/iconmanager.cpp \ src/idealbar.cpp \ src/idealsplitter.cpp \ src/libmpdclient.c \ src/librarypanel.cpp \ src/lineedit.cpp \ src/mainwindow.cpp \ src/metainfodialog.cpp \ src/mpd.cpp \ src/mpdcache.cpp \ src/mpdconnection.cpp \ src/mpddirectory.cpp \ src/mpdentities.cpp \ src/mpdoutput.cpp \ src/mpdsong.cpp \ src/mpdsonglist.cpp \ src/mpdsongmodel.cpp \ src/mpdsongview.cpp \ src/mpdstats.cpp \ src/mpdstatus.cpp \ src/notifications.cpp \ src/passivepopup.cpp \ src/pausabletimer.cpp \ src/playlistitemdelegate.cpp \ src/playlistmodel.cpp \ src/playlistpanel.cpp \ src/playlistview.cpp \ src/playlistspanel.cpp \ src/playlistsview.cpp \ src/plconview.cpp \ src/plsfile.cpp \ src/preferencesdialog.cpp \ src/qmpdclient.cpp \ src/radiopanel.cpp \ src/radioview.cpp \ src/reconnect.cpp \ src/serverinfo.cpp \ src/servermodel.cpp \ src/shortcutmodel.cpp \ src/shortcuts.cpp \ src/shoutcastmodel.cpp \ src/shoutcastpanel.cpp \ src/shoutcastview.cpp \ src/shoutcastfetcher.cpp \ src/shoutcaststation.cpp \ src/songview.cpp \ src/stringlistmodel.cpp \ src/stringlistview.cpp \ src/tagguesser.cpp \ src/tagmodel.cpp \ src/timelabel.cpp \ src/timeslider.cpp \ src/trayicon.cpp \ src/traysonginfo.cpp \ src/verticalbutton.cpp \ src/lastfmsubmitter.cpp # translations LANG_PATH = $$PWD/lang TRANSLATIONS = $$LANG_PATH/ru_RU.ts $$LANG_PATH/de_DE.ts $$LANG_PATH/it_IT.ts $$LANG_PATH/nn_NO.ts $$LANG_PATH/pt_BR.ts $$LANG_PATH/sv_SE.ts $$LANG_PATH/uk_UA.ts $$LANG_PATH/zh_TW.ts $$LANG_PATH/fr_FR.ts $$LANG_PATH/nl_NL.ts $$LANG_PATH/no_NO.ts $$LANG_PATH/tr_TR.ts $$LANG_PATH/zh_CN.ts $$LANG_PATH/cs_CZ.ts $$LANG_PATH/es_ES.ts MOC_DIR = .moc OBJECTS_DIR = .obj RCC_DIR = .res UI_DIR = .ui # Platform specific win32 { # debug:CONFIG += console LIBS += -lws2_32 RC_FILE = icons/resource.rc SOURCES += src/qmpdclient_win.cpp \ src/notifications_nodbus.cpp } # Installation in done through own installer on win32 unix { !mac { SOURCES += src/qmpdclient_x11.cpp LIBS += -lX11 # Check for dbus support contains(QT_CONFIG, dbus) { message(DBus: enabled) CONFIG += qdbus SOURCES += src/notifications_dbus.cpp \ src/qdbus_adaptor.cpp HEADERS += src/qdbus_adaptor.h DEFINES += WITH_DBUS } else { message(DBus: disabled (Qt is not compiled with dbus support)) SOURCES += src/notifications_nodbus.cpp } } mac { RC_FILE = icons/qmpdclient.icns SOURCES += src/qmpdclient_mac.cpp \ src/notifications_nodbus.cpp } DEFINES += PREFIX='"\\"$$PREFIX\\""' TARGET = qmpdclient INSTALLS += target target.path = $$PREFIX/bin } unix { desktop_file.files = qmpdclient.desktop desktop_file.path = $$PREFIX/share/applications icon64.files = icons/64x64/qmpdclient.png icon64.path = $$PREFIX/share/icons/hicolor/64x64/apps/ icon48.files = icons/48x48/qmpdclient.png icon48.path = $$PREFIX/share/icons/hicolor/48x48/apps/ icon22.files = icons/22x22/qmpdclient.png icon22.path = $$PREFIX/share/icons/hicolor/22x22/apps/ icon16.files = icons/16x16/qmpdclient.png icon16.path = $$PREFIX/share/icons/hicolor/16x16/apps/ iconsvg.files = icons/svg/qmpdclient.svg iconsvg.path = $$PREFIX/share/icons/hicolor/scalable/apps/ INSTALLS += desktop_file icon64 icon48 icon22 icon16 iconsvg } translations.commands = lrelease $$TRANSLATIONS translations.files = lang/cs_CZ.qm lang/de_DE.qm lang/es_ES.qm lang/fr_FR.qm lang/it_IT.qm lang/nl_NL.qm lang/nn_NO.qm lang/no_NO.qm lang/pt_BR.qm lang/ru_RU.qm lang/sv_SE.qm lang/tr_TR.qm lang/uk_UA.qm lang/zh_CN.qm lang/zh_TW.qm translations.path = $$PREFIX/share/QMPDClient/translations INSTALLS += translations # update translations (make translate) QMAKE_EXTRA_TARGETS += translate translate.commands = lupdate $$PWD/qmpdclient.pro -ts $$TRANSLATIONS; qmpdclient-1.2.2/qmpdclient.qrc000066400000000000000000000113071157363675200165440ustar00rootroot00000000000000 AUTHORS COPYING README THANKSTO icons/as.png icons/crystal_amarok/add.png icons/crystal_amarok/amarok/collection.png icons/crystal_amarok/amarok/playlist.png icons/crystal_amarok/amarok/random.png icons/crystal_amarok/amarok/repeat.png icons/crystal_amarok/amarok/shuffle.png icons/crystal_amarok/crop.png icons/crystal_amarok/dynamic.png icons/crystal_amarok/crystal/clear.png icons/crystal_amarok/crystal/configure.png icons/crystal_amarok/crystal/connect.png icons/crystal_amarok/crystal/disconnect.png icons/crystal_amarok/crystal/exit.png icons/crystal_amarok/crystal/goto.png icons/crystal_amarok/crystal/help.png icons/crystal_amarok/crystal/icons.png icons/crystal_amarok/crystal/info.png icons/crystal_amarok/crystal/info32.png icons/crystal_amarok/crystal/key_bindings.png icons/crystal_amarok/crystal/locale.png icons/crystal_amarok/crystal/looknfeel.png icons/crystal_amarok/crystal/saveas.png icons/crystal_amarok/crystal/server.png icons/crystal_amarok/crystal/stream.png icons/crystal_amarok/crystal/stream32.png icons/crystal_amarok/crystal/style.png icons/crystal_amarok/crystal/time.png icons/crystal_amarok/crystal/tree.png icons/crystal_amarok/iconset.conf icons/crystal_amarok/next.png icons/crystal_amarok/pause.png icons/crystal_amarok/play.png icons/crystal_amarok/prev.png icons/crystal_amarok/reload.png icons/crystal_amarok/remove.png icons/crystal_amarok/removeall.png icons/crystal_amarok/stop.png icons/crystal_amarok/volume.png icons/oxygen/application-exit.png icons/oxygen/configure.png icons/oxygen/dialog-information.png icons/oxygen/document-save-as.png icons/oxygen/edit-clear.png icons/oxygen/edit-copy.png icons/oxygen/edit-cut.png icons/oxygen/edit-paste.png icons/oxygen/feed-subscribe.png icons/oxygen/fill-color.png icons/oxygen/folder-sound.png icons/oxygen/games-config-background.png icons/oxygen/go-jump.png icons/oxygen/games-solve.png icons/oxygen/iconset.conf icons/oxygen/list-add.png icons/oxygen/list-remove.png icons/oxygen/media-playback-pause.png icons/oxygen/media-playback-start.png icons/oxygen/media-playback-stop.png icons/oxygen/media-skip-backward.png icons/oxygen/media-skip-forward.png icons/oxygen/network-connect.png icons/oxygen/network-disconnect.png icons/oxygen/network-server.png icons/oxygen/player-time.png icons/oxygen/player-volume.png icons/oxygen/preferences-desktop-icons.png icons/oxygen/preferences-desktop-keyboard.png icons/oxygen/preferences-desktop-locale.png icons/oxygen/preferences-desktop-notification.png icons/oxygen/preferences-desktop-theme.png icons/oxygen/roll.png icons/oxygen/task-recurring.png icons/oxygen/view-list-tree.png icons/oxygen/view-media-playlist.png icons/oxygen/view-refresh.png icons/oxygen/x-media-podcast.png icons/16x16/qmpdclient.png icons/16x16/qmpdclientd.png icons/22x22/qmpdclient.png icons/22x22/qmpdclientd.png icons/48x48/qmpdclient.png icons/64x64/qmpdclient.png icons/svg/qmpdclient.svg qmpdclient-1.2.2/src/000077500000000000000000000000001157363675200144625ustar00rootroot00000000000000qmpdclient-1.2.2/src/aafilter.cpp000066400000000000000000000037241157363675200167630ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "aafilter.h" AAFilter::AAFilter() : m_allAlbums(false), m_notTaggedAlbum(false) {} AAFilter::AAFilter(const QStringList &artists, const QStringList &albums, bool allAlbums) : m_allAlbums(allAlbums), m_notTaggedAlbum(false), m_albums(albums), m_artists(artists) { const int idx = m_albums.indexOf(QString()); if (idx > -1) { m_notTaggedAlbum = true; m_albums.removeAt(idx); } } bool AAFilter::allAlbums() const { return m_allAlbums; } bool AAFilter::notTaggedAlbum() const { return m_notTaggedAlbum; } bool AAFilter::hasAlbum(const QString &album) const { return m_albums.contains(album); } bool AAFilter::hasArtist(const QString &artist) const { return m_artists.contains(artist); } QStringList AAFilter::albums() const { return m_albums; } QStringList AAFilter::artists() const { return m_artists; } QDataStream &operator<<(QDataStream &s, const AAFilter &g) { s << g.m_allAlbums; s << g.m_notTaggedAlbum; s << g.m_albums; s << g.m_artists; return s; } QDataStream &operator>>(QDataStream &s, AAFilter &g) { s >> g.m_allAlbums; s >> g.m_notTaggedAlbum; s >> g.m_albums; s >> g.m_artists; return s; } qmpdclient-1.2.2/src/aafilter.h000066400000000000000000000030521157363675200164220ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef AAFILTER_H #define AAFILTER_H #include #include class AAFilter { public: AAFilter(); AAFilter(const QStringList &artists, const QStringList &albums, bool allAlbums = false); bool allAlbums() const; bool notTaggedAlbum() const; bool hasAlbum(const QString &) const; bool hasArtist(const QString &) const; QStringList albums() const; QStringList artists() const; private: friend QDataStream &operator>>(QDataStream &, AAFilter &); friend QDataStream &operator<<(QDataStream &, const AAFilter &); bool m_allAlbums, m_notTaggedAlbum; QStringList m_albums, m_artists; }; QDataStream &operator<<(QDataStream &, const AAFilter &); QDataStream &operator>>(QDataStream &, AAFilter &); #endif qmpdclient-1.2.2/src/aboutdialog.cpp000066400000000000000000000037011157363675200174610ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "aboutdialog.h" #include "config.h" #include AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) { setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); titleLabel->setText(NAMEVER); pixmapLabel->setPixmap(QPixmap(":/icons/22x22/qmpdclient.png")); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); const QStringList paths = QStringList() << ":/"; aboutText->setSearchPaths(paths); QTextCodec *codec = QTextCodec::codecForName("UTF-8"); aboutText->setPlainText(codec->toUnicode(aboutText->loadResource(QTextDocument::HtmlResource, QUrl("README")).toByteArray())); authorText->setSearchPaths(paths); authorText->setPlainText(codec->toUnicode(authorText->loadResource(QTextDocument::HtmlResource, QUrl("AUTHORS")).toByteArray())); thanksText->setSearchPaths(paths); thanksText->setPlainText(codec->toUnicode(thanksText->loadResource(QTextDocument::HtmlResource, QUrl("THANKSTO")).toByteArray())); licenseText->setSearchPaths(paths); licenseText->setPlainText(codec->toUnicode(licenseText->loadResource(QTextDocument::HtmlResource, QUrl("COPYING")).toByteArray())); exec(); } qmpdclient-1.2.2/src/aboutdialog.h000066400000000000000000000020041157363675200171210ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H #include "ui_aboutdialog.h" class AboutDialog : public QDialog, private Ui::AboutDialog { public: AboutDialog(QWidget *); }; #endif qmpdclient-1.2.2/src/abstractmodel.cpp000066400000000000000000000020651157363675200200150ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "abstractmodel.h" AbstractModel::AbstractModel() : m_dragDisabled(false) {} void AbstractModel::setDragDisabled(bool n) { m_dragDisabled = n; } bool AbstractModel::isDragDisabled() const { return m_dragDisabled; } qmpdclient-1.2.2/src/abstractmodel.h000066400000000000000000000020311157363675200174530ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ABSTRACTMODEL_H #define ABSTRACTMODEL_H class AbstractModel { public: AbstractModel(); void setDragDisabled(bool); bool isDragDisabled() const; protected: bool m_dragDisabled; }; #endif qmpdclient-1.2.2/src/abstractview.cpp000066400000000000000000000024161157363675200176670ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "abstractview.h" #include "abstractmodel.h" #include "config.h" #include "metainfodialog.h" #include "mpd.h" #include "mpdcache.h" #include "mpdconnection.h" #include #include #include #define TYPE AbstractTree #define PARENT QTreeView #include "abstractview_impl.h" #undef PARENT #undef TYPE #define TYPE AbstractList #define PARENT QListView #include "abstractview_impl.h" #undef PARENT #undef TYPE qmpdclient-1.2.2/src/abstractview.h000066400000000000000000000027221157363675200173340ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ABSTRACTVIEW_H #define ABSTRACTVIEW_H #include #include class AbstractTree : public QTreeView { Q_OBJECT public slots: void connected(); void disconnected(); private slots: void enqueue(); void information(); void play(); #ifndef Q_MOC_RUN #define TYPE AbstractTree #include "abstractview_defn.h" #undef TYPE #endif }; class AbstractList : public QListView { Q_OBJECT public slots: void connected(); void disconnected(); private slots: void enqueue(); void information(); void play(); #ifndef Q_MOC_RUN #define TYPE AbstractList #include "abstractview_defn.h" #undef TYPE #endif }; #endif qmpdclient-1.2.2/src/abstractview_defn.h000066400000000000000000000030061157363675200203240ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ public: TYPE(QWidget *); void setModel(QAbstractItemModel *); protected: QAction *addMenuAction(const QString &, bool = true); QAction *addMenuAction(const QString &, QObject *, const char *, bool = true); void contextMenuEvent(QContextMenuEvent *); void mouseMoveEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); void keyPressEvent(QKeyEvent *); void paintEvent(QPaintEvent *); void selectionChanged(const QItemSelection & = QItemSelection(), const QItemSelection & = QItemSelection()); virtual class MPDSongList selectedSongs() const = 0; class AbstractModel *m_abstractModel; class QMenu *m_menu; QList m_actions; qmpdclient-1.2.2/src/abstractview_impl.h000066400000000000000000000077711157363675200203660ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ // Implementation of AbstractList / AbstractView, TYPE and PARENT need to be defined on include TYPE::TYPE(QWidget *parent) : PARENT(parent), m_abstractModel(0), m_menu(new QMenu(this)) { connect(MPDConnection::instance(), SIGNAL(connected(const ServerInfo &)), this, SLOT(connected())); connect(MPDConnection::instance(), SIGNAL(disconnected(const QString &)), this, SLOT(disconnected())); } QAction *TYPE::addMenuAction(const QString &objectName, QObject *receiver, const char *method, bool conditional) { Q_ASSERT(m_menu); QAction *a = m_menu->addAction("", receiver, method); a->setObjectName(objectName); if (conditional) { a->setEnabled(false); //All conditional actions start disabled m_actions << a; } return a; } QAction *TYPE::addMenuAction(const QString &objectName, bool conditional) { Q_ASSERT(m_menu); QAction *a = m_menu->addAction(""); a->setObjectName(objectName); if (conditional) m_actions << a; return a; } void TYPE::contextMenuEvent(QContextMenuEvent *e) { const QModelIndex clicked = indexAt(e->pos()); const QModelIndexList indexes = selectedIndexes(); if (indexes.isEmpty() || !indexes.contains(clicked)) setCurrentIndex(indexAt(e->pos())); Q_ASSERT(m_menu); m_menu->popup(e->globalPos()); } void TYPE::selectionChanged(const QItemSelection &s, const QItemSelection &u) { PARENT::selectionChanged(s, u); foreach(QAction *a, m_actions) { Q_ASSERT(a); a->setEnabled(!s.indexes().isEmpty()); } } void TYPE::enqueue() { MPD::instance()->addSongs(selectedSongs()); } void TYPE::information() { new MetaInfoDialog(this, selectedSongs()); } void TYPE::play() { MPD::instance()->addSongs(selectedSongs(), false); } void TYPE::connected() { setEnabled(true); } void TYPE::disconnected() { setEnabled(false); } void TYPE::paintEvent(QPaintEvent *e) { if (isEnabled()) { PARENT::paintEvent(e); return; } const QString text = qApp->translate("AbstractView", "Not connected"); const int x = width() / 2 - fontMetrics().width(text) / 2; const int y = height() / 2 - fontMetrics().height() / 2; QPainter p(viewport()); p.drawText(x, y, text); } void TYPE::setModel(QAbstractItemModel *model) { Q_ASSERT(model); PARENT::setModel(model); m_abstractModel = dynamic_cast(model); Q_ASSERT(m_abstractModel); } void TYPE::mouseMoveEvent(QMouseEvent *e) { QMouseEvent *e2 = e; Q_ASSERT(m_abstractModel); if (m_abstractModel->isDragDisabled()) e2 = new QMouseEvent(e->type(), e->pos(), Qt::LeftButton, e->buttons() | Qt::LeftButton, e->modifiers()); PARENT::mouseMoveEvent(e2); } void TYPE::mousePressEvent(QMouseEvent *e) { QMouseEvent *e2 = e; if (e->button() == Qt::MidButton) { Q_ASSERT(m_abstractModel); m_abstractModel->setDragDisabled(true); e2 = new QMouseEvent(e->type(), e->pos(), Qt::LeftButton, e->buttons(), e->modifiers()); } PARENT::mousePressEvent(e2); } void TYPE::mouseReleaseEvent(QMouseEvent *e) { if (e->button() == Qt::MidButton) { Q_ASSERT(m_abstractModel); m_abstractModel->setDragDisabled(false); } PARENT::mouseReleaseEvent(e); } void TYPE::keyPressEvent(QKeyEvent *e) { if ((e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter)) emit doubleClicked(QModelIndex()); PARENT::keyPressEvent(e); } qmpdclient-1.2.2/src/albumview.cpp000066400000000000000000000042211157363675200171600ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "albumview.h" #include "aafilter.h" #include "artistview.h" #include "config.h" #include "mpdcache.h" #include "mpdsonglist.h" #include "songview.h" #include "stringlistmodel.h" AlbumView::AlbumView(QWidget *parent) : StringListView(parent), m_artistView(0), m_songView(0) { Q_ASSERT(m_model); setObjectName("albumview"); m_model->setShowAll(true); connect(Config::instance(), SIGNAL(filterByAlbumOnlyChanged(bool)), this, SLOT(filterByAlbumOnlyChanged())); } void AlbumView::setArtistView(ArtistView *a) { m_artistView = a; } void AlbumView::setSongView(SongView *s) { m_songView = s; } void AlbumView::filterByAlbumOnlyChanged() { selectionChanged(); } void AlbumView::selectionChanged(const QItemSelection &s, const QItemSelection &u) { Q_ASSERT(m_songView); StringListView::selectionChanged(s, u); m_songView->setSongs(MPDCache::instance()->songsByAA(aaFilter())); } AAFilter AlbumView::aaFilter() const { Q_ASSERT(m_artistView); QStringList albums = selectedStrings(); bool all = false; if (albums.isEmpty()) // Nothing selected, lets assume this means 'All' all = true; foreach (QString s, albums) { if (s.isNull()) { // One artist is NULL, so all artists are needed all = true; break; } } if (all) albums = m_strings; return AAFilter(m_artistView->aaFilter().artists(), albums, all); } qmpdclient-1.2.2/src/albumview.h000066400000000000000000000025221157363675200166270ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ALBUMVIEW_H #define ALBUMVIEW_H #include "stringlistview.h" class ArtistView; class SongView; class AlbumView : public StringListView { Q_OBJECT public: AlbumView(QWidget *); AAFilter aaFilter() const; void setArtistView(ArtistView *); void setSongView(SongView *); private slots: void filterByAlbumOnlyChanged(); private: void selectionChanged(const QItemSelection & = QItemSelection(), const QItemSelection & = QItemSelection()); ArtistView *m_artistView; SongView *m_songView; }; #endif qmpdclient-1.2.2/src/artistview.cpp000066400000000000000000000041651157363675200173750ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "artistview.h" #include "aafilter.h" #include "albumview.h" #include "config.h" #include "mpdcache.h" #include "stringlistmodel.h" ArtistView::ArtistView(QWidget *parent) : StringListView(parent), m_albumView(0) { setObjectName("artistview"); connect(MPDCache::instance(), SIGNAL(artistsUpdated(const QStringList &)), this, SLOT(setStrings(const QStringList &))); connect(Config::instance(), SIGNAL(showAllChanged(bool)), this, SLOT(setShowAll(bool))); setShowAll(Config::instance()->showAll()); } void ArtistView::setShowAll(bool a) { Q_ASSERT(m_model); m_model->setShowAll(a); } void ArtistView::setAlbumView(AlbumView *a) { m_albumView = a; } void ArtistView::selectionChanged(const QItemSelection &s, const QItemSelection &u) { Q_ASSERT(m_albumView); StringListView::selectionChanged(s, u); m_albumView->setStrings(MPDCache::instance()->albumsByArtists(selectedStrings())); } AAFilter ArtistView::aaFilter() const { QStringList artists = selectedStrings(); if (artists.isEmpty()) // Nothing selected, lets assume this means 'All' artists = m_strings; foreach (QString s, artists) { if (s.isNull()) { // One artist is NULL, so all artists are needed artists = m_strings; break; } } return AAFilter(artists, MPDCache::instance()->albumsByArtists(selectedStrings())); } qmpdclient-1.2.2/src/artistview.h000066400000000000000000000024011157363675200170310ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ARTISTVIEW_H #define ARTISTVIEW_H #include "stringlistview.h" class AlbumView; class ArtistView : public StringListView { Q_OBJECT public: ArtistView(QWidget *); AAFilter aaFilter() const; void setAlbumView(AlbumView *); private slots: void setShowAll(bool); private: void selectionChanged(const QItemSelection & = QItemSelection(), const QItemSelection & = QItemSelection()); AlbumView *m_albumView; }; #endif qmpdclient-1.2.2/src/clickablelabel.cpp000066400000000000000000000022531157363675200201010ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "clickablelabel.h" ClickableLabel::ClickableLabel(QWidget * parent, Qt::WindowFlags f) :QLabel(parent, f) { } ClickableLabel::~ClickableLabel() { } void ClickableLabel::mouseReleaseEvent(QMouseEvent * event) { if (event->button() == Qt::LeftButton) { emit clicked(); } QLabel::mouseReleaseEvent(event); } qmpdclient-1.2.2/src/clickablelabel.h000066400000000000000000000022221157363675200175420ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef CLICKABLELABEL_H #define CLICKABLELABEL_H #include class ClickableLabel: public QLabel { Q_OBJECT public: ClickableLabel(QWidget * parent = 0, Qt::WindowFlags f = 0); virtual ~ClickableLabel(); protected: virtual void mouseReleaseEvent(QMouseEvent * event); signals: void clicked(); }; #endif qmpdclient-1.2.2/src/config.cpp000066400000000000000000000430561157363675200164430ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include "debug.h" #include "iconmanager.h" #include "mpdsonglist.h" #include "passivepopup.h" #include "serverinfo.h" #include #include #include #include Config* Config::m_instance = 0; Config::Config() : #ifndef Q_WS_X11 QSettings(IniFormat, UserScope, "QMPDClient", "QMPDClient") { #else QSettings("QMPDClient", "QMPDClient") { #endif // Path for cache m_cachePath = fileName().section('/', 0, -2, QString::SectionSkipEmpty | QString::SectionIncludeLeadingSep) + "/"; // Path for system wide, and user's data files QString execPath = QCoreApplication::applicationDirPath(); QString prefix = execPath.section("/", 0, -2); #ifdef Q_WS_WIN m_systemPath = execPath; m_userPath = m_cachePath; #else m_systemPath = prefix + "/share/QMPDClient/"; m_userPath = QDir::homePath() + "/.local/share/QMPDClient/"; #endif setObjectName("config"); } Config *Config::instance() { if (!m_instance) { m_instance = new Config; IconManager::update(); } return m_instance; } QString Config::cachePath() const { return m_cachePath; } QString Config::systemPath() const { return m_systemPath; } QString Config::userPath() const { return m_userPath; } /* * SERVER SETTINGS */ // MPD Host void Config::setServers(const QList &servers) { QVariantList res; foreach(ServerInfo s, servers) { res << "Name: " + s.name() << "Address: " + s.address() << QString("Port: %1").arg(s.port()) << "Password: " + s.password(); } setValue("/mpd/serverlist", res); emit serverListChanged(servers); } QList Config::servers() const { QList res; QVariantList vl = value("/mpd/serverlist").toList(); if (vl.isEmpty()) { ServerInfo si("Localhost"); res << si; return res; } for (int i=0; i= vl.size()) { qWarning("Ignoring stray elements in server list."); break; } ServerInfo si(vl.at(i).toString().remove(0, 6), vl.at(i+1).toString().remove(0, 9), vl.at(i+2).toString().remove(0, 6).toInt(), vl.at(i+3).toString().remove(0, 10)); res << si; } return res; } ServerInfo Config::server(const QString &name) const { QList sil = servers(); foreach(ServerInfo si, sil) { if (si.name() == name) return si; } DEBUG("Server `%s' not found, returning first in list.", qPrintable(name)); // No matches, return first server return sil.first(); } void Config::setAutoconnect(bool e) { setValue("/mpd/autoconnect", e); } void Config::setReconnect(bool r) { setValue("/mpd/reconnect", r); } void Config::setReconnectTime(int t) { setValue("/mpd/reconnecttime", t); } void Config::setTimeoutTime(int t) { setValue("/mpd/timeout", t); } bool Config::autoconnect() const { return value("/mpd/autoconnect").toBool(); } bool Config::reconnect() const { return value("/mpd/reconnect").toBool(); } int Config::reconnectTime() const { return value("/mpd/reconnecttime", 60).toInt(); } int Config::timeoutTime() const { return value("/mpd/timeout", 10).toInt(); } // Look and feel settings void Config::setAlternatingRowColors(bool a) { if (a != alternatingRowColors()) emit alternatingChanged(a); setValue("/looknfeel/alternatingrowcolors", a); } void Config::setEnqueue(bool e) { setValue("/looknfeel/enqueue", e); } void Config::setFilterByAlbumOnly(bool a) { setValue("/looknfeel/filter_by_album_only", a); emit filterByAlbumOnlyChanged(a); } void Config::setShowCoverArt(bool a) { bool prev = showCoverArt(); setValue("/coverart/show_cover_art", a); if (prev != a) emit showCoverArtChanged(a); } void Config::setCoverArtDir(const QString &dir) { setValue("/coverart/music_root", dir); } void Config::setCoverMaxHeight(const QString &height) { setValue("/coverart/max_height", height); } void Config::setCoverMaxWidth(const QString &width) { setValue("/coverart/max_width", width); } void Config::setCoverFilenameFormat(const QString &format) { setValue("/coverart/filename_format", format); } void Config::setFont(const QFont &font) { setValue("/looknfeel/font", font); emit fontChanged(font); } void Config::setOpaqueResize(bool o) { setValue("/looknfeel/opaqueresize", o); emit opaqueResizeChanged(o); } void Config::setRecurse(bool r) { setValue("/looknfeel/recursiveview", r); } void Config::setShowAll(bool r) { setValue("/looknfeel/showall", r); emit showAllChanged(r); } void Config::setShowRemaining(bool r) { setValue("/looknfeel/showremaning", r); } void Config::setAutoResizeColumns(bool a) { if (a != autoResizeColumns()) emit autoResizeChanged(a); setValue("/looknfeel/autoresizecolumns", a); } bool Config::alternatingRowColors() const { return value("/looknfeel/alternatingrowcolors", true).toBool(); } bool Config::enqueue() const { return value("/looknfeel/enqueue", false).toBool(); } bool Config::filterByAlbumOnly() const { return value("/looknfeel/filter_by_album_only", false).toBool(); } bool Config::showCoverArt() const { return value("/coverart/show_cover_art", false).toBool(); } QString Config::coverArtDir() const { QString path = value("/coverart/music_root", "/music").toString(); return path; } QString Config::coverArtMaxHeight() const { QString mh = value("/coverart/max_height", "1024").toString(); return mh; } QString Config::coverArtMaxWidth() const { QString mw = value("/coverart/max_width", "768").toString(); return mw; } QString Config::coverArtFilenameFormat() const { QString format = value("/coverart/filename_format", "*.jpg, *.jpeg, *.png, *.gif").toString(); return format; } bool Config::opaqueResize() const { return value("/looknfeel/opaqueresize", false).toBool(); } bool Config::recurse() const { return value("/looknfeel/recursiveview", false).toBool(); } bool Config::showAll() const { return value("/looknfeel/showall", false).toBool(); } bool Config::showRemaining() const { return value("/looknfeel/showremaning", false).toBool(); } QFont Config::font() const { return qvariant_cast(value("/looknfeel/font")); } bool Config::autoResizeColumns() const { return value("/looknfeel/autoresizecolumns", true).toBool(); } // Icon set void Config::setIconSet(const QString &dir) { const QString orig = iconSetPath(); setValue("/looknfeel/iconset", dir); if (orig != dir) { IconManager::update(); emit iconSetChanged(); } } QString Config::iconSetPath() const { QString path = value("/looknfeel/iconset", ":/icons/crystal_amarok").toString(); return path; } // Playlist void Config::setPlaylistPattern(const QString &p) { const QString orig = playlistPattern(); setValue("/looknfeel/playlistpattern", p); if (orig != p) emit playlistPatternChanged(p); } void Config::setScrollToPlaying(bool s) { setValue("/looknfeel/scrolltoplaying", s); } QString Config::playlistPattern() const { return value("/looknfeel/playlistpattern", "%b - %t").toString(); } bool Config::scrollToPlaying() const { return value("/looknfeel/scrolltoplaying", false).toBool(); } // Style void Config::setStyleFile(const QString &s) { const QString orig = styleFile(); setValue("/looknfeel/style", s); if (orig != s) emit styleChanged(style(s)); } QString Config::styleFile() const { return value("/looknfeel/style").toString(); } QString Config::style(const QString &fn) const { const QString filename = !fn.isEmpty() ? fn : styleFile(); if (filename.isEmpty()) return QString(); QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { DEBUG("Style file not readable: %s", qPrintable(filename)); return QString(); } const QString style = file.readAll(); file.close(); return style; } // Shortcuts void Config::setOriginalShortcut(const QString &action, const QString &key) { m_originalShortcuts[action] = key; } void Config::setShortcut(const QString &action, const QString &key) { setValue(QString("/shortcuts/%1").arg(action), key); } QString Config::shortcut(const QString &action) const { const QString shortcut = value(QString("/shortcuts/%1").arg(action)).toString(); if (shortcut.isEmpty()) return m_originalShortcuts.value(action); return shortcut; } // Language void Config::setTranslate(bool t) { const bool old = translate(); setValue("/language/translate", t); if (t != old) emit localeChanged(locale()); } void Config::setLocale(const QString &l) { const QString old = locale(); setValue("/language/locale", l); if (l != old) emit localeChanged(localeFile()); } bool Config::translate() const { return value("/language/translate", false).toBool(); } QString Config::locale() const { return value("/language/locale", "").toString(); } QString Config::localeFile() const { const QString tmp = locale(); if (tmp.isEmpty()) { QString filename = QLocale::system().name() + ".qm"; const QDir systemDir(systemPath() + "translations", "*.qm"); if (systemDir.entryList(QDir::Files | QDir::Readable).contains(filename)) return systemDir.absolutePath() + "/" + filename; const QDir userDir(userPath() + "translations", "*.qm"); if (userDir.entryList(QDir::Files | QDir::Readable).contains(filename)) return userDir.absolutePath() + "/" + filename; // If failed, try to find language only filename = QLocale::system().name().left(2) + ".qm"; if (systemDir.entryList(QDir::Files | QDir::Readable).contains(filename)) return systemDir.absolutePath() + "/" + filename; if (userDir.entryList(QDir::Files | QDir::Readable).contains(filename)) return userDir.absolutePath() + "/" + filename; } return tmp; } // Notifications void Config::setNotificationsEnabled(bool e) { setValue("/notifications/enabled", e); } void Config::setNotificationsPosition(int p) { setValue("/notifications/position", p); } void Config::setNotificationsTimeout(int t) { setValue("/notifications/timeout", t); } void Config::setNotifier(int t) { setValue("/notifications/type", t); } bool Config::notificationsEnabled() const { return value("/notifications/enabled", true).toBool(); } int Config::notificationsPosition() const { return value("/notifications/position", PassivePopup::BottomRight).toInt(); } int Config::notificationsTimeout() const { return value("/notifications/timeout", 3).toInt(); } int Config::notifier() const { return value("/notifications/type", 0).toInt(); } // System tray void Config::setTrayIconEnabled(bool e) { const bool old = trayIconEnabled(); setValue("/trayicon/enable", e); if (old != e) emit trayIconChanged(e); } void Config::setExtendedSongInfoEnabled(bool e) { setValue("/trayicon/songinfo", e); } void Config::setMinimizeToTray(bool e) { setValue("/trayicon/minimizetotray", e); } void Config::setStartHidden(bool e) { setValue("/trayicon/starthidden", e); } bool Config::trayIconEnabled() const { return value("/trayicon/enable", true).toBool(); } bool Config::extendedSongInfoEnabled() const { return value("/trayicon/songinfo", true).toBool(); } bool Config::minimizeToTray() const { return value("/trayicon/minimizetotray", true).toBool(); } bool Config::startHidden() const { return value("/trayicon/starthidden").toBool(); } /* * Tag-guesser settings */ void Config::setTagGuesserEnabled(bool e) { setValue("/tagguesser/enabled", e); } void Config::setGuessPattern(const QString &p) { setValue("/tagguesser/pattern", p); } void Config::setTestFilename(const QString &t) { setValue("/tagguesser/test", t); } bool Config::tagGuesserEnabled() const { return value("/tagguesser/enabled", false).toBool(); } QString Config::guessPattern() const { return value("/tagguesser/pattern", "/%b/%a/%n. %t.").toString(); } QString Config::testFilename() const { return value("/tagguesser/test", "/ogg/Artist/Album/42. The Title.ogg").toString(); } /* * Dynamic playlist */ void Config::setAutoAddSongs(bool a) { setValue("/dynamicplaylist/add", a); emit autoAddSongsChanged(a); } void Config::setAutoAddAlbums(bool a) { setValue("/dynamicplaylist/albums", a); emit autoAddAlbumsChanged(a); } void Config::setAutoAddCount(int c) { setValue("/dynamicplaylist/count", c); } void Config::setAutoAddPos(int p) { setValue("/dynamicplaylist/pos", p); } void Config::setAutoRemoveSongs(bool r) { setValue("/dynamicplaylist/remove", r); } bool Config::autoAddSongs() const { return value("/dynamicplaylist/add", false).toBool(); } bool Config::autoAddAlbums() const { return value("/dynamicplaylist/albums", false).toBool(); } int Config::autoAddPos() const { return value("/dynamicplaylist/pos", 0).toInt(); } bool Config::autoRemoveSongs() const { return value("/dynamicplaylist/remove", false).toBool(); } /* * Window and splitter sizes */ void Config::setSaveTransientSettings(bool value) { return setValue("/qmpdlcient/saveTransient", value); } void Config::setWindowSize(const QSize &s) { if(this->saveTransientSettings()) { setValue("/qmpdclient/windowsize", s); } } void Config::setRightBarTab(int t) { if(this->saveTransientSettings()) { setValue("/qmpdclient/righttab", t); } } void Config::setDirectorySplitterSizes(const QByteArray &l) { if(this->saveTransientSettings()) { setValue("/qmpdclient/directorysplittersizes", l); } } void Config::setLibraryHSplitterSizes(const QByteArray &l) { if(this->saveTransientSettings()) { setValue("/qmpdclient/libraryhsplittersizes", l); } } void Config::setLibraryVSplitterSizes(const QByteArray &l) { if(this->saveTransientSettings()) { setValue("/qmpdclient/libraryvsplittersizes", l); } } void Config::setMainSplitterSizes(const QByteArray &l) { if(this->saveTransientSettings()) { setValue("/qmpdclient/mainsplittersizes", l); } } void Config::setPlaylistsSplitterSizes(const QByteArray &l) { if(this->saveTransientSettings()) { setValue("/qmpdclient/playlistssplittersizes", l); } } bool Config::saveTransientSettings() const { return value("/qmpdlcient/saveTransient", true).toBool(); } QSize Config::windowSize() const { return value("/qmpdclient/windowsize", QSize(800, 600)).toSize(); } int Config::rightBarTab() { return value("/qmpdclient/righttab").toInt(); } QByteArray Config::directorySplitterSizes() const { return value("/qmpdclient/directorysplittersizes").toByteArray(); } QByteArray Config::libraryHSplitterSizes() const { return value("/qmpdclient/libraryhsplittersizes").toByteArray(); } QByteArray Config::libraryVSplitterSizes() const { return value("/qmpdclient/libraryvsplittersizes").toByteArray(); } QByteArray Config::mainSplitterSizes() const { return value("/qmpdclient/mainsplittersizes").toByteArray(); } QByteArray Config::playlistsSplitterSizes() const { return value("/qmpdclient/playlistssplittersizes").toByteArray(); } // Header sizes void Config::setHeaderViewState(const QString &view, const QByteArray &ba) { setValue(QString("/headerstates/%1").arg(view), ba); } QByteArray Config::headerViewState(const QString &view) const { return value(QString("/headerstates/%1").arg(view)).toByteArray(); } /* * Radio stations */ void Config::addRadioStation(const QString &title, const QString &url) { QMap map = value("/radioview/radiostations").toMap(); map[url] = title; setValue("/radioview/radiostations", map); } void Config::removeRadioStations(const MPDSongList &stations) { QMap map = value("/radioview/radiostations").toMap(); foreach(MPDSong s, stations) { map.remove(s.url()); } setValue("/radioview/radiostations", map); } MPDSongList Config::radioStations() const { const QMap map = value("/radioview/radiostations").toMap(); MPDSongList songs; for (QMapIterator i(map); i.hasNext();) { i.next(); songs << MPDSong::createStream(i.value().toString(), i.key()); } return songs; } /* * Last.fm */ bool Config::submitSongsToLastFm() const { return value("/lastfm/submit").toBool(); } QString Config::lastFmUsername() const { return value("/lastfm/username").toString(); } QString Config::lastFmPassword() const { return value("/lastfm/password").toString(); } bool Config::lastFmHashedPassword() const { return value("/lastfm/hashedpassword").toBool(); } int Config::lastFmScrobblerTimer() const { return value("/lastfm/scrobblertimer").toInt(); } void Config::setSubmitSongsToLastFm(bool b) { setValue("/lastfm/submit", b); } void Config::setLastFmUsername(const QString &s) { setValue("/lastfm/username", s); } void Config::setLastFmPassword(const QString &s) { setValue("/lastfm/password", s); } void Config::setLastFmHashedPassword(bool b) { setValue("/lastfm/hashedpassword", b); } void Config::setLastFmScrobblerTimer(int value) { setValue("/lastfm/scrobblertimer", value); } bool Config::disregardLeadingThe() const { return !value("/looknfeel/respectleadingthe").toBool(); } void Config::setDisregardLeadingThe(bool b) { setValue("/looknfeel/respectleadingthe", !b); } QString Config::lastFmServer() const { return value("/lastfm/server", "post.audioscrobbler.com").toString(); } void Config::setLastFmServer(const QString &s) { setValue("/lastfm/server", s); }qmpdclient-1.2.2/src/config.h000066400000000000000000000147171157363675200161120ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef CONFIG_H #define CONFIG_H #include class MPDSongList; class QFont; class ServerInfo; class Config : public QSettings { Q_OBJECT public: static Config *instance(); QString cachePath() const; QString systemPath() const; QString userPath() const; // Server settings bool autoconnect() const; bool reconnect() const; int reconnectTime() const; int timeoutTime() const; QList servers() const; ServerInfo server(const QString & = QString()) const; // Look and feel bool alternatingRowColors() const; bool autoResizeColumns() const; bool enqueue() const; QFont font() const; bool opaqueResize() const; bool scrollToPlaying() const; bool showRemaining() const; // Look and feel subpages QString iconSetPath() const; bool filterByAlbumOnly() const; bool disregardLeadingThe() const; QString playlistPattern() const; bool recurse() const; bool showAll() const; QString style(const QString & = QString()) const; QString styleFile() const; bool showCoverArt() const; QString coverArtDir() const; QString coverArtMaxHeight() const; QString coverArtMaxWidth() const; QString coverArtFilenameFormat() const; // Shortcuts QString shortcut(const QString &) const; // Language QString locale() const; QString localeFile() const; bool translate() const; // Popups bool notificationsEnabled() const; int notificationsPosition() const; int notificationsTimeout() const; int notifier() const; // Tray icon bool minimizeToTray() const; bool startHidden() const; bool trayIconEnabled() const; bool extendedSongInfoEnabled() const; // Dynamic playlist int autoAddCount() const; int autoAddPos() const; bool autoAddSongs() const; bool autoAddAlbums() const; bool autoRemoveSongs() const; // Last.fm bool submitSongsToLastFm() const; QString lastFmUsername() const; QString lastFmPassword() const; bool lastFmHashedPassword() const; int lastFmScrobblerTimer() const; QString lastFmServer() const; // Tag guesser QString guessPattern() const; bool tagGuesserEnabled() const; QString testFilename() const; // Window and splitter sizes void setDirectorySplitterSizes(const QByteArray &); void setLibraryHSplitterSizes(const QByteArray &); void setLibraryVSplitterSizes(const QByteArray &); void setMainSplitterSizes(const QByteArray &); void setPlaylistsSplitterSizes(const QByteArray &); void setRightBarTab(int); void setWindowSize(const QSize &); bool saveTransientSettings() const; QByteArray directorySplitterSizes() const; QByteArray libraryHSplitterSizes() const; QByteArray libraryVSplitterSizes() const; QByteArray mainSplitterSizes() const; QByteArray playlistsSplitterSizes() const; int rightBarTab(); QSize windowSize() const; // View's properties void setHeaderViewState(const QString &, const QByteArray &); QByteArray headerViewState(const QString &) const; // Radio stations void addRadioStation(const QString &title, const QString &url); void removeRadioStations(const MPDSongList &stations); MPDSongList radioStations() const; public slots: // Server settings void setAutoconnect(bool); void setServers(const QList &); void setReconnect(bool); void setReconnectTime(int); void setTimeoutTime(int); // Look and feel void setSaveTransientSettings(bool); void setAlternatingRowColors(bool); void setAutoResizeColumns(bool); void setEnqueue(bool); void setFont(const QFont &); void setOpaqueResize(bool); void setRecurse(bool); void setShowAll(bool); void setShowRemaining(bool); // Look and feel subpages void setFilterByAlbumOnly(bool); void setIconSet(const QString &); void setPlaylistPattern(const QString &); void setDisregardLeadingThe(bool); void setScrollToPlaying(bool); void setStyleFile(const QString &); void setShowCoverArt(bool); void setCoverArtDir(const QString &); void setCoverMaxHeight(const QString &); void setCoverMaxWidth(const QString &); void setCoverFilenameFormat(const QString &); // Shortcuts void setOriginalShortcut(const QString &action, const QString &shortcut); void setShortcut(const QString &action, const QString &shortcut); // Language void setLocale(const QString &); void setTranslate(bool); // Notifications void setNotificationsEnabled(bool); void setNotificationsPosition(int); void setNotificationsTimeout(int); void setNotifier(int); // Tray icon void setMinimizeToTray(bool); void setStartHidden(bool); void setTrayIconEnabled(bool); void setExtendedSongInfoEnabled(bool); // Dynamic playlist void setAutoAddCount(int); void setAutoAddPos(int); void setAutoAddSongs(bool); void setAutoAddAlbums(bool); void setAutoRemoveSongs(bool); // Tag guesser void setGuessPattern(const QString &); void setTagGuesserEnabled(bool); void setTestFilename(const QString &); // Last.fm void setSubmitSongsToLastFm(bool); void setLastFmUsername(const QString &); void setLastFmPassword(const QString &); void setLastFmHashedPassword(bool); void setLastFmScrobblerTimer(int); void setLastFmServer(const QString &); signals: void alternatingChanged(bool); void autoResizeChanged(bool); void filterByAlbumOnlyChanged(bool); void fontChanged(const QFont &); void iconSetChanged(); void localeChanged(const QString &); void opaqueResizeChanged(bool); void playlistPatternChanged(const QString &); void serverListChanged(const QList &); void showAllChanged(bool); void showCoverArtChanged(bool); void styleChanged(const QString &); void trayIconChanged(bool); void autoAddSongsChanged(bool); void autoAddAlbumsChanged(bool); private: Config(); static Config *m_instance; QString m_cachePath, m_systemPath, m_userPath; QMap m_originalShortcuts; }; #endif qmpdclient-1.2.2/src/controlpanel.cpp000066400000000000000000000126231157363675200176720ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include "controlpanel.h" #include "coverartdialog.h" #include "lyricsdialog.h" #include "lastfmsubmitter.h" #include "mpd.h" #include "mpdconnection.h" #include "mpdsong.h" #include "richtext.h" #include #include #include #include ControlPanel::ControlPanel(QWidget *parent) : QWidget(parent), m_coverArt(new CoverArtDialog(this)), m_lyricsDialog(new LyricsDialog(this)), m_lastFm(new LastFmSubmitter(this)) { Q_ASSERT(m_coverArt); Q_ASSERT(m_lyricsDialog); Q_ASSERT(m_lastFm); setupUi(this); coverArtButton->setVisible(false); connect(prevButton, SIGNAL(clicked()), MPD::instance(), SLOT(prev())); connect(playButton, SIGNAL(clicked()), MPD::instance(), SLOT(play())); connect(pauseButton, SIGNAL(clicked()), MPD::instance(), SLOT(pause())); connect(stopButton, SIGNAL(clicked()), MPD::instance(), SLOT(stop())); connect(nextButton, SIGNAL(clicked()), MPD::instance(), SLOT(next())); connect(volumeSlider, SIGNAL(valueChanged(int)), MPD::instance(), SLOT(setVolume(int))); connect(timeSlider, SIGNAL(timeChanged(int)), MPD::instance(), SLOT(seek(int))); connect(timeSlider, SIGNAL(valueChanged(int)), elapsedLabel, SLOT(setTime(int))); connect(MPD::instance(), SIGNAL(volumeUpdated(int)), volumeSlider, SLOT(setValue(int))); connect(MPD::instance(), SIGNAL(timeUpdated(int, int)), elapsedLabel, SLOT(setTime(int, int))); connect(MPD::instance(), SIGNAL(timeUpdated(int, int)), totalLabel, SLOT(setTime(int, int))); connect(MPD::instance(), SIGNAL(timeUpdated(int, int)), timeSlider, SLOT(setTime(int, int))); connect(MPD::instance(), SIGNAL(playingSongUpdated(const MPDSong &)), this, SLOT(setSong(const MPDSong &))); connect(Config::instance(), SIGNAL(showCoverArtChanged(bool)), this, SLOT(showCoverArtChanged(bool))); connect(coverArtButton, SIGNAL(clicked()), m_coverArt, SLOT(show())); connect(lyricsButton, SIGNAL(clicked()), m_lyricsDialog, SLOT(show())); connect(m_lastFm, SIGNAL(infoMsg(QString)), this, SIGNAL(infoMsg(QString))); // Short cuts m_fwdKey = new QShortcut(Qt::CTRL | Qt::Key_Right, this); m_rwdKey = new QShortcut(Qt::CTRL | Qt::Key_Left, this); m_volUpKey = new QShortcut(Qt::CTRL | Qt::Key_Up, this); m_volDnKey = new QShortcut(Qt::CTRL | Qt::Key_Down, this); m_fwdKey->setObjectName("nextSongKey"); m_rwdKey->setObjectName("prevSongKey"); m_volUpKey->setObjectName("volumeUpKey"); m_volDnKey->setObjectName("volumeDownKey"); connect(m_fwdKey, SIGNAL(activated()), MPD::instance(), SLOT(seekForward())); connect(m_rwdKey, SIGNAL(activated()), MPD::instance(), SLOT(seekBackward())); connect(m_volUpKey, SIGNAL(activated()), MPD::instance(), SLOT(volumeUp())); connect(m_volDnKey, SIGNAL(activated()), MPD::instance(), SLOT(volumeDown())); setSong(MPDSong()); } void ControlPanel::updateTranslation() { retranslateUi(this); m_fwdKey->setWhatsThis(tr("Seek forward")); m_rwdKey->setWhatsThis(tr("Seek backward")); m_volUpKey->setWhatsThis(tr("Increase volume")); m_volDnKey->setWhatsThis(tr("Decrease volume")); } void ControlPanel::setSong(const MPDSong &s) { if (s.isNull()) { titleLabel->setText(MPDConnection::instance()->isConnected() ? "" : QString("

%1

").arg(tr("Not connected", "qmpdclient is not connected to MPD"))); artistLabel->setText(""); timeSlider->setEnabled(true); return; } // Disable time counting for streams timeSlider->setEnabled(s.type() != MPDSong::PLAYLISTSTREAM); // Ensure labels are not too small if window is hidden const int titleWidth = isVisible() ? titleLabel->width() : width() - 200; // const int artistWidth = isVisible() ? artistLabel->width() : width() - 200; QString title = elideRichText("

", s.title() , "

", titleWidth); QString artist = s.artist(); QString album = s.album(); if (!artist.isEmpty() && !album.isEmpty()) artist = QString("%1 - %2").arg(artist, album); else if (!artist.isEmpty()) artist += QString("%1").arg(artist); else if (!album.isEmpty()) artist += QString("%1").arg(album); titleLabel->setText(title); artistLabel->setText(artist); if (Config::instance()->submitSongsToLastFm()) m_lastFm->setSong(s); m_lyricsDialog->setSong(s); if (!m_lyricsDialog->isHidden()) m_lyricsDialog->updateLyrics(); if (Config::instance()->showCoverArt()) { m_coverArt->setSong(s); if (m_coverArt->hasCoverArt()) { coverArtButton->setIcon(m_coverArt->coverArt()); coverArtButton->setIconSize(QSize(50, 50)); coverArtButton->setVisible(true); } else coverArtButton->setVisible(false); } } void ControlPanel::showCoverArtChanged(bool a) { coverArtButton->setVisible(a && m_coverArt->hasCoverArt()); } qmpdclient-1.2.2/src/controlpanel.h000066400000000000000000000026571157363675200173450ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef CONTROLPANEL_H #define CONTROLPANEL_H #include "ui_controlpanel.h" class CoverArtDialog; class LyricsDialog; class MPDSong; class QShortcut; class LastFmSubmitter; class ControlPanel : public QWidget, public Ui::ControlPanel { Q_OBJECT public: ControlPanel(QWidget *); public slots: void updateTranslation(); private slots: void setSong(const MPDSong &); void showCoverArtChanged(bool); private: CoverArtDialog *m_coverArt; LyricsDialog *m_lyricsDialog; LastFmSubmitter * m_lastFm; QShortcut *m_fwdKey, *m_rwdKey, *m_volUpKey, *m_volDnKey; signals: void infoMsg(QString); }; #endif qmpdclient-1.2.2/src/coverartdialog.cpp000066400000000000000000000050571157363675200202020ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "coverartdialog.h" #include "config.h" #include "mpdsong.h" CoverArtDialog::CoverArtDialog(QWidget *parent) : QDialog(parent) { setWindowFlags(Qt::Tool); setupUi(this); } QPixmap CoverArtDialog::coverArt() const { return m_pixmap; } bool CoverArtDialog::hasCoverArt() const { return !m_pixmap.isNull(); } void CoverArtDialog::setSong(const MPDSong &s) { QDir imageDir((QFileInfo(Config::instance()->coverArtDir(), s.directory())).absoluteFilePath()); imageDir.setFilter(QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot | QDir::Readable); imageDir.setSorting(QDir::Name); QStringList formatList = Config::instance()->coverArtFilenameFormat().split(',', QString::SkipEmptyParts); QStringList::iterator it; for (it = formatList.begin(); it != formatList.end(); ++it) { *it = (*it).trimmed(); } imageDir.setNameFilters(formatList); if (imageDir.entryInfoList().count() == 0) { imageDir.setNameFilters(QStringList() << "*.jpg" << "*.jpeg" << "*.gif" << "*.png"); } const QString imageFile = imageDir.entryInfoList().value(0).absoluteFilePath(); setWindowTitle(QString("file:/").append(imageFile)); m_pixmap = QPixmap(imageFile); if (m_pixmap.isNull()) { coverArtImageLabel->setText(QObject::tr("No cover art found.")); } else { int mh = Config::instance()->coverArtMaxHeight().toInt(); int mw = Config::instance()->coverArtMaxWidth().toInt(); if (mh == 0) mh = 1024; if (mw == 0) mw = 768; // resize image if (m_pixmap.height() > mh) m_pixmap = m_pixmap.scaledToHeight(mh, Qt::SmoothTransformation); if (m_pixmap.width() > mw) m_pixmap = m_pixmap.scaledToWidth(mw, Qt::SmoothTransformation); coverArtImageLabel->setPixmap(m_pixmap); // set image } setFixedSize(minimumSizeHint()); } qmpdclient-1.2.2/src/coverartdialog.h000066400000000000000000000023001157363675200176330ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef COVERART_DIALOG_H #define COVERART_DIALOG_H #include "ui_coverartdialog.h" class MPDSong; class CoverArtDialog : public QDialog, private Ui::CoverArtDialog { public: CoverArtDialog(QWidget *); QPixmap coverArt() const; bool hasCoverArt() const; void setSong(const MPDSong &); private: QPixmap m_pixmap, m_pixmap_small; }; #endif //COVERART_DIALOG_H qmpdclient-1.2.2/src/debug.h000066400000000000000000000025451157363675200157270ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DEBUG_H #define DEBUG_H extern int g_debugLevel; #define DEBUG(STR, ...) qWarning(STR, ##__VA_ARGS__) #define DEBUG1(STR, ...) do { if (g_debugLevel > 0) qWarning(STR, ##__VA_ARGS__); } while (0) #define DEBUG2(STR, ...) do { if (g_debugLevel > 1) qWarning(STR, ##__VA_ARGS__); } while (0) #define DEBUG3(STR, ...) do { if (g_debugLevel > 2) qWarning(STR, ##__VA_ARGS__); } while (0) #define DEBUG4(STR, ...) do { if (g_debugLevel > 3) qWarning(STR, ##__VA_ARGS__); } while (0) #define BTS(A) A ? "true" : "false" #endif qmpdclient-1.2.2/src/directorymodel.cpp000066400000000000000000000120161157363675200202130ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "directorymodel.h" #include "mpddirectory.h" #include "mpdsong.h" #include #include DirectoryModel::DirectoryModel(QObject *parent) : QAbstractItemModel(parent) { setObjectName("directorymodel"); } int DirectoryModel::columnCount(const QModelIndex &) const { return 1; } QVariant DirectoryModel::data(const QModelIndex &index, int role) const { MPDDirectory i = directory(index); if (!i.isNull() && role == Qt::DisplayRole && index.column() == 0) return i.directoryName(); return QVariant(); } Qt::ItemFlags DirectoryModel::flags(const QModelIndex &index) const { if (!index.isValid()) return QAbstractItemModel::flags(index); return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled; } bool DirectoryModel::hasChildren(const QModelIndex &parent) const { // Top level if (!parent.isValid()) { return !m_root.isNull(); } // Children MPDDirectory i = directory(parent); if (!i.isNull()) { return i.childCount() > 0; } return false; } QVariant DirectoryModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole || orientation != Qt::Horizontal || section != 0) return QVariant(); return QObject::tr("Directory", "This is used as the header of directory-tree in directory view"); } QModelIndex DirectoryModel::index(int row, int column, const QModelIndex &parent) const { if (row < 0 || column != 0) return QModelIndex(); // Toplevel items if (!parent.isValid()) { if (row > 0) // Only one root return QModelIndex(); if (!m_root.isNull()) { Q_ASSERT(row == 0 && column == 0 && !m_root.isNull()); return createIndex(row, column, m_root); } Q_ASSERT(m_root.isNull()); return QModelIndex(); } // Non-toplevel items MPDDirectory parentDirectory = directory(parent); if (!parentDirectory.isNull() && row < parentDirectory.childCount()) { MPDDirectory directory = parentDirectory.child(row); if (!directory.isNull()) return createIndex(row, column, directory); } return QModelIndex(); } QModelIndex DirectoryModel::parent(const QModelIndex &index) const { MPDDirectory indexDirectory = directory(index); if (indexDirectory.isNull()) return QModelIndex(); MPDDirectory parentDirectory = indexDirectory.parent(); if (parentDirectory.isNull()) // Toplevel directory return QModelIndex(); MPDDirectory parentsparent = parentDirectory.parent(); if (!parentsparent.isNull()) // Find index of parent in parent's parent if any return createIndex(parentsparent.indexOfChild(parentDirectory), 0, parentDirectory); // Parent has no parent, parentDirectory is toplevel return createIndex(0, 0, parentDirectory); } int DirectoryModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) { const MPDDirectory parentDir = directory(parent); if (!parentDir.isNull()) { return parentDir.childCount(); } Q_ASSERT(false); } // Parent is not valid, requesting rowcount for toplevel dir. Always 1 or 0. return m_root.isNull() ? 0 : 1; } QList DirectoryModel::directories(const QModelIndexList &indexes) const { QList ret; foreach(QModelIndex index, indexes) { ret << directory(index); } return ret; } MPDDirectory DirectoryModel::directory(const QModelIndex &index) const { if (!index.isValid()) return MPDDirectory(); if (!index.internalPointer()) return MPDDirectory(); MPDDirectoryPointer *pointer = static_cast(index.internalPointer()); if (!pointer) return MPDDirectory(); return pointer->directory(); } QModelIndex DirectoryModel::createIndex(int row, int col, const MPDDirectory &dir) const { return QAbstractItemModel::createIndex(row, col, dir.pointer()); } void DirectoryModel::setRoot(const MPDDirectory &root) { m_root = root; reset(); } QStringList DirectoryModel::mimeTypes() const { return QStringList() << "qmpdclient/song"; } QMimeData *DirectoryModel::mimeData(const QModelIndexList &indexes) const { QByteArray encodedData; QDataStream stream(&encodedData, QIODevice::WriteOnly); foreach(MPDDirectory dir, directories(indexes)) { stream << MPDSong::createTest(dir.absolutePath()); } QMimeData *mimeData = new QMimeData; mimeData->setData("qmpdclient/song", encodedData); return mimeData; } qmpdclient-1.2.2/src/directorymodel.h000066400000000000000000000036141157363675200176640ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIRECTORYMODEL_H #define DIRECTORYMODEL_H #include #include "abstractmodel.h" #include "mpddirectory.h" class DirectoryModel : public QAbstractItemModel, public AbstractModel { public: DirectoryModel(QObject *); int rowCount(const QModelIndex & = QModelIndex()) const; int columnCount(const QModelIndex & = QModelIndex()) const; QVariant data(const QModelIndex &, int) const; Qt::ItemFlags flags(const QModelIndex &) const; bool hasChildren(const QModelIndex & = QModelIndex()) const; QVariant headerData(int, Qt::Orientation, int = Qt::DisplayRole) const; QModelIndex index(int, int, const QModelIndex & = QModelIndex()) const; QModelIndex parent(const QModelIndex &) const; QModelIndex createIndex(int, int, const MPDDirectory &) const; QList directories(const QModelIndexList &) const; MPDDirectory directory(const QModelIndex &) const; void setRoot(const MPDDirectory &); QStringList mimeTypes() const; QMimeData *mimeData(const QModelIndexList &) const; private: MPDDirectory m_root; QString m_search; }; #endif qmpdclient-1.2.2/src/directorypanel.cpp000066400000000000000000000025511157363675200202150ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include "directorypanel.h" DirectoryPanel::DirectoryPanel() { setupUi(this); directoryView->setFileView(fileView); directorySplit->restoreState(Config::instance()->directorySplitterSizes()); connect(fileFilter, SIGNAL(textChanged(const QString &)), fileView, SLOT(setFilter(const QString &))); } void DirectoryPanel::updateTranslation() { retranslateUi(this); } void DirectoryPanel::on_directorySplit_splitterMoved(int, int) { Config::instance()->setDirectorySplitterSizes(directorySplit->saveState()); } qmpdclient-1.2.2/src/directorypanel.h000066400000000000000000000022061157363675200176570ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIRECTORIESPANEL_H #define DIRECTORIESPANEL_H #include "ui_directorypanel.h" class DirectoryPanel : public QWidget, private Ui::DirectoryPanel { Q_OBJECT public: DirectoryPanel(); public slots: void updateTranslation(); private slots: void on_directorySplit_splitterMoved(int, int); }; #endif qmpdclient-1.2.2/src/directoryview.cpp000066400000000000000000000057161157363675200200760ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include "directorymodel.h" #include "directoryview.h" #include "fileview.h" #include "iconmanager.h" #include "mpdcache.h" #include "mpddirectory.h" #include "mpdsonglist.h" #include DirectoryView::DirectoryView(QWidget *parent) : AbstractTree(parent) { Q_ASSERT(m_menu); setObjectName("directoryview"); setModel(m_model = new DirectoryModel(this)); // playlist m_menu m_enqueueAction = addMenuAction("enqueue", this, SLOT(enqueue())); m_playAction = addMenuAction("play", this, SLOT(play())); m_menu->addSeparator(); m_rescanAction = addMenuAction("rescan", this, SLOT(rescan())); m_menu->addSeparator(); m_informationAction = addMenuAction("information", this, SLOT(information())); connect(MPDCache::instance(), SIGNAL(directoriesUpdated(const MPDDirectory &)), this, SLOT(setRoot(const MPDDirectory &))); clearSelection(); } void DirectoryView::setFileView(FileView *fw) { m_fileView = fw; } void DirectoryView::updateTranslation() { Q_ASSERT(m_enqueueAction); Q_ASSERT(m_informationAction); Q_ASSERT(m_rescanAction); Q_ASSERT(m_playAction); m_enqueueAction->setText(tr("&Enqueue")); m_informationAction->setText(tr("&Information...")); m_rescanAction->setText(tr("&Rescan directory")); m_playAction->setText(tr("&Play")); } void DirectoryView::selectionChanged(const QItemSelection &s, const QItemSelection &u) { Q_ASSERT(m_fileView); AbstractTree::selectionChanged(s, u); m_fileView->setSongs(selectedSongsShallow()); } void DirectoryView::setRoot(const MPDDirectory &root) { Q_ASSERT(m_model); m_model->setRoot(root); // Expand root setExpanded(m_model->index(0, 0, QModelIndex()), true); setCurrentIndex(m_model->index(0, 0)); } MPDSongList DirectoryView::selectedSongsShallow() const { Q_ASSERT(m_model); return MPDCache::instance()->songsByDirectories(m_model->directories(selectedIndexes())); } MPDSongList DirectoryView::selectedSongs() const { Q_ASSERT(m_model); return MPDCache::instance()->songsByDirectories(m_model->directories(selectedIndexes()), true); } void DirectoryView::rescan() { Q_ASSERT(m_model); MPDCache::instance()->rescan(m_model->directories(selectedIndexes())); } qmpdclient-1.2.2/src/directoryview.h000066400000000000000000000030451157363675200175340ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIRECTORYVIEW_H #define DIRECTORYVIEW_H #include "abstractview.h" class DirectoryModel; class FileView; class MPDDirectory; class DirectoryView : public AbstractTree { Q_OBJECT public: DirectoryView(QWidget *); void setFileView(FileView *); MPDSongList selectedSongs() const; // Non-recursive MPDSongList selectedSongsShallow() const; public slots: void updateTranslation(); private slots: void rescan(); void setRoot(const MPDDirectory &); private: void selectionChanged(const QItemSelection & = QItemSelection(), const QItemSelection & = QItemSelection()); DirectoryModel *m_model; FileView *m_fileView; QAction *m_enqueueAction, *m_informationAction, *m_rescanAction, *m_playAction; }; #endif qmpdclient-1.2.2/src/dynamicplaylist.cpp000066400000000000000000000052151157363675200203770ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include "dynamicplaylist.h" #include "mpd.h" #include "mpdcache.h" #include DynamicPlaylist::DynamicPlaylist(QObject *parent) : QObject(parent) { setObjectName("dynamicplaylist"); connect(MPD::instance(), SIGNAL(playingSongUpdated(const MPDSong &)), this, SLOT(autoAdd(const MPDSong &))); connect(MPD::instance(), SIGNAL(playingSongUpdated(const MPDSong &)), this, SLOT(autoRemove(const MPDSong &))); connect(MPD::instance(), SIGNAL(playlistUpdated(const MPDSongList &)), this, SLOT(playlistUpdated(const MPDSongList &))); } void DynamicPlaylist::playlistUpdated(const MPDSongList &fs) { m_playlist = fs; } void DynamicPlaylist::autoAdd(const MPDSong &song) { if (song.isNull() || !Config::instance()->autoAddSongs()) return; if (m_playlist.indexOf(song) >= m_playlist.size() - (1 + Config::instance()->autoAddPos())) { MPDSongList add = MPDSongList(); if(Config::instance()->autoAddAlbums()) { QStringList albums = MPDCache::instance()->albumsByArtists(QStringList(QString())); if(!albums.empty()) { int rnd = qrand() % albums.size(); QStringList album = albums.mid(rnd, 1); add = MPDCache::instance()->songsByAlbums(album); } } else { add = MPDCache::instance()->randomSongs(1 + Config::instance()->autoAddPos() - (m_playlist.size() - m_playlist.indexOf(song))); } MPD::instance()->addSongs(add); } } void DynamicPlaylist::autoRemove(const MPDSong &song) { if (m_lastPlaying.isNull() || song.isNull() || song.id() == m_lastPlaying.id() || !Config::instance()->autoRemoveSongs()) { m_lastPlaying = song; return; } // Find song's new ID. foreach(MPDSong s, m_playlist) { if (!m_lastPlaying.isNull() && s.url() == m_lastPlaying.url()) { MPDSongList list; list << s; MPD::instance()->removeSongs(list); break; } } m_lastPlaying = song; } qmpdclient-1.2.2/src/dynamicplaylist.h000066400000000000000000000023211157363675200200370ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DYNAMIC_PLAYLIST_H #define DYNAMIC_PLAYLIST_H #include #include "mpdsonglist.h" class DynamicPlaylist : public QObject { Q_OBJECT public: DynamicPlaylist(QObject *); private slots: void autoAdd(const MPDSong &); void autoRemove(const MPDSong &); void playlistUpdated(const MPDSongList &); private: MPDSong m_lastPlaying; MPDSongList m_playlist; }; #endif qmpdclient-1.2.2/src/fileview.cpp000066400000000000000000000026501157363675200170030ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "fileview.h" #include "mpdsongmodel.h" FileView::FileView(QWidget *parent) : MPDSongView(parent) { setObjectName("fileview"); setHeaderView(new FilelistHeader(this)); } MPDSongList FileView::selectedSongs() const { Q_ASSERT(m_model); return m_model->songs(selectedIndexes()); } FilelistHeader::FilelistHeader(QWidget *p) : MPDSongViewHeader(p) { setObjectName("filelistheader"); } void FilelistHeader::setDefaults() { int i = 0; foreach (Column col, m_columns) { if (col == FILENAME) setSortIndicator(i, Qt::AscendingOrder); else setSectionHidden(i, true); ++i; } } qmpdclient-1.2.2/src/fileview.h000066400000000000000000000021741157363675200164510ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef FILEVIEW_H #define FILEVIEW_H #include "mpdsongview.h" class FileView : public MPDSongView { public: FileView(QWidget *); MPDSongList selectedSongs() const; }; class FilelistHeader: public MPDSongViewHeader { public: FilelistHeader(QWidget *); private: void setDefaults(); }; #endif qmpdclient-1.2.2/src/headerview.cpp000066400000000000000000000113521157363675200173130ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include "headerview.h" #include #include const int HEADER_FORMAT = 108; HeaderView::HeaderView(QWidget *p) : QHeaderView(Qt::Horizontal, p), m_menu(new QMenu(this)) { setMovable(true); connect(Config::instance(), SIGNAL(autoResizeChanged(bool)), this, SLOT(autoResizeChanged(bool))); } void HeaderView::mouseReleaseEvent(QMouseEvent *e) { // sectionClicked(int) signal is emitted too early, and thus saves the previous sortorder. // Therefore we save it here. QHeaderView::mouseReleaseEvent(e); save(); } void HeaderView::autoResizeChanged(bool a) { if (!a) { setResizeMode(QHeaderView::Interactive); setStretchLastSection(true); return; } setUpdatesEnabled(false); setStretchLastSection(false); for (int i = 0; i < m_columns.size(); i++) { if (visualIndex(i) < 0) continue; Column col = m_columns.at(i); if (col == TRACK || col == LENGTH || col == DATE) setResizeMode(i, QHeaderView::ResizeToContents); else setResizeMode(i, QHeaderView::Stretch); } setUpdatesEnabled(true); if (model()) update(); } void HeaderView::restore() { Q_ASSERT(m_menu); Q_ASSERT(model()); blockSignals(true); // Restore view state QByteArray ba2(Config::instance()->headerViewState(objectName())); if (!ba2.isEmpty()) { QDataStream ds2(&ba2, QIODevice::ReadOnly); int version; ds2 >> version; if (version == HEADER_FORMAT) { for (int j = 0;j < model()->columnCount();j++) { int size, vi; bool hidden; ds2 >> size >> vi >> hidden; resizeSection(j, size); moveSection(visualIndex(j), vi); setSectionHidden(j, hidden); } int sortOrder, sortSection; ds2 >> sortOrder >> sortSection; setSortIndicator(sortSection, (Qt::SortOrder)sortOrder); } else { // Header state was of incorrect version. Use defaults. setDefaults(); } } else { // Header state was empty. Use defaults. setDefaults(); } for (int i = 0; i < m_columns.size(); i++) { QAction *a = m_menu->addAction(columnName(m_columns.at(i)), this, SLOT(actionTriggered())); a->setCheckable(true); a->setChecked(!isSectionHidden(i)); } autoResizeChanged(Config::instance()->autoResizeColumns()); blockSignals(false); } void HeaderView::save() { Q_ASSERT(model()); // Save headerview state QByteArray ba; QDataStream ds(&ba, QIODevice::ReadWrite); ds << HEADER_FORMAT; for (int i = 0;i < model()->columnCount();i++) { if (isSectionHidden(i)) ds << 100; else ds << sectionSize(i); ds << visualIndex(i); ds << isSectionHidden(i); } ds << (int)sortIndicatorOrder(); ds << sortIndicatorSection(); Config::instance()->setHeaderViewState(objectName(), ba); } void HeaderView::contextMenuEvent(QContextMenuEvent *event) { if (m_columns.size() > 1) { Q_ASSERT(m_menu); m_menu->popup(event->globalPos()); } } void HeaderView::actionTriggered() { Q_ASSERT(m_menu); blockSignals(true); int i = 0; foreach(QAction *a, m_menu->actions()) { setSectionHidden(i++, !a->isChecked()); } blockSignals(false); save(); } QList HeaderView::columns() const { return m_columns; } QString HeaderView::columnName(Column col) const { switch (col) { case HeaderView::TITLE: return QObject::tr("Title"); case HeaderView::TRACK: return QObject::tr("Track"); case HeaderView::ARTIST: return QObject::tr("Artist"); case HeaderView::ALBUM: return QObject::tr("Album"); case HeaderView::LENGTH: return QObject::tr("Length"); case HeaderView::URL: return QObject::tr("URL"); case HeaderView::FILENAME: return QObject::tr("Filename"); case HeaderView::GENRE: return QObject::tr("Genre"); case HeaderView::DATE: return QObject::tr("Date"); case HeaderView::COMMENT: return QObject::tr("Comment"); case HeaderView::DISC: return QObject::tr("Disc"); case HeaderView::COMPOSER: return QObject::tr("Composer"); case HeaderView::PERFORMER: return QObject::tr("Performer"); default: return "?"; } } qmpdclient-1.2.2/src/headerview.h000066400000000000000000000032601157363675200167570ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef HEADERVIEW_H #define HEADERVIEW_H #include class HeaderView : public QHeaderView { Q_OBJECT public: enum Column { TRACK = 0, TITLE = 1, ARTIST = 2, ALBUM = 3, GENRE = 4, COMPOSER = 5, DATE = 6, LENGTH = 7, URL = 8, FILENAME = 9, DISC = 10, COMMENT = 11, PERFORMER = 12 }; HeaderView(QWidget *); void restore(); QList columns() const; virtual QString columnName(Column) const; protected: void contextMenuEvent(QContextMenuEvent *); void mouseReleaseEvent(QMouseEvent *); virtual void setDefaults() = 0; QList m_columns; QMenu *m_menu; private slots: void autoResizeChanged(bool); void actionTriggered(); void save(); }; #endif qmpdclient-1.2.2/src/iconmanager.cpp000066400000000000000000000053571157363675200174630ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "iconmanager.h" #include "config.h" #include "debug.h" #include #include QMap IconManager::actionIconMap; QString IconManager::descriptionString; void IconManager::update() { actionIconMap.clear(); QString path = Config::instance()->iconSetPath(); QString confFile = path + "/iconset.conf"; if (!QFile::exists(confFile)) { qWarning("Could not find 'iconset.conf' in iconset %s", qPrintable(path)); return; } // Read action filenames QSettings conf(confFile, QSettings::IniFormat); conf.beginGroup("Icons"); foreach(QString key, conf.allKeys()) { QString value = conf.value(key).toString(); if (value.isEmpty()) continue; actionIconMap.insert(key, path + "/" + value); } conf.endGroup(); // Read description conf.beginGroup("Iconset"); QString title = conf.value("Name").toString(); QString desc = conf.value("Description").toString(); conf.endGroup(); if (title.isEmpty()) title = QFileInfo(path).baseName(); descriptionString = "" + title + ""; if (!desc.isEmpty()) descriptionString += "
" + desc; } QString IconManager::description() { return descriptionString; } QString IconManager::filename(const QString &action) { QString filename = actionIconMap.value(action.toLower()); if (filename.isEmpty()) { return QString(); } if (!QFile::exists(filename)) { qWarning("Icon file %s does not exist.", qPrintable(filename)); return QString(); } return filename; } QIcon IconManager::icon(const QString &action, int size) { return QIcon(pixmap(action, size)); } QPixmap IconManager::pixmap(const QString &action, int size) { QString fn = filename(action); if (fn.isEmpty()) return QPixmap(); QPixmap pix = QPixmap(fn); if (pix.width() == size && pix.height() == size) return pix; if (pix.width() > pix.height()) return pix.scaledToWidth(size, Qt::SmoothTransformation); return pix.scaledToHeight(size, Qt::SmoothTransformation); } qmpdclient-1.2.2/src/iconmanager.h000066400000000000000000000023711157363675200171210ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ICONMANAGER_H #define ICONMANAGER_H #include class QIcon; class QPixmap; class IconManager { public: static void update(); static QString description(); static QIcon icon(const QString &, int size = 16); static QPixmap pixmap(const QString &, int size = 16); private: static QString filename(const QString &); static QMap actionIconMap; static QString descriptionString; }; #endif qmpdclient-1.2.2/src/idealbar.cpp000066400000000000000000000057301157363675200167360ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "idealbar.h" #include "idealsplitter.h" #include "verticalbutton.h" #include #include #include IdealBar::IdealBar(QWidget *parent) : QWidget(parent), m_stack(0), m_layout(new QVBoxLayout(this)), m_splitter(0) { Q_ASSERT(m_layout); setObjectName("idealbar"); setMinimumWidth(22); m_layout->setMargin(0); m_layout->setSpacing(3); m_layout->addItem(new QSpacerItem(16, 20, QSizePolicy::Minimum, QSizePolicy::Expanding)); } QPushButton *IdealBar::addPanel(QWidget *panel, bool left) { Q_ASSERT(m_layout); Q_ASSERT(m_stack); QFrame *frame = new QFrame(m_stack); frame->setFrameStyle(QFrame::StyledPanel); QVBoxLayout *vb = new QVBoxLayout(frame); vb->addWidget(panel); m_stack->addWidget(frame); VerticalButton *pb = new VerticalButton("", this, left); connect(pb, SIGNAL(pressed()), this, SLOT(buttonPressed())); m_layout->insertWidget(m_layout->count() - 1, pb); m_relation.insert(pb, frame); return pb; } void IdealBar::paintEvent(QPaintEvent *e) { foreach (VerticalButton *b, m_relation.keys()) { Q_ASSERT(m_stack); Q_ASSERT(m_splitter); if (m_splitter->isCollapsed(m_index)) b->setActive(false); else b->setActive(m_relation.value(b) == m_stack->currentWidget()); } QWidget::paintEvent(e); } void IdealBar::buttonPressed() { Q_ASSERT(m_splitter); Q_ASSERT(m_stack); VerticalButton *button = qobject_cast(sender()); QWidget *panel = m_relation.value(button); if (m_splitter->isCollapsed(m_index)) // Open a closed tab m_splitter->setExpanded(m_index); else if (button->isActive()) {// Close current tab m_splitter->setCollapsed(m_index); if (m_splitter->isCollapsed(m_index ? 0 : 1)) m_splitter->setExpanded(m_index ? 0 : 1); } m_stack->setCurrentWidget(panel); update(); } void IdealBar::link(QStackedWidget *s, IdealSplitter *sp) { if (!m_stack) m_stack = s; if (!m_splitter) { m_splitter = sp; Q_ASSERT(m_stack); Q_ASSERT(m_splitter); m_index = m_splitter->indexOf(m_stack); connect(m_splitter, SIGNAL(sectionCollapsed(int)), this, SLOT(update())); connect(m_splitter, SIGNAL(sectionExpanded(int)), this, SLOT(update())); } } qmpdclient-1.2.2/src/idealbar.h000066400000000000000000000026531157363675200164040ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef IDEALBAR_H #define IDEALBAR_H #include #include class IdealBar; class IdealSplitter; class VerticalButton; class QPushButton; class QStackedWidget; class QVBoxLayout; class IdealBar : public QWidget { Q_OBJECT public: IdealBar(QWidget *); QPushButton *addPanel(QWidget *panel, bool = false); void link(QStackedWidget *, IdealSplitter *); private slots: void buttonPressed(); private: void paintEvent(QPaintEvent *); QMap m_relation; QStackedWidget *m_stack; QVBoxLayout *m_layout; IdealSplitter *m_splitter; int m_index; }; #endif qmpdclient-1.2.2/src/idealsplitter.cpp000066400000000000000000000042211157363675200200320ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "idealsplitter.h" IdealSplitter::IdealSplitter(QWidget *parent) : QSplitter(parent), prevComplete(QList() << 100 << 100) { setObjectName("idealsplitter"); connect(this, SIGNAL(splitterMoved(int, int)), this, SLOT(manuallyResized())); } void IdealSplitter::restore(const QByteArray &ba) { prevSizes = QList() << 0 << 0; QSplitter::restoreState(ba); manuallyResized(); } void IdealSplitter::setCollapsed(int index) { QList siz = sizes(); siz[index] = 0; setSizes(siz); emit sectionCollapsed(index); } void IdealSplitter::setExpanded(int index) { QList siz = sizes(); if (siz.at(!index) != 0) { // Other is open, restore last complete state siz = prevComplete; } else siz[index] = 100; setSizes(siz); emit sectionExpanded(index); } bool IdealSplitter::isCollapsed(int index) const { return sizes().at(index) == 0; } void IdealSplitter::manuallyResized() { QList siz = sizes(); for (int i = 0; i < siz.size() && i < prevSizes.size(); i++) { if (siz.at(i) != 0 && prevSizes.at(i) == 0) emit sectionExpanded(i); if (siz.at(i) == 0 && prevSizes.at(i) != 0) emit sectionCollapsed(i); } } void IdealSplitter::paintEvent(QPaintEvent *e) { QSplitter::paintEvent(e); QList siz = prevSizes = sizes(); foreach(int s, siz) { if (s == 0) return; } prevComplete = siz; } qmpdclient-1.2.2/src/idealsplitter.h000066400000000000000000000024701157363675200175030ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef IDEALSPLITTER_H #define IDEALSPLITTER_H #include class IdealSplitter : public QSplitter { Q_OBJECT public: IdealSplitter(QWidget *parent); void setCollapsed(int); void setExpanded(int); void restore(const QByteArray &); bool isCollapsed(int) const; signals: void sectionCollapsed(int); void sectionExpanded(int); protected: void paintEvent(QPaintEvent *); private slots: void manuallyResized(); private: QList prevComplete, prevSizes; }; #endif qmpdclient-1.2.2/src/lastfmsubmitter.cpp000066400000000000000000000257171157363675200204270ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * Copyright (C) 2009 Voker57 * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lastfmsubmitter.h" #include "config.h" #include "mpd.h" #include #include #include #include #include #include #include #include #include #include LastFmSubmitter::LastFmSubmitter(QObject * parent) : QObject(parent) { m_npPending = false; m_awaitingHS = false; m_awaitingScrob = false; m_failed = 0; m_session = ""; m_npUrl = ""; // we will get it after handshake m_subUrl = ""; // we will get it after handshake m_hardFailTimer = new QTimer(this); m_hardFailTimer->setInterval(60*1000); m_hardFailTimer->setSingleShot(true); m_scrobbleTimer = new PausableTimer(); m_scrobbleTimer->setInterval(9000000); // huge number to avoid scrobbling just started song start (rare case) m_scrobbleTimer->setSingleShot(true); m_npTimer = new PausableTimer(); m_npTimer->setSingleShot(true); m_npTimer->setInterval(5000); m_scrobbleRetryTimer = new QTimer(this); m_scrobbleRetryTimer->setSingleShot(true); m_scrobbleRetryTimer->setInterval(10000); m_netAccess = new QNetworkAccessManager(this); connect(m_netAccess, SIGNAL(finished(QNetworkReply *)), this, SLOT(gotNetReply(QNetworkReply *))); connect(m_scrobbleTimer, SIGNAL(timeout()), this, SLOT(scrobbleCurrent())); connect(m_scrobbleRetryTimer, SIGNAL(timeout()), this, SLOT(scrobbleQueued())); connect(m_npTimer, SIGNAL(timeout()), this, SLOT(sendNowPlaying())); connect(m_hardFailTimer, SIGNAL(timeout()), this, SLOT(doHandshake())); connect(MPD::instance(), SIGNAL(stateUpdated(bool)), this, SLOT(mpdStateUpdated(bool))); createScrobblerCacheFileIfRequired(); readScrobblerCache(); if (!m_songQueue.isEmpty()) { scrobbleQueued(); } } LastFmSubmitter::~LastFmSubmitter() { delete m_hardFailTimer; delete m_scrobbleTimer; delete m_npTimer; delete m_scrobbleRetryTimer; delete m_netAccess; writeScrobblerCache(); } void LastFmSubmitter::setSong(const MPDSong & s) { m_npTimer->setInterval(5000); m_scrobbleTimer->setInterval(s.secs() < 480 ? s.secs()*Config::instance()->lastFmScrobblerTimer()*10 : 240000); if (m_currentSong != s) { m_currentSong = s; if (MPD::instance()->isPlaying()) { if (s.type() == MPDSong::PLAYLISTSTREAM) { m_scrobbleTimer->setInterval(60*1000); // How else should i handle _stream_? // qDebug() << "starting scrobble timer" << m_scrobbleTimer->interval(); mpdStateUpdated(true); } else if (s.secs() > 30) { mpdStateUpdated(true); } } } } void LastFmSubmitter::sendNowPlaying() { m_npPending = true; if (ensureHandshaked()) { scrobbleNp(m_currentSong); m_npPending = false; } } void LastFmSubmitter::scrobbleNp(MPDSong & s) { // kinda ugly code QString data = QString("s=%1&").arg(m_session); data += QString("a=%1&").arg(QString(QUrl::toPercentEncoding(s.artist()))); data += QString("t=%1&").arg(QString(QUrl::toPercentEncoding(s.title()))); data += QString("b=%1&").arg(QString(QUrl::toPercentEncoding(s.album()))); data += QString("l=%1&").arg(s.secs() >0 ? QString::number(s.secs()) : "100"); data += QString("n=%1").arg(QString(QUrl::toPercentEncoding(s.track()))); //qDebug() << data; m_netAccess->post(QNetworkRequest(QUrl(m_npUrl)), data.toAscii()); } void LastFmSubmitter::scrobbleCurrent() { m_songQueue.enqueue(QPair(m_currentSong, m_currentStarted)); emit infoMsg(tr("Will scrobble this track.")); scrobbleQueued(); } void LastFmSubmitter::scrobbleQueued() { if (!ensureHandshaked() || m_awaitingScrob) { if (!m_scrobbleRetryTimer->isActive()) m_scrobbleRetryTimer->start(); return; } QString data = QString("s=%1&").arg(m_session); int i = 0; emit infoMsg(tr("Scrobbling %1 songs...").arg(m_songQueue.size())); //qDebug() << "trying scrobble "<< m_songQueue.size() << " songs"; while(!m_songQueue.isEmpty()) { QPair sPair = m_songQueue.dequeue(); data += QString("r[%2]=&m[%2]=&a[%2]=%1&").arg(QString(QUrl::toPercentEncoding(sPair.first.artist())), QString::number(i)); data += QString("o[%2]=%1&").arg( ( (sPair.first.type() == MPDSong::STREAM) || (sPair.first.type() == MPDSong::PLAYLISTSTREAM)) ? "E" : "P", QString::number(i) ); data += QString("t[%2]=%1&").arg(QString(QUrl::toPercentEncoding(sPair.first.title())), QString::number(i)); data += QString("b[%2]=%1&").arg(QString(QUrl::toPercentEncoding(sPair.first.album())), QString::number(i)); data += QString("l[%2]=%1&").arg(sPair.first.secs() >0 ? QString::number(sPair.first.secs()) : "", QString::number(i)); data += QString("i[%2]=%1&").arg(QString::number(sPair.second), QString::number(i)); data += QString("n[%2]=%1&").arg(QString(QUrl::toPercentEncoding(sPair.first.track())), QString::number(i)); m_lastScrobbledSongs.enqueue(sPair); ++i; } if (i>0) { //qDebug() << "sending scrobble to " << m_subUrl.toAscii(); //qDebug() << "data: " << data.toAscii(); m_netAccess->post(QNetworkRequest(QUrl(m_subUrl)), data.toAscii()); m_awaitingScrob = true; } } bool LastFmSubmitter::ensureHandshaked() { if(!m_session.isEmpty()) return true; doHandshake(); return false; } QByteArray LastFmSubmitter::getPasswordHash() { QByteArray passwordHash; if (Config::instance()->lastFmHashedPassword()) passwordHash = Config::instance()->lastFmPassword().toAscii(); else passwordHash = QCryptographicHash::hash( Config::instance()->lastFmPassword().toAscii(), QCryptographicHash::Md5).toHex(); //accomplish it with current time passwordHash = QCryptographicHash::hash( passwordHash + QByteArray::number((uint)time(NULL)), QCryptographicHash::Md5); return passwordHash; } QUrl LastFmSubmitter::handshakeUrl() { QUrl url = QUrl(); url.setScheme("http"); url.setHost(Config::instance()->lastFmServer()); url.setPath("/"); return url; } void LastFmSubmitter::doHandshake() { if (m_hardFailTimer->isActive() || m_awaitingHS) { //qDebug("handshaking delayed"); return; } QUrl hsUrl = handshakeUrl(); hsUrl.addQueryItem("hs", "true"); hsUrl.addQueryItem("p", "1.2.1"); hsUrl.addQueryItem("c", "qmn"); hsUrl.addQueryItem("v", VERSION); hsUrl.addQueryItem("u", Config::instance()->lastFmUsername()); hsUrl.addQueryItem("t", QString::number(time(NULL))); hsUrl.addQueryItem("a", getPasswordHash().toHex()); m_netAccess->get(QNetworkRequest(hsUrl)); //qDebug() << "handshake sent to " << hsUrl.toString(); m_awaitingHS = true; } void LastFmSubmitter::gotNetReply(QNetworkReply * reply) { //qDebug("gotNetReply..."); if (reply->error() != QNetworkReply::NoError) { //qDebug() << "Error:" << reply->errorString(); return; } QStringList data = QString(reply->readAll()).split("\n"); if(data.size()==0) return; QUrl reqUrl = reply->url(); reqUrl.setQueryItems(QList >()); //qDebug( (QString("reply from ")+reqUrl.toString()).toAscii().data()); bool handled= false; // Is this is a handshake reply? if(reqUrl==handshakeUrl()) { m_awaitingHS = false; if(data.size() >= 4 && data[0]=="OK") { handled = true; m_session=data[1]; m_npUrl=data[2]; m_subUrl=data[3]; //qDebug( (QString("hsake result: npurl: ")+m_npUrl+" suburl: "+m_subUrl).toAscii().data()); if(m_npPending) sendNowPlaying(); } else if(data[0]=="BADAUTH") { handled = true; emit infoMsg(tr("Last.Fm authentication failed: check your credentials")); } else if(data[0]=="BADTIME") { handled = true; emit infoMsg(tr("Cannot submit to Last.Fm: system clock is skewed")); } } else // Ok... maybe we were scrobbling something? if (reqUrl.toString() == m_subUrl) { m_awaitingScrob = false; if (data[0] == "OK") { handled = true; m_lastScrobbledSongs.clear(); emit infoMsg(tr("Successfully scrobbled")); } else { m_songQueue << m_lastScrobbledSongs; m_lastScrobbledSongs.clear(); } } else if(reqUrl.toString() == m_npUrl && data[0] == "OK") { handled=true; emit infoMsg(tr("Now Playing sent")); m_npTimer->setInterval(5000); // refreshes the interval, because previous song could be paused } // Was i bad player and now there's bad session? if(data[0] == "BADSESSION") { handled = true; m_session.clear(); doHandshake(); } if(data[0].startsWith("FAILED")) { QStringList dat = data[0].split(" "); if(dat.size() >1) emit infoMsg(tr("Last.Fm error: %1").arg(dat.join(" "))); } if(!handled) { m_failed++; //qDebug() << "Failed Reply:" << reqUrl.toString() << data; } else m_failed=0; if(m_failed > 2 && !m_hardFailTimer->isActive()) { m_session.clear(); m_hardFailTimer->setInterval((m_failed > 120 ? 120 : m_failed)*60*1000); m_hardFailTimer->start(); } } void LastFmSubmitter::createScrobblerCacheFileIfRequired() { if (!QFile::exists(QDir::toNativeSeparators(QDir::homePath() + "/.config/QMPDClient/scrobbler.cache"))) { QFile scrobblerCacheFile(QDir::toNativeSeparators(QDir::homePath() + "/.config/QMPDClient/scrobbler.cache")); if (scrobblerCacheFile.open(QIODevice::WriteOnly)) { scrobblerCacheFile.close(); } } } void LastFmSubmitter::readScrobblerCache() { QFile scrobblerCacheFile(QDir::toNativeSeparators(QDir::homePath() + "/.config/QMPDClient/scrobbler.cache")); if (scrobblerCacheFile.open(QIODevice::ReadOnly)) { QDataStream in(&scrobblerCacheFile); in >> m_songQueue; scrobblerCacheFile.resize(0); scrobblerCacheFile.close(); } } void LastFmSubmitter::writeScrobblerCache() { bool sqEmpty = m_songQueue.isEmpty(), lssEmpty = m_lastScrobbledSongs.isEmpty(); if (!lssEmpty || !sqEmpty) { QFile scrobblerCacheFile(QDir::toNativeSeparators(QDir::homePath() + "/.config/QMPDClient/scrobbler.cache")); if (scrobblerCacheFile.open(QIODevice::WriteOnly)) { QDataStream out(&scrobblerCacheFile); if (!lssEmpty) { out << m_lastScrobbledSongs; } if (!sqEmpty) { out << m_songQueue; } scrobblerCacheFile.close(); } } } void LastFmSubmitter::mpdStateUpdated(bool b) { if (Config::instance()->submitSongsToLastFm()) { if (MPD::instance()->isPaused()) { m_scrobbleTimer->pause(); m_npTimer->pause(); } else if (b) { m_currentStarted = time(NULL); m_scrobbleTimer->start(); m_npTimer->start(); } else if (!b) { m_scrobbleTimer->stop(); m_npTimer->stop(); m_npTimer->setInterval(5000); } } } qmpdclient-1.2.2/src/lastfmsubmitter.h000066400000000000000000000042341157363675200200630ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * Copyright (C) 2009 Voker57 * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef LASTFMSUBMITTER_H #define LASTFMSUBMITTER_H #include "mpdsong.h" #include "pausabletimer.h" #include #include #include #include #include class QNetworkAccessManager; class QNetworkReply; class QTimer; class LastFmSubmitter : public QObject { Q_OBJECT public: LastFmSubmitter(QObject * parent = 0); ~LastFmSubmitter(); void setSong(const MPDSong & s); protected: bool ensureHandshaked(); void scrobbleNp(MPDSong & s); QByteArray getPasswordHash(); QString m_session; QString m_npUrl; QString m_subUrl; int m_currentStarted; QNetworkAccessManager * m_netAccess; QQueue > m_songQueue, m_lastScrobbledSongs; MPDSong m_currentSong; PausableTimer * m_scrobbleTimer; QTimer * m_scrobbleRetryTimer; PausableTimer * m_npTimer; QTimer * m_hardFailTimer; bool m_npPending, m_awaitingHS, m_awaitingScrob; bool m_lastScrobbleFailed; int m_failed; protected slots: void gotNetReply(QNetworkReply *); void scrobbleCurrent(); void scrobbleQueued(); void sendNowPlaying(); void doHandshake(); void mpdStateUpdated(bool); signals: void infoMsg(QString); private: void readScrobblerCache(); void writeScrobblerCache(); void createScrobblerCacheFileIfRequired(); QUrl handshakeUrl(); }; #endif // LASTFMSUBMITTER_H qmpdclient-1.2.2/src/libmpdclient.c000066400000000000000000001466151157363675200173110ustar00rootroot00000000000000/* libmpdclient (c)2003-2006 by Warren Dukes (warren.dukes@gmail.com) This project's homepage is: http://www.musicpd.org Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Music Player Daemon nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "libmpdclient.h" #include #include #include #include #include #include #include #include #include #include #ifdef WIN32 # include # include #else # include # include # include # include #endif /* (bits+1)/3 (plus the sign character) */ #define INTLEN ((sizeof(int) * CHAR_BIT + 1) / 3 + 1) #define LONGLONGLEN ((sizeof(long long) * CHAR_BIT + 1) / 3 + 1) #define COMMAND_LIST 1 #define COMMAND_LIST_OK 2 #ifndef MPD_NO_GAI # ifdef AI_ADDRCONFIG # define MPD_HAVE_GAI # endif #endif #ifndef MSG_DONTWAIT # define MSG_DONTWAIT 0 #endif #ifdef WIN32 # define SELECT_ERRNO_IGNORE (errno == WSAEINTR || errno == WSAEINPROGRESS) # define SENDRECV_ERRNO_IGNORE SELECT_ERRNO_IGNORE #else # define SELECT_ERRNO_IGNORE (errno == EINTR) # define SENDRECV_ERRNO_IGNORE (errno == EINTR || errno == EAGAIN) # define winsock_dll_error(c) 0 # define closesocket(s) close(s) # define WSACleanup() do { /* nothing */ } while (0) #endif #ifdef WIN32 static int winsock_dll_error(mpd_Connection *connection) { WSADATA wsaData; if ((WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0 || LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2 ) { strcpy(connection->errorStr, "Could not find usable WinSock DLL."); connection->error = MPD_ERROR_SYSTEM; return 1; } return 0; } static int do_connect_fail(mpd_Connection *connection, const struct sockaddr *serv_addr, int addrlen) { int iMode = 1; /* 0 = blocking, else non-blocking */ ioctlsocket(connection->sock, FIONBIO, (u_long FAR*) &iMode); return (connect(connection->sock,serv_addr,addrlen) == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK); } #else /* !WIN32 (sane operating systems) */ static int do_connect_fail(mpd_Connection *connection, const struct sockaddr *serv_addr, int addrlen) { int flags = fcntl(connection->sock, F_GETFL, 0); fcntl(connection->sock, F_SETFL, flags | O_NONBLOCK); return (connect(connection->sock,serv_addr,addrlen)<0 && errno!=EINPROGRESS); } #endif /* !WIN32 */ #ifdef MPD_HAVE_GAI static int mpd_connect(mpd_Connection * connection, const char * host, int port, float timeout) { int error; char service[INTLEN+1]; struct addrinfo hints; struct addrinfo *res = NULL; struct addrinfo *addrinfo = NULL; /** * Setup hints */ hints.ai_flags = AI_ADDRCONFIG; hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_addrlen = 0; hints.ai_addr = NULL; hints.ai_canonname = NULL; hints.ai_next = NULL; snprintf(service, sizeof(service), "%i", port); error = getaddrinfo(host, service, &hints, &addrinfo); if (error) { snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "host \"%s\" not found: %s", host, gai_strerror(error)); connection->error = MPD_ERROR_UNKHOST; return -1; } for (res = addrinfo; res; res = res->ai_next) { /* create socket */ connection->sock = socket(res->ai_family, SOCK_STREAM, res->ai_protocol); if (connection->sock < 0) { snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "problems creating socket: %s", strerror(errno)); connection->error = MPD_ERROR_SYSTEM; freeaddrinfo(addrinfo); return -1; } mpd_setConnectionTimeout(connection, timeout); /* connect stuff */ if (do_connect_fail(connection, res->ai_addr, res->ai_addrlen)) { /* try the next address family */ closesocket(connection->sock); connection->sock = -1; continue; } } freeaddrinfo(addrinfo); if (connection->sock < 0) { snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "problems connecting to \"%s\" on port %i: %s", host, port, strerror(errno)); connection->error = MPD_ERROR_CONNPORT; return -1; } return 0; } #else /* !MPD_HAVE_GAI */ static int mpd_connect(mpd_Connection * connection, const char * host, int port, float timeout) { struct hostent * he; struct sockaddr * dest; int destlen; struct sockaddr_in sin; if(!(he=gethostbyname(host))) { snprintf(connection->errorStr,MPD_ERRORSTR_MAX_LENGTH, "host \"%s\" not found",host); connection->error = MPD_ERROR_UNKHOST; return -1; } memset(&sin,0,sizeof(struct sockaddr_in)); /*dest.sin_family = he->h_addrtype;*/ sin.sin_family = AF_INET; sin.sin_port = htons(port); switch(he->h_addrtype) { case AF_INET: memcpy((char *)&sin.sin_addr.s_addr,(char *)he->h_addr, he->h_length); dest = (struct sockaddr *)&sin; destlen = sizeof(struct sockaddr_in); break; default: strcpy(connection->errorStr,"address type is not IPv4"); connection->error = MPD_ERROR_SYSTEM; return -1; break; } if((connection->sock = socket(dest->sa_family,SOCK_STREAM,0))<0) { strcpy(connection->errorStr,"problems creating socket"); connection->error = MPD_ERROR_SYSTEM; return -1; } mpd_setConnectionTimeout(connection,timeout); /* connect stuff */ if (do_connect_fail(connection, dest, destlen)) { snprintf(connection->errorStr,MPD_ERRORSTR_MAX_LENGTH, "problems connecting to \"%s\" on port" " %i",host,port); connection->error = MPD_ERROR_CONNPORT; return -1; } return 0; } #endif /* !MPD_HAVE_GAI */ char * mpdTagItemKeys[MPD_TAG_NUM_OF_ITEM_TYPES] = { "Artist", "Album", "Title", "Track", "Name", "Genre", "Date", "Composer", "Performer", "Comment", "Disc", "Filename", "Any" }; static char * mpd_sanitizeArg(const char * arg) { size_t i; char * ret; register const char *c; register char *rc; /* instead of counting in that loop above, just * use a bit more memory and half running time */ ret = malloc(strlen(arg) * 2 + 1); c = arg; rc = ret; for(i = strlen(arg)+1; i != 0; --i) { if(*c=='"' || *c=='\\') *rc++ = '\\'; *(rc++) = *(c++); } return ret; } static mpd_ReturnElement * mpd_newReturnElement(const char * name, const char * value) { mpd_ReturnElement * ret = malloc(sizeof(mpd_ReturnElement)); ret->name = strdup(name); ret->value = strdup(value); return ret; } static void mpd_freeReturnElement(mpd_ReturnElement * re) { free(re->name); free(re->value); free(re); } void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout) { connection->timeout.tv_sec = (int)timeout; connection->timeout.tv_usec = (int)(timeout*1e6 - connection->timeout.tv_sec*1000000 + 0.5); } static int mpd_parseWelcome(mpd_Connection * connection, const char * host, int port, char * rt, char * output) { char * tmp; char * test; int i; if(strncmp(output,MPD_WELCOME_MESSAGE,strlen(MPD_WELCOME_MESSAGE))) { snprintf(connection->errorStr,MPD_ERRORSTR_MAX_LENGTH, "mpd not running on port %i on host \"%s\"", port,host); connection->error = MPD_ERROR_NOTMPD; return 1; } tmp = &output[strlen(MPD_WELCOME_MESSAGE)]; for(i=0;i<3;i++) { if(tmp) connection->version[i] = strtol(tmp,&test,10); if (!tmp || (test[0] != '.' && test[0] != '\0')) { snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "error parsing version number at " "\"%s\"", &output[strlen(MPD_WELCOME_MESSAGE)]); connection->error = MPD_ERROR_NOTMPD; return 1; } tmp = ++test; } return 0; } mpd_Connection * mpd_newConnection(const char * host, int port, float timeout) { int err; char * rt; char * output = NULL; mpd_Connection * connection = malloc(sizeof(mpd_Connection)); struct timeval tv; fd_set fds; strcpy(connection->buffer,""); connection->buflen = 0; connection->bufstart = 0; strcpy(connection->errorStr,""); connection->error = 0; connection->doneProcessing = 0; connection->commandList = 0; connection->listOks = 0; connection->doneListOk = 0; connection->returnElement = NULL; connection->request = NULL; if (winsock_dll_error(connection)) return connection; if (mpd_connect(connection, host, port, timeout) < 0) return connection; while(!(rt = strstr(connection->buffer,"\n"))) { tv.tv_sec = connection->timeout.tv_sec; tv.tv_usec = connection->timeout.tv_usec; FD_ZERO(&fds); FD_SET(connection->sock,&fds); if((err = select(connection->sock+1,&fds,NULL,NULL,&tv)) == 1) { int readed; readed = recv(connection->sock, &(connection->buffer[connection->buflen]), MPD_BUFFER_MAX_LENGTH-connection->buflen,0); if(readed<=0) { snprintf(connection->errorStr,MPD_ERRORSTR_MAX_LENGTH, "problems getting a response from" " \"%s\" on port %i : %s",host, port, strerror(errno)); connection->error = MPD_ERROR_NORESPONSE; return connection; } connection->buflen+=readed; connection->buffer[connection->buflen] = '\0'; } else if(err<0) { if (SELECT_ERRNO_IGNORE) continue; snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "problems connecting to \"%s\" on port" " %i",host,port); connection->error = MPD_ERROR_CONNPORT; return connection; } else { snprintf(connection->errorStr,MPD_ERRORSTR_MAX_LENGTH, "timeout in attempting to get a response from" " \"%s\" on port %i",host,port); connection->error = MPD_ERROR_NORESPONSE; return connection; } } *rt = '\0'; output = strdup(connection->buffer); strcpy(connection->buffer,rt+1); connection->buflen = strlen(connection->buffer); if(mpd_parseWelcome(connection,host,port,rt,output) == 0) connection->doneProcessing = 1; free(output); return connection; } void mpd_clearError(mpd_Connection * connection) { connection->error = 0; connection->errorStr[0] = '\0'; } void mpd_closeConnection(mpd_Connection * connection) { closesocket(connection->sock); if(connection->returnElement) free(connection->returnElement); if(connection->request) free(connection->request); free(connection); WSACleanup(); } static void mpd_executeCommand(mpd_Connection * connection, char * command) { int ret; struct timeval tv; fd_set fds; char * commandPtr = command; int commandLen = strlen(command); if(!connection->doneProcessing && !connection->commandList) { strcpy(connection->errorStr,"not done processing current command"); connection->error = 1; return; } mpd_clearError(connection); FD_ZERO(&fds); FD_SET(connection->sock,&fds); tv.tv_sec = connection->timeout.tv_sec; tv.tv_usec = connection->timeout.tv_usec; while((ret = select(connection->sock+1,NULL,&fds,NULL,&tv)==1) || (ret==-1 && SELECT_ERRNO_IGNORE)) { ret = send(connection->sock,commandPtr,commandLen,MSG_DONTWAIT); if(ret<=0) { if (SENDRECV_ERRNO_IGNORE) continue; snprintf(connection->errorStr,MPD_ERRORSTR_MAX_LENGTH, "problems giving command \"%s\"",command); connection->error = MPD_ERROR_SENDING; return; } else { commandPtr+=ret; commandLen-=ret; } if(commandLen<=0) break; } if(commandLen>0) { perror(""); snprintf(connection->errorStr,MPD_ERRORSTR_MAX_LENGTH, "timeout sending command \"%s\"",command); connection->error = MPD_ERROR_TIMEOUT; return; } if(!connection->commandList) connection->doneProcessing = 0; else if(connection->commandList == COMMAND_LIST_OK) { connection->listOks++; } } static void mpd_getNextReturnElement(mpd_Connection * connection) { char * output = NULL; char * rt = NULL; char * name = NULL; char * value = NULL; fd_set fds; struct timeval tv; char * tok = NULL; int readed; char * bufferCheck = NULL; int err; int pos; if(connection->returnElement) mpd_freeReturnElement(connection->returnElement); connection->returnElement = NULL; if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { strcpy(connection->errorStr,"already done processing current command"); connection->error = 1; return; } bufferCheck = connection->buffer+connection->bufstart; while(connection->bufstart>=connection->buflen || !(rt = strchr(bufferCheck,'\n'))) { if(connection->buflen>=MPD_BUFFER_MAX_LENGTH) { memmove(connection->buffer, connection->buffer+ connection->bufstart, connection->buflen- connection->bufstart+1); connection->buflen-=connection->bufstart; connection->bufstart = 0; } if(connection->buflen>=MPD_BUFFER_MAX_LENGTH) { strcpy(connection->errorStr,"buffer overrun"); connection->error = MPD_ERROR_BUFFEROVERRUN; connection->doneProcessing = 1; connection->doneListOk = 0; return; } bufferCheck = connection->buffer+connection->buflen; tv.tv_sec = connection->timeout.tv_sec; tv.tv_usec = connection->timeout.tv_usec; FD_ZERO(&fds); FD_SET(connection->sock,&fds); if((err = select(connection->sock+1,&fds,NULL,NULL,&tv) == 1)) { readed = recv(connection->sock, connection->buffer+connection->buflen, MPD_BUFFER_MAX_LENGTH-connection->buflen, MSG_DONTWAIT); if(readed<0 && SENDRECV_ERRNO_IGNORE) { continue; } if(readed<=0) { strcpy(connection->errorStr,"connection" " closed"); connection->error = MPD_ERROR_CONNCLOSED; connection->doneProcessing = 1; connection->doneListOk = 0; return; } connection->buflen+=readed; connection->buffer[connection->buflen] = '\0'; } else if(err<0 && SELECT_ERRNO_IGNORE) continue; else { strcpy(connection->errorStr,"connection timeout"); connection->error = MPD_ERROR_TIMEOUT; connection->doneProcessing = 1; connection->doneListOk = 0; return; } } *rt = '\0'; output = connection->buffer+connection->bufstart; connection->bufstart = rt - connection->buffer + 1; if(strcmp(output,"OK")==0) { if(connection->listOks > 0) { strcpy(connection->errorStr, "expected more list_OK's"); connection->error = 1; } connection->listOks = 0; connection->doneProcessing = 1; connection->doneListOk = 0; return; } if(strcmp(output, "list_OK") == 0) { if(!connection->listOks) { strcpy(connection->errorStr, "got an unexpected list_OK"); connection->error = 1; } else { connection->doneListOk = 1; connection->listOks--; } return; } if(strncmp(output,"ACK",strlen("ACK"))==0) { char * test; char * needle; int val; strcpy(connection->errorStr, output); connection->error = MPD_ERROR_ACK; connection->errorCode = MPD_ACK_ERROR_UNK; connection->errorAt = MPD_ERROR_AT_UNK; connection->doneProcessing = 1; connection->doneListOk = 0; needle = strchr(output, '['); if(!needle) return; val = strtol(needle+1, &test, 10); if(*test != '@') return; connection->errorCode = val; val = strtol(test+1, &test, 10); if(*test != ']') return; connection->errorAt = val; return; } tok = strchr(output, ':'); if (!tok) return; pos = tok - output; value = ++tok; name = output; name[pos] = '\0'; if(value[0]==' ') { connection->returnElement = mpd_newReturnElement(name,&(value[1])); } else { snprintf(connection->errorStr,MPD_ERRORSTR_MAX_LENGTH, "error parsing: %s:%s",name,value); connection->error = 1; } } void mpd_finishCommand(mpd_Connection * connection) { while(!connection->doneProcessing) { if(connection->doneListOk) connection->doneListOk = 0; mpd_getNextReturnElement(connection); } } static void mpd_finishListOkCommand(mpd_Connection * connection) { while(!connection->doneProcessing && connection->listOks && !connection->doneListOk) { mpd_getNextReturnElement(connection); } } int mpd_nextListOkCommand(mpd_Connection * connection) { mpd_finishListOkCommand(connection); if(!connection->doneProcessing) connection->doneListOk = 0; if(connection->listOks == 0 || connection->doneProcessing) return -1; return 0; } void mpd_sendStatusCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"status\n"); } mpd_Status * mpd_getStatus(mpd_Connection * connection) { mpd_Status * status; /*mpd_executeCommand(connection,"status\n"); if(connection->error) return NULL;*/ if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(!connection->returnElement) mpd_getNextReturnElement(connection); status = malloc(sizeof(mpd_Status)); status->volume = -1; status->repeat = 0; status->random = 0; status->playlist = -1; status->playlistLength = -1; status->state = -1; status->song = 0; status->songid = 0; status->elapsedTime = 0; status->totalTime = 0; status->bitRate = 0; status->sampleRate = 0; status->bits = 0; status->channels = 0; status->crossfade = -1; status->error = NULL; status->updatingDb = 0; if(connection->error) { free(status); return NULL; } while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"volume")==0) { status->volume = atoi(re->value); } else if(strcmp(re->name,"repeat")==0) { status->repeat = atoi(re->value); } else if(strcmp(re->name,"random")==0) { status->random = atoi(re->value); } else if(strcmp(re->name,"playlist")==0) { status->playlist = strtol(re->value,NULL,10); } else if(strcmp(re->name,"playlistlength")==0) { status->playlistLength = atoi(re->value); } else if(strcmp(re->name,"bitrate")==0) { status->bitRate = atoi(re->value); } else if(strcmp(re->name,"state")==0) { if(strcmp(re->value,"play")==0) { status->state = MPD_STATUS_STATE_PLAY; } else if(strcmp(re->value,"stop")==0) { status->state = MPD_STATUS_STATE_STOP; } else if(strcmp(re->value,"pause")==0) { status->state = MPD_STATUS_STATE_PAUSE; } else { status->state = MPD_STATUS_STATE_UNKNOWN; } } else if(strcmp(re->name,"song")==0) { status->song = atoi(re->value); } else if(strcmp(re->name,"songid")==0) { status->songid = atoi(re->value); } else if(strcmp(re->name,"time")==0) { char * tok = strchr(re->value,':'); /* the second strchr below is a safety check */ if (tok && (strchr(tok,0) > (tok+1))) { /* atoi stops at the first non-[0-9] char: */ status->elapsedTime = atoi(re->value); status->totalTime = atoi(tok+1); } } else if(strcmp(re->name,"error")==0) { status->error = strdup(re->value); } else if(strcmp(re->name,"xfade")==0) { status->crossfade = atoi(re->value); } else if(strcmp(re->name,"updating_db")==0) { status->updatingDb = atoi(re->value); } else if(strcmp(re->name,"audio")==0) { char * tok = strchr(re->value,':'); if (tok && (strchr(tok,0) > (tok+1))) { status->sampleRate = atoi(re->value); status->bits = atoi(++tok); tok = strchr(tok,':'); if (tok && (strchr(tok,0) > (tok+1))) status->channels = atoi(tok+1); } } mpd_getNextReturnElement(connection); if(connection->error) { free(status); return NULL; } } if(connection->error) { free(status); return NULL; } else if(status->state<0) { strcpy(connection->errorStr,"state not found"); connection->error = 1; free(status); return NULL; } return status; } void mpd_freeStatus(mpd_Status * status) { if(status->error) free(status->error); free(status); } void mpd_sendStatsCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"stats\n"); } mpd_Stats * mpd_getStats(mpd_Connection * connection) { mpd_Stats * stats; /*mpd_executeCommand(connection,"stats\n"); if(connection->error) return NULL;*/ if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(!connection->returnElement) mpd_getNextReturnElement(connection); stats = malloc(sizeof(mpd_Stats)); stats->numberOfArtists = 0; stats->numberOfAlbums = 0; stats->numberOfSongs = 0; stats->uptime = 0; stats->dbUpdateTime = 0; stats->playTime = 0; stats->dbPlayTime = 0; if(connection->error) { free(stats); return NULL; } while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"artists")==0) { stats->numberOfArtists = atoi(re->value); } else if(strcmp(re->name,"albums")==0) { stats->numberOfAlbums = atoi(re->value); } else if(strcmp(re->name,"songs")==0) { stats->numberOfSongs = atoi(re->value); } else if(strcmp(re->name,"uptime")==0) { stats->uptime = strtol(re->value,NULL,10); } else if(strcmp(re->name,"db_update")==0) { stats->dbUpdateTime = strtol(re->value,NULL,10); } else if(strcmp(re->name,"playtime")==0) { stats->playTime = strtol(re->value,NULL,10); } else if(strcmp(re->name,"db_playtime")==0) { stats->dbPlayTime = strtol(re->value,NULL,10); } mpd_getNextReturnElement(connection); if(connection->error) { free(stats); return NULL; } } if(connection->error) { free(stats); return NULL; } return stats; } void mpd_freeStats(mpd_Stats * stats) { free(stats); } mpd_SearchStats * mpd_getSearchStats(mpd_Connection * connection) { mpd_SearchStats * stats; mpd_ReturnElement * re; if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if (!connection->returnElement) mpd_getNextReturnElement(connection); if (connection->error) return NULL; stats = malloc(sizeof(mpd_SearchStats)); stats->numberOfSongs = 0; stats->playTime = 0; while (connection->returnElement) { re = connection->returnElement; if (strcmp(re->name, "songs") == 0) { stats->numberOfSongs = atoi(re->value); } else if (strcmp(re->name, "playtime") == 0) { stats->playTime = strtol(re->value, NULL, 10); } mpd_getNextReturnElement(connection); if (connection->error) { free(stats); return NULL; } } if (connection->error) { free(stats); return NULL; } return stats; } void mpd_freeSearchStats(mpd_SearchStats * stats) { free(stats); } static void mpd_initSong(mpd_Song * song) { song->file = NULL; song->artist = NULL; song->album = NULL; song->track = NULL; song->title = NULL; song->name = NULL; song->date = NULL; /* added by Qball */ song->genre = NULL; song->composer = NULL; song->performer = NULL; song->disc = NULL; song->comment = NULL; song->time = MPD_SONG_NO_TIME; song->pos = MPD_SONG_NO_NUM; song->id = MPD_SONG_NO_ID; } static void mpd_finishSong(mpd_Song * song) { if(song->file) free(song->file); if(song->artist) free(song->artist); if(song->album) free(song->album); if(song->title) free(song->title); if(song->track) free(song->track); if(song->name) free(song->name); if(song->date) free(song->date); if(song->genre) free(song->genre); if(song->composer) free(song->composer); if(song->disc) free(song->disc); if(song->comment) free(song->comment); } mpd_Song * mpd_newSong(void) { mpd_Song * ret = malloc(sizeof(mpd_Song)); mpd_initSong(ret); return ret; } void mpd_freeSong(mpd_Song * song) { mpd_finishSong(song); free(song); } mpd_Song * mpd_songDup(mpd_Song * song) { mpd_Song * ret = mpd_newSong(); if(song->file) ret->file = strdup(song->file); if(song->artist) ret->artist = strdup(song->artist); if(song->album) ret->album = strdup(song->album); if(song->title) ret->title = strdup(song->title); if(song->track) ret->track = strdup(song->track); if(song->name) ret->name = strdup(song->name); if(song->date) ret->date = strdup(song->date); if(song->genre) ret->genre= strdup(song->genre); if(song->composer) ret->composer= strdup(song->composer); if(song->disc) ret->disc = strdup(song->disc); if(song->comment) ret->comment = strdup(song->comment); ret->time = song->time; ret->pos = song->pos; ret->id = song->id; return ret; } static void mpd_initDirectory(mpd_Directory * directory) { directory->path = NULL; } static void mpd_finishDirectory(mpd_Directory * directory) { if(directory->path) free(directory->path); } mpd_Directory * mpd_newDirectory(void) { mpd_Directory * directory = malloc(sizeof(mpd_Directory));; mpd_initDirectory(directory); return directory; } void mpd_freeDirectory(mpd_Directory * directory) { mpd_finishDirectory(directory); free(directory); } mpd_Directory * mpd_directoryDup(mpd_Directory * directory) { mpd_Directory * ret = mpd_newDirectory(); if(directory->path) ret->path = strdup(directory->path); return ret; } static void mpd_initPlaylistFile(mpd_PlaylistFile * playlist) { playlist->path = NULL; } static void mpd_finishPlaylistFile(mpd_PlaylistFile * playlist) { if(playlist->path) free(playlist->path); } mpd_PlaylistFile * mpd_newPlaylistFile(void) { mpd_PlaylistFile * playlist = malloc(sizeof(mpd_PlaylistFile)); mpd_initPlaylistFile(playlist); return playlist; } void mpd_freePlaylistFile(mpd_PlaylistFile * playlist) { mpd_finishPlaylistFile(playlist); free(playlist); } mpd_PlaylistFile * mpd_playlistFileDup(mpd_PlaylistFile * playlist) { mpd_PlaylistFile * ret = mpd_newPlaylistFile(); if(playlist->path) ret->path = strdup(playlist->path); return ret; } static void mpd_initInfoEntity(mpd_InfoEntity * entity) { entity->info.directory = NULL; } static void mpd_finishInfoEntity(mpd_InfoEntity * entity) { if(entity->info.directory) { if(entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { mpd_freeDirectory(entity->info.directory); } else if(entity->type == MPD_INFO_ENTITY_TYPE_SONG) { mpd_freeSong(entity->info.song); } else if(entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { mpd_freePlaylistFile(entity->info.playlistFile); } } } mpd_InfoEntity * mpd_newInfoEntity(void) { mpd_InfoEntity * entity = malloc(sizeof(mpd_InfoEntity)); mpd_initInfoEntity(entity); return entity; } void mpd_freeInfoEntity(mpd_InfoEntity * entity) { mpd_finishInfoEntity(entity); free(entity); } static void mpd_sendInfoCommand(mpd_Connection * connection, char * command) { mpd_executeCommand(connection,command); } mpd_InfoEntity * mpd_getNextInfoEntity(mpd_Connection * connection) { mpd_InfoEntity * entity = NULL; if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(!connection->returnElement) mpd_getNextReturnElement(connection); if(connection->returnElement) { if(strcmp(connection->returnElement->name,"file")==0) { entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_SONG; entity->info.song = mpd_newSong(); entity->info.song->file = strdup(connection->returnElement->value); } else if(strcmp(connection->returnElement->name, "directory")==0) { entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_DIRECTORY; entity->info.directory = mpd_newDirectory(); entity->info.directory->path = strdup(connection->returnElement->value); } else if(strcmp(connection->returnElement->name,"playlist")==0) { entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_PLAYLISTFILE; entity->info.playlistFile = mpd_newPlaylistFile(); entity->info.playlistFile->path = strdup(connection->returnElement->value); } else if(strcmp(connection->returnElement->name, "cpos") == 0){ entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_SONG; entity->info.song = mpd_newSong(); entity->info.song->pos = atoi(connection->returnElement->value); } else { connection->error = 1; strcpy(connection->errorStr,"problem parsing song info"); return NULL; } } else return NULL; mpd_getNextReturnElement(connection); while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"file")==0) return entity; else if(strcmp(re->name,"directory")==0) return entity; else if(strcmp(re->name,"playlist")==0) return entity; else if(strcmp(re->name,"cpos")==0) return entity; if(entity->type == MPD_INFO_ENTITY_TYPE_SONG && strlen(re->value)) { if(!entity->info.song->artist && strcmp(re->name,"Artist")==0) { entity->info.song->artist = strdup(re->value); } else if(!entity->info.song->album && strcmp(re->name,"Album")==0) { entity->info.song->album = strdup(re->value); } else if(!entity->info.song->title && strcmp(re->name,"Title")==0) { entity->info.song->title = strdup(re->value); } else if(!entity->info.song->track && strcmp(re->name,"Track")==0) { entity->info.song->track = strdup(re->value); } else if(!entity->info.song->name && strcmp(re->name,"Name")==0) { entity->info.song->name = strdup(re->value); } else if(entity->info.song->time==MPD_SONG_NO_TIME && strcmp(re->name,"Time")==0) { entity->info.song->time = atoi(re->value); } else if(entity->info.song->pos==MPD_SONG_NO_NUM && strcmp(re->name,"Pos")==0) { entity->info.song->pos = atoi(re->value); } else if(entity->info.song->id==MPD_SONG_NO_ID && strcmp(re->name,"Id")==0) { entity->info.song->id = atoi(re->value); } else if(!entity->info.song->date && strcmp(re->name, "Date") == 0) { entity->info.song->date = strdup(re->value); } else if(!entity->info.song->genre && strcmp(re->name, "Genre") == 0) { entity->info.song->genre = strdup(re->value); } else if(!entity->info.song->composer && strcmp(re->name, "Composer") == 0) { entity->info.song->composer = strdup(re->value); } else if(!entity->info.song->performer && strcmp(re->name, "Performer") == 0) { entity->info.song->performer = strdup(re->value); } else if(!entity->info.song->disc && strcmp(re->name, "Disc") == 0) { entity->info.song->disc = strdup(re->value); } else if(!entity->info.song->comment && strcmp(re->name, "Comment") == 0) { entity->info.song->comment = strdup(re->value); } } else if(entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { } else if(entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { } mpd_getNextReturnElement(connection); } return entity; } static char * mpd_getNextReturnElementNamed(mpd_Connection * connection, const char * name) { if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } mpd_getNextReturnElement(connection); while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,name)==0) return strdup(re->value); mpd_getNextReturnElement(connection); } return NULL; } char *mpd_getNextTag(mpd_Connection *connection, int type) { if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES || type == MPD_TAG_ITEM_ANY) return NULL; if (type == MPD_TAG_ITEM_FILENAME) return mpd_getNextReturnElementNamed(connection, "file"); return mpd_getNextReturnElementNamed(connection, mpdTagItemKeys[type]); } char * mpd_getNextArtist(mpd_Connection * connection) { return mpd_getNextReturnElementNamed(connection,"Artist"); } char * mpd_getNextAlbum(mpd_Connection * connection) { return mpd_getNextReturnElementNamed(connection,"Album"); } void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songPos) { int len = strlen("playlistinfo")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "playlistinfo \"%i\"\n", songPos); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendPlaylistIdCommand(mpd_Connection * connection, int id) { int len = strlen("playlistid")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "playlistid \"%i\"\n", id); mpd_sendInfoCommand(connection, string); free(string); } void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist) { int len = strlen("plchanges")+2+LONGLONGLEN+3; char *string = malloc(len); snprintf(string, len, "plchanges \"%lld\"\n", playlist); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendPlChangesPosIdCommand(mpd_Connection * connection, long long playlist) { int len = strlen("plchangesposid")+2+LONGLONGLEN+3; char *string = malloc(len); snprintf(string, len, "plchangesposid \"%lld\"\n", playlist); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendListallCommand(mpd_Connection * connection, const char * dir) { char * sDir = mpd_sanitizeArg(dir); int len = strlen("listall")+2+strlen(sDir)+3; char *string = malloc(len); snprintf(string, len, "listall \"%s\"\n", sDir); mpd_sendInfoCommand(connection,string); free(string); free(sDir); } void mpd_sendListallInfoCommand(mpd_Connection * connection, const char * dir) { char * sDir = mpd_sanitizeArg(dir); int len = strlen("listallinfo")+2+strlen(sDir)+3; char *string = malloc(len); snprintf(string, len, "listallinfo \"%s\"\n", sDir); mpd_sendInfoCommand(connection,string); free(string); free(sDir); } void mpd_sendLsInfoCommand(mpd_Connection * connection, const char * dir) { char * sDir = mpd_sanitizeArg(dir); int len = strlen("lsinfo")+2+strlen(sDir)+3; char *string = malloc(len); snprintf(string, len, "lsinfo \"%s\"\n", sDir); mpd_sendInfoCommand(connection,string); free(string); free(sDir); } void mpd_sendCurrentSongCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"currentsong\n"); } void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char * str) { mpd_startSearch(connection, 0); mpd_addConstraintSearch(connection, table, str); mpd_commitSearch(connection); } void mpd_sendFindCommand(mpd_Connection * connection, int table, const char * str) { mpd_startSearch(connection, 1); mpd_addConstraintSearch(connection, table, str); mpd_commitSearch(connection); } void mpd_sendListCommand(mpd_Connection * connection, int table, const char * arg1) { char st[10]; int len; char *string; if(table == MPD_TABLE_ARTIST) strcpy(st,"artist"); else if(table == MPD_TABLE_ALBUM) strcpy(st,"album"); else { connection->error = 1; strcpy(connection->errorStr,"unknown table for list"); return; } if(arg1) { char * sanitArg1 = mpd_sanitizeArg(arg1); len = strlen("list")+1+strlen(sanitArg1)+2+strlen(st)+3; string = malloc(len); snprintf(string, len, "list %s \"%s\"\n", st, sanitArg1); free(sanitArg1); } else { len = strlen("list")+1+strlen(st)+2; string = malloc(len); snprintf(string, len, "list %s\n", st); } mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendAddCommand(mpd_Connection * connection, const char * file) { char * sFile = mpd_sanitizeArg(file); int len = strlen("add")+2+strlen(sFile)+3; char *string = malloc(len); snprintf(string, len, "add \"%s\"\n", sFile); mpd_executeCommand(connection,string); free(string); free(sFile); } int mpd_sendAddIdCommand(mpd_Connection *connection, const char *file) { int retval = -1; char *sFile = mpd_sanitizeArg(file); int len = strlen("addid")+2+strlen(sFile)+3; char *string = malloc(len); snprintf(string, len, "addid \"%s\"\n", sFile); mpd_sendInfoCommand(connection, string); free(string); free(sFile); string = mpd_getNextReturnElementNamed(connection, "Id"); if (string) { retval = atoi(string); free(string); } return retval; } void mpd_sendDeleteCommand(mpd_Connection * connection, int songPos) { int len = strlen("delete")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "delete \"%i\"\n", songPos); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendDeleteIdCommand(mpd_Connection * connection, int id) { int len = strlen("deleteid")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "deleteid \"%i\"\n", id); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSaveCommand(mpd_Connection * connection, const char * name) { char * sName = mpd_sanitizeArg(name); int len = strlen("save")+2+strlen(sName)+3; char *string = malloc(len); snprintf(string, len, "save \"%s\"\n", sName); mpd_executeCommand(connection,string); free(string); free(sName); } void mpd_sendLoadCommand(mpd_Connection * connection, const char * name) { char * sName = mpd_sanitizeArg(name); int len = strlen("load")+2+strlen(sName)+3; char *string = malloc(len); snprintf(string, len, "load \"%s\"\n", sName); mpd_executeCommand(connection,string); free(string); free(sName); } void mpd_sendRmCommand(mpd_Connection * connection, const char * name) { char * sName = mpd_sanitizeArg(name); int len = strlen("rm")+2+strlen(sName)+3; char *string = malloc(len); snprintf(string, len, "rm \"%s\"\n", sName); mpd_executeCommand(connection,string); free(string); free(sName); } void mpd_sendRenameCommand(mpd_Connection *connection, const char *from, const char *to) { char *sFrom = mpd_sanitizeArg(from); char *sTo = mpd_sanitizeArg(to); int len = strlen("rename")+2+strlen(sFrom)+3+strlen(sTo)+3; char *string = malloc(len); snprintf(string, len, "rename \"%s\" \"%s\"\n", sFrom, sTo); mpd_executeCommand(connection, string); free(string); free(sFrom); free(sTo); } void mpd_sendShuffleCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"shuffle\n"); } void mpd_sendClearCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"clear\n"); } void mpd_sendPlayCommand(mpd_Connection * connection, int songPos) { int len = strlen("play")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "play \"%i\"\n", songPos); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendPlayIdCommand(mpd_Connection * connection, int id) { int len = strlen("playid")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "playid \"%i\"\n", id); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendStopCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"stop\n"); } void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode) { int len = strlen("pause")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "pause \"%i\"\n", pauseMode); mpd_executeCommand(connection,string); free(string); } void mpd_sendNextCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"next\n"); } void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to) { int len = strlen("move")+2+INTLEN+3+INTLEN+3; char *string = malloc(len); snprintf(string, len, "move \"%i\" \"%i\"\n", from, to); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendMoveIdCommand(mpd_Connection * connection, int id, int to) { int len = strlen("moveid")+2+INTLEN+3+INTLEN+3; char *string = malloc(len); snprintf(string, len, "moveid \"%i\" \"%i\"\n", id, to); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2) { int len = strlen("swap")+2+INTLEN+3+INTLEN+3; char *string = malloc(len); snprintf(string, len, "swap \"%i\" \"%i\"\n", song1, song2); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSwapIdCommand(mpd_Connection * connection, int id1, int id2) { int len = strlen("swapid")+2+INTLEN+3+INTLEN+3; char *string = malloc(len); snprintf(string, len, "swapid \"%i\" \"%i\"\n", id1, id2); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time) { int len = strlen("seek")+2+INTLEN+3+INTLEN+3; char *string = malloc(len); snprintf(string, len, "seek \"%i\" \"%i\"\n", song, time); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSeekIdCommand(mpd_Connection * connection, int id, int time) { int len = strlen("seekid")+2+INTLEN+3+INTLEN+3; char *string = malloc(len); snprintf(string, len, "seekid \"%i\" \"%i\"\n", id, time); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendUpdateCommand(mpd_Connection * connection, char * path) { char * sPath = mpd_sanitizeArg(path); int len = strlen("update")+2+strlen(sPath)+3; char *string = malloc(len); snprintf(string, len, "update \"%s\"\n", sPath); mpd_sendInfoCommand(connection,string); free(string); free(sPath); } int mpd_getUpdateId(mpd_Connection * connection) { char * jobid; int ret = 0; jobid = mpd_getNextReturnElementNamed(connection,"updating_db"); if(jobid) { ret = atoi(jobid); free(jobid); } return ret; } void mpd_sendPrevCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"previous\n"); } void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode) { int len = strlen("repeat")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "repeat \"%i\"\n", repeatMode); mpd_executeCommand(connection,string); free(string); } void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode) { int len = strlen("random")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "random \"%i\"\n", randomMode); mpd_executeCommand(connection,string); free(string); } void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange) { int len = strlen("setvol")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "setvol \"%i\"\n", volumeChange); mpd_executeCommand(connection,string); free(string); } void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange) { int len = strlen("volume")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "volume \"%i\"\n", volumeChange); mpd_executeCommand(connection,string); free(string); } void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds) { int len = strlen("crossfade")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "crossfade \"%i\"\n", seconds); mpd_executeCommand(connection,string); free(string); } void mpd_sendPasswordCommand(mpd_Connection * connection, const char * pass) { char * sPass = mpd_sanitizeArg(pass); int len = strlen("password")+2+strlen(sPass)+3; char *string = malloc(len); snprintf(string, len, "password \"%s\"\n", sPass); mpd_executeCommand(connection,string); free(string); free(sPass); } void mpd_sendCommandListBegin(mpd_Connection * connection) { if(connection->commandList) { strcpy(connection->errorStr,"already in command list mode"); connection->error = 1; return; } connection->commandList = COMMAND_LIST; mpd_executeCommand(connection,"command_list_begin\n"); } void mpd_sendCommandListOkBegin(mpd_Connection * connection) { if(connection->commandList) { strcpy(connection->errorStr,"already in command list mode"); connection->error = 1; return; } connection->commandList = COMMAND_LIST_OK; mpd_executeCommand(connection,"command_list_ok_begin\n"); connection->listOks = 0; } void mpd_sendCommandListEnd(mpd_Connection * connection) { if(!connection->commandList) { strcpy(connection->errorStr,"not in command list mode"); connection->error = 1; return; } connection->commandList = 0; mpd_executeCommand(connection,"command_list_end\n"); } void mpd_sendOutputsCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"outputs\n"); } mpd_OutputEntity * mpd_getNextOutput(mpd_Connection * connection) { mpd_OutputEntity * output = NULL; if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(connection->error) return NULL; output = malloc(sizeof(mpd_OutputEntity)); output->id = -10; output->name = NULL; output->enabled = 0; if(!connection->returnElement) mpd_getNextReturnElement(connection); while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"outputid")==0) { if(output!=NULL && output->id>=0) return output; output->id = atoi(re->value); } else if(strcmp(re->name,"outputname")==0) { output->name = strdup(re->value); } else if(strcmp(re->name,"outputenabled")==0) { output->enabled = atoi(re->value); } mpd_getNextReturnElement(connection); if(connection->error) { free(output); return NULL; } } return output; } void mpd_sendEnableOutputCommand(mpd_Connection * connection, int outputId) { int len = strlen("enableoutput")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "enableoutput \"%i\"\n", outputId); mpd_executeCommand(connection,string); free(string); } void mpd_sendDisableOutputCommand(mpd_Connection * connection, int outputId) { int len = strlen("disableoutput")+2+INTLEN+3; char *string = malloc(len); snprintf(string, len, "disableoutput \"%i\"\n", outputId); mpd_executeCommand(connection,string); free(string); } void mpd_freeOutputElement(mpd_OutputEntity * output) { free(output->name); free(output); } /** * mpd_sendNotCommandsCommand * odd naming, but it gets the not allowed commands */ void mpd_sendNotCommandsCommand(mpd_Connection * connection) { mpd_executeCommand(connection, "notcommands\n"); } /** * mpd_sendCommandsCommand * odd naming, but it gets the allowed commands */ void mpd_sendCommandsCommand(mpd_Connection * connection) { mpd_executeCommand(connection, "commands\n"); } /** * Get the next returned command */ char * mpd_getNextCommand(mpd_Connection * connection) { return mpd_getNextReturnElementNamed(connection, "command"); } void mpd_sendUrlHandlersCommand(mpd_Connection * connection) { mpd_executeCommand(connection, "urlhandlers\n"); } char * mpd_getNextHandler(mpd_Connection * connection) { return mpd_getNextReturnElementNamed(connection, "handler"); } void mpd_sendTagTypesCommand(mpd_Connection * connection) { mpd_executeCommand(connection, "tagtypes\n"); } char * mpd_getNextTagType(mpd_Connection * connection) { return mpd_getNextReturnElementNamed(connection, "tagtype"); } void mpd_startSearch(mpd_Connection *connection, int exact) { if (connection->request) { strcpy(connection->errorStr, "search already in progress"); connection->error = 1; return; } if (exact) connection->request = strdup("find"); else connection->request = strdup("search"); } void mpd_startStatsSearch(mpd_Connection *connection) { if (connection->request) { strcpy(connection->errorStr, "search already in progress"); connection->error = 1; return; } connection->request = strdup("count"); } void mpd_startPlaylistSearch(mpd_Connection *connection, int exact) { if (connection->request) { strcpy(connection->errorStr, "search already in progress"); connection->error = 1; return; } if (exact) connection->request = strdup("playlistfind"); else connection->request = strdup("playlistsearch"); } void mpd_startFieldSearch(mpd_Connection *connection, int type) { char *strtype; int len; if (connection->request) { strcpy(connection->errorStr, "search already in progress"); connection->error = 1; return; } if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES) { strcpy(connection->errorStr, "invalid type specified"); connection->error = 1; return; } strtype = mpdTagItemKeys[type]; len = 5+strlen(strtype)+1; connection->request = malloc(len); snprintf(connection->request, len, "list %c%s", tolower(strtype[0]), strtype+1); } void mpd_addConstraintSearch(mpd_Connection *connection, int type, const char *name) { char *strtype; char *arg; int len; char *string; if (!connection->request) { strcpy(connection->errorStr, "no search in progress"); connection->error = 1; return; } if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES) { strcpy(connection->errorStr, "invalid type specified"); connection->error = 1; return; } if (name == NULL) { strcpy(connection->errorStr, "no name specified"); connection->error = 1; return; } string = strdup(connection->request); strtype = mpdTagItemKeys[type]; arg = mpd_sanitizeArg(name); len = strlen(string)+1+strlen(strtype)+2+strlen(arg)+2; connection->request = realloc(connection->request, len); snprintf(connection->request, len, "%s %c%s \"%s\"", string, tolower(strtype[0]), strtype+1, arg); free(string); free(arg); } void mpd_commitSearch(mpd_Connection *connection) { int len; if (!connection->request) { strcpy(connection->errorStr, "no search in progress"); connection->error = 1; return; } len = strlen(connection->request)+2; connection->request = realloc(connection->request, len); connection->request[len-2] = '\n'; connection->request[len-1] = '\0'; mpd_sendInfoCommand(connection, connection->request); free(connection->request); connection->request = NULL; } /** * @param connection a MpdConnection * @param path the path to the playlist. * * List the content, with full metadata, of a stored playlist. * */ void mpd_sendListPlaylistInfoCommand(mpd_Connection *connection, char *path) { char *arg = mpd_sanitizeArg(path); int len = strlen("listplaylistinfo")+2+strlen(arg)+3; char *query = malloc(len); snprintf(query, len, "listplaylistinfo \"%s\"\n", arg); mpd_sendInfoCommand(connection, query); free(arg); free(query); } /** * @param connection a MpdConnection * @param path the path to the playlist. * * List the content of a stored playlist. * */ void mpd_sendListPlaylistCommand(mpd_Connection *connection, char *path) { char *arg = mpd_sanitizeArg(path); int len = strlen("listplaylist")+2+strlen(arg)+3; char *query = malloc(len); snprintf(query, len, "listplaylist \"%s\"\n", arg); mpd_sendInfoCommand(connection, query); free(arg); free(query); } void mpd_sendPlaylistClearCommand(mpd_Connection *connection, char *path) { char *sPath = mpd_sanitizeArg(path); int len = strlen("playlistclear")+2+strlen(sPath)+3; char *string = malloc(len); snprintf(string, len, "playlistclear \"%s\"\n", sPath); mpd_executeCommand(connection, string); free(sPath); free(string); } void mpd_sendPlaylistAddCommand(mpd_Connection *connection, char *playlist, char *path) { char *sPlaylist = mpd_sanitizeArg(playlist); char *sPath = mpd_sanitizeArg(path); int len = strlen("playlistadd")+2+strlen(sPlaylist)+3+strlen(sPath)+3; char *string = malloc(len); snprintf(string, len, "playlistadd \"%s\" \"%s\"\n", sPlaylist, sPath); mpd_executeCommand(connection, string); free(sPlaylist); free(sPath); free(string); } void mpd_sendPlaylistMoveCommand(mpd_Connection *connection, char *playlist, int from, int to) { char *sPlaylist = mpd_sanitizeArg(playlist); int len = strlen("playlistmove")+ 2+strlen(sPlaylist)+3+INTLEN+3+INTLEN+3; char *string = malloc(len); snprintf(string, len, "playlistmove \"%s\" \"%i\" \"%i\"\n", sPlaylist, from, to); mpd_executeCommand(connection, string); free(sPlaylist); free(string); } void mpd_sendPlaylistDeleteCommand(mpd_Connection *connection, char *playlist, int pos) { char *sPlaylist = mpd_sanitizeArg(playlist); int len = strlen("playlistdelete")+2+strlen(sPlaylist)+3+INTLEN+3; char *string = malloc(len); snprintf(string, len, "playlistdelete \"%s\" \"%i\"\n", sPlaylist, pos); mpd_executeCommand(connection, string); free(sPlaylist); free(string); } qmpdclient-1.2.2/src/libmpdclient.h000066400000000000000000000474541157363675200173170ustar00rootroot00000000000000/* libmpdclient (c)2003-2006 by Warren Dukes (warren.dukes@gmail.com) This project's homepage is: http://www.musicpd.org Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Music Player Daemon nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef LIBMPDCLIENT_H #define LIBMPDCLIENT_H #ifdef WIN32 # define __W32API_USE_DLLIMPORT__ 1 #endif #include #include #define MPD_BUFFER_MAX_LENGTH 50000 #define MPD_ERRORSTR_MAX_LENGTH 1000 #define MPD_WELCOME_MESSAGE "OK MPD " #define MPD_ERROR_TIMEOUT 10 /* timeout trying to talk to mpd */ #define MPD_ERROR_SYSTEM 11 /* system error */ #define MPD_ERROR_UNKHOST 12 /* unknown host */ #define MPD_ERROR_CONNPORT 13 /* problems connecting to port on host */ #define MPD_ERROR_NOTMPD 14 /* mpd not running on port at host */ #define MPD_ERROR_NORESPONSE 15 /* no response on attempting to connect */ #define MPD_ERROR_SENDING 16 /* error sending command */ #define MPD_ERROR_CONNCLOSED 17 /* connection closed by mpd */ #define MPD_ERROR_ACK 18 /* ACK returned! */ #define MPD_ERROR_BUFFEROVERRUN 19 /* Buffer was overrun! */ #define MPD_ACK_ERROR_UNK -1 #define MPD_ERROR_AT_UNK -1 #define MPD_ACK_ERROR_NOT_LIST 1 #define MPD_ACK_ERROR_ARG 2 #define MPD_ACK_ERROR_PASSWORD 3 #define MPD_ACK_ERROR_PERMISSION 4 #define MPD_ACK_ERROR_UNKNOWN_CMD 5 #define MPD_ACK_ERROR_NO_EXIST 50 #define MPD_ACK_ERROR_PLAYLIST_MAX 51 #define MPD_ACK_ERROR_SYSTEM 52 #define MPD_ACK_ERROR_PLAYLIST_LOAD 53 #define MPD_ACK_ERROR_UPDATE_ALREADY 54 #define MPD_ACK_ERROR_PLAYER_SYNC 55 #define MPD_ACK_ERROR_EXIST 56 #ifdef __cplusplus extern "C" { #endif typedef enum mpd_TagItems { MPD_TAG_ITEM_ARTIST, MPD_TAG_ITEM_ALBUM, MPD_TAG_ITEM_TITLE, MPD_TAG_ITEM_TRACK, MPD_TAG_ITEM_NAME, MPD_TAG_ITEM_GENRE, MPD_TAG_ITEM_DATE, MPD_TAG_ITEM_COMPOSER, MPD_TAG_ITEM_PERFORMER, MPD_TAG_ITEM_COMMENT, MPD_TAG_ITEM_DISC, MPD_TAG_ITEM_FILENAME, MPD_TAG_ITEM_ANY, MPD_TAG_NUM_OF_ITEM_TYPES } mpd_TagItems; extern char * mpdTagItemKeys[MPD_TAG_NUM_OF_ITEM_TYPES]; /* internal stuff don't touch this struct */ typedef struct _mpd_ReturnElement { char * name; char * value; } mpd_ReturnElement; /* mpd_Connection * holds info about connection to mpd * use error, and errorStr to detect errors */ typedef struct _mpd_Connection { /* use this to check the version of mpd */ int version[3]; /* IMPORTANT, you want to get the error messages from here */ char errorStr[MPD_ERRORSTR_MAX_LENGTH+1]; int errorCode; int errorAt; /* this will be set to MPD_ERROR_* if there is an error, 0 if not */ int error; /* DON'T TOUCH any of the rest of this stuff */ int sock; char buffer[MPD_BUFFER_MAX_LENGTH+1]; int buflen; int bufstart; int doneProcessing; int listOks; int doneListOk; int commandList; mpd_ReturnElement * returnElement; struct timeval timeout; char *request; } mpd_Connection; /* mpd_newConnection * use this to open a new connection * you should use mpd_closeConnection, when your done with the connection, * even if an error has occurred * _timeout_ is the connection timeout period in seconds */ mpd_Connection * mpd_newConnection(const char * host, int port, float timeout); void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout); /* mpd_closeConnection * use this to close a connection and free'ing subsequent memory */ void mpd_closeConnection(mpd_Connection * connection); /* mpd_clearError * clears error */ void mpd_clearError(mpd_Connection * connection); /* STATUS STUFF */ /* use these with status.state to determine what state the player is in */ #define MPD_STATUS_STATE_UNKNOWN 0 #define MPD_STATUS_STATE_STOP 1 #define MPD_STATUS_STATE_PLAY 2 #define MPD_STATUS_STATE_PAUSE 3 /* us this with status.volume to determine if mpd has volume support */ #define MPD_STATUS_NO_VOLUME -1 /* mpd_Status * holds info return from status command */ typedef struct mpd_Status { /* 0-100, or MPD_STATUS_NO_VOLUME when there is no volume support */ int volume; /* 1 if repeat is on, 0 otherwise */ int repeat; /* 1 if random is on, 0 otherwise */ int random; /* playlist length */ int playlistLength; /* playlist, use this to determine when the playlist has changed */ long long playlist; /* use with MPD_STATUS_STATE_* to determine state of player */ int state; /* crossfade setting in seconds */ int crossfade; /* if a song is currently selected (always the case when state is * PLAY or PAUSE), this is the position of the currently * playing song in the playlist, beginning with 0 */ int song; /* Song ID of the currently selected song */ int songid; /* time in seconds that have elapsed in the currently playing/paused * song */ int elapsedTime; /* length in seconds of the currently playing/paused song */ int totalTime; /* current bit rate in kbs */ int bitRate; /* audio sample rate */ unsigned int sampleRate; /* audio bits */ int bits; /* audio channels */ int channels; /* 1 if mpd is updating, 0 otherwise */ int updatingDb; /* error */ char * error; } mpd_Status; void mpd_sendStatusCommand(mpd_Connection * connection); /* mpd_getStatus * returns status info, be sure to free it with mpd_freeStatus() * call this after mpd_sendStatusCommand() */ mpd_Status * mpd_getStatus(mpd_Connection * connection); /* mpd_freeStatus * free's status info malloc'd and returned by mpd_getStatus */ void mpd_freeStatus(mpd_Status * status); typedef struct _mpd_Stats { int numberOfArtists; int numberOfAlbums; int numberOfSongs; unsigned long uptime; unsigned long dbUpdateTime; unsigned long playTime; unsigned long dbPlayTime; } mpd_Stats; typedef struct _mpd_SearchStats { int numberOfSongs; unsigned long playTime; } mpd_SearchStats; void mpd_sendStatsCommand(mpd_Connection * connection); mpd_Stats * mpd_getStats(mpd_Connection * connection); void mpd_freeStats(mpd_Stats * stats); mpd_SearchStats * mpd_getSearchStats(mpd_Connection * connection); void mpd_freeSearchStats(mpd_SearchStats * stats); /* SONG STUFF */ #define MPD_SONG_NO_TIME -1 #define MPD_SONG_NO_NUM -1 #define MPD_SONG_NO_ID -1 /* mpd_Song * for storing song info returned by mpd */ typedef struct _mpd_Song { /* filename of song */ char * file; /* artist, maybe NULL if there is no tag */ char * artist; /* title, maybe NULL if there is no tag */ char * title; /* album, maybe NULL if there is no tag */ char * album; /* track, maybe NULL if there is no tag */ char * track; /* name, maybe NULL if there is no tag; it's the name of the current * song, f.e. the icyName of the stream */ char * name; /* date */ char *date; /* added by qball */ /* Genre */ char *genre; /* Composer */ char *composer; /* Performer */ char *performer; /* Disc */ char *disc; /* Comment */ char *comment; /* length of song in seconds, check that it is not MPD_SONG_NO_TIME */ int time; /* if plchanges/playlistinfo/playlistid used, is the position of the * song in the playlist */ int pos; /* song id for a song in the playlist */ int id; } mpd_Song; /* mpd_newSong * use to allocate memory for a new mpd_Song * file, artist, etc all initialized to NULL * if your going to assign values to file, artist, etc * be sure to malloc or strdup the memory * use mpd_freeSong to free the memory for the mpd_Song, it will also * free memory for file, artist, etc, so don't do it yourself */ mpd_Song * mpd_newSong(void); /* mpd_freeSong * use to free memory allocated by mpd_newSong * also it will free memory pointed to by file, artist, etc, so be careful */ void mpd_freeSong(mpd_Song * song); /* mpd_songDup * works like strDup, but for a mpd_Song */ mpd_Song * mpd_songDup(mpd_Song * song); /* DIRECTORY STUFF */ /* mpd_Directory * used to store info fro directory (right now that just the path) */ typedef struct _mpd_Directory { char * path; } mpd_Directory; /* mpd_newDirectory * allocates memory for a new directory * use mpd_freeDirectory to free this memory */ mpd_Directory * mpd_newDirectory(void); /* mpd_freeDirectory * used to free memory allocated with mpd_newDirectory, and it frees * path of mpd_Directory, so be careful */ void mpd_freeDirectory(mpd_Directory * directory); /* mpd_directoryDup * works like strdup, but for mpd_Directory */ mpd_Directory * mpd_directoryDup(mpd_Directory * directory); /* PLAYLISTFILE STUFF */ /* mpd_PlaylistFile * stores info about playlist file returned by lsinfo */ typedef struct _mpd_PlaylistFile { char * path; } mpd_PlaylistFile; /* mpd_newPlaylistFile * allocates memory for new mpd_PlaylistFile, path is set to NULL * free this memory with mpd_freePlaylistFile */ mpd_PlaylistFile * mpd_newPlaylistFile(void); /* mpd_freePlaylist * free memory allocated for freePlaylistFile, will also free * path, so be careful */ void mpd_freePlaylistFile(mpd_PlaylistFile * playlist); /* mpd_playlistFileDup * works like strdup, but for mpd_PlaylistFile */ mpd_PlaylistFile * mpd_playlistFileDup(mpd_PlaylistFile * playlist); /* INFO ENTITY STUFF */ /* the type of entity returned from one of the commands that generates info * use in conjunction with mpd_InfoEntity.type */ #define MPD_INFO_ENTITY_TYPE_DIRECTORY 0 #define MPD_INFO_ENTITY_TYPE_SONG 1 #define MPD_INFO_ENTITY_TYPE_PLAYLISTFILE 2 /* mpd_InfoEntity * stores info on stuff returned info commands */ typedef struct mpd_InfoEntity { /* the type of entity, use with MPD_INFO_ENTITY_TYPE_* to determine * what this entity is (song, directory, etc...) */ int type; /* the actual data you want, mpd_Song, mpd_Directory, etc */ union { mpd_Directory * directory; mpd_Song * song; mpd_PlaylistFile * playlistFile; } info; } mpd_InfoEntity; mpd_InfoEntity * mpd_newInfoEntity(void); void mpd_freeInfoEntity(mpd_InfoEntity * entity); /* INFO COMMANDS AND STUFF */ /* use this function to loop over after calling Info/Listall functions */ mpd_InfoEntity * mpd_getNextInfoEntity(mpd_Connection * connection); /* fetches the currently seeletect song (the song referenced by status->song * and status->songid*/ void mpd_sendCurrentSongCommand(mpd_Connection * connection); /* songNum of -1, means to display the whole list */ void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songNum); /* songId of -1, means to display the whole list */ void mpd_sendPlaylistIdCommand(mpd_Connection * connection, int songId); /* use this to get the changes in the playlist since version _playlist_ */ void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist); /** * @param connection: A valid and connected mpd_Connection. * @param playlist: The playlist version you want the diff with. * A more bandwidth efficient version of the mpd_sendPlChangesCommand. * It only returns the pos+id of the changes song. */ void mpd_sendPlChangesPosIdCommand(mpd_Connection * connection, long long playlist); /* recursivel fetches all songs/dir/playlists in "dir* (no metadata is * returned) */ void mpd_sendListallCommand(mpd_Connection * connection, const char * dir); /* same as sendListallCommand, but also metadata is returned */ void mpd_sendListallInfoCommand(mpd_Connection * connection, const char * dir); /* non-recursive version of ListallInfo */ void mpd_sendLsInfoCommand(mpd_Connection * connection, const char * dir); #define MPD_TABLE_ARTIST MPD_TAG_ITEM_ARTIST #define MPD_TABLE_ALBUM MPD_TAG_ITEM_ALBUM #define MPD_TABLE_TITLE MPD_TAG_ITEM_TITLE #define MPD_TABLE_FILENAME MPD_TAG_ITEM_FILENAME void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char * str); void mpd_sendFindCommand(mpd_Connection * connection, int table, const char * str); /* LIST TAG COMMANDS */ /* use this function fetch next artist entry, be sure to free the returned * string. NULL means there are no more. Best used with sendListArtists */ char * mpd_getNextArtist(mpd_Connection * connection); char * mpd_getNextAlbum(mpd_Connection * connection); char * mpd_getNextTag(mpd_Connection *connection, int type); /* list artist or albums by artist, arg1 should be set to the artist if * listing albums by a artist, otherwise NULL for listing all artists or albums */ void mpd_sendListCommand(mpd_Connection * connection, int table, const char * arg1); /* SIMPLE COMMANDS */ void mpd_sendAddCommand(mpd_Connection * connection, const char * file); int mpd_sendAddIdCommand(mpd_Connection *connection, const char *file); void mpd_sendDeleteCommand(mpd_Connection * connection, int songNum); void mpd_sendDeleteIdCommand(mpd_Connection * connection, int songNum); void mpd_sendSaveCommand(mpd_Connection * connection, const char * name); void mpd_sendLoadCommand(mpd_Connection * connection, const char * name); void mpd_sendRmCommand(mpd_Connection * connection, const char * name); void mpd_sendRenameCommand(mpd_Connection *connection, const char *from, const char *to); void mpd_sendShuffleCommand(mpd_Connection * connection); void mpd_sendClearCommand(mpd_Connection * connection); /* use this to start playing at the beginning, useful when in random mode */ #define MPD_PLAY_AT_BEGINNING -1 void mpd_sendPlayCommand(mpd_Connection * connection, int songNum); void mpd_sendPlayIdCommand(mpd_Connection * connection, int songNum); void mpd_sendStopCommand(mpd_Connection * connection); void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode); void mpd_sendNextCommand(mpd_Connection * connection); void mpd_sendPrevCommand(mpd_Connection * connection); void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to); void mpd_sendMoveIdCommand(mpd_Connection * connection, int from, int to); void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2); void mpd_sendSwapIdCommand(mpd_Connection * connection, int song1, int song2); void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time); void mpd_sendSeekIdCommand(mpd_Connection * connection, int song, int time); void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode); void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode); void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange); /* WARNING: don't use volume command, its depreacted */ void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange); void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds); void mpd_sendUpdateCommand(mpd_Connection * connection, char * path); /* returns the update job id, call this after a update command*/ int mpd_getUpdateId(mpd_Connection * connection); void mpd_sendPasswordCommand(mpd_Connection * connection, const char * pass); /* after executing a command, when your done with it to get its status * (you want to check connection->error for an error) */ void mpd_finishCommand(mpd_Connection * connection); /* command list stuff, use this to do things like add files very quickly */ void mpd_sendCommandListBegin(mpd_Connection * connection); void mpd_sendCommandListOkBegin(mpd_Connection * connection); void mpd_sendCommandListEnd(mpd_Connection * connection); /* advance to the next listOk * returns 0 if advanced to the next list_OK, * returns -1 if it advanced to an OK or ACK */ int mpd_nextListOkCommand(mpd_Connection * connection); typedef struct _mpd_OutputEntity { int id; char * name; int enabled; } mpd_OutputEntity; void mpd_sendOutputsCommand(mpd_Connection * connection); mpd_OutputEntity * mpd_getNextOutput(mpd_Connection * connection); void mpd_sendEnableOutputCommand(mpd_Connection * connection, int outputId); void mpd_sendDisableOutputCommand(mpd_Connection * connection, int outputId); void mpd_freeOutputElement(mpd_OutputEntity * output); /** * @param connection a #mpd_Connection * * Queries mpd for the allowed commands */ void mpd_sendCommandsCommand(mpd_Connection * connection); /** * @param connection a #mpd_Connection * * Queries mpd for the not allowed commands */ void mpd_sendNotCommandsCommand(mpd_Connection * connection); /** * @param connection a #mpd_Connection * * returns the next supported command. * * @returns a string, needs to be free'ed */ char *mpd_getNextCommand(mpd_Connection *connection); void mpd_sendUrlHandlersCommand(mpd_Connection * connection); char *mpd_getNextHandler(mpd_Connection * connection); void mpd_sendTagTypesCommand(mpd_Connection * connection); char *mpd_getNextTagType(mpd_Connection * connection); /** * @param connection a MpdConnection * @param path the path to the playlist. * * List the content, with full metadata, of a stored playlist. * */ void mpd_sendListPlaylistInfoCommand(mpd_Connection *connection, char *path); /** * @param connection a MpdConnection * @param path the path to the playlist. * * List the content of a stored playlist. * */ void mpd_sendListPlaylistCommand(mpd_Connection *connection, char *path); /** * @param connection a #mpd_Connection * @param exact if to match exact * * starts a search, use mpd_addConstraintSearch to add * a constraint to the search, and mpd_commitSearch to do the actual search */ void mpd_startSearch(mpd_Connection *connection, int exact); /** * @param connection a #mpd_Connection * @param type * @param name */ void mpd_addConstraintSearch(mpd_Connection *connection, int type, const char *name); /** * @param connection a #mpd_Connection */ void mpd_commitSearch(mpd_Connection *connection); /** * @param connection a #mpd_Connection * @param type The type to search for * * starts a search for fields... f.e. get a list of artists would be: * @code * mpd_startFieldSearch(connection, MPD_TAG_ITEM_ARTIST); * mpd_commitSearch(connection); * @endcode * * or get a list of artist in genre "jazz" would be: * @code * mpd_startFieldSearch(connection, MPD_TAG_ITEM_ARTIST); * mpd_addConstraintSearch(connection, MPD_TAG_ITEM_GENRE, "jazz") * mpd_commitSearch(connection); * @endcode * * mpd_startSearch will return a list of songs (and you need mpd_getNextInfoEntity) * this one will return a list of only one field (the one specified with type) and you need * mpd_getNextTag to get the results */ void mpd_startFieldSearch(mpd_Connection *connection, int type); void mpd_startPlaylistSearch(mpd_Connection *connection, int exact); void mpd_startStatsSearch(mpd_Connection *connection); void mpd_sendPlaylistClearCommand(mpd_Connection *connection, char *path); void mpd_sendPlaylistAddCommand(mpd_Connection *connection, char *playlist, char *path); void mpd_sendPlaylistMoveCommand(mpd_Connection *connection, char *playlist, int from, int to); void mpd_sendPlaylistDeleteCommand(mpd_Connection *connection, char *playlist, int pos); #ifdef __cplusplus } #endif #endif qmpdclient-1.2.2/src/librarypanel.cpp000066400000000000000000000035141157363675200176550ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "librarypanel.h" #include "config.h" LibraryPanel::LibraryPanel() { setupUi(this); albumView->setArtistView(artistView); albumView->setSongView(songView); artistView->setAlbumView(albumView); libraryVSplit->restoreState(Config::instance()->libraryVSplitterSizes()); libraryHSplit->restoreState(Config::instance()->libraryHSplitterSizes()); connect(artistFilter, SIGNAL(textChanged(const QString &)), artistView, SLOT(filter(const QString &))); connect(albumFilter, SIGNAL(textChanged(const QString &)), albumView, SLOT(filter(const QString &))); connect(songFilter, SIGNAL(textChanged(const QString &)), songView, SLOT(setFilter(const QString &))); } void LibraryPanel::updateTranslation() { retranslateUi(this); } void LibraryPanel::on_libraryHSplit_splitterMoved(int, int) { Config::instance()->setLibraryHSplitterSizes(libraryHSplit->saveState()); } void LibraryPanel::on_libraryVSplit_splitterMoved(int, int) { Config::instance()->setLibraryVSplitterSizes(libraryVSplit->saveState()); } qmpdclient-1.2.2/src/librarypanel.h000066400000000000000000000022441157363675200173210ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef LIBRARYPANEL_H #define LIBRARYPANEL_H #include "ui_librarypanel.h" class LibraryPanel : public QWidget, public Ui::LibraryPanel { Q_OBJECT public: LibraryPanel(); public slots: void updateTranslation(); private slots: void on_libraryVSplit_splitterMoved(int, int); void on_libraryHSplit_splitterMoved(int, int); }; #endif qmpdclient-1.2.2/src/lineedit.cpp000066400000000000000000000063461157363675200167740ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lineedit.h" #include "config.h" #include "iconmanager.h" #include #include #include LineEdit::LineEdit(QWidget *parent) : QLineEdit(parent), m_hover(false), m_forceNoHover(false) { updateIconSet(); connect(Config::instance(), SIGNAL(iconSetChanged()), this, SLOT(updateIconSet())); } void LineEdit::updateIconSet() { m_pixmap = m_hoverPixmap = IconManager::pixmap("clearline"); if (m_pixmap.isNull()) return; // Make whiteish hover pixmap const QBitmap mask = m_hoverPixmap.mask(); // Remember mask QPainter p(&m_hoverPixmap); QColor c = Qt::white; c.setAlpha(128); p.fillRect(m_hoverPixmap.rect(), c); // Fill pixmap with halftransparent white p.end(); m_hoverPixmap.setMask(mask); // Set mask again, to remove the white on previously transparent areas update(); } void LineEdit::updateTranslation() { setToolTip(tr("Clear the filter")); } void LineEdit::paintEvent(QPaintEvent *e) { QLineEdit::paintEvent(e); QPainter p(this); p.drawPixmap(m_pixmapRect.topLeft(), m_hover && !m_forceNoHover ? m_hoverPixmap : m_pixmap); } void LineEdit::resizeEvent(QResizeEvent *e) { QLineEdit::resizeEvent(e); const int leftover = (height() - m_pixmap.height())/2; m_pixmapRect = QRect(width() - m_pixmap.width() - leftover, leftover, m_pixmap.width(), m_pixmap.height()); setStyleSheet(QString(":enabled { padding-right: %1; }").arg(m_pixmapRect.width()+leftover)); } void LineEdit::leaveEvent(QEvent *e) { QLineEdit::leaveEvent(e); setCursor(Qt::IBeamCursor); m_hover = false; m_forceNoHover = false; update(); } void LineEdit::mousePressEvent(QMouseEvent *e) { if (e->pos().x() >= m_pixmapRect.left()) { m_forceNoHover = true; e->accept(); clear(); update(); return; } QLineEdit::mousePressEvent(e); } void LineEdit::mouseMoveEvent(QMouseEvent *e) { m_hover = m_pixmapRect.contains(e->pos()); setCursor(m_hover ? Qt::ArrowCursor : Qt::IBeamCursor); QLineEdit::mouseMoveEvent(e); update(); } void LineEdit::mouseReleaseEvent(QMouseEvent *e) { QLineEdit::mouseReleaseEvent(e); if (e->pos().x() >= m_pixmapRect.left()) { m_forceNoHover = false; update(); } } bool LineEdit::event(QEvent *e) { if (e->type() == QEvent::ToolTip) { QHelpEvent *he = static_cast(e); if (m_pixmapRect.contains(he->pos())) return QLineEdit::event(e); // Not over icon, ignore tooltip request e->ignore(); return true; } return QLineEdit::event(e); } qmpdclient-1.2.2/src/lineedit.h000066400000000000000000000026071157363675200164350ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef LINEEDIT_H #define LINEEDIT_H #include class LineEdit : public QLineEdit { Q_OBJECT public: LineEdit(QWidget *parent); public slots: void updateTranslation(); private slots: void updateIconSet(); private: bool event(QEvent *); void leaveEvent(QEvent *); void mouseMoveEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); void paintEvent(QPaintEvent *); void resizeEvent(QResizeEvent *); bool m_hover, m_forceNoHover; QPixmap m_pixmap, m_hoverPixmap; QRect m_pixmapRect; }; #endif qmpdclient-1.2.2/src/lyricsdialog.cpp000066400000000000000000000053761157363675200176660ustar00rootroot00000000000000/* * QMPDClient - An MPD client written in Qt 4. * Copyright (C) 2005-2008 Håvard Tautra Knutsen * Copyright (C) 2008 Voker57 * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lyricsdialog.h" #include "config.h" #include "mpdsong.h" LyricsDialog::LyricsDialog(QWidget *parent) : QDialog(parent) { setupUi(this); m_lyricsManager = new QNetworkAccessManager(this); m_lyricsReply = 0; } void LyricsDialog::show() { updateLyrics(); QDialog::show(); } void LyricsDialog::updateLyrics() { if(m_lyricsReply) { m_lyricsReply->abort(); m_lyricsReply = 0; } setWindowTitle(QString("Lyrics: %1 by %2").arg(m_title, m_artist)); artistEdit->setText(m_artist); titleEdit->setText(m_title); lyricsBrowser->setHtml(tr("Getting lyrics from server...")); QByteArray ba_artist = QUrl::toPercentEncoding(m_artist.replace(" ", "_")); QByteArray ba_title = QUrl::toPercentEncoding(m_title.replace(" ", "_")); QUrl url(QString("http://lyrics.wikia.com/" + QString(ba_artist) + ":" + QString(ba_title))); m_lyricsReply = m_lyricsManager->get(QNetworkRequest(url)); connect(m_lyricsReply, SIGNAL(finished()), this, SLOT(updateLyricsText())); connect(m_lyricsReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(errorLyricsText(QNetworkReply::NetworkError))); } void LyricsDialog::updateLyricsText() { QString html = QString(((QNetworkReply *)sender())->readAll()); QRegExp wittyRegexp("
.*
(.*)