From 48c3e6c6214338fce645930dffccd26235189d45 Mon Sep 17 00:00:00 2001 From: Simon Steinbeiss Date: Wed, 11 Jul 2012 03:18:33 +0200 Subject: [PATCH] Initial push (== Xfce's git version from Jul 11 2012) --- AUTHORS | 1 + COPYING | 340 +++ ChangeLog | 242 ++ INSTALL | 365 +++ Makefile.am | 47 + NEWS | 97 + README | 27 + THANKS | 11 + TODO | 14 + autogen.sh | 20 + common/Makefile.am | 20 + common/parole-common.c | 118 + common/parole-common.h | 42 + common/parole-rc-utils.c | 204 ++ common/parole-rc-utils.h | 79 + common/parole-screensaver.c | 113 + common/parole-screensaver.h | 56 + configure.ac.in | 276 ++ data/Makefile.am | 6 + data/desktop/Makefile.am | 21 + data/desktop/desktop.sh | 13 + data/desktop/parole.desktop.in.in | 8 + data/icons/16x16/Makefile.am | 7 + data/icons/16x16/parole.png | Bin 0 -> 947 bytes data/icons/22x22/Makefile.am | 7 + data/icons/22x22/parole.png | Bin 0 -> 1532 bytes data/icons/32x32/Makefile.am | 7 + data/icons/32x32/parole.png | Bin 0 -> 2702 bytes data/icons/48x48/Makefile.am | 7 + data/icons/48x48/parole.png | Bin 0 -> 5223 bytes data/icons/Makefile.am | 19 + data/icons/scalable/Makefile.am | 7 + data/icons/scalable/apps/Makefile.am | 7 + data/icons/scalable/apps/parole.svg | 1346 ++++++++++ data/icons/scalable/parole.svg | 1346 ++++++++++ data/icons/scalable/status/Makefile.am | 6 + data/interfaces/Makefile.am | 44 + data/interfaces/mediachooser.ui | 154 ++ data/interfaces/open-location.ui | 178 ++ data/interfaces/parole-settings.ui | 452 ++++ data/interfaces/parole.ui | 850 +++++++ data/interfaces/playlist.ui | 174 ++ data/interfaces/plugins.ui | 256 ++ data/interfaces/save-playlist.ui | 130 + data/mime/Makefile.am | 15 + data/mime/mime-functions.sh | 15 + data/mime/mime-type-include.sh | 30 + data/mime/mime-type-list.txt | 93 + data/pixmaps/Makefile.am | 9 + data/pixmaps/loader.gif | Bin 0 -> 673 bytes data/pixmaps/parole.png | Bin 0 -> 91063 bytes dbus/Makefile.am | 9 + dbus/parole-dbus.c | 171 ++ dbus/parole-dbus.h | 45 + docs/Makefile.am | 2 + docs/plugin-api/Makefile.am | 88 + docs/plugin-api/Parole-Plugins-docs.sgml | 76 + docs/plugin-api/Parole-Plugins-overrides.txt | 0 docs/plugin-api/Parole-Plugins-sections.txt | 132 + docs/plugin-api/Parole-Plugins.types | 8 + docs/plugin-api/parole-plugins-tut.sgml | 142 ++ .../tmpl/Parole-Plugins-unused.sgml | 213 ++ docs/plugin-api/tmpl/parole-debug.sgml | 66 + docs/plugin-api/tmpl/parole-enum-types.sgml | 79 + docs/plugin-api/tmpl/parole-file.sgml | 100 + docs/plugin-api/tmpl/parole-filters.sgml | 69 + docs/plugin-api/tmpl/parole-marshal.sgml | 58 + docs/plugin-api/tmpl/parole-pl-parser.sgml | 87 + .../tmpl/parole-provider-player.sgml | 161 ++ .../tmpl/parole-provider-plugin.sgml | 65 + docs/plugin-api/tmpl/parole-stream.sgml | 147 ++ docs/plugin-api/tmpl/parole.sgml | 113 + docs/plugin-api/tmpl/stamp-enum-types.sgml | 19 + docs/plugin-api/version.xml.in | 1 + gst/Makefile.am | 82 + gst/gstmarshal.list | 4 + gst/parole-gst-iface.c | 108 + gst/parole-gst-iface.h | 70 + gst/parole-gst.c | 2236 ++++++++++++++++ gst/parole-gst.h | 160 ++ module.xml | 19 + parole/Makefile.am | 103 + parole/parole-debug.c | 81 + parole/parole-debug.h | 66 + parole/parole-file.c | 411 +++ parole/parole-file.h | 66 + parole/parole-filters.c | 204 ++ parole/parole-filters.h | 49 + parole/parole-marshal.list | 3 + parole/parole-pl-parser.c | 787 ++++++ parole/parole-pl-parser.h | 58 + parole/parole-provider-player.c | 370 +++ parole/parole-provider-player.h | 125 + parole/parole-provider-plugin.c | 117 + parole/parole-provider-plugin.h | 67 + parole/parole-stream.c | 696 +++++ parole/parole-stream.h | 71 + parole/parole.h.in | 188 ++ plugins/Makefile.am | 17 + plugins/power-manager/Makefile.am | 44 + plugins/power-manager/power-manager-plugin.c | 45 + .../power-manager/power-manager-provider.c | 213 ++ .../power-manager/power-manager-provider.h | 44 + .../power-manager/power-manager.desktop.in | 6 + plugins/properties/Makefile.am | 46 + plugins/properties/stream-properties-plugin.c | 45 + .../properties/stream-properties-provider.c | 556 ++++ .../properties/stream-properties-provider.h | 44 + .../properties/stream-properties.desktop.in | 6 + plugins/sample/Makefile.am | 28 + plugins/sample/sample-plugin.c | 45 + plugins/sample/sample-provider.c | 84 + plugins/sample/sample-provider.h | 44 + plugins/tray/Makefile.am | 47 + plugins/tray/system-tray.desktop.in | 6 + plugins/tray/tray-plugin.c | 47 + plugins/tray/tray-provider.c | 640 +++++ plugins/tray/tray-provider.h | 44 + plugins/window-title/Makefile.am | 42 + plugins/window-title/window-title-plugin.c | 47 + plugins/window-title/window-title-provider.c | 147 ++ plugins/window-title/window-title-provider.h | 44 + plugins/window-title/window-title.desktop.in | 6 + po/POTFILES.in | 37 + po/POTFILES.skip | 1 + po/ar.po | 847 +++++++ po/ast.po | 814 ++++++ po/ca.po | 874 +++++++ po/cs.po | 867 +++++++ po/da.po | 843 +++++++ po/de.po | 836 ++++++ po/el.po | 839 ++++++ po/en_GB.po | 812 ++++++ po/es.po | 834 ++++++ po/eu.po | 832 ++++++ po/fr.po | 854 +++++++ po/gl.po | 845 +++++++ po/he.po | 813 ++++++ po/hr.po | 807 ++++++ po/hu.po | 819 ++++++ po/id.po | 837 ++++++ po/is.po | 802 ++++++ po/it.po | 835 ++++++ po/ja.po | 871 +++++++ po/ko.po | 851 +++++++ po/lt.po | 818 ++++++ po/lv.po | 844 +++++++ po/nl.po | 850 +++++++ po/nn.po | 850 +++++++ po/pl.po | 822 ++++++ po/pt.po | 846 +++++++ po/pt_BR.po | 850 +++++++ po/ru.po | 834 ++++++ po/sk.po | 847 +++++++ po/sv.po | 781 ++++++ po/te.po | 802 ++++++ po/th.po | 806 ++++++ po/tr.po | 828 ++++++ po/ug.po | 801 ++++++ po/uk.po | 815 ++++++ po/zh_CN.po | 812 ++++++ po/zh_TW.po | 848 +++++++ src/Makefile.am | 145 ++ src/gmarshal.list | 2 + src/main.c | 379 +++ src/org.parole.media.list.xml | 15 + src/org.parole.media.player.xml | 43 + src/parole-about.c | 103 + src/parole-about.h | 29 + src/parole-builder.c | 73 + src/parole-builder.h | 36 + src/parole-button.c | 249 ++ src/parole-button.h | 71 + src/parole-conf-dialog.c | 425 ++++ src/parole-conf-dialog.h | 56 + src/parole-conf.c | 486 ++++ src/parole-conf.h | 57 + src/parole-disc-menu.c | 334 +++ src/parole-disc-menu.h | 60 + src/parole-disc.c | 468 ++++ src/parole-disc.h | 67 + src/parole-mediachooser.c | 355 +++ src/parole-mediachooser.h | 44 + src/parole-medialist.c | 1933 ++++++++++++++ src/parole-medialist.h | 123 + src/parole-module.c | 241 ++ src/parole-module.h | 76 + src/parole-open-location.c | 221 ++ src/parole-open-location.h | 42 + src/parole-player.c | 2238 +++++++++++++++++ src/parole-player.h | 64 + src/parole-plugin-player.c | 259 ++ src/parole-plugin-player.h | 53 + src/parole-plugins-manager.c | 766 ++++++ src/parole-plugins-manager.h | 63 + src/parole-session.c | 178 ++ src/parole-session.h | 61 + src/parole-statusbar.c | 346 +++ src/parole-statusbar.h | 56 + src/parole-subtitle-encoding.c | 544 ++++ src/parole-subtitle-encoding.h | 41 + src/parole-utils.c | 674 +++++ src/parole-utils.h | 57 + src/parole-vis.c | 73 + src/parole-vis.h | 29 + 205 files changed, 60067 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 THANKS create mode 100644 TODO create mode 100755 autogen.sh create mode 100644 common/Makefile.am create mode 100644 common/parole-common.c create mode 100644 common/parole-common.h create mode 100644 common/parole-rc-utils.c create mode 100644 common/parole-rc-utils.h create mode 100644 common/parole-screensaver.c create mode 100644 common/parole-screensaver.h create mode 100644 configure.ac.in create mode 100644 data/Makefile.am create mode 100644 data/desktop/Makefile.am create mode 100755 data/desktop/desktop.sh create mode 100644 data/desktop/parole.desktop.in.in create mode 100644 data/icons/16x16/Makefile.am create mode 100644 data/icons/16x16/parole.png create mode 100644 data/icons/22x22/Makefile.am create mode 100644 data/icons/22x22/parole.png create mode 100644 data/icons/32x32/Makefile.am create mode 100644 data/icons/32x32/parole.png create mode 100644 data/icons/48x48/Makefile.am create mode 100644 data/icons/48x48/parole.png create mode 100644 data/icons/Makefile.am create mode 100644 data/icons/scalable/Makefile.am create mode 100644 data/icons/scalable/apps/Makefile.am create mode 100644 data/icons/scalable/apps/parole.svg create mode 100644 data/icons/scalable/parole.svg create mode 100644 data/icons/scalable/status/Makefile.am create mode 100644 data/interfaces/Makefile.am create mode 100644 data/interfaces/mediachooser.ui create mode 100644 data/interfaces/open-location.ui create mode 100644 data/interfaces/parole-settings.ui create mode 100644 data/interfaces/parole.ui create mode 100644 data/interfaces/playlist.ui create mode 100644 data/interfaces/plugins.ui create mode 100644 data/interfaces/save-playlist.ui create mode 100644 data/mime/Makefile.am create mode 100644 data/mime/mime-functions.sh create mode 100755 data/mime/mime-type-include.sh create mode 100644 data/mime/mime-type-list.txt create mode 100644 data/pixmaps/Makefile.am create mode 100644 data/pixmaps/loader.gif create mode 100644 data/pixmaps/parole.png create mode 100644 dbus/Makefile.am create mode 100644 dbus/parole-dbus.c create mode 100644 dbus/parole-dbus.h create mode 100644 docs/Makefile.am create mode 100644 docs/plugin-api/Makefile.am create mode 100644 docs/plugin-api/Parole-Plugins-docs.sgml create mode 100644 docs/plugin-api/Parole-Plugins-overrides.txt create mode 100644 docs/plugin-api/Parole-Plugins-sections.txt create mode 100644 docs/plugin-api/Parole-Plugins.types create mode 100644 docs/plugin-api/parole-plugins-tut.sgml create mode 100644 docs/plugin-api/tmpl/Parole-Plugins-unused.sgml create mode 100644 docs/plugin-api/tmpl/parole-debug.sgml create mode 100644 docs/plugin-api/tmpl/parole-enum-types.sgml create mode 100644 docs/plugin-api/tmpl/parole-file.sgml create mode 100644 docs/plugin-api/tmpl/parole-filters.sgml create mode 100644 docs/plugin-api/tmpl/parole-marshal.sgml create mode 100644 docs/plugin-api/tmpl/parole-pl-parser.sgml create mode 100644 docs/plugin-api/tmpl/parole-provider-player.sgml create mode 100644 docs/plugin-api/tmpl/parole-provider-plugin.sgml create mode 100644 docs/plugin-api/tmpl/parole-stream.sgml create mode 100644 docs/plugin-api/tmpl/parole.sgml create mode 100644 docs/plugin-api/tmpl/stamp-enum-types.sgml create mode 100644 docs/plugin-api/version.xml.in create mode 100644 gst/Makefile.am create mode 100644 gst/gstmarshal.list create mode 100644 gst/parole-gst-iface.c create mode 100644 gst/parole-gst-iface.h create mode 100644 gst/parole-gst.c create mode 100644 gst/parole-gst.h create mode 100644 module.xml create mode 100644 parole/Makefile.am create mode 100644 parole/parole-debug.c create mode 100644 parole/parole-debug.h create mode 100644 parole/parole-file.c create mode 100644 parole/parole-file.h create mode 100644 parole/parole-filters.c create mode 100644 parole/parole-filters.h create mode 100644 parole/parole-marshal.list create mode 100644 parole/parole-pl-parser.c create mode 100644 parole/parole-pl-parser.h create mode 100644 parole/parole-provider-player.c create mode 100644 parole/parole-provider-player.h create mode 100644 parole/parole-provider-plugin.c create mode 100644 parole/parole-provider-plugin.h create mode 100644 parole/parole-stream.c create mode 100644 parole/parole-stream.h create mode 100644 parole/parole.h.in create mode 100644 plugins/Makefile.am create mode 100644 plugins/power-manager/Makefile.am create mode 100644 plugins/power-manager/power-manager-plugin.c create mode 100644 plugins/power-manager/power-manager-provider.c create mode 100644 plugins/power-manager/power-manager-provider.h create mode 100644 plugins/power-manager/power-manager.desktop.in create mode 100644 plugins/properties/Makefile.am create mode 100644 plugins/properties/stream-properties-plugin.c create mode 100644 plugins/properties/stream-properties-provider.c create mode 100644 plugins/properties/stream-properties-provider.h create mode 100644 plugins/properties/stream-properties.desktop.in create mode 100644 plugins/sample/Makefile.am create mode 100644 plugins/sample/sample-plugin.c create mode 100644 plugins/sample/sample-provider.c create mode 100644 plugins/sample/sample-provider.h create mode 100644 plugins/tray/Makefile.am create mode 100644 plugins/tray/system-tray.desktop.in create mode 100644 plugins/tray/tray-plugin.c create mode 100644 plugins/tray/tray-provider.c create mode 100644 plugins/tray/tray-provider.h create mode 100644 plugins/window-title/Makefile.am create mode 100644 plugins/window-title/window-title-plugin.c create mode 100644 plugins/window-title/window-title-provider.c create mode 100644 plugins/window-title/window-title-provider.h create mode 100644 plugins/window-title/window-title.desktop.in create mode 100644 po/POTFILES.in create mode 100644 po/POTFILES.skip create mode 100644 po/ar.po create mode 100644 po/ast.po create mode 100644 po/ca.po create mode 100644 po/cs.po create mode 100644 po/da.po create mode 100644 po/de.po create mode 100644 po/el.po create mode 100644 po/en_GB.po create mode 100644 po/es.po create mode 100644 po/eu.po create mode 100644 po/fr.po create mode 100644 po/gl.po create mode 100644 po/he.po create mode 100644 po/hr.po create mode 100644 po/hu.po create mode 100644 po/id.po create mode 100644 po/is.po create mode 100644 po/it.po create mode 100644 po/ja.po create mode 100644 po/ko.po create mode 100644 po/lt.po create mode 100644 po/lv.po create mode 100644 po/nl.po create mode 100644 po/nn.po create mode 100644 po/pl.po create mode 100644 po/pt.po create mode 100644 po/pt_BR.po create mode 100644 po/ru.po create mode 100644 po/sk.po create mode 100644 po/sv.po create mode 100644 po/te.po create mode 100644 po/th.po create mode 100644 po/tr.po create mode 100644 po/ug.po create mode 100644 po/uk.po create mode 100644 po/zh_CN.po create mode 100644 po/zh_TW.po create mode 100644 src/Makefile.am create mode 100644 src/gmarshal.list create mode 100644 src/main.c create mode 100644 src/org.parole.media.list.xml create mode 100644 src/org.parole.media.player.xml create mode 100644 src/parole-about.c create mode 100644 src/parole-about.h create mode 100644 src/parole-builder.c create mode 100644 src/parole-builder.h create mode 100644 src/parole-button.c create mode 100644 src/parole-button.h create mode 100644 src/parole-conf-dialog.c create mode 100644 src/parole-conf-dialog.h create mode 100644 src/parole-conf.c create mode 100644 src/parole-conf.h create mode 100644 src/parole-disc-menu.c create mode 100644 src/parole-disc-menu.h create mode 100644 src/parole-disc.c create mode 100644 src/parole-disc.h create mode 100644 src/parole-mediachooser.c create mode 100644 src/parole-mediachooser.h create mode 100644 src/parole-medialist.c create mode 100644 src/parole-medialist.h create mode 100644 src/parole-module.c create mode 100644 src/parole-module.h create mode 100644 src/parole-open-location.c create mode 100644 src/parole-open-location.h create mode 100644 src/parole-player.c create mode 100644 src/parole-player.h create mode 100644 src/parole-plugin-player.c create mode 100644 src/parole-plugin-player.h create mode 100644 src/parole-plugins-manager.c create mode 100644 src/parole-plugins-manager.h create mode 100644 src/parole-session.c create mode 100644 src/parole-session.h create mode 100644 src/parole-statusbar.c create mode 100644 src/parole-statusbar.h create mode 100644 src/parole-subtitle-encoding.c create mode 100644 src/parole-subtitle-encoding.h create mode 100644 src/parole-utils.c create mode 100644 src/parole-utils.h create mode 100644 src/parole-vis.c create mode 100644 src/parole-vis.h diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..70526e9 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Ali Abdallah aliov@xfce.org \ No newline at end of file diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..623b625 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, 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 Street, 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. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..25a9e1c --- /dev/null +++ b/ChangeLog @@ -0,0 +1,242 @@ +2009-08-11: aliov@xfce.org + * main.c show gtk and gst command line options. + * parole-medialist.c, allow multiple selection, so handle list up + and down+remove when multiple rows are selected. + * Show a button for fast tracks selection when playing cdda. + +2009-08-06: 14:30 Ali aliov@xfce.org + * parole-gst.c Implement a timeout handler to check state change + failure, can potentially happen on live streams. + * Change the about dialog. + * Change the version from 0.1 to 0.1.90 as the first stable + version should be 0.2 + * parole-disc.c code to correctly checks if cd drive has a cdda, + this is a Linux specific thing. + * parole-gst.c the buffering bit when we force a stop state while + stream is buffering. + * parole-openlocation.c button to clear history of open locations. + * plugins/ Added a simple window title plugin to change + the title of the main window to the current playing stream. + * Set All the popup pos to be always center on parent. + * parole-plugin.c get rid of some useless code+properly + free the plugin data in finalize. + * parole-module.c fix a small memory leak. + * parole.h Support for site in the description of the plugin. + * parole-statusbar.c hide the separator when going to + fullscreen mode. + * Update the POTFILES.in and the .pot files. + +2009-08-04: 18:00 Ali aliov@xfce.org + * Added option to remember the currently loaded media + files in the playlist view. + +2009-07-31: 11:30 Ali aliov@xfce.org + * Support for Recent played media files. + * Better configuration loading based GValues. + * Register posix signal handler. + * Much better cdda support. + * Patch the makefile by Enrico Tröger to fix issue with + generating the enum types. + * Fix the sound image menu items size. + * Double clicks a file close the media chooser dialog. + * Remove grey border in fullscreen mode. + * Set the main window name to Parole Media Player. + * Fix the expander packing style in the savelist chooser. + +2009-07-30: Ali aliov@xfce.org + * Supports for Aspect ratio views. + * Remember the size of the main window set. + +2009-07-29: Ali aliov@xfce.org + * Added session code for session interaction. + * Support nice sound fading on exit. + * Automtically get the preferred video size and resize + the video output. + +2009-07-29: 13:00 Ali aliov@xfce.org + * Better seeking capabilities with the slider and the buttons. + * Added some shortcut keys. + * Added volume in the menu bar. + * Added saturation+brightness+hue+contrast support + for the video image sink. + * Fix getting the date entity tag. + +2009-07-29: 09:30 Ali aliov@xfce.org + * Added ParoleDiscMenu to show a DVD menu when playing DVD. + * Query media capabilities on paused state. + * parole-file.c get rid of a useless warning. + * parole-statusbar.c properly set text info of live streams. + * parole-gst.c optimize a bit the way we query stream info+ + added support for seeking to DVD chapters. + +2009-07-28: 13:00 Ali aliov@xfce.org + * Implement shuffle and repeat mode. + * Only hide cursor when we are playing a video. + * Better full screen support. + * Change popup size on screen size change in fullscreen mode. + +2009-07-28: 10:00 Ali aliov@xfce.org + * tray-icon plugin: Show the base filename if we don't have + the tag title. + * main.c: Added show_version function+reorder calls of gst_init and + gtk_init. + * parole-statusbar.c Much better statusbar info. + * parole-gst.c don't try to load subtitles for non local files. + * Handle all 'prepare-xwindow-id' message synchronously to avoid + XSync error in some occasions. + * Handle Failure in Changing state async to query the bus of + the real error message. + +2009-07-27: 22:00 Ali aliov@xfce.org + * Fix a wrong pixbuf name introduced in the previous commit. + * Add missing support for packing plugins in the main notebook. + * Add GStreamer dependency in the README file. + * parole-gst.c don't draw logo on expose when buffering. + * added parole-open-location.{c,h} added parole open location + to handle location open with entry completion. + +2009-07-27: 18:00 Ali aliov@xfce.org + * Don't show notebook tabs if we have one page. + * Added subtitle font encoding support, encodings code taken from + gnome-terminal + * Fix changing state to play when user select another + visualization plugin. + * data/interfaces/mediachooser.ui Remove empty box. + * Update TODO and pot file. + +2009-07-27: 15:36 Ali aliov@xfce.org + * Added system tray icon plugin, with optional notification + support. + * plugins, Now have optional configure dialog. + * Added some home made icons and a logo. + * Always set the stop button sensitive when we are trying to play + a media file, this gives the possibility to cancel at any time. + +2009-07-26: 01:15 Ali aliov@xfce.org + * Provides a dialog to load/unload plugins. + * data/interfaces/ Mark some gtk labels as non-translatable+default + respone of some buttons in the dialogs. + * parole/parole-rc-utils.{c,h} added function to load list entries+ + Split the configuration file into groups. + +2009-07-23: 23:00 Ali aliov@xfce.org + * parole/parole-gst.c Only emit media progressed signal when the + state is playing. + * parole/parole-pl-parser.{c,h} added a playlist parser code based + on code from totem and from xfmedia. + * parole/parole-filters.c added filters for playlist files. + * po/POTFILES.in updates. + * delete the common dir as it is useless. + * Change ParoleMediaFile to ParoleFile as it doesn't only describe + a media file. + +2009-07-19: 10:00 Ali aliov@xfce.org + * Handled disc uri's like dvd:/ from the command line. + +2009-07-19: 01:00 Ali aliov@xfce.org + * Parole now can play DVD/VCD. + * parole/parole-stream.c no need to hold a reference to + ParoleMediaFile object. + * Change the flag of dbus_request_name to + DBUS_NAME_FLAG_ALLOW_REPLACEMENT to make the -i (new instance) + command line working and opening a new instance, such a way + if the old instance exists the new one will take the DBus name. + +2009-07-16: Ali aliov@xfce.org + * Parole now has a simple plugin interface. (not yet complete). + * plugins/properties: media properties plugin (Read only, + needs to work the writing part with Taglib). + * No need to install the interface files anymore. + * Rename src dir to parole. + * Gtk doc for plugin api (not yet complete). + * parole/parole-player.c stop gst when the stream finishes + and no remaining media left in the list. + * parole/parole-player.c rename the media file shown in the media list + when we get a tag message from gst. + * parole/parole-stream.c Handle tag messages. + * parole/parole-module.{c,h} added a GTypeModule subclass + * parole/parole-mediafile.c expose GObject properties. + to handle plugins. + * put some code in the common dir. + * update POTFILES.in+README+TODO. + +2009-07-08 9:00 Ali aliov@xfce.org + * data/interfaces/playlist.ui disable media list horizontal scrolling. + * po/POTFILES.in fix missing strings in the interface files. + * src/gst.c apply the overlay at the correct time, the fix possible X + sync error when playing media files. + * src/mediafile.c check for error code for the unhandled Gfile info, + G_IO_ERROR_NOT_SUPPORTED occurs when we try to read info of an unsupported + location. + * src/filters.c sort media files that belong to the same dir only. + * src/main.c send media files by path instead of uri to the running + instance of the media player. + * src/medialist.c fix a bug adding folder contains media file. + from the command line. + * src/medialist.c Enable ellipsize of the text renderer. + +2009-06-19: 13:00 Ali aliov@xfce.org + * Fix stupid bug causing a crash + when adding multiple media files to the list. + +2009-06-18: 18:00 Ali aliov@xfce.org + * Make sure to don't draw the logo on expose event + when playing a movie stream. + +2009-06-18: 12:00 Ali aliov@xfce.org + * Fix uri command line handling. + * Automatically load subtitle. + * Add options for subtitles font. + +2009-06-16: 11:30 Ali aliov@xfce.org + * Show busy cursor when dropping files in the media list view. + * Fix the date in previous commit (2009 instead of 2008). + * Added command line to add media files to list. + * DBus interface for adding media files from a file manager + if Parole is already running. + * Add mime type handled by Parole in the desktop file. + +2009-06-15: 20:00 Ali aliov@xfce.org + * Add support for drag and drop in the media list view, it can now + handle dropping of a single file or list of files or a folder + contains media files/other subfolders with media files. + +2009-06-15: Ali aliov@xfce.org + * Clear the play pixbuf when finishing playing a list. + * Added mime type functions to generate mime types supported + by Parole, code to do this is taken from Totem. + * Fix finalizing media chooser object before sending file open signal + when opening single media file. + * Add missing files in yesterday's commit. + +2009-06-14: Ali aliov@xfce.org + * Added code for configurations. + * By default visualizations are disabled when playing audio files. + * User now can select between multiple Gst visualizations plugins. + +2009-06-11: Ali aliov@xfce.org + * Fix a bug in processing state change in Gst. + * Added utils.{c,h} with window cursor functions. + * Fix the date of the previous ChangeLog commit message. + +2009-06-10: Ali aliov@xfce.org + * Split the GtkBuilder interface files into multiple files. + +2009-06-07: Ali aliov@xfce.org + * Reset screen saver counter if we are playing a movie + +2009-06-07: Ali aliov@xfce.org + * Change playbin state to NULL on errors. + * Hide statusbar+menubar when full screen mode. + * Hide cursor on vidoe output when playing. + +2009-06-06: Ali aliov@xfce.org + * Button to hide/show playlist. + * Fallback to ximagesink if xvimagesink is not found. + * set the play button hidden if there is no media + in the medialist rows. + * Provide clear menu in the playlist to clear all media + * Volume range for changing volume. + +2009-06-03: 10:30 Ali aliov@xfce.org + * Initial import of parole, Juste une parole. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..7d1c323 --- /dev/null +++ b/INSTALL @@ -0,0 +1,365 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008, 2009 Free Software Foundation, Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..7ec106d --- /dev/null +++ b/Makefile.am @@ -0,0 +1,47 @@ +SUBDIRS = \ + data \ + parole \ + common \ + gst \ + dbus \ + src \ + plugins \ + docs \ + po + + +EXTRA_DIST = \ + intltool-extract.in \ + intltool-merge.in \ + intltool-update.in + +DISTCLEANFILES = \ + intltool-extract \ + intltool-merge \ + intltool-update + +distclean-local: + rm -rf *.cache + +rpm: dist + rpmbuild -ta $(PACKAGE)-$(VERSION).tar.gz + @rm -f $(PACKAGE)-$(VERSION).tar.gz + +html: Makefile + make -C doc html + +dist-bz2: dist + zcat $(PACKAGE)-$(VERSION).tar.gz | \ + bzip2 --best -c > $(PACKAGE)-$(VERSION).tar.bz2 + +distcheck-bz2: distcheck + zcat $(PACKAGE)-$(VERSION).tar.gz | \ + bzip2 --best -c > $(PACKAGE)-$(VERSION).tar.bz2 + +snapshot: dist + mv $(PACKAGE)-$(VERSION).tar.gz \ + $(PACKAGE)-$(VERSION)-r@REVISION@.tar.gz + +snapshot-bz2: dist-bz2 + mv $(PACKAGE)-$(VERSION).tar.bz2 \ + $(PACKAGE)-$(VERSION)-r@REVISION@.tar.bz2 diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..ec1fe61 --- /dev/null +++ b/NEWS @@ -0,0 +1,97 @@ +0.2.0.1 +======= +- Automatically detect disc type when parole is started with --device=/dev/sr0 without a uri +- Make the browser plugin compatible with midori, Makefile was broken. +- Remove border width from the settings. +- Fix on disk file check +- Avoid a Glib warning in the statusbar when filename is null. +- Support for playing DVD/VCD ISO images from a file. +- Query stream duration on-ready state always, fixes DVD duration query. +- Properly handle WriteReady callback. +- For local media files, check the stream caps only when switching from ready to paused state. + +0.2.0 +==== +- Fix the confirmation on delete event. +- Use g_key_file_get_locale_string to load plugin name and description +- Fix missing installable include files. +- Fix unused Gst overlay expose on READY state. +- Provide a command line to be used to enable/disable xv, X Video support might be missing for some drivers. +- Handle non local file from the command line. +- Send the kill signal if the dbus name is not yet registered in the browser plugin. +- Set the _NET_WM_WINDOW_OPACITY_LOCKED wm hint, so xfwm4 keep us opaque. +- Grab the focus on the video widget after we get the playing state signal, not when asking gst to play, this will avoid an expose event on the video widget that causes the logo to be drawn before the movie frames shows up. +- Provide an option to Enable/Disable resetting X screen saver counter while playing movies +- Check for stream type before settings the live bit. +- Don't use uri as a status bar text for live streams. +- Added get_stream to the plugin API. +- Don't popup errors in the browser plugin. +- Fix seek backwards+add mouse wheel on the volume slider, patches by Enrico Troger. + +0.1.99 +==== +- Fix bug in the active plugin saved list. +- Added translators credit. +- Fix a memory leak. +- reload the logo when the theme is changed. +- Fix compilation with xulrunner 1.9.2. +- Fix bug #6039 concerning the crash on a virtual box. +- Fix a variable type causing the cursor to be set invisible on the video + widget event if no video is playing. +/* Browser plugin */ +- Fix buffering info that was displayed in fullscreen mode. +- Stabilizing the browser plugin. + +0.1.98 +==== +- Fix missing signal handler for the mute menu item. +- Don't hide the controls in full screen when cursor is above + the popup window. +- Respect browser plugin dir installation directory. +- Support for playlist format in the media browser plugin, that it, the + plugin now gets the data from the browser, save it in a temporary + file parse it and play it... +- Added an option in the media chooser to chooer whether to start + playing opened files directly or not (bug #6035). + +0.1.96 +==== +- Fix the plugin loader bug, when the a plugin is asking to pack a widget + and the plugin loader is not ready (bug #6032). +- Exit after 60 seconds of inactivity on the browser plugin to avoid + any zombie process. + +0.1.95 +==== +- Use taglib when compiled to get the media title and display it in + the list instead of waiting for a tag message from gst to change + the display name while playing. +- Added -n command line to load parolw without plugins. +- Added XF86 button handler. +- Added an option in the media chooser dialog to enable/disable + scanning folders recursively for media files +- Handle CTL_O and XF86XK_OpenURL. +- Use cdda:// for audio disc, sine cdda:/ doesn't work! +- Give focus to media list view on GDK_Up and Down. +- Added an option in the media chooser to replace current playlist + with opened files +- Hide control full screen popup when switch from a desktop to another. +- Enter/leave fullscreen on double click on the video widget, thanks + for Enrico Troger for the patch. +- Save stream tags when stream playback finished, should be safer. +- Added a power manager plugin to inhibit the power manager + while playing DVD/VCD/DVB... +- Added --device command line to be used with cdda:// dvd:// etc... +- Added browser media player plugin. + +0.1.91 +==== +- Don't runref the vis plugin as playbin will remove it on exit (bug #5830). +- Fix settings dialog displayes in english when locales aren't english (bug #5829). +- Don't reset XScreenSaver bit when playing audio file, (problem was in the order of calls). +- Fix some untranslatable strings (bug #5827). +- Fix desktop file Application Type typo. (Type=Application instead if Type=Application;). + +0.1.90 +==== +First release. diff --git a/README b/README new file mode 100644 index 0000000..2e66bdb --- /dev/null +++ b/README @@ -0,0 +1,27 @@ +What is it? +=========== + +Parole is a modern simple media player based on the GStreamer framework and written to fit well +in the Xfce desktop. Parole features playback of local media files, DVD/CD and live streams. +Parole is extensible via plugins, for a complete how to write a plugin for Parole see +the Plugins API documentation+the plugins directory which contains some usefull examples. + +Required packages +================= +Parole depends on the following packages: + + - Gtk 2.16 or above. + - Glib 2.16 or above. + - Gio 2.16 or above. + - DBus 0.60 or above. + - DBus glib 0.70 or above. + - GStreamer: base, video, interface and GStreamer X, version 0.10.11 or above. + - libxfcegui4 4.6.0 or above. + - libxfce4util 4.6.0 or above + +How to report bugs? +=================== + +Bugs should be reported to the Xfce bug tracking system +(http://bugzilla.xfce.org, product Parole). You will need to +create an account for yourself. diff --git a/THANKS b/THANKS new file mode 100644 index 0000000..ab279f5 --- /dev/null +++ b/THANKS @@ -0,0 +1,11 @@ +What's this file about? +----------------------- +This file lists external open source projects that were the starting point of learning how to +write a GStreamer based media player. + +1) GStreamer itself, gstreamer plugins base. +2) Totem, The gnome media player. +3) Aldegonde, This tiny media player was a starting point of Totem, the code is very clear + and minimal, ideal to read before starting. + +Thanks to all the people that contributed/ing to these projects, without, Parole whouldn't be possible. diff --git a/TODO b/TODO new file mode 100644 index 0000000..907a616 --- /dev/null +++ b/TODO @@ -0,0 +1,14 @@ +=== Media player === +* Support scale ratio view. +* Handle missing gstreamer plugins. +* ... + +=== Plugins === +* Library collection. +* Galago plugin to set the IM status as away when playing a film in fullscreen. +* Equalizer plugin +* Write a youtube plugin. +* Subtitle downloader. +* Always on top. +* thumbnail. +* ...? diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..6bc0c8a --- /dev/null +++ b/autogen.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# +# Copyright (c) 2002-2009 +# The Xfce development team. All rights reserved. +# +# Written for Xfce by Benedikt Meurer . + +export XDT_AUTOGEN_REQUIRED_VERSION="4.7.0" + +(type xdt-autogen) >/dev/null 2>&1 || { + cat >&2 < + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include + +#include "parole-common.h" + + +static void +parole_dialog_show (GtkWindow *parent, + GtkMessageType type, + const gchar *window_title, + const gchar *title, + const gchar *msg) +{ + GtkWidget *dialog; + + dialog = gtk_message_dialog_new_with_markup (parent, + GTK_DIALOG_DESTROY_WITH_PARENT, + type, + GTK_BUTTONS_CLOSE, + "%s", + title); + + gtk_window_set_title (GTK_WINDOW (dialog), window_title); + + gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog), "%s", msg); + + + g_signal_connect_swapped (dialog, + "response", + G_CALLBACK (gtk_widget_destroy), + dialog); + + gtk_widget_show_all (dialog); +} + +void parole_dialog_info (GtkWindow *parent, const gchar *title, const gchar *msg) +{ + parole_dialog_show (parent, GTK_MESSAGE_INFO, _("Message"), title, msg); +} + +void parole_dialog_error (GtkWindow *parent, const gchar *title, const gchar *msg) +{ + parole_dialog_show (parent, GTK_MESSAGE_ERROR, _("Error"), title, msg); +} + + +void parole_window_busy_cursor (GdkWindow *window) +{ + GdkCursor *cursor; + + if ( G_UNLIKELY (window == NULL) ) + return; + + cursor = gdk_cursor_new (GDK_WATCH); + gdk_window_set_cursor (window, cursor); + gdk_cursor_unref (cursor); + + gdk_flush (); +} + +void parole_window_invisible_cursor (GdkWindow *window) +{ + GdkBitmap *empty_bitmap; + GdkCursor *cursor; + GdkColor color; + + char cursor_bits[] = { 0x0 }; + + if ( G_UNLIKELY (window == NULL) ) + return; + + color.red = color.green = color.blue = 0; + color.pixel = 0; + + empty_bitmap = gdk_bitmap_create_from_data (window, + cursor_bits, + 1, 1); + + cursor = gdk_cursor_new_from_pixmap (empty_bitmap, + empty_bitmap, + &color, + &color, 0, 0); + + gdk_window_set_cursor (window, cursor); + + gdk_cursor_unref (cursor); + + g_object_unref (empty_bitmap); +} diff --git a/common/parole-common.h b/common/parole-common.h new file mode 100644 index 0000000..1deabb8 --- /dev/null +++ b/common/parole-common.h @@ -0,0 +1,42 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 __PAROLE_COMMON_H_ +#define __PAROLE_COMMON_H_ + +#include +#include + + +void parole_dialog_info (GtkWindow *parent, + const gchar *title, + const gchar *msg); + +void parole_dialog_error (GtkWindow *parent, + const gchar *title, + const gchar *msg); + +void parole_window_busy_cursor (GdkWindow *window); + +void parole_window_invisible_cursor (GdkWindow *window); + + + +#endif /* __PAROLE_COMMON_ */ diff --git a/common/parole-rc-utils.c b/common/parole-rc-utils.c new file mode 100644 index 0000000..5631d26 --- /dev/null +++ b/common/parole-rc-utils.c @@ -0,0 +1,204 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include "parole-rc-utils.h" + +XfceRc * +parole_get_resource_file (const gchar *group, gboolean readonly) +{ + gchar *file; + XfceRc *rc; + + file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, PAROLE_RESOURCE_FILE, TRUE); + rc = xfce_rc_simple_open (file, readonly); + + if (rc) + xfce_rc_set_group (rc, group); + + g_free (file); + + return rc; +} + +void parole_rc_write_entry_bool (const gchar *property, const gchar *group, gboolean value) +{ + XfceRc *rc = parole_get_resource_file (group, FALSE); + + xfce_rc_write_bool_entry (rc, property, value); + xfce_rc_close (rc); +} + +void parole_rc_write_entry_int (const gchar *property, const gchar *group, gint value) +{ + XfceRc *rc = parole_get_resource_file (group, FALSE); + + xfce_rc_write_int_entry (rc, property, value); + xfce_rc_close (rc); +} + +void parole_rc_write_entry_string (const gchar *property, const gchar *group, const gchar *value) +{ + XfceRc *rc = parole_get_resource_file (group, FALSE); + + xfce_rc_write_entry (rc, property, value); + xfce_rc_close (rc); +} + +void parole_rc_write_entry_list (const gchar *property, const gchar *group, gchar **value) +{ + XfceRc *rc = parole_get_resource_file (group, FALSE); + + xfce_rc_write_list_entry (rc, property, value, ";"); + xfce_rc_close (rc); +} + +gboolean parole_rc_read_entry_bool (const gchar *property, const gchar *group, gboolean fallback) +{ + XfceRc *rc = parole_get_resource_file (group, TRUE); + gboolean ret_val = fallback; + + if ( rc ) + { + ret_val = xfce_rc_read_bool_entry (rc, property, fallback); + xfce_rc_close (rc); + } + + return ret_val; +} + +gint parole_rc_read_entry_int (const gchar *property, const gchar *group, gint fallback) +{ + XfceRc *rc = parole_get_resource_file (group, TRUE); + gint ret_val = fallback; + + if ( rc ) + { + ret_val = xfce_rc_read_int_entry (rc, property, fallback); + xfce_rc_close (rc); + } + + return ret_val; +} + +const gchar *parole_rc_read_entry_string (const gchar *property, const gchar *group, const gchar *fallback) +{ + const gchar *ret_val = fallback; + XfceRc *rc = parole_get_resource_file (group, TRUE); + + if ( rc ) + { + ret_val = xfce_rc_read_entry (rc, property, fallback); + xfce_rc_close (rc); + } + + return ret_val; +} + +gchar **parole_rc_read_entry_list (const gchar *property, const gchar *group) +{ + gchar **ret_val = NULL; + XfceRc *rc = parole_get_resource_file (group, TRUE); + + if ( rc ) + { + ret_val = xfce_rc_read_list_entry (rc, property, ";"); + xfce_rc_close (rc); + } + + return ret_val; +} + +gchar **parole_get_history_full (const gchar *relpath) +{ + gchar **lines = NULL; + gchar *history = NULL; + gchar *contents = NULL; + gsize length = 0; + + history = xfce_resource_lookup (XFCE_RESOURCE_CACHE, relpath); + + if (history && g_file_get_contents (history, &contents, &length, NULL)) + { + lines = g_strsplit (contents, "\n", -1); + g_free (contents); + } + + g_free (history); + + return lines; +} + +gchar **parole_get_history (void) +{ + return parole_get_history_full (PAROLE_HISTORY_FILE); +} + +void parole_insert_line_history (const gchar *line) +{ + parole_insert_line_history_full (PAROLE_HISTORY_FILE, line); +} + +void parole_insert_line_history_full (const gchar *relpath, const gchar *line) +{ + gchar *history = NULL; + + history = xfce_resource_save_location (XFCE_RESOURCE_CACHE, relpath, TRUE); + + if ( history ) + { + FILE *f; + f = fopen (history, "a"); + fprintf (f, "%s\n", line); + fclose (f); + g_free (history); + } + else + g_warning ("Unable to open cache file"); +} + +void parole_clear_history_file (void) +{ + parole_clear_history_file_full (PAROLE_HISTORY_FILE); +} + +void parole_clear_history_file_full (const gchar *relpath) +{ + gchar *history = NULL; + + history = xfce_resource_save_location (XFCE_RESOURCE_CACHE, relpath, FALSE); + + if ( history ) + { + FILE *f; + f = fopen (history, "w"); + fclose (f); + g_free (history); + } +} diff --git a/common/parole-rc-utils.h b/common/parole-rc-utils.h new file mode 100644 index 0000000..827f071 --- /dev/null +++ b/common/parole-rc-utils.h @@ -0,0 +1,79 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 __RC_UTILS_ +#define __RC_UTILS_ + +#include + +#define PAROLE_RESOURCE_FILE "xfce4/parole/parole-media-player.rc" +#define PAROLE_HISTORY_FILE "xfce4/parole/history" + +#define PAROLE_RC_GROUP_GENERAL "General" +#define PAROLE_RC_GROUP_PLUGINS "Plugins" + +XfceRc *parole_get_resource_file (const gchar *group, + gboolean readonly); + +void parole_rc_write_entry_bool (const gchar *property, + const gchar *group, + gboolean value); + +void parole_rc_write_entry_int (const gchar *property, + const gchar *group, + gint value); + +void parole_rc_write_entry_string (const gchar *property, + const gchar *group, + const gchar *value); + +void parole_rc_write_entry_list (const gchar *property, + const gchar *group, + gchar **value); + +gboolean parole_rc_read_entry_bool (const gchar *property, + const gchar *group, + gboolean fallback); + +gint parole_rc_read_entry_int (const gchar *property, + const gchar *group, + gint fallback); + +const gchar *parole_rc_read_entry_string (const gchar *property, + const gchar *group, + const gchar *fallback); + +gchar **parole_rc_read_entry_list (const gchar *property, + const gchar *group); + +gchar **parole_get_history (void); + +gchar **parole_get_history_full (const gchar *relpath); + +void parole_insert_line_history (const gchar *line); + +void parole_insert_line_history_full (const gchar *relpath, + const gchar *line); + +void parole_clear_history_file (void); + +void parole_clear_history_file_full (const gchar *relpath); + +#endif /* __RC_UTILS_ */ diff --git a/common/parole-screensaver.c b/common/parole-screensaver.c new file mode 100644 index 0000000..1f35fff --- /dev/null +++ b/common/parole-screensaver.c @@ -0,0 +1,113 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include + +#include "parole-screensaver.h" + +#define RESET_SCREENSAVER_TIMEOUT 6 + +#define PAROLE_SCREEN_SAVER_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_SCREENSAVER, ParoleScreenSaverPrivate)) + +struct ParoleScreenSaverPrivate +{ + gulong reset_id; +}; + +G_DEFINE_TYPE (ParoleScreenSaver, parole_screen_saver, G_TYPE_OBJECT) + + +static void +parole_screen_saver_finalize (GObject *object) +{ + ParoleScreenSaver *saver; + + saver = PAROLE_SCREEN_SAVER (object); + + parole_screen_saver_uninhibit (saver); + + G_OBJECT_CLASS (parole_screen_saver_parent_class)->finalize (object); +} + +static void +parole_screen_saver_class_init (ParoleScreenSaverClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = parole_screen_saver_finalize; + + g_type_class_add_private (klass, sizeof (ParoleScreenSaverPrivate)); +} + +static void +parole_screen_saver_init (ParoleScreenSaver *saver) +{ + saver->priv = PAROLE_SCREEN_SAVER_GET_PRIVATE (saver); + + saver->priv->reset_id = 0; +} + +static gboolean +parole_screen_saver_reset_timeout (gpointer data) +{ + XResetScreenSaver (GDK_DISPLAY ()); + return TRUE; +} + +ParoleScreenSaver * +parole_screen_saver_new (void) +{ + ParoleScreenSaver *saver = NULL; + saver = g_object_new (PAROLE_TYPE_SCREENSAVER, NULL); + return saver; +} + +void parole_screen_saver_inhibit (ParoleScreenSaver *saver) +{ + g_return_if_fail (PAROLE_IS_SCREENSAVER (saver)); + + parole_screen_saver_uninhibit (saver); + + saver->priv->reset_id = g_timeout_add_seconds (RESET_SCREENSAVER_TIMEOUT, + (GSourceFunc) parole_screen_saver_reset_timeout, + NULL); +} + +void parole_screen_saver_uninhibit (ParoleScreenSaver *saver) +{ + g_return_if_fail (PAROLE_IS_SCREENSAVER (saver)); + + if ( saver->priv->reset_id != 0 ) + { + g_source_remove (saver->priv->reset_id); + saver->priv->reset_id = 0; + } +} diff --git a/common/parole-screensaver.h b/common/parole-screensaver.h new file mode 100644 index 0000000..8fe6f1f --- /dev/null +++ b/common/parole-screensaver.h @@ -0,0 +1,56 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 __PAROLE_SCREEN_SAVER_H +#define __PAROLE_SCREEN_SAVER_H + +#include + +G_BEGIN_DECLS + +#define PAROLE_TYPE_SCREENSAVER (parole_screen_saver_get_type () ) +#define PAROLE_SCREEN_SAVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_SCREENSAVER, ParoleScreenSaver)) +#define PAROLE_IS_SCREENSAVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_SCREENSAVER)) + +typedef struct ParoleScreenSaverPrivate ParoleScreenSaverPrivate; + +typedef struct +{ + GObject parent; + ParoleScreenSaverPrivate *priv; + +} ParoleScreenSaver; + +typedef struct +{ + GObjectClass parent_class; + +} ParoleScreenSaverClass; + +GType parole_screen_saver_get_type (void) G_GNUC_CONST; +ParoleScreenSaver *parole_screen_saver_new (void); + +void parole_screen_saver_inhibit (ParoleScreenSaver *saver); + +void parole_screen_saver_uninhibit (ParoleScreenSaver *saver); + +G_END_DECLS + +#endif /* __PAROLE_SCREEN_SAVER_H */ diff --git a/configure.ac.in b/configure.ac.in new file mode 100644 index 0000000..d1b65b0 --- /dev/null +++ b/configure.ac.in @@ -0,0 +1,276 @@ +m4_define([intltool_minimum_version], [0.31]) +m4_define([parole_verinfo], [0:2:0]) +m4_define([parole_version_api], [0]) +m4_define([parole_version_major], [0]) +m4_define([parole_version_minor], [2]) +m4_define([parole_version_micro], [0.6]) +m4_define([parole_version_build], []) +m4_define([parole_version_tag], []) +m4_define([parole_version], [parole_version_major().parole_version_minor().parole_version_micro()ifelse(parole_version_tag(), [git], [parole_version_tag().parole_version_build()], [parole_version_tag()])]) + +AC_INIT([parole], [parole_version], [aliov@xfce.org]) +AC_PREREQ(2.59c) + +AM_INIT_AUTOMAKE([1.8 dist-bzip2 tar-ustar]) +AM_CONFIG_HEADER([config.h]) +AM_MAINTAINER_MODE() +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AC_USE_SYSTEM_EXTENSIONS() + +# ===================================================== # +# Basic compiler settings # +# ===================================================== # +AC_PROG_CC() +AC_PROG_CXX() +AM_PROG_CC_C_O() +AC_PROG_LD() +AC_PROG_INSTALL() +AC_PROG_INTLTOOL([intltool_minimum_version], [no-xml]) + +# ===================================================== # +# Initialize libtool # +# ===================================================== # +AC_DISABLE_STATIC() +AC_PROG_LIBTOOL() +m4_ifdef([LT_OUTPUT], [LT_OUTPUT]) + +# ===================================================== # +# Version information # +# ===================================================== # +PAROLE_VERINFO=parole_verinfo() +PAROLE_VERSION_API=parole_version_api() +PAROLE_VERSION_MAJOR=parole_version_major() +PAROLE_VERSION_MINOR=parole_version_minor() +PAROLE_VERSION_MICRO=parole_version_micro() +AC_SUBST([PAROLE_VERINFO]) +AC_SUBST([PAROLE_VERSION_API]) +AC_SUBST([PAROLE_VERSION_MAJOR]) +AC_SUBST([PAROLE_VERSION_MINOR]) +AC_SUBST([PAROLE_VERSION_MICRO]) + +# ==================================================== # +# Check for headers needed for standard interfaces # +# ==================================================== # +AC_HEADER_STDC +AC_CHECK_HEADERS([errno.h signal.h stddef.h sys/ioctl.h fcntl.h\ + string.h sys/stat.h sys/types.h sys/wait.h time.h \ + unistd.h]) + +# ===================================================== # +# Check for i18n support # +# ===================================================== # + +XDT_I18N([@LINGUAS@]) + +#==================================================== # +# Check for required packages # +#=====================================================# +m4_define([gtk_minimum_version], [2.16.0]) +m4_define([glib_minimum_version], [2.16.0]) +m4_define([gstreamer_minimum_version], [0.10.11]) + +m4_define([dbus_minimum_version], [0.60]) +m4_define([dbus_glib_minimum_version], [0.70]) + +m4_define([libxfcegui4_minimum_version],[4.6.0]) +m4_define([libxfce4util_minimum_version],[4.6.0]) + +m4_define([libnotify_minimum_version], [0.4.1]) + +XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [gtk_minimum_version]) +XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [glib_minimum_version]) +XDT_CHECK_PACKAGE([GOBJECT], [gobject-2.0], [glib_minimum_version]) +XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [glib_minimum_version]) +XDT_CHECK_PACKAGE([GMODULE], [gmodule-2.0], [glib_minimum_version]) +XDT_CHECK_PACKAGE([GIO], [gio-2.0], [glib_minimum_version]) + +XDT_CHECK_PACKAGE([GST], [gstreamer-0.10], [gstreamer_minimum_version]) +XDT_CHECK_PACKAGE([GST_BASE], [gstreamer-base-0.10], [gstreamer_minimum_version]) +XDT_CHECK_PACKAGE([GST_VIDEO], [gstreamer-video-0.10], [gstreamer_minimum_version]) +XDT_CHECK_PACKAGE([GST_INTERFACES], [gstreamer-interfaces-0.10], [gstreamer_minimum_version]) + +XDT_CHECK_PACKAGE([DBUS], [dbus-1], [dbus_minimum_version]) +XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [dbus_glib_minimum_version]) + +XDT_CHECK_PACKAGE([LIBXFCE4GUI], [libxfcegui4-1.0],[libxfcegui4_minimum_version]) +XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0],[libxfce4util_minimum_version]) + +#=======================================================# +# Check for availability of libnotify # +#=======================================================# +LIBNOTIFY_FOUND="no" +XDT_CHECK_OPTIONAL_PACKAGE([LIBNOTIFY], + [libnotify], [libnotify_minimum_version], + [libnotify], + [libnotify library], [yes]) + +# Taken from Gnome system tools +#=======================================================# +# Pixmaps files # +#=======================================================# +if test "x${prefix}" = "xNONE"; then + AC_DEFINE_UNQUOTED(PIXMAPS_DIR, "${ac_default_prefix}/${DATADIRNAME}/${PACKAGE}/pixmaps", [pixmaps directory]) + pixmapsdir="${ac_default_prefix}/${DATADIRNAME}/${PACKAGE}/pixmaps" +else + AC_DEFINE_UNQUOTED(PIXMAPS_DIR, "${prefix}/${DATADIRNAME}/${PACKAGE}/pixmaps", [pixmaps directory]) + pixmapsdir="${prefix}/${DATADIRNAME}/${PACKAGE}/pixmaps" +fi + +AC_SUBST(pixmapsdir) + +#=======================================================# +# Check XF86keysysm # +#=======================================================# +# Check for the AudioPlay sym other should exist +# if this one exists. +AC_CHECK_DECL(XF86XK_AudioPlay,have_XF86XK_AudioPlay=1,have_XF86XK_AudioPlay=0,[#include ]) +if test "x${ac_cv_have_decl_XF86XK_AudioPlay}" != "xno"; then + AC_DEFINE(HAVE_XF86_KEYSYM, 1, [Define if XF86keysysm.h is available]) +fi + +#=======================================================# +# TagLib support # +#=======================================================# +TAGLIB_FOUND="no" +XDT_CHECK_OPTIONAL_PACKAGE([TAGLIB], + [taglib], [1.4], + [taglib], + [tag lib], [yes]) + +if test x"$TAGLIB_FOUND" = x"yes"; then +TAGLIBC_LIBS="" +TAGLIBC_CFLAGS="" +AC_CHECK_LIB([tag_c], [taglib_file_new], +[ + AC_CHECK_HEADER([taglib/tag_c.h], + [ + TAGLIBC_LIBS="-ltag_c" + AC_DEFINE([HAVE_TAGLIBC], [1], [Define to 1 if tag_c is found]) + ]) +], [-lm]) +AC_SUBST([TAGLIBC_CFLAGS]) +AC_SUBST([TAGLIBC_LIBS]) +fi + +#=======================================================# +# Check plugins to build # +#=======================================================# + +# Stream Properties plugin. +#-------------------------- +AC_ARG_ENABLE([properties-plugin], AC_HELP_STRING([--disable-properties-plugin], [Don't build parole stream properties plugin]), + [ac_properties_plugin=$enableval], [ac_properties_plugin=yes]) +AC_MSG_CHECKING([whether to build the Parole stream properties plugin]) +AM_CONDITIONAL([PAROLE_PROPERTIES_PLUGIN], [test x"$ac_properties_plugin" = x"yes"]) +AC_MSG_RESULT([$ac_properties_plugin]) + +# Tray plugin. +#-------------------------- +AC_ARG_ENABLE([tray-plugin], AC_HELP_STRING([--disable-tray-plugin], [Don't build parole tray icon plugin]), + [ac_tray_plugin=$enableval], [ac_tray_plugin=yes]) +AC_MSG_CHECKING([whether to build the system tray plugin]) +AM_CONDITIONAL([PAROLE_TRAY_PLUGIN], [test x"$ac_tray_plugin" = x"yes"]) +AC_MSG_RESULT([$ac_tray_plugin]) +# Should we build the tray icon with notification support? +LIBNOTIFY_FOUND="no" +if test x"$ac_tray_plugin" = x"yes"; then + XDT_CHECK_OPTIONAL_PACKAGE([LIBNOTIFY], + [libnotify], [libnotify_minimum_version], + [libnotify], + [libnotify library], [yes]) +fi + +# Window title plugin. +#-------------------------- +AC_ARG_ENABLE([window-title-plugin], AC_HELP_STRING([--disable-window-title-plugin], [Don't build the window title plugin]), + [ac_window_title_plugin=$enableval], [ac_window_title_plugin=yes]) +AC_MSG_CHECKING([whether to build the window title plugin]) +AM_CONDITIONAL([WINDOW_TITLE_PLUGIN], [test x"$ac_window_title_plugin" = x"yes"]) +AC_MSG_RESULT([$ac_window_title_plugin]) + +# Power Manager +#-------------------------- +AC_ARG_ENABLE([power-manager-plugin], AC_HELP_STRING([--disable-power-manager-plugin], [Don't build the power manager plugin]), + [ac_power_manager_plugin=$enableval], [ac_power_manager_plugin=yes]) +AC_MSG_CHECKING([whether to build the power manager plugin]) +AM_CONDITIONAL([POWER_MANAGER_PLUGIN], [test x"$ac_power_manager_plugin" = x"yes"]) +AC_MSG_RESULT([$ac_power_manager_plugin]) + +#=======================================================# +# Check for debugging support # +#=======================================================# +XDT_FEATURE_DEBUG() + +#=======================================================# +# Check for Gtk doc # +#=======================================================# +GTK_DOC_CHECK(1.9) + +AC_OUTPUT([ +Makefile +data/Makefile +data/pixmaps/Makefile +data/interfaces/Makefile +data/icons/Makefile +data/icons/16x16/Makefile +data/icons/22x22/Makefile +data/icons/32x32/Makefile +data/icons/48x48/Makefile +data/icons/scalable/Makefile +data/mime/Makefile +data/desktop/Makefile +parole/Makefile +parole/parole.h +common/Makefile +gst/Makefile +dbus/Makefile +src/Makefile +plugins/Makefile +plugins/sample/Makefile +plugins/properties/Makefile +plugins/tray/Makefile +plugins/window-title/Makefile +plugins/power-manager/Makefile +docs/Makefile +docs/plugin-api/version.xml +docs/plugin-api/Makefile +po/Makefile.in +]) + +echo " +------------------------------------------------------ + Parole Media Player $VERSION + ==================================== + + Installation: + ============= + prefix: $prefix + pixmapsdir: $pixmapsdir + Debug: $enable_debug + Building plugin api docs: ${enable_gtk_doc} + + Optional dependencies: + ====================== + Libnotify: $LIBNOTIFY_FOUND + Taglib: $TAGLIB_FOUND + + Plugins to build: + ================= + Stream Properties: ${ac_properties_plugin}" + if test x${ac_properties_plugin} = x"yes"; then + echo " (With taglib $TAGLIB_FOUND)" + fi + echo " + System Tray icon: ${ac_tray_plugin}" + if test x${ac_tray_plugin} = x"yes"; then + echo " (With notification $LIBNOTIFY_FOUND)" + fi + + echo " + Window title: ${ac_window_title_plugin} + Power Manager: ${ac_power_manager_plugin} + +------------------------------------------------------ + +Configuration finished, type make to compile" diff --git a/data/Makefile.am b/data/Makefile.am new file mode 100644 index 0000000..6b0d93e --- /dev/null +++ b/data/Makefile.am @@ -0,0 +1,6 @@ +SUBDIRS = \ + interfaces \ + pixmaps \ + icons \ + mime \ + desktop diff --git a/data/desktop/Makefile.am b/data/desktop/Makefile.am new file mode 100644 index 0000000..948be75 --- /dev/null +++ b/data/desktop/Makefile.am @@ -0,0 +1,21 @@ +MIME_LIST=$(top_srcdir)/data/mime/mime-type-list.txt + +# +# .desktop file +# +desktop_in_files = parole.desktop.in +desktopdir = $(datadir)/applications +desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) +@INTLTOOL_DESKTOP_RULE@ + +parole.desktop.in: parole.desktop.in.in desktop.sh $(MIME_LIST) + cat $(srcdir)/parole.desktop.in.in > $@ &&\ + $(SHELL) $(srcdir)/desktop.sh $(MIME_LIST) >> $@ + +EXTRA_DIST = \ + desktop.sh \ + parole.desktop.in.in + +CLEANFILES = \ + $(desktop_in_files) \ + $(desktop_DATA) \ No newline at end of file diff --git a/data/desktop/desktop.sh b/data/desktop/desktop.sh new file mode 100755 index 0000000..4c47664 --- /dev/null +++ b/data/desktop/desktop.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +echo_mime () { + printf "$i;"; +} + +MIMETYPES=`grep -v ^# $1` +printf MimeType=; +for i in $MIMETYPES ; do + echo_mime; +done + +echo "" diff --git a/data/desktop/parole.desktop.in.in b/data/desktop/parole.desktop.in.in new file mode 100644 index 0000000..ec62c3f --- /dev/null +++ b/data/desktop/parole.desktop.in.in @@ -0,0 +1,8 @@ +[Desktop Entry] +_Name=Parole +Icon=parole +Exec=parole %F +Terminal=false +Type=Application +Categories=GTK;AudioVideo;Player;Video; +StartupNotify=true diff --git a/data/icons/16x16/Makefile.am b/data/icons/16x16/Makefile.am new file mode 100644 index 0000000..fe2031a --- /dev/null +++ b/data/icons/16x16/Makefile.am @@ -0,0 +1,7 @@ +EXTRA_DIST = \ + $(Data_DATA) + +Datadir = $(datadir)/icons/hicolor/16x16/apps + +Data_DATA = \ + parole.png diff --git a/data/icons/16x16/parole.png b/data/icons/16x16/parole.png new file mode 100644 index 0000000000000000000000000000000000000000..3b94bc74e1e56f64dbb7088d054288efaa4539ee GIT binary patch literal 947 zcmV;k15EshP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXe~ z6fYM>d6*#p00T2gL_t(I%Z<}bXk1ks1@LqK_r9;0H`AFnlgvbCOiU^v(b!^(m|8!u z3Q7wK6@?vAjlSDHlF(jFfH!t(P z?{y_8M(`}p;;haOBefaR{+C@}W$k;4b80|Un5Z_AsurR5Gi z_Dr3K2ml1vR3Yo6y`aOxC}c#OfAjgcuB}rpiYAsD~?OOi%(#q_idS~nx3WBKOhoRl+ zc6mnRtXx^qg)bMN&JArpHS+RSZoVEylWY17Sz(-=IaV(}Eo&&65AI3#bw+FB1|?~# z`~85o+OF+-J#zYEL4G&KiDM`FcinNT)B;QDmX054 zK?ni>A_iU4m|yDIHytl=G0Ih|d(FCY^a=0XQ}1E>v>~VX13|?eONcQLV+IkW03ZN> zfzmilZgVyUTg_8mzRIWMfrAePPab`~zwMs%ntv?vS57}$irom2@KIE>n}}in5Db7) zk~4-m$1Y91^xO*@TnMB|!d4f50swXK%2(RnN5=W$&~>c+07xYpQpphjN=PY_I7v5s zKWN96wmRF?1{i4s=<2WMnKwS(pE>hZUQM()QjSaa3Nf-|nmQtk z!Y^FUbNx856VGiq8L055@{Wi81x}?oZ9@ VYOWxeZp{Dy002ovPDHLkV1oHpuV4TG literal 0 HcmV?d00001 diff --git a/data/icons/22x22/Makefile.am b/data/icons/22x22/Makefile.am new file mode 100644 index 0000000..638474a --- /dev/null +++ b/data/icons/22x22/Makefile.am @@ -0,0 +1,7 @@ +EXTRA_DIST = \ + $(Data_DATA) + +Datadir = $(datadir)/icons/hicolor/22x22/apps + +Data_DATA = \ + parole.png diff --git a/data/icons/22x22/parole.png b/data/icons/22x22/parole.png new file mode 100644 index 0000000000000000000000000000000000000000..2135c30fa6fb31a7bcc17d37d06a28d53e67ad13 GIT binary patch literal 1532 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 IM6N<$g1n3_mH+?% literal 0 HcmV?d00001 diff --git a/data/icons/48x48/Makefile.am b/data/icons/48x48/Makefile.am new file mode 100644 index 0000000..189ea6c --- /dev/null +++ b/data/icons/48x48/Makefile.am @@ -0,0 +1,7 @@ +EXTRA_DIST = \ + $(Data_DATA) + +Datadir = $(datadir)/icons/hicolor/48x48/apps + +Data_DATA = \ + parole.png diff --git a/data/icons/48x48/parole.png b/data/icons/48x48/parole.png new file mode 100644 index 0000000000000000000000000000000000000000..377e6585628b8882f749e38f593e787d6a3d539a GIT binary patch literal 5223 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/scalable/parole.svg b/data/icons/scalable/parole.svg new file mode 100644 index 0000000..03181df --- /dev/null +++ b/data/icons/scalable/parole.svg @@ -0,0 +1,1346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/scalable/status/Makefile.am b/data/icons/scalable/status/Makefile.am new file mode 100644 index 0000000..9580871 --- /dev/null +++ b/data/icons/scalable/status/Makefile.am @@ -0,0 +1,6 @@ +EXTRA_DIST = \ + $(Data_DATA) + +Datadir = $(datadir)/icons/hicolor/scalable/status + +Data_DATA = diff --git a/data/interfaces/Makefile.am b/data/interfaces/Makefile.am new file mode 100644 index 0000000..58a9c85 --- /dev/null +++ b/data/interfaces/Makefile.am @@ -0,0 +1,44 @@ +interfaces = \ + parole.ui \ + parole-settings.ui \ + playlist.ui \ + mediachooser.ui \ + save-playlist.ui \ + plugins.ui \ + open-location.ui + +interfaces_h = \ + $(interfaces:.ui=_ui.h) + +if MAINTAINER_MODE +BUILT_SOURCES = $(interfaces_h) + +parole_ui.h: parole.ui + exo-csource --static --strip-comments --strip-content --name=parole_ui $< > $@ + +parole-settings_ui.h: parole-settings.ui + exo-csource --static --strip-comments --strip-content --name=parole_settings_ui $< > $@ + +playlist_ui.h: playlist.ui + exo-csource --static --strip-comments --strip-content --name=playlist_ui $< > $@ + +mediachooser_ui.h: mediachooser.ui + exo-csource --static --strip-comments --strip-content --name=mediachooser_ui $< > $@ + +save-playlist_ui.h: save-playlist.ui + exo-csource --static --strip-comments --strip-content --name=save_playlist_ui $< > $@ + +open-location_ui.h: open-location.ui + exo-csource --static --strip-comments --strip-content --name=open_location_ui $< > $@ + +plugins_ui.h: plugins.ui + exo-csource --static --strip-comments --strip-content --name=plugins_ui $< > $@ + +endif + +CLEANFILES = \ + $(interfaces_h) + +EXTRA_DIST = \ + $(interfaces) \ + $(interfaces_h) \ No newline at end of file diff --git a/data/interfaces/mediachooser.ui b/data/interfaces/mediachooser.ui new file mode 100644 index 0000000..ac62ab2 --- /dev/null +++ b/data/interfaces/mediachooser.ui @@ -0,0 +1,154 @@ + + + + + + + Parole Media Chooser + 680 + 480 + audio-x-generic + normal + False + Open media files + + + + True + vertical + 2 + + + True + vertical + + + True + 5 + vertical + 1 + + + + + 0 + + + + + Scan folders recursively + True + True + False + True + + + + False + False + 1 + + + + + Replace playlist with opened files + True + True + False + True + + + + False + False + 2 + + + + + Start playing opened files + True + True + False + True + + + + False + False + 3 + + + + + 1 + + + + + True + edge + + + True + + + + + + 0 + + + + + True + 5 + True + + + gtk-close + True + True + True + True + + + + 0 + + + + + Add + True + True + True + image1 + + + + 1 + + + + + end + 1 + + + + + False + False + end + 0 + + + + + + + True + gtk-add + + diff --git a/data/interfaces/open-location.ui b/data/interfaces/open-location.ui new file mode 100644 index 0000000..ca7ced4 --- /dev/null +++ b/data/interfaces/open-location.ui @@ -0,0 +1,178 @@ + + + + + + + 400 + gtk-network + normal + False + Open location of media file or live stream + + + True + vertical + 2 + + + True + vertical + 5 + + + True + 5 + + + True + Enter the address of a location to open + + + False + False + 0 + + + + + True + True + gtk-info + 1 + + + False + False + 1 + + + + + False + 0 + + + + + True + 5 + + + True + True + + + + 0 + + + + + Clear history + True + True + True + image2 + + + False + False + 1 + + + + + False + 1 + + + + + 1 + + + + + True + end + + + gtk-cancel + True + True + True + True + + + False + False + 0 + + + + + gtk-open + True + True + True + True + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + cancel + open + + + + True + gtk-clear + + + 5 + normal + False + + + True + vertical + 2 + + + + + + True + end + + + + + + + + + False + end + 0 + + + + + + diff --git a/data/interfaces/parole-settings.ui b/data/interfaces/parole-settings.ui new file mode 100644 index 0000000..6be698c --- /dev/null +++ b/data/interfaces/parole-settings.ui @@ -0,0 +1,452 @@ + + + + + + + 0 + Parole Settings + parole + normal + False + Media Player Settings + + + + True + vertical + 2 + + + True + vertical + 10 + + + True + 0 + none + + + True + 12 + + + True + vertical + + + True + 4 + 2 + 5 + 5 + + + True + Brightness: + + + + + + + + + True + Contrast: + + + 1 + 2 + + + + + + + True + True + discontinuous + False + + + + 1 + 2 + + + + + True + True + discontinuous + False + + + + 1 + 2 + 1 + 2 + + + + + True + Hue: + + + 2 + 3 + + + + + + + True + Saturation: + + + 3 + 4 + + + + + + + True + True + discontinuous + False + + + + 1 + 2 + 2 + 3 + + + + + True + True + discontinuous + False + + + + 1 + 2 + 3 + 4 + + + + + 0 + + + + + True + end + + + Reset To Defaults + True + True + True + image1 + + + + False + False + 0 + + + + + 1 + + + + + + + + + True + <b>Display</b> + True + + + + + 0 + + + + + True + 0 + none + + + True + 12 + + + Disable screen saver while playing movies + True + True + False + True + + + + + + + + True + <b>Video</b> + True + + + + + 1 + + + + + True + 0 + none + + + True + 12 + + + True + vertical + 5 + + + Enable visualization when playing audio file + True + True + False + True + + + + 0 + + + + + True + 2 + + + True + Visualization type: + + + False + False + 0 + + + + + True + liststore1 + + + + + 0 + + + + + 1 + + + + + 1 + + + + + + + + + True + <b>Audio</b> + True + + + + + 2 + + + + + True + 0 + none + + + True + 12 + + + True + vertical + 5 + + + Automatically load subtitles when playing movie file + True + True + False + True + + + + 0 + + + + + True + 2 + 2 + 2 + 2 + + + True + Font: + + + GTK_FILL + + + + + True + True + True + + + + 1 + 2 + + + + + True + Encoding: + + + 1 + 2 + GTK_FILL + + + + + True + + + + 1 + 2 + 1 + 2 + + + + + 1 + + + + + + + + + True + <b>Subtitles</b> + True + + + + + 3 + + + + + 1 + + + + + True + + + + + + gtk-close + True + True + True + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + close + + + + + + + + + + True + gtk-undo + + diff --git a/data/interfaces/parole.ui b/data/interfaces/parole.ui new file mode 100644 index 0000000..4ffad80 --- /dev/null +++ b/data/interfaces/parole.ui @@ -0,0 +1,850 @@ + + + + + + Parole Media Player + center + 780 + 480 + parole + + + + + + + True + vertical + + + True + + + True + _Media + True + + + True + + + gtk-open + True + True + True + + + + + + _Open location + True + True + image5 + False + + + + + + True + + + + + DVD + True + image14 + False + + + True + + + From ISO image + True + image15 + False + + + + + + True + + + + + + + + + gtk-cdrom + True + True + True + + + True + + + From ISO image + True + image16 + False + + + + + + True + + + + + + + + + True + + + + + gtk-quit + True + True + True + + + + + + + + + + True + _Edit + True + + + True + + + True + Repeat + True + + + + + + True + Shuffle + True + + + + + + True + + + + + True + Plugins + True + + + + + gtk-preferences + True + True + True + + + + + + + + + + True + _View + True + + + True + + + True + Aspect Ratio + True + + + True + + + True + None + True + True + + + + + + True + Auto + True + True + ratio_none + + + + + + True + Square + True + True + ratio_none + + + + + + True + 4:3 (TV) + True + True + ratio_none + + + + + + True + 16:9 (Widescreen) + True + True + ratio_none + + + + + + True + 20:9 (DVB) + True + True + ratio_none + + + + + + + + + + True + + + + + gtk-fullscreen + True + True + True + + + + + + + + + + + True + Sound + True + + + True + + + Mute + True + image12 + False + + + + + + Volume Up + True + image11 + False + + + + + + + Volume Down + True + image10 + False + + + + + + + + + + + True + _Help + True + + + True + + + gtk-about + True + True + True + + + + + + + + + + False + 0 + + + + + True + + + True + True + False + False + True + 0 + + + True + vertical + 5 + + + True + True + + + True + + + True + vertical + + + True + True + + + + + + 0 + + + + + True + vertical + + + True + 3 + 3 + + + True + vertical + 5 + + + True + + + True + 5 + + + Previous Chapter + True + True + True + image1 + none + + + False + 0 + + + + + DVD Menu + True + True + True + image2 + none + + + False + 1 + + + + + Chapter Menu + True + True + True + image3 + none + + + False + 2 + + + + + True + + + True + True + + + + + 3 + + + + + + + + Select Track + True + True + True + image13 + none + + + False + 5 + + + + + Next Chapter + True + True + True + image4 + none + + + False + 6 + + + + + + + False + 0 + + + + + True + False + True + False + + + + + + + False + 1 + + + + + True + + + True + vertical + 5 + + + True + 5 + + + True + False + True + True + image6 + none + False + + + + False + 0 + + + + + True + False + True + True + image7 + none + False + + + + False + 1 + + + + + True + False + True + True + image8 + none + False + + + + False + 2 + + + + + True + False + True + True + image9 + none + False + + + + False + 3 + + + + + True + 5 + + + True + gtk-missing-image + + + False + 0 + + + + + 100 + 10 + True + True + True + False + + + + + False + 1 + + + + + 30 + end + 4 + + + + + 0 + + + + + 0 + + + + + gtk-leave-fullscreen + True + True + True + none + True + + + + False + 2 + + + + + True + True + True + True + image18 + none + + + + False + False + end + 1 + + + + + False + 2 + + + + + + + 0 + + + + + False + 1 + + + + + + + True + False + + + + + True + True + False + True + True + + + False + False + + + + + 0 + + + + + + + True + Media player + + + False + + + + + + + + + + + + + + + + + 0 + + + + + 1 + + + + + True + + + False + 2 + + + + + True + 5 + 5 + + + True + True + 5 + + + + + + + + False + 3 + + + + + + + True + audio-volume-low + + + True + audio-volume-high + + + True + audio-volume-muted + + + True + gtk-media-previous + + + True + gtk-index + + + True + True + gtk-index + + + True + gtk-cdrom + + + True + gtk-media-next + + + True + gtk-media-rewind + + + True + gtk-media-stop + + + True + gtk-media-play + + + True + gtk-media-forward + + + True + gtk-go-forward + + + True + gtk-network + + + True + gtk-cdrom + 1 + + + True + gtk-file + 1 + + + True + gtk-file + 1 + + diff --git a/data/interfaces/playlist.ui b/data/interfaces/playlist.ui new file mode 100644 index 0000000..3dc9f3e --- /dev/null +++ b/data/interfaces/playlist.ui @@ -0,0 +1,174 @@ + + + + + + True + False + gtk-add + + + True + False + gtk-remove + + + True + False + gtk-go-up + + + True + False + gtk-go-down + + + True + False + gtk-save-as + + + True + False + 5 + + + True + False + + + True + False + + + True + True + never + automatic + True + in + + + True + True + True + False + True + + + + + + + + + + True + True + 0 + + + + + True + False + 2 + True + + + True + True + True + False + image1 + + + + False + True + 0 + + + + + True + False + True + True + False + image5 + + + + False + True + 1 + + + + + True + False + True + True + False + image2 + + + + False + True + 2 + + + + + True + False + True + True + False + image3 + + + + False + True + 3 + + + + + True + False + True + True + False + image4 + + + + False + True + 4 + + + + + False + False + 4 + 1 + + + + + + + True + True + 0 + + + + diff --git a/data/interfaces/plugins.ui b/data/interfaces/plugins.ui new file mode 100644 index 0000000..8eb352f --- /dev/null +++ b/data/interfaces/plugins.ui @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + 5 + Parole Plugins + 500 + 300 + True + parole + normal + True + True + False + Media Player plugins + + + + True + vertical + 2 + + + True + 10 + + + True + queue + + + True + True + never + automatic + + + True + True + liststore + False + 0 + + + + True + Enabled + True + + + + + + 0 + + + + + + + Plugin + + + + 1 + + + + + + + + + + + 0 + + + + + True + vertical + 10 + + + True + 3 + 2 + 4 + 10 + + + True + <b>Description:</b> + True + + + + + + + + + True + <b>Author:</b> + True + + + 1 + 2 + + + + + + + True + True + True + + + 1 + 2 + + + + + True + True + + + 1 + 2 + 1 + 2 + + + + + True + <b>Site:</b> + True + + + 2 + 3 + + + + + + + True + + + + + + 1 + 2 + 2 + 3 + + + + + False + 0 + + + + + True + 10 + + + gtk-properties + True + True + True + True + + + + False + 0 + + + + + + + + False + end + 1 + + + + + 1 + + + + + 1 + + + + + True + end + + + + + + gtk-close + True + True + True + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + close + + + diff --git a/data/interfaces/save-playlist.ui b/data/interfaces/save-playlist.ui new file mode 100644 index 0000000..bc754f3 --- /dev/null +++ b/data/interfaces/save-playlist.ui @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + By Extension + + 0 + + + + + 5 + center-on-parent + normal + False + save + True + + + True + vertical + 2 + + + True + True + + + True + True + liststore + + + + File Type + True + + + + 0 + + + + + + + Extension + + + + 1 + + + + + + + + + True + Select File Types (By Extension) + + + + + False + False + 2 + + + + + True + end + + + gtk-close + True + True + True + True + + + + False + False + 0 + + + + + gtk-save + True + True + True + True + + + + False + False + 1 + + + + + False + end + 0 + + + + + + button2 + button1 + + + diff --git a/data/mime/Makefile.am b/data/mime/Makefile.am new file mode 100644 index 0000000..0661dc2 --- /dev/null +++ b/data/mime/Makefile.am @@ -0,0 +1,15 @@ +# Based On Totem + +nodist_noinst_HEADERS = parole-mime-types.h + +parole-mime-types.h: mime-type-include.sh mime-type-list.txt mime-functions.sh + $(srcdir)/mime-type-include.sh $(srcdir)/mime-type-list.txt \ + > $@ + +EXTRA_DIST = \ + mime-functions.sh \ + mime-type-include.sh \ + mime-type-list.txt + +CLEANFILES = \ + parole-mime-types.h \ No newline at end of file diff --git a/data/mime/mime-functions.sh b/data/mime/mime-functions.sh new file mode 100644 index 0000000..3ede00f --- /dev/null +++ b/data/mime/mime-functions.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +get_audio_mimetypes () +{ + MIMETYPES=`grep -v ^# $1 | grep "\/" | grep audio | grep -v "audio/x-pn-realaudio"` + MIMETYPES="$MIMETYPES application/x-flac" + MIMETYPES="$MIMETYPES application/vnd.rn-realmedia" +} + +get_video_mimetypes () +{ + MIMETYPES=`grep -v ^# $1 | grep -v x-content/ | grep -v audio | grep -v "application/x-flac"` + MIMETYPES="$MIMETYPES audio/x-pn-realaudio" +} + diff --git a/data/mime/mime-type-include.sh b/data/mime/mime-type-include.sh new file mode 100755 index 0000000..f702a7f --- /dev/null +++ b/data/mime/mime-type-include.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +. `dirname $0`/mime-functions.sh + +echo_mime () { + echo "\"$i\"," +} + +MIMETYPES=`grep -v ^# $1 | grep -v x-content/` + +echo "/* generated with mime-types-include.sh, don't edit */" + +get_audio_mimetypes $1; + +echo "char *audio_mime_types[] = {" +for i in $MIMETYPES ; do + echo_mime; +done + +echo "};" + +get_video_mimetypes $1; + +echo "char *video_mime_types[] = {" +for i in $MIMETYPES ; do + echo_mime; +done + +echo "};" + diff --git a/data/mime/mime-type-list.txt b/data/mime/mime-type-list.txt new file mode 100644 index 0000000..927f153 --- /dev/null +++ b/data/mime/mime-type-list.txt @@ -0,0 +1,93 @@ +application/ogg +application/ram +application/sdp +application/smil +application/smil+xml +application/vnd.rn-realmedia +application/x-extension-m4a +application/x-extension-mp4 +application/x-flac +application/x-flash-video +application/x-matroska +application/x-netshow-channel +application/x-ogg +application/x-quicktime-media-link +application/x-quicktimeplayer +application/x-shorten +application/x-smil +audio/3gpp +audio/ac3 +audio/AMR +audio/AMR-WB +audio/basic +audio/midi +audio/mp4 +audio/mpeg +audio/ogg +audio/vnd.rn-realaudio +audio/x-ape +audio/x-flac +audio/x-it +audio/x-m4a +audio/x-matroska +audio/x-mod +audio/x-mp3 +audio/x-mpeg +audio/x-musepack +audio/x-pn-aiff +audio/x-pn-au +audio/x-pn-realaudio +audio/x-pn-realaudio-plugin +audio/x-pn-wav +audio/x-pn-windows-acm +audio/x-realaudio +audio/x-real-audio +audio/x-sbc +audio/x-speex +audio/x-tta +audio/x-wav +audio/x-wavpack +audio/x-vorbis +audio/x-vorbis+ogg +audio/x-xm +image/vnd.rn-realpix +image/x-pict +misc/ultravox +text/google-video-pointer +text/x-google-video-pointer +video/3gpp +video/dv +video/fli +video/flv +video/mp4 +video/mp4v-es +video/mpeg +video/msvideo +video/ogg +video/quicktime +video/vivo +video/vnd.divx +video/vnd.rn-realvideo +video/vnd.vivo +video/x-anim +video/x-avi +video/x-flc +video/x-fli +video/x-flic +video/x-flv +video/x-m4v +video/x-matroska +video/x-mpeg +video/x-ms-asf +video/x-msvideo +video/x-ms-wm +video/x-ms-wmv +video/x-nsv +video/x-ogm+ogg +video/x-theora+ogg +x-content/video-dvd +x-content/video-vcd +x-content/video-svcd +# No support for those yet +#x-content/video-blueray +#x-content/video-hddvd diff --git a/data/pixmaps/Makefile.am b/data/pixmaps/Makefile.am new file mode 100644 index 0000000..a1d4d08 --- /dev/null +++ b/data/pixmaps/Makefile.am @@ -0,0 +1,9 @@ +pixmaps = \ + parole.png \ + loader.gif + +pixmaps_DATA = \ + $(pixmaps) + +EXTRA_DIST = \ + $(pixmaps) \ No newline at end of file diff --git a/data/pixmaps/loader.gif b/data/pixmaps/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0bce1542342e912da81a2c260562df172f30d73 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nnmm28Kh24mmkF0U1e2Nli^nlO|14{Lk&@8WQa67~pE8 zXTZz|lvDgC+Z`3#dv5h=E26FfcG1 zbL_hF&)}42ws10s6^G;;cE1^EoUR)U5A70}d2pLv!jVIT7j&Z~EblI3x0K*v_sV|m z0kj3v921Z^em#l`(k(o@H$3ZdDRc@9NidXDNbqrumReCGv$gd8+e8WW28HVqkJ_9i zH>s*<31KtHjANIPvi2#*6BEu%3Dak5O_t&NBI)H?V$TxT}#l{vOTn5naXTfF^&~Hhq+NX@#Ccc>y7T?;vjI&jdhsDsPJyAw*m0Qz>i}K7# zL9w50Ng{fT}A5JUe8lRK1h7_Y2;BWJDd=c6f&i?Wv5(5q?6|P zQw{>maxZP<537OA37Uk}7@%_$4o$EWe_Zl>&#id|lE-BpDC#+Fn|msJ%_2h{Hg1vP z#N8WAzfWasG}yq|xqE)DrWaOofX=z|?*pgc%{ig5vl!pqDlC|q&~Z0$&Rvsft&VO- z4MZj+%-+Vx%W}v;V76hyp=;+R;x+~t^Q%*xuFTQAF2})fSfTHDAs>sO!OBw`)&)o$ c0!CNZt))x~rAZP^^P&YOFfdqy5)K#u0POD40{{R3 literal 0 HcmV?d00001 diff --git a/data/pixmaps/parole.png b/data/pixmaps/parole.png new file mode 100644 index 0000000000000000000000000000000000000000..1edd54805a1e7b022c65621f61c6c657054d45e6 GIT binary patch literal 91063 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 BGf4md literal 0 HcmV?d00001 diff --git a/dbus/Makefile.am b/dbus/Makefile.am new file mode 100644 index 0000000..d04e3b1 --- /dev/null +++ b/dbus/Makefile.am @@ -0,0 +1,9 @@ +noinst_LTLIBRARIES = \ + libparoledbus.la + +libparoledbus_la_SOURCES = \ + parole-dbus.c \ + parole-dbus.h + +libparoledbus_la_CFLAGS = \ + $(DBUS_GLIB_CFLAGS) diff --git a/dbus/parole-dbus.c b/dbus/parole-dbus.c new file mode 100644 index 0000000..31f5330 --- /dev/null +++ b/dbus/parole-dbus.c @@ -0,0 +1,171 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include + +#include + +#include "parole-dbus.h" + +static void +proxy_destroy_cb (DBusGConnection *bus) +{ + dbus_g_connection_unref (bus); +} + +static DBusConnection * +parole_session_bus_get (void) +{ + return dbus_g_connection_get_connection (parole_g_session_bus_get ()); +} + +DBusGConnection * +parole_g_session_bus_get (void) +{ + static gboolean session_bus_connected = FALSE; + DBusGConnection *bus; + GError *error = NULL; + + if ( G_LIKELY (session_bus_connected) ) + { + bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); + } + else + { + bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); + + if ( error ) + { + g_error ("%s", error->message); + } + session_bus_connected = TRUE; + } + + return bus; +} + +DBusGProxy * +parole_get_proxy (const gchar *path, const gchar *iface) +{ + DBusGConnection *bus; + DBusGProxy *proxy; + + bus = parole_g_session_bus_get (); + + proxy = dbus_g_proxy_new_for_name (bus, + PAROLE_DBUS_NAME, + path, + iface); + + if ( !proxy ) + g_error ("Unable to create proxy for %s", PAROLE_DBUS_NAME); + + g_signal_connect_swapped (proxy, "destroy", + G_CALLBACK (proxy_destroy_cb), bus); + + return proxy; +} + +gboolean parole_dbus_name_has_owner (const gchar *name) +{ + DBusConnection *bus; + DBusError error; + gboolean ret; + + bus = parole_session_bus_get (); + + dbus_error_init (&error); + + ret = dbus_bus_name_has_owner (bus, name, &error); + + dbus_connection_unref (bus); + + if ( dbus_error_is_set (&error) ) + { + g_warning ("Failed to get name owner: %s\n", error.message); + dbus_error_free (&error); + } + + return ret; +} + +gboolean parole_dbus_register_name (const gchar *name) +{ + DBusConnection *bus; + DBusError error; + int ret; + + bus = parole_session_bus_get (); + + dbus_error_init (&error); + + ret = + dbus_bus_request_name (bus, + name, + DBUS_NAME_FLAG_ALLOW_REPLACEMENT, + &error); + + dbus_connection_unref (bus); + + if ( dbus_error_is_set (&error) ) + { + g_warning ("Error: %s\n", error.message); + dbus_error_free (&error); + return FALSE; + } + + return ret == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER ? TRUE : FALSE; +} + +gboolean parole_dbus_release_name (const gchar *name) +{ + DBusConnection *bus; + DBusError error; + int ret; + + bus = parole_session_bus_get (); + + dbus_error_init (&error); + + ret = + dbus_bus_release_name (bus, + name, + &error); + + dbus_connection_unref (bus); + + if ( dbus_error_is_set (&error) ) + { + g_warning ("Error: %s\n", error.message); + dbus_error_free (&error); + return FALSE; + } + + return ret == -1 ? FALSE : TRUE; +} diff --git a/dbus/parole-dbus.h b/dbus/parole-dbus.h new file mode 100644 index 0000000..b29cb71 --- /dev/null +++ b/dbus/parole-dbus.h @@ -0,0 +1,45 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 __PAROLE_DBUS_H_ +#define __PAROLE_DBUS_H_ + +#include + +#define PAROLE_DBUS_NAME "org.Parole.Media.Player" + +#define PAROLE_DBUS_PATH "/org/Parole/Media/Player" +#define PAROLE_DBUS_PLAYLIST_PATH "/org/Parole/Media/List" + +#define PAROLE_DBUS_INTERFACE "org.Parole.Media.Player" +#define PAROLE_DBUS_PLAYLIST_INTERFACE "org.Parole.Media.List" + +DBusGConnection *parole_g_session_bus_get (void); + +DBusGProxy *parole_get_proxy (const gchar *path, + const gchar *iface); + +gboolean parole_dbus_name_has_owner (const gchar *name); + +gboolean parole_dbus_register_name (const gchar *name); + +gboolean parole_dbus_release_name (const gchar *name); + +#endif /* __PAROLE_DBUS_ */ diff --git a/docs/Makefile.am b/docs/Makefile.am new file mode 100644 index 0000000..c5ac55c --- /dev/null +++ b/docs/Makefile.am @@ -0,0 +1,2 @@ +SUBDIRS = \ + plugin-api \ No newline at end of file diff --git a/docs/plugin-api/Makefile.am b/docs/plugin-api/Makefile.am new file mode 100644 index 0000000..0ea1d96 --- /dev/null +++ b/docs/plugin-api/Makefile.am @@ -0,0 +1,88 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = 1.8 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name of the module, e.g. 'glib'. +DOC_MODULE=Parole-Plugins + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting the functions and macros. +# e.g. DOC_SOURCE_DIR=../../../gtk +DOC_SOURCE_DIR=../../parole + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS=--ignore-headers=config.h --rebuild-types + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS=--sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS= + +# Extra options to supply to gtkdoc-mkhtml +MKHTML_OPTIONS= + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS= + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +CFILE_GLOB=$(top_srcdir)/parole/*.c +HFILE_GLOB=$(top_srcdir)/parole/*.h + +# Header files to ignore when scanning. +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +#IGNORE_HFILES= + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES= + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files= \ + version.xml \ + parole-plugins-tut.sgml + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +GTKDOC_CFLAGS= \ + $(GTK_CFLAGS) \ + $(GLIB_CFLAGS) \ + $(GOBJECT_CFLAGS) \ + $(TAGLIBC_CFLAGS) \ + -I$(top_builddir)/parole + +GTKDOC_LIBS= \ + $(GTK_LIBS) \ + $(GLIB_LIBS) \ + $(GOBJECT_LIBS) \ + $(TAGLIBC_LIBS) \ + $(top_builddir)/parole/libparole.la + +if ENABLE_GTK_DOC +include $(top_srcdir)/gtk-doc.make +else +EXTRA_DIST= +endif + +EXTRA_DIST += \ + version.xml.in + diff --git a/docs/plugin-api/Parole-Plugins-docs.sgml b/docs/plugin-api/Parole-Plugins-docs.sgml new file mode 100644 index 0000000..55baf32 --- /dev/null +++ b/docs/plugin-api/Parole-Plugins-docs.sgml @@ -0,0 +1,76 @@ + + + + + +]> + + + Parole Plugins Reference Manual + + for Parole-Plugins &version; + + &date; + + + 2009 + Ali Abdallah + + + + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with no + Invariant Sections, with no Front-Cover Texts, and with no Back-Cover + Texts. The complete license text is available from the Free Software Foundation. + + + + + + + Introduction + + Parole is a modern simple media player base on the + + GStreamer framework and written for + Xfce. + + + + + Parole Plugin Tutorial + &plugin-tut; + + + + Fundamentals + + + + + Parole Plugin Reference + + + + + + + Parole Utilities + + + + + + + + API Index + + + + diff --git a/docs/plugin-api/Parole-Plugins-overrides.txt b/docs/plugin-api/Parole-Plugins-overrides.txt new file mode 100644 index 0000000..e69de29 diff --git a/docs/plugin-api/Parole-Plugins-sections.txt b/docs/plugin-api/Parole-Plugins-sections.txt new file mode 100644 index 0000000..1d83097 --- /dev/null +++ b/docs/plugin-api/Parole-Plugins-sections.txt @@ -0,0 +1,132 @@ +
+parole-provider-player +ParoleProviderPlayerIface +ParoleProviderPlayer +ParolePluginContainer +ParoleState +parole_provider_player_get_main_window +parole_provider_player_pack +parole_provider_player_get_state +parole_provider_player_get_stream +parole_provider_player_play_uri +parole_provider_player_pause +parole_provider_player_resume +parole_provider_player_stop +parole_provider_player_seek +parole_provider_player_open_media_chooser + +PAROLE_PROVIDER_PLAYER +PAROLE_IS_PROVIDER_PLAYER +PAROLE_TYPE_PROVIDER_PLAYER +parole_provider_player_get_type +
+ +
+parole-provider-plugin +ParoleProviderPluginIface +ParoleProviderPlugin +parole_provider_plugin_get_is_configurable +parole_provider_plugin_configure +parole_provider_plugin_set_player + +PAROLE_PROVIDER_PLUGIN +PAROLE_IS_PROVIDER_PLUGIN +PAROLE_TYPE_PROVIDER_PLUGIN +parole_provider_plugin_get_type +
+ +
+parole-file +ParoleFile +ParoleFile +parole_file_new +parole_file_new_with_display_name +parole_file_get_file_name +parole_file_get_display_name +parole_file_get_uri +parole_file_get_content_type + +PAROLE_FILE +PAROLE_IS_FILE +PAROLE_TYPE_FILE +parole_file_get_type +
+ +
+parole-stream +ParoleMediaType +ParoleStream +ParoleStream + +PAROLE_STREAM +PAROLE_IS_STREAM +PAROLE_TYPE_STREAM +parole_stream_get_type +
+ +
+parole-enum-types +parole_media_type_get_type +PAROLE_ENUM_TYPE_MEDIA_TYPE +parole_plugin_container_get_type +PAROLE_ENUM_TYPE_PLUGIN_CONTAINER +parole_state_get_type +PAROLE_ENUM_TYPE_STATE +parole_pl_format_get_type +PAROLE_ENUM_TYPE_PL_FORMAT +
+ +
+parole-pl-parser +ParolePlFormat +parole_pl_parser_guess_format_from_extension +parole_pl_parser_guess_format_from_data +parole_pl_parser_can_parse_data +parole_pl_parser_parse_from_file_by_extension +parole_pl_parser_parse_all_from_file +parole_pl_parser_save_from_files +
+ +
+stamp-enum-types +
+ +
+parole +PAROLE_MAJOR_VERSION +PAROLE_MINOR_VERSION +PAROLE_MICRO_VERSION +PAROLE_CHECK_VERSION +PAROLE_DEFINE_TYPE +PAROLE_DEFINE_TYPE_EXTENDED +PAROLE_DEFINE_TYPE_WITH_CODE +PAROLE_DEFINE_ABSTRACT_TYPE +PAROLE_DEFINE_ABSTRACT_TYPE_WITH_CODE +PAROLE_IMPLEMENT_INTERFACE +
+ +
+parole-filters +parole_get_supported_audio_filter +parole_get_supported_video_filter +parole_get_supported_media_filter +parole_get_supported_files_filter +parole_get_supported_playlist_filter +parole_file_filter +
+ +
+parole-marshal +parole_marshal_VOID__OBJECT_ENUM +parole_marshal_VOID__OBJECT_DOUBLE +parole_marshal_VOID__OBJECT_INT +
+ +
+parole-debug +PAROLE_DEBUG_ENUM +PAROLE_DEBUG_ENUM_FULL +parole_debug_enum +parole_debug_enum_full +
+ diff --git a/docs/plugin-api/Parole-Plugins.types b/docs/plugin-api/Parole-Plugins.types new file mode 100644 index 0000000..b953d66 --- /dev/null +++ b/docs/plugin-api/Parole-Plugins.types @@ -0,0 +1,8 @@ +parole_file_get_type +parole_media_type_get_type +parole_pl_format_get_type +parole_plugin_container_get_type +parole_provider_player_get_type +parole_provider_plugin_get_type +parole_state_get_type +parole_stream_get_type diff --git a/docs/plugin-api/parole-plugins-tut.sgml b/docs/plugin-api/parole-plugins-tut.sgml new file mode 100644 index 0000000..a33959c --- /dev/null +++ b/docs/plugin-api/parole-plugins-tut.sgml @@ -0,0 +1,142 @@ + + + This section explains the steps required to write a plugin for Parole using + the C language interface. + + + + A simple example can be found in the parole plugins dir shipped with the source code, the sample + plugin. + + + As a basics, the plugin needs to implement ParoleProviderPlugin + interface, That is, the player use this interface to get if the plugin is configurable, to ask it to show + its properties dialog when needed, to set the ParoleProviderPlayer + interface used by plugins to access the the Parole player backend. + + + + + Plugin structure. + sample-plugin.c + + +#include "sample-provider.h" + +/* Avoid a no previous function declaration compiler warning*/ +G_MODULE_EXPORT GType parole_plugin_initialize (ParoleProviderPlugin *plugin); +G_MODULE_EXPORT void parole_plugin_shutdown (void); + +G_MODULE_EXPORT GType +parole_plugin_initialize (ParoleProviderPlugin *plugin) +{ + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + sample_provider_register_type (plugin); + return SAMPLE_TYPE_PROVIDER; +} + +G_MODULE_EXPORT void +parole_plugin_shutdown (void) +{ + +} + + + sample-provider.h + +#ifndef SAMPLE_PROVIDER_H_ +#define SAMPLE_PROVIDER_H_ + +#include <parole/parole.h> + +G_BEGIN_DECLS + +typedef struct _SampleProviderClass SampleProviderClass; +typedef struct _SampleProvider SampleProvider; + +#define SAMPLE_TYPE_PROVIDER (sample_provider_get_type ()) +#define SAMPLE_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SAMPLE_TYPE_PROVIDER, SampleProvider)) +#define SAMPLE_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SAMPLE_TYPE_PROVIDER, SampleProviderClass)) +#define SAMPLE_IS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SAMPLE_TYPE_PROVIDER)) +#define SAMPLE_IS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SAMPLE_TYPE_PROVIDER)) +#define SAMPLE_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SAMPLE_TYPE_PROVIDER, SampleProviderClass)) + +GType sample_provider_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL; + +void sample_provider_register_type (ParoleProviderPlugin *plugin); + +G_END_DECLS + + + sample-provider.c + + +#include "sample-provider.h" + +static void sample_provider_iface_init (ParoleProviderPluginIface *iface); +static void sample_provider_finalize (GObject *object); + + +struct _SampleProviderClass +{ + GObjectClass parent_class; +}; + +struct _SampleProvider +{ + GObject parent; + ParoleProviderPlayer *player; +}; + +PAROLE_DEFINE_TYPE_WITH_CODE (SampleProvider, + sample_provider, + G_TYPE_OBJECT, + PAROLE_IMPLEMENT_INTERFACE (PAROLE_TYPE_PROVIDER_PLUGIN, + sample_provider_iface_init)); + +static void sample_provider_configure (ParoleProviderPlugin *provider, GtkWidget *parent) +{ + /*Open the configuration dialog, parent is the window transient for*/ +} + +static gboolean sample_provider_is_configurable (ParoleProviderPlugin *plugin) +{ + return TRUE; /*Returns FALSE and don't override the iface->configure function*/ +} + +static void +sample_provider_set_player (ParoleProviderPlugin *plugin, ParoleProviderPlayer *player) +{ + SampleProvider *provider; + provider = SAMPLE_PROVIDER (plugin); + + provider->player = player; +} + +static void +sample_provider_iface_init (ParoleProviderPluginIface *iface) +{ + iface->get_is_configurable = sample_provider_is_configurable; + iface->configure = sample_provider_configure; + iface->set_player = sample_provider_set_player; +} + +static void sample_provider_class_init (SampleProviderClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = sample_provider_finalize; +} + +static void sample_provider_init (SampleProvider *provider) +{ + provider->player = NULL; +} + +static void sample_provider_finalize (GObject *object) +{ + G_OBJECT_CLASS (sample_provider_parent_class)->finalize (object); +} + + + diff --git a/docs/plugin-api/tmpl/Parole-Plugins-unused.sgml b/docs/plugin-api/tmpl/Parole-Plugins-unused.sgml new file mode 100644 index 0000000..86f6ab7 --- /dev/null +++ b/docs/plugin-api/tmpl/Parole-Plugins-unused.sgml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + +Parole Plugin Tutorial + + + This section explains the steps required to write a plugin for Parole using + the C language interface. + + + + A simple example can be found in the parole plugins dir shipped with the source code, the sample + plugin. + + + As a basics, the plugin needs to implement ParoleProviderPlugin + interface, That is, the player use this interface to get if the plugin is configurable, to ask it to show + its properties dialog when needed, to set the ParoleProviderPlayer + interface used by plugins to access the the Parole player backend. + + + + Plugin structure. + sample-plugin.c + + +#include "sample-provider.h" + +/* Avoid a no previous function declaration compiler warning*/ +G_MODULE_EXPORT GType parole_plugin_initialize (ParoleProviderPlugin *plugin); +G_MODULE_EXPORT void parole_plugin_shutdown (void); + +G_MODULE_EXPORT GType +parole_plugin_initialize (ParoleProviderPlugin *plugin) +{ + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + sample_provider_register_type (plugin); + return SAMPLE_TYPE_PROVIDER; +} + +G_MODULE_EXPORT void +parole_plugin_shutdown (void) +{ + +} + + + sample-provider.h + +#ifndef SAMPLE_PROVIDER_H_ +#define SAMPLE_PROVIDER_H_ + +#include <parole/parole.h> + +G_BEGIN_DECLS + +typedef struct _SampleProviderClass SampleProviderClass; +typedef struct _SampleProvider SampleProvider; + +#define SAMPLE_TYPE_PROVIDER (sample_provider_get_type ()) +#define SAMPLE_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SAMPLE_TYPE_PROVIDER, SampleProvider)) +#define SAMPLE_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SAMPLE_TYPE_PROVIDER, SampleProviderClass)) +#define SAMPLE_IS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SAMPLE_TYPE_PROVIDER)) +#define SAMPLE_IS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SAMPLE_TYPE_PROVIDER)) +#define SAMPLE_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SAMPLE_TYPE_PROVIDER, SampleProviderClass)) + +GType sample_provider_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL; + +void sample_provider_register_type (ParoleProviderPlugin *plugin); + +G_END_DECLS + + + sample-provider.c + + +#include "sample-provider.h" + +static void sample_provider_iface_init (ParoleProviderPluginIface *iface); +static void sample_provider_finalize (GObject *object); + + +struct _SampleProviderClass +{ + GObjectClass parent_class; +}; + +struct _SampleProvider +{ + GObject parent; + ParoleProviderPlayer *player; +}; + +PAROLE_DEFINE_TYPE_WITH_CODE (SampleProvider, + sample_provider, + G_TYPE_OBJECT, + PAROLE_IMPLEMENT_INTERFACE (PAROLE_TYPE_PROVIDER_PLUGIN, + sample_provider_iface_init)); + +static void sample_provider_configure (ParoleProviderPlugin *provider, GtkWidget *parent) +{ + /*Open the configuration dialog, parent is the window transient for*/ +} + +static gboolean sample_provider_is_configurable (ParoleProviderPlugin *plugin) +{ + return TRUE; /*Returns FALSE and don't override the iface->configure function*/ +} + +static void +sample_provider_set_player (ParoleProviderPlugin *plugin, ParoleProviderPlayer *player) +{ + SampleProvider *provider; + provider = SAMPLE_PROVIDER (plugin); + + provider->player = player; +} + +static void +sample_provider_iface_init (ParoleProviderPluginIface *iface) +{ + iface->get_is_configurable = sample_provider_is_configurable; + iface->configure = sample_provider_configure; + iface->set_player = sample_provider_set_player; +} + +static void sample_provider_class_init (SampleProviderClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = sample_provider_finalize; +} + +static void sample_provider_init (SampleProvider *provider) +{ + provider->player = NULL; +} + +static void sample_provider_finalize (GObject *object) +{ + G_OBJECT_CLASS (sample_provider_parent_class)->finalize (object); +} + + + + + + + + + + + + +@o: + + + + + + +@o: + + + + + + +@PAROLE_FILE_UNKNOWN: +@PAROLE_FILE_AUDIO: +@PAROLE_FILE_VIDEO: +@PAROLE_FILE_PLAYLIST: + + + + + + +@file: +@Returns: + + + + + + +@stream: + + + + + + +@Returns: + diff --git a/docs/plugin-api/tmpl/parole-debug.sgml b/docs/plugin-api/tmpl/parole-debug.sgml new file mode 100644 index 0000000..efca9e3 --- /dev/null +++ b/docs/plugin-api/tmpl/parole-debug.sgml @@ -0,0 +1,66 @@ + +Parole Debug + + + + + + + + + + + + + + + + + + + + + + +@_text: +@_value: +@_type: + + + + + + + +@_value: +@_type: +@...: + + + + + + + +@func: +@file: +@line: +@text: +@v_enum: +@type: + + + + + + + +@func: +@file: +@line: +@v_enum: +@type: +@format: +@Varargs: + + diff --git a/docs/plugin-api/tmpl/parole-enum-types.sgml b/docs/plugin-api/tmpl/parole-enum-types.sgml new file mode 100644 index 0000000..3e75993 --- /dev/null +++ b/docs/plugin-api/tmpl/parole-enum-types.sgml @@ -0,0 +1,79 @@ + +parole-enum-types + + + + + + + + + + + + + + + + + + + + + + +@Returns: + + + + + + + + + + + + + + +@Returns: + + + + + + + + + + + + + + +@Returns: + + + + + + + + + + + + + + +@Returns: + + + + + + + + + diff --git a/docs/plugin-api/tmpl/parole-file.sgml b/docs/plugin-api/tmpl/parole-file.sgml new file mode 100644 index 0000000..9df6242 --- /dev/null +++ b/docs/plugin-api/tmpl/parole-file.sgml @@ -0,0 +1,100 @@ + +ParoleFile + + +Simple file handling. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@filename: +@Returns: + + + + + + + +@filename: +@display_name: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@Returns: + + diff --git a/docs/plugin-api/tmpl/parole-filters.sgml b/docs/plugin-api/tmpl/parole-filters.sgml new file mode 100644 index 0000000..19706f0 --- /dev/null +++ b/docs/plugin-api/tmpl/parole-filters.sgml @@ -0,0 +1,69 @@ + +Parole Filters + + + + + + + + + + + + + + + + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@filter: +@file: +@Returns: + + diff --git a/docs/plugin-api/tmpl/parole-marshal.sgml b/docs/plugin-api/tmpl/parole-marshal.sgml new file mode 100644 index 0000000..4eb6295 --- /dev/null +++ b/docs/plugin-api/tmpl/parole-marshal.sgml @@ -0,0 +1,58 @@ + +parole-marshal + + + + + + + + + + + + + + + + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + diff --git a/docs/plugin-api/tmpl/parole-pl-parser.sgml b/docs/plugin-api/tmpl/parole-pl-parser.sgml new file mode 100644 index 0000000..c9c2708 --- /dev/null +++ b/docs/plugin-api/tmpl/parole-pl-parser.sgml @@ -0,0 +1,87 @@ + +Parole Playlist Parser + + + + + + + + + + + + + + + + + + + + + + +@PAROLE_PL_FORMAT_UNKNOWN: +@PAROLE_PL_FORMAT_M3U: +@PAROLE_PL_FORMAT_PLS: +@PAROLE_PL_FORMAT_ASX: +@PAROLE_PL_FORMAT_XSPF: + + + + + + +@filename: +@Returns: + + + + + + + +@filename: +@Returns: + + + + + + + +@data: +@len: +@Returns: + + + + + + + +@filename: +@Returns: + + + + + + + +@filename: +@Returns: + + + + + + + +@files: +@filename: +@format: +@Returns: + + diff --git a/docs/plugin-api/tmpl/parole-provider-player.sgml b/docs/plugin-api/tmpl/parole-provider-player.sgml new file mode 100644 index 0000000..c90cb6b --- /dev/null +++ b/docs/plugin-api/tmpl/parole-provider-player.sgml @@ -0,0 +1,161 @@ + +ParoleProviderPlayer + + +The interface of the player. + + + +The player interface that the plugins should use in order to, issue playback +commands to the Parole GStreamer backend or to get information about the current +playback status. + + + + + + + + + + + + + + + + + + + + + +@paroleproviderplayeriface: the object which received the signal. +@arg1: +@arg2: + + + + + + +@paroleproviderplayeriface: the object which received the signal. +@arg1: + + + + + + + + + + + + +@PAROLE_PLUGIN_CONTAINER_PLAYLIST: +@PAROLE_PLUGIN_CONTAINER_MAIN_VIEW: + + + + + + +@PAROLE_STATE_STOPPED: +@PAROLE_STATE_PLAYBACK_FINISHED: +@PAROLE_STATE_PAUSED: +@PAROLE_STATE_PLAYING: + + + + + + +@player: +@Returns: + + + + + + + +@player: +@widget: +@title: +@container: + + + + + + + +@player: +@Returns: + + + + + + + +@player: +@Returns: + + + + + + + +@player: +@uri: +@Returns: + + + + + + + +@player: +@Returns: + + + + + + + +@player: +@Returns: + + + + + + + +@player: +@Returns: + + + + + + + +@player: +@pos: +@Returns: + + + + + + + +@player: + + diff --git a/docs/plugin-api/tmpl/parole-provider-plugin.sgml b/docs/plugin-api/tmpl/parole-provider-plugin.sgml new file mode 100644 index 0000000..3a5c24d --- /dev/null +++ b/docs/plugin-api/tmpl/parole-provider-plugin.sgml @@ -0,0 +1,65 @@ + +ParoleProviderPlugin + + +The interface of the plugin type registration. + + + +The methods of this interface should be overridden by the plugin, the Parole player +calls these methods to determine if the plugin is configurable, to ask the plugin to +open its configuration dialog or to set the #ParoleProviderPlayer that the plugin +can use to get access to various functionalities of the player. + + + + +#ParoleProviderPlayer. + + + + + + + + + + +@__parent__: +@get_is_configurable: +@configure: +@set_player: + + + + + + + + + + + + +@provider: +@Returns: + + + + + + + +@provider: +@parent: + + + + + + + +@provider: +@player: + + diff --git a/docs/plugin-api/tmpl/parole-stream.sgml b/docs/plugin-api/tmpl/parole-stream.sgml new file mode 100644 index 0000000..9f11cff --- /dev/null +++ b/docs/plugin-api/tmpl/parole-stream.sgml @@ -0,0 +1,147 @@ + +ParoleStream + + +Currently playing stream. + + + +This object contains all the information describing the current processed stream +by Parole, this object is used with the callback function the #ParoleProviderPlayerIface::state-changed +signal of the player, the plugin shouldn't take reference and all the properties are read-only for the plugins.s + + + + + +#ParoleProviderPlayer + + + + + + + + + + +@PAROLE_MEDIA_TYPE_UNKNOWN: +@PAROLE_MEDIA_TYPE_LOCAL_FILE: +@PAROLE_MEDIA_TYPE_CDDA: +@PAROLE_MEDIA_TYPE_VCD: +@PAROLE_MEDIA_TYPE_SVCD: +@PAROLE_MEDIA_TYPE_DVD: +@PAROLE_MEDIA_TYPE_DVB: +@PAROLE_MEDIA_TYPE_REMOTE: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/plugin-api/tmpl/parole.sgml b/docs/plugin-api/tmpl/parole.sgml new file mode 100644 index 0000000..ffc1863 --- /dev/null +++ b/docs/plugin-api/tmpl/parole.sgml @@ -0,0 +1,113 @@ + +Parole + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@major: +@minor: +@micro: + + + + + + + +@TN: +@t_n: +@T_P: + + + + + + + +@TN: +@t_n: +@T_P: +@_f_: +@_C_: + + + + + + + +@TN: +@t_n: +@T_P: +@_C_: + + + + + + + +@TN: +@t_n: +@T_P: + + + + + + + +@TN: +@t_n: +@T_P: +@_C_: + + + + + + + +@TYPE_IFACE: +@iface_init: + + diff --git a/docs/plugin-api/tmpl/stamp-enum-types.sgml b/docs/plugin-api/tmpl/stamp-enum-types.sgml new file mode 100644 index 0000000..1d108b9 --- /dev/null +++ b/docs/plugin-api/tmpl/stamp-enum-types.sgml @@ -0,0 +1,19 @@ + +stamp-enum-types + + + + + + + + + + + + + + + + + diff --git a/docs/plugin-api/version.xml.in b/docs/plugin-api/version.xml.in new file mode 100644 index 0000000..d78bda9 --- /dev/null +++ b/docs/plugin-api/version.xml.in @@ -0,0 +1 @@ +@VERSION@ diff --git a/gst/Makefile.am b/gst/Makefile.am new file mode 100644 index 0000000..891ec29 --- /dev/null +++ b/gst/Makefile.am @@ -0,0 +1,82 @@ +noinst_LTLIBRARIES = \ + libparolegst.la + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/common \ + -I$(top_srcdir)/parole \ + -DLOCALEDIR=\"$(localedir)\" \ + -DPAROLE_COMPILATION \ + -DG_LOG_DOMAIN=\"parole-gst\" + +GENERATED_FILES = \ + gstmarshal.c \ + gstmarshal.h \ + gst-enum-types.c \ + gst-enum-types.h + +libparolegst_la_SOURCES = \ + $(GENERATED_FILES) \ + parole-gst.c \ + parole-gst.h \ + parole-gst-iface.c \ + parole-gst-iface.h + +libparolegst_la_CFLAGS = \ + $(GST_VIDEO_CFLAGS) \ + $(GST_INTERFACES_CFLAGS) \ + $(GTHREAD_CFLAGS) \ + $(LIBXFCE4GUI_CFLAGS) + +libparolegst_la_LIBADD = \ + $(top_builddir)/parole/libparole.la\ + $(top_builddir)/common/libparolecommon.la + +parole_glib_enum_headers = \ + parole-gst.h + +if MAINTAINER_MODE + +BUILT_SOURCES = \ + $(GENERATED_FILES) + +gstmarshal.c: gstmarshal.list + echo "#include \"gstmarshal.h\"" > $@ && \ + glib-genmarshal $< --prefix=_gmarshal --body >> $@ + +gstmarshal.h: gstmarshal.list + glib-genmarshal $< --prefix=_gmarshal --header > $@ + +gst-enum-types.h: stamp-enum-types.h + @true +stamp-enum-types.h: $(parole_glib_enum_headers) Makefile + ( cd $(srcdir) && glib-mkenums \ + --fhead "#ifndef __GST_ENUM_TYPE_H__\n#define __GST_ENUM_TYPE_H__\n#include \nG_BEGIN_DECLS\n" \ + --fprod "/* enumerations from \"@filename@\" */\n" \ + --vhead "GType @enum_name@_get_type (void);\n#define GST_ENUM_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __GST_ENUM_TYPE_H__ */" \ + $(parole_glib_enum_headers) ) > xgen-enum.h \ + && (cmp -s xgen-enum.h gst-enum-types.h || cp xgen-enum.h gst-enum-types.h) \ + && rm -f xgen-enum.h \ + && echo timestamp > $(@F) + +gst-enum-types.c: $(parole_glib_enum_headers) Makefile + ( cd $(srcdir) && glib-mkenums \ + --fhead "#include \"gst-enum-types.h\"\n\n" \ + --fhead "#include \"parole-gst.h\"\n\n" \ + --fprod "\n/* enumerations from \"@filename@\" */" \ + --vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \ + --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ + --vtail " { 0, NULL, NULL }\n };\n etype = g_@type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \ + $(parole_glib_enum_headers) ) >> xgen-enum.c \ + && cp xgen-enum.c gst-enum-types.c \ + && rm -f xgen-enum.c + +endif + +EXTRA_DIST = \ + gstmarshal.list + +DISTCLEANFILES = \ + $(BUILT_SOURCES) \ + stamp-enum-types.h diff --git a/gst/gstmarshal.list b/gst/gstmarshal.list new file mode 100644 index 0000000..4447534 --- /dev/null +++ b/gst/gstmarshal.list @@ -0,0 +1,4 @@ +VOID:OBJECT,ENUM +VOID:OBJECT,INT64 +VOID:OBJECT,INT + diff --git a/gst/parole-gst-iface.c b/gst/parole-gst-iface.c new file mode 100644 index 0000000..cdc8e67 --- /dev/null +++ b/gst/parole-gst-iface.c @@ -0,0 +1,108 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include "parole-gst-iface.h" + +GType +parole_gst_helper_get_type (void) +{ + static GType type = G_TYPE_INVALID; + + if (G_UNLIKELY (type == G_TYPE_INVALID)) + { + static const GTypeInfo info = + { + sizeof (ParoleGstHelperIface), + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + NULL, + NULL, + }; + + type = g_type_register_static (G_TYPE_INTERFACE, "ParoleGstHelperIface", &info, 0); + + g_type_interface_add_prerequisite (type, G_TYPE_OBJECT); + } + + return type; +} + +void parole_gst_helper_draw_logo (ParoleGstHelper *gst) +{ + if ( PAROLE_GST_HELPER_GET_IFACE (gst)->draw_logo ) + { + (*PAROLE_GST_HELPER_GET_IFACE (gst)->draw_logo) (gst); + } +} + +void parole_gst_helper_load_subtitle (ParoleGstHelper *gst) +{ + if ( PAROLE_GST_HELPER_GET_IFACE (gst)->load_subtitle ) + { + (*PAROLE_GST_HELPER_GET_IFACE (gst)->load_subtitle) (gst); + } +} + +void parole_gst_helper_set_video_colors (ParoleGstHelper *gst) +{ + if ( PAROLE_GST_HELPER_GET_IFACE (gst)->set_video_color_balance ) + { + (*PAROLE_GST_HELPER_GET_IFACE (gst)->set_video_color_balance) (gst); + } +} + +void parole_gst_helper_set_subtitle_font (ParoleGstHelper *gst) +{ + if ( PAROLE_GST_HELPER_GET_IFACE (gst)->set_subtitle_font ) + { + (*PAROLE_GST_HELPER_GET_IFACE (gst)->set_subtitle_font) (gst); + } +} + +void parole_gst_helper_set_subtitle_encoding (ParoleGstHelper *gst) +{ + if ( PAROLE_GST_HELPER_GET_IFACE (gst)->set_subtitle_encoding ) + { + (*PAROLE_GST_HELPER_GET_IFACE (gst)->set_subtitle_encoding) (gst); + } +} + +void parole_gst_helper_update_vis (ParoleGstHelper *gst) +{ + if ( PAROLE_GST_HELPER_GET_IFACE (gst)->update_vis ) + { + (*PAROLE_GST_HELPER_GET_IFACE (gst)->update_vis) (gst); + } +} diff --git a/gst/parole-gst-iface.h b/gst/parole-gst-iface.h new file mode 100644 index 0000000..c236458 --- /dev/null +++ b/gst/parole-gst-iface.h @@ -0,0 +1,70 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 __PAROLE_GST_HELPER_H +#define __PAROLE_GST_HELPER_H + +#include + +G_BEGIN_DECLS + +#define PAROLE_TYPE_GST_HELPER (parole_gst_helper_get_type ()) +#define PAROLE_GST_HELPER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_GST_HELPER, ParoleGstHelper)) +#define PAROLE_IS_GST_HELPER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_GST_HELPER)) +#define PAROLE_GST_HELPER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE((o), PAROLE_TYPE_GST_HELPER, ParoleGstHelperIface)) + +typedef struct _ParoleGstHelperIface ParoleGstHelperIface; +typedef struct _ParoleGstHelper ParoleGstHelper; + +struct _ParoleGstHelperIface +{ + GTypeInterface __parent__; + + void (*draw_logo) (ParoleGstHelper *gst); + + void (*set_video_color_balance) (ParoleGstHelper *gst); + + void (*load_subtitle) (ParoleGstHelper *gst); + + void (*set_subtitle_font) (ParoleGstHelper *gst); + + void (*set_subtitle_encoding) (ParoleGstHelper *gst); + + void (*update_vis) (ParoleGstHelper *gst); + +}; + +GType parole_gst_helper_get_type (void) G_GNUC_CONST; + +void parole_gst_helper_draw_logo (ParoleGstHelper *gst); + +void parole_gst_helper_load_subtitle (ParoleGstHelper *gst); + +void parole_gst_helper_set_video_colors (ParoleGstHelper *gst); + +void parole_gst_helper_set_subtitle_font (ParoleGstHelper *gst); + +void parole_gst_helper_set_subtitle_encoding (ParoleGstHelper *gst); + +void parole_gst_helper_update_vis (ParoleGstHelper *gst); + +G_END_DECLS + +#endif /*__PAROLE_GST_IFACE_H*/ diff --git a/gst/parole-gst.c b/gst/parole-gst.c new file mode 100644 index 0000000..fd0d5ba --- /dev/null +++ b/gst/parole-gst.c @@ -0,0 +1,2236 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include +#include + +#include + +#ifdef XFCE_DISABLE_DEPRECATED +#undef XFCE_DISABLE_DEPRECATED +#endif +#include +#include + +#include + +#include "parole-gst.h" +#include "parole-gst-iface.h" + +#include "common/parole-common.h" +#include "common/parole-rc-utils.h" + +#include "gst-enum-types.h" +#include "gstmarshal.h" + + + +#define HIDE_WINDOW_CURSOR_TIMEOUT 3.0f + +#define PAROLE_GST_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_GST, ParoleGstPrivate)) + +static void parole_gst_helper_iface_init (ParoleGstHelperIface *iface); + +static void parole_gst_play_file_internal (ParoleGst *gst); + +static void parole_gst_change_state (ParoleGst *gst, + GstState new); + +static void parole_gst_terminate_internal (ParoleGst *gst, + gboolean fade_sound); + +static void parole_gst_seek_cdda_track (ParoleGst *gst, + gint track); + +struct ParoleGstPrivate +{ + GstElement *playbin; + GstElement *video_sink; + GstElement *vis_sink; + GstBus *bus; + + GMutex *lock; + GstState state; + GstState target; + ParoleMediaState media_state; + + ParoleStream *stream; + gulong tick_id; + GdkPixbuf *logo; + gchar *device; + GTimer *hidecursor_timer; + + gpointer conf; /* Specific for ParoleMediaPlayer*/ + + gboolean terminating; + gboolean embedded; + gboolean enable_tags; + + gboolean update_vis; + gboolean with_vis; + gboolean buffering; + gboolean update_color_balance; + + ParoleAspectRatio aspect_ratio; + gulong state_change_id; + + /* + * xvimage sink has brightness+hue+aturation+contrast. + */ + gboolean xvimage_sink; + + gulong sig1; + gulong sig2; +}; + +enum +{ + MEDIA_STATE, + MEDIA_PROGRESSED, + MEDIA_TAG, + BUFFERING, + ERROR, + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_EMBEDDED, + PROP_CONF_OBJ, + PROP_ENABLE_TAGS +}; + +static gpointer parole_gst_object = NULL; + +static guint signals [LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE_WITH_CODE (ParoleGst, parole_gst, GTK_TYPE_WIDGET, + G_IMPLEMENT_INTERFACE (PAROLE_TYPE_GST_HELPER, parole_gst_helper_iface_init)); + +static void +parole_gst_finalize (GObject *object) +{ + ParoleGst *gst; + + gst = PAROLE_GST (object); + + TRACE ("start"); + + if ( gst->priv->tick_id != 0) + g_source_remove (gst->priv->tick_id); + + parole_stream_init_properties (gst->priv->stream); + + g_object_unref (gst->priv->stream); + g_object_unref (gst->priv->logo); + + if ( gst->priv->device ) + g_free (gst->priv->device); + + g_mutex_free (gst->priv->lock); + + G_OBJECT_CLASS (parole_gst_parent_class)->finalize (object); +} + +static void +parole_gst_set_window_cursor (GdkWindow *window, GdkCursor *cursor) +{ + TRACE ("start"); + if ( window ) + gdk_window_set_cursor (window, cursor); +} + +static gboolean +parole_gst_configure_event_cb (GtkWidget *widget, GdkEventConfigure *ev, ParoleGst *gst) +{ + return FALSE; +} + +static gboolean +parole_gst_parent_expose_event (GtkWidget *w, GdkEventExpose *ev, ParoleGst *gst) +{ + cairo_t *cr; + + cr = gdk_cairo_create (w->window); + + cairo_set_source_rgb (cr, 0.0f, 0.0f, 0.0f); + + cairo_rectangle (cr, w->allocation.x, w->allocation.y, w->allocation.width, w->allocation.height); + + cairo_fill (cr); + cairo_destroy (cr); + + return FALSE; +} + +static void +parole_gst_realize (GtkWidget *widget) +{ + ParoleGst *gst; + GdkWindowAttr attr; + GdkColor color; + gint mask; + + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + gst = PAROLE_GST (widget); + + attr.x = widget->allocation.x; + attr.y = widget->allocation.y; + attr.width = widget->allocation.width; + attr.height = widget->allocation.height; + attr.visual = gtk_widget_get_visual (widget); + attr.colormap = gtk_widget_get_colormap (widget); + attr.wclass = GDK_INPUT_OUTPUT; + attr.window_type = GDK_WINDOW_CHILD; + attr.event_mask = gtk_widget_get_events (widget) | + GDK_EXPOSURE_MASK | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | + GDK_KEY_PRESS_MASK; + + mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + + widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attr, mask); + + gdk_window_set_user_data (widget->window, widget); + gdk_color_parse ("black", &color); + gdk_colormap_alloc_color (gtk_widget_get_colormap (widget), &color, + TRUE, TRUE); + + gdk_window_set_background (widget->window, &color); + widget->style = gtk_style_attach (widget->style, widget->window); + + g_signal_connect (gtk_widget_get_toplevel (widget), "configure_event", + G_CALLBACK (parole_gst_configure_event_cb), gst); + + g_signal_connect (gtk_widget_get_parent (widget), "expose_event", + G_CALLBACK (parole_gst_parent_expose_event), gst); + +} + +static void +parole_gst_show (GtkWidget *widget) +{ + ParoleGst *gst; + + gst = PAROLE_GST (widget); + + if ( widget->window ) + gdk_window_show (widget->window); + + if ( GTK_WIDGET_CLASS (parole_gst_parent_class)->show ) + GTK_WIDGET_CLASS (parole_gst_parent_class)->show (widget); +} + +static void +parole_gst_get_video_output_size (ParoleGst *gst, gint *ret_w, gint *ret_h) +{ + /* + * Default values returned if: + * 1) We are not playing. + * 2) Playing audio. + * 3) Playing video but we don't have its correct size yet. + */ + *ret_w = GTK_WIDGET (gst)->allocation.width; + *ret_h = GTK_WIDGET (gst)->allocation.height; + + if ( gst->priv->state >= GST_STATE_PAUSED ) + { + gboolean has_video; + guint video_w, video_h; + guint video_par_n, video_par_d; + guint dar_n, dar_d; + guint disp_par_n, disp_par_d; + + g_object_get (G_OBJECT (gst->priv->stream), + "has-video", &has_video, + "video-width", &video_w, + "video-height", &video_h, + "disp-par-n", &disp_par_n, + "disp-par-d", &disp_par_d, + NULL); + + if ( has_video ) + { + if ( video_w != 0 && video_h != 0 ) + { + switch ( gst->priv->aspect_ratio ) + { + case PAROLE_ASPECT_RATIO_NONE: + return; + case PAROLE_ASPECT_RATIO_AUTO: + *ret_w = video_w; + *ret_h = video_h; + return; + case PAROLE_ASPECT_RATIO_SQUARE: + video_par_n = 1; + video_par_d = 1; + break; + case PAROLE_ASPECT_RATIO_16_9: + video_par_n = 16 * video_h; + video_par_d = 9 * video_w; + break; + case PAROLE_ASPECT_RATIO_4_3: + video_par_n = 4 * video_h; + video_par_d = 3 * video_w; + break; + case PAROLE_ASPECT_RATIO_DVB: + video_par_n = 20 * video_h; + video_par_d = 9 * video_w; + break; + default: + return; + } + + if ( gst_video_calculate_display_ratio (&dar_n, &dar_d, + video_w, video_h, + video_par_n, video_par_d, + disp_par_n, disp_par_d) ) + { + if (video_w % dar_n == 0) + { + *ret_w = video_w; + *ret_h = (guint) gst_util_uint64_scale (video_w, dar_d, dar_n); + } + else + { + *ret_w = (guint) gst_util_uint64_scale (video_h, dar_n, dar_d); + *ret_h = video_w; + } + TRACE ("Got best video size %dx%d fraction, %d/%d\n", *ret_w, *ret_h, disp_par_n, disp_par_d); + } + } + } + } +} + +static void +parole_gst_size_allocate (GtkWidget *widget, GtkAllocation *allocation) +{ + g_return_if_fail (allocation != NULL); + + widget->allocation = *allocation; + + if ( GTK_WIDGET_REALIZED (widget) ) + { + gint w, h; + gdouble ratio, width, height; + + w = allocation->width; + h = allocation->height; + + if ( PAROLE_GST (widget)->priv->embedded == FALSE ) + parole_gst_get_video_output_size (PAROLE_GST (widget), &w, &h); + + width = w; + height = h; + + if ( (gdouble) allocation->width / width > allocation->height / height) + ratio = (gdouble) allocation->height / height; + else + ratio = (gdouble) allocation->width / width; + + width *= ratio; + height *= ratio; + + gdk_window_move_resize (widget->window, + allocation->x + (allocation->width - width)/2, + allocation->y + (allocation->height - height)/2, + width, + height); + + gtk_widget_queue_draw (widget); + } +} + +static void +parole_gst_draw_logo_common (ParoleGst *gst) +{ + GdkPixbuf *pix; + GdkRegion *region; + GdkRectangle rect; + GtkWidget *widget; + + widget = GTK_WIDGET (gst); + + if ( !widget->window) + return; + + rect.x = 0; + rect.y = 0; + + rect.width = widget->allocation.width; + rect.height = widget->allocation.height; + + region = gdk_region_rectangle (&rect); + + gdk_window_begin_paint_region (widget->window, + region); + + gdk_region_destroy (region); + + gdk_window_clear_area (widget->window, + 0, 0, + widget->allocation.width, + widget->allocation.height); + + pix = gdk_pixbuf_scale_simple (gst->priv->logo, + widget->allocation.width, + widget->allocation.height, + GDK_INTERP_BILINEAR); + + gdk_draw_pixbuf (GDK_DRAWABLE (widget->window), + GTK_WIDGET(widget)->style->fg_gc[0], + pix, + 0, 0, 0, 0, + widget->allocation.width, + widget->allocation.height, + GDK_RGB_DITHER_NONE, + 0, 0); + + gdk_pixbuf_unref (pix); + gdk_window_end_paint (GTK_WIDGET (gst)->window); +} + +static void +parole_gst_draw_logo_embedded (ParoleGstHelper *helper) +{ + ParoleGst *gst; + + gst = PAROLE_GST (helper); + + if ( gst->priv->terminating != TRUE ) + parole_gst_draw_logo_common (gst); +} + +static void +parole_gst_draw_logo (ParoleGstHelper *helper) +{ + ParoleGst *gst; + + gst = PAROLE_GST (helper); + + parole_gst_draw_logo_common (gst); +} + +static void +parole_gst_set_video_color_balance (ParoleGstHelper *helper) +{ + ParoleGst *gst; + GstElement *video_sink; + + gint brightness_value; + gint contrast_value; + gint hue_value; + gint saturation_value; + + gst = PAROLE_GST (helper); + + if ( !gst->priv->xvimage_sink) + return; + + g_object_get (G_OBJECT (gst->priv->playbin), + "video-sink", &video_sink, + NULL); + + if ( !video_sink ) + return; + + g_object_get (G_OBJECT (gst->priv->conf), + "brightness", &brightness_value, + "contrast", &contrast_value, + "hue", &hue_value, + "saturation", &saturation_value, + NULL); + + TRACE ("Setting video color balance"); + + g_object_set (G_OBJECT (video_sink), + "brightness", brightness_value, + "contrast", contrast_value, + "hue", hue_value, + "saturation", saturation_value, + NULL); + + g_object_unref (G_OBJECT (video_sink)); + + gst->priv->update_color_balance = FALSE; +} + +static void +parole_gst_set_x_overlay (ParoleGst *gst) +{ + GstElement *video_sink; + + g_object_get (G_OBJECT (gst->priv->playbin), + "video-sink", &video_sink, + NULL); + + g_assert (video_sink != NULL); + + if ( GDK_IS_WINDOW (GTK_WIDGET (gst)->window) ) + gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (video_sink), + GDK_WINDOW_XWINDOW (GTK_WIDGET (gst)->window)); + + gst_object_unref (video_sink); + +} + +static gboolean +parole_gst_expose_event (GtkWidget *widget, GdkEventExpose *ev) +{ + ParoleGst *gst; + + gboolean playing_video; + + if ( ev && ev->count > 0 ) + return TRUE; + + gst = PAROLE_GST (widget); + + g_object_get (G_OBJECT (gst->priv->stream), + "has-video", &playing_video, + NULL); + + parole_gst_set_x_overlay (gst); + + TRACE ("EXPOSE event state=%d target=%d", gst->priv->state, gst->priv->target); + + switch ( gst->priv->state ) + { + case GST_STATE_PLAYING: + if ( playing_video || gst->priv->with_vis) + gst_x_overlay_expose (GST_X_OVERLAY (gst->priv->video_sink)); + else + parole_gst_helper_draw_logo (PAROLE_GST_HELPER (gst)); + break; + case GST_STATE_PAUSED: + if ( playing_video || gst->priv->with_vis || gst->priv->target == GST_STATE_PLAYING ) + gst_x_overlay_expose (GST_X_OVERLAY (gst->priv->video_sink)); + else + parole_gst_helper_draw_logo (PAROLE_GST_HELPER (gst)); + break; + case GST_STATE_READY: + if (gst->priv->target != GST_STATE_PLAYING) + parole_gst_helper_draw_logo (PAROLE_GST_HELPER (gst)); + else + gst_x_overlay_expose (GST_X_OVERLAY (gst->priv->video_sink)); + break; + case GST_STATE_NULL: + case GST_STATE_VOID_PENDING: + parole_gst_helper_draw_logo (PAROLE_GST_HELPER (gst)); + break; + } + return TRUE; +} + +static void +parole_gst_load_logo (ParoleGst *gst) +{ + gchar *path; + + path = g_strdup_printf ("%s/parole.png", PIXMAPS_DIR); + gst->priv->logo = gdk_pixbuf_new_from_file (path, NULL); + g_free (path); +} + +static void +parole_gst_query_capabilities (ParoleGst *gst) +{ + GstQuery *query; + gboolean seekable; + + query = gst_query_new_seeking (GST_FORMAT_TIME); + + if ( gst_element_query (gst->priv->playbin, query) ) + { + gst_query_parse_seeking (query, + NULL, + &seekable, + NULL, + NULL); + g_object_set (G_OBJECT (gst->priv->stream), + "seekable", seekable, + NULL); + } + gst_query_unref (query); +} + +static gboolean +parole_gst_tick_timeout (gpointer data) +{ + ParoleGst *gst; + + gint64 pos; + GstFormat format = GST_FORMAT_TIME; + gint64 value; + gboolean video; + gboolean seekable; + gint64 duration; + + + gst = PAROLE_GST (data); + + g_object_get (G_OBJECT (gst->priv->stream), + "has-video", &video, + "seekable", &seekable, + "duration", &duration, + NULL); + + gst_element_query_position (gst->priv->playbin, &format, &pos); + + if ( G_UNLIKELY (format != GST_FORMAT_TIME ) ) + goto out; + + if ( gst->priv->state == GST_STATE_PLAYING ) + { + if (duration != 0 && seekable == FALSE) + { + parole_gst_query_capabilities (gst); + } + + value = pos / GST_SECOND; + + if ( G_LIKELY (value > 0) ) + g_signal_emit (G_OBJECT (gst), signals [MEDIA_PROGRESSED], 0, gst->priv->stream, value); + } + +out: + if ( g_timer_elapsed (gst->priv->hidecursor_timer, NULL ) > HIDE_WINDOW_CURSOR_TIMEOUT && video) + parole_gst_set_cursor_visible (gst, FALSE); + + return TRUE; +} + +static void +parole_gst_tick (ParoleGst *gst) +{ + if ( gst->priv->state >= GST_STATE_PAUSED ) + { + if ( gst->priv->tick_id != 0 ) + { + return; + } + gst->priv->tick_id = g_timeout_add (1000, (GSourceFunc) parole_gst_tick_timeout, gst); + } + else if ( gst->priv->tick_id != 0) + { + g_source_remove (gst->priv->tick_id); + gst->priv->tick_id = 0; + } +} + +static void +parole_gst_query_duration (ParoleGst *gst) +{ + gint64 absolute_duration = 0; + gint64 duration = 0; + gboolean live; + GstFormat gst_time; + + gst_time = GST_FORMAT_TIME; + + gst_element_query_duration (gst->priv->playbin, + &gst_time, + &absolute_duration); + + if (gst_time == GST_FORMAT_TIME) + { + duration = absolute_duration / GST_SECOND; + live = ( absolute_duration == 0 ); + + TRACE ("Duration %" G_GINT64_FORMAT "is_live=%d", duration, live); + + g_object_set (G_OBJECT (gst->priv->stream), + "absolute-duration", absolute_duration, + "duration", duration, + "live", live, + NULL); + } +} + +static void +parole_gst_set_subtitle_font (ParoleGstHelper *helper) +{ + ParoleGst *gst; + gchar *font; + + gst = PAROLE_GST (helper); + + g_object_get (G_OBJECT (gst->priv->conf), + "subtitle-font", &font, + NULL); + + TRACE ("Setting subtitle font %s\n", font); + + g_object_set (G_OBJECT (gst->priv->playbin), + "subtitle-font-desc", font, + NULL); + g_free (font); +} + +static void +parole_gst_set_subtitle_encoding (ParoleGstHelper *helper) +{ + ParoleGst *gst; + gchar *encoding; + + gst = PAROLE_GST (helper); + + g_object_get (G_OBJECT (gst->priv->conf), + "subtitle-encoding", &encoding, + NULL); + + g_object_set (G_OBJECT (gst->priv->playbin), + "subtitle-encoding", encoding, + NULL); + + g_free (encoding); +} + +static void +parole_gst_load_subtitle (ParoleGstHelper *helper) +{ + ParoleGst *gst; + ParoleMediaType type; + gchar *uri; + gchar *sub; + gchar *sub_uri; + gboolean sub_enabled; + + gst = PAROLE_GST (helper); + + g_object_get (G_OBJECT (gst->priv->stream), + "media-type", &type, + NULL); + + if ( type != PAROLE_MEDIA_TYPE_LOCAL_FILE) + return; + + g_object_get (G_OBJECT (gst->priv->conf), + "enable-subtitle", &sub_enabled, + NULL); + + if ( !sub_enabled ) + return; + + g_object_get (G_OBJECT (gst->priv->stream), + "uri", &uri, + "subtitles", &sub, + NULL); + + if ( sub ) + { + TRACE ("Found subtitle with path %s", sub); + sub_uri = g_filename_to_uri (sub, NULL, NULL); + g_object_set (G_OBJECT (gst->priv->playbin), + "suburi", sub_uri, + NULL); + g_free (sub); + g_free (sub_uri); + } + g_free (uri); +} + +static void +parole_gst_get_pad_capabilities (GObject *object, GParamSpec *pspec, ParoleGst *gst) +{ + GstPad *pad; + GstStructure *st; + gint width; + gint height; + guint num; + guint den; + const GValue *value; + + pad = GST_PAD (object); + + if ( !GST_IS_PAD (pad) || !GST_PAD_CAPS (pad) ) + return; + + st = gst_caps_get_structure (GST_PAD_CAPS (pad), 0); + + if ( st ) + { + gst_structure_get_int (st, "width", &width); + gst_structure_get_int (st, "height", &height); + TRACE ("Caps width=%d height=%d\n", width, height); + + g_object_set (G_OBJECT (gst->priv->stream), + "video-width", width, + "video-height", height, + NULL); + + if ( ( value = gst_structure_get_value (st, "pixel-aspect-ratio")) ) + { + num = (guint) gst_value_get_fraction_numerator (value), + den = (guint) gst_value_get_fraction_denominator (value); + g_object_set (G_OBJECT (gst->priv->stream), + "disp-par-n", num, + "disp-par-d", den, + NULL); + } + + parole_gst_size_allocate (GTK_WIDGET (gst), >K_WIDGET (gst)->allocation); + } +} + +static void +parole_gst_query_info (ParoleGst *gst) +{ + const GList *info = NULL; + GObject *obj; + GParamSpec *pspec; + GEnumValue *val; + gint type; + gboolean has_video = FALSE; + + g_object_get (G_OBJECT (gst->priv->playbin), + "stream-info", &info, + NULL); + + for ( ; info != NULL; info = info->next ) + { + obj = info->data; + + g_object_get (obj, + "type", &type, + NULL); + + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (obj), "type"); + val = g_enum_get_value (G_PARAM_SPEC_ENUM (pspec)->enum_class, type); + + if ( g_ascii_strcasecmp (val->value_name, "video") == 0 || + g_ascii_strcasecmp (val->value_nick, "video") == 0) + { + GstPad *pad = NULL; + + g_object_get (G_OBJECT (obj), + "object", &pad, + NULL); + + if ( pad ) + { + if ( GST_IS_PAD (pad) && GST_PAD_CAPS (pad) ) + { + parole_gst_get_pad_capabilities (G_OBJECT (pad), NULL, gst); + } + else + { + g_signal_connect (pad, "notify::caps", + G_CALLBACK (parole_gst_get_pad_capabilities), + gst); + } + g_object_unref (pad); + } + TRACE ("Stream has video"); + g_object_set (G_OBJECT (gst->priv->stream), + "has-video", TRUE, + NULL); + has_video = TRUE; + } + if ( g_ascii_strcasecmp (val->value_name, "audio") == 0 || + g_ascii_strcasecmp (val->value_nick, "audio") == 0) + { + TRACE ("Stream has audio"); + g_object_set (G_OBJECT (gst->priv->stream), + "has-audio", TRUE, + NULL); + } + } + + if ( !has_video ) + gtk_widget_queue_draw (GTK_WIDGET (gst)); +} + +static void +parole_gst_update_stream_info (ParoleGst *gst) +{ + TRACE ("Updating stream info"); + parole_gst_query_info (gst); +} + +static void +parole_gst_update_vis (ParoleGstHelper *helper) +{ + ParoleGst *gst; + gchar *vis_name; + + gst = PAROLE_GST (helper); + + TRACE ("start"); + + g_object_get (G_OBJECT (gst->priv->conf), + "vis-enabled", &gst->priv->with_vis, + "vis-name", &vis_name, + NULL); + + TRACE ("Vis name %s enabled %d\n", vis_name, gst->priv->with_vis); + + if ( gst->priv->with_vis ) + { + gst->priv->vis_sink = gst_element_factory_make (vis_name, "vis"); + g_object_set (G_OBJECT (gst->priv->playbin), + "vis-plugin", gst->priv->vis_sink, + NULL); + } + else + { + g_object_set (G_OBJECT (gst->priv->playbin), + "vis-plugin", NULL, + NULL); + gtk_widget_queue_draw (GTK_WIDGET (gst)); + } + + gst->priv->update_vis = FALSE; + g_free (vis_name); + TRACE ("end"); +} + +static void +parole_gst_evaluate_state (ParoleGst *gst, GstState old, GstState new, GstState pending) +{ + TRACE ("State change new %i old %i pending %i", new, old, pending); + + gst->priv->state = new; + + parole_gst_tick (gst); + + if ( gst->priv->target == new ) + { + gtk_widget_queue_draw (GTK_WIDGET (gst)); + parole_gst_set_window_cursor (GTK_WIDGET (gst)->window, NULL); + if ( gst->priv->state_change_id != 0 ) + g_source_remove (gst->priv->state_change_id); + } + + switch (gst->priv->state) + { + case GST_STATE_PLAYING: + { + gst->priv->media_state = PAROLE_MEDIA_STATE_PLAYING; + g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, + gst->priv->stream, PAROLE_MEDIA_STATE_PLAYING); + break; + } + case GST_STATE_PAUSED: + { + if ( pending == GST_STATE_PLAYING ) + { + ParoleMediaType media_type; + + g_object_get (G_OBJECT (gst->priv->stream), + "media-type", &media_type, + NULL); + + if ( (media_type == PAROLE_MEDIA_TYPE_LOCAL_FILE && old == GST_STATE_READY) || + media_type != PAROLE_MEDIA_TYPE_LOCAL_FILE ) + { + parole_gst_query_duration (gst); + parole_gst_query_capabilities (gst); + parole_gst_query_info (gst); + } + } + + if ( gst->priv->target == GST_STATE_PLAYING ) + { + if ( gst->priv->update_color_balance ) + parole_gst_helper_set_video_colors (PAROLE_GST_HELPER (gst)); + } + + gst->priv->media_state = PAROLE_MEDIA_STATE_PAUSED; + g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, + gst->priv->stream, PAROLE_MEDIA_STATE_PAUSED); + break; + } + case GST_STATE_READY: + { + gst->priv->buffering = FALSE; + gst->priv->media_state = PAROLE_MEDIA_STATE_STOPPED; + g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, + gst->priv->stream, PAROLE_MEDIA_STATE_STOPPED); + + if ( gst->priv->target == GST_STATE_PLAYING && pending < GST_STATE_PAUSED) + { + parole_gst_play_file_internal (gst); + } + else if ( gst->priv->target == GST_STATE_PAUSED) + { + parole_gst_change_state (gst, GST_STATE_PAUSED); + } + else if ( gst->priv->target == GST_STATE_READY) + { + parole_gst_size_allocate (GTK_WIDGET (gst), >K_WIDGET (gst)->allocation); + parole_gst_helper_draw_logo (PAROLE_GST_HELPER (gst)); + } + break; + } + case GST_STATE_NULL: + { + gst->priv->buffering = FALSE; + gst->priv->media_state = PAROLE_MEDIA_STATE_STOPPED; + g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, + gst->priv->stream, PAROLE_MEDIA_STATE_STOPPED); + break; + } + default: + break; + } +} + +static void +parole_gst_element_message_sync (GstBus *bus, GstMessage *message, ParoleGst *gst) +{ + if ( !message->structure ) + goto out; + + if ( gst_structure_has_name (message->structure, "prepare-xwindow-id") ) + parole_gst_set_x_overlay (gst); +out: + ; +} + +static void +parole_gst_get_meta_data_cdda (ParoleGst *gst, GstTagList *tag) +{ + guint num_tracks; + guint track; + + if (gst_tag_list_get_uint (tag, GST_TAG_TRACK_NUMBER, &track) && + gst_tag_list_get_uint (tag, GST_TAG_TRACK_COUNT, &num_tracks)) + { + g_object_set (G_OBJECT (gst->priv->stream), + "num-tracks", num_tracks, + "track", track, + NULL); + TRACE ("num_tracks=%i track=%i", num_tracks, track); + g_signal_emit (G_OBJECT (gst), signals [MEDIA_TAG], 0, gst->priv->stream); + } +} + +static void +parole_gst_get_meta_data_local_file (ParoleGst *gst, GstTagList *tag) +{ + gchar *str; + GDate *date; + + if ( gst_tag_list_get_string_index (tag, GST_TAG_TITLE, 0, &str) ) + { + TRACE ("title:%s", str); + g_object_set (G_OBJECT (gst->priv->stream), + "title", str, + NULL); + g_free (str); + } + + if ( gst_tag_list_get_string_index (tag, GST_TAG_ARTIST, 0, &str) ) + { + TRACE ("artist:%s", str); + g_object_set (G_OBJECT (gst->priv->stream), + "artist", str, + NULL); + g_free (str); + } + + if ( gst_tag_list_get_date (tag, GST_TAG_DATE, &date) ) + { + + str = g_strdup_printf ("%d", g_date_get_year (date)); + TRACE ("year:%s", str); + + g_object_set (G_OBJECT (gst->priv->stream), + "year", str, + NULL); + g_date_free (date); + g_free (str); + } + + if ( gst_tag_list_get_string_index (tag, GST_TAG_ALBUM, 0, &str) ) + { + TRACE ("album:%s", str); + g_object_set (G_OBJECT (gst->priv->stream), + "album", str, + NULL); + g_free (str); + } + + if ( gst_tag_list_get_string_index (tag, GST_TAG_COMMENT, 0, &str) ) + { + TRACE ("comment:%s", str); + g_object_set (G_OBJECT (gst->priv->stream), + "comment", str, + NULL); + g_free (str); + } + + g_object_set (G_OBJECT (gst->priv->stream), + "tag-available", TRUE, + NULL); + + g_signal_emit (G_OBJECT (gst), signals [MEDIA_TAG], 0, gst->priv->stream); + +} + +static void +parole_gst_get_meta_data (ParoleGst *gst, GstTagList *tag) +{ + ParoleMediaType media_type; + + g_object_get (G_OBJECT (gst->priv->stream), + "media-type", &media_type, + NULL); + + switch ( media_type ) + { + case PAROLE_MEDIA_TYPE_LOCAL_FILE: + parole_gst_get_meta_data_local_file (gst, tag); + break; + case PAROLE_MEDIA_TYPE_CDDA: + parole_gst_get_meta_data_cdda (gst, tag); + break; + default: + break; + } +} + +static void +parole_gst_application_message (ParoleGst *gst, GstMessage *msg) +{ + const gchar *name; + + name = gst_structure_get_name (msg->structure); + + if ( !name ) + return; + + TRACE ("Application message : %s", name); + + if ( !g_strcmp0 (name, "notify-streaminfo") ) + { + parole_gst_update_stream_info (gst); + } + else if ( !g_strcmp0 (name, "video-size") ) + { + parole_gst_size_allocate (GTK_WIDGET (gst), >K_WIDGET (gst)->allocation); + } +} + +static gboolean +parole_gst_bus_event (GstBus *bus, GstMessage *msg, gpointer data) +{ + ParoleGst *gst; + + gst = PAROLE_GST (data); + + switch (GST_MESSAGE_TYPE (msg)) + { + case GST_MESSAGE_EOS: + { + ParoleMediaType media_type; + gint current_track; + + TRACE ("End of stream"); + + g_object_get (G_OBJECT (gst->priv->stream), + "media-type", &media_type, + NULL); + if ( media_type == PAROLE_MEDIA_TYPE_CDDA ) + { + gint num_tracks; + g_object_get (G_OBJECT (gst->priv->stream), + "num-tracks", &num_tracks, + "track", ¤t_track, + NULL); + + TRACE ("Current track %d Number of tracks %d", current_track, num_tracks); + if ( num_tracks != current_track ) + { + parole_gst_seek_cdda_track (gst, current_track); + break; + } + } + + gst->priv->media_state = PAROLE_MEDIA_STATE_FINISHED; + g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, + gst->priv->stream, PAROLE_MEDIA_STATE_FINISHED); + break; + } + case GST_MESSAGE_ERROR: + { + GError *error = NULL; + gchar *debug; + parole_gst_set_window_cursor (GTK_WIDGET (gst)->window, NULL); + gst->priv->target = GST_STATE_NULL; + gst->priv->buffering = FALSE; + parole_gst_change_state (gst, GST_STATE_NULL); + gst_message_parse_error (msg, &error, &debug); + TRACE ("*** ERROR %s : %s ***", error->message, debug); + g_signal_emit (G_OBJECT (gst), signals [ERROR], 0, error->message); + g_error_free (error); + g_free (debug); + gtk_widget_queue_draw (GTK_WIDGET (gst)); + break; + } + case GST_MESSAGE_BUFFERING: + { + gint per = 0; + gst_message_parse_buffering (msg, &per); + TRACE ("Buffering %d %%", per); + g_signal_emit (G_OBJECT (gst), signals [BUFFERING], 0, + gst->priv->stream, per); + + gst->priv->buffering = per != 100; + break; + } + case GST_MESSAGE_STATE_CHANGED: + { + GstState old, new, pending; + gst_message_parse_state_changed (msg, &old, &new, &pending); + + if ( GST_MESSAGE_SRC (msg) == GST_OBJECT (gst->priv->playbin) ) + parole_gst_evaluate_state (gst, old, new, pending); + break; + } + + case GST_MESSAGE_TAG: + { + if ( gst->priv->enable_tags ) + { + GstTagList *tag_list; + TRACE ("Tag message:"); + gst_message_parse_tag (msg, &tag_list); + parole_gst_get_meta_data (gst, tag_list); + gst_tag_list_free (tag_list); + } + break; + } + case GST_MESSAGE_APPLICATION: + parole_gst_application_message (gst, msg); + break; + case GST_MESSAGE_DURATION: + TRACE ("Duration message"); + parole_gst_query_duration (gst); + break; + case GST_MESSAGE_ELEMENT: + break; + case GST_MESSAGE_WARNING: + break; + case GST_MESSAGE_INFO: + TRACE ("Info message:"); + break; + case GST_MESSAGE_STATE_DIRTY: + TRACE ("Stream is dirty"); + break; + case GST_MESSAGE_STEP_DONE: + break; + case GST_MESSAGE_CLOCK_PROVIDE: + break; + case GST_MESSAGE_CLOCK_LOST: + break; + case GST_MESSAGE_NEW_CLOCK: + break; + case GST_MESSAGE_STRUCTURE_CHANGE: + break; + case GST_MESSAGE_STREAM_STATUS: + TRACE ("Stream status"); + break; + case GST_MESSAGE_SEGMENT_START: + break; + case GST_MESSAGE_LATENCY: + break; + case GST_MESSAGE_ASYNC_START: + break; + case GST_MESSAGE_ASYNC_DONE: + break; + default: + break; + } + return TRUE; +} + +static void +parole_gst_change_state (ParoleGst *gst, GstState new) +{ + GstStateChangeReturn ret; + + TRACE ("Changing state to %d", new); + + ret = gst_element_set_state (GST_ELEMENT (gst->priv->playbin), new); + + switch (ret) + { + case GST_STATE_CHANGE_SUCCESS: + parole_gst_evaluate_state (gst, + GST_STATE_RETURN (gst->priv->playbin), + GST_STATE (gst->priv->playbin), + GST_STATE_PENDING (gst->priv->playbin)); + break; + case GST_STATE_CHANGE_ASYNC: + TRACE ("State will change async"); + break; + + case GST_STATE_CHANGE_FAILURE: + TRACE ("Error will be handled async"); + break; + case GST_STATE_CHANGE_NO_PREROLL: + TRACE ("State change no_preroll"); + break; + default: + break; + } +} + +static void +parole_gst_stream_info_notify_cb (GObject * obj, GParamSpec * pspec, ParoleGst *gst) +{ + GstMessage *msg; + TRACE ("Stream info changed"); + msg = gst_message_new_application (GST_OBJECT (gst->priv->playbin), + gst_structure_new ("notify-streaminfo", NULL)); + gst_element_post_message (gst->priv->playbin, msg); +} + +static void +parole_gst_source_notify_cb (GObject *obj, GParamSpec *pspec, ParoleGst *gst) +{ + GObject *source; + + g_object_get (obj, + "source", &source, + NULL); + + if ( source ) + { + if ( G_LIKELY (gst->priv->device) ) + { + g_object_set (source, + "device", gst->priv->device, + NULL); + } + g_object_unref (source); + } +} + +static void +parole_gst_play_file_internal (ParoleGst *gst) +{ + gchar *uri; + + TRACE ("Start"); + + if ( G_UNLIKELY (GST_STATE (gst->priv->playbin) == GST_STATE_PLAYING ) ) + { + TRACE ("*** Error *** This is a bug, playbin element is already playing"); + } + + if ( gst->priv->update_vis) + parole_gst_helper_update_vis (PAROLE_GST_HELPER (gst)); + + gtk_widget_queue_draw (GTK_WIDGET (gst)); + + g_object_get (G_OBJECT (gst->priv->stream), + "uri", &uri, + NULL); + + TRACE ("Processing uri : %s", uri); + + g_object_set (G_OBJECT (gst->priv->playbin), + "uri", uri, + "suburi", NULL, + NULL); + + parole_gst_helper_load_subtitle (PAROLE_GST_HELPER (gst)); + parole_gst_change_state (gst, GST_STATE_PLAYING); + g_free (uri); +} + +static gboolean +parole_gst_motion_notify_event (GtkWidget *widget, GdkEventMotion *ev) +{ + ParoleGst *gst; + gboolean ret = FALSE; + + gst = PAROLE_GST (widget); + + g_timer_reset (gst->priv->hidecursor_timer); + parole_gst_set_cursor_visible (gst, TRUE); + + if (GTK_WIDGET_CLASS (parole_gst_parent_class)->motion_notify_event) + ret |= GTK_WIDGET_CLASS (parole_gst_parent_class)->motion_notify_event (widget, ev); + + return ret; +} + +static gboolean +parole_gst_button_press_event (GtkWidget *widget, GdkEventButton *ev) +{ + ParoleGst *gst; + GstNavigation *nav; + gboolean playing_video; + gboolean ret = FALSE; + + gst = PAROLE_GST (widget); + + g_object_get (G_OBJECT (gst->priv->stream), + "has-video", &playing_video, + NULL); + + if ( gst->priv->state == GST_STATE_PLAYING && playing_video) + { + nav = GST_NAVIGATION (gst->priv->video_sink); + gst_navigation_send_mouse_event (nav, "mouse-button-press", ev->button, ev->x, ev->y); + //ret = TRUE; + } + + if (GTK_WIDGET_CLASS (parole_gst_parent_class)->button_press_event) + ret |= GTK_WIDGET_CLASS (parole_gst_parent_class)->button_press_event (widget, ev); + + return ret; +} + +static gboolean +parole_gst_button_release_event (GtkWidget *widget, GdkEventButton *ev) +{ + ParoleGst *gst; + GstNavigation *nav; + gboolean playing_video; + gboolean ret = FALSE; + + gst = PAROLE_GST (widget); + + g_object_get (G_OBJECT (gst->priv->stream), + "has-video", &playing_video, + NULL); + + if ( gst->priv->state == GST_STATE_PLAYING && playing_video) + { + nav = GST_NAVIGATION (gst->priv->video_sink); + gst_navigation_send_mouse_event (nav, "mouse-button-release", ev->button, ev->x, ev->y); + } + + if (GTK_WIDGET_CLASS (parole_gst_parent_class)->button_release_event) + ret |= GTK_WIDGET_CLASS (parole_gst_parent_class)->button_release_event (widget, ev); + + return ret; +} + +static void parole_gst_seek_cdda_track (ParoleGst *gst, + gint track) +{ + TRACE ("Track %d", track); + + if ( !gst_element_seek (gst->priv->playbin, 1.0, gst_format_get_by_nick ("track"), + GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, + track, + GST_SEEK_TYPE_NONE, + 0) ) + g_warning ("Seek to track %d failed ", track); +} + +static void +parole_gst_seek_by_format (ParoleGst *gst, GstFormat format, gint step) +{ + gint64 val = 1; + + if ( gst_element_query_position (gst->priv->playbin, &format, &val) ) + { + val += step; + if ( !gst_element_seek (gst->priv->playbin, 1.0, format, + GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, + val, + GST_SEEK_TYPE_NONE, + 0) ) + { + g_warning ("Seek failed : %s", gst_format_get_name (format)); + } + } + else + { + g_warning ("Failed to query element position: %s", gst_format_get_name (format)); + } +} + +static void +parole_gst_change_dvd_chapter (ParoleGst *gst, gint level) +{ + GstFormat format; + + // FIXME: Do we really need to get the nick each time? + format = gst_format_get_by_nick ("chapter"); + + parole_gst_seek_by_format (gst, format, level); +} + +static void +parole_gst_change_cdda_track (ParoleGst *gst, gint level) +{ + GstFormat format; + + format = gst_format_get_by_nick ("track"); + + parole_gst_seek_by_format (gst, format, level); +} + +ParoleMediaType parole_gst_get_current_stream_type (ParoleGst *gst) +{ + ParoleMediaType type; + g_object_get (G_OBJECT (gst->priv->stream), + "media-type", &type, + NULL); + return type; +} + +static gboolean +parole_gst_check_state_change_timeout (gpointer data) +{ + ParoleGst *gst; + + gst = PAROLE_GST (data); + + TRACE ("target =%d current state=%d", gst->priv->target, gst->priv->state); + + if ( gst->priv->state != gst->priv->target ) + { + gboolean ret_val = + xfce_confirm (_("The stream is taking too much time to load"), GTK_STOCK_OK, _("Stop")); + + if ( ret_val ) + { + parole_gst_terminate_internal (gst, FALSE); + gst->priv->state_change_id = 0; + return FALSE; + } + } + return TRUE; +} + +static void +parole_gst_terminate_internal (ParoleGst *gst, gboolean fade_sound) +{ + gboolean playing_video; + + g_object_get (G_OBJECT (gst->priv->stream), + "has-video", &playing_video, + NULL); + + g_mutex_lock (gst->priv->lock); + gst->priv->target = GST_STATE_NULL; + parole_stream_init_properties (gst->priv->stream); + g_mutex_unlock (gst->priv->lock); + + parole_window_busy_cursor (GTK_WIDGET (gst)->window); + + if ( gst->priv->embedded ) + goto out; + + if ( fade_sound && gst->priv->state == GST_STATE_PLAYING && !playing_video ) + { + gdouble volume; + gdouble step; + volume = parole_gst_get_volume (gst); + /* + * Like amarok, reduce the sound slowley then exit. + */ + if ( volume != 0 ) + { + while ( volume > 0 ) + { + step = volume - volume / 10; + parole_gst_set_volume (gst, step < 0.01 ? 0 : step); + volume = parole_gst_get_volume (gst); + g_usleep (40000); + } + } + } + +out: + parole_gst_change_state (gst, GST_STATE_NULL); +} + +static void +parole_gst_conf_notify_cb (GObject *object, GParamSpec *spec, ParoleGst *gst) +{ + if ( !g_strcmp0 ("vis-enabled", spec->name) || !g_strcmp0 ("vis-name", spec->name) ) + { + gst->priv->update_vis = TRUE; + } + else if ( !g_strcmp0 ("subtitle-font", spec->name) || !g_strcmp0 ("enable-subtitle", spec->name) ) + { + parole_gst_helper_set_subtitle_font (PAROLE_GST_HELPER (gst)); + } + else if (!g_strcmp0 ("subtitle-encoding", spec->name) ) + { + parole_gst_helper_set_subtitle_encoding (PAROLE_GST_HELPER (gst)); + } + else if ( !g_strcmp0 ("brightness", spec->name) || !g_strcmp0 ("hue", spec->name) || + !g_strcmp0 ("contrast", spec->name) || !g_strcmp0 ("saturation", spec->name) ) + { + gst->priv->update_color_balance = TRUE; + + if ( gst->priv->state >= GST_STATE_PAUSED ) + parole_gst_helper_set_video_colors (PAROLE_GST_HELPER (gst)); + } + else if ( !g_strcmp0 ("aspect-ratio", spec->name) ) + { + g_object_get (G_OBJECT (gst->priv->conf), + "aspect-ratio", &gst->priv->aspect_ratio, + NULL); + + parole_gst_size_allocate (GTK_WIDGET (gst), >K_WIDGET (gst)->allocation); + } +} + +static void parole_gst_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ParoleGst *gst; + gst = PAROLE_GST (object); + + switch (prop_id) + { + case PROP_EMBEDDED: + g_value_set_boolean (value, gst->priv->embedded); + break; + case PROP_CONF_OBJ: + g_value_set_pointer (value, gst->priv->conf); + break; + case PROP_ENABLE_TAGS: + g_value_set_boolean (value, gst->priv->enable_tags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static void parole_gst_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ParoleGst *gst; + gst = PAROLE_GST (object); + + switch (prop_id) + { + case PROP_EMBEDDED: + gst->priv->embedded = g_value_get_boolean (value); + break; + case PROP_ENABLE_TAGS: + gst->priv->enable_tags = g_value_get_boolean (value); + break; + case PROP_CONF_OBJ: + gst->priv->conf = g_value_get_pointer (value); + + if (gst->priv->conf) + { + g_object_get (G_OBJECT (gst->priv->conf), + "aspect-ratio", &gst->priv->aspect_ratio, + NULL); + + g_signal_connect (G_OBJECT (gst->priv->conf), "notify", + G_CALLBACK (parole_gst_conf_notify_cb), gst); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void parole_gst_helper_iface_init (ParoleGstHelperIface *iface) +{ +} + +static void +parole_gst_set_iface_methods (ParoleGst *gst) +{ + ParoleGstHelperIface *iface; + iface = PAROLE_GST_HELPER_GET_IFACE (gst); + + if ( gst->priv->embedded == FALSE) + { + iface->draw_logo = parole_gst_draw_logo; + iface->set_video_color_balance = parole_gst_set_video_color_balance; + iface->set_subtitle_encoding = parole_gst_set_subtitle_encoding; + iface->set_subtitle_font = parole_gst_set_subtitle_font; + iface->load_subtitle = parole_gst_load_subtitle; + iface->update_vis = parole_gst_update_vis; + } + else + { + iface->draw_logo = parole_gst_draw_logo_embedded; + } +} + +static void +parole_gst_constructed (GObject *object) +{ + ParoleGst *gst; + + gboolean enable_xv; + + gst = PAROLE_GST (object); + + enable_xv = parole_rc_read_entry_bool ("enable-xv", PAROLE_RC_GROUP_GENERAL, TRUE); + + gst->priv->playbin = gst_element_factory_make ("playbin", "player"); + + if ( G_UNLIKELY (gst->priv->playbin == NULL) ) + { + xfce_err (_("Unable to load playbin GStreamer plugin" + ", check your GStreamer installation")); + + g_error ("playbin load failed"); + } + + if (enable_xv) + { + gst->priv->video_sink = gst_element_factory_make ("xvimagesink", "video"); + gst->priv->xvimage_sink = TRUE; + } + + if ( G_UNLIKELY (gst->priv->video_sink == NULL) ) + { + gst->priv->xvimage_sink = FALSE; + g_debug ("%s trying to load ximagesink", enable_xv ? "xvimagesink not found " : "xv disabled "); + gst->priv->video_sink = gst_element_factory_make ("ximagesink", "video"); + + if ( G_UNLIKELY (gst->priv->video_sink == NULL) ) + { + xfce_err (_("Unable to load video GStreamer plugin" + ", check your GStreamer installation")); + g_error ("ximagesink load failed"); + } + } + + g_object_set (G_OBJECT (gst->priv->playbin), + "video-sink", gst->priv->video_sink, + NULL); + + /* + * Listen to the bus events. + */ + gst->priv->bus = gst_element_get_bus (gst->priv->playbin); + gst_bus_add_signal_watch (gst->priv->bus); + + gst->priv->sig1 = + g_signal_connect (gst->priv->bus, "message", + G_CALLBACK (parole_gst_bus_event), gst); + + /* + * Handling 'prepare-xwindow-id' message async causes XSync + * error in some occasions So we handle this message synchronously + */ + gst_bus_set_sync_handler (gst->priv->bus, gst_bus_sync_signal_handler, gst); + gst->priv->sig2 = + g_signal_connect (gst->priv->bus, "sync-message::element", + G_CALLBACK (parole_gst_element_message_sync), gst); + + /* + * Handle stream info changes, this can happen on live/radio stream. + */ + g_signal_connect (gst->priv->playbin, "notify::stream-info", + G_CALLBACK (parole_gst_stream_info_notify_cb), gst); + + + g_signal_connect (gst->priv->playbin, "notify::source", + G_CALLBACK (parole_gst_source_notify_cb), gst); + + + parole_gst_set_iface_methods (gst); + + parole_gst_helper_update_vis (PAROLE_GST_HELPER (gst)); + parole_gst_load_logo (gst); + parole_gst_helper_set_subtitle_encoding (PAROLE_GST_HELPER (gst)); + parole_gst_helper_set_subtitle_font (PAROLE_GST_HELPER (gst)); + + TRACE ("End"); +} + +static void +parole_gst_style_set (GtkWidget *widget, GtkStyle *prev_style) +{ + ParoleGst *gst; + + gst = PAROLE_GST (widget); + + if ( gst->priv->logo ) + g_object_unref (gst->priv->logo); + + parole_gst_load_logo (gst); + gtk_widget_queue_draw (widget); +} + +static void +parole_gst_class_init (ParoleGstClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = parole_gst_finalize; + object_class->constructed = parole_gst_constructed; + object_class->set_property = parole_gst_set_property; + object_class->get_property = parole_gst_get_property; + + widget_class->realize = parole_gst_realize; + widget_class->show = parole_gst_show; + widget_class->size_allocate = parole_gst_size_allocate; + widget_class->expose_event = parole_gst_expose_event; + widget_class->motion_notify_event = parole_gst_motion_notify_event; + widget_class->button_press_event = parole_gst_button_press_event; + widget_class->button_release_event = parole_gst_button_release_event; + widget_class->style_set = parole_gst_style_set; + + signals[MEDIA_STATE] = + g_signal_new ("media-state", + PAROLE_TYPE_GST, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParoleGstClass, media_state), + NULL, NULL, + _gmarshal_VOID__OBJECT_ENUM, + G_TYPE_NONE, 2, + PAROLE_TYPE_STREAM, GST_ENUM_TYPE_MEDIA_STATE); + + signals[MEDIA_PROGRESSED] = + g_signal_new ("media-progressed", + PAROLE_TYPE_GST, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParoleGstClass, media_progressed), + NULL, NULL, + _gmarshal_VOID__OBJECT_INT64, + G_TYPE_NONE, 2, + G_TYPE_OBJECT, G_TYPE_INT64); + + signals [MEDIA_TAG] = + g_signal_new ("media-tag", + PAROLE_TYPE_GST, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParoleGstClass, media_tag), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + G_TYPE_OBJECT); + + signals[BUFFERING] = + g_signal_new ("buffering", + PAROLE_TYPE_GST, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParoleGstClass, buffering), + NULL, NULL, + _gmarshal_VOID__OBJECT_INT, + G_TYPE_NONE, 2, + G_TYPE_OBJECT, G_TYPE_INT); + + signals[ERROR] = + g_signal_new ("error", + PAROLE_TYPE_GST, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParoleGstClass, error), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + g_object_class_install_property (object_class, + PROP_EMBEDDED, + g_param_spec_boolean ("embedded", + NULL, NULL, + FALSE, + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_CONF_OBJ, + g_param_spec_pointer ("conf-object", + NULL, NULL, + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_ENABLE_TAGS, + g_param_spec_boolean ("tags", + NULL, NULL, + TRUE, + G_PARAM_READWRITE)); + + g_type_class_add_private (klass, sizeof (ParoleGstPrivate)); +} + +static void +parole_gst_init (ParoleGst *gst) +{ + gst->priv = PAROLE_GST_GET_PRIVATE (gst); + + gst->priv->state = GST_STATE_VOID_PENDING; + gst->priv->target = GST_STATE_VOID_PENDING; + gst->priv->media_state = PAROLE_MEDIA_STATE_STOPPED; + gst->priv->aspect_ratio = PAROLE_ASPECT_RATIO_NONE; + gst->priv->lock = g_mutex_new (); + gst->priv->stream = parole_stream_new (); + gst->priv->tick_id = 0; + gst->priv->hidecursor_timer = g_timer_new (); + gst->priv->update_vis = FALSE; + gst->priv->vis_sink = NULL; + gst->priv->buffering = FALSE; + gst->priv->update_color_balance = TRUE; + gst->priv->state_change_id = 0; + gst->priv->device = NULL; + gst->priv->enable_tags = TRUE; + gst->priv->terminating = FALSE; + + gst->priv->conf = NULL; + + GTK_WIDGET_SET_FLAGS (GTK_WIDGET (gst), GTK_CAN_FOCUS); + + /* + * Disable double buffering on the video output to avoid + * flickering when resizing the window. + */ + GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (gst), GTK_DOUBLE_BUFFERED); +} + +GtkWidget * +parole_gst_new (gboolean embedded, gpointer conf_obj) +{ + parole_gst_object = g_object_new (PAROLE_TYPE_GST, + "embedded", embedded, + "conf-object", conf_obj, + NULL); + + g_object_add_weak_pointer (parole_gst_object, &parole_gst_object); + + return GTK_WIDGET (parole_gst_object); +} + +GtkWidget *parole_gst_get (void) +{ + if ( G_LIKELY (parole_gst_object != NULL ) ) + { + /* + * Don't increase the reference count of this object as + * we need it to be destroyed immediately when the main + * window is destroyed. + */ + //g_object_ref (parole_gst_object); + } + else + { + parole_gst_object = g_object_new (PAROLE_TYPE_GST, + NULL); + g_object_add_weak_pointer (parole_gst_object, &parole_gst_object); + } + + return GTK_WIDGET (parole_gst_object); + +} + +static gboolean +parole_gst_play_idle (gpointer data) +{ + ParoleGst *gst; + + gst = PAROLE_GST (data); + + if ( gst->priv->state < GST_STATE_PAUSED ) + parole_gst_play_file_internal (gst); + else + parole_gst_change_state (gst, GST_STATE_READY); + + return FALSE; +} + +void parole_gst_play_uri (ParoleGst *gst, const gchar *uri, const gchar *subtitles) +{ + g_mutex_lock (gst->priv->lock); + + gst->priv->target = GST_STATE_PLAYING; + parole_stream_init_properties (gst->priv->stream); + + g_object_set (G_OBJECT (gst->priv->stream), + "uri", uri, + "subtitles", subtitles, + NULL); + + g_mutex_unlock (gst->priv->lock); + + if ( gst->priv->state_change_id == 0 ) + gst->priv->state_change_id = g_timeout_add_seconds (20, + (GSourceFunc) parole_gst_check_state_change_timeout, + gst); + + parole_window_busy_cursor (GTK_WIDGET (gst)->window); + + g_idle_add ((GSourceFunc) parole_gst_play_idle, gst); +} + +void parole_gst_play_device_uri (ParoleGst *gst, const gchar *uri, const gchar *device) +{ + const gchar *local_uri = NULL; + + TRACE ("device : %s", device); + + if ( gst->priv->device ) + { + g_free (gst->priv->device); + gst->priv->device = NULL; + } + + gst->priv->device = g_strdup (device); + + /* + * Don't play cdda:/ as gstreamer gives an error + * but cdda:// works. + */ + if ( G_UNLIKELY (!g_strcmp0 (uri, "cdda:/") ) ) + local_uri = "cdda://"; + else + local_uri = uri; + parole_gst_play_uri (gst, local_uri, NULL); +} + +void parole_gst_pause (ParoleGst *gst) +{ + g_mutex_lock (gst->priv->lock); + + gst->priv->target = GST_STATE_PAUSED; + + g_mutex_unlock (gst->priv->lock); + + parole_window_busy_cursor (GTK_WIDGET (gst)->window); + parole_gst_change_state (gst, GST_STATE_PAUSED); +} + +void parole_gst_resume (ParoleGst *gst) +{ + g_mutex_lock (gst->priv->lock); + + gst->priv->target = GST_STATE_PLAYING; + + g_mutex_unlock (gst->priv->lock); + + parole_window_busy_cursor (GTK_WIDGET (gst)->window); + parole_gst_change_state (gst, GST_STATE_PLAYING); +} + +void parole_gst_stop (ParoleGst *gst) +{ + g_mutex_lock (gst->priv->lock); + + parole_stream_init_properties (gst->priv->stream); + gst->priv->target = GST_STATE_READY; + + g_mutex_unlock (gst->priv->lock); + + parole_window_busy_cursor (GTK_WIDGET (gst)->window); + + parole_gst_change_state (gst, GST_STATE_READY); +} + +void parole_gst_terminate (ParoleGst *gst) +{ + gst->priv->terminating = TRUE; + parole_gst_terminate_internal (gst, TRUE); +} + +void parole_gst_shutdown (ParoleGst *gst) +{ + if ( g_signal_handler_is_connected (gst->priv->playbin, gst->priv->sig1) ) + g_signal_handler_disconnect (gst->priv->playbin, gst->priv->sig1); + + if ( g_signal_handler_is_connected (gst->priv->playbin, gst->priv->sig2) ) + g_signal_handler_disconnect (gst->priv->playbin, gst->priv->sig2); + + g_object_unref (gst->priv->bus); + + gst_element_set_state (gst->priv->playbin, GST_STATE_VOID_PENDING); + + g_object_unref (gst->priv->playbin); +} + +void parole_gst_seek (ParoleGst *gst, gdouble pos) +{ + gint64 seek; + gint64 absolute_duration; + gint64 duration; + gboolean seekable; + + TRACE ("Seeking"); + + g_object_get (G_OBJECT (gst->priv->stream), + "absolute-duration", &absolute_duration, + "duration", &duration, + "seekable", &seekable, + NULL); + +#ifdef DEBUG + g_return_if_fail (duration != 0); + g_return_if_fail (absolute_duration != 0); + g_return_if_fail (seekable == TRUE); +#endif + + seek = (pos * absolute_duration) / duration; + + g_warn_if_fail ( gst_element_seek (gst->priv->playbin, + 1.0, + GST_FORMAT_TIME, + GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_FLUSH, + GST_SEEK_TYPE_SET, seek, + GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)); +} + +void parole_gst_set_volume (ParoleGst *gst, gdouble value) +{ + g_object_set (G_OBJECT (gst->priv->playbin), + "volume", value, + NULL); +} + +gdouble parole_gst_get_volume (ParoleGst *gst) +{ + gdouble volume; + + g_object_get (G_OBJECT (gst->priv->playbin), + "volume", &volume, + NULL); + return volume; +} + +ParoleMediaState parole_gst_get_state (ParoleGst *gst) +{ + return gst->priv->media_state; +} + +GstState parole_gst_get_gst_state (ParoleGst *gst) +{ + return gst->priv->state; +} + +GstState parole_gst_get_gst_target_state (ParoleGst *gst) +{ + return gst->priv->target; +} + +void parole_gst_next_dvd_chapter (ParoleGst *gst) +{ + parole_gst_change_dvd_chapter (gst, 1); +} + +void parole_gst_prev_dvd_chapter (ParoleGst *gst) +{ + parole_gst_change_dvd_chapter (gst, -1); +} + +void parole_gst_next_cdda_track (ParoleGst *gst) +{ + parole_gst_change_cdda_track (gst, 1); +} + +void parole_gst_prev_cdda_track (ParoleGst *gst) +{ + parole_gst_change_cdda_track (gst, -1); +} + +void parole_gst_seek_cdda (ParoleGst *gst, guint track_num) +{ + gint current_track; + + current_track = parole_gst_get_current_cdda_track (gst); + + parole_gst_change_cdda_track (gst, (gint) track_num - current_track -1); +} + +gint parole_gst_get_current_cdda_track (ParoleGst *gst) +{ + GstFormat format; + gint64 pos; + gint ret_val = 1; + + format = gst_format_get_by_nick ("track"); + + if ( gst_element_query_position (gst->priv->playbin, &format, &pos) ) + { + TRACE ("Pos %" G_GINT64_FORMAT, pos); + ret_val = (gint) pos; + } + + return ret_val; +} + +gint64 parole_gst_get_stream_duration (ParoleGst *gst) +{ + gint64 dur; + + g_object_get (G_OBJECT (gst->priv->stream), + "duration", &dur, + NULL); + return dur; +} + +gint64 parole_gst_get_stream_position (ParoleGst *gst) +{ + GstFormat format = GST_FORMAT_TIME; + gint64 pos; + + gst_element_query_position (gst->priv->playbin, &format, &pos); + + return pos / GST_SECOND; +} + +gboolean parole_gst_get_is_xvimage_sink (ParoleGst *gst) +{ + return gst->priv->xvimage_sink; +} + +void +parole_gst_set_cursor_visible (ParoleGst *gst, gboolean visible) +{ + if ( visible ) + { + gst->priv->target == gst->priv->state ? gdk_window_set_cursor (GTK_WIDGET (gst)->window, NULL): + parole_window_busy_cursor (GTK_WIDGET (gst)->window); + } + else + parole_window_invisible_cursor (GTK_WIDGET (gst)->window); +} + +const ParoleStream *parole_gst_get_stream (ParoleGst *gst) +{ + g_return_val_if_fail (PAROLE_IS_GST (gst), NULL); + + return gst->priv->stream; +} diff --git a/gst/parole-gst.h b/gst/parole-gst.h new file mode 100644 index 0000000..9a175c1 --- /dev/null +++ b/gst/parole-gst.h @@ -0,0 +1,160 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 __PAROLE_GST_H +#define __PAROLE_GST_H + +#include +#include +#include + +#include + +G_BEGIN_DECLS + +#define PAROLE_TYPE_GST (parole_gst_get_type () ) +#define PAROLE_GST(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_GST, ParoleGst)) +#define PAROLE_IS_GST(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_GST)) + +/* + * Keep this order to be compatible with the + * ParoleState enum used by the plugin interface. + */ +typedef enum /*< prefix=PAROLE_MEDIA_STATE_ >*/ +{ + PAROLE_MEDIA_STATE_STOPPED, + PAROLE_MEDIA_STATE_FINISHED, + PAROLE_MEDIA_STATE_PAUSED, + PAROLE_MEDIA_STATE_PLAYING + +} ParoleMediaState; + +typedef enum +{ + PAROLE_ASPECT_RATIO_NONE, + PAROLE_ASPECT_RATIO_AUTO, + PAROLE_ASPECT_RATIO_SQUARE, + PAROLE_ASPECT_RATIO_4_3, + PAROLE_ASPECT_RATIO_16_9, + PAROLE_ASPECT_RATIO_DVB + +} ParoleAspectRatio; + +typedef struct ParoleGstPrivate ParoleGstPrivate; + +typedef struct +{ + GtkWidget parent; + ParoleGstPrivate *priv; + +} ParoleGst; + +typedef struct +{ + GtkWidgetClass parent_class; + + void (*media_state) (ParoleGst *gst, + const ParoleStream *stream, + ParoleMediaState state); + + void (*media_progressed) (ParoleGst *gst, + const ParoleStream *stream, + gint64 value); + + void (*buffering) (ParoleGst *gst, + const ParoleStream *stream, + gint percentage); + + void (*media_tag) (ParoleGst *gst, + const ParoleStream *stream); + + void (*error) (ParoleGst *gst, + const gchar *error); + +} ParoleGstClass; + +GType parole_gst_get_type (void) G_GNUC_CONST; + +GtkWidget *parole_gst_new (gboolean embedded, + gpointer conf_obj); + +GtkWidget *parole_gst_get (void); + +void parole_gst_play_uri (ParoleGst *gst, + const gchar *uri, + const gchar *subtitles); + +void parole_gst_play_device_uri (ParoleGst *gst, + const gchar *uri, + const gchar *device); + +void parole_gst_pause (ParoleGst *gst); + +void parole_gst_resume (ParoleGst *gst); + +void parole_gst_stop (ParoleGst *gst); + +void parole_gst_terminate (ParoleGst *gst); + +void parole_gst_shutdown (ParoleGst *gst); + +void parole_gst_seek (ParoleGst *gst, + gdouble pos); + +void parole_gst_set_volume (ParoleGst *gst, + gdouble value); + +gdouble parole_gst_get_volume (ParoleGst *gst); + +ParoleMediaState parole_gst_get_state (ParoleGst *gst); + +GstState parole_gst_get_gst_state (ParoleGst *gst); + +GstState parole_gst_get_gst_target_state (ParoleGst *gst); + +void parole_gst_next_dvd_chapter (ParoleGst *gst); + +void parole_gst_prev_dvd_chapter (ParoleGst *gst); + +void parole_gst_next_cdda_track (ParoleGst *gst); + +void parole_gst_prev_cdda_track (ParoleGst *gst); + +void parole_gst_seek_cdda (ParoleGst *gst, + guint track_num); + +gint parole_gst_get_current_cdda_track (ParoleGst *gst); + +ParoleMediaType parole_gst_get_current_stream_type (ParoleGst *gst); + +gint64 parole_gst_get_stream_duration (ParoleGst *gst); + +gint64 parole_gst_get_stream_position (ParoleGst *gst); + +gboolean parole_gst_get_is_xvimage_sink (ParoleGst *gst); + +void parole_gst_set_cursor_visible (ParoleGst *gst, + gboolean visible); + +const ParoleStream *parole_gst_get_stream (ParoleGst *gst); + +G_END_DECLS + +#endif /* __PAROLE_GST_H */ diff --git a/module.xml b/module.xml new file mode 100644 index 0000000..b56631f --- /dev/null +++ b/module.xml @@ -0,0 +1,19 @@ + + + + parole + GStreamer based media player + + + + + Ali Abdallah + mailto:aliov@xfce.org + aliov + + + diff --git a/parole/Makefile.am b/parole/Makefile.am new file mode 100644 index 0000000..57bbb69 --- /dev/null +++ b/parole/Makefile.am @@ -0,0 +1,103 @@ +noinst_LTLIBRARIES = \ + libparole.la + +INCLUDES = \ + -I$(top_srcdir) \ + -DLOCALEDIR=\"$(localedir)\" \ + -DPAROLE_COMPILATION + +INST_HFILES = \ + parole.h \ + parole-file.h \ + parole-stream.h \ + parole-provider-player.h \ + parole-provider-plugin.h \ + parole-filters.h \ + parole-debug.h \ + parole-pl-parser.h + +libparole_la_SOURCES = \ + $(GENERATED_FILES) \ + $(INST_HFILES) \ + parole-provider-plugin.c \ + parole-provider-player.c \ + parole-file.c \ + parole-stream.c \ + parole-pl-parser.c \ + parole-pl-parser.h \ + parole-filters.c \ + parole-filters.h \ + parole-debug.c \ + parole-debug.h + +libparole_la_CFLAGS = \ + $(GIO_CFLAGS) \ + $(GTK_CFLAGS) \ + $(TAGLIBC_CFLAGS) \ + $(LIBXFCE4UTIL_CFLAGS) + +paroleincludedir = \ + $(includedir)/parole + +paroleinclude_HEADERS = \ + $(INST_HFILES) + +GENERATED_FILES = \ + parole-marshal.c \ + parole-marshal.h \ + parole-enum-types.c \ + parole-enum-types.h + +if MAINTAINER_MODE + +BUILT_SOURCES = \ + $(GENERATED_FILES) + +parole-marshal.c: parole-marshal.list + echo "#include \"parole-marshal.h\"" > $@ && \ + glib-genmarshal $< --prefix=parole_marshal --body >> $@ + +parole-marshal.h: parole-marshal.list + glib-genmarshal $< --prefix=parole_marshal --header > $@ + +parole_glib_enum_headers = \ + parole-stream.h \ + parole-provider-player.h \ + parole-pl-parser.h + +parole-enum-types.h: stamp-enum-types.h + @true +stamp-enum-types.h: $(parole_glib_enum_headers) Makefile + ( cd $(srcdir) && glib-mkenums \ + --fhead "#ifndef __PAROLE_ENUM_TYPE_H__\n#define __PAROLE_ENUM_TYPE_H__\n#include \nG_BEGIN_DECLS\n" \ + --fprod "/* enumerations from \"@filename@\" */\n" \ + --vhead "GType @enum_name@_get_type (void);\n#define PAROLE_ENUM_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __PAROLE_ENUM_TYPE_H__ */" \ + $(parole_glib_enum_headers) ) > xgen-enum.h \ + && (cmp -s xgen-enum.h parole-enum-types.h || cp xgen-enum.h parole-enum-types.h) \ + && rm -f xgen-enum.h \ + && echo timestamp > $(@F) + +parole-enum-types.c: $(parole_glib_enum_headers) Makefile + ( cd $(srcdir) && glib-mkenums \ + --fhead "#include \"parole-enum-types.h\"\n\n" \ + --fhead "#include \"parole-stream.h\"\n\n" \ + --fhead "#include \"parole-provider-player.h\"\n\n" \ + --fhead "#include \"parole-pl-parser.h\"\n\n" \ + --fprod "\n/* enumerations from \"@filename@\" */" \ + --vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \ + --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ + --vtail " { 0, NULL, NULL }\n };\n etype = g_@type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \ + $(parole_glib_enum_headers) ) >> xgen-enum.c \ + && cp xgen-enum.c parole-enum-types.c \ + && rm -f xgen-enum.c + +endif + +EXTRA_DIST = \ + parole-marshal.list \ + parole.h.in + +DISTCLEANFILES = \ + $(BUILT_SOURCES) \ + stamp-enum-types.h diff --git a/parole/parole-debug.c b/parole/parole-debug.c new file mode 100644 index 0000000..037f34b --- /dev/null +++ b/parole/parole-debug.c @@ -0,0 +1,81 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include "parole-debug.h" + +#if defined(DEBUG) && defined(G_HAVE_ISO_VARARGS) + +void parole_debug_enum (const gchar *func, const gchar *file, gint line, + const gchar *text, gint v_enum, GType type) +{ + gchar *content = NULL; + GValue __value__ = { 0, }; + + g_value_init (&__value__, type); + g_value_set_enum (&__value__, v_enum); + + content = g_strdup_value_contents (&__value__); + + fprintf(stdout, "TRACE[%s:%d] %s(): %s : %s", file, line , func, text, content); + fprintf(stdout, "\n"); + + g_value_unset (&__value__); + g_free (content); +} + +void parole_debug_enum_full (const gchar *func, const gchar *file, gint line, + gint v_enum, GType type, const gchar *format, ...) +{ + va_list args; + gchar *buffer; + + gchar *content = NULL; + GValue __value__ = { 0, }; + + g_value_init (&__value__, type); + g_value_set_enum (&__value__, v_enum); + + content = g_strdup_value_contents (&__value__); + + va_start (args, format); + g_vasprintf (&buffer, format, args); + va_end (args); + + fprintf(stdout, "TRACE[%s:%d] %s(): ", file, line, func); + fprintf(stdout, "%s: %s", buffer, content); + fprintf(stdout, "\n"); + + g_value_unset (&__value__); + g_free (content); + g_free (buffer); +} + +#endif /*#if defined(DEBUG) && defined(G_HAVE_ISO_VARARGS)*/ diff --git a/parole/parole-debug.h b/parole/parole-debug.h new file mode 100644 index 0000000..6ed291f --- /dev/null +++ b/parole/parole-debug.h @@ -0,0 +1,66 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 __PAROLE_DEBUG_H +#define __PAROLE_DEBUG_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +G_BEGIN_DECLS + +#if defined(DEBUG) && defined(G_HAVE_ISO_VARARGS) + +#define PAROLE_DEBUG_ENUM(_text, _value, _type)\ + parole_debug_enum (__func__, __FILE__, __LINE__, _text, _value, _type) + +#define PAROLE_DEBUG_ENUM_FULL(_value, _type, ...)\ + parole_debug_enum_full (__func__, __FILE__, __LINE__, _value, _type, __VA_ARGS__) + +void parole_debug_enum (const gchar *func, + const gchar *file, + gint line, + const gchar *text, + gint v_enum, + GType type); + +void parole_debug_enum_full (const gchar *func, + const gchar *file, + gint line, + gint v_enum, + GType type, + const gchar *format, + ...) G_GNUC_PRINTF (6, 7); + + +#else + +#define PAROLE_DEBUG_ENUM(_text, _value, _type) +#define PAROLE_DEBUG_ENUM_FULL(_value, _type, ...) + +#endif + +G_END_DECLS + +#endif /* __PAROLE_DEBUG_H */ diff --git a/parole/parole-file.c b/parole/parole-file.c new file mode 100644 index 0000000..d46487d --- /dev/null +++ b/parole/parole-file.c @@ -0,0 +1,411 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include + +#ifdef HAVE_TAGLIBC +#include +#endif + +#include "parole-file.h" + +#define PAROLE_FILE_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_FILE, ParoleFilePrivate)) + +typedef struct _ParoleFilePrivate ParoleFilePrivate; + +struct _ParoleFilePrivate +{ + gchar *filename; + gchar *display_name; + gchar *uri; + gchar *content_type; + +}; + +enum +{ + PROP_0, + PROP_PATH, + PROP_DISPLAY_NAME, + PROP_URI, + PROP_CONTENT_TYPE +}; + +G_DEFINE_TYPE (ParoleFile, parole_file, G_TYPE_OBJECT) + +static void +parole_file_finalize (GObject *object) +{ + ParoleFile *file; + ParoleFilePrivate *priv; + + file = PAROLE_FILE (object); + priv = PAROLE_FILE_GET_PRIVATE (file); + + if ( priv->filename ) + g_free (priv->filename); + + if ( priv->uri ) + g_free (priv->uri); + + if ( priv->display_name ) + g_free (priv->display_name); + + if ( priv->content_type ) + g_free (priv->content_type); + + G_OBJECT_CLASS (parole_file_parent_class)->finalize (object); +} + +static void +parole_file_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + ParoleFile *file; + file = PAROLE_FILE (object); + + switch (prop_id) + { + case PROP_PATH: + PAROLE_FILE_GET_PRIVATE (file)->filename = g_value_dup_string (value); + break; + case PROP_DISPLAY_NAME: + PAROLE_FILE_GET_PRIVATE (file)->display_name = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +parole_file_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + ParoleFile *file; + + file = PAROLE_FILE (object); + + switch (prop_id) + { + case PROP_PATH: + g_value_set_string (value, PAROLE_FILE_GET_PRIVATE (file)->filename); + break; + case PROP_URI: + g_value_set_string (value, PAROLE_FILE_GET_PRIVATE (file)->filename); + break; + case PROP_CONTENT_TYPE: + g_value_set_string (value, PAROLE_FILE_GET_PRIVATE (file)->content_type); + break; + case PROP_DISPLAY_NAME: + g_value_set_string (value, PAROLE_FILE_GET_PRIVATE (file)->display_name); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +parole_file_constructed (GObject *object) +{ + GFile *gfile; + GFileInfo *info; + ParoleFile *file; + ParoleFilePrivate *priv; + GError *error = NULL; + + file = PAROLE_FILE (object); + priv = PAROLE_FILE_GET_PRIVATE (file); + + gfile = g_file_new_for_commandline_arg (priv->filename); + + info = g_file_query_info (gfile, + "standard::*,", + 0, + NULL, + &error); + + if ( error ) + { + if ( G_LIKELY (error->code == G_IO_ERROR_NOT_SUPPORTED) ) + { + g_error_free (error); + if ( !priv->display_name ) + priv->display_name = g_file_get_basename (gfile); + } + else + { + if ( !priv->display_name ) + priv->display_name = g_strdup (priv->filename); + g_warning ("Unable to read file info %s", error->message); + } + goto out; + } +#ifdef HAVE_TAGLIBC + else + { + TagLib_File *tag_file; + TagLib_Tag *tag; + gchar *title; + gchar *title_s; + + tag_file = taglib_file_new (priv->filename); + + if ( tag_file ) + { + tag = taglib_file_tag (tag_file); + if ( tag ) + { + title = taglib_tag_title (tag); + + if ( title ) + { + title_s = g_strstrip (title); + if ( strlen (title_s ) ) + { + priv->display_name = g_strdup (title_s); + } + } + + taglib_tag_free_strings (); + } + taglib_file_free (tag_file); + } + } +#endif + + if (!priv->display_name) + priv->display_name = g_strdup (g_file_info_get_display_name (info)); + + priv->content_type = g_strdup (g_file_info_get_content_type (info)); + + g_object_unref (info); + +out: + priv->uri = g_file_get_uri (gfile); + g_object_unref (gfile); +} + +static void +parole_file_class_init (ParoleFileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = parole_file_finalize; + + object_class->constructed = parole_file_constructed; + object_class->set_property = parole_file_set_property; + object_class->get_property = parole_file_get_property; + + /** + * ParoleFile:filename: + * + * The file name of the file. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_PATH, + g_param_spec_string ("filename", + "File name", + "The file name", + NULL, + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_READWRITE)); + + /** + * ParoleFile:display-name: + * + * A UTF-8 name that can be displayed in the UI. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_DISPLAY_NAME, + g_param_spec_string ("display-name", + "Display name", + "A UTF-8 name that can be displayed in the UI", + NULL, + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_READWRITE)); + + /** + * ParoleFile:uri: + * + * The uri of the file. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_URI, + g_param_spec_string ("uri", + "Uri", + "The uri of the file", + NULL, + G_PARAM_READABLE)); + + /** + * ParoleFile:content-type: + * + * The content type of the file. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_CONTENT_TYPE, + g_param_spec_string ("content-type", + "Content type", + "The content type of the file", + NULL, + G_PARAM_READABLE)); + + g_type_class_add_private (klass, sizeof (ParoleFilePrivate)); +} + +static void +parole_file_init (ParoleFile *file) +{ + ParoleFilePrivate *priv; + + priv = PAROLE_FILE_GET_PRIVATE (file); + + priv->filename = NULL; + priv->display_name = NULL; + priv->uri = NULL; + priv->content_type = NULL; +} + +/** + * parole_file_new: + * @filename: filename. + * + * + * + * Returns: A new #ParoleFile object. + * + * Since: 0.2 + **/ +ParoleFile * +parole_file_new (const gchar *filename) +{ + ParoleFile *file = NULL; + file = g_object_new (PAROLE_TYPE_FILE, "filename", filename, NULL); + return file; +} + +/** + * parole_file_new_with_display_name: + * @filename: filename. + * + * + * + * Returns: A new #ParoleFile object. + * + * Since: 0.2 + **/ +ParoleFile * +parole_file_new_with_display_name (const gchar *filename, const gchar *display_name) +{ + ParoleFile *file = NULL; + file = g_object_new (PAROLE_TYPE_FILE, + "filename", filename, + "display-name", display_name, + NULL); + return file; +} + +/** + * parole_file_get_file_name: + * @file: a #ParoleFile. + * + * + * Returns: A string containing the file name. + * + * Since: 0.2 + **/ +const gchar * +parole_file_get_file_name (const ParoleFile *file) +{ + g_return_val_if_fail (PAROLE_IS_FILE (file), NULL); + + return PAROLE_FILE_GET_PRIVATE (file)->filename; +} + +/** + * parole_file_get_display_name: + * @file: a #ParoleFile. + * + * + * Returns: A string containing the display name. + * + * Since: 0.2 + **/ +const gchar * +parole_file_get_display_name (const ParoleFile *file) +{ + g_return_val_if_fail (PAROLE_IS_FILE (file), NULL); + + return PAROLE_FILE_GET_PRIVATE (file)->display_name; +} + +/** + * parole_file_get_uri: + * @file: a #ParoleFile. + * + * + * Returns: A string containing the file uri. + * + * Since: 0.2 + **/ +const gchar * +parole_file_get_uri (const ParoleFile *file) +{ + g_return_val_if_fail (PAROLE_IS_FILE (file), NULL); + + return PAROLE_FILE_GET_PRIVATE (file)->uri; +} + +/** + * parole_file_get_content_type: + * @file: a #ParoleFile. + * + * + * Returns: A string containing the content type of the file. + * + * Since: 0.2 + **/ +const gchar * +parole_file_get_content_type (const ParoleFile *file) +{ + g_return_val_if_fail (PAROLE_IS_FILE (file), NULL); + + return PAROLE_FILE_GET_PRIVATE (file)->content_type; +} diff --git a/parole/parole-file.h b/parole/parole-file.h new file mode 100644 index 0000000..7430f9c --- /dev/null +++ b/parole/parole-file.h @@ -0,0 +1,66 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#if !defined (__PAROLE_H_INSIDE__) && !defined (PAROLE_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __PAROLE_MEDIA_FILE_H +#define __PAROLE_MEDIA_FILE_H + +#include + +G_BEGIN_DECLS + +#define PAROLE_TYPE_FILE (parole_file_get_type () ) +#define PAROLE_FILE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_FILE, ParoleFile)) +#define PAROLE_IS_FILE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_FILE)) + +typedef struct _ParoleFile ParoleFile; +typedef struct _ParoleFileClass ParoleFileClass; + +struct _ParoleFile +{ + GObject parent; +}; + +struct _ParoleFileClass +{ + GObjectClass parent_class; +}; + +GType parole_file_get_type (void) G_GNUC_CONST; + +ParoleFile *parole_file_new (const gchar *filename); + +ParoleFile *parole_file_new_with_display_name (const gchar *filename, + const gchar *display_name); + +const gchar G_CONST_RETURN *parole_file_get_file_name (const ParoleFile *file) G_GNUC_PURE; + +const gchar G_CONST_RETURN *parole_file_get_display_name (const ParoleFile *file) G_GNUC_PURE; + +const gchar G_CONST_RETURN *parole_file_get_uri (const ParoleFile *file) G_GNUC_PURE; + +const gchar G_CONST_RETURN *parole_file_get_content_type (const ParoleFile *file) G_GNUC_PURE; + +G_END_DECLS + +#endif /* __PAROLE_MEDIA_FILE_H */ diff --git a/parole/parole-filters.c b/parole/parole-filters.c new file mode 100644 index 0000000..cdd99de --- /dev/null +++ b/parole/parole-filters.c @@ -0,0 +1,204 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include + +#include "parole-filters.h" +#include "parole-pl-parser.h" +#include "data/mime/parole-mime-types.h" + +static char *playlist_mime_types[] = { + "text/plain", + "audio/x-mpegurl", + "audio/playlist", + "audio/x-scpls", + "audio/x-ms-asx", + "application/xml", + "application/xspf+xml", +}; + +/** + * parole_get_supported_audio_filter: + * + * + * Get a #GtkFileFilter according to the supported + * Parole audio mime types. + * + * Returns: A #GtkFileFilter for supported audio formats. + * + * Since: 0.2 + */ +GtkFileFilter *parole_get_supported_audio_filter (void) +{ + GtkFileFilter *filter; + guint i; + + filter = gtk_file_filter_new (); + + gtk_file_filter_set_name (filter, _("Audio")); + + for ( i = 0; i < G_N_ELEMENTS (audio_mime_types); i++) + gtk_file_filter_add_mime_type (filter, audio_mime_types[i]); + + return filter; +} + +/** + * parole_get_supported_video_filter: + * + * + * Get a #GtkFileFilter according to the supported + * Parole video mime types. + * + * Returns: A #GtkFileFilter for supported video formats. + * + * Since: 0.2 + */ +GtkFileFilter *parole_get_supported_video_filter (void) +{ + GtkFileFilter *filter; + guint i; + + filter = gtk_file_filter_new (); + + gtk_file_filter_set_name (filter, _("Video")); + + for ( i = 0; i < G_N_ELEMENTS (video_mime_types); i++) + gtk_file_filter_add_mime_type (filter, video_mime_types[i]); + + return filter; +} + +/** + * parole_get_supported_media_filter: + * + * Get a #GtkFileFilter according to the supported + * Parole media mime types, including audio and vide. + * + * Returns: A #GtkFileFilter for supported media formats. + * + * Since: 0.2 + */ +GtkFileFilter *parole_get_supported_media_filter (void) +{ + GtkFileFilter *filter; + guint i; + + filter = gtk_file_filter_new (); + + gtk_file_filter_set_name (filter, _("Audio and video")); + + for ( i = 0; i < G_N_ELEMENTS (audio_mime_types); i++) + gtk_file_filter_add_mime_type (filter, audio_mime_types[i]); + + for ( i = 0; i < G_N_ELEMENTS (video_mime_types); i++) + gtk_file_filter_add_mime_type (filter, video_mime_types[i]); + + return filter; +} + +/** + * parole_get_supported_files_filter: + * + * + * Get a #GtkFileFilter according to the supported + * Parole files mime types, including audio/video/play list formats. + * + * Returns: A #GtkFileFilter for supported files formats. + * + * Since: 0.2 + */ +GtkFileFilter *parole_get_supported_files_filter (void) +{ + GtkFileFilter *filter; + guint i; + + filter = parole_get_supported_media_filter (); + + gtk_file_filter_set_name (filter, _("All supported files")); + + for ( i = 0; i < G_N_ELEMENTS (playlist_mime_types); i++) + gtk_file_filter_add_mime_type (filter, playlist_mime_types[i]); + + return filter; + +} + +/** + * parole_get_supported_playlist_filter: + * + * + * Get a #GtkFileFilter according to the supported + * Parole play-list mime types. + * + * Returns: A #GtkFileFilter for supported playlist formats. + * + * Since: 0.2 + */ +GtkFileFilter *parole_get_supported_playlist_filter (void) +{ + GtkFileFilter *filter; + guint i; + + filter = gtk_file_filter_new (); + + gtk_file_filter_set_name (filter, _("Playlist files")); + + for ( i = 0; i < G_N_ELEMENTS (playlist_mime_types); i++) + gtk_file_filter_add_mime_type (filter, playlist_mime_types[i]); + + return filter; +} + +/** + * parole_file_filter: + * @filter: a #GtkFileFilter. + * @file: a #ParoleFile + * + * Tests whether a file should be displayed according to filter + * + * Returns: TRUE if the file should be displayed. + * + * Since: 0.2 + */ +gboolean parole_file_filter (GtkFileFilter *filter, ParoleFile *file) +{ + GtkFileFilterInfo filter_info; + + gboolean ret; + + filter_info.display_name = parole_file_get_display_name (file); + filter_info.mime_type = parole_file_get_content_type (file); + + filter_info.contains = GTK_FILE_FILTER_DISPLAY_NAME | GTK_FILE_FILTER_MIME_TYPE; + + ret = gtk_file_filter_filter (filter, &filter_info); + + return ret; +} diff --git a/parole/parole-filters.h b/parole/parole-filters.h new file mode 100644 index 0000000..b1ee170 --- /dev/null +++ b/parole/parole-filters.h @@ -0,0 +1,49 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#if !defined (__PAROLE_H_INSIDE__) && !defined (PAROLE_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __PAROLE_FILTERS_H +#define __PAROLE_FILTERS_H + +#include + +#include + +G_BEGIN_DECLS + +GtkFileFilter *parole_get_supported_audio_filter (void); + +GtkFileFilter *parole_get_supported_video_filter (void); + +GtkFileFilter *parole_get_supported_media_filter (void); + +GtkFileFilter *parole_get_supported_files_filter (void); + +GtkFileFilter *parole_get_supported_playlist_filter (void); + +gboolean parole_file_filter (GtkFileFilter *filter, + ParoleFile *file); + +G_END_DECLS + +#endif /* PAROLE_FILTERS_H */ diff --git a/parole/parole-marshal.list b/parole/parole-marshal.list new file mode 100644 index 0000000..3747a11 --- /dev/null +++ b/parole/parole-marshal.list @@ -0,0 +1,3 @@ +VOID:OBJECT,ENUM +VOID:OBJECT,DOUBLE +VOID:OBJECT,INT diff --git a/parole/parole-pl-parser.c b/parole/parole-pl-parser.c new file mode 100644 index 0000000..d5cb667 --- /dev/null +++ b/parole/parole-pl-parser.c @@ -0,0 +1,787 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +/* + * Based on code from: + * + * Totem pl parser: Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Bastien Nocera + * Copyright (C) 2003, 2004 Colin Walters + * + * xfmedia: Copyright (c) 2004-2005 Brian Tarricone, + * + * Thanks :). + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include + +#include + +#include "parole-pl-parser.h" +#include "parole-filters.h" +#include "parole-debug.h" +#include "parole-enum-types.h" + +typedef struct +{ + GSList *list; + gboolean started; + gchar *uri; + gchar *title; + +} ParoleParserData; + +static void +parole_xspf_xml_start (GMarkupParseContext *context, const gchar *element_name, + const gchar **attribute_names, const gchar **attribute_values, + gpointer user_data, GError **error) +{ + ParoleParserData *data = user_data; + + if ( !data->started ) + { + if (!g_ascii_strcasecmp (element_name, "playlist") ) + data->started = TRUE; + } +} + +static void +parole_xspf_xml_text (GMarkupParseContext *context, const gchar *text, gsize text_len, + gpointer user_data, GError **error) +{ + ParoleParserData *data = user_data; + const gchar *element_name; + + if (!data->started) + return; + + element_name = g_markup_parse_context_get_element (context); + + if (!g_ascii_strcasecmp (element_name, "location") ) + { + if (data->uri) + { + g_free (data->uri); + data->uri = NULL; + } + + if (text_len > 0) + data->uri = g_strdup (text); + } + else if (!g_ascii_strcasecmp (element_name, "title") ) + { + if (data->title) + { + g_free (data->title); + data->title = NULL; + } + + if (text_len > 0) + data->title = g_strdup (text); + } +} + +static void +parole_xspf_xml_end (GMarkupParseContext *context, const gchar *element_name, + gpointer user_data, GError **error) +{ + ParoleParserData *data = user_data; + ParoleFile *file; + + if (! g_ascii_strcasecmp (element_name, "playlist")) + data->started = FALSE; + + if (!data->started) + return; + + if (!g_ascii_strcasecmp (element_name, "track")) + { + if (data->uri) + { + file = parole_file_new_with_display_name (data->uri, data->title); + data->list = g_slist_append (data->list, file); + + g_free (data->uri); + data->uri = NULL; + } + + if ( data->title) + { + g_free (data->title); + data->title = NULL; + } + } +} + +static void +parole_asx_xml_start (GMarkupParseContext *context, const gchar *element_name, + const gchar **attribute_names, const gchar **attribute_values, + gpointer user_data, GError **error) +{ + guint i; + ParoleParserData *data = user_data; + + if ( !data->started ) + { + if (!g_ascii_strcasecmp (element_name, "asx") ) + data->started = TRUE; + else + return; + } + + if (!g_ascii_strcasecmp (element_name, "ref") ) + { + if (data->uri) + { + g_free (data->uri); + data->uri = NULL; + } + + for ( i = 0; attribute_names[i]; i++) + { + if ( !g_ascii_strcasecmp (attribute_names[i], "href")) + { + data->uri = g_strdup (attribute_values[i]); + break; + } + } + } +} + +static void +parole_asx_xml_text (GMarkupParseContext *context, const gchar *text, gsize text_len, + gpointer user_data, GError **error) +{ + ParoleParserData *data = user_data; + const gchar *element_name; + + if (!data->started) + return; + + element_name = g_markup_parse_context_get_element (context); + + if (!g_ascii_strcasecmp (element_name, "title") ) + { + if (data->title) + { + g_free (data->title); + data->title = NULL; + } + + if (text_len > 0) + data->title = g_strdup (text); + } +} + +static void +parole_asx_xml_end (GMarkupParseContext *context, const gchar *element_name, + gpointer user_data, GError **error) +{ + ParoleParserData *data = user_data; + ParoleFile *file; + + if (!g_ascii_strcasecmp (element_name, "ASX")) + data->started = FALSE; + + if (!data->started) + return; + + if (!g_ascii_strcasecmp (element_name, "entry")) + { + if (data->uri) + { + file = parole_file_new_with_display_name (data->uri, data->title); + data->list = g_slist_append (data->list, file); + + g_free (data->uri); + data->uri = NULL; + } + + if ( data->title) + { + g_free (data->title); + data->title = NULL; + } + } +} + +static GSList * +parole_pl_parser_parse_asx (const gchar *filename) +{ + ParoleParserData data; + GFile *file; + gchar *contents; + GError *error = NULL; + gsize size; + GMarkupParseContext *pctx; + GMarkupParser parser = { + parole_asx_xml_start, + parole_asx_xml_end, + parole_asx_xml_text, + NULL, + NULL + }; + + data.list = NULL; + data.title = data.uri = NULL; + + file = g_file_new_for_path (filename); + + if ( !g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) ) + goto out; + + if ( g_utf8_validate (contents, -1, NULL) == FALSE) + { + gchar *fixed; + fixed = g_convert (contents, -1, "UTF-8", "ISO8859-1", NULL, NULL, NULL); + if (fixed != NULL) + { + g_free (contents); + contents = fixed; + } + } + + pctx = g_markup_parse_context_new (&parser, 0, &data, NULL); + + if ( !g_markup_parse_context_parse (pctx, contents, size, &error) ) + { + if ( error ) + { + g_critical ("Unable to parse asx file : %s : %s\n", filename, error->message); + g_error_free (error); + } + } + else + { + if ( !g_markup_parse_context_end_parse (pctx, &error) ) + { + g_critical ("Unable to finish parsing ASX playlist file %s", error->message); + g_error_free (error); + } + } + + g_markup_parse_context_free (pctx); + +out: + g_object_unref (file); + return data.list; +} + +static GSList * +parole_pl_parser_parse_m3u (const gchar *filename) +{ + GFile *file; + gchar **lines; + gchar *contents; + GSList *list = NULL; + gsize size; + guint num_lines; + const gchar *split_char; + guint i; + + file = g_file_new_for_path (filename); + + if ( !g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) ) + goto out; + + if ( g_utf8_validate (contents, -1, NULL) == FALSE) + { + gchar *fixed; + fixed = g_convert (contents, -1, "UTF-8", "ISO8859-1", NULL, NULL, NULL); + if (fixed != NULL) + { + g_free (contents); + contents = fixed; + } + } + + if ( strstr (contents,"\x0d") == NULL) + { + split_char = "\n"; + } + else + { + split_char = "\x0d\n"; + } + + lines = g_strsplit (contents, split_char, 0); + g_free (contents); + + num_lines = g_strv_length (lines); + num_lines--; /* Drop the terminating NULL */ + + for ( i = 0; lines[i] != NULL; i++) + { + if ( lines[i][0] == '\0' || lines[i][0] == '#') + continue; + + list = g_slist_append (list, parole_file_new (lines[i])); + } + + g_strfreev (lines); +out: + + g_object_unref (file); + + return list; +} + +static GSList * +parole_pl_parser_parse_pls (const gchar *filename) +{ + XfceRc *rcfile; + GSList *list = NULL; + ParoleFile *file; + const gchar *file_entry, *title_entry; + guint i, nentries; + gchar key[128]; + + rcfile = xfce_rc_simple_open (filename, TRUE); + + if ( xfce_rc_has_group (rcfile, "playlist") ) + { + xfce_rc_set_group (rcfile, "playlist"); + + nentries = xfce_rc_read_int_entry (rcfile, "NumberOfEntries", 0); + + for (i = 1; i <= nentries; i++) + { + g_snprintf (key, 128, "File%d", i); + + file_entry = xfce_rc_read_entry (rcfile, key, NULL); + + if (!file_entry) + continue; + + g_snprintf (key, 128, "Title%d", i); + + title_entry = xfce_rc_read_entry (rcfile, key, NULL); + + file = parole_file_new_with_display_name (file_entry, title_entry); + list = g_slist_append (list, file); + } + } + + xfce_rc_close (rcfile); + + return list; +} + +static GSList * +parole_pl_parser_parse_xspf (const gchar *filename) +{ + ParoleParserData data; + GFile *file; + gchar *contents; + GError *error = NULL; + gsize size; + GMarkupParseContext *pctx; + GMarkupParser parser = { + parole_xspf_xml_start, + parole_xspf_xml_end, + parole_xspf_xml_text, + NULL, + NULL + }; + + data.list = NULL; + data.title = data.uri = NULL; + + file = g_file_new_for_path (filename); + + if ( !g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) ) + goto out; + + if ( g_utf8_validate (contents, -1, NULL) == FALSE) + { + gchar *fixed; + fixed = g_convert (contents, -1, "UTF-8", "ISO8859-1", NULL, NULL, NULL); + if (fixed != NULL) + { + g_free (contents); + contents = fixed; + } + } + + pctx = g_markup_parse_context_new (&parser, 0, &data, NULL); + + if ( !g_markup_parse_context_parse (pctx, contents, size, &error) ) + { + if ( error ) + { + g_critical ("Unable to parse xspf file : %s : %s\n", filename, error->message); + g_error_free (error); + } + } + else + { + if ( !g_markup_parse_context_end_parse (pctx, &error) ) + { + g_critical ("Unable to finish parsing xspf playlist file %s", error->message); + g_error_free (error); + } + } + + g_markup_parse_context_free (pctx); + +out: + g_object_unref (file); + return data.list; +} + +static GSList * +parole_pl_parser_parse (ParolePlFormat format, const gchar *filename) +{ + GSList *list = NULL; + + switch (format) + { + case PAROLE_PL_FORMAT_M3U: + list = parole_pl_parser_parse_m3u (filename); + break; + case PAROLE_PL_FORMAT_PLS: + list = parole_pl_parser_parse_pls (filename); + break; + case PAROLE_PL_FORMAT_ASX: + list = parole_pl_parser_parse_asx (filename); + break; + case PAROLE_PL_FORMAT_XSPF: + list = parole_pl_parser_parse_xspf (filename); + break; + default: + break; + } + + return list; +} + +static gboolean +parole_pl_parser_save_m3u (FILE *f, GSList *files) +{ + guint len; + guint i; + + fputs ("#EXTM3U\n\n", f); + + len = g_slist_length (files); + + for ( i = 0; i < len; i++) + { + ParoleFile *file; + file = g_slist_nth_data (files, i); + fprintf (f, "#EXTINF:-1,%s\n", parole_file_get_display_name (file)); + fprintf (f, "%s\n\n", parole_file_get_file_name (file)); + } + + return TRUE; +} + +static gboolean +parole_pl_parser_save_pls (FILE *f, GSList *files) +{ + guint len; + guint i; + gchar key[128]; + + len = g_slist_length (files); + + fprintf (f, "[playlist]\nNumberOfEntries=%d\n", len); + + for ( i = 1; i <= len; i++) + { + ParoleFile *file; + file = g_slist_nth_data (files, i - 1); + g_snprintf (key, 128, "File%d", i); + fprintf (f, "%s=%s\n", key, parole_file_get_file_name (file)); + g_snprintf (key, 128, "Title%d", i); + fprintf (f, "%s=%s\n\n", key, parole_file_get_display_name (file)); + } + + return TRUE; +} + +static gboolean +parole_pl_parser_save_asx (FILE *f, GSList *files) +{ + guint len; + guint i; + + len = g_slist_length (files); + + fputs ("\n", f); + + for ( i = 0; i < len; i++) + { + ParoleFile *file; + file = g_slist_nth_data (files, i); + fprintf (f, " \n %s\n \n \n", + parole_file_get_display_name (file), + parole_file_get_uri (file)); + } + + fputs ("\n", f); + + return TRUE; +} + +static gboolean +parole_pl_parser_save_xspf (FILE *f, GSList *files) +{ + guint len; + guint i; + + len = g_slist_length (files); + + fputs ("\n" + "\n", f); + + fputs (" \n", f); + + for ( i = 0; i < len; i++) + { + ParoleFile *file; + + file = g_slist_nth_data (files, i); + fprintf (f, " \n %s\n %s\n \n", + parole_file_get_display_name (file), parole_file_get_uri (file)); + } + + fputs (" \n", f); + + return TRUE; +} + +/** + * parole_pl_parser_guess_format_from_extension: + * @filename: a filename. + * + * Guess a playlist format from the filename extension. + * + * Returns: PAROLE_PL_FORMAT_UNKNOWN if unable to get the playlist format, and a valid + * playlist format otherwise. + * + * Since: 0.2 + */ +ParolePlFormat +parole_pl_parser_guess_format_from_extension (const gchar *filename) +{ + if ( g_str_has_suffix (filename, ".m3u") || g_str_has_suffix (filename, ".M3U") ) + return PAROLE_PL_FORMAT_M3U; + + if ( g_str_has_suffix (filename, ".pls") || g_str_has_suffix (filename, ".PLS") ) + return PAROLE_PL_FORMAT_PLS; + + if ( g_str_has_suffix (filename, ".xspf") || g_str_has_suffix (filename, ".XSPF") ) + return PAROLE_PL_FORMAT_XSPF; + + if ( g_str_has_suffix (filename, ".asx") || g_str_has_suffix (filename, ".ASX") ) + return PAROLE_PL_FORMAT_ASX; + + if ( g_str_has_suffix (filename, ".wax") || g_str_has_suffix (filename, ".WAX") ) + return PAROLE_PL_FORMAT_XSPF; + + return PAROLE_PL_FORMAT_UNKNOWN; +} + +/** + * parole_pl_parser_guess_format_from_data: + * @filename: a filename. + * + * Guess a playlist format from its data. + * + * Returns: PAROLE_PL_FORMAT_UNKNOWN if unable to get the playlist format, and a valid + * playlist format otherwise. + * + * Since: 0.2 + */ +ParolePlFormat +parole_pl_parser_guess_format_from_data (const gchar *filename) +{ + GFile *file; + gchar *contents = NULL; + gsize size; + + ParolePlFormat format = PAROLE_PL_FORMAT_UNKNOWN; + + file = g_file_new_for_path (filename); + + if ( !g_file_load_contents (file, NULL, &contents, &size, NULL, NULL ) ) + { + g_debug ("Unable to load content of file=%s", filename); + goto out; + } + + if ( strstr (contents, "") || strstr (contents, "") ) + format = PAROLE_PL_FORMAT_XSPF; + else if ( strstr (contents, "NumberOfEntries") ) + format = PAROLE_PL_FORMAT_PLS; + else + /* try to load the file as M3U*/ + format = PAROLE_PL_FORMAT_M3U; + + g_free (contents); +out: + g_object_unref (file); + return format; +} + +/** + * parole_pl_parser_save_from_files: + * @files: a #GSList list of #ParoleFile files. + * @filename: a filename to save. + * @format: a #ParolePlFormat format of the playlist. + * + * Saves a #GSList containing a list of #ParoleFile files to filename. + * + * + * Returns: TRUE if the playlist was saved, FALSE otherwise. + * + * Since: 0.2 + **/ +gboolean parole_pl_parser_save_from_files (GSList *files, const gchar *filename, ParolePlFormat format) +{ + FILE *f; + gboolean ret_val; + + PAROLE_DEBUG_ENUM_FULL (format, PAROLE_ENUM_TYPE_PL_FORMAT, "Saving playlist %s ", filename); + + f = fopen (filename, "w"); + + switch (format) + { + case PAROLE_PL_FORMAT_M3U: + ret_val = parole_pl_parser_save_m3u (f, files); + break; + case PAROLE_PL_FORMAT_PLS: + ret_val = parole_pl_parser_save_pls (f, files); + break; + case PAROLE_PL_FORMAT_ASX: + ret_val = parole_pl_parser_save_asx (f, files); + break; + case PAROLE_PL_FORMAT_XSPF: + ret_val = parole_pl_parser_save_xspf (f, files); + break; + default: + break; + } + + fclose (f); + + return ret_val; +} + +/** + * parole_pl_parser_parse_from_file_by_extension: + * @filename: a filename. + * + * + * Returns: a #GSList containts a list of #Parolefile parsed from the playlist, + * or NULL if no files were parsed. + * + * Since: 0.2 + */ +GSList *parole_pl_parser_parse_from_file_by_extension (const gchar *filename) +{ + ParolePlFormat format = PAROLE_PL_FORMAT_UNKNOWN; + GSList *list = NULL; + + if ( (format = parole_pl_parser_guess_format_from_extension (filename)) == PAROLE_PL_FORMAT_UNKNOWN && + (format = parole_pl_parser_guess_format_from_data (filename)) == PAROLE_PL_FORMAT_UNKNOWN ) + { + g_debug ("Unable to guess playlist format : %s", filename); + goto out; + } + + PAROLE_DEBUG_ENUM_FULL (format, PAROLE_ENUM_TYPE_PL_FORMAT, "playlist %s ", filename); + list = parole_pl_parser_parse (format, filename); + +out: + return list; +} + +/** + * parole_pl_parser_parse_all_from_file: + * @filename: a filename + * + * This function tries to parse a playlist without guessing the playlist format. + * + * + * Returns: a #GSList containts a list of #Parolefile parsed from the playlist, + * or NULL if no files were parsed. + * + * Since: 0.2 + */ +GSList *parole_pl_parser_parse_all_from_file (const gchar *filename) +{ + GSList *list = NULL; + + list = parole_pl_parser_parse_asx (filename); + list = g_slist_concat (list, parole_pl_parser_parse_m3u (filename)); + list = g_slist_concat (list, parole_pl_parser_parse_pls (filename)); + list = g_slist_concat (list, parole_pl_parser_parse_xspf (filename)); + + return list; +} + +/** + * parole_pl_parser_can_parse_data: + * @data: data. + * @len: length of data. + * + * Get if the Parole parser can parse from the passed data. + * + * Returns: TRUE if it can parse from the data, FALSE otherwise. + * + * Since: 0.2 + */ +gboolean parole_pl_parser_can_parse_data (const guchar *data, gint len) +{ + gchar *mime_type = NULL; + gboolean result_uncertain; + gboolean result = FALSE; + + mime_type = g_content_type_guess (NULL, data, len, &result_uncertain); + + if ( mime_type && result_uncertain == FALSE ) + { + GtkFileFilter *filter = g_object_ref_sink (parole_get_supported_playlist_filter ()); + GtkFileFilterInfo filter_info; + g_debug ("Mime_type=%s", mime_type); + filter_info.mime_type = mime_type; + + filter_info.contains = GTK_FILE_FILTER_MIME_TYPE; + + result = gtk_file_filter_filter (filter, &filter_info); + g_object_unref (filter); + g_free (mime_type); + } + + return result; +} diff --git a/parole/parole-pl-parser.h b/parole/parole-pl-parser.h new file mode 100644 index 0000000..1df1a9d --- /dev/null +++ b/parole/parole-pl-parser.h @@ -0,0 +1,58 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#if !defined (__PAROLE_H_INSIDE__) && !defined (PAROLE_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __PAROLE_PL_PARSER_H +#define __PAROLE_PL_PARSER_H + +#include + +G_BEGIN_DECLS + +typedef enum +{ + PAROLE_PL_FORMAT_UNKNOWN, + PAROLE_PL_FORMAT_M3U, + PAROLE_PL_FORMAT_PLS, + PAROLE_PL_FORMAT_ASX, + PAROLE_PL_FORMAT_XSPF + +} ParolePlFormat; + +ParolePlFormat parole_pl_parser_guess_format_from_extension (const gchar *filename); + +ParolePlFormat parole_pl_parser_guess_format_from_data (const gchar *filename); + +gboolean parole_pl_parser_can_parse_data (const guchar *data, gint len); + +GSList *parole_pl_parser_parse_from_file_by_extension (const gchar *filename); + +GSList *parole_pl_parser_parse_all_from_file (const gchar *filename); + +gboolean parole_pl_parser_save_from_files (GSList *files, + const gchar *filename, + ParolePlFormat format); + +G_END_DECLS + +#endif /* __PAROLE_PL_PARSER_H */ diff --git a/parole/parole-provider-player.c b/parole/parole-provider-player.c new file mode 100644 index 0000000..afc15f0 --- /dev/null +++ b/parole/parole-provider-player.c @@ -0,0 +1,370 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "parole/parole-provider-player.h" +#include "parole-marshal.h" +#include "parole-enum-types.h" + +static void parole_provider_player_base_init (gpointer klass); +static void parole_provider_player_class_init (gpointer klass); + +GType +parole_provider_player_get_type (void) +{ + static GType type = G_TYPE_INVALID; + + if (G_UNLIKELY (type == G_TYPE_INVALID)) + { + static const GTypeInfo info = + { + sizeof (ParoleProviderPlayerIface), + (GBaseInitFunc) parole_provider_player_base_init, + NULL, + (GClassInitFunc) parole_provider_player_class_init, + NULL, + NULL, + 0, + 0, + NULL, + NULL, + }; + + type = g_type_register_static (G_TYPE_INTERFACE, "ParoleProviderPlayerIface", &info, 0); + + g_type_interface_add_prerequisite (type, G_TYPE_OBJECT); + } + + return type; +} + +static void parole_provider_player_base_init (gpointer klass) +{ + static gboolean initialized = FALSE; + + if (G_UNLIKELY (!initialized)) + { + /** + * ParoleProviderPlayerIface::state-changed: + * @player: the object which received the signal. + * @stream: a #ParoleStream. + * @state: the new state. + * + * Issued when the Parole state changed. + * + * Since: 0.2 + **/ + g_signal_new ("state-changed", + G_TYPE_FROM_INTERFACE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParoleProviderPlayerIface, state_changed), + NULL, NULL, + parole_marshal_VOID__OBJECT_ENUM, + G_TYPE_NONE, 2, + PAROLE_TYPE_STREAM, PAROLE_ENUM_TYPE_STATE); + + /** + * ParoleProviderPlayerIface::tag-message: + * @player: the object which received the signal. + * @stream: a #ParoleStream. + * + * Indicated that the stream tags were found and ready to be read. + * + * Since: 0.2 + **/ + g_signal_new ("tag-message", + G_TYPE_FROM_INTERFACE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParoleProviderPlayerIface, tag_message), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, PAROLE_TYPE_STREAM); + + initialized = TRUE; + } +} + +static void parole_provider_player_class_init (gpointer klass) +{ +} + +/** + * parole_provider_player_get_main_window: + * @player: a #ParoleProviderPlayer + * + * Ask the Player to get the Parole main window. + * + * Returns: #GtkWidget window. + * + * Since: 0.2 + **/ +GtkWidget *parole_provider_player_get_main_window (ParoleProviderPlayer *player) +{ + GtkWidget *window = NULL; + + g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), NULL); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->get_main_window ) + { + window = (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->get_main_window) (player); + } + return window; +} + +/** + * parole_provider_player_pack: + * @player: a #ParoleProviderPlayer + * @widget: a #GtkWidget. + * @title: title + * @container: a #ParolePluginContainer. + * + * Ask the player to pack a widget in the playlist notebook if PAROLE_PLUGIN_CONTAINER_PLAYLIST + * is specified or in the main window notebook if PAROLE_PLUGIN_CONTAINER_MAIN_VIEW is specified. + * + * This function can be called once, the Player is responsible on removing the widget in + * case the plugin was unloaded. + * + * + * Since: 0.2 + **/ +void parole_provider_player_pack (ParoleProviderPlayer *player, GtkWidget *widget, + const gchar *title, ParolePluginContainer container) +{ + g_return_if_fail (PAROLE_IS_PROVIDER_PLAYER (player)); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->pack ) + { + (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->pack) (player, widget, title, container); + } +} + +/** + * parole_provider_player_get_state: + * @player: a #ParoleProviderPlayer + * + * Get the current state of the player. + * + * Returns: a #ParoleState. + * + * + * Since: 0.2 + **/ +ParoleState parole_provider_player_get_state (ParoleProviderPlayer *player) +{ + ParoleState state = PAROLE_STATE_STOPPED; + + g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), PAROLE_STATE_STOPPED); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->get_state ) + { + state = (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->get_state) (player); + } + + return state; +} + +/** + * parole_provider_player_get_stream: + * @player: a #ParoleProviderPlayer + * + * Get the #ParoleStream object. + * + * Returns: the #ParoleStream object. + * + * Since: 0.2 + **/ +const ParoleStream *parole_provider_player_get_stream (ParoleProviderPlayer *player) +{ + g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), NULL); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->get_stream ) + { + return (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->get_stream) (player); + } + + return NULL; +} + +/** + * parole_provider_player_play_uri: + * @player: a #ParoleProviderPlayer + * @uri: uri + * + * Issue a play command on the backend for the given uri, note this function + * can be called only of the Parole current state is PAROLE_STATE_STOPPED. + * + * Returning TRUE doesn't mean that the funtion succeeded to change the state of the player, + * the state change is indicated asynchronously by #ParoleProviderPlayerIface::state-changed signal. + * + * Returns: TRUE if the command is processed, FALSE otherwise. + * + * Since: 0.2 + **/ +gboolean parole_provider_player_play_uri (ParoleProviderPlayer *player, const gchar *uri) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), FALSE); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->play_uri ) + { + ret = (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->play_uri) (player, uri); + } + return ret; +} + + +/** + * parole_provider_player_pause: + * @player: a #ParoleProviderPlayer + * + * Issue a pause command to the backend, this function can be called when the state of the player + * is PAROLE_STATE_PLAYING. + * + * Returning TRUE doesn't mean that the funtion succeeded to change the state of the player, + * the state change is indicated asynchronously by #ParoleProviderPlayerIface::state-changed signal. + * + * Returns: TRUE if the command is processed, FALSE otherwise. + * + * + * Since: 0.2 + **/ +gboolean parole_provider_player_pause (ParoleProviderPlayer *player) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), FALSE); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->pause ) + { + ret = (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->pause) (player); + } + + return ret; +} + + +/** + * parole_provider_player_resume: + * @player: a #ParoleProviderPlayer + * + * + * Issue a resume command to the player, this function can be called when + * the current state of the player is PAROLE_STATE_PAUSED. + * + * Returning TRUE doesn't mean that the funtion succeeded to change the state of the player, + * the state change is indicated asynchronously by #ParoleProviderPlayerIface::state-changed signal. + * + * Returns: TRUE if the command is processed, FALSE otherwise. + * + * + * Since: 0.2 + **/ +gboolean parole_provider_player_resume (ParoleProviderPlayer *player) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), FALSE); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->resume ) + { + ret = (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->resume) (player); + } + + return ret; +} + + +/** + * parole_provider_player_stop: + * @player: a #ParoleProviderPlayer + * + * Issue a stop command to the player. + * + * Returning TRUE doesn't mean that the funtion succeeded to change the state of the player, + * the state change is indicated asynchronously by #ParoleProviderPlayerIface::state-changed signal. + * + * Returns: TRUE if the command is processed, FALSE otherwise. + * + * Since: 0.2 + **/ +gboolean parole_provider_player_stop (ParoleProviderPlayer *player) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), FALSE); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->stop ) + { + ret = (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->stop) (player); + } + + return ret; +} + + +/** + * parole_provider_player_seek: + * @player: a #ParoleProviderPlayer + * @pos: position to seek. + * + * + * Issue a seek command. + * + * Returns: TRUE if the seek command succeeded, FALSE otherwise. + * + * + * Since: 0.2 + **/ +gboolean parole_provider_player_seek (ParoleProviderPlayer *player, gdouble pos) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (PAROLE_IS_PROVIDER_PLAYER (player), FALSE); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->seek ) + { + ret = (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->seek) (player, pos); + } + + return ret; +} + + +/** + * parole_provider_player_open_media_chooser: + * @player: a #ParoleProviderPlayer + * + * Ask Parole to open its media chooser dialog. + * + * Since: 0.2 + **/ +void parole_provider_player_open_media_chooser (ParoleProviderPlayer *player) +{ + g_return_if_fail (PAROLE_IS_PROVIDER_PLAYER (player)); + + if ( PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->open_media_chooser ) + { + (*PAROLE_PROVIDER_PLAYER_GET_INTERFACE (player)->open_media_chooser) (player); + } +} diff --git a/parole/parole-provider-player.h b/parole/parole-provider-player.h new file mode 100644 index 0000000..d009c5c --- /dev/null +++ b/parole/parole-provider-player.h @@ -0,0 +1,125 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#if !defined (__PAROLE_H_INSIDE__) && !defined (PAROLE_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __PAROLE_PROVIDER_PLAYER_H__ +#define __PAROLE_PROVIDER_PLAYER_H__ + +#include +#include + +G_BEGIN_DECLS + +#define PAROLE_TYPE_PROVIDER_PLAYER (parole_provider_player_get_type ()) +#define PAROLE_PROVIDER_PLAYER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_PROVIDER_PLAYER, ParoleProviderPlayer)) +#define PAROLE_IS_PROVIDER_PLAYER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_PROVIDER_PLAYER)) +#define PAROLE_PROVIDER_PLAYER_GET_INTERFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE((o), PAROLE_TYPE_PROVIDER_PLAYER, ParoleProviderPlayerIface)) + +typedef struct _ParoleProviderPlayerIface ParoleProviderPlayerIface; +typedef struct _ParoleProviderPlayer ParoleProviderPlayer; + +typedef enum +{ + PAROLE_PLUGIN_CONTAINER_PLAYLIST, + PAROLE_PLUGIN_CONTAINER_MAIN_VIEW +} ParolePluginContainer; + +typedef enum +{ + PAROLE_STATE_STOPPED = 0, + PAROLE_STATE_PLAYBACK_FINISHED, + PAROLE_STATE_PAUSED, + PAROLE_STATE_PLAYING + +} ParoleState; + +struct _ParoleProviderPlayerIface +{ + GTypeInterface __parent__; + + /*< private >*/ + GtkWidget *(*get_main_window) (ParoleProviderPlayer *player); + + void (*pack) (ParoleProviderPlayer *player, + GtkWidget *widget, + const gchar *title, + ParolePluginContainer container); + + ParoleState (*get_state) (ParoleProviderPlayer *player); + + const ParoleStream *(*get_stream) (ParoleProviderPlayer *player); + + gboolean (*play_uri) (ParoleProviderPlayer *player, + const gchar *uri); + + gboolean (*pause) (ParoleProviderPlayer *player); + + gboolean (*resume) (ParoleProviderPlayer *player); + + gboolean (*stop) (ParoleProviderPlayer *player); + + gboolean (*seek) (ParoleProviderPlayer *player, + gdouble pos); + + void (*open_media_chooser) (ParoleProviderPlayer *player); + + /*< signals >*/ + void (*tag_message) (ParoleProviderPlayer *player, + const ParoleStream *stream); + + void (*state_changed) (ParoleProviderPlayer *player, + const ParoleStream *stream, + ParoleState state); + +}; + +GType parole_provider_player_get_type (void) G_GNUC_CONST; + +GtkWidget *parole_provider_player_get_main_window (ParoleProviderPlayer *player); + +void parole_provider_player_pack (ParoleProviderPlayer *player, + GtkWidget *widget, + const gchar *title, + ParolePluginContainer container); + +ParoleState parole_provider_player_get_state (ParoleProviderPlayer *player); + +const ParoleStream *parole_provider_player_get_stream (ParoleProviderPlayer *player); + +gboolean parole_provider_player_play_uri (ParoleProviderPlayer *player, + const gchar *uri); + +gboolean parole_provider_player_pause (ParoleProviderPlayer *player); + +gboolean parole_provider_player_resume (ParoleProviderPlayer *player); + +gboolean parole_provider_player_stop (ParoleProviderPlayer *player); + +gboolean parole_provider_player_seek (ParoleProviderPlayer *player, + gdouble pos); + +void parole_provider_player_open_media_chooser (ParoleProviderPlayer *player); + +G_END_DECLS + +#endif /* __PAROLE_PLUGIN_IFACE_H__ */ diff --git a/parole/parole-provider-plugin.c b/parole/parole-provider-plugin.c new file mode 100644 index 0000000..4ee63d8 --- /dev/null +++ b/parole/parole-provider-plugin.c @@ -0,0 +1,117 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "parole/parole-provider-plugin.h" + +GType +parole_provider_plugin_get_type (void) +{ + static GType type = G_TYPE_INVALID; + + if (G_UNLIKELY (type == G_TYPE_INVALID)) + { + static const GTypeInfo info = + { + sizeof (ParoleProviderPluginIface), + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + NULL, + NULL, + }; + + type = g_type_register_static (G_TYPE_INTERFACE, "ParoleProviderPlugin", &info, 0); + } + + return type; +} + +/** + * parole_provider_plugin_get_is_configurable: + * @provider: a #ParoleProviderPlugin + * + * Get if the plugin is configurable. + * + * Returns: TRUE if the plugin is configurable, FALSE otherwise. + * + * + * Since: 0.2 + **/ +gboolean parole_provider_plugin_get_is_configurable (ParoleProviderPlugin *provider) +{ + gboolean configurable = FALSE; + + g_return_val_if_fail (PAROLE_IS_PROVIDER_PLUGIN (provider), FALSE); + + if ( PAROLE_PROVIDER_PLUGIN_GET_INTERFACE (provider)->get_is_configurable ) + { + configurable = (*PAROLE_PROVIDER_PLUGIN_GET_INTERFACE (provider)->get_is_configurable) (provider); + } + + return configurable; +} + +/** + * parole_provider_plugin_configure: + * @provider: a #ParoleProviderPlugin + * @parent: a #GtkWidget parent window + * + * Open the plugin configuration dialog + * + * + * Since: 0.2 + **/ +void parole_provider_plugin_configure (ParoleProviderPlugin *provider, GtkWidget *parent) +{ + g_return_if_fail (PAROLE_IS_PROVIDER_PLUGIN (provider)); + + if ( PAROLE_PROVIDER_PLUGIN_GET_INTERFACE (provider)->configure ) + { + (*PAROLE_PROVIDER_PLUGIN_GET_INTERFACE (provider)->configure) (provider, parent); + } +} + +/** + * parole_provider_plugin_set_player: + * @provider: a #ParoleProviderPlugin + * @player: a #ParoleProviderPlayer + * + * The player calls this method on the iface_init funtion implemented by the plugin + * to set the #ParoleProviderPlayer, don't take any reference of the Player. + * + * Since: 0.2 + **/ +void parole_provider_plugin_set_player (ParoleProviderPlugin *provider, ParoleProviderPlayer *player) +{ + g_return_if_fail (PAROLE_IS_PROVIDER_PLUGIN (provider)); + + if ( PAROLE_PROVIDER_PLUGIN_GET_INTERFACE (provider)->set_player ) + { + (*PAROLE_PROVIDER_PLUGIN_GET_INTERFACE (provider)->set_player) (provider, player); + } +} diff --git a/parole/parole-provider-plugin.h b/parole/parole-provider-plugin.h new file mode 100644 index 0000000..5474025 --- /dev/null +++ b/parole/parole-provider-plugin.h @@ -0,0 +1,67 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#if !defined (__PAROLE_H_INSIDE__) && !defined (PAROLE_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __PAROLE_PROVIDER_PLUGIN_H__ +#define __PAROLE_PROVIDER_PLUGIN_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define PAROLE_TYPE_PROVIDER_PLUGIN (parole_provider_plugin_get_type ()) +#define PAROLE_PROVIDER_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_PROVIDER_PLUGIN, ParoleProviderPlugin)) +#define PAROLE_IS_PROVIDER_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_PROVIDER_PLUGIN)) +#define PAROLE_PROVIDER_PLUGIN_GET_INTERFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE((o), PAROLE_TYPE_PROVIDER_PLUGIN, ParoleProviderPluginIface)) + +typedef struct _ParoleProviderPluginIface ParoleProviderPluginIface; +typedef struct _ParoleProviderPlugin ParoleProviderPlugin; + +struct _ParoleProviderPluginIface +{ + GTypeInterface __parent__; + + /*< public >*/ + gboolean (*get_is_configurable) (ParoleProviderPlugin *provider); + + void (*configure) (ParoleProviderPlugin *provider, + GtkWidget *parent); + + void (*set_player) (ParoleProviderPlugin *provider, + ParoleProviderPlayer *player); +}; + +GType parole_provider_plugin_get_type (void) G_GNUC_CONST; + +gboolean parole_provider_plugin_get_is_configurable (ParoleProviderPlugin *provider); + +void parole_provider_plugin_configure (ParoleProviderPlugin *provider, + GtkWidget *parent); + +void parole_provider_plugin_set_player (ParoleProviderPlugin *provider, + ParoleProviderPlayer *player); +G_END_DECLS + +#endif /* __PAROLE_PLUGIN_IFACE_H__ */ diff --git a/parole/parole-stream.c b/parole/parole-stream.c new file mode 100644 index 0000000..97c773d --- /dev/null +++ b/parole/parole-stream.c @@ -0,0 +1,696 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include "parole-stream.h" +#include "parole-enum-types.h" + +#define PAROLE_STREAM_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_STREAM, ParoleStreamPrivate)) + +#define PAROLE_STREAM_FREE_STR_PROP(str) \ + if ( str ) \ + g_free (str); \ + str = NULL; \ + +#define PAROLE_STREAM_DUP_GVALUE_STRING(str, value) \ + PAROLE_STREAM_FREE_STR_PROP (str); \ + str = g_value_dup_string (value); \ + +typedef struct _ParoleStreamPrivate ParoleStreamPrivate; + +struct _ParoleStreamPrivate +{ + /*Properties*/ + gchar *uri; + gchar *subtitles; + gboolean has_audio; + gboolean has_video; + gboolean live; + gboolean seekable; + gboolean tag_available; + gint video_w; + gint video_h; + gint64 absolute_duration; + gint duration; + guint tracks; + guint track; + guint disp_par_n; + guint disp_par_d; + gchar *title; + gchar *artist; + gchar *year; + gchar *album; + gchar *comment; + + ParoleMediaType media_type; +}; + +enum +{ + PROP_0, + PROP_URI, + PROP_SUBTITLES, + PROP_LIVE, + PROP_MEDIA_TYPE, + PROP_HAS_AUDIO, + PROP_HAS_VIDEO, + PROP_SEEKABLE, + PROP_DISP_PAR_N, + PROP_DISP_PAR_D, + PROP_TRACKS, + PROP_TRACK, + PROP_TAG_AVAILABLE, + PROP_DURATION, + PROP_ABSOLUTE_DURATION, + PROP_VIDEO_WIDTH, + PROP_VIDEO_HEIGHT, + PROP_TITLE, + PROP_ARTIST, + PROP_YEAR, + PROP_ALBUM, + PROP_COMMENT +}; + +G_DEFINE_TYPE (ParoleStream, parole_stream, G_TYPE_OBJECT) + +static void +parole_stream_get_media_type_from_uri (ParoleStream *stream, const gchar *uri) +{ + GValue val = { 0, }; + + ParoleMediaType type = PAROLE_MEDIA_TYPE_UNKNOWN; + + if ( g_str_has_prefix (uri, "file:/") ) + type = PAROLE_MEDIA_TYPE_LOCAL_FILE; + else if ( g_str_has_prefix (uri, "dvd:/") ) + type = PAROLE_MEDIA_TYPE_DVD; + else if ( g_str_has_prefix (uri, "vcd:") ) + type = PAROLE_MEDIA_TYPE_VCD; + else if ( g_str_has_prefix (uri, "svcd:/") ) + type = PAROLE_MEDIA_TYPE_SVCD; + else if ( g_str_has_prefix (uri, "cdda:/") ) + type = PAROLE_MEDIA_TYPE_CDDA; + else if ( g_str_has_prefix (uri, "dvb:/") ) + type = PAROLE_MEDIA_TYPE_DVB; + else + type = PAROLE_MEDIA_TYPE_UNKNOWN; + + g_value_init (&val, PAROLE_ENUM_TYPE_MEDIA_TYPE); + g_value_set_enum (&val, type); + g_object_set_property (G_OBJECT (stream), "media-type", &val); + g_value_unset (&val); +} + +static void parole_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ParoleStream *stream; + stream = PAROLE_STREAM (object); + + switch (prop_id) + { + case PROP_URI: + { + ParoleStreamPrivate *priv; + priv = PAROLE_STREAM_GET_PRIVATE (stream); + priv->uri = g_value_dup_string (value); + parole_stream_get_media_type_from_uri (stream, priv->uri); + break; + } + case PROP_SUBTITLES: + PAROLE_STREAM_DUP_GVALUE_STRING (PAROLE_STREAM_GET_PRIVATE (stream)->subtitles, value); + break; + case PROP_LIVE: + { + ParoleStreamPrivate *priv; + gboolean maybe_remote; + + priv = PAROLE_STREAM_GET_PRIVATE (stream); + maybe_remote = priv->media_type == PAROLE_MEDIA_TYPE_REMOTE || + priv->media_type == PAROLE_MEDIA_TYPE_UNKNOWN; + priv->live = g_value_get_boolean (value) && maybe_remote; + break; + } + case PROP_MEDIA_TYPE: + PAROLE_STREAM_GET_PRIVATE (stream)->media_type = g_value_get_enum (value); + break; + case PROP_HAS_AUDIO: + PAROLE_STREAM_GET_PRIVATE (stream)->has_audio = g_value_get_boolean (value); + break; + case PROP_HAS_VIDEO: + PAROLE_STREAM_GET_PRIVATE (stream)->has_video = g_value_get_boolean (value); + break; + case PROP_SEEKABLE: + PAROLE_STREAM_GET_PRIVATE (stream)->seekable = g_value_get_boolean (value); + break; + case PROP_DISP_PAR_D: + PAROLE_STREAM_GET_PRIVATE (stream)->disp_par_d = g_value_get_uint (value); + break; + case PROP_DISP_PAR_N: + PAROLE_STREAM_GET_PRIVATE (stream)->disp_par_n = g_value_get_uint (value); + break; + case PROP_TRACKS: + PAROLE_STREAM_GET_PRIVATE (stream)->tracks = g_value_get_uint (value); + break; + case PROP_TRACK: + PAROLE_STREAM_GET_PRIVATE (stream)->track = g_value_get_uint (value); + break; + case PROP_TAG_AVAILABLE: + PAROLE_STREAM_GET_PRIVATE (stream)->tag_available = g_value_get_boolean (value); + break; + case PROP_DURATION: + PAROLE_STREAM_GET_PRIVATE (stream)->duration = g_value_get_int64 (value); + break; + case PROP_ABSOLUTE_DURATION: + PAROLE_STREAM_GET_PRIVATE (stream)->absolute_duration = g_value_get_int64 (value); + break; + case PROP_VIDEO_HEIGHT: + PAROLE_STREAM_GET_PRIVATE (stream)->video_h = g_value_get_int (value); + break; + case PROP_VIDEO_WIDTH: + PAROLE_STREAM_GET_PRIVATE (stream)->video_w = g_value_get_int (value); + break; + case PROP_TITLE: + PAROLE_STREAM_DUP_GVALUE_STRING (PAROLE_STREAM_GET_PRIVATE (stream)->title, value); + break; + case PROP_ARTIST: + PAROLE_STREAM_DUP_GVALUE_STRING (PAROLE_STREAM_GET_PRIVATE (stream)->artist, value); + break; + case PROP_YEAR: + PAROLE_STREAM_DUP_GVALUE_STRING (PAROLE_STREAM_GET_PRIVATE (stream)->year, value); + break; + case PROP_ALBUM: + PAROLE_STREAM_DUP_GVALUE_STRING (PAROLE_STREAM_GET_PRIVATE (stream)->album, value); + break; + case PROP_COMMENT: + PAROLE_STREAM_DUP_GVALUE_STRING (PAROLE_STREAM_GET_PRIVATE (stream)->comment, value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void parole_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ParoleStream *stream; + stream = PAROLE_STREAM (object); + + switch (prop_id) + { + case PROP_URI: + g_value_set_string (value, PAROLE_STREAM_GET_PRIVATE (stream)->uri); + break; + case PROP_SUBTITLES: + g_value_set_string (value, PAROLE_STREAM_GET_PRIVATE (stream)->subtitles); + break; + case PROP_LIVE: + g_value_set_boolean (value, PAROLE_STREAM_GET_PRIVATE (stream)->live); + break; + case PROP_MEDIA_TYPE: + g_value_set_enum (value, PAROLE_STREAM_GET_PRIVATE (stream)->media_type); + break; + case PROP_HAS_AUDIO: + g_value_set_boolean (value, PAROLE_STREAM_GET_PRIVATE (stream)->has_audio); + break; + case PROP_HAS_VIDEO: + g_value_set_boolean (value, PAROLE_STREAM_GET_PRIVATE (stream)->has_video); + break; + case PROP_SEEKABLE: + g_value_set_boolean (value, PAROLE_STREAM_GET_PRIVATE (stream)->seekable); + break; + case PROP_DISP_PAR_D: + g_value_set_uint (value, PAROLE_STREAM_GET_PRIVATE (stream)->disp_par_d); + break; + case PROP_DISP_PAR_N: + g_value_set_uint (value, PAROLE_STREAM_GET_PRIVATE (stream)->disp_par_n); + break; + case PROP_DURATION: + g_value_set_int64 (value, PAROLE_STREAM_GET_PRIVATE (stream)->duration); + break; + case PROP_TRACKS: + g_value_set_uint (value, PAROLE_STREAM_GET_PRIVATE (stream)->tracks); + break; + case PROP_TRACK: + g_value_set_uint (value, PAROLE_STREAM_GET_PRIVATE (stream)->track); + break; + case PROP_TAG_AVAILABLE: + g_value_set_double (value, PAROLE_STREAM_GET_PRIVATE (stream)->tag_available); + break; + case PROP_ABSOLUTE_DURATION: + g_value_set_int64 (value, PAROLE_STREAM_GET_PRIVATE (stream)->absolute_duration); + break; + case PROP_VIDEO_HEIGHT: + g_value_set_int (value, PAROLE_STREAM_GET_PRIVATE (stream)->video_h); + break; + case PROP_VIDEO_WIDTH: + g_value_set_int (value, PAROLE_STREAM_GET_PRIVATE (stream)->video_w); + break; + case PROP_TITLE: + g_value_set_string (value, PAROLE_STREAM_GET_PRIVATE (stream)->title); + break; + case PROP_ARTIST: + g_value_set_string (value, PAROLE_STREAM_GET_PRIVATE (stream)->artist); + break; + case PROP_YEAR: + g_value_set_string (value, PAROLE_STREAM_GET_PRIVATE (stream)->year); + break; + case PROP_ALBUM: + g_value_set_string (value, PAROLE_STREAM_GET_PRIVATE (stream)->album); + break; + case PROP_COMMENT: + g_value_set_string (value, PAROLE_STREAM_GET_PRIVATE (stream)->comment); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +parole_stream_finalize (GObject *object) +{ + ParoleStream *stream; + + stream = PAROLE_STREAM (object); + + parole_stream_init_properties (stream); + + G_OBJECT_CLASS (parole_stream_parent_class)->finalize (object); +} + +static void +parole_stream_class_init (ParoleStreamClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = parole_stream_finalize; + + object_class->get_property = parole_stream_get_property; + object_class->set_property = parole_stream_set_property; + + /** + * ParoleStream:uri: + * + * Currently loaded uri. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_URI, + g_param_spec_string ("uri", + "Uri", + "Uri", + NULL, + G_PARAM_READWRITE)); + + /** + * ParoleStream:subtitles: + * + * Subtitles path, this is only valid if the property + * "media-type" has the value PAROLE_MEDIA_TYPE_LOCAL_FILE. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_SUBTITLES, + g_param_spec_string ("subtitles", + "Subtitles", + "Subtitle file", + NULL, + G_PARAM_READWRITE)); + + /** + * ParoleStream:has-audio: + * + * Whether the stream has audio. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_HAS_AUDIO, + g_param_spec_boolean ("has-audio", + "Has audio", + "Has audio", + FALSE, + G_PARAM_READWRITE)); + /** + * ParoleStream:has-video: + * + * Whether the stream has video. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_HAS_VIDEO, + g_param_spec_boolean ("has-video", + "Has video", + "Has video", + FALSE, + G_PARAM_READWRITE)); + + /** + * ParoleStream:live: + * + * Whether the stream is a live stream. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_LIVE, + g_param_spec_boolean ("live", + "Live", + "Live", + FALSE, + G_PARAM_READWRITE)); + + /** + * ParoleStream:media-type: + * + * The media type. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_MEDIA_TYPE, + g_param_spec_enum ("media-type", + "Media type", + "Media type", + PAROLE_ENUM_TYPE_MEDIA_TYPE, + PAROLE_MEDIA_TYPE_UNKNOWN, + G_PARAM_READWRITE)); + + /** + * ParoleStream:seekable: + * + * Whether the stream is seekable, for example live + * streams are not seekable. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_SEEKABLE, + g_param_spec_boolean ("seekable", + "Seekable", + "Seekable", + FALSE, + G_PARAM_READWRITE)); + + /** + * ParoleStream:duration: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_DURATION, + g_param_spec_int64 ("duration", + "Duration", + "Duration", + 0, G_MAXINT64, + 0, + G_PARAM_READWRITE)); + + /** + * ParoleStream:tag-available: + * + * Whether tags information are available on the current stream. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_TAG_AVAILABLE, + g_param_spec_boolean ("tag-available", + "Tag available", + "Tag available", + FALSE, + G_PARAM_READWRITE)); + + /** + * ParoleStream:absolute-duration: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_ABSOLUTE_DURATION, + g_param_spec_int64 ("absolute-duration", + "Absolution duration", + "Absolution duration", + 0, G_MAXINT64, + 0, + G_PARAM_READWRITE)); + + /** + * ParoleStream:disp-par-n: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_DISP_PAR_N, + g_param_spec_uint ("disp-par-n", + "Disp par n", + "Disp par n", + 1, G_MAXUINT, + 1, + G_PARAM_READWRITE)); + + /** + * ParoleStream:disp-par-n: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_DISP_PAR_D, + g_param_spec_uint ("disp-par-d", + "Disp par d", + "Disp par d", + 1, G_MAXUINT, + 1, + G_PARAM_READWRITE)); + + /** + * ParoleStream:video-width: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_VIDEO_WIDTH, + g_param_spec_int ("video-width", + "Video width", + "Video width", + 0, G_MAXINT, + 0, + G_PARAM_READWRITE)); + + /** + * ParoleStream:video-height: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_VIDEO_HEIGHT, + g_param_spec_int ("video-height", + "Video height", + "Video height", + 0, G_MAXINT, + 0, + G_PARAM_READWRITE)); + + /** + * ParoleStream:num-tracks: + * + * Number of tracks in the cdda source, only valid if + * ParoleStream:media-type: is PAROLE_MEDIA_TYPE_CDDA. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_TRACKS, + g_param_spec_uint ("num-tracks", + "Num tracks", + "Number of tracks in the audio disc", + 1, 99, + 1, + G_PARAM_READWRITE)); + + /** + * ParoleStream:track: + * + * Currently playing track, this is only valid if + * #ParoleStream:media-type: is PAROLE_MEDIA_TYPE_CDDA. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_TRACK, + g_param_spec_uint ("track", + "Track", + "Track", + 1, 99, + 1, + G_PARAM_READWRITE)); + /** + * ParoleStream:title: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_TITLE, + g_param_spec_string ("title", + "Title", + "Title", + NULL, + G_PARAM_READWRITE)); + + + /** + * ParoleStream:artist: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_ARTIST, + g_param_spec_string ("artist", + "Artist", + "Artist", + NULL, + G_PARAM_READWRITE)); + + /** + * ParoleStream:year: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_YEAR, + g_param_spec_string ("year", + "Year", + "Year", + NULL, + G_PARAM_READWRITE)); + + /** + * ParoleStream:album: + * + * + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_ALBUM, + g_param_spec_string ("album", + "Album", + "Album", + NULL, + G_PARAM_READWRITE)); + + /** + * ParoleStream:comment: + * + * Extra comment block. + * + * Since: 0.2 + **/ + g_object_class_install_property (object_class, + PROP_COMMENT, + g_param_spec_string ("comment", + "Comment", + "Comment", + NULL, + G_PARAM_READWRITE)); + + g_type_class_add_private (klass, sizeof (ParoleStreamPrivate)); +} + +static void +parole_stream_init (ParoleStream *stream) +{ + parole_stream_init_properties (stream); +} + +ParoleStream * +parole_stream_new (void) +{ + ParoleStream *stream = NULL; + stream = g_object_new (PAROLE_TYPE_STREAM, NULL); + return stream; +} + +void parole_stream_init_properties (ParoleStream *stream) +{ + ParoleStreamPrivate *priv; + + priv = PAROLE_STREAM_GET_PRIVATE (stream); + + priv->live = FALSE; + priv->seekable = FALSE; + priv->has_audio = FALSE; + priv->has_video = FALSE; + priv->absolute_duration = 0; + priv->duration = 0; + priv->tag_available = FALSE; + priv->media_type = PAROLE_MEDIA_TYPE_UNKNOWN; + priv->video_h = 0; + priv->video_w = 0; + priv->tracks = 1; + priv->track = 1; + priv->disp_par_n = 1; + priv->disp_par_d = 1; + + PAROLE_STREAM_FREE_STR_PROP (priv->title); + PAROLE_STREAM_FREE_STR_PROP (priv->uri); + PAROLE_STREAM_FREE_STR_PROP (priv->subtitles); + PAROLE_STREAM_FREE_STR_PROP (priv->artist); + PAROLE_STREAM_FREE_STR_PROP (priv->year); + PAROLE_STREAM_FREE_STR_PROP (priv->album); + PAROLE_STREAM_FREE_STR_PROP (priv->comment); +} diff --git a/parole/parole-stream.h b/parole/parole-stream.h new file mode 100644 index 0000000..c61d01e --- /dev/null +++ b/parole/parole-stream.h @@ -0,0 +1,71 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#if !defined (__PAROLE_H_INSIDE__) && !defined (PAROLE_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __PAROLE_STREAM_H +#define __PAROLE_STREAM_H + +#include + +G_BEGIN_DECLS + +#define PAROLE_TYPE_STREAM (parole_stream_get_type () ) +#define PAROLE_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_STREAM, ParoleStream)) +#define PAROLE_IS_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_STREAM)) + +typedef enum +{ + PAROLE_MEDIA_TYPE_UNKNOWN, + PAROLE_MEDIA_TYPE_LOCAL_FILE, + PAROLE_MEDIA_TYPE_CDDA, + PAROLE_MEDIA_TYPE_VCD, + PAROLE_MEDIA_TYPE_SVCD, + PAROLE_MEDIA_TYPE_DVD, + PAROLE_MEDIA_TYPE_DVB, + PAROLE_MEDIA_TYPE_REMOTE + +} ParoleMediaType; + +typedef struct _ParoleStream ParoleStream; +typedef struct _ParoleStreamClass ParoleStreamClass; + +struct _ParoleStream +{ + GObject parent; + +}; + +struct _ParoleStreamClass +{ + GObjectClass parent_class; +}; + +GType parole_stream_get_type (void) G_GNUC_CONST; + +ParoleStream *parole_stream_new (void); + +void parole_stream_init_properties (ParoleStream *stream); + +G_END_DECLS + +#endif /* __PAROLE_STREAM_H */ diff --git a/parole/parole.h.in b/parole/parole.h.in new file mode 100644 index 0000000..64f8fdd --- /dev/null +++ b/parole/parole.h.in @@ -0,0 +1,188 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 __PAROLE_H_ +#define __PAROLE_H_ + +#define __PAROLE_H_INSIDE__ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#define PAROLE_MAJOR_VERSION @PAROLE_VERSION_MAJOR@ +#define PAROLE_MINOR_VERSION @PAROLE_VERSION_MINOR@ +#define PAROLE_MICRO_VERSION @PAROLE_VERSION_MICRO@ + +/** + * PAROLE_CHECK_VERSION: + * @major: major version number. + * @minor: minor version number. + * @micro: micor version number. + * + * Checks the parole version. + * + * Since: 0.2 + */ +#define PAROLE_CHECK_VERSION(major,minor,micro) \ + (PAROLE_MAJOR_VERSION > (major) || \ + (PAROLE_MAJOR_VERSION == (major) && PAROLE_MINOR_VERSION > (minor)) || \ + (PAROLE_MAJOR_VERSION == (major) && PAROLE_MINOR_VERSION == (minor) && \ + PAROLE_MICRO_VERSION >= (micro))) + +/* + * GType module registration macros. + */ +/** + * PAROLE_DEFINE_TYPE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words separated by '_'. + * @T_P: The #GType of the parent type. + * + * Since: 0.2 + */ +#define PAROLE_DEFINE_TYPE(TN, t_n, T_P) PAROLE_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {}) + +/** + * PAROLE_DEFINE_TYPE_EXTENDED: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words separated by '_'. + * @T_P: The #GType of the parent type. + * @_f_: #GTypeFlags to pass to g_type_module_register_type (). + * @_C_: Custom code that gets inserted in *_get_type() function. + * + * Since: 0.2 + */ +#define PAROLE_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_) _PAROLE_DEFINE_TYPE_EXTENDED_BEGIN(TN, t_n, T_P, _f_) {_C_;} _PAROLE_DEFINE_TYPE_EXTENDED_END() + +/** + * PAROLE_DEFINE_TYPE_WITH_CODE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words separated by '_'. + * @T_P: The #GType of the parent type. + * @_C_: Custom code that gets inserted in *_get_type() function. + * + * Since: 0.2 + */ +#define PAROLE_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _PAROLE_DEFINE_TYPE_EXTENDED_BEGIN(TN, t_n, T_P, 0) {_C_;} _PAROLE_DEFINE_TYPE_EXTENDED_END() + +/** + * PAROLE_DEFINE_ABSTRACT_TYPE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words separated by '_'. + * @T_P: The #GType of the parent type. + * + * Since: 0.2 + */ +#define PAROLE_DEFINE_ABSTRACT_TYPE(TN, t_n, T_P) PAROLE_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, {}) + +/** + * PAROLE_DEFINE_ABSTRACT_TYPE_WITH_CODE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words separated by '_'. + * @T_P: The #GType of the parent type. + * @_C_: Custom code that gets inserted in *_get_type() function. + * + * Since: 0.2 + */ +#define PAROLE_DEFINE_ABSTRACT_TYPE_WITH_CODE(TN, t_n, T_P, _C_) PAROLE_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, _C_) + + +#define _PAROLE_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \ + \ +static gpointer type_name##_parent_class = NULL; \ +static GType type_name##_type = G_TYPE_INVALID; \ + \ +static void type_name##_init (TypeName *self); \ +static void type_name##_class_init (TypeName##Class *klass); \ +static void type_name##_class_intern_init (TypeName##Class *klass) \ +{ \ + type_name##_parent_class = g_type_class_peek_parent (klass); \ + type_name##_class_init (klass); \ +} \ + \ +GType \ +type_name##_get_type (void) \ +{ \ + return type_name##_type; \ +} \ + \ +void \ +type_name##_register_type (ParoleProviderPlugin *provider_plugin_def) \ +{ \ + GType parole_define_type_id; \ + \ + static const GTypeInfo parole_define_type_info = \ + { \ + sizeof (TypeName##Class), \ + NULL, \ + NULL, \ + (GClassInitFunc) type_name##_class_intern_init, \ + NULL, \ + NULL, \ + sizeof (TypeName), \ + 0, \ + (GInstanceInitFunc) type_name##_init, \ + NULL, \ + }; \ + \ + parole_define_type_id = \ + g_type_module_register_type ((GTypeModule*)provider_plugin_def, \ + TYPE_PARENT, \ + #TypeName, \ + &parole_define_type_info, \ + flags); \ + type_name##_type = parole_define_type_id; \ + \ + { /* Code */ +#define _PAROLE_DEFINE_TYPE_EXTENDED_END() \ + } \ +} + +/** + * PAROLE_IMPLEMENT_INTERFACE: + * @TYPE_IFACE: the #GType of the interface to add. + * @iface_init: The interface init function. + */ +#define PAROLE_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) \ +{ \ + static const GInterfaceInfo parole_implement_interface_info = \ + { \ + (GInterfaceInitFunc) iface_init \ + }; \ + \ + g_type_module_add_interface ((GTypeModule*)provider_plugin_def, \ + parole_define_type_id, \ + TYPE_IFACE, \ + &parole_implement_interface_info); \ +} + + +#undef __PAROLE_H_INSIDE__ + +#endif /*__PAROLE_H_*/ diff --git a/plugins/Makefile.am b/plugins/Makefile.am new file mode 100644 index 0000000..a122328 --- /dev/null +++ b/plugins/Makefile.am @@ -0,0 +1,17 @@ +SUBDIRS = sample + +if PAROLE_PROPERTIES_PLUGIN +SUBDIRS+=properties +endif + +if PAROLE_TRAY_PLUGIN +SUBDIRS+=tray +endif + +if WINDOW_TITLE_PLUGIN +SUBDIRS+=window-title +endif + +if POWER_MANAGER_PLUGIN +SUBDIRS+=power-manager +endif \ No newline at end of file diff --git a/plugins/power-manager/Makefile.am b/plugins/power-manager/Makefile.am new file mode 100644 index 0000000..7e0cb2b --- /dev/null +++ b/plugins/power-manager/Makefile.am @@ -0,0 +1,44 @@ +INCLUDES = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DG_LOG_DOMAIN=\"power-manager_plugin\" \ + -DLIBEXECDIR=\"$(libexecdir)\" \ + -DPACKAGE_LOCALE_DIR=\"$(localedir)\" + +pluginsdir = \ + $(libdir)/parole-$(PAROLE_VERSION_API) + +plugins_LTLIBRARIES = \ + power-manager-plugin.la + +power_manager_plugin_la_SOURCES = \ + power-manager-plugin.c \ + power-manager-provider.c \ + power-manager-provider.h + +power_manager_plugin_la_CFLAGS = \ + $(PLATFORM_CFLAGS) \ + $(GTK_CFLAGS) \ + $(LIBXFCE4UTIL_CFLAGS) \ + $(DBUS_GLIB_CFLAGS) + + +power_manager_plugin_la_LDFLAGS = \ + -avoid-version \ + -export-dynamic \ + -module \ + $(PLATFORM_LDFLAGS) + +# +# .desktop file +# +desktop_in_files = power-manager.desktop.in +desktopdir = $(datadir)/parole/parole-plugins-$(PAROLE_VERSION_API) +desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) +@INTLTOOL_DESKTOP_RULE@ + +EXTRA_DIST = \ + $(desktop_in_files) + +DISTCLEANFILES = \ + $(desktop_DATA) \ No newline at end of file diff --git a/plugins/power-manager/power-manager-plugin.c b/plugins/power-manager/power-manager-plugin.c new file mode 100644 index 0000000..8482fa6 --- /dev/null +++ b/plugins/power-manager/power-manager-plugin.c @@ -0,0 +1,45 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "power-manager-provider.h" + +G_MODULE_EXPORT GType parole_plugin_initialize (ParoleProviderPlugin *plugin); + +G_MODULE_EXPORT void parole_plugin_shutdown (void); + +G_MODULE_EXPORT GType +parole_plugin_initialize (ParoleProviderPlugin *plugin) +{ + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + pm_provider_register_type (plugin); + return PM_TYPE_PROVIDER; +} + +G_MODULE_EXPORT void +parole_plugin_shutdown (void) +{ + +} diff --git a/plugins/power-manager/power-manager-provider.c b/plugins/power-manager/power-manager-provider.c new file mode 100644 index 0000000..5e7f679 --- /dev/null +++ b/plugins/power-manager/power-manager-provider.c @@ -0,0 +1,213 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#include "power-manager-provider.h" + +static void pm_provider_iface_init (ParoleProviderPluginIface *iface); +static void pm_provider_finalize (GObject *object); + + +struct _PmProviderClass +{ + GObjectClass parent_class; +}; + +struct _PmProvider +{ + GObject parent; + + + DBusGConnection *bus; + DBusGProxy *proxy; + ParoleProviderPlayer *player; + guint cookie; + gboolean inhibitted; +}; + +PAROLE_DEFINE_TYPE_WITH_CODE (PmProvider, + pm_provider, + G_TYPE_OBJECT, + PAROLE_IMPLEMENT_INTERFACE (PAROLE_TYPE_PROVIDER_PLUGIN, + pm_provider_iface_init)); + +static void +pm_provider_inhibit (PmProvider *provider) +{ + GError *error = NULL; + +#ifdef debug + if ( G_UNLIKELY (provider->inhibitted) ) + { + g_warning ("Power manager already inhibitted!!!"); + return; + } +#endif + + if ( provider->proxy ) + { + TRACE ("Inhibit"); + provider->inhibitted = dbus_g_proxy_call (provider->proxy, "Inhibit", &error, + G_TYPE_STRING , "Parole", + G_TYPE_STRING, "Playing DVD", + G_TYPE_INVALID, + G_TYPE_UINT, &provider->cookie, + G_TYPE_INVALID); + } + + if ( error ) + { + g_warning ("Unable to inhibit the power manager : %s", error->message); + g_error_free (error); + } +} + +static void +pm_provider_uninhibit (PmProvider *provider) +{ + if ( provider->inhibitted && provider->cookie != 0 && provider->proxy ) + { + GError *error = NULL; + + TRACE ("UnInhibit"); + + dbus_g_proxy_call (provider->proxy, "UnInhibit", &error, + G_TYPE_UINT, provider->cookie, + G_TYPE_INVALID, + G_TYPE_INVALID); + + if ( error ) + { + g_warning ("Unable to inhibit the power manager : %s", error->message); + g_error_free (error); + } + + provider->inhibitted = FALSE; + provider->cookie = 0; + } +} + +static void +pm_provider_state_changed_cb (ParoleProviderPlayer *player, + const ParoleStream *stream, + ParoleState state, + PmProvider *provider) +{ + ParoleMediaType media_type; + + g_object_get (G_OBJECT (stream), + "media-type", &media_type, + NULL); + + if ( (state == PAROLE_STATE_PLAYING) && + ( media_type == PAROLE_MEDIA_TYPE_VCD || + media_type == PAROLE_MEDIA_TYPE_DVB || + media_type == PAROLE_MEDIA_TYPE_DVD) ) + { + pm_provider_inhibit (provider); + } + else + { + pm_provider_uninhibit (provider); + } +} + +static gboolean pm_provider_is_configurable (ParoleProviderPlugin *plugin) +{ + return FALSE; +} + +static void +pm_provider_set_player (ParoleProviderPlugin *plugin, ParoleProviderPlayer *player) +{ + PmProvider *provider; + provider = PM_PROVIDER (plugin); + + provider->player = player; + + g_signal_connect (player, "state-changed", + G_CALLBACK (pm_provider_state_changed_cb), provider); +} + +static void +pm_provider_iface_init (ParoleProviderPluginIface *iface) +{ + iface->get_is_configurable = pm_provider_is_configurable; + iface->set_player = pm_provider_set_player; +} + +static void pm_provider_class_init (PmProviderClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = pm_provider_finalize; +} + +static void pm_provider_init (PmProvider *provider) +{ + GError *error = NULL; + provider->player = NULL; + provider->cookie = 0; + provider->proxy = NULL; + provider->inhibitted = FALSE; + + provider->bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); + + if ( error ) + { + g_warning ("Unable to get session bus : %s", error->message); + g_error_free (error); + return; + } + + provider->proxy = dbus_g_proxy_new_for_name (provider->bus, + "org.freedesktop.PowerManagement", + "/org/freedesktop/PowerManagement/Inhibit", + "org.freedesktop.PowerManagement.Inhibit"); + + if ( !provider->proxy ) + { + g_warning ("Unable to get proxy for interface 'org.freedesktop.PowerManagement.Inhibit'"); + } +} + +static void pm_provider_finalize (GObject *object) +{ + PmProvider *provider; + + provider = PM_PROVIDER (object); + + pm_provider_uninhibit (provider); + + if ( provider->proxy ) + g_object_unref (provider->proxy); + + if ( provider->bus ) + dbus_g_connection_unref (provider->bus); + + G_OBJECT_CLASS (pm_provider_parent_class)->finalize (object); +} diff --git a/plugins/power-manager/power-manager-provider.h b/plugins/power-manager/power-manager-provider.h new file mode 100644 index 0000000..e5a1e99 --- /dev/null +++ b/plugins/power-manager/power-manager-provider.h @@ -0,0 +1,44 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 PM_PROVIDER_H_ +#define PM_PROVIDER_H_ + +#include + +G_BEGIN_DECLS + +typedef struct _PmProviderClass PmProviderClass; +typedef struct _PmProvider PmProvider; + +#define PM_TYPE_PROVIDER (pm_provider_get_type ()) +#define PM_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PM_TYPE_PROVIDER, PmProvider)) +#define PM_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PM_TYPE_PROVIDER, PmProviderClass)) +#define PM_IS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PM_TYPE_PROVIDER)) +#define PM_IS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PM_TYPE_PROVIDER)) +#define PM_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PM_TYPE_PROVIDER, PmProviderClass)) + +GType pm_provider_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL; + +void pm_provider_register_type (ParoleProviderPlugin *plugin); + +G_END_DECLS + +#endif /*PM_PROVIDER_H_*/ diff --git a/plugins/power-manager/power-manager.desktop.in b/plugins/power-manager/power-manager.desktop.in new file mode 100644 index 0000000..4dbb26f --- /dev/null +++ b/plugins/power-manager/power-manager.desktop.in @@ -0,0 +1,6 @@ +[Parole Plugin] +Module=power-manager-plugin +_Name=Power Manager Plugin +_Description=Inhibit Power Manager from suspending the machine while playing DVD. +Authors=Ali Abdallah aliov@xfce.org +Website=http://goodies.xfce.org/projects/applications/parole diff --git a/plugins/properties/Makefile.am b/plugins/properties/Makefile.am new file mode 100644 index 0000000..f4169d0 --- /dev/null +++ b/plugins/properties/Makefile.am @@ -0,0 +1,46 @@ +INCLUDES = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DG_LOG_DOMAIN=\"stream_properties\" \ + -DLIBEXECDIR=\"$(libexecdir)\" \ + -DPACKAGE_LOCALE_DIR=\"$(localedir)\" + +pluginsdir = \ + $(libdir)/parole-$(PAROLE_VERSION_API) + +plugins_LTLIBRARIES = \ + stream-properties.la + +stream_properties_la_SOURCES = \ + stream-properties-plugin.c \ + stream-properties-provider.c \ + stream-properties-provider.h + +stream_properties_la_CFLAGS = \ + $(PLATFORM_CFLAGS) \ + $(GTK_CFLAGS) \ + $(TAGLIBC_CFLAGS) \ + $(LIBXFCE4UTIL_CFLAGS) + +stream_properties_la_LIBADD = \ + $(TAGLIBC_LIBS) + +stream_properties_la_LDFLAGS = \ + -avoid-version \ + -export-dynamic \ + -module \ + $(PLATFORM_LDFLAGS) + +# +# .desktop file +# +desktop_in_files = stream-properties.desktop.in +desktopdir = $(datadir)/parole/parole-plugins-$(PAROLE_VERSION_API) +desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) +@INTLTOOL_DESKTOP_RULE@ + +EXTRA_DIST = \ + $(desktop_in_files) + +DISTCLEANFILES = \ + $(desktop_DATA) diff --git a/plugins/properties/stream-properties-plugin.c b/plugins/properties/stream-properties-plugin.c new file mode 100644 index 0000000..0a29cea --- /dev/null +++ b/plugins/properties/stream-properties-plugin.c @@ -0,0 +1,45 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "stream-properties-provider.h" + +G_MODULE_EXPORT GType parole_plugin_initialize (ParoleProviderPlugin *plugin); + +G_MODULE_EXPORT void parole_plugin_shutdown (void); + +G_MODULE_EXPORT GType +parole_plugin_initialize (ParoleProviderPlugin *plugin) +{ + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + stream_properties_register_type (plugin); + return STREAM_TYPE_PROPERTIES_PROVIDER; +} + +G_MODULE_EXPORT void +parole_plugin_shutdown (void) +{ + +} diff --git a/plugins/properties/stream-properties-provider.c b/plugins/properties/stream-properties-provider.c new file mode 100644 index 0000000..d6ab5be --- /dev/null +++ b/plugins/properties/stream-properties-provider.c @@ -0,0 +1,556 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#ifdef HAVE_TAGLIBC +#include +#endif + +#include + +#include "stream-properties-provider.h" + +static void stream_properties_iface_init (ParoleProviderPluginIface *iface); +static void stream_properties_finalize (GObject *object); + + +struct _StreamPropertiesClass +{ + GObjectClass parent_class; +}; + +struct _StreamProperties +{ + GObject parent; + ParoleProviderPlayer *player; + GtkWidget *title; + GtkWidget *artist; + GtkWidget *album; + GtkWidget *year; + +#ifdef HAVE_TAGLIBC + GtkWidget *save; + TagLib_File *tag_file; + gchar *filename; + guint changed; + gboolean need_save; +#endif + gboolean block_edit_signal; + +}; + +PAROLE_DEFINE_TYPE_WITH_CODE (StreamProperties, + stream_properties, + G_TYPE_OBJECT, + PAROLE_IMPLEMENT_INTERFACE (PAROLE_TYPE_PROVIDER_PLUGIN, + stream_properties_iface_init)); + +enum +{ + TITLE_ENTRY_EDITED = (1 << 1), + ARTIST_ENTRY_EDITED = (1 << 2), + ALBUM_ENTRY_EDITED = (1 << 3), + YEAR_ENTRY_EDITED = (1 << 4) +}; + +static void +set_widget_text (StreamProperties *data, GtkWidget *widget, const gchar *text) +{ + data->block_edit_signal = TRUE; +#ifdef HAVE_TAGLIBC + gtk_entry_set_text (GTK_ENTRY (widget), text); +#else + gtk_label_set_text (GTK_LABEL (widget), text); +#endif + data->block_edit_signal = FALSE; +} + +#ifdef HAVE_TAGLIBC +static void +title_entry_edited (StreamProperties *prop) +{ + if (!prop->block_edit_signal) + prop->changed |= TITLE_ENTRY_EDITED; +} + +static void +artist_entry_edited (StreamProperties *prop) +{ + if (!prop->block_edit_signal) + prop->changed |= ARTIST_ENTRY_EDITED; +} + +static void +album_entry_edited (StreamProperties *prop) +{ + if (!prop->block_edit_signal) + prop->changed |= ALBUM_ENTRY_EDITED; +} + +static void +year_entry_edited (StreamProperties *prop) +{ + if (!prop->block_edit_signal) + prop->changed |= YEAR_ENTRY_EDITED; +} +#endif + + +static GtkWidget * +new_tag_widget (void) +{ + GtkWidget *widget; + +#ifdef HAVE_TAGLIBC + widget = gtk_entry_new (); +#else + widget = gtk_label_new (NULL); +#endif + return widget; +} + +static void +init_media_tag_entries (StreamProperties *data) +{ + set_widget_text (data, data->title, _("Unknown")); + set_widget_text (data, data->artist, _("Unknown")); + set_widget_text (data, data->album, _("Unknown")); + set_widget_text (data, data->year, _("Unknown")); + +#ifdef HAVE_TAGLIBC + gtk_widget_set_tooltip_text (data->save, NULL); + data->changed = 0; + data->need_save = FALSE; + if ( data->filename ) + { + g_free (data->filename); + data->filename = NULL; + } + + if ( data->tag_file ) + { + taglib_file_free (data->tag_file); + data->tag_file = NULL; + } +#endif +} + +#ifdef HAVE_TAGLIBC +static void +save_media_tags (StreamProperties *data) +{ + TagLib_Tag *tag; + const gchar *entry; + gboolean save = FALSE; + + if ( !data->tag_file ) + return; + + if ( !data->need_save ) + return; + + tag = taglib_file_tag (data->tag_file); + + if ( !tag ) + return; + + if ( data->changed & TITLE_ENTRY_EDITED ) + { + g_debug ("Saving Title"); + entry = gtk_entry_get_text (GTK_ENTRY (data->title)); + taglib_tag_set_title (tag, entry); + save = TRUE; + } + + if ( data->changed & ARTIST_ENTRY_EDITED ) + { + g_debug ("Saving Artist"); + entry = gtk_entry_get_text (GTK_ENTRY (data->artist)); + taglib_tag_set_artist (tag, entry); + save = TRUE; + } + + if ( data->changed & ALBUM_ENTRY_EDITED ) + { + g_debug ("Saving Album"); + entry = gtk_entry_get_text (GTK_ENTRY (data->album)); + taglib_tag_set_album (tag, entry); + save = TRUE; + } + + if ( data->changed & YEAR_ENTRY_EDITED ) + { + g_debug ("Saving Year"); + entry = gtk_entry_get_text (GTK_ENTRY (data->year)); + taglib_tag_set_year (tag, (guint) atoi (entry)); + save = TRUE; + } + + if ( save ) + taglib_file_save (data->tag_file); + + data->changed = 0; + data->need_save = FALSE; + + taglib_tag_free_strings (); +} +#endif + + +#ifdef HAVE_TAGLIBC +static void +save_media_clicked_cb (StreamProperties *data) +{ + data->need_save = TRUE; +} +#endif + +static GtkWidget * +stream_properties_create_widgets (StreamProperties *prop) +{ + PangoFontDescription *pfd; + + GtkWidget *frame; + GtkWidget *label; + GtkWidget *vbox; + GtkWidget *table; + GtkWidget *align; + guint i = 0; + + vbox = gtk_vbox_new (FALSE, 0); + table = gtk_table_new (5, 2, FALSE); + pfd = pango_font_description_from_string("bold"); + + /* + * Title + */ + align = gtk_alignment_new (0.0, 0.5, 0, 0); + + label = gtk_label_new (_("Title:")); + gtk_container_add (GTK_CONTAINER(align), label); + gtk_widget_modify_font (label, pfd); + + gtk_table_attach (GTK_TABLE(table), align, + 0, 1, i, i+1, + GTK_SHRINK, GTK_SHRINK, + 2, 8); + + prop->title = new_tag_widget (); + align = gtk_alignment_new (0.0, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (align), prop->title); + gtk_table_attach (GTK_TABLE (table), align, + 1, 2, i, i+1, + GTK_SHRINK, GTK_SHRINK, + 2, 8); + i++; + + /* + * Artist + */ + align = gtk_alignment_new (0.0, 0.5, 0, 0); + + label = gtk_label_new (_("Artist:")); + gtk_container_add (GTK_CONTAINER(align), label); + gtk_widget_modify_font (label, pfd); + + gtk_table_attach (GTK_TABLE(table), align, + 0, 1, i, i+1, + GTK_SHRINK, GTK_SHRINK, + 2, 8); + + prop->artist = new_tag_widget (); + align = gtk_alignment_new (0.0, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (align), prop->artist); + gtk_table_attach (GTK_TABLE (table), align, + 1, 2, i, i+1, + GTK_SHRINK, GTK_SHRINK, + 2, 8); + i++; + + /* + * Album + */ + align = gtk_alignment_new (0.0, 0.5, 0, 0); + + label = gtk_label_new (_("Album:")); + gtk_container_add (GTK_CONTAINER(align), label); + gtk_widget_modify_font (label, pfd); + + gtk_table_attach (GTK_TABLE(table), align, + 0, 1, i, i+1, + GTK_SHRINK, GTK_SHRINK, + 2, 8); + + prop->album = new_tag_widget (); + align = gtk_alignment_new (0.0, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (align), prop->album); + gtk_table_attach (GTK_TABLE (table), align, + 1, 2, i, i+1, + GTK_SHRINK, GTK_SHRINK, + 2, 8); + i++; + + /* + * Year + */ + align = gtk_alignment_new (0.0, 0.5, 0, 0); + + label = gtk_label_new (_("Year:")); + gtk_container_add (GTK_CONTAINER (align), label); + gtk_widget_modify_font (label, pfd); + + gtk_table_attach (GTK_TABLE(table), align, + 0, 1, i, i+1, + GTK_SHRINK, GTK_SHRINK, + 2, 8); + + prop->year = new_tag_widget (); + align = gtk_alignment_new (0.0, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (align), prop->year); + gtk_table_attach (GTK_TABLE (table), align, + 1, 2, i, i+1, + GTK_SHRINK, GTK_SHRINK, + 2, 8); + i++; + + frame = gtk_frame_new (_("General")); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); + +#ifdef HAVE_TAGLIBC + prop->save = gtk_button_new_from_stock (GTK_STOCK_APPLY); + i++; + align = gtk_alignment_new (0.0, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (align), prop->save); + gtk_table_attach (GTK_TABLE (table), align, + 1, 2, i, i+1, + GTK_SHRINK, GTK_SHRINK, + 2, 8); + + g_signal_connect_swapped (prop->save, "clicked", + G_CALLBACK (save_media_clicked_cb), prop); + + g_signal_connect_swapped (prop->title, "changed", + G_CALLBACK (title_entry_edited), prop); + + g_signal_connect_swapped (prop->artist, "changed", + G_CALLBACK (artist_entry_edited), prop); + + g_signal_connect_swapped (prop->album, "changed", + G_CALLBACK (album_entry_edited), prop); + + g_signal_connect_swapped (prop->year, "changed", + G_CALLBACK (year_entry_edited), prop); + +#endif + init_media_tag_entries (prop); + return vbox; +} + +static void +state_changed_cb (ParoleProviderPlayer *player, const ParoleStream *stream, + ParoleState state, StreamProperties *prop) +{ +#ifdef HAVE_TAGLIBC + save_media_tags (prop); +#endif + + if ( state <= PAROLE_STATE_PLAYBACK_FINISHED ) + init_media_tag_entries (prop); +} + +#ifdef HAVE_TAGLIBC +static void +disable_tag_save (GtkWidget *widget) +{ + gtk_widget_set_sensitive (widget, FALSE); + gtk_widget_set_tooltip_text (widget, _("Stream doesn't support tags changes")); +} + +static void +enable_tag_save (GtkWidget *widget) +{ + gtk_widget_set_sensitive (widget, TRUE); + gtk_widget_set_tooltip_text (widget, _("Save media tags changes")); +} +#endif + +static void +tag_message_cb (ParoleProviderPlayer *player, const ParoleStream *stream, StreamProperties *prop) +{ + gchar *str = NULL; +#ifdef HAVE_TAGLIBC + ParoleMediaType media_type; + gchar *uri = NULL; + GError *error = NULL; + gboolean sensitive; +#endif + + g_object_get (G_OBJECT (stream), + "title", &str, +#ifdef HAVE_TAGLIBC + "uri", &uri, + "media-type", &media_type, +#endif + NULL); + +#ifdef HAVE_TAGLIBC + if ( prop->filename ) + { + g_free (prop->filename); + prop->filename = NULL; + } + + if ( prop->tag_file ) + { + taglib_file_free (prop->tag_file); + prop->tag_file = NULL; + } + + if ( media_type == PAROLE_MEDIA_TYPE_LOCAL_FILE ) + { + prop->filename = g_filename_from_uri (uri, NULL, &error); + + if ( G_UNLIKELY (error) ) + { + g_critical ("Unablet to convert uri : %s to filename : %s", uri, error->message); + g_error_free (error); + disable_tag_save (prop->save); + } + else + { + prop->tag_file = taglib_file_new (prop->filename); + + if ( !prop->tag_file ) + disable_tag_save (prop->save); + else + enable_tag_save (prop->save); + } + } + + sensitive = media_type = PAROLE_MEDIA_TYPE_LOCAL_FILE; + gtk_widget_set_sensitive (prop->title, sensitive); + gtk_widget_set_sensitive (prop->artist, sensitive); + gtk_widget_set_sensitive (prop->album, sensitive); + gtk_widget_set_sensitive (prop->year, sensitive); + gtk_widget_set_sensitive (prop->save, sensitive); +#endif + + if ( str ) + { + set_widget_text (prop, prop->title, str); + g_free (str); + } + + g_object_get (G_OBJECT (stream), + "artist", &str, + NULL); + + if ( str ) + { + set_widget_text (prop, prop->artist, str); + g_free (str); + } + + g_object_get (G_OBJECT (stream), + "year", &str, + NULL); + + if ( str ) + { + set_widget_text (prop, prop->year, str); + g_free (str); + } + + g_object_get (G_OBJECT (stream), + "album", &str, + NULL); + + if ( str ) + { + set_widget_text (prop, prop->album, str); + g_free (str); + } + +#ifdef HAVE_TAGLIBC + if ( uri ) + g_free (uri); +#endif + +} + +static gboolean stream_properties_is_configurable (ParoleProviderPlugin *plugin) +{ + return FALSE; +} + +static void +stream_properties_set_player (ParoleProviderPlugin *plugin, ParoleProviderPlayer *player) +{ + StreamProperties *prop; + GtkWidget *vbox; + + prop = STREAM_PROPERTIES_PROVIDER (plugin); + + prop->player = player; + + vbox = stream_properties_create_widgets (prop); + + parole_provider_player_pack (player, vbox, _("Properties"), PAROLE_PLUGIN_CONTAINER_PLAYLIST); + + g_signal_connect (player, "state_changed", + G_CALLBACK (state_changed_cb), prop); + + g_signal_connect (player, "tag-message", + G_CALLBACK (tag_message_cb), prop); + +} + +static void +stream_properties_iface_init (ParoleProviderPluginIface *iface) +{ + iface->get_is_configurable = stream_properties_is_configurable; + iface->set_player = stream_properties_set_player; +} + +static void stream_properties_class_init (StreamPropertiesClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = stream_properties_finalize; +} + +static void stream_properties_init (StreamProperties *provider) +{ + provider->player = NULL; +} + +static void stream_properties_finalize (GObject *object) +{ + G_OBJECT_CLASS (stream_properties_parent_class)->finalize (object); +} diff --git a/plugins/properties/stream-properties-provider.h b/plugins/properties/stream-properties-provider.h new file mode 100644 index 0000000..fd1add7 --- /dev/null +++ b/plugins/properties/stream-properties-provider.h @@ -0,0 +1,44 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 STREAM_PROPERTIES_PROVIDER_H_ +#define STREAM_PROPERTIES_PROVIDER_H_ + +#include + +G_BEGIN_DECLS + +typedef struct _StreamPropertiesClass StreamPropertiesClass; +typedef struct _StreamProperties StreamProperties; + +#define STREAM_TYPE_PROPERTIES_PROVIDER (stream_properties_get_type ()) +#define STREAM_PROPERTIES_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STREAM_TYPE_PROPERTIES_PROVIDER, StreamProperties)) +#define STREAM_PROPERTIES_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STREAM_TYPE_PROPERTIES_PROVIDER, StreamPropertiesClass)) +#define STREAM_IS_PROPERTIES_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STREAM_TYPE_PROPERTIES_PROVIDER)) +#define STREAM_IS_PROPERTIES_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STREAM_TYPE_PROPERTIES_PROVIDER)) +#define STREAM_PROPERTIES_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STREAM_TYPE_PROPERTIES_PROVIDER, StreamPropertiesClass)) + +GType stream_properties_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL; + +void stream_properties_register_type (ParoleProviderPlugin *plugin); + +G_END_DECLS + +#endif /*STREAM_PROPERTIES_PROVIDER_H_*/ diff --git a/plugins/properties/stream-properties.desktop.in b/plugins/properties/stream-properties.desktop.in new file mode 100644 index 0000000..32c5736 --- /dev/null +++ b/plugins/properties/stream-properties.desktop.in @@ -0,0 +1,6 @@ +[Parole Plugin] +Module=stream-properties +_Name=Stream Properties +_Description=Read media properties +Authors=Ali Abdallah aliov@xfce.org +Website=http://goodies.xfce.org/projects/applications/parole diff --git a/plugins/sample/Makefile.am b/plugins/sample/Makefile.am new file mode 100644 index 0000000..d7d3410 --- /dev/null +++ b/plugins/sample/Makefile.am @@ -0,0 +1,28 @@ +noinst_LTLIBRARIES = \ + sample-plugin.la + +INCLUDES = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DG_LOG_DOMAIN=\"sample_plugin\" \ + -DLIBEXECDIR=\"$(libexecdir)\" \ + -DPACKAGE_LOCALE_DIR=\"$(localedir)\" + +pluginsdir = \ + $(libdir)/parole-$(PAROLE_VERSION_API) + +sample_plugin_la_SOURCES = \ + sample-plugin.c \ + sample-provider.c \ + sample-provider.h + +sample_plugin_la_CFLAGS = \ + $(PLATFORM_CFLAGS) \ + $(GTK_CFLAGS) \ + $(LIBXFCE4UTIL_CFLAGS) + +sample_plugin_la_LDFLAGS = \ + -avoid-version \ + -export-dynamic \ + -module \ + $(PLATFORM_LDFLAGS) diff --git a/plugins/sample/sample-plugin.c b/plugins/sample/sample-plugin.c new file mode 100644 index 0000000..0b1d8f2 --- /dev/null +++ b/plugins/sample/sample-plugin.c @@ -0,0 +1,45 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "sample-provider.h" + +G_MODULE_EXPORT GType parole_plugin_initialize (ParoleProviderPlugin *plugin); + +G_MODULE_EXPORT void parole_plugin_shutdown (void); + +G_MODULE_EXPORT GType +parole_plugin_initialize (ParoleProviderPlugin *plugin) +{ + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + sample_provider_register_type (plugin); + return SAMPLE_TYPE_PROVIDER; +} + +G_MODULE_EXPORT void +parole_plugin_shutdown (void) +{ + +} diff --git a/plugins/sample/sample-provider.c b/plugins/sample/sample-provider.c new file mode 100644 index 0000000..2a9ca0d --- /dev/null +++ b/plugins/sample/sample-provider.c @@ -0,0 +1,84 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sample-provider.h" + +static void sample_provider_iface_init (ParoleProviderPluginIface *iface); +static void sample_provider_finalize (GObject *object); + + +struct _SampleProviderClass +{ + GObjectClass parent_class; +}; + +struct _SampleProvider +{ + GObject parent; + ParoleProviderPlayer *player; +}; + +PAROLE_DEFINE_TYPE_WITH_CODE (SampleProvider, + sample_provider, + G_TYPE_OBJECT, + PAROLE_IMPLEMENT_INTERFACE (PAROLE_TYPE_PROVIDER_PLUGIN, + sample_provider_iface_init)); + +static gboolean sample_provider_is_configurable (ParoleProviderPlugin *plugin) +{ + return FALSE; +} + +static void +sample_provider_set_player (ParoleProviderPlugin *plugin, ParoleProviderPlayer *player) +{ + SampleProvider *provider; + provider = SAMPLE_PROVIDER (plugin); + + provider->player = player; +} + +static void +sample_provider_iface_init (ParoleProviderPluginIface *iface) +{ + iface->get_is_configurable = sample_provider_is_configurable; + iface->set_player = sample_provider_set_player; +} + +static void sample_provider_class_init (SampleProviderClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = sample_provider_finalize; +} + +static void sample_provider_init (SampleProvider *provider) +{ + provider->player = NULL; +} + +static void sample_provider_finalize (GObject *object) +{ + G_OBJECT_CLASS (sample_provider_parent_class)->finalize (object); +} diff --git a/plugins/sample/sample-provider.h b/plugins/sample/sample-provider.h new file mode 100644 index 0000000..dc19a8b --- /dev/null +++ b/plugins/sample/sample-provider.h @@ -0,0 +1,44 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 SAMPLE_PROVIDER_H_ +#define SAMPLE_PROVIDER_H_ + +#include + +G_BEGIN_DECLS + +typedef struct _SampleProviderClass SampleProviderClass; +typedef struct _SampleProvider SampleProvider; + +#define SAMPLE_TYPE_PROVIDER (sample_provider_get_type ()) +#define SAMPLE_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SAMPLE_TYPE_PROVIDER, SampleProvider)) +#define SAMPLE_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SAMPLE_TYPE_PROVIDER, SampleProviderClass)) +#define SAMPLE_IS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SAMPLE_TYPE_PROVIDER)) +#define SAMPLE_IS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SAMPLE_TYPE_PROVIDER)) +#define SAMPLE_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SAMPLE_TYPE_PROVIDER, SampleProviderClass)) + +GType sample_provider_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL; + +void sample_provider_register_type (ParoleProviderPlugin *plugin); + +G_END_DECLS + +#endif /*SAMPLE_PROVIDER_H_*/ diff --git a/plugins/tray/Makefile.am b/plugins/tray/Makefile.am new file mode 100644 index 0000000..a240229 --- /dev/null +++ b/plugins/tray/Makefile.am @@ -0,0 +1,47 @@ +INCLUDES = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DG_LOG_DOMAIN=\"parole_tray\" \ + -DLIBEXECDIR=\"$(libexecdir)\" \ + -DPACKAGE_LOCALE_DIR=\"$(localedir)\" + +pluginsdir = \ + $(libdir)/parole-$(PAROLE_VERSION_API) + +plugins_LTLIBRARIES = \ + tray-icon.la + +tray_icon_la_SOURCES = \ + tray-plugin.c \ + tray-provider.c \ + tray-provider.h + +tray_icon_la_CFLAGS = \ + $(PLATFORM_CFLAGS) \ + $(GTK_CFLAGS) \ + $(LIBXFCE4GUI_CFLAGS) \ + $(LIBXFCE4UTIL_CFLAGS) \ + $(LIBNOTIFY_CFLAGS) + +tray_icon_la_LDFLAGS = \ + -avoid-version \ + -export-dynamic \ + -module \ + $(PLATFORM_LDFLAGS) + +tray_icon_la_LIBADD = \ + $(LIBNOTIFY_LIBS) + +# +# .desktop file +# +desktop_in_files = system-tray.desktop.in +desktopdir = $(datadir)/parole/parole-plugins-$(PAROLE_VERSION_API) +desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) +@INTLTOOL_DESKTOP_RULE@ + +EXTRA_DIST = \ + $(desktop_in_files) + +DISTCLEANFILES = \ + $(desktop_DATA) \ No newline at end of file diff --git a/plugins/tray/system-tray.desktop.in b/plugins/tray/system-tray.desktop.in new file mode 100644 index 0000000..8afbd6d --- /dev/null +++ b/plugins/tray/system-tray.desktop.in @@ -0,0 +1,6 @@ +[Parole Plugin] +Module=tray-icon +_Name=Tray icon +_Description=Show icon in the system tray +Authors=Ali Abdallah aliov@xfce.org +Website=http://goodies.xfce.org/projects/applications/parole diff --git a/plugins/tray/tray-plugin.c b/plugins/tray/tray-plugin.c new file mode 100644 index 0000000..402427b --- /dev/null +++ b/plugins/tray/tray-plugin.c @@ -0,0 +1,47 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "tray-provider.h" + +G_MODULE_EXPORT GType parole_plugin_initialize (ParoleProviderPlugin *plugin); + +G_MODULE_EXPORT void parole_plugin_shutdown (void); + +G_MODULE_EXPORT GType +parole_plugin_initialize (ParoleProviderPlugin *plugin) +{ + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + + tray_provider_register_type (plugin); + + return TRAY_TYPE_PROVIDER; +} + +G_MODULE_EXPORT void +parole_plugin_shutdown (void) +{ + +} diff --git a/plugins/tray/tray-provider.c b/plugins/tray/tray-provider.c new file mode 100644 index 0000000..aa492d5 --- /dev/null +++ b/plugins/tray/tray-provider.c @@ -0,0 +1,640 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#ifdef HAVE_LIBNOTIFY +#include +#endif + + +#include +#include + +#include "tray-provider.h" + +#define RESOURCE_FILE "xfce4/parole/parole-plugins/tray.rc" + +static void tray_provider_iface_init (ParoleProviderPluginIface *iface); +static void tray_provider_finalize (GObject *object); + + +extern GdkPixbuf *parole_icon_load (const gchar *icon_name, gint size); + + +struct _TrayProviderClass +{ + GObjectClass parent_class; +}; + +struct _TrayProvider +{ + GObject parent; + ParoleProviderPlayer *player; + GtkStatusIcon *tray; + GtkWidget *window; + gulong sig; + +#ifdef HAVE_LIBNOTIFY + NotifyNotification *n; + gboolean notify; + gboolean enabled; +#endif + ParoleState state; + GtkWidget *menu; +}; + +PAROLE_DEFINE_TYPE_WITH_CODE (TrayProvider, + tray_provider, + G_TYPE_OBJECT, + PAROLE_IMPLEMENT_INTERFACE (PAROLE_TYPE_PROVIDER_PLUGIN, + tray_provider_iface_init)); + +static void +menu_selection_done_cb (TrayProvider *tray) +{ + gtk_widget_destroy (tray->menu); + tray->menu = NULL; +} + +static void +exit_activated_cb (TrayProvider *tray) +{ + GdkEventAny ev; + + menu_selection_done_cb (tray); + + ev.type = GDK_DELETE; + ev.window = tray->window->window; + ev.send_event = TRUE; + + g_signal_handler_block (tray->window, tray->sig); + gtk_main_do_event ((GdkEvent *) &ev); +} + +static void +play_pause_activated_cb (TrayProvider *tray) +{ + menu_selection_done_cb (tray); + + if ( tray->state == PAROLE_STATE_PLAYING ) + parole_provider_player_pause (tray->player); + else if ( tray->state == PAROLE_STATE_PAUSED ) + parole_provider_player_resume (tray->player); +} + +static void +stop_activated_cb (TrayProvider *tray) +{ + menu_selection_done_cb (tray); + parole_provider_player_stop (tray->player); +} + +static void +open_activated_cb (TrayProvider *tray) +{ + parole_provider_player_open_media_chooser (tray->player); +} + +static void +popup_menu_cb (GtkStatusIcon *icon, guint button, + guint activate_time, TrayProvider *tray) +{ + GtkWidget *menu, *mi; + + menu = gtk_menu_new (); + + /* + * Play pause. + */ + mi = gtk_image_menu_item_new_from_stock (tray->state == PAROLE_STATE_PLAYING ? GTK_STOCK_MEDIA_PAUSE : + GTK_STOCK_MEDIA_PLAY, NULL); + gtk_widget_set_sensitive (mi, TRUE); + gtk_widget_show (mi); + g_signal_connect_swapped (mi, "activate", G_CALLBACK (play_pause_activated_cb), tray); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); + + /* + * Stop + */ + mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_STOP, NULL); + gtk_widget_set_sensitive (mi, tray->state >= PAROLE_STATE_PAUSED); + gtk_widget_show (mi); + g_signal_connect_swapped (mi, "activate", G_CALLBACK (stop_activated_cb), tray); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); + + /* + * Open + */ + mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_OPEN, NULL); + gtk_widget_show (mi); + g_signal_connect_swapped (mi, "activate", G_CALLBACK (open_activated_cb), tray); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); + + /* + * Separator. + */ + mi = gtk_separator_menu_item_new (); + gtk_widget_show (mi); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); + + /* + * Exit + */ + mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, NULL); + gtk_widget_set_sensitive (mi, TRUE); + gtk_widget_show (mi); + g_signal_connect_swapped (mi, "activate", G_CALLBACK (exit_activated_cb), tray); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); + + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, + gtk_status_icon_position_menu, + icon, button, activate_time); + + g_signal_connect_swapped (menu, "selection-done", + G_CALLBACK (menu_selection_done_cb), tray); + + tray->menu = menu; +} + +static void +tray_activate_cb (GtkStatusIcon *tray_icon, TrayProvider *tray) +{ + if ( GTK_WIDGET_VISIBLE (tray->window) ) + gtk_widget_hide (tray->window); + else + gtk_widget_show (tray->window); +} + +#ifdef HAVE_LIBNOTIFY +static void +notification_closed_cb (NotifyNotification *n, TrayProvider *tray) +{ + g_object_unref (tray->n); + tray->n = NULL; +} + +static void +close_notification (TrayProvider *tray) +{ + if ( tray->n ) + { + GError *error = NULL; + notify_notification_close (tray->n, &error); + if ( error ) + { + g_warning ("Failed to close notification : %s", error->message); + g_error_free (error); + } + g_object_unref (tray->n); + tray->n = NULL; + } +} + +static void +notify_playing (TrayProvider *tray, const ParoleStream *stream) +{ + GdkPixbuf *pix; + gboolean live, has_audio, has_video; + gchar *title; + gchar *message; + gint64 duration; + gint hours; + gint minutes; + gint seconds; + gchar timestring[128]; + ParoleMediaType media_type; + + if ( !tray->notify || !tray->enabled) + return; + + g_object_get (G_OBJECT (stream), + "title", &title, + "has-audio", &has_audio, + "has-video", &has_video, + "duration", &duration, + "live", &live, + "media-type", &media_type, + NULL); + + if ( !title ) + { + gchar *uri; + gchar *filename; + g_object_get (G_OBJECT (stream), + "uri", &uri, + NULL); + + filename = g_filename_from_uri (uri, NULL, NULL); + g_free (uri); + if ( filename ) + { + title = g_path_get_basename (filename); + g_free (filename); + if ( !title ) + return; + } + } + + if ( live || media_type != PAROLE_MEDIA_TYPE_LOCAL_FILE ) + { + g_free (title); + return; + } + + minutes = duration / 60; + seconds = duration % 60; + hours = minutes / 60; + minutes = minutes % 60; + + if ( hours == 0 ) + { + g_snprintf (timestring, 128, "%02i:%02i", minutes, seconds); + } + else + { + g_snprintf (timestring, 128, "%i:%02i:%02i", hours, minutes, seconds); + } + + message = g_strdup_printf ("%s %s %s %s", _("Playing:"), title, _("Duration:"), timestring); + +#ifdef NOTIFY_CHECK_VERSION +#if NOTIFY_CHECK_VERSION (0, 7, 0) + tray->n = notify_notification_new (title, message, NULL); +#else + tray->n = notify_notification_new (title, message, NULL, NULL); +#endif +#else + tray->n = notify_notification_new (title, message, NULL, NULL); +#endif + g_free (title); + g_free (message); + +#ifdef NOTIFY_CHECK_VERSION +#if !NOTIFY_CHECK_VERSION (0, 7, 0) + notify_notification_attach_to_status_icon (tray->n, tray->tray); +#endif +#endif + pix = parole_icon_load (has_video ? "video" : "audio-x-generic", 48); + if ( pix ) + { + notify_notification_set_icon_from_pixbuf (tray->n, pix); + g_object_unref (pix); + } + notify_notification_set_urgency (tray->n, NOTIFY_URGENCY_LOW); + notify_notification_set_timeout (tray->n, 5000); + + notify_notification_show (tray->n, NULL); + g_signal_connect (tray->n, "closed", + G_CALLBACK (notification_closed_cb), tray); + + tray->notify = FALSE; +} +#endif + +static void +state_changed_cb (ParoleProviderPlayer *player, const ParoleStream *stream, ParoleState state, TrayProvider *tray) +{ + tray->state = state; + + if ( tray->menu ) + { + gtk_widget_destroy (tray->menu); + tray->menu = NULL; + g_signal_emit_by_name (G_OBJECT (tray->tray), "popup-menu", 0, gtk_get_current_event_time ()); + } + +#ifdef HAVE_LIBNOTIFY + + if ( state == PAROLE_STATE_PLAYING ) + { + notify_playing (tray, stream); + } + else if ( state <= PAROLE_STATE_PAUSED ) + { + close_notification (tray); + if ( state < PAROLE_STATE_PAUSED ) + tray->notify = TRUE; + } +#endif +} + +static gboolean +read_entry_bool (const gchar *entry, gboolean fallback) +{ + gboolean ret_val = fallback; + gchar *file; + XfceRc *rc; + + file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, RESOURCE_FILE, TRUE); + rc = xfce_rc_simple_open (file, TRUE); + g_free (file); + + if ( rc ) + { + ret_val = xfce_rc_read_bool_entry (rc, entry, fallback); + xfce_rc_close (rc); + } + + return ret_val; +} + +static void +write_entry_bool (const gchar *entry, gboolean value) +{ + gchar *file; + XfceRc *rc; + + file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, RESOURCE_FILE, TRUE); + rc = xfce_rc_simple_open (file, FALSE); + g_free (file); + + xfce_rc_write_bool_entry (rc, entry, value); + xfce_rc_close (rc); +} + +#ifdef HAVE_LIBNOTIFY +static gboolean +notify_enabled (void) +{ + gboolean ret_val = read_entry_bool ("NOTIFY", TRUE); + + return ret_val; +} + +static void +notify_toggled_cb (GtkToggleButton *bt, TrayProvider *tray) +{ + gboolean active; + active = gtk_toggle_button_get_active (bt); + tray->enabled = active; + + write_entry_bool ("NOTIFY", active); +} +#endif /*HAVE_LIBNOTIFY*/ + +static void +hide_on_delete_toggled_cb (GtkWidget *widget, gpointer tray) +{ + gboolean toggled; + toggled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); + write_entry_bool ("MINIMIZE_TO_TRAY", toggled); +} + +static void +configure_plugin (TrayProvider *tray, GtkWidget *widget) +{ + GtkWidget *dialog; + GtkWidget *content_area; +#ifdef HAVE_LIBNOTIFY + GtkWidget *check; +#endif + GtkWidget *hide_on_delete; + gboolean hide_on_delete_b; + + dialog = gtk_dialog_new_with_buttons (_("Tray icon plugin"), + GTK_WINDOW (widget), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + NULL); + + content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + +#ifdef HAVE_LIBNOTIFY + check = gtk_check_button_new_with_label (_("Enable notification")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), tray->enabled); + g_signal_connect (check, "toggled", + G_CALLBACK (notify_toggled_cb), tray); + gtk_box_pack_start_defaults (GTK_BOX (content_area), check) ; + +#endif /*HAVE_LIBNOTIFY*/ + + hide_on_delete_b = read_entry_bool ("MINIMIZE_TO_TRAY", TRUE); + hide_on_delete = gtk_check_button_new_with_label (_("Always minimize to tray when window is closed")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (hide_on_delete), hide_on_delete_b); + + g_signal_connect (hide_on_delete, "toggled", + G_CALLBACK (hide_on_delete_toggled_cb), NULL); + + gtk_box_pack_start_defaults (GTK_BOX (content_area), hide_on_delete); + + g_signal_connect (dialog, "response", + G_CALLBACK (gtk_widget_destroy), NULL); + + gtk_widget_show_all (dialog); +} + +static void +action_on_hide_confirmed_cb (GtkWidget *widget, gpointer data) +{ + gboolean toggled; + + toggled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); + + write_entry_bool ("ACTION_CONFIRMED_ON_DELETE", toggled); +} + +static gboolean +delete_event_cb (GtkWidget *widget, GdkEvent *ev, TrayProvider *tray) +{ + GtkWidget *dialog, *check, *content_area, *label; + GtkWidget *quit, *minimize, *cancel, *img; + gboolean confirmed, ret_val = TRUE, minimize_to_tray; + + confirmed = read_entry_bool ("ACTION_CONFIRMED_ON_DELETE", FALSE); + minimize_to_tray = read_entry_bool ("MINIMIZE_TO_TRAY", TRUE); + + if ( confirmed ) + { + return minimize_to_tray ? gtk_widget_hide_on_delete (widget) : FALSE; + } + + dialog = gtk_dialog_new_with_buttons (_("Minimize to tray?"), NULL, GTK_DIALOG_MODAL, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), + GTK_RESPONSE_OK); + + minimize = gtk_button_new_with_label (_("Minimize to tray")); + img = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (minimize), img); + gtk_widget_show (minimize); + gtk_dialog_add_action_widget (GTK_DIALOG (dialog), minimize, GTK_RESPONSE_OK); + + quit = gtk_button_new_from_stock (GTK_STOCK_QUIT); + gtk_widget_show (quit); + gtk_dialog_add_action_widget (GTK_DIALOG (dialog), quit, GTK_RESPONSE_CLOSE); + + cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + gtk_widget_show (cancel); + gtk_dialog_add_action_widget (GTK_DIALOG (dialog), cancel, GTK_RESPONSE_CANCEL); + + content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + + label = gtk_label_new (_("Are you sure you want to quit Parole")); + gtk_widget_show (label); + gtk_box_pack_start_defaults (GTK_BOX (content_area), label) ; + + check = gtk_check_button_new_with_mnemonic (_("Remember my choice")); + gtk_widget_show (check); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), FALSE); + + g_signal_connect (check, "toggled", + G_CALLBACK (action_on_hide_confirmed_cb), NULL); + + gtk_box_pack_start_defaults (GTK_BOX (content_area), + check) ; + + switch ( gtk_dialog_run (GTK_DIALOG (dialog)) ) + { + case GTK_RESPONSE_OK: + { + gtk_widget_hide_on_delete (widget); + confirmed = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)); + if ( confirmed ) + write_entry_bool ("MINIMIZE_TO_TRAY", TRUE); + break; + } + case GTK_RESPONSE_CLOSE: + { + confirmed = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)); + if ( confirmed ) + write_entry_bool ("MINIMIZE_TO_TRAY", FALSE); + ret_val = FALSE; + } + break; + case GTK_RESPONSE_CANCEL: + break; + default: + break; + } + + gtk_widget_destroy (dialog); + return ret_val; +} + +static gboolean tray_provider_is_configurable (ParoleProviderPlugin *plugin) +{ +#ifdef HAVE_LIBNOTIFY + return TRUE; +#else + return FALSE; +#endif +} + +static void +tray_provider_set_player (ParoleProviderPlugin *plugin, ParoleProviderPlayer *player) +{ + TrayProvider *tray; + GdkPixbuf *pix; + + tray = TRAY_PROVIDER (plugin); + + tray->player = player; + + tray->state = PAROLE_STATE_STOPPED; + + tray->window = parole_provider_player_get_main_window (player); + + tray->tray = gtk_status_icon_new (); + tray->player = player; + tray->menu = NULL; + +#ifdef HAVE_LIBNOTIFY + tray->n = NULL; + notify_init ("parole-tray-icon"); + tray->enabled = notify_enabled (); + tray->notify = TRUE; +#endif + + pix = parole_icon_load ("parole", 48); + + if ( pix ) + { + gtk_status_icon_set_from_pixbuf (tray->tray, pix); + g_object_unref (pix); + } + + g_signal_connect (tray->tray, "popup-menu", + G_CALLBACK (popup_menu_cb), tray); + + g_signal_connect (tray->tray, "activate", + G_CALLBACK (tray_activate_cb), tray); + + tray->sig = g_signal_connect (tray->window, "delete-event", + G_CALLBACK (delete_event_cb), NULL); + + g_signal_connect (player, "state_changed", + G_CALLBACK (state_changed_cb), tray); +} + +static void +tray_provider_configure (ParoleProviderPlugin *provider, GtkWidget *parent) +{ + TrayProvider *tray; + tray = TRAY_PROVIDER (provider); + configure_plugin (tray, parent); +} + +static void +tray_provider_iface_init (ParoleProviderPluginIface *iface) +{ + iface->set_player = tray_provider_set_player; + iface->configure = tray_provider_configure; + iface->get_is_configurable = tray_provider_is_configurable; +} + +static void tray_provider_class_init (TrayProviderClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = tray_provider_finalize; +} + +static void tray_provider_init (TrayProvider *provider) +{ + provider->player = NULL; +} + +static void tray_provider_finalize (GObject *object) +{ + TrayProvider *tray; + + tray = TRAY_PROVIDER (object); + + if ( GTK_IS_WIDGET (tray->window) && g_signal_handler_is_connected (tray->window, tray->sig) ) + g_signal_handler_disconnect (tray->window, tray->sig); + +#ifdef HAVE_LIBNOTIFY + close_notification (tray); +#endif + + g_object_unref (G_OBJECT (tray->tray)); + + G_OBJECT_CLASS (tray_provider_parent_class)->finalize (object); +} diff --git a/plugins/tray/tray-provider.h b/plugins/tray/tray-provider.h new file mode 100644 index 0000000..8b59b1c --- /dev/null +++ b/plugins/tray/tray-provider.h @@ -0,0 +1,44 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 TRAY_PROVIDER_H_ +#define TRAY_PROVIDER_H_ + +#include + +G_BEGIN_DECLS + +typedef struct _TrayProviderClass TrayProviderClass; +typedef struct _TrayProvider TrayProvider; + +#define TRAY_TYPE_PROVIDER (tray_provider_get_type ()) +#define TRAY_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TRAY_TYPE_PROVIDER, TrayProvider)) +#define TRAY_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TRAY_TYPE_PROVIDER, TrayProviderClass)) +#define TRAY_IS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TRAY_TYPE_PROVIDER)) +#define TRAY_IS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TRAY_TYPE_PROVIDER)) +#define TRAY_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TRAY_TYPE_PROVIDER, TrayProviderClass)) + +GType tray_provider_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL; + +void tray_provider_register_type (ParoleProviderPlugin *provider); + +G_END_DECLS + +#endif /*TRAY_PROVIDER_H_*/ diff --git a/plugins/window-title/Makefile.am b/plugins/window-title/Makefile.am new file mode 100644 index 0000000..888a2db --- /dev/null +++ b/plugins/window-title/Makefile.am @@ -0,0 +1,42 @@ +INCLUDES = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DG_LOG_DOMAIN=\"window_title\" \ + -DLIBEXECDIR=\"$(libexecdir)\" \ + -DPACKAGE_LOCALE_DIR=\"$(localedir)\" + +pluginsdir = \ + $(libdir)/parole-$(PAROLE_VERSION_API) + +plugins_LTLIBRARIES = \ + window-title.la + +window_title_la_SOURCES = \ + window-title-plugin.c \ + window-title-provider.c \ + window-title-provider.h + +window_title_la_CFLAGS = \ + $(PLATFORM_CFLAGS) \ + $(GTK_CFLAGS) \ + $(LIBXFCE4UTIL_CFLAGS) + +window_title_la_LDFLAGS = \ + -avoid-version \ + -export-dynamic \ + -module \ + $(PLATFORM_LDFLAGS) + +# +# .desktop file +# +desktop_in_files = window-title.desktop.in +desktopdir = $(datadir)/parole/parole-plugins-$(PAROLE_VERSION_API) +desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) +@INTLTOOL_DESKTOP_RULE@ + +EXTRA_DIST = \ + $(desktop_in_files) + +DISTCLEANFILES = \ + $(desktop_DATA) \ No newline at end of file diff --git a/plugins/window-title/window-title-plugin.c b/plugins/window-title/window-title-plugin.c new file mode 100644 index 0000000..465e605 --- /dev/null +++ b/plugins/window-title/window-title-plugin.c @@ -0,0 +1,47 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "window-title-provider.h" + +G_MODULE_EXPORT GType parole_plugin_initialize (ParoleProviderPlugin *plugin); + +G_MODULE_EXPORT void parole_plugin_shutdown (void); + +G_MODULE_EXPORT GType +parole_plugin_initialize (ParoleProviderPlugin *plugin) +{ + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + + window_title_provider_register_type (plugin); + + return WINDOW_TYPE_TITLE_PROVIDER; +} + +G_MODULE_EXPORT void +parole_plugin_shutdown (void) +{ + +} diff --git a/plugins/window-title/window-title-provider.c b/plugins/window-title/window-title-provider.c new file mode 100644 index 0000000..85e2364 --- /dev/null +++ b/plugins/window-title/window-title-provider.c @@ -0,0 +1,147 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "window-title-provider.h" + +static void window_title_provider_iface_init (ParoleProviderPluginIface *iface); +static void window_title_provider_finalize (GObject *object); + + +struct _WindowTitleProviderClass +{ + GObjectClass parent_class; +}; + +struct _WindowTitleProvider +{ + GObject parent; + + ParoleProviderPlayer *player; + GtkWidget *window; +}; + + +PAROLE_DEFINE_TYPE_WITH_CODE (WindowTitleProvider, + window_title_provider, + G_TYPE_OBJECT, + PAROLE_IMPLEMENT_INTERFACE (PAROLE_TYPE_PROVIDER_PLUGIN, + window_title_provider_iface_init)); + + + +static void +window_title_provider_set_default_window_title (GtkWidget *window) +{ + gtk_window_set_title (GTK_WINDOW (window), _("Parole Media Player")); +} + +static void +window_title_provider_set_stream_title (GtkWidget *window, const ParoleStream *stream) +{ + gchar *title = NULL; + + g_object_get (G_OBJECT (stream), + "title", &title, + NULL); + + if ( title ) + { + gtk_window_set_title (GTK_WINDOW (window), title); + g_free (title); + } +} + +static void +window_title_provider_state_changed_cb (ParoleProviderPlayer *player, const ParoleStream *stream, + ParoleState state, WindowTitleProvider *provider) +{ + if ( state < PAROLE_STATE_PAUSED ) + window_title_provider_set_default_window_title (provider->window); + else + window_title_provider_set_stream_title (provider->window, stream); +} + +static void +window_title_provider_tag_message_cb (ParoleProviderPlayer *player, const ParoleStream *stream, WindowTitleProvider *provider) +{ + window_title_provider_set_stream_title (provider->window, stream); +} + +static gboolean window_title_provider_is_configurable (ParoleProviderPlugin *plugin) +{ + return FALSE; +} + +static void +window_title_provider_set_player (ParoleProviderPlugin *plugin, ParoleProviderPlayer *player) +{ + WindowTitleProvider *provider; + provider = WINDOW_TITLE_PROVIDER (plugin); + + provider->player = player; + + provider->window = parole_provider_player_get_main_window (player); + + g_signal_connect (player, "state-changed", + G_CALLBACK (window_title_provider_state_changed_cb), provider); + + g_signal_connect (player, "tag-message", + G_CALLBACK (window_title_provider_tag_message_cb), provider); +} + +static void +window_title_provider_iface_init (ParoleProviderPluginIface *iface) +{ + iface->get_is_configurable = window_title_provider_is_configurable; + iface->set_player = window_title_provider_set_player; +} + +static void window_title_provider_class_init (WindowTitleProviderClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = window_title_provider_finalize; +} + +static void window_title_provider_init (WindowTitleProvider *provider) +{ + provider->player = NULL; + g_debug ("Init"); +} + +static void window_title_provider_finalize (GObject *object) +{ + WindowTitleProvider *provider; + + provider = WINDOW_TITLE_PROVIDER (object); + + g_debug ("Finalized"); + + if ( provider->window && GTK_IS_WINDOW (provider->window) ) + window_title_provider_set_default_window_title (provider->window); + + G_OBJECT_CLASS (window_title_provider_parent_class)->finalize (object); +} diff --git a/plugins/window-title/window-title-provider.h b/plugins/window-title/window-title-provider.h new file mode 100644 index 0000000..f88152b --- /dev/null +++ b/plugins/window-title/window-title-provider.h @@ -0,0 +1,44 @@ +/* + * * Copyright (C) 2009-2011 Ali + * + * Licensed under the GNU General Public License Version 2 + * + * 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 WINDOW_TITLE_PROVIDER_H_ +#define WINDOW_TITLE_PROVIDER_H_ + +#include + +G_BEGIN_DECLS + +typedef struct _WindowTitleProviderClass WindowTitleProviderClass; +typedef struct _WindowTitleProvider WindowTitleProvider; + +#define WINDOW_TYPE_TITLE_PROVIDER (window_title_provider_get_type ()) +#define WINDOW_TITLE_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), WINDOW_TYPE_TITLE_PROVIDER, WindowTitleProvider)) +#define WINDOW_TITLE_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), WINDOW_TYPE_TITLE_PROVIDER, WindowTitleProviderClass)) +#define WINDOW_IS_TITLE_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), WINDOW_TYPE_TITLE_PROVIDER)) +#define WINDOW_IS_TITLE_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), WINDOW_TYPE_TITLE_PROVIDER)) +#define WINDOW_TITLE_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), WINDOW_TYPE_TITLE_PROVIDER, WindowTitleProviderClass)) + +GType window_title_provider_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL; + +void window_title_provider_register_type (ParoleProviderPlugin *plugin); + +G_END_DECLS + +#endif /*WINDOW_TITLE_PROVIDER_H_*/ diff --git a/plugins/window-title/window-title.desktop.in b/plugins/window-title/window-title.desktop.in new file mode 100644 index 0000000..0d251bd --- /dev/null +++ b/plugins/window-title/window-title.desktop.in @@ -0,0 +1,6 @@ +[Parole Plugin] +Module=window-title +_Name=Window Title +_Description=Set the main window name to the current playing media name. +Authors=Sarah Hijazi +Website=http://goodies.xfce.org/projects/applications/parole diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..acd215c --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,37 @@ +[encoding: UTF-8] +[type: gettext/glade]data/interfaces/parole.ui +[type: gettext/glade]data/interfaces/mediachooser.ui +[type: gettext/glade]data/interfaces/playlist.ui +[type: gettext/glade]data/interfaces/plugins.ui +[type: gettext/glade]data/interfaces/parole-settings.ui +[type: gettext/glade]data/interfaces/save-playlist.ui +[type: gettext/glade]data/interfaces/open-location.ui +data/desktop/parole.desktop.in.in +common/parole-common.c +gst/parole-gst.c +src/main.c +src/parole-mediachooser.c +src/parole-medialist.c +src/parole-player.c +src/parole-statusbar.c +src/parole-about.c +src/parole-disc.c +src/parole-subtitle-encoding.c +src/parole-open-location.c +src/parole-disc-menu.c +src/parole-plugins-manager.c +parole/parole-filters.c +parole/parole-pl-parser.c +plugins/properties/stream-properties-plugin.c +plugins/properties/stream-properties-provider.c +plugins/properties/stream-properties-provider.h +plugins/properties/stream-properties.desktop.in +plugins/tray/tray-plugin.c +plugins/tray/tray-provider.c +plugins/tray/tray-provider.h +plugins/tray/system-tray.desktop.in +plugins/window-title/window-title-plugin.c +plugins/window-title/window-title-provider.c +plugins/window-title/window-title-provider.h +plugins/window-title/window-title.desktop.in +plugins/power-manager/power-manager.desktop.in diff --git a/po/POTFILES.skip b/po/POTFILES.skip new file mode 100644 index 0000000..61ceb2a --- /dev/null +++ b/po/POTFILES.skip @@ -0,0 +1 @@ +data/desktop/parole.desktop.in diff --git a/po/ar.po b/po/ar.po new file mode 100644 index 0000000..ed1263a --- /dev/null +++ b/po/ar.po @@ -0,0 +1,847 @@ +# Arabic translations of parole +# Copyright (C) 2009 the parole-media-player's copyright holder +# This file is distributed under the same license as the parole-media-player package. +# Karim Oulad Chalha +# mohammad , 2012. +msgid "" +msgstr "" +"Project-Id-Version: Parole\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-05-20 18:51+0000\n" +"PO-Revision-Date: 2012-05-21 00:17+0300\n" +"Last-Translator: mohammad \n" +"Language-Team: http://www.vertaal.com.ar/files/factory/ar/list/\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Poedit-Language: Arabic\n" +"X-Poedit-Country: Morocco\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (شاشة عريضة)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "نسبة الإرتفاع" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "ذاتي" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "قائمة الفصل" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "قائمة DVD" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "من صورة ISO" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "مشغل الوسائط" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "أكتم" + +#: ../data/interfaces/parole.ui.h:12 ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "الفصل التالي" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "لا شيء" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Parole مشغل الوسائط" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "ملحقات" + +#: ../data/interfaces/parole.ui.h:16 ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "الفصل السابق" + +#: ../data/interfaces/parole.ui.h:17 ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "إعادة" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "إختر مقطع" + +#: ../data/interfaces/parole.ui.h:19 ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "عشوائي" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "صوت" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "مربع" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "خفظ حجم الصوت" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "رفع حجم الصوت" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_حرر" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "_مساعدة" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_وسائط" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "_إفتح موقع" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_أظهر" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "أضف" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "فتح ملفات الوسائط" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "مشغل وسائط Parole" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "إستبدال قائمة التشغيل مع الملفات المفتوحة" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "مسح المجلدات بشكل متكرر" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "بدء تشغيل الملفات المفتوحة" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "مؤلف :" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "وصف :" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "موقع :" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Media Player ملحقات" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Parole ملحقات" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "صوت" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "عرض" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "ترجمة" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "فيديو" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "تحميل الترجمة تلقائيا عنذ تشغيل الفيلم" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "سطوع:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "تباين:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "تعطبل حافظة الشاشة عنذ تشغيل الافلام" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "تفعبل المرئيات عنذ تشغيل ملف صوتي" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "تشفير: " + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "خط:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "لون:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "إعدادات مشغل الوسائط" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "إعدادات Parole" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "الرجوع إلى وضع البدئي" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "الإشباع:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "نوع مجموعة المرئيات:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "حسب الإختصار" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "إختر نوع الملف (حسب الإختصار)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "محو التاريخ" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "أدخل عنوان المسار الذي سيتم فتحه" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "فتح موقع ملف وسائط أو بث مباشر" + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "رسالة" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "خطأ" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "البيانات تأخذ الكثير من الوقت للتحميل" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "توقف" + +#: ../gst/parole-gst.c:1715 +msgid "" +"Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "غير قادر على تشغيل إضافات GStreamer، تأكد من تنصيب GStreamer" + +#: ../gst/parole-gst.c:1735 +msgid "" +"Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "غير قادر على تحميل فيديو GStreamer، تأكد من تنصيب GStreamer" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"مشغل الوسائط Parole %s\n" +"\n" +"جزء من مشروع goodies Xfce \n" +"http://goodies.xfce.org\n" +"\n" +"تحت رخصة الجنو GPL.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "عنصر مجهول " + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "فتح نموذج جديد" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "عدم تحميل الملحقات" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "إختر مسار الجهاز Audio-CD/VCD/DVD" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "تشغيل أو إقاف مؤقت إذا كان يعمل" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "إقاف القراءة" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "المقطع التالي" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "المقطع السابق" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "الأمام" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "الوراء" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "زيادة حجم الصوت" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "تقليص حجم الصوت" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "كتم الصوت" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "معلومات النسخة" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "بدء ملء الشاشة" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "تفعيل/تعطيل دعم XV" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "وسائط للتشغيل" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Parole يعمل حالبا, إستعمل -i لفتح واحد أخر\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "صلاحيات غبر كافية" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "خلل أتناء حفظ قائمة التشغيل" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "صيغة قائمة التشغبل غبر معروفة" + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "المرجوا إختيار صيغة قائمة التشغبل مدعومة" + +#: ../src/parole-medialist.c:568 ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "مجهول" + +#: ../src/parole-medialist.c:642 ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "قائمة التشغيل" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "قائمة التشغيل M3U" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "قائمة التشغيل PLS" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "إعدادات قرأة المسار" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "قائمة التشغيل قابلة المشاركة" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "فتح المجلد المتضمن" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "استبدال قائمة التشغيل عند فتح الملفات" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "شغل الملفات المفتوحة" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "تذكر قائمة التشغيل" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "قائمة التشغيل" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "إخفاء قائمة التشغيل" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "عرض قائمة التشغيل" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "فتح صورة ISO" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "صورة CD" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "صورة DVD" + +#: ../src/parole-player.c:551 ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "مسار الوسائط غير قابل للقرأة" + +#. +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "المقطع التالي" + +#. +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "المقطع السابق" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "تخزين المؤقت" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "موقف" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "إنتها" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "موقف مؤقتا" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "مقطع قيد التشغيل" + +#: ../src/parole-statusbar.c:170 ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "تدفق مباشر:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "مؤلف / معيل" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "مترجم (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "تشغيل القرص" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "اللغة الحالية" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "عربية" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "أرميني" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "بلطيق" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "سيلتيك" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "أوربا الوسطة" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "صينية بسيطة" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "صينية تقليدية" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "كرواتي" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "سيريالي" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "سيريالي/روسي" + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "سيريالي/أوكراني" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "جورجي" + +#: ../src/parole-subtitle-encoding.c:242 ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "يوناني" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: ../src/parole-subtitle-encoding.c:255 ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "عبري" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "عبري مرئي" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "هندي" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "أيسلندي" + +#: ../src/parole-subtitle-encoding.c:273 ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "ياباني" + +#: ../src/parole-subtitle-encoding.c:280 ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "كوري" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "إسكندنافي" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "فارسي" + +#: ../src/parole-subtitle-encoding.c:295 ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "روماني" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "جنوب أوربي" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "تيلندي" + +#: ../src/parole-subtitle-encoding.c:306 ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "تركي" + +#: ../src/parole-subtitle-encoding.c:315 ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "يونيكود" + +#: ../src/parole-subtitle-encoding.c:326 ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "غربي" + +#: ../src/parole-subtitle-encoding.c:337 ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "فيتنامي" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "مقطع قيد التشغيل" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "مقطع %i" + +#: ../src/parole-plugins-manager.c:301 ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "زر الموقع" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "لم يتم رصد أي ملحق متبث في جهازك" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "ملف صوتي" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "فيديو" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "ملف صوتي و فيديو" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Tكل الملفات المدعومة" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "قائمة القراءة" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "عنوان:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "فنان:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "ألبوم:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "سنة:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "عام" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "القرأة لا تدعم التغييرات بها" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "حفظ تغييرات الأوسمة" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "خصائص" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "قراءة خصائص الوسيط" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Stream خصائص" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "جاري القراءة :" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "مدة :" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "ملحق أيقونة الشريط" + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "تفعيل الإشعارات" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "دائما تصغير إلى الشريط عنذ الإغلاق" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "تصغير إلى الشريط؟" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "تصغير إلى الشريط" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "هل تريد حقا مغادرة Parole" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "تذكر إختياري" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "أظهر أيقونة في الشريط" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "أيقونة الشريط" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "إظهار اسم الملف قيد التشغيل في النافذة الرئيسية." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "عنوان النافذة" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "منع تعليق الجهاز أتناء تشغيل الدي في دي." + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "ملحق مدير الطاقة" + +#~ msgid "Open location..." +#~ msgstr "فتح المسار..." + +#~ msgid "socket" +#~ msgstr "مقبس" + +#~ msgid "SOCKET ID" +#~ msgstr "مقبس التعربف" + +#~ msgid "url to play" +#~ msgstr "URL للقراءة" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Fullscreen" +#~ msgstr "ملء الشاشة" + +#~ msgid "Copy url" +#~ msgstr "نسخ الURL" + +#~ msgid "Plugin" +#~ msgstr "ملحقات" + +#~ msgid "gtk-close" +#~ msgstr "غلق-جتك" + +#~ msgid "gtk-properties" +#~ msgstr "خصائص-جتك" + +#~ msgid "Visite Website" +#~ msgstr "زر الموقع" diff --git a/po/ast.po b/po/ast.po new file mode 100644 index 0000000..5045cfb --- /dev/null +++ b/po/ast.po @@ -0,0 +1,814 @@ +# Asturian translations of parole.po +# Astur , 2009. +# Asturian translations for parole-media-player package. +# Copyright (C) 2009 the parole-media-player's copyright holder +# This file is distributed under the same license as the parole-media-player package. +msgid "" +msgstr "" +"Project-Id-Version: ast\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-10 14:17+0100\n" +"PO-Revision-Date: 2009-10-20 22:22+0100\n" +"Last-Translator: astur \n" +"Language-Team: Asturian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Asturian\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Widescreen)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Співвідношення сторін" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Auto" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Menú Capítulu" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD Menu" +msgstr "DVD Menú" + +#: ../data/interfaces/parole.ui.h:8 +msgid "Media player" +msgstr "Media player" + +#: ../data/interfaces/parole.ui.h:9 +msgid "Mute" +msgstr "Silenciar" + +#: ../data/interfaces/parole.ui.h:10 ../src/parole-player.c:1098 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Siguiente Capítulu Chapter" + +#: ../data/interfaces/parole.ui.h:11 +msgid "None" +msgstr "Dengún" + +#: ../data/interfaces/parole.ui.h:12 ../data/desktop/parole.desktop.in.in.h:1 +#: ../src/parole-about.c:70 ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Parole Media Player" + +#: ../data/interfaces/parole.ui.h:13 +msgid "Plugins" +msgstr "Plugins" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-player.c:1110 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Capítulu Previu" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Repeat" +msgstr "Repetir" + +#: ../data/interfaces/parole.ui.h:16 +msgid "Select Track" +msgstr "Seleicionar pista" + +#: ../data/interfaces/parole.ui.h:17 +msgid "Shuffle" +msgstr "Al debalu" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Sound" +msgstr "Soníu" + +#: ../data/interfaces/parole.ui.h:19 +msgid "Square" +msgstr "Cuadráu" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Volume Down" +msgstr "Baxar Volume" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Volume Up" +msgstr "Xubir Volume" + +#: ../data/interfaces/parole.ui.h:22 +msgid "_Edit" +msgstr "_Editar" + +#: ../data/interfaces/parole.ui.h:23 +msgid "_Help" +msgstr "_Aida" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Media" +msgstr "_Media" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Open location" +msgstr "_Abrir llugar..." + +#: ../data/interfaces/parole.ui.h:26 +msgid "_View" +msgstr "_Ver" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Replace playlist with opened files" +msgstr "" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Scan folders recursively" +msgstr "" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Start playing opened files" +msgstr "" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Autor:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Descripción:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Sitiu:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Plugins del Reproductor de Medios" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Plugins de Parole" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Audio" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Pantalla" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Subtítulos" + +#: ../data/interfaces/parole-settings.ui.h:4 +#, fuzzy +msgid "Video" +msgstr "Sitiu:" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Cargar subtítulos automáticamente al reproducción el ficheru de video" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Rellumu:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Contraste:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Activar visualización cuando se reproduz el ficheru d'audio file" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Codificando:" + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Fonte:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Matiz:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Axustes del Reproductor de Medios" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Axustes de Parole" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Resetear a los valores predefiníos" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Saturación:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Triba de visualización:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Por estensión" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Esbillar tribes de ficheros (Por estensión)" + +#: ../gst/parole-gst.c:1494 +msgid "The stream is taking too much time to load" +msgstr "El fluxu ta llevando enforma tiempu pa cargar" + +#: ../gst/parole-gst.c:1494 +msgid "Stop" +msgstr "Parar" + +#: ../gst/parole-gst.c:1683 +msgid "" +"Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "" +"Nun pudo cargase'l complementu playbin GStreamer, comprebe la so instalación " +"de GStreamer" + +#: ../gst/parole-gst.c:1703 +msgid "" +"Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "" +"Nun pudo cargase'l complementu video GStreamer, comprebe la so instalación " +"de GStreamer" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Parole Media Player %s\n" +"\n" +"Parte del Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Llicenciáu baxo la GNU GPL.\n" +"\n" + +#: ../src/main.c:175 +msgid "Unknown argument " +msgstr "" + +#: ../src/main.c:212 +msgid "Open a new instance" +msgstr "Abrir nueva instancia" + +#: ../src/main.c:213 +msgid "Do not load plugins" +msgstr "" + +#: ../src/main.c:214 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "" + +#: ../src/main.c:215 +msgid "Play or pause if already playing" +msgstr "Reproducir o posar" + +#: ../src/main.c:216 +msgid "Stop playing" +msgstr "Detener reproducción" + +#: ../src/main.c:217 +msgid "Next track" +msgstr "Siguiente pista" + +#: ../src/main.c:218 +msgid "Previous track" +msgstr "Pista previa" + +#: ../src/main.c:219 +msgid "Seek forward" +msgstr "Guetar haza alantre" + +#: ../src/main.c:220 +msgid "Seek Backward" +msgstr "Guetar haza atrás" + +#: ../src/main.c:221 +msgid "Raise volume" +msgstr "Xubir el volume" + +#: ../src/main.c:222 +msgid "Lower volume" +msgstr "Menor volume" + +#: ../src/main.c:223 +msgid "Mute volume" +msgstr "Silenciar" + +#: ../src/main.c:224 +msgid "Version information" +msgstr "Información de versión" + +#: ../src/main.c:225 +msgid "Enabled/Disable XV support" +msgstr "" + +#: ../src/main.c:227 +msgid "Media to play" +msgstr "Mediu a reproducir" + +#: ../src/main.c:264 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Parole yá ta executándose, use -i p'abrir una nueva instancia\n" + +#: ../src/parole-mediachooser.c:213 +msgid "Add media files" +msgstr "Amestar ficheros multimedia" + +#: ../src/parole-mediachooser.c:246 +msgid "Add" +msgstr "Amestar" + +#: ../src/parole-medialist.c:437 +msgid "Error saving playlist file" +msgstr "Fallu atroxando la llista de reproducción" + +#: ../src/parole-medialist.c:437 +msgid "Permission denied" +msgstr "Permisu torgáu" + +#: ../src/parole-medialist.c:446 +msgid "Unknown playlist format, Please select a support playlist format" +msgstr "" +"Formatu de llista desconocíu, por favor esbille una llista con formatu " +"sofitáu téunicamente" + +#: ../src/parole-medialist.c:514 ../src/parole-player.c:1852 +msgid "Playlist" +msgstr "Llista de reproducción" + +#: ../src/parole-medialist.c:521 +msgid "M3U Playlists" +msgstr "Llista - M3U" + +#: ../src/parole-medialist.c:529 +msgid "PLS Playlists" +msgstr "Llista - PLS" + +#: ../src/parole-medialist.c:537 +msgid "Advanced Stream Redirector" +msgstr "Redireutor de Fluxu Avanzáu" + +#: ../src/parole-medialist.c:545 +msgid "Shareable Playlist" +msgstr "Llista de reproducción compartible" + +#: ../src/parole-medialist.c:860 +msgid "Remember playlist" +msgstr "Remembrar llista de reproducción" + +#: ../src/parole-medialist.c:1012 +msgid "Media list" +msgstr "Llista de Medios" + +#: ../src/parole-player.c:318 +msgid "Hide playlist" +msgstr "Anubrir llista de reproducción" + +#: ../src/parole-player.c:327 +msgid "Show playlist" +msgstr "Amosar llista de reproducción" + +#: ../src/parole-player.c:543 +#: ../browser-plugin/media-plugin/parole-plugin-player.c:297 +msgid "Media stream is not seekable" +msgstr "Nun s'alcuentra el Fluxu (stream) de Medios" + +#. +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1098 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Siguiente pista" + +#. +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1110 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Pista previa" + +#: ../src/parole-statusbar.c:61 +#: ../browser-plugin/media-plugin/parole-plugin-player.c:590 +msgid "Buffering" +msgstr "Atroxando nel buffer" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Paráu" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Fináu" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Posáu" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Reproduciendo" + +#: ../src/parole-statusbar.c:145 +msgid "Live stream:" +msgstr "Fluxu en direutu:" + +#: ../src/parole-about.c:75 +msgid "Author/Maintainer" +msgstr "Autor/Caltenedor" + +#: ../src/parole-about.c:81 +#, c-format +msgid "Translator (%s)" +msgstr "Traductor (%s)" + +#: ../src/parole-disc.c:202 +msgid "Play Disc" +msgstr "Reproducir Discu" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Locale Actual" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Árabe" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Armeniu" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Bálticu" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Célticu" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Centrueuropéu" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Chinu simplificáu" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Chinu tradicional" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Croata" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Cirílicu" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Cirílicu/Rusu" + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Cirílicu/Ucranianu" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Xorxanu" + +#: ../src/parole-subtitle-encoding.c:242 ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Griegu" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: ../src/parole-subtitle-encoding.c:255 ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Hebréu" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Hebréu Visual" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Hindi" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Islandés" + +#: ../src/parole-subtitle-encoding.c:273 ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Xaponés" + +#: ../src/parole-subtitle-encoding.c:280 ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Coreanu" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Nórdicu" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Persa" + +#: ../src/parole-subtitle-encoding.c:295 ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Rumanu" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "Sureuropéu" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Thai" + +#: ../src/parole-subtitle-encoding.c:306 ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Turcu" + +#: ../src/parole-subtitle-encoding.c:315 ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Western" + +#: ../src/parole-subtitle-encoding.c:337 ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: ../src/parole-open-location.c:181 +msgid "Open location..." +msgstr "Abrir llugar..." + +#: ../src/parole-open-location.c:186 +msgid "Open location of media file or live stream:" +msgstr "Abrir llugar del ficheru multimedia o fluxu:" + +#: ../src/parole-open-location.c:205 +msgid "Clear history" +msgstr "Llimpiar hestorial" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "Reproducir Pista" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "Pista %i" + +#: ../src/parole-plugins-manager.c:297 ../src/parole-plugins-manager.c:433 +msgid "Visit Website" +msgstr "Visitar Páxina Web" + +#: ../src/parole-plugins-manager.c:373 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Desconocíu" + +#: ../src/parole-plugins-manager.c:412 +msgid "No installed plugins found on this system" +msgstr "" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Audio" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Video" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Audio y video" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Tolos ficheros soportaos" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Ficheros de llistes de reproducción" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Títulu:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Artista:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Álbum:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "Añu:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "Xeneral" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "El fluxu nun almite cambeos d'etiquetes" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Atroxar cambeos d'etiquetes del mediu" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Propiedaes" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Lleer Propiedaes del Mediu" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +#, fuzzy +msgid "Stream Properties" +msgstr "Propiedaes" + +#: ../plugins/tray/tray-provider.c:262 +msgid "Playing:" +msgstr "Reproduciendo:" + +#: ../plugins/tray/tray-provider.c:262 +msgid "Duration:" +msgstr "Duración:" + +#: ../plugins/tray/tray-provider.c:420 +msgid "Tray icon plugin" +msgstr "complementu d'iconu de bandexa" + +#: ../plugins/tray/tray-provider.c:430 +msgid "Enable notification" +msgstr "Activar notificación" + +#: ../plugins/tray/tray-provider.c:439 +msgid "Always minimize to tray when window is closed" +msgstr "Minimizar siempres a la bandexa cuando se zarra la ventana" + +#: ../plugins/tray/tray-provider.c:478 +msgid "Minimize to tray?" +msgstr "Minimizar a la bandexa?" + +#: ../plugins/tray/tray-provider.c:484 +msgid "Minimize to tray" +msgstr "Minimizar a la bandexa" + +#: ../plugins/tray/tray-provider.c:500 +msgid "Are you sure you want to quit Parole" +msgstr "Daveres quies quitar Parole?" + +#: ../plugins/tray/tray-provider.c:504 +msgid "Remember my choice" +msgstr "Remembrar la mio eleición" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Amosar iconu na estaya de la bandexa del sistema" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Iconu de bandexa" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +#, fuzzy +msgid "Set the main window name to the current playing media name." +msgstr "" +"Afitar el nome de la ventana principal al\n" +" nome actual del mediu en reproducción." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +#, fuzzy +msgid "Window Title" +msgstr "Títulu de la ventana" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "" + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "" + +#: ../browser-plugin/media-plugin/main.c:72 +msgid "socket" +msgstr "" + +#: ../browser-plugin/media-plugin/main.c:72 +msgid "SOCKET ID" +msgstr "" + +#: ../browser-plugin/media-plugin/main.c:73 +#, fuzzy +msgid "url to play" +msgstr "Mediu a reproducir" + +#: ../browser-plugin/media-plugin/main.c:73 +msgid "URL" +msgstr "" + +#: ../browser-plugin/media-plugin/parole-plugin-player.c:138 +#, fuzzy +msgid "Leave fullscreen" +msgstr "gtk-leave-fullscreen" + +#: ../browser-plugin/media-plugin/parole-plugin-player.c:143 +#, fuzzy +msgid "Fullscreen" +msgstr "gtk-leave-fullscreen" + +#. +#. * Copy url +#. +#: ../browser-plugin/media-plugin/parole-plugin-player.c:452 +msgid "Copy url" +msgstr "" + +#~ msgid "Enabled" +#~ msgstr "Activáu" + +#~ msgid "Plugin" +#~ msgstr "Plugin" + +#~ msgid "gtk-close" +#~ msgstr "gtk-close" + +#~ msgid "gtk-properties" +#~ msgstr "gtk-properties" + +#~ msgid "Visite Website" +#~ msgstr "Visite Páxina Web" diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..b1577be --- /dev/null +++ b/po/ca.po @@ -0,0 +1,874 @@ +# Catalan translations for parole package +# Traduccions al català del paquet «parole». +# Copyright (C) 2009 THE parole'S COPYRIGHT HOLDER +# This file is distributed under the same license as the parole package. +# +# Carles Muñoz Gorriz , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: parole\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-08-11 10:10+0000\n" +"PO-Revision-Date: 2011-08-11 17:49+0100\n" +"Last-Translator: Pol Ruzafa \n" +"Language-Team: Catalan\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Catalan\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Pantalla ampla)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Relació d'aspecte" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Automàtic" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Menú de capítols" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "Menú DVD" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "D'una imatge ISO" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Reproductor de suports" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Silenci" + +#: ../data/interfaces/parole.ui.h:12 +#: ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Capítol següent" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "Cap" + +#: ../data/interfaces/parole.ui.h:14 +#: ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Reproductor de suports Parole" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Connectors" + +#: ../data/interfaces/parole.ui.h:16 +#: ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Capítol anterior" + +#: ../data/interfaces/parole.ui.h:17 +#: ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Repetició" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Selecciona pista" + +#: ../data/interfaces/parole.ui.h:19 +#: ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Ordre aleatori" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Só" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Quadrat" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Menys volum" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Més volum" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Edita" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "A_juda" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Suport" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "_Obre una ubicació" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_Visualitza" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Afegeix" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "Obre fitxers de suports" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "Reproductor de suports Parole" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Substitueix la llista de reproducció pels fitxers oberts" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Explorar els directoris recursivament" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Començar a reproduir els fitxers oberts" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Autor:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Descripció:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Lloc:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Connectors del reproductor de suports" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Connectors de Parole" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Àudio" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Pantalla" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Subtítols" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Vídeo" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Carrega els subtítols automàticament quan es reprodueixi una peŀlícula" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Brillantor:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Contrast:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Desactivar el protector de pantalla mentre es reprodueix un vídeo" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Mostra efectes visuals quan es reprodueixen fitxers d'àudio" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Codificació: " + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Tipus de lletra:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Matís:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Ajustaments del reproductor de suports" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Opcions de Parole" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Ajusta als valor per defecte" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Saturació:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Tipus de visualització:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Per extensió" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Seleccioneu el tipus de fitxer (per extensió)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Neteja l'historial" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "Entra l'adreça del lloc a obrir" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "Obre un lloc de fitxer de suoprt o de flux en directe:" + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "Missatge" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "Error" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "Cal massa temps per carregar el flux" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Para" + +#: ../gst/parole-gst.c:1715 +msgid "Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "No s'ha pogut carregar el connector playbin Gstreamer, comproveu la vostra instaŀlació de Gstreamer" + +#: ../gst/parole-gst.c:1735 +msgid "Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "No s'ha pogut carregar el connector de vídeo Gstreamer, comproveu la vostra instaŀlació de Gstreamer" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Reproductor de suports Parole %s\n" +"\n" +"Forma par del projecte Xfce Goodies\n" +"http://goodies.xfce.org\n" +"\n" +"Amb llicència GNU GPL.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Paràmetre desconegut" + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Obre una instància nova" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "No carregar els connectors" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Establir el camí per a Audio-CD/VCD/DVD" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Reprodueix o pausa si ja s'està reproduint" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Atura la reproducció" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Pista següent" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Pista anterior" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Saltant endavant" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Saltant enredera" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Puja el volum" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Baix el volum" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Volum silenciat" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Informació de la versió" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "Comença el mode a pantalla completa" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "Activar/Desactivar suport per a XV" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Suport a reproduir" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Ja s'està executant Parole, empreu -i per obrir una instància nova\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "S'ha denegat el permís" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "S'ha produït un error en desar la llista de reproducció" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "Format de la llista de reproducció desconegut" + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "No es reconeix el format de la llista de reproducció. Seleccioneu un format de llista de reproducció compatible" + +#: ../src/parole-medialist.c:568 +#: ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Desconegut" + +#: ../src/parole-medialist.c:642 +#: ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Llista de reproducció" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "Llistes de reproducció M3U" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "Llistes de reproducció PLS" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Redirecció avançada del flux" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "La llista de reproducció es pot compartir" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "Obre la carpeta contenedora" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "Substitueix la llista de reproducció en obrir fitxers" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Reprodueix els fitxers oberts" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Recorda la llista de reproducció" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Llista de suports" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Amaga la llista de reproducció" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Mostra la llista de reproducció" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "Obrir una imatge ISO" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "Imatge de CD" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "Imatge de DVD" + +#: ../src/parole-player.c:551 +#: ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "El flux del suport no es pot cercar" + +#. +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Pista següent" + +#. +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Pista anterior" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Memòria intermèdia" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Parat" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Acabat" + +#: ../src/parole-statusbar.c:114 +#: ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Aturat" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Reproduint" + +#: ../src/parole-statusbar.c:170 +#: ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "flux en directe:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Autor/Mantenidor" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Traductor (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Reprodueix el disc" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Localització actual" + +#: ../src/parole-subtitle-encoding.c:168 +#: ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 +#: ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Àrab" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Armeni" + +#: ../src/parole-subtitle-encoding.c:180 +#: ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Bàltic" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Celta" + +#: ../src/parole-subtitle-encoding.c:190 +#: ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 +#: ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Centre-europeu" + +#: ../src/parole-subtitle-encoding.c:199 +#: ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 +#: ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Xinès simplificat" + +#: ../src/parole-subtitle-encoding.c:208 +#: ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Xinès tradicional" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Croat" + +#: ../src/parole-subtitle-encoding.c:218 +#: ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 +#: ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 +#: ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Ciríŀlic" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Ciríŀlic/rus" + +#: ../src/parole-subtitle-encoding.c:234 +#: ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Ciríŀlic/ucraïnès" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Georgià" + +#: ../src/parole-subtitle-encoding.c:242 +#: ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Grec" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: ../src/parole-subtitle-encoding.c:255 +#: ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 +#: ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Hebreu" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Hebreu visual" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Hindi" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Islandès" + +#: ../src/parole-subtitle-encoding.c:273 +#: ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Japonès" + +#: ../src/parole-subtitle-encoding.c:280 +#: ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 +#: ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Coreà" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Nòrdic" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Persa" + +#: ../src/parole-subtitle-encoding.c:295 +#: ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Romanès" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "Sud-europeu" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Tailandès" + +#: ../src/parole-subtitle-encoding.c:306 +#: ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 +#: ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Turc" + +#: ../src/parole-subtitle-encoding.c:315 +#: ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 +#: ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 +#: ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 +#: ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Occidental" + +#: ../src/parole-subtitle-encoding.c:337 +#: ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "S'està reproduint la pista" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "Pista %i" + +#: ../src/parole-plugins-manager.c:301 +#: ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "Vés al lloc web" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "No s'han trobat connectors al sistema" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Àudio" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Vídeo" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Àudio i vídeo" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Tots els fitxers compatibles" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Fitxers de llistes de reproducció" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Títol:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Artista:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Àlbum:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "Any:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "General" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "El flux no permet el canvi d'etiquetes" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Desa els canvis de les etiquetes del suport" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Propietats" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Llegeix les propietats del suport" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Propietats del corrent" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "S'està reproduint:" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "Duració:" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "Connector de la icona de safata" + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "Habilita la notificació" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "Minimitza sempre a la safata quan es tanca la finestra" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "Voleu minimitzar a la safata?" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "Minimitza a la safata" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "Segur que voleu sortir de Parole?" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "Recorda la selecció" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Mostra la icona a la safata del sistema" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Icona de la safata" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "Fixa el nom de la finestra principal amb el nom actual del mitjà en reproducció." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "Títol de la finestra" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "Inhabilitar la suspensió de l'ordinador per part el gestor d'energia mentre es reprodueix un DVD." + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "Connector del gestor d'energia" + +#~ msgid "Open location..." +#~ msgstr "Obre una ubicació…" + +#~ msgid "socket" +#~ msgstr "socket" + +#~ msgid "SOCKET ID" +#~ msgstr "SOCKET ID" + +#~ msgid "url to play" +#~ msgstr "Ubicació a reproduir" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Fullscreen" +#~ msgstr "Pantalla completa" + +#~ msgid "Copy url" +#~ msgstr "Copiar ubicació" + +#~ msgid "Plugin" +#~ msgstr "Connectors" diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..66f6192 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,867 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: Parole\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-01-01 19:48+0000\n" +"PO-Revision-Date: \n" +"Last-Translator: Michal Várady \n" +"Language-Team: Czech\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-SourceCharset: ASCII\n" +"X-Poedit-Country: CZECH REPUBLIC\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Širokoúhle)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Poměr stran" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Automaticky" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Nabídka kapitoly" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "Disk DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "Nabídka disku DVD" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "Z obrazu disku DVD" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Přehrávač médií" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Ztlumit" + +#: ../data/interfaces/parole.ui.h:12 +#: ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Další kapitola" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "Žádný" + +#: ../data/interfaces/parole.ui.h:14 +#: ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Přehrávač médií Parole" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Zásuvné moduly" + +#: ../data/interfaces/parole.ui.h:16 +#: ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Předchozí kapitola" + +#: ../data/interfaces/parole.ui.h:17 +#: ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Opakovat" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Vybrat stopu" + +#: ../data/interfaces/parole.ui.h:19 +#: ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Náhodně" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Zvuk" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Čtverec" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Snížit hlasitost" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Zvýšit hlasitost" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Upravit" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "_Nápověda" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Média" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "_Otevřít umístění" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_Zobrazit" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Přidat" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "Otevřít soubory médií" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "Výběr médií Parole" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Nahradit seznam médií otevíranými soubory" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Procházet složky rekurzivně" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Zahájit přehrávání otevřených souborů" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Autor:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Popis:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Webová stránka:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Zásuvné moduly přehrávače médií" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Zásuvné moduly aplikace Parole" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Audio" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Displej" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Titulky" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Video" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Automaticky načítat titulky při přehrávání filmu" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Jas:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Kontrast:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Zakázat spořič obrazovky při přehrávání filmů" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Povolit vizualizace při přehrávání hudby" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Kódování:" + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Písmo:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Odstín:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Nastavení přehrávače médií" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Nastavení aplikace Parole" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Obnovit výchozí" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Sytost:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Typ vizualizace:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Podle přípony" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Vybrat typy souborů (podle přípony)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Vyčistit historii" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "Zadejte adresu umístění, které chcete otevřít" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "Otevřít umístění souboru média nebo živého datového toku" + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "Zpráva" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "Chyba" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "Načtení datového proudu trvá příliš dlouho" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Zastavit" + +#: ../gst/parole-gst.c:1715 +msgid "Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "Nelze zavést zásuvný modul GStreamer playbin, zkontrolujte stav instalace aplikace GStreamer" + +#: ../gst/parole-gst.c:1735 +msgid "Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "Nelze zavést zásuvný modul GStreamer video, zkontrolujte stav instalace aplikace GStreamer" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Přehrávač médií Parole %s\n" +"\n" +"Součást projektu Xfce Goodies\n" +"http://goodies.xfce.org\n" +"\n" +"Licencováno pod GNU GPL.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Neznámý argument" + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Otevřít novou instanci" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "Nezavádět zásuvné moduly" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Nastavit cestu zařízení Audio-CD/VCD/DVD" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Přehrát nebo pozastavit, pokud se již přehrává" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Zastavit přehrávání" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Další stopa" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Předchozí stopa" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Posunout vpřed" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Posunout zpět" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Zvýšit hlasitost" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Snížit hlasitost" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Ztlumit" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Informace o verzi" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "Spustit v režimu celé obrazovky" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "Povolit nebo zakázat podporu XV" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Přehrávaná média" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Aplikace Parole je již spuštěna, novou instanci otevřete použitím parametru -i\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "Přístup zamítnut" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "Chyba při ukládání souboru seznamu médií" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "Neznámý formát seznamu médií" + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "Vyberte seznam médií v podporovaném formátu" + +#: ../src/parole-medialist.c:568 +#: ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Neznámý" + +#: ../src/parole-medialist.c:642 +#: ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Seznam médií" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "Seznamy médií M3U" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "Seznamy médií PLS" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Pokročilé přesměrování datového toku" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "Seznam médií umožňující sdílení" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "Otevřít složku obsahující soubor" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "Nahradit seznam médií při otevírání souborů" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Přehrát otevřené soubory" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Zapamatovat si seznam médií" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Seznam médiíí" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Skrýt seznam médií" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Zobrazit seznam médií" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "Otevřít obraz ISO" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "Obraz disku CD" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "Obraz disku DVD" + +#: ../src/parole-player.c:551 +#: ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "Datový tok neumožňuje přesouvání" + +#. +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Další stopa" + +#. +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Předchozí stopa" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Ukládání do vyrovnávací paměti" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Zastaveno" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Dokončeno" + +#: ../src/parole-statusbar.c:114 +#: ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Pozastaveno" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Přehrávání" + +#: ../src/parole-statusbar.c:170 +#: ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "Živý datový tok:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Autor a správce" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Překladatel (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Přehrát disk" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Současné regionální nastavení" + +#: ../src/parole-subtitle-encoding.c:168 +#: ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 +#: ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Arabské" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Arménské" + +#: ../src/parole-subtitle-encoding.c:180 +#: ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Pobalstské jazyky" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Keltské" + +#: ../src/parole-subtitle-encoding.c:190 +#: ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 +#: ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Středoevropské" + +#: ../src/parole-subtitle-encoding.c:199 +#: ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 +#: ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Čínské zjednodučené" + +#: ../src/parole-subtitle-encoding.c:208 +#: ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Čínské tradiční" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Chorvatské" + +#: ../src/parole-subtitle-encoding.c:218 +#: ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 +#: ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 +#: ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Cyrilice" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Cyrilice/Rusky" + +#: ../src/parole-subtitle-encoding.c:234 +#: ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Cyrilice/Ukrajinsky" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Gruzinské" + +#: ../src/parole-subtitle-encoding.c:242 +#: ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Řecké" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: ../src/parole-subtitle-encoding.c:255 +#: ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 +#: ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Hebrejské" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Hebrejské vizuální" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Hindské" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Islandské" + +#: ../src/parole-subtitle-encoding.c:273 +#: ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Japonské" + +#: ../src/parole-subtitle-encoding.c:280 +#: ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 +#: ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Korejské" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Severské" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Perské" + +#: ../src/parole-subtitle-encoding.c:295 +#: ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Rumunské" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "Jihoevropské" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Thajské" + +#: ../src/parole-subtitle-encoding.c:306 +#: ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 +#: ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Turecké" + +#: ../src/parole-subtitle-encoding.c:315 +#: ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 +#: ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 +#: ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 +#: ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Západní" + +#: ../src/parole-subtitle-encoding.c:337 +#: ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Vietnamské" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "Přehrávání stopy" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "Stopa %i" + +#: ../src/parole-plugins-manager.c:301 +#: ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "Navštívit webovou stránku" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "V systému nebyly nalezeny žádné zásuvné moduly" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Audio" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Video" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Audio a video" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Všechny podporované soubory" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Soubory seznamů médií" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Název:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Umělec:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Album:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "Rok:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "Obecné" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "Datový tok nepodporuje změny značek" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Uložit změny značek média" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Vlastnosti" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Číst vlastnosti média" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Vlastnosti datového toku" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "Přehrávání:" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "Délka:" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "Ikona zásuvného modulu v oznamovací oblasti " + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "Povolit oznamování" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "Při zavření okna vždy minimalizovat do oznamovací oblasti" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "Minimalizovat do oznamovací oblasti?" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "Minimalizovat do oznamovací oblasti" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "Opravdu chcete ukončit aplikaci Parole?" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "Zapamatovat si tuto volbu" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Zobrazovat ikonu v oznamovací oblasti" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Ikona v oznamovací oblasti" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "Nastavit název hlavního okna na název přehrávaného média." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "Titulek okna" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "Potlačit nastavení úsporných režimů Správce napájení při přehrávání disku DVD." + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "Zásuvný modul Správce napájení" + +#~ msgid "Open location..." +#~ msgstr "Otevřít umístění..." + +#~ msgid "socket" +#~ msgstr "soket" + +#~ msgid "SOCKET ID" +#~ msgstr "IDENTIFIKÁTOR SOKETU" + +#~ msgid "url to play" +#~ msgstr "Umístění URL pro přehrávání" + +#~ msgid "URL" +#~ msgstr "Umístění URL" + +#~ msgid "Fullscreen" +#~ msgstr "Celá obrazovka" + +#~ msgid "Copy url" +#~ msgstr "Zkopírovat umístění URL" diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..e9450f0 --- /dev/null +++ b/po/da.po @@ -0,0 +1,843 @@ +# Danish translation of parole. +# Copyright (C) 2010 parole +# This file is distributed under the same license as the parole package. +# Per Kongstad , 2009, 10 +# +msgid "" +msgstr "" +"Project-Id-Version: parole 0.2.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-04-17 10:08+0000\n" +"PO-Revision-Date: 2010-01-13 20:09+0100\n" +"Last-Translator: Per Kongstad \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Danish\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-Country: Denmark\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Widescreen)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Skærmforhold" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Auto" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Afsnitsmenu" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "Dvd" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "Dvd-menu" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "Fra ISO-billede" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Medieafspiller" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Slå lyd fra" + +#: ../data/interfaces/parole.ui.h:12 ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Næste kapitel" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "Ingen" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Parole medieafspiller" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Udvidelsesmoduler" + +#: ../data/interfaces/parole.ui.h:16 ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Tidligere kapitel" + +#: ../data/interfaces/parole.ui.h:17 ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Gentag" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Vælg spor" + +#: ../data/interfaces/parole.ui.h:19 ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Blande" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Lyd" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Kvadratisk" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Lydstyrke ned" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Lydstyrke op" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Redigér" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "_Hjælp" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Medie" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "_Åbn sted" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_Vis" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Tilføj" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "Åbn mediefiler" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "Parole medievælger" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Erstat spilleliste med åbne filer" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Gennemsøg mapper rekursivt" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Begynd at afspille åbne filer" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Forfatter:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Beskrivelse:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Side:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Udvidelsesmoduler til medieafspiller" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Udvidelsesmoduler til Parole" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Lyd" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Skærm" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Undertitler" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Video" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Indlæs automatisk undertitler når der afspilles fil indholdende film" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Lysstyrke:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Kontrast:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Afbryd pauseskærm når film afspilles" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Slå visualisering til når der spilles en lydfil" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Tegnsæt: " + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Skrifttype:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Farvetone:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Indstillinger til medieafspiller" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Indstillinger til parole" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Nulstil til standard" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Mætning:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Visualiseringstype:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Efter filendelse" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Vælg filtyper (efter filendelse)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Slet historik" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "Indtast addressen til lokationen som skal åbnes" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "Åbn placering af mediefiler eller live-strøm" + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "Besked" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "Fejl" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "Det tager for lang tid at indlæse strømmen" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Stop" + +#: ../gst/parole-gst.c:1715 +msgid "Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "Kunne ikke indlæse udvidelsesmodulet playbin GStreamer. Kontrollér din installation af GStreamer" + +#: ../gst/parole-gst.c:1735 +msgid "Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "Kunne ikke indlæse udvidelsesmodulet video GStreamer. Kontrollér din installation af GStreamer" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Parole medieafspiller %s\n" +"\n" +"Del af projektet Xfce Goodies\n" +"http://goodies.xfce.org\n" +"\n" +"Licenseret under GNU GPL'en.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Ukendt argument" + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Åbn en ny instans" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "Undlad at indlæse udvidelsesmoduler" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Indstil sti til lyd-cd/vcd/dvd" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Afspil eller pause hvis allerede afspiller" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Afbryd afspilning" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Næste spor" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Forrige spor" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Søg fremad" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Søg tilbage" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Forøg lydstyrke" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Formindsk lydstyrke" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Mute lydstyrke" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Versionsinformation" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "Start i fuldskærm" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "Slå til/fra understøttelse af XV" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Media til afspilning" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Parole kører allerede. Brug -i for at åbne en my instans\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "Adgang nægtet" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "Fejl opstod ved gem af spilleliste" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "Ukendt format til spllleliste " + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "Vælg venligst et understøttet format til spilleliste" + +#: ../src/parole-medialist.c:568 ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Ukendt" + +#: ../src/parole-medialist.c:642 ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Spilleliste" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "M3U spillelister" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "PLS spillelister" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Avanceret omdirigering af strøm" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "Delbar spilleliste" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "Åbn indholdsmappe" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "Erstat spilleliste når filer åbnes" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Afspil åbnede filer" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Husk spilleliste" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Medieliste" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Skjul spilleliste" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Vis spilleliste" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "Åbn ISO-billede" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "Cd-billede" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "Dvd-billede" + +#: ../src/parole-player.c:551 ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "Mediestrømmen er ikke søgbar" + +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Næste spor" + +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Forrige spor" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Opbygger buffer" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Stoppet" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Afsluttet" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Pause" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Afspiller" + +#: ../src/parole-statusbar.c:170 ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "Direkte strøm:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Forfatter/vedligeholder" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Oversætter (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Afspil disk" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Nuværende lokalisering" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Arabisk" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Armensk" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Baltisk" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Keltisk" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Centraleuropæisk" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Kinesisk, simpelt" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Kinesisk, traditionelt" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Kroatisk" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Kyrillisk" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Kyrillisk/russisk" + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Kyrillisk/ukrainsk" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Georgisk" + +#: ../src/parole-subtitle-encoding.c:242 ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Græsk" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: ../src/parole-subtitle-encoding.c:255 ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Hebræisk" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Hebræisk, visuelt" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Hindi" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Islandsk" + +#: ../src/parole-subtitle-encoding.c:273 ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Japansk" + +#: ../src/parole-subtitle-encoding.c:280 ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Koreansk" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Nordisk" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Persisk" + +#: ../src/parole-subtitle-encoding.c:295 ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Rumænsk" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "Sydeuropæisk" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Thailansk" + +#: ../src/parole-subtitle-encoding.c:306 ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Tyrkisk" + +#: ../src/parole-subtitle-encoding.c:315 ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Vestlig" + +#: ../src/parole-subtitle-encoding.c:337 ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Vietnamesisk" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "Afspiller spor" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "Spor %i" + +#: ../src/parole-plugins-manager.c:301 ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "Besøg netsted" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "Ingen installerede udvidelsesmoduler fundet på dette system" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Lyd" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Video" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Lyd og video" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Alle understøttede filer" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Spillelistefiler" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Titel:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Kunstner:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Album:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "År:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "Generel" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "Strøm understøtter ikke ændringer af mærker" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Gem ændringer af mediemærker" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Egenskaber" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Læs medieegenskaber" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Egenskaber til strømme" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "Afspiller:" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "Varighed:" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "Udvidelsesmodul til statusikon" + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "Slå påmindelse til" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "Minimér altid til statusfelt når vindue er lukket" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "Minimér til statusfelt?" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "Minimér til statusfelt" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "Er du sikker på, at du vil afbryde Parole" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "Husk mit valg" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Vis ikon i proceslinien" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Statusikon" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "Sæt hovedvinduets navn til det aktuelle afspillende medienavn." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "Vinduetitel" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "Forbyd strømstyringhåndtering at afbryde maskinen ved afspilning af dvd." + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "Udvidelsesmodul til strømstyringhåndtering" + +#~ msgid "Open location..." +#~ msgstr "Åbn sted..." + +#~ msgid "socket" +#~ msgstr "sokkel" + +#~ msgid "SOCKET ID" +#~ msgstr "SOKKEL-ID" + +#~ msgid "url to play" +#~ msgstr "url til afspilning" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Fullscreen" +#~ msgstr "Fuldskærm" + +#~ msgid "Copy url" +#~ msgstr "Kopiér url" + +#~ msgid "Enabled" +#~ msgstr "Slået til" + +#~ msgid "Plugin" +#~ msgstr "Udvidelsesmodul" + +#~ msgid "gtk-close" +#~ msgstr "gtk-afslut" + +#~ msgid "gtk-properties" +#~ msgstr "gtk-egenskaber" + +#~ msgid "Visite Website" +#~ msgstr "Besøg netstedet" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..1512b87 --- /dev/null +++ b/po/de.po @@ -0,0 +1,836 @@ +# German translation of Parole. +# Copyright (C) 2009 Parole's COPYRIGHT HOLDER +# This file is distributed under the same license as the Parole package. +# Mario Blättermann , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: parole master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-08-23 16:09+0000\n" +"PO-Revision-Date: 2009-12-10 17:46+0100\n" +"Last-Translator: Christoph Wickert \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Breitbild)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Seitenverhältnis" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Automatisch" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Kapitelmenü" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "DVD-Menü" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "Aus ISO-Abbild" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Medien-Abspieler" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Stumm" + +#: ../data/interfaces/parole.ui.h:12 ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Nächstes Kapitel/Film" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "Kein" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Parole Medien-Abspieler" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Erweiterungen" + +#: ../data/interfaces/parole.ui.h:16 ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Vorheriges Kapitel/Film" + +#: ../data/interfaces/parole.ui.h:17 ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Endlosschleife" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Titel auswählen" + +#: ../data/interfaces/parole.ui.h:19 ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Zufallsmodus" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Audio" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Quadratisch" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Leiser" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Lauter" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Bearbeiten" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "_Hilfe" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Medien" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "_Ort öffnen" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_Ansicht" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Hinzufügen" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "Mediendateien öffnen" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "Parole Medien-Wähler" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Wiedergabeliste durch geöffnete Dateien ersetzen" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Ordner rekursiv durchsuchen" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Geöffnete Dateien abspielen" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Autor:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Beschreibung:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Seite:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Erweiterungen für den Medien-Abspieler" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Parole-Erweiterungen" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Audio" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Anzeige" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Untertitel" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Video" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Untertitel automatisch laden, wenn ein Film wiedergegeben wird" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Helligkeit:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Kontrast:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Bildschirmschoner während der Wiedergabe von Filmen deaktivieren" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Visuelle Effekte anzeigen, wenn eine Audio-Datei wiedergegeben wird" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Kodierung:" + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Schrift:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Farbton:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Medien-Abspieler-Einstellungen" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Parole-Einstellungen" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Auf Vorgaben zurücksetzen" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Sättigung:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Visualisierungstyp:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Nach Dateierweiterung" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Dateitypen auswählen (nach Erweiterung)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Chronik leeren" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "Adresse des zu öffnenden Ortes eingeben" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "Ort einer Mediendatei oder eines Live-Streams öffnen:" + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "Nachricht" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "Fehler" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "Der Stream benötigt zu viel Zeit zum Laden" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Stop" + +#: ../gst/parole-gst.c:1715 +msgid "Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "Playbin-GStreamer-Plugin kann nicht geladen werden, überprüfen Sie Ihre GStreamer-Installation" + +#: ../gst/parole-gst.c:1735 +msgid "Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "Video-GStreamer-Plugin kann nicht geladen werden, überprüfen Sie Ihre GStreamer-Installation" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Parole Medien-Abspieler %s\n" +"\n" +"Teil des Projekts Xfce-Goodies\n" +"http://goodies.xfce.org\n" +"\n" +"Lizensiert unter der GNU GPL.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Unbekanntes Argument" + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Eine neue Instanz öffnen" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "Keine Erweiterungen laden" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Pfad des Audio-CD/VCD/DVD Gerätes angeben" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Wiedergabe (oder Pause, falls Wiedergabe läuft)" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Wiedergabe anhalten" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Nachfolgender Titel" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Vorheriger Titel" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Vorspulen" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Zurückspulen" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Lautstärke erhöhen" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Lautstärke senken" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Stummschalten" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Versionsinformation" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "Im Vollbildmodus starten" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "XV-Unterstützung aktivieren/deaktivieren" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Medien zum Abspielen" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Parole läuft bereits, verwenden Sie -i, um eine neue Instanz zu öffnen\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "Erlaubnis verweigert" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "Fehler beim Speichern der Wiedergabelistendatei" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "Unbekanntes Wiedergabelistenformat" + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "Bitte wählen sie ein Unbekanntes unterstütztes Wiedergabelistenformat" + +#: ../src/parole-medialist.c:568 ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Unbekannt" + +#: ../src/parole-medialist.c:642 ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Wiedergabeliste" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "M3U-Wiedergabelisten" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "PLS-Wiedergabelisten" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Advanced Stream Redirector" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "Gemeinsame Wiedergabeliste" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "Beinhaltenden Ordner öffnen" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "Wiedergabeliste durch geöffnete Dateien ersetzen" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Geöffnete Dateien abspielen" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Wiedergabeliste speichern" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Medienliste" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Wiedergabeliste verbergen" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Wiedergabeliste anzeigen" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "ISO-Abbild öffnen" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "CD-Abbild" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "DVD-Abbild" + +#: ../src/parole-player.c:551 ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "Medien-Stream ist nicht durchsuchbar" + +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Nachfolgender Titel" + +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Vorheriger Titel" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Puffervorgang" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Angehalten" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Beendet" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Pause" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Wiedergabe" + +#: ../src/parole-statusbar.c:170 ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "Live-Stream:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Autor/Betreuer" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Übersetzer (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Medium abspielen" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Derzeitige Standorteinstellungen" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Arabisch" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Armenisch" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Baltisch" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Keltisch" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Mitteleuropäisch" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Chinesisch (vereinfacht)" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Chinesisch (traditionell)" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Kroatisch" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Kyrillisch" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Kyrillisch/Russisch" + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Kyrillisch/Ukrainisch" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Georgisch" + +#: ../src/parole-subtitle-encoding.c:242 ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Griechisch" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: ../src/parole-subtitle-encoding.c:255 ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Hebräisch" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Hebräisch (visuell)" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Hindi" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Isländisch" + +#: ../src/parole-subtitle-encoding.c:273 ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Japanisch" + +#: ../src/parole-subtitle-encoding.c:280 ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Koreanisch" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Nordisch" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Persisch" + +#: ../src/parole-subtitle-encoding.c:295 ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Rumänisch" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "Südeuropäisch" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Thai" + +#: ../src/parole-subtitle-encoding.c:306 ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Türkisch" + +#: ../src/parole-subtitle-encoding.c:315 ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Westlich" + +#: ../src/parole-subtitle-encoding.c:337 ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Vietnamesisch" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "Titel wird abgespielt" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "Titel %i" + +#: ../src/parole-plugins-manager.c:301 ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "Web-Seite besuchen" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "Keine installierten Erweiterungen gefunden" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Audio" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Video" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Audio und Video" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Unterstützte Dateien" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Wiedergabelisten-Dateien" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Titel:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Interpret:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Album:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "Jahr:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "Allgemein" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "Stream unterstützt keine Änderungen der Tags" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Änderungen der Medien-Tags speichern" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Eigenschaften" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Medieneigenschaften lesen" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Stream-Eigenschaften" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "Wiedergabe:" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "Dauer:" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "Benachrichtigungsfeld-Plugin" + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "Benachrichtigungen aktivieren" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "Immer ins Benachrichtigungsfeld minimieren, wenn das Fenster geschlossen wird" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "Ins Benachrichtigungsfeld minimieren?" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "Ins Benachrichtigungsfeld minimieren" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "Sind Sie sicher, dass Sie Parole beenden wollen?" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "Auswahl merken" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Symbol im Benachrichtigungsfeld anzeigen" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Symbol im Benachrichtigungsfeld" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "Titel des Hauptfensters auf den Namen des derzeit abgespielten Mediums setzen." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "Fenstertitel" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "Hindert die Energieverwaltung am Herunterfahren des Computers, während eine DVD wiedergegeben wird." + +# 'Energieverwaltungserweiterung' ist zu lang und die anderen Plugins haben +# auch nicht 'Plugin' im Namen. +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "Energieverwaltung" + +#~ msgid "Open location..." +#~ msgstr "Ort öffnen …" + +#~ msgid "socket" +#~ msgstr "Socket" + +#~ msgid "SOCKET ID" +#~ msgstr "SOCKET ID" + +#~ msgid "url to play" +#~ msgstr "URL zum Abspielen" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Fullscreen" +#~ msgstr "Vollbild" + +#~ msgid "Copy url" +#~ msgstr "URL kopieren" + +#~ msgid "Enabled" +#~ msgstr "Aktiviert" + +#~ msgid "Plugin" +#~ msgstr "Erweiterung" diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..9520459 --- /dev/null +++ b/po/el.po @@ -0,0 +1,839 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: parole\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-25 04:08+0000\n" +"PO-Revision-Date: 2010-03-30 23:39+0200\n" +"Last-Translator: George Vlahavas \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Greek\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-Country: GREECE\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Ευρεία οθόνη)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (Τηλεόραση)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Αναλογία οθόνης" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Αυτόματο" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Μενού κεφαλαίων" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "Μενού DVD" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "Από εικόνα ISO" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Εφαρμογή αναπαραγωγής πολυμέσων" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Σίγαση" + +#: ../data/interfaces/parole.ui.h:12 ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Επόμενο κεφάλαιο" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "Κανένα" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Εφαρμογή αναπαραγωγής πολυμέσων Parole" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Πρόσθετα" + +#: ../data/interfaces/parole.ui.h:16 ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Προηγούμενο κεφάλαιο" + +#: ../data/interfaces/parole.ui.h:17 ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Επανάληψη" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Επιλογή κομματιού" + +#: ../data/interfaces/parole.ui.h:19 ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Τυχαία αναπαραγωγή" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Ήχος" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Τετράγωνο" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Μείωση έντασης" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Αύξηση έντασης" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Επεξεργασία" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "_Βοήθεια" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Πολυμέσα" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "Άνοιγμα _τοποθεσίας" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_Εμφάνιση" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Προσθήκη" + +#: ../data/interfaces/mediachooser.ui.h:2 +#, fuzzy +msgid "Open media files" +msgstr "Άνοιγμα αρχείων πολυμέσων" + +#: ../data/interfaces/mediachooser.ui.h:3 +#, fuzzy +msgid "Parole Media Chooser" +msgstr "Εφαρμογή αναπαραγωγής πολυμέσων Parole" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Αντικατάσταση της λίστας αναπαραγωγής με ανοιγμένα αρχεία" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Σάρωση των καταλόγων αναδρομικά" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Εκκίνιση αναπαραγωγής ανοιγμένων αρχείων" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Συγγραφέας:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Περιγραφή:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Ιστοσελίδα:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Πρόσθετα εφαρμογής αναπαραγωγής πολυμέσων" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Πρόσθετα του Parole" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Ήχος" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Εμφάνιση" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Υπότιτλοι" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Εικόνα" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Αυτόματο άνοιγμα υποτίτλων με την αναπαραγωγή ταινίας" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Φωτεινότητα:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Αντίθεση:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Απενεργοποίηση της προστασίας οθόνης όταν γίνεται αναπαραγωγή ταινιών" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Ενεργοποίηση οπτικών εφέ όταν γίνεται αναπαραγωγή αρχείων ήχου" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Κωδικοποίηση:" + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Γραμματοσειρά:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Απόχρωση:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Ρυθμίσεις εφαρμογής αναπαραγωγής πολυμέσων" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Ρυθμίσεις του Parole" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Επαναφορά αρχικών τιμών" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Κορεσμός:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Είδος οπτικού εφέ:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Κατά επέκταση" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Επιλογή τύπων αρχείων (κατά επέκταση)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Εκκαθάριση ιστορικού" + +#: ../data/interfaces/open-location.ui.h:2 +#, fuzzy +msgid "Enter the address of a location to open" +msgstr "Εισάγετε τη διεύθυνση μιας τοποθεσίας προς άνοιγμα" + +#: ../data/interfaces/open-location.ui.h:3 +#, fuzzy +msgid "Open location of media file or live stream" +msgstr "Άνοιγμα τοποθεσίας αρχείου πολυμέσου ή ζωντανής ροής" + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +#, fuzzy +msgid "Message" +msgstr "Μήνυμα" + +#: ../common/parole-common.c:72 +#, fuzzy +msgid "Error" +msgstr "Σφάλμα" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "Η ροή απαιτεί πολύ χρόνο για να φορτωθεί" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Σταμάτημα" + +#: ../gst/parole-gst.c:1715 +msgid "Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "Δεν ήταν δυνατό να φορτωθεί το πρόσθετο GStreamer playbin, ελέγξτε την εγκατάσταση του GStreamer" + +#: ../gst/parole-gst.c:1735 +msgid "Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "Δεν ήταν δυνατό να φορτωθεί το πρόσθετο Gstreamer video, ελέξτε την εγκατάσταση του GStreamer" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Εφαρμογή Αναπαραγωγής Πολυμέσων Parole %s\n" +"\n" +"Μέρος του Έργου Xfce Goodies\n" +"http://goodies.xfce.org\n" +"\n" +"Αδειοδοτημένο με χρήση της GNU GPL.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Άγνωστη παράμετρος" + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Άνοιγμα νέου παραθύρου" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "Άρνηση φόρτωσης πρόσθετων" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Ορισμός της διαδρομής της συσκευής Audio-CD/VCD/DVD" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Αναπαραγωγή ή παύση αν γίνεται ήδη αναπαραγωγή" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Σταμάτημα αναπαραγωγής" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Επόμενο κομμάτι" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Προηγούμενο κομμάτι" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Αναζήτηση μπροστά" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Αναζήτηση πίσω" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Αύξηση έντασης ήχου" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Μείωση έντασης ήχου" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Σίγαση ήχου" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Πληροφορίες έκδοσης" + +#: ../src/main.c:238 +#, fuzzy +msgid "Start in fullscreen mode" +msgstr "Εκκίνηση σε πλήρη οθόνη" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "Ενεργοποίηση/Απενεργοποίηση υποστήριξης XV" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Πολυμέσα προς αναπαραγωγή" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Το Parole ήδη εκτελείται, χρησιμοποιήστε το -i για να ανοίξετε νέο παράθυρο\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "Άρνηση πρόσβασης" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "Σφάλμα κατά την αποθήκευση της λίστας αναπαραγωγής" + +#: ../src/parole-medialist.c:515 +#, fuzzy +msgid "Unknown playlist format" +msgstr "Εμφάνιση λίστας αναπαραγωγη" + +#: ../src/parole-medialist.c:516 +#, fuzzy +msgid "Please chooser a supported playlist format" +msgstr "Παρακαλούμε επιλέξτε ένα υποστηριζόμενο είδος λίστας αναπαραγωγής" + +#: ../src/parole-medialist.c:568 ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Άγνωστο" + +#: ../src/parole-medialist.c:642 ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Λίστα αναπαραγωγής" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "Λίστες αναπαραγωγής M3U" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "Λίστες αναπαραγωγής PLS" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Προχωρημένη προώθηση ροής" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "Λίστα αναπαραγωγής με δυνατότητα διαμοιρασμού" + +#. Clear +#: ../src/parole-medialist.c:1152 +#, fuzzy +msgid "Open Containing Folder" +msgstr "Άνοιγμα φακέλου που τα περιέχει" + +#: ../src/parole-medialist.c:1303 +#, fuzzy +msgid "Replace playlist when opening files" +msgstr "Αντικατάσταση της λίστας αναπαραγωγής κατά το άνοιγμα αρχίων" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Εκκίνηση αναπαραγωγής ανοιγμένων αρχείων" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Να θυμάσαι τη λίστα αναπαραγωγής" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Λίστα αρχείων πολυμέσων" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Απόκρυψη λίστας αναπαραγωγής" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Εμφάνιση λίστας αναπαραγωγη" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "Άνοιγμα εικόνας ISO" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "Εικόνα CD" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "Εικόνα DVD" + +#: ../src/parole-player.c:551 ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "Η ροή πολυμέσων δεν υποστηρίζει αναζήτηση" + +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Επόμενο κομμάτι" + +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Προηγούμενο κομμάτι" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Φόρτωση" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Σταματημένο" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Τελειωμένο" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Σε παύση" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Σε αναπαραγωγή" + +#: ../src/parole-statusbar.c:170 ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "Ζωντανή ροή:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Συγγραφέας/Συντηρητής" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Μεταφραστής (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Αναπαραγωγή δίσκου" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Τρέχουσα γλώσσα" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Αραβικά" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Αρμένικα" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Βαλτικά" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Κέλτικα" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Κεντρικής Ευρώπης" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Κινέζικα Απλοποιημένα" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Κινέζικα Παραδοσιακά" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Κροάτικα" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Κυριλλικά" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Κυριλλικά/Ρωσία" + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Κυριλλικά/Ουκρανία" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Γεωργιανά" + +#: ../src/parole-subtitle-encoding.c:242 ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Ελληνικά" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Γκουαράτι" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Γκουρμούκι" + +#: ../src/parole-subtitle-encoding.c:255 ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Εβραϊκά" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Εβραϊκά Οπτικά" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Ινδικά" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Ισλανδικά" + +#: ../src/parole-subtitle-encoding.c:273 ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Ιαπωνικά" + +#: ../src/parole-subtitle-encoding.c:280 ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Κορεάτικα" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Νορβηγικά" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Πέρσικα" + +#: ../src/parole-subtitle-encoding.c:295 ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Ρουμάνικα" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "Νότιας Ευρώπης" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Ταϊλανδέζικα" + +#: ../src/parole-subtitle-encoding.c:306 ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Τούρκικα" + +#: ../src/parole-subtitle-encoding.c:315 ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Δυτικά" + +#: ../src/parole-subtitle-encoding.c:337 ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Βιετναμέζικα" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "Αναπαραγωγή κομματιού" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "Κομμάτι %i" + +#: ../src/parole-plugins-manager.c:301 ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "Επίσκεψη στην ιστοσελίδα" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "Δεν βρέθηκαν εγκατεστημένα πρόσθετα στο σύστημα" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Ήχος" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Εικόνα" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Ήχος και εικόνα" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Όλα τα υποστηριζόμενα αρχεία" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Αρχεία λίστας αναπαραγωγής" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Τίτλος:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Καλλιτέχνης:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Άλμπουμ:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "Έτος:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "Γενικά" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "Η ροή δεν υποστηρίζει αλλαγές στις ετικέτες" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Αποθήκευση αλλαγών ετικετών πολυμέσων" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Ιδιότητες" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Διάβασμα ιδιοτήτων πολυμέσων" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Ιδιότητες ροής" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "Αναπαραγωγή:" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "Διάρκεια:" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "Πρόσθετο περιοχής ειδοποιήσεων" + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "Ενεργοποίηση ειδοποιήσεων" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "Να γίνεται πάντα ελαχιστοποίηση στην περιοχή ειδοποιήσεων όταν κλείνει το παράθυρο" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "Ελαχιστοποίηση στην περιοχή ειδοποιήσεων;" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "Ελαχιστοποίηση στην περιοχή ειδοποιήσεων" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "Είστε βέβαιοι ότι θέλετε να κλείσετε το Parole" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "Να θυμάσαι την επιλογή μου" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Εμφάνιση εικονιδίου στην περιοχή ειδοποιήσεων" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Εικονίδιο περιοχής ειδοποιήσεων" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "Ορισμός του ονόματος του αρχείου πολυμέσων που αναπαράγεται ως ονόματος του κυρίως παραθύρου" + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "Τίτλος παραθύρου" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "Αποτροπή της αδρανοποίησης του συστήματος από το Διαχειριστή Ενέργειας όταν γίνεται αναπαραγωγή DVD" + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "Πρόσθετο Διαχείρισης Ενέργειας" + +#~ msgid "Open location..." +#~ msgstr "Άνοιγμα τοποθεσίας..." + +#~ msgid "socket" +#~ msgstr "πρίζα" + +#~ msgid "SOCKET ID" +#~ msgstr "SOCKET ID" + +#~ msgid "url to play" +#~ msgstr "Διεύθυνση (URL) προς αναπαραγωγή" + +#~ msgid "URL" +#~ msgstr "Διεύθυνση (URL)" + +#~ msgid "Fullscreen" +#~ msgstr "Πλήρης οθόνη" + +#~ msgid "Copy url" +#~ msgstr "Αντιγραφή διεύθυνσης (URL)" diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000..b4e9486 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,812 @@ +# en_GB translation for parole. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Jeff Bailes , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-04-19 06:03+0000\n" +"PO-Revision-Date: 2010-12-19 19:32+1100\n" +"Last-Translator: Jeff Bailes \n" +"Language-Team: en_GB\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Widescreen)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Aspect Ratio" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Auto" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Chapter Menu" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "DVD Menu" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "From ISO image" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Media player" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Mute" + +#: ../data/interfaces/parole.ui.h:12 ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Next Chapter" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "None" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Parole Media Player" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Plugins" + +#: ../data/interfaces/parole.ui.h:16 ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Previous Chapter" + +#: ../data/interfaces/parole.ui.h:17 ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Repeat" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Select Track" + +#: ../data/interfaces/parole.ui.h:19 ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Shuffle" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Sound" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Square" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Volume Down" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Volume Up" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Edit" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "_Help" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Media" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "_Open location" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_View" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Add" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "Open media files" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "Parole Media Chooser" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Replace playlist with opened files" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Scan folders recursively" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Start playing opened files" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Author:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Description:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Site:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Media Player plugins" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Parole Plugins" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Audio" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Display" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Subtitles" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Video" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Automatically load subtitles when playing movie file" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Brightness:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Contrast:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Disable screen saver while playing movies" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Enable visualisation when playing audio file" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Encoding: " + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Font:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Hue:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Media Player Settings" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Parole Settings" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Reset To Defaults" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Saturation:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Visualisation type:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "By Extension" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Select File Types (By Extension)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Clear history" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "Enter the address of a location to open" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "Open location of media file or live stream" + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "Message" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "Error" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "The stream is taking too much time to load" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Stop" + +#: ../gst/parole-gst.c:1715 +msgid "" +"Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "" +"Unable to load playbin GStreamer plugin, check your GStreamer installation" + +#: ../gst/parole-gst.c:1735 +msgid "" +"Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "" +"Unable to load video GStreamer plugin, check your GStreamer installation" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Unknown argument " + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Open a new instance" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "Do not load plugins" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Set Audio-CD/VCD/DVD device path" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Play or pause if already playing" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Stop playing" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Next track" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Previous track" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Seek forwards" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Seek backwards" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Raise volume" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Lower volume" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Mute volume" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Version information" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "Start in fullscreen mode" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "Enabled/Disable XV support" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Media to play" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Parole is already running, use -i to open a new instance\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "Permission denied" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "Error saving playlist file" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "Unknown playlist format" + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "Please chooser a supported playlist format" + +#: ../src/parole-medialist.c:568 ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Unknown" + +#: ../src/parole-medialist.c:642 ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Playlist" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "M3U Playlists" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "PLS Playlists" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Advanced Stream Redirector" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "Shareable Playlist" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "Open Containing Folder" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "Replace playlist when opening files" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Play opened files" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Remember playlist" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Media list" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Hide playlist" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Show playlist" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "Open ISO image" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "CD image" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "DVD image" + +#: ../src/parole-player.c:551 ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "Media stream is not seekable" + +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Next Track" + +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Previous Track" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Buffering" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Stopped" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Finished" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Paused" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Playing" + +#: ../src/parole-statusbar.c:170 ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "Live stream:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Author/Maintainer" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Translator (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Play Disc" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Current Locale" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Arabic" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Armenian" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Baltic" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Celtic" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Central European" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Chinese Simplified" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Chinese Traditional" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Croatian" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Cyrillic" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Cyrillic/Russian" + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Cyrillic/Ukrainian" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Georgian" + +#: ../src/parole-subtitle-encoding.c:242 ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Greek" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: ../src/parole-subtitle-encoding.c:255 ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Hebrew" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Hebrew Visual" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Hindi" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Icelandic" + +#: ../src/parole-subtitle-encoding.c:273 ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Japanese" + +#: ../src/parole-subtitle-encoding.c:280 ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Korean" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Nordic" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Persian" + +#: ../src/parole-subtitle-encoding.c:295 ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Romanian" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "South European" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Thai" + +#: ../src/parole-subtitle-encoding.c:306 ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Turkish" + +#: ../src/parole-subtitle-encoding.c:315 ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Western" + +#: ../src/parole-subtitle-encoding.c:337 ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Vietnamese" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "Playing Track" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "Track %i" + +#: ../src/parole-plugins-manager.c:301 ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "Visit Website" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "No installed plugins found on this system" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Audio" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Video" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Audio and video" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "All supported files" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Playlist files" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Title:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Artist:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Album:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "Year:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "General" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "Stream doesn't support tags changes" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Save media tags changes" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Properties" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Read media properties" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Stream Properties" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "Playing:" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "Duration:" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "Tray icon plugin" + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "Enable notification" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "Always minimise to tray when window is closed" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "Minimise to tray?" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "Minimise to tray" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "Are you sure you want to quit Parole" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "Remember my choice" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Show icon in the system tray" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Tray icon" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "Set the main window name to the current playing media name." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "Window Title" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "Inhibit Power Manager from suspending the machine while playing DVD." + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "Power Manager Plugin" + +#~ msgid "Open location..." +#~ msgstr "Open location..." diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..62447eb --- /dev/null +++ b/po/es.po @@ -0,0 +1,834 @@ +# Spanish translation of Parole +# Copyright (C) 2009 the Parole COPYRIGHT HOLDER +# This file is distributed under the same license as Parole. +# Elega , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-07-19 22:10+0000\n" +"PO-Revision-Date: 2010-01-27 09:13-0800\n" +"Last-Translator: Javier Sánchez \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Panorámico)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Proporción" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Auto" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Menú del capítulo" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "Menú DVD" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "Desde imagen ISO" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Reproductor de medios" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Silencio" + +#: ../data/interfaces/parole.ui.h:12 ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Capítulo suguiente" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "Ninguno" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Reproductor de medios Parole" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Complementos" + +#: ../data/interfaces/parole.ui.h:16 ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Capítulo anterior" + +#: ../data/interfaces/parole.ui.h:17 ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Repetir" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Seleccionar pista" + +#: ../data/interfaces/parole.ui.h:19 ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Aleatorio" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Sonido" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Cuadrado" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Bajar volumen" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Subir volumen" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Editar" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "_Ayuda" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Medios" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "_Abrir una ubicación" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_Ver" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Añadir" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "Abrir archivos multimedia" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "Selector de Medios Parole" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Reemplazar la lista de reproducción con los archivos abiertos" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Explorar carpetas recursivamente" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Comenzar a reproducir los archivos abiertos" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Autor:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Descripción:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Sitio:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Complementos del reproductor de medios" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Complementos Parole" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Audio" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Pantalla" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Subtítulos" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Vide" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Cargar automáticamente los subtítulos al reproducir una película" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Brillo:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Contraste:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Desactivar protector de pantalla al reproducir películas" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Activar visualizaciones al reproducir un archivo de audio" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Codificación:" + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Fuente:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Matiz:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Configuración del reproductor de medios" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Configuración de Parole" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Restablecer valores predeterminados" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Saturación:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Tipo de visualización:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Por extensión" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Seleccionar tipos de archivo (por extensión)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Borrar historial" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "Introduzca la dirección de la ubicación a abrir" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "Abrir ubicación del archivo multimedia o del live steam" + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "Mensaje" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "Error" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "El stream está demorando demasiado tiempo para cargar" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Detener" + +#: ../gst/parole-gst.c:1715 +msgid "Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "No se puede cargar el complemento playbin GStreamer, compruebe su instalación de GStreamer" + +#: ../gst/parole-gst.c:1735 +msgid "Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "No se puede cargar el complemento de vídeo GStreamer, compruebe su instalación de GStreamer" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Reproductor de medios Parole %s\n" +"\n" +"Parte del proyecto Xfce Goodies\n" +"http://goodies.xfce.org\n" +"\n" +"Licenciado bajo GNU GPL.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Argumento desconocido" + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Abrir una nueva instancia" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "No cargar complementos" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Establecer ruta de dispositivo Audio-CD/VCD/DVD" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Reproducir o pausar, si ya se está reproduciendo" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Detener repoducción" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Siguiente pista" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Anterior pista" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Avanzar" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Retroceder" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Elevar volumen" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Menor volumen" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Silenciar" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Información de la versión" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "Iniciar en modo de pantalla completa" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "Activar/Desactivar soporte XV" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Medios a reproducir" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Parole ya se está ejecutando, utilice -i para abrir una nueva instancia\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "Permiso denegado" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "Error al guardar el archivo de lista de reproducción" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "Formato desconocido de lista de reproducción" + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "Por favor, seleccione un formato de lista de reproducción compatible" + +#: ../src/parole-medialist.c:568 ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Desconocido" + +#: ../src/parole-medialist.c:642 ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Lista de reproducción" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "Lista de reproducción M3U" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "Lista de reproducción PLS" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Stream Redirector avanzada" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "Lista de reproducción compartible" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "Abrir Carpeta Contenedora" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "Reemplazar lista de reproducción cuando se abran archivos" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Reproducir archivos abiertos" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Recordar lista de reproducción" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Lista de medios" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Ocultar lista de reproducción" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Mostrar lista de repoducción" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "Abrir imagen ISO" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "imagen de CD" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "imagen de DVD" + +#: ../src/parole-player.c:551 ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "Stream de medios no se puede buscar" + +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Siguiente" + +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Anterior" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Almacenando en el búfer" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Detenido" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Finalizado" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Pausado" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Reproduciendo" + +#: ../src/parole-statusbar.c:170 ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "Stream en vivo:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Autor/Mantenedor" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Traductor (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Reproducir disco" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Ubicación local" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Arabe" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Armenio" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Báltico" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Céltico" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Europeo central" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Chino simplificado" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Cirílico tradicional" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Croata" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Cirílico" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Cirílico/Ruso" + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Cirílico/Ucraniano" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Georgiano" + +#: ../src/parole-subtitle-encoding.c:242 ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Griego" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: ../src/parole-subtitle-encoding.c:255 ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Hebreo" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Hebreo visual" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Hindú" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Islandés" + +#: ../src/parole-subtitle-encoding.c:273 ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Japones" + +#: ../src/parole-subtitle-encoding.c:280 ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Coreano" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Nórdico" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Persa" + +#: ../src/parole-subtitle-encoding.c:295 ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Rumano" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "Europeo del sur" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Tailandés" + +#: ../src/parole-subtitle-encoding.c:306 ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Turco" + +#: ../src/parole-subtitle-encoding.c:315 ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Oeste" + +#: ../src/parole-subtitle-encoding.c:337 ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "Reproduciendo pista" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "Pista %i" + +#: ../src/parole-plugins-manager.c:301 ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "Ir al sitio web" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "No hay complementos instalados en el sistema" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Audio" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Video" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Audio y video" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Todos los archivos soportados" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Lista de archivos" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Título:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Artista:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Album:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "Año:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "General" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "Stream no soporta cambios de etiquetas" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Guardar los cambios de etiquetas" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Propiedades" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Lee las propiedades de los medios" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Propiedades de flujo" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "Reproduciendo:" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "Duración:" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "Complemento ícono de la bandeja" + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "Activar notificaciones" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "Minimizar siempre a la bandeja al cerrar la ventana" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "¿Minimizar a la bandeja?" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "Minimizar a la bandeja" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "¿Está seguro de querer salir de Parole?\t" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "Recordar mi elección" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Muestra un ícono en la bandeja del sistema" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Icono de la bandeja" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "Establecer el nombre de la ventana principal con el nombre de la reproducción actual." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "Título de la ventana" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "Inhibir el administrador de energía para la suspensión de la máquina durante reproducción de DVD." + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "Complemento administrador de energía" + +#~ msgid "Open location..." +#~ msgstr "Abrir ubicación..." + +#~ msgid "socket" +#~ msgstr "socket" + +#~ msgid "SOCKET ID" +#~ msgstr "SOCKET ID" + +#~ msgid "url to play" +#~ msgstr "url a reproducir" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Fullscreen" +#~ msgstr "Pantalla completa" + +#~ msgid "Copy url" +#~ msgstr "Copiar url" + +#~ msgid "Enabled" +#~ msgstr "Habilitar" + +#~ msgid "Plugin" +#~ msgstr "Complemento" + +#~ msgid "Visite Website" +#~ msgstr "Visite el sitio web" diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..25794f4 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,832 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Piarres Beobide , 2009. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-04-27 16:08+0000\n" +"PO-Revision-Date: 2009-12-15 12:26+0100\n" +"Last-Translator: Piarres Beobide \n" +"Language-Team: Basque \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 1.0\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Panoramikoa)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Itxura erlazioa" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Auto" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Kapitulu menua" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "DVD menua" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "ISO irudi batetatik" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Media erreproduzigailua" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Mutu" + +#: ../data/interfaces/parole.ui.h:12 ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Hurrengo kapitulua" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "Batez" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Parole media erreproduzigailua" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Plugin-ak" + +#: ../data/interfaces/parole.ui.h:16 ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Aurreko kapitulua" + +#: ../data/interfaces/parole.ui.h:17 ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Errepikatu" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Hautatu pista" + +#: ../data/interfaces/parole.ui.h:19 ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Ausaz" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Soinua" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Karratua" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Bolumena jaitsi" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Bolumena igo" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Editatu" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "_Laguntza" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Euskarria" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "Ireki _kokalekua" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_Ikusi" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Gehitu" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "Ireki euskarri fitxategiak" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "Parole euskarri hautatzailea" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Ordeztu erreprodukzio-zerrenda irekitako fitxategiekin" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Arakatu karpetak errekurtsiboki" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Hasi irekitako fitxategiak erreproduzitzen" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Autorea:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Azalpena:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Gunea:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Euskarri erreproduzigailua pluginak" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Parole pluginak" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Audioa" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Bistaratzea" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Azpitituluak" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Bideoa" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Automatikoki kargatu azpitituluak filma fitxategi bat erreproduzitzean" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Distira:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Kontrastea:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Desgaitu pantaila-babeslea filmak erreproduzitzean" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Gailu bistaratzea audio fitxategi bat erreproduzitzean" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Kodeketa: " + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Letra-tipoa:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Ñabardura:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Euskarri erreproduzigailu ezarpenak" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Parole ezarpenak" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Berezarri lehenespenetara" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Saturazioa:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Bistaratze mota:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Luzapenez" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Hautatu fitxategi motak (luzapenez)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Garbitu historia" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "Idatzi irekitzeko helbidea" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "Ireki euskarri fitxategiaren edo sare bidezko korrontearen kokalekua " + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "Mezua" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "Errorea" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "Korrontea debora asko tardatzen ari da kargatzeko" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Gelditu" + +#: ../gst/parole-gst.c:1715 +msgid "Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "Ezin da playbin GStreamer plugina kargatu, egiaztatu GStreamer instalazioa" + +#: ../gst/parole-gst.c:1735 +msgid "Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "Ezin da bideo GStreamer plugina kargatu, egiaztatu GStreamer instalazioa" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Parole euskarri erreproduzigailua %s\n" +"\n" +"Xfce Goodies proiektuaren zati\n" +"http://goodies.xfce.org\n" +"\n" +"GNU GPL lizentziapean argitaratua.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Argumentu ezezaguna " + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Ireki instantzia berri bat" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "Ez kargatu pluginak" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Ezarri Audio-CD/VCD/DVD gailu bidea" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Erreproduzitu edo gelditu martxan badago" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Gelditu erreprodukzioa" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Hurrengo pista" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Aurreko pista" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Aurreratu" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Atzeratu" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Igo bolumena" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Jaitsi bolumena" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Mututu bolumena" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Bertsio argibideak" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "Hasi pantaila-osoa moduan" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "Gaitu/desgaitu XV onarpena" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Erreproduzitzeko euskarria" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Parole dagoeneko exekutatzen ari da, -i erabili instantzia berri bat irekitzeko\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "Baimena ukatua" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "Errorea erreprodukzio-zerrenda gordetzean" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "Erreprodukzio-zerrenda formatu ezezaguna" + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "Mesedez hautatu onartzen den erreprodukzio-zerrenda formatu bat" + +#: ../src/parole-medialist.c:568 ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Ezezaguna" + +#: ../src/parole-medialist.c:642 ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Erreprodukzio-zerrenda " + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "M3U Erreprodukzio-zerrenda" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "PLS Erreprodukzio-zerrenda" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Korrenten berbidatze aurreratua" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "Erreprodukzio-zerrenda partekatua" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "Ireki edukiera karpeta" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "Ordeztu erreprodukzio-zerrenda fitxategiak irekitzean" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Erreproduzitu irekitako fitxategiak" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Gogoratu erreprodukzio-zerrenda" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Euskarri zerrenda" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Ezkutatu erreprodukzio-zerrenda" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Ikusi erreprodukzio-zerrenda" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "Ireki ISO irudia" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "CD irudia" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "DVD irudia" + +#: ../src/parole-player.c:551 ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "Euskarri korrontean ezin da salto egin" + +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Hurrengo pista" + +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Aurreko pista" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Bufferra betetzen" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Gelditurik" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Amaiturik" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Gelditurik" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Erreproduzitzen" + +#: ../src/parole-statusbar.c:170 ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "Sare bidezko korrontea:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Garatzaile/Mantenua" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Itzultzailea (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Erreproduzitu diskoa" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Uneko lokala" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Arabiarra" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Armeniarra" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Baltikoa" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Zelta" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Erdialdeko Europakoa" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Txinatar soildua" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Txinatar tradizionala" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Kroata" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Zirilikoa" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Zirilikoa/Errusiarra" + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Zirilikoa/Ukraniarra" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Georgiarra" + +#: ../src/parole-subtitle-encoding.c:242 ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Grekoa" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhi" + +#: ../src/parole-subtitle-encoding.c:255 ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Hebreera" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Hebreera Ikusgarria" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Hindi" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Islandiarra" + +#: ../src/parole-subtitle-encoding.c:273 ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Japoniarra" + +#: ../src/parole-subtitle-encoding.c:280 ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Korearra" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Nordikoa" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Persiarra" + +#: ../src/parole-subtitle-encoding.c:295 ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Errumaniarra" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "Hego Europakoa" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Tailandiarra" + +#: ../src/parole-subtitle-encoding.c:306 ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Turkiarra" + +#: ../src/parole-subtitle-encoding.c:315 ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Mendebaldekoa" + +#: ../src/parole-subtitle-encoding.c:337 ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Vietnamdarra" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "Pista erreproduzitzen" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "%i pista" + +#: ../src/parole-plugins-manager.c:301 ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "Ikusi webgunea" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "Ez da instalaturiko pluginik aurkitu sistema honetan" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Audioa" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Bideoa" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Audio eta bideoa" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Onartutako fitxategi guztiak" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Erreprodukzio-zerrenda fitxategiak" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Titulua:" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Artista:" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Albuma:" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "Urtea:" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "Orokorra" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "Korronteak ez du etiketa aldaketa onartzen" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Gorde euskarri etiketa aldaketak" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Propietateak" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Irakurri euskarri propietateak" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Jario propietateak" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "Erreproduzitzen:" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "Iraupena:" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "Erretilu ikono plugina" + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "Gaitu berri-ematea" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "Beti txikitu erretilura leihoa ixtean" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "Txikitu erretilura?" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "Txikitu erretilura" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "Ziur zaude Parole itxi nahi duzula?" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "Gogoratu nire hautapena" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Ikusi ikonoa sistema erretiluan" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Erretilu ikonoa" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "Ezarri leiho nagusiaren izenburua erreproduzitzen ari den euskarri izenetik." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "Leiho izenburua" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "Galarazi indar kudeatzaileak DVDak erreproduzitzean makina etetea" + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "Indar kudeatzaile plugina" + +#~ msgid "Open location..." +#~ msgstr "Ireki kokalekua..." + +#~ msgid "socket" +#~ msgstr "socket-a" + +#~ msgid "SOCKET ID" +#~ msgstr "SOCKET IDa" + +#~ msgid "url to play" +#~ msgstr "Erreproduzitzeko url-a" + +#~ msgid "URL" +#~ msgstr "URLa" + +#~ msgid "Fullscreen" +#~ msgstr "Pantaila-osoa" + +#~ msgid "Copy url" +#~ msgstr "Kopiatu url-a" + +#~ msgid "Enabled" +#~ msgstr "Gaiturik " + +#~ msgid "Plugin" +#~ msgstr "Plugina" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..bb3cfef --- /dev/null +++ b/po/fr.po @@ -0,0 +1,854 @@ +# French translations of parole +# Copyright (C) 2009 the parole-media-player's copyright holder +# This file is distributed under the same license as the parole-media-player package. +# Steve Dodier +# Douart Patrick 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: ast\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-04-13 17:48+0000\n" +"PO-Revision-Date: 2010-02-11 15:23+0100\n" +"Last-Translator: Douart Patrick \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Country: France\n" +"Language: \n" +"X-Poedit-Language: French\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Écran large)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Ratio d'Aspect" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Auto" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Menu Chapitre" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "Menu du DVD" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "De l'image ISO" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Lecteur Média" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Mettre en sourdine" + +#: ../data/interfaces/parole.ui.h:12 ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Chapitre Suivant" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "Aucun" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Lecteur Média Parole" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Greffons" + +#: ../data/interfaces/parole.ui.h:16 ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Chapitre Précédent" + +#: ../data/interfaces/parole.ui.h:17 ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Répéter" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Sélectionner une Piste" + +#: ../data/interfaces/parole.ui.h:19 ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Aléatoire" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Son" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Carré" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Diminuer le Volume" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Augmenter le Volume" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Éditer" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "Aid_e" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Média" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "Ouvrir un _emplacement" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_Affichage" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Ajouter" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "Ajouter des fichiers multimédia" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "Sélecteur de médias de Parole" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Remplacer playlist avec les fichiers ouverts" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Analyser les dossiers récursivement" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Démarrez la lecture de fichiers ouverts" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Auteur :" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Description :" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Site :" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Plugins du Lecteur Multimédia" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Plugins de Parole" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Audio" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Affichage" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Sous-titres" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Vidéo" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Charger les sous-titres automatiquement lors de la lecture d'un film" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Luminosité :" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Contraste :" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Désactiver l'écran de veille pendant la lecture des vidéos" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Activer la visualisation lors de la lecture d'un fichier audio" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Encodage :" + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Police :" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Teinte :" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Paramètres du Lecteur Multimédia" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Paramètres de Parole" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Réinitialiser " + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Saturation :" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Type de visualisation :" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Par Extension" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Sélectionner des Types de Fichiers (Par Extension)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Effacer l'historique" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "Entrez l'adresse de l'emplacement à ouvrir" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "Ouvrir l'emplacement d'un média ou d'un flux" + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "Message" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "Erreur" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "Le flux met trop de temps à se charger" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Arrêt" + +#: ../gst/parole-gst.c:1715 +msgid "" +"Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "" +"Impossible de charger le greffon de lecture GStreamer, vérifiez votre " +"installation de GStreamer" + +#: ../gst/parole-gst.c:1735 +msgid "" +"Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "" +"Impossible de charger le greffon vidéo GStreamer, vérifiez votre " +"installation de GStreamer" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Lecteur Multimédia Parole %s\n" +"\n" +"Une partie du projet \"goodies' d' Xfce \n" +"http://goodies.xfce.org\n" +"\n" +"Sous licence GNU GPL.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Argument inconnu" + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Ouvrir une nouvelle instance" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "Ne chargez pas les plugins" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Sélectionner le chemin vers le périphérique Audio-CD/VCD/DVD" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Lecture ou pause si lecture en cours" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Stopper la lecture" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Piste suivante" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Piste précédente" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Avancer" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Reculer" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Augmenter le volume" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Baisser le volume" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Couper le volume" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Information de version" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "Démarrer en plein écran" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "Activer/Désactiver le support XV" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Média à lire" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "" +"Parole est déjà en cours de fonctionnement. Utilisez -i pour ouvrir une " +"nouvelle instance\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "Permission non accordée" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "Erreur lors de la sauvegarde de la liste de lecture" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "Format de liste de lecture inconnu" + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "" +"Format de liste de lecture inconnu, Veuillez sélectionner un format de liste " +"de lecture pris en charge" + +#: ../src/parole-medialist.c:568 ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Inconnu" + +#: ../src/parole-medialist.c:642 ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Liste de lecture" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "Listes de lecture M3U" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "Listes de lecture PLS" + +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Redirecteur de Flux Avancé" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "Liste de Lecture Partageable" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "Ouvrir le dossier contenant le fichier" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "Remplacer la liste de lecture lors de l'ouverture de fichiers" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Démarrez la lecture des fichiers ouverts" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Se souvenir de la liste de lecture" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Liste de médias" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Cacher la liste de lecture" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Afficher la liste de lecture" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "Ouvrir une image ISO" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "Image CD" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "Image DVD" + +#: ../src/parole-player.c:551 ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "Le flux média ne peut être recherché" + +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Piste Suivante" + +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Piste Précédente" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Mise en tampon" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Stoppé" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Fini" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Mis en pause" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Piste en Cours de Lecture" + +#: ../src/parole-statusbar.c:170 ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "Flux live :" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Auteur / Mainteneur" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Traducteur (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Lire un Disque" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Langue Actuelle" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Arabe" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Arménien" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Baltique" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Celtique" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Europe Centrale" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Chinois Simplifié" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Chinois Traditionnel" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Croate" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Cyrillique" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Cyrillique / Russe " + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrainian" +msgstr "Cyrillique / Ukrainien" + +#: ../src/parole-subtitle-encoding.c:239 +msgid "Georgian" +msgstr "Géorgien" + +#: ../src/parole-subtitle-encoding.c:242 ../src/parole-subtitle-encoding.c:244 +#: ../src/parole-subtitle-encoding.c:246 +msgid "Greek" +msgstr "Grec" + +#: ../src/parole-subtitle-encoding.c:249 +msgid "Gujarati" +msgstr "Gujrati" + +#: ../src/parole-subtitle-encoding.c:252 +msgid "Gurmukhi" +msgstr "Gurmukhī" + +#: ../src/parole-subtitle-encoding.c:255 ../src/parole-subtitle-encoding.c:257 +#: ../src/parole-subtitle-encoding.c:259 ../src/parole-subtitle-encoding.c:261 +msgid "Hebrew" +msgstr "Hébreux" + +#: ../src/parole-subtitle-encoding.c:264 +msgid "Hebrew Visual" +msgstr "Hébreux Visuel" + +#: ../src/parole-subtitle-encoding.c:267 +msgid "Hindi" +msgstr "Hindi" + +#: ../src/parole-subtitle-encoding.c:270 +msgid "Icelandic" +msgstr "Islandais" + +#: ../src/parole-subtitle-encoding.c:273 ../src/parole-subtitle-encoding.c:275 +#: ../src/parole-subtitle-encoding.c:277 +msgid "Japanese" +msgstr "Japonais" + +#: ../src/parole-subtitle-encoding.c:280 ../src/parole-subtitle-encoding.c:282 +#: ../src/parole-subtitle-encoding.c:284 ../src/parole-subtitle-encoding.c:286 +msgid "Korean" +msgstr "Coréen" + +#: ../src/parole-subtitle-encoding.c:289 +msgid "Nordic" +msgstr "Nordique" + +#: ../src/parole-subtitle-encoding.c:292 +msgid "Persian" +msgstr "Perse" + +#: ../src/parole-subtitle-encoding.c:295 ../src/parole-subtitle-encoding.c:297 +msgid "Romanian" +msgstr "Roumain" + +#: ../src/parole-subtitle-encoding.c:300 +msgid "South European" +msgstr "Europe du Sud" + +#: ../src/parole-subtitle-encoding.c:303 +msgid "Thai" +msgstr "Thaï" + +#: ../src/parole-subtitle-encoding.c:306 ../src/parole-subtitle-encoding.c:308 +#: ../src/parole-subtitle-encoding.c:310 ../src/parole-subtitle-encoding.c:312 +msgid "Turkish" +msgstr "Turc" + +#: ../src/parole-subtitle-encoding.c:315 ../src/parole-subtitle-encoding.c:317 +#: ../src/parole-subtitle-encoding.c:319 ../src/parole-subtitle-encoding.c:321 +#: ../src/parole-subtitle-encoding.c:323 +msgid "Unicode" +msgstr "Unicode" + +#: ../src/parole-subtitle-encoding.c:326 ../src/parole-subtitle-encoding.c:328 +#: ../src/parole-subtitle-encoding.c:330 ../src/parole-subtitle-encoding.c:332 +#: ../src/parole-subtitle-encoding.c:334 +msgid "Western" +msgstr "Occident" + +#: ../src/parole-subtitle-encoding.c:337 ../src/parole-subtitle-encoding.c:339 +#: ../src/parole-subtitle-encoding.c:341 +msgid "Vietnamese" +msgstr "Vietnamien" + +#: ../src/parole-disc-menu.c:130 +msgid "Playing Track" +msgstr "Piste en Cours de Lecture" + +#: ../src/parole-disc-menu.c:194 +#, c-format +msgid "Track %i" +msgstr "Piste %i" + +#: ../src/parole-plugins-manager.c:301 ../src/parole-plugins-manager.c:437 +msgid "Visit Website" +msgstr "Visiter le Site Web" + +#: ../src/parole-plugins-manager.c:416 +msgid "No installed plugins found on this system" +msgstr "Aucun plugin installé n'a été détecté" + +#: ../parole/parole-filters.c:64 +msgid "Audio" +msgstr "Audio" + +#: ../parole/parole-filters.c:90 +msgid "Video" +msgstr "Vidéo" + +#: ../parole/parole-filters.c:115 +msgid "Audio and video" +msgstr "Audio et vidéo" + +#: ../parole/parole-filters.c:144 +msgid "All supported files" +msgstr "Tous les fichiers pris en charge" + +#: ../parole/parole-filters.c:171 +msgid "Playlist files" +msgstr "Listes de lecture" + +#: ../plugins/properties/stream-properties-provider.c:254 +msgid "Title:" +msgstr "Titre :" + +#: ../plugins/properties/stream-properties-provider.c:277 +msgid "Artist:" +msgstr "Artiste :" + +#: ../plugins/properties/stream-properties-provider.c:300 +msgid "Album:" +msgstr "Album :" + +#: ../plugins/properties/stream-properties-provider.c:323 +msgid "Year:" +msgstr "Année :" + +#: ../plugins/properties/stream-properties-provider.c:341 +msgid "General" +msgstr "Général" + +#: ../plugins/properties/stream-properties-provider.c:392 +msgid "Stream doesn't support tags changes" +msgstr "Le flux ne prend pas les changements de tags en charge" + +#: ../plugins/properties/stream-properties-provider.c:399 +msgid "Save media tags changes" +msgstr "Sauvegarder les changements de tags" + +#: ../plugins/properties/stream-properties-provider.c:524 +msgid "Properties" +msgstr "Propriétés" + +#: ../plugins/properties/stream-properties.desktop.in.h:1 +msgid "Read media properties" +msgstr "Lire les propriétés du média" + +#: ../plugins/properties/stream-properties.desktop.in.h:2 +msgid "Stream Properties" +msgstr "Propriétés du flux" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Playing:" +msgstr "Lecture en cours :" + +#: ../plugins/tray/tray-provider.c:283 +msgid "Duration:" +msgstr "Durée :" + +#: ../plugins/tray/tray-provider.c:419 +msgid "Tray icon plugin" +msgstr "Greffon de l'icône de la zone de notification" + +#: ../plugins/tray/tray-provider.c:429 +msgid "Enable notification" +msgstr "Activer les notifications" + +#: ../plugins/tray/tray-provider.c:438 +msgid "Always minimize to tray when window is closed" +msgstr "" +"Toujours réduire dans la zone de notification lorsque la fenêtre est fermée" + +#: ../plugins/tray/tray-provider.c:477 +msgid "Minimize to tray?" +msgstr "Minimiser dans la zone de notification ?" + +#: ../plugins/tray/tray-provider.c:483 +msgid "Minimize to tray" +msgstr "Minimiser dans la zone de notification" + +#: ../plugins/tray/tray-provider.c:499 +msgid "Are you sure you want to quit Parole" +msgstr "Etes vous sur de vouloir quitter Parole" + +#: ../plugins/tray/tray-provider.c:503 +msgid "Remember my choice" +msgstr "Se souvenir de mon choix" + +#: ../plugins/tray/system-tray.desktop.in.h:1 +msgid "Show icon in the system tray" +msgstr "Montrer une icône dans la zone de notification" + +#: ../plugins/tray/system-tray.desktop.in.h:2 +msgid "Tray icon" +msgstr "Icône de la zone de notification" + +#: ../plugins/window-title/window-title.desktop.in.h:1 +msgid "Set the main window name to the current playing media name." +msgstr "" +"Afficher le nom du média en cours de lecture dans le titre la fenêtre " +"principale." + +#: ../plugins/window-title/window-title.desktop.in.h:2 +msgid "Window Title" +msgstr "Titre de la Fenêtre" + +#: ../plugins/power-manager/power-manager.desktop.in.h:1 +msgid "Inhibit Power Manager from suspending the machine while playing DVD." +msgstr "Suspendre le gestionnaire d'alimentation pendant la lecture de DVD." + +#: ../plugins/power-manager/power-manager.desktop.in.h:2 +msgid "Power Manager Plugin" +msgstr "Power Manager Plugin" + +#~ msgid "Open location..." +#~ msgstr "Ouvrir un emplacement..." + +#~ msgid "socket" +#~ msgstr "socket" + +#~ msgid "SOCKET ID" +#~ msgstr "SOCKET ID" + +#~ msgid "url to play" +#~ msgstr "URL à lire" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Fullscreen" +#~ msgstr "Plein écran" + +#~ msgid "Copy url" +#~ msgstr "Copier l'URL" + +#~ msgid "Plugin" +#~ msgstr "Greffons" + +#~ msgid "gtk-close" +#~ msgstr "gtk-close" + +#~ msgid "gtk-properties" +#~ msgstr "gtk-properties" + +#~ msgid "Visite Website" +#~ msgstr "Visiter le Site Web" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..ddd6909 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,845 @@ +# Galician translation of notification-daemon-xfce +# Copyright (C) 2009, 2010 Leandro Regueiro. +# This file is distributed under the same license as the Xfce package. +# +# Leandro Regueiro , 2009, 2010. +# +# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas +# colaborar connosco, podes atopar máis información en +# +msgid "" +msgstr "" +"Project-Id-Version: Parole 0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-23 10:09+0000\n" +"PO-Revision-Date: 2010-10-20 09:48+0100\n" +"Last-Translator: Leandro Regueiro \n" +"Language-Team: Galician \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../data/interfaces/parole.ui.h:1 +msgid "16:9 (Widescreen)" +msgstr "16:9 (Panorámico)" + +#: ../data/interfaces/parole.ui.h:2 +msgid "20:9 (DVB)" +msgstr "20:9 (DVB)" + +#: ../data/interfaces/parole.ui.h:3 +msgid "4:3 (TV)" +msgstr "4:3 (TV)" + +#: ../data/interfaces/parole.ui.h:4 +msgid "Aspect Ratio" +msgstr "Proporción de aspecto" + +#: ../data/interfaces/parole.ui.h:5 +msgid "Auto" +msgstr "Automática" + +#: ../data/interfaces/parole.ui.h:6 +msgid "Chapter Menu" +msgstr "Menú de capítulos" + +#: ../data/interfaces/parole.ui.h:7 +msgid "DVD" +msgstr "DVD" + +#: ../data/interfaces/parole.ui.h:8 +msgid "DVD Menu" +msgstr "Menú do DVD" + +#: ../data/interfaces/parole.ui.h:9 +msgid "From ISO image" +msgstr "Dende imaxe ISO" + +#: ../data/interfaces/parole.ui.h:10 +msgid "Media player" +msgstr "Reprodutor multimedia" + +#: ../data/interfaces/parole.ui.h:11 +msgid "Mute" +msgstr "Silencio" + +#: ../data/interfaces/parole.ui.h:12 ../src/parole-player.c:1215 +#: ../src/parole-disc-menu.c:113 +msgid "Next Chapter" +msgstr "Capítulo seguinte" + +#: ../data/interfaces/parole.ui.h:13 +msgid "None" +msgstr "Ningunha" + +#: ../data/interfaces/parole.ui.h:14 ../src/parole-about.c:74 +#: ../plugins/window-title/window-title-provider.c:58 +msgid "Parole Media Player" +msgstr "Reprodutor multimedia Parole" + +#: ../data/interfaces/parole.ui.h:15 +msgid "Plugins" +msgstr "Engadidos" + +#: ../data/interfaces/parole.ui.h:16 ../src/parole-player.c:1227 +#: ../src/parole-disc-menu.c:114 +msgid "Previous Chapter" +msgstr "Capítulo anterior" + +#: ../data/interfaces/parole.ui.h:17 ../src/parole-medialist.c:1264 +msgid "Repeat" +msgstr "Repetir" + +#: ../data/interfaces/parole.ui.h:18 +msgid "Select Track" +msgstr "Escoller pista" + +#: ../data/interfaces/parole.ui.h:19 ../src/parole-medialist.c:1280 +msgid "Shuffle" +msgstr "Aleatorio" + +#: ../data/interfaces/parole.ui.h:20 +msgid "Sound" +msgstr "Son" + +#: ../data/interfaces/parole.ui.h:21 +msgid "Square" +msgstr "Cadrado" + +#: ../data/interfaces/parole.ui.h:22 +msgid "Volume Down" +msgstr "Baixar o volume" + +#: ../data/interfaces/parole.ui.h:23 +msgid "Volume Up" +msgstr "Subir o volume" + +#: ../data/interfaces/parole.ui.h:24 +msgid "_Edit" +msgstr "_Editar" + +#: ../data/interfaces/parole.ui.h:25 +msgid "_Help" +msgstr "A_xuda" + +#: ../data/interfaces/parole.ui.h:26 +msgid "_Media" +msgstr "_Soportes" + +#: ../data/interfaces/parole.ui.h:27 +msgid "_Open location" +msgstr "_Abrir localización" + +#: ../data/interfaces/parole.ui.h:28 +msgid "_View" +msgstr "_Ver" + +#: ../data/interfaces/mediachooser.ui.h:1 +msgid "Add" +msgstr "Engadir" + +#: ../data/interfaces/mediachooser.ui.h:2 +msgid "Open media files" +msgstr "Abrir ficheiros multimedia" + +#: ../data/interfaces/mediachooser.ui.h:3 +msgid "Parole Media Chooser" +msgstr "Selector multimedia Parole" + +#: ../data/interfaces/mediachooser.ui.h:4 +msgid "Replace playlist with opened files" +msgstr "Substituír a lista de reprodución polos ficheiros abertos" + +#: ../data/interfaces/mediachooser.ui.h:5 +msgid "Scan folders recursively" +msgstr "Examinar de xeito recursivo os cartafoles" + +#: ../data/interfaces/mediachooser.ui.h:6 +msgid "Start playing opened files" +msgstr "Comezar a reprodución dos ficheiros abertos" + +#: ../data/interfaces/plugins.ui.h:1 +msgid "Author:" +msgstr "Autoría:" + +#: ../data/interfaces/plugins.ui.h:2 +msgid "Description:" +msgstr "Descrición:" + +#: ../data/interfaces/plugins.ui.h:3 +msgid "Site:" +msgstr "Sitio:" + +#: ../data/interfaces/plugins.ui.h:4 +msgid "Media Player plugins" +msgstr "Engadidos do reprodutor multimedia" + +#: ../data/interfaces/plugins.ui.h:5 +msgid "Parole Plugins" +msgstr "Engadidos de Parole" + +#: ../data/interfaces/parole-settings.ui.h:1 +msgid "Audio" +msgstr "Son" + +#: ../data/interfaces/parole-settings.ui.h:2 +msgid "Display" +msgstr "Pantalla" + +#: ../data/interfaces/parole-settings.ui.h:3 +msgid "Subtitles" +msgstr "Subtítulos" + +#: ../data/interfaces/parole-settings.ui.h:4 +msgid "Video" +msgstr "Vídeo" + +#: ../data/interfaces/parole-settings.ui.h:5 +msgid "Automatically load subtitles when playing movie file" +msgstr "Cargar os subtítulos automaticamente ao reproducir un ficheiro de vídeo" + +#: ../data/interfaces/parole-settings.ui.h:6 +msgid "Brightness:" +msgstr "Brillo:" + +#: ../data/interfaces/parole-settings.ui.h:7 +msgid "Contrast:" +msgstr "Contraste:" + +#: ../data/interfaces/parole-settings.ui.h:8 +msgid "Disable screen saver while playing movies" +msgstr "Desactivar o protector de pantalla ao reproducir películas" + +#: ../data/interfaces/parole-settings.ui.h:9 +msgid "Enable visualization when playing audio file" +msgstr "Mostrar os efectos visuais cando se reproduza un ficheiro de son" + +#: ../data/interfaces/parole-settings.ui.h:10 +msgid "Encoding: " +msgstr "Codificación: " + +#: ../data/interfaces/parole-settings.ui.h:11 +msgid "Font:" +msgstr "Tipo de letra:" + +#: ../data/interfaces/parole-settings.ui.h:12 +msgid "Hue:" +msgstr "Matiz:" + +#: ../data/interfaces/parole-settings.ui.h:13 +msgid "Media Player Settings" +msgstr "Configuración do reprodutor multimedia" + +#: ../data/interfaces/parole-settings.ui.h:14 +msgid "Parole Settings" +msgstr "Axustes de Parole" + +#: ../data/interfaces/parole-settings.ui.h:15 +msgid "Reset To Defaults" +msgstr "Restablecer as predefinicións" + +#: ../data/interfaces/parole-settings.ui.h:16 +msgid "Saturation:" +msgstr "Saturación:" + +#: ../data/interfaces/parole-settings.ui.h:17 +msgid "Visualization type:" +msgstr "Tipo de efecto visual:" + +#: ../data/interfaces/save-playlist.ui.h:1 +msgid "By Extension" +msgstr "Por extensión" + +#: ../data/interfaces/save-playlist.ui.h:2 +msgid "Select File Types (By Extension)" +msgstr "Seleccionar tipos de ficheiros (por extensión)" + +#: ../data/interfaces/open-location.ui.h:1 +msgid "Clear history" +msgstr "Limpar o historial" + +#: ../data/interfaces/open-location.ui.h:2 +msgid "Enter the address of a location to open" +msgstr "Introduza o enderezo dunha localización para abrila" + +#: ../data/interfaces/open-location.ui.h:3 +msgid "Open location of media file or live stream" +msgstr "Abra unha localización de ficheiro multimedia ou un fluxo en tempo real." + +#: ../data/desktop/parole.desktop.in.in.h:1 +msgid "Parole" +msgstr "Parole" + +#: ../common/parole-common.c:67 +msgid "Message" +msgstr "Mensaxe" + +#: ../common/parole-common.c:72 +msgid "Error" +msgstr "Erro" + +#: ../gst/parole-gst.c:1526 +msgid "The stream is taking too much time to load" +msgstr "Está levando moito tempo cargar o fluxo" + +#: ../gst/parole-gst.c:1526 +msgid "Stop" +msgstr "Deter" + +#: ../gst/parole-gst.c:1715 +msgid "Unable to load playbin GStreamer plugin, check your GStreamer installation" +msgstr "Non foi posible cargar o engadido playbin de GStreamer, verifique a instalación de GStreamer" + +#: ../gst/parole-gst.c:1735 +msgid "Unable to load video GStreamer plugin, check your GStreamer installation" +msgstr "Non foi posible cargar o engadido video de GStreamer, verifique a instalación de GStreamer" + +#: ../src/main.c:54 +#, c-format +msgid "" +"\n" +"Parole Media Player %s\n" +"\n" +"Part of the Xfce Goodies Project\n" +"http://goodies.xfce.org\n" +"\n" +"Licensed under the GNU GPL.\n" +"\n" +msgstr "" +"\n" +"Reprodutor multimedia Parole %s\n" +"\n" +"Parte do Proxecto de Extras de Xfce\n" +"http://goodies.xfce.org\n" +"\n" +"Licenciado baixo a GNU GPL.\n" +"\n" + +#: ../src/main.c:187 +msgid "Unknown argument " +msgstr "Argumento descoñecido" + +#: ../src/main.c:225 +msgid "Open a new instance" +msgstr "Abrir unha nova instancia" + +#: ../src/main.c:226 +msgid "Do not load plugins" +msgstr "Non cargar engadidos" + +#: ../src/main.c:227 +msgid "Set Audio-CD/VCD/DVD device path" +msgstr "Definir a ruta do dispositivo de Audio-CD/VCD/DVD" + +#: ../src/main.c:228 +msgid "Play or pause if already playing" +msgstr "Reproducir ou pausar se xa se estaba reproducindo" + +#: ../src/main.c:229 +msgid "Stop playing" +msgstr "Deter a reprodución" + +#: ../src/main.c:230 +msgid "Next track" +msgstr "Seguinte pista" + +#: ../src/main.c:231 +msgid "Previous track" +msgstr "Pista anterior" + +#: ../src/main.c:232 +msgid "Seek forward" +msgstr "Avanzar" + +#: ../src/main.c:233 +msgid "Seek Backward" +msgstr "Retroceder" + +#: ../src/main.c:234 +msgid "Raise volume" +msgstr "Subir o volume" + +#: ../src/main.c:235 +msgid "Lower volume" +msgstr "Baixar o volume" + +#: ../src/main.c:236 +msgid "Mute volume" +msgstr "Silenciar" + +#: ../src/main.c:237 +msgid "Version information" +msgstr "Información de versión" + +#: ../src/main.c:238 +msgid "Start in fullscreen mode" +msgstr "Iniciar en modo de pantalla completa" + +#: ../src/main.c:239 +msgid "Enabled/Disable XV support" +msgstr "Activar/desactivar soporte XV" + +#: ../src/main.c:241 +msgid "Media to play" +msgstr "Soporte a reproducir" + +#: ../src/main.c:278 +#, c-format +msgid "Parole is already running, use -i to open a new instance\n" +msgstr "Parole xa se está executando, use -i para abrir unha nova instancia\n" + +#: ../src/parole-medialist.c:501 +msgid "Permission denied" +msgstr "Permiso denegado" + +#: ../src/parole-medialist.c:503 +msgid "Error saving playlist file" +msgstr "Erro ao gardar o ficheiro de lista de reprodución" + +#: ../src/parole-medialist.c:515 +msgid "Unknown playlist format" +msgstr "Formato de lista de reprodución descoñecido" + +#: ../src/parole-medialist.c:516 +msgid "Please chooser a supported playlist format" +msgstr "Seleccione un formato de lista de reprodución compatíbel." + +#: ../src/parole-medialist.c:568 ../src/parole-plugins-manager.c:377 +#: ../plugins/properties/stream-properties-provider.c:140 +#: ../plugins/properties/stream-properties-provider.c:141 +#: ../plugins/properties/stream-properties-provider.c:142 +#: ../plugins/properties/stream-properties-provider.c:143 +msgid "Unknown" +msgstr "Descoñecido" + +#: ../src/parole-medialist.c:642 ../src/parole-player.c:1991 +msgid "Playlist" +msgstr "Lista de reprodución" + +#: ../src/parole-medialist.c:649 +msgid "M3U Playlists" +msgstr "Listas de reprodución M3U" + +#: ../src/parole-medialist.c:657 +msgid "PLS Playlists" +msgstr "Listas de reprodución PLS" + +# Non se traduce: The Advanced Stream Redirector (ASX) format is a type of XML +# metafile designed to store a list of Windows Media files to play during a +# multimedia presentation. +#: ../src/parole-medialist.c:665 +msgid "Advanced Stream Redirector" +msgstr "Advanced Stream Redirector" + +#: ../src/parole-medialist.c:673 +msgid "Shareable Playlist" +msgstr "Lista de reprodución compartible" + +#. Clear +#: ../src/parole-medialist.c:1152 +msgid "Open Containing Folder" +msgstr "Abrir o cartafol contedor" + +#: ../src/parole-medialist.c:1303 +msgid "Replace playlist when opening files" +msgstr "Substituír a lista de reprodución polos ficheiros abertos" + +#: ../src/parole-medialist.c:1319 +msgid "Play opened files" +msgstr "Reproducir os ficheiros abertos" + +#. * +#. * Remember media list entries +#. * +#: ../src/parole-medialist.c:1331 +msgid "Remember playlist" +msgstr "Lembrar a lista de reprodución" + +#: ../src/parole-medialist.c:1502 +msgid "Media list" +msgstr "Lista de soportes" + +#: ../src/parole-player.c:336 +msgid "Hide playlist" +msgstr "Ocultar a lista de reprodución" + +#: ../src/parole-player.c:345 +msgid "Show playlist" +msgstr "Mostrar a lista de reprodución" + +#: ../src/parole-player.c:378 +msgid "Open ISO image" +msgstr "Abrir imaxe ISO" + +#: ../src/parole-player.c:395 +msgid "CD image" +msgstr "Imaxe de CD" + +#: ../src/parole-player.c:395 +msgid "DVD image" +msgstr "Imaxe de DVD" + +#: ../src/parole-player.c:551 ../src/parole-player.c:659 +msgid "Media stream is not seekable" +msgstr "O fluxo do soporte non é posicionable" + +#. * Next chapter menu item +#. +#: ../src/parole-player.c:1215 ../src/parole-disc-menu.c:122 +msgid "Next Track" +msgstr "Seguinte pista" + +#. * Previous chapter menu item +#. +#: ../src/parole-player.c:1227 ../src/parole-disc-menu.c:123 +msgid "Previous Track" +msgstr "Pista anterior" + +#: ../src/parole-statusbar.c:61 +msgid "Buffering" +msgstr "Almacenando no búfer" + +#: ../src/parole-statusbar.c:100 +msgid "Stopped" +msgstr "Detido" + +#: ../src/parole-statusbar.c:104 +msgid "Finished" +msgstr "Finalizado" + +#: ../src/parole-statusbar.c:114 ../src/parole-statusbar.c:124 +msgid "Paused" +msgstr "Pausado" + +#: ../src/parole-statusbar.c:114 +msgid "Playing" +msgstr "Reproducindo" + +#: ../src/parole-statusbar.c:170 ../src/parole-statusbar.c:174 +msgid "Live stream:" +msgstr "Fluxo en tempo real:" + +#: ../src/parole-about.c:79 +msgid "Author/Maintainer" +msgstr "Autor/Mantedor" + +#: ../src/parole-about.c:85 +#, c-format +msgid "Translator (%s)" +msgstr "Tradutor (%s)" + +#: ../src/parole-disc.c:227 +msgid "Play Disc" +msgstr "Reproducir disco" + +#: ../src/parole-subtitle-encoding.c:165 +msgid "Current Locale" +msgstr "Configuración rexional actual" + +#: ../src/parole-subtitle-encoding.c:168 ../src/parole-subtitle-encoding.c:170 +#: ../src/parole-subtitle-encoding.c:172 ../src/parole-subtitle-encoding.c:174 +msgid "Arabic" +msgstr "Árabe" + +#: ../src/parole-subtitle-encoding.c:177 +msgid "Armenian" +msgstr "Armenio" + +#: ../src/parole-subtitle-encoding.c:180 ../src/parole-subtitle-encoding.c:182 +#: ../src/parole-subtitle-encoding.c:184 +msgid "Baltic" +msgstr "Báltico" + +#: ../src/parole-subtitle-encoding.c:187 +msgid "Celtic" +msgstr "Celta" + +#: ../src/parole-subtitle-encoding.c:190 ../src/parole-subtitle-encoding.c:192 +#: ../src/parole-subtitle-encoding.c:194 ../src/parole-subtitle-encoding.c:196 +msgid "Central European" +msgstr "Centroeuropeo" + +#: ../src/parole-subtitle-encoding.c:199 ../src/parole-subtitle-encoding.c:201 +#: ../src/parole-subtitle-encoding.c:203 ../src/parole-subtitle-encoding.c:205 +msgid "Chinese Simplified" +msgstr "Chinés simplificado" + +#: ../src/parole-subtitle-encoding.c:208 ../src/parole-subtitle-encoding.c:210 +#: ../src/parole-subtitle-encoding.c:212 +msgid "Chinese Traditional" +msgstr "Chinés tradicional" + +#: ../src/parole-subtitle-encoding.c:215 +msgid "Croatian" +msgstr "Croata" + +#: ../src/parole-subtitle-encoding.c:218 ../src/parole-subtitle-encoding.c:220 +#: ../src/parole-subtitle-encoding.c:222 ../src/parole-subtitle-encoding.c:224 +#: ../src/parole-subtitle-encoding.c:226 ../src/parole-subtitle-encoding.c:228 +msgid "Cyrillic" +msgstr "Cirílico" + +#: ../src/parole-subtitle-encoding.c:231 +msgid "Cyrillic/Russian" +msgstr "Cirílico/Ruso" + +#: ../src/parole-subtitle-encoding.c:234 ../src/parole-subtitle-encoding.c:236 +msgid "Cyrillic/Ukrai