From: Flavio
Date: Thu, 18 Jul 2013 09:26:41 +0000 (+0200)
Subject: Big 2.1 commit
X-Git-Tag: 1.2.1~1
X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=f1d49c4c3e317b5a3b8d90639b1ec8671b1d8e8f;p=minitube
Big 2.1 commit
---
diff --git a/CHANGES b/CHANGES
index a3127f8..f0f8580 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,16 +1,39 @@
-2.0 - January ?? 2013
+2.1.1
+- Fixed VEVO videos playback
+- Fixed Ubuntu skin not being used
+
+2.1
+- Channel subscriptions
+- Move window by dragging from inside the video area
+- Faster startup
+- Optimizations and tweaks to the playlist
+- Float on top icon was missing on Mac & Windows
+- Compact mode window fixed aspect ratio on Mac
+- Ubuntu notifications
+- Fixed skipping to the next video
+- Fixed compact mode video cropped with very small window
+- Fixed long words or URLs in the video description causing a window resize
+- Fixed crash when resizing the playlist to a very small width
+
+2.0 - February 1 2013
- YouTube categories and "standard feeds": "Most Popular", "Featured", etc
- Country selection for YouTube categories and feeds
- Autoupdate on Mac and Windows
-- Related videos are now appended to the video when pasting a YouTube link
+- Related videos
+- Related videos are now appended when pasting a YouTube link
+- Bigger and nicer 16:9 thumbnails
- "Show 10 More" with a single click
- Play video in the playlist with a single click on its thumbnail
-- OS X Mountain Lion notifications on video start
+- Disk cache for video thumbnails
+- OS X Notification Center notifications on video start
+- Ubuntu Ambiance theme integration
- Fixed some YouTube links not working when pasted in the searchbox
- Fixed playlist drag'n'drop
- Fixed system language settings detection
- Fixed clicking on channel names not working in some cases
- Fixed incorrect number of downloads in status bar
+- Fixed looping video with Phonon VLC backend on Linux
+- New and updated translations
1.9 - September 27, 2012
- Adapted to YouTube changes
diff --git a/LICENSE.LGPL b/LICENSE.LGPL
deleted file mode 100644
index 5ab7695..0000000
--- a/LICENSE.LGPL
+++ /dev/null
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 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.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- , 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/empty.ts b/empty.ts
index fba82a1..bbdcc60 100644
--- a/empty.ts
+++ b/empty.ts
@@ -136,6 +136,97 @@
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -343,25 +434,35 @@
HomeView
-
+
Search
-
+
Find videos and channels by keyword
-
+
Browse
-
+
Browse videos by category
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -371,7 +472,7 @@
LoadingWidget
-
+
Error
@@ -379,426 +480,431 @@
MainWindow
-
+
&Stop
-
+
Stop playback and go back to the search view
-
+
S&kip
-
+
Skip to the next video
-
-
+
+
&Pause
-
-
+
+
Pause playback
-
+
&Full Screen
-
+
Go full screen
-
+
Hide the playlist and the toolbar
-
+
Go to the YouTube video page and pause playback
-
+
Copy the current video YouTube link to the clipboard
-
+
Copy the current video stream URL to the clipboard
-
+
Find other video parts hopefully in the right order
-
+
&Remove
-
+
Remove the selected videos from the playlist
-
+
Move &Up
-
+
Move up the selected videos in the playlist
-
+
Move &Down
-
+
Move down the selected videos in the playlist
-
+
Clear the search history. Cannot be undone.
-
+
&Quit
-
+
Bye
-
+
&Website
-
+
%1 on the Web
-
+
Please support the continued development of %1
-
+
&About
-
+
Info about %1
-
+
Search
-
+
Mute volume
-
-
+
+
&Downloads
-
+
Show details about video downloads
-
+
&Download
-
+
Download the current video
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
-
+
&Email
-
+
Email
-
+
&Close
-
+
&Float on Top
-
+
&Stop After This Video
-
+
&Report an Issue...
-
+
&Refine Search...
-
+
More...
-
+
&Related Videos
-
+
Watch videos related to the current one
-
+
&Application
-
+
Buy %1...
-
+
&Playback
-
+
&Playlist
-
+
&Video
-
+
&View
-
+
&Share
-
+
&Help
-
+
Press %1 to raise the volume, %2 to lower it
-
-
+
+
Opening %1
-
+
Do you want to exit %1 with a download in progress?
-
+
If you close %1 now, this download will be cancelled.
-
+
Close and cancel download
-
+
Wait for download to finish
-
+
Leave &Full Screen
-
+
%1 version %2 is now available.
-
+
Remind me later
-
+
Update
-
+
Error: %1
-
+
P&revious
-
+
Go back to the previous track
-
+
&Compact Mode
-
+
Open the &YouTube Page
-
+
Copy the YouTube &Link
-
+
Copy the Video Stream &URL
-
+
Find Video &Parts
-
+
&Clear Recent Searches
-
+
Make a &Donation
-
+
&Manually Start Playing
-
+
Manually start playing videos
-
+
Choose your content location
-
+
&Play
-
+
Resume playback
-
+
Remaining time: %1
-
+
Volume at %1%
-
+
Volume is muted
-
+
Volume is unmuted
-
+
Maximum video definition set to %1
-
+
Your privacy is now safe
-
+
Downloads complete
@@ -806,65 +912,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
-
+
You can now paste the video stream URL into another application
-
+
The link will be valid only for a limited time.
-
+
This is just the demo version of %1.
-
+
It allows you to test the application and see if it works for you.
-
+
Continue
-
+
of
Used in video parts, as in '2 of 3'
-
+
part
This is for video parts, as in 'Cool video - part 1'
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
-
+
Sent from %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
-
+
Downloading %1
@@ -913,52 +1029,52 @@
PlaylistItemDelegate
-
+
%1 views
-
+
%1 of %2 (%3) â %4
-
+
Preparing
-
+
Failed
-
+
Completed
-
+
Stopped
-
+
Stop downloading
-
+
Show in %1
-
+
Open parent folder
-
+
Restart downloading
@@ -1115,48 +1231,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
-
+
Get the full version
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
-
+
a keyword
-
+
a channel
-
+
to start watching videos.
-
+
Watch
-
+
Recent keywords
-
+
Recent channels
@@ -1164,8 +1280,8 @@
SidebarHeader
-
-
+
+
&Back
@@ -1200,11 +1316,6 @@
Most Popular
-
-
- Featured
-
-
Most Shared
@@ -1220,16 +1331,21 @@
Top Rated
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
-
+
Network error: %1 for %2
diff --git a/images/worldwide.png b/images/worldwide.png
index fb5f48b..d676740 100644
Binary files a/images/worldwide.png and b/images/worldwide.png differ
diff --git a/locale/ar.ts b/locale/ar.ts
index ab70e18..d49a3e3 100644
--- a/locale/ar.ts
+++ b/locale/ar.ts
@@ -15,7 +15,7 @@
Licensed to: %1
-
+ Ù
رخÙص ÙÙ: %1
@@ -88,7 +88,7 @@
&Code:
-
+ اÙرÙÙ
اÙ&خاصÙ:
@@ -134,6 +134,95 @@
ÙÙ
بشراء رخصة
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+ ترتÙب بÙ
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
بØØ«
-
+
Find videos and channels by keyword
-
+ جÙد Ù
Ùاطع ÙÙدÙÙ ÙÙÙÙات٠بØسب اÙÙÙÙ
Ø© اÙرئÙسة
-
+
Browse
أستعراض
-
+
Browse videos by category
تصÙØ Ø§ÙÙÙدÙÙÙات Øسب اÙÙئة
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
خطأ
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&ÙÙ
-
+
Stop playback and go back to the search view
ÙÙ٠اÙتشغÙ٠٠اÙعÙدة ÙÙضع اÙبØØ«
-
+
S&kip
&اÙÙÙز
-
+
Skip to the next video
اÙÙÙز ÙÙÙÙدÙ٠اÙتاÙÙ
-
-
+
+
&Pause
&اÙÙا٠Ù
ؤÙت
-
-
+
+
Pause playback
اÙÙا٠اÙتشغÙÙ
-
+
&Full Screen
&شاشة ÙاÙ
ÙØ©
-
+
Go full screen
تشغÙ٠شاشة ÙاÙ
ÙØ©
-
+
Hide the playlist and the toolbar
اخÙاء اÙÙائÙ
Ø© ٠شرÙØ· اÙÙ
ÙاÙ
-
+
Go to the YouTube video page and pause playback
اذÙب اÙ٠صÙØØ© ÙÙدÙÙ YouTube Ù ÙÙ٠اÙتشغÙÙ
-
+
Copy the current video YouTube link to the clipboard
Ùسخ رابط YouTube اÙÙ clipboard
-
+
Copy the current video stream URL to the clipboard
Ùسخ رابط اÙÙÙدÙ٠اÙÙ clipboard
-
+
Find other video parts hopefully in the right order
اÙجد أجزاء اÙÙÙدÙ٠اÙأخر٠اÙ
Ùا أ٠تÙÙÙ Ù٠اÙترتÙب اÙصØÙØ
-
+
&Remove
&إزاÙØ©
-
+
Remove the selected videos from the playlist
إزاÙØ© اÙÙÙدÙÙ Ù
٠اÙÙائÙ
Ø©
-
+
Move &Up
اÙرÙع اÙÙ &اعÙÙ
-
+
Move up the selected videos in the playlist
رÙع اÙÙ
Ùاطع اÙÙ
ختارة اÙÙ ÙÙÙ Ù٠اÙÙائÙ
Ø©
-
+
Move &Down
اÙاÙزا٠اÙÙ &تØت
-
+
Move down the selected videos in the playlist
اÙزا٠اÙÙ
Ùاطع اÙÙ
ختارة اÙ٠تØت Ù٠اÙÙائÙ
Ø©
-
+
Clear the search history. Cannot be undone.
Ù
Ø³Ø ØªØ§Ø±ÙØ® اÙبØØ«. Ùا ÙÙ
Ù٠استعادتÙ.
-
+
&Quit
&اÙاÙتÙاء
-
+
Bye
Ù
ع اÙسÙاÙ
Ø©
-
+
&Website
&اÙÙ
ÙÙع
-
+
%1 on the Web
%1 عÙ٠اÙشبÙØ©
-
+
Please support the continued development of %1
âاÙرجاء اÙتبرع ÙÙ
تابعة تطÙÙر %1
-
+
&About
&ع٠اÙبرÙاÙ
ج
-
+
Info about %1
Ù
عÙÙÙ
ات ع٠%1
-
+
Search
اÙبØØ«
-
+
Mute volume
ÙتÙ
اÙصÙت
-
-
+
+
&Downloads
&اÙتØÙ
ÙÙات
-
+
Show details about video downloads
عرض تÙاصÙ٠ع٠تØÙ
ÙÙات اÙÙÙدÙÙ
-
+
&Download
&اÙتØÙ
ÙÙات
-
+
Download the current video
تØÙ
Ù٠اÙÙÙدÙ٠اÙØاÙÙ
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
شار٠اÙÙÙدÙ٠اÙØاÙ٠باستخداÙ
%1
-
+
&Email
&اÙبرÙد اÙØ¥ÙÙترÙÙÙ
-
+
Email
اÙبرÙد اÙØ¥ÙÙترÙÙÙ
-
+
&Close
&اÙÙÙ
-
+
&Float on Top
&اطÙ٠عÙ٠اÙÙÙ
Ø©
-
+
&Stop After This Video
&Ø£ÙÙ٠اÙعرض اÙتÙÙائ٠بعد اÙÙÙدÙ٠اÙØاÙÙ
-
+
&Report an Issue...
&أبÙغ ع٠Ù
Ø´ÙÙØ©
-
+
&Refine Search...
&Ø®Ùارات اÙبØØ«...
-
+
More...
اÙÙ
زÙد...
-
+
&Related Videos
-
+ Ù
Ùاطع ذات &صÙØ©
-
+
Watch videos related to the current one
-
+ شاÙد Ù
Ùاطع ÙÙدÙ٠ذات صÙØ© بÙذا
-
+
&Application
&اÙبرÙاÙ
ج
-
+
Buy %1...
اشتر٠%1...
-
+
&Playback
&Ùراءة
-
+
&Playlist
&اÙÙائÙ
Ø©
-
+
&Video
&اÙÙÙدÙÙ
-
+
&View
&Ù
شاÙدة
-
+
&Share
&شارÙ
-
+
&Help
&اÙÙ
ساعدة
-
+
Press %1 to raise the volume, %2 to lower it
اضغط %1 ÙرÙع اÙصÙت Ù %2 ÙØ®ÙضÙ
-
-
+
+
Opening %1
جار٠ÙØªØ %1
-
+
Do you want to exit %1 with a download in progress?
Ù٠ترÙد اÙخرÙج %1 رغÙ
ÙجÙد تØÙ
ÙÙ?
-
+
If you close %1 now, this download will be cancelled.
عÙد اغÙا٠%1 اÙتØÙ
Ù٠سÙÙغÙ.
-
+
Close and cancel download
اÙاغÙا٠٠اÙغاء اÙتØÙ
ÙÙ
-
+
Wait for download to finish
اÙتظار اÙتÙاء اÙتØÙ
ÙÙ
-
+
Leave &Full Screen
غادر &اÙشاشة اÙÙاÙ
ÙØ©
-
+
%1 version %2 is now available.
%1 اÙإصدار %2 Ù
تÙÙر اÙØ¢Ù.
-
+
Remind me later
Ø°ÙرÙÙ ÙاØÙا
-
+
Update
تØدÙØ«
-
+
Error: %1
خطأ: %1
-
+
P&revious
اÙ&سابÙ
-
+
Go back to the previous track
اÙعÙدة Ø¥Ù٠اÙÙ
جاز اÙسابÙ
-
+
&Compact Mode
&اÙÙاجÙØ© اÙØ®ÙÙÙØ©
-
+
Open the &YouTube Page
Ø£ÙØªØ ØµÙØØ© اÙÙÙدÙ٠عÙÙ &YouTube
-
+
Copy the YouTube &Link
اÙسخ رابط اÙÙÙدÙÙ &Link
-
+
Copy the Video Stream &URL
اÙسخ اÙÙÙدÙÙ ÙعÙÙاÙÙ
-
+
Find Video &Parts
أبØØ« ع٠&أجزاء اÙÙÙدÙ٠اÙØ£ÙخرÙ
-
+
&Clear Recent Searches
&Ù
Ø³Ø ØªØ§Ø±ÙØ® اÙبØØ«
-
+
Make a &Donation
اÙÙÙاÙ
بتبرع
-
+
&Manually Start Playing
&تشغÙ٠اÙÙÙدÙÙÙات ÙدÙÙا
-
+
Manually start playing videos
بدء تشغÙ٠اÙÙÙدÙÙ ÙدÙÙا
-
+
Choose your content location
-
+ اختر Ù
ÙÙع Ù
ØتÙÙاتÙ
-
+
&Play
&اÙتشغÙÙ
-
+
Resume playback
اÙÙ
ا٠اÙتشغÙÙ
-
+
Remaining time: %1
اÙÙÙت اÙÙ
تبÙÙ: %1
-
+
Volume at %1%
%1%اÙصÙت عÙد
-
+
Volume is muted
اÙصÙت Ù
ÙتÙÙ
-
+
Volume is unmuted
اÙصÙت غÙر Ù
ÙتÙÙ
-
+
Maximum video definition set to %1
اÙÙضÙØ Ø§ÙاÙص٠%1
-
+
Your privacy is now safe
خصÙصÙت٠اÙ
ÙØ©
-
+
Downloads complete
اÙتØÙ
Ù٠اÙتÙÙ
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
ÙÙ
ÙÙÙ Ùص٠رابط YouTube Ù٠برÙاÙ
ج اخر
-
+
You can now paste the video stream URL into another application
ÙÙ
ÙÙÙ Ùص٠رابط اÙÙÙدÙÙ Ù٠برÙاÙ
ج اخر
-
+
The link will be valid only for a limited time.
اÙرابط سÙÙÙ٠صاÙØا ÙÙ
دة Ù
ØدÙدة.
-
+
This is just the demo version of %1.
ÙØ°Ù ÙÙست سÙ٠اÙÙسخة اÙتجرÙبÙØ© Ù
Ù %1.
-
+
It allows you to test the application and see if it works for you.
اÙÙا تتÙØ Ù٠تجربة اÙبرÙاÙ
ج.
-
+
Continue
Ù
تابعة
-
+
of
Used in video parts, as in '2 of 3'
Ù
Ù
-
+
part
This is for video parts, as in 'Cool video - part 1'
جزء
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
ØÙÙØ©
-
+
Sent from %1
أرسÙت Ù
Ù %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
اØص٠عÙ٠اÙÙسخة اÙÙاÙ
ÙØ©
-
+
Downloading %1
جار٠تØÙ
ÙÙ %1
@@ -870,22 +984,22 @@
A new version of %1 is available!
-
+ ÙتÙÙÙر إصدار جدÙد Ù
Ù %1!
%1 %2 is now available. You have %3.
-
+ 1% %2 Ù
تÙÙر اÙØ¢Ù. ÙدÙÙ 3%.
Would you like to download it now?
-
+ أترÙد تÙزÙÙ٠اÙØ¢ÙØ
Skip This Version
-
+ تجاÙز Ùذا اÙإصدار
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 Ù
شاÙدة
-
+
%1 of %2 (%3) â %4
-
+ 1% Ù
Ù 2% (3%) â 4%
-
+
Preparing
تÙÙئة
-
+
Failed
ÙØ´Ù
-
+
Completed
تÙ
-
+
Stopped
Ù
تÙÙÙ
-
+
Stop downloading
اÙÙا٠اÙتØÙ
ÙÙ
-
+
Show in %1
اظÙار ÙÙ %1
-
+
Open parent folder
ÙØªØ Ø§ÙÙ
جÙد اÙرئÙسÙ
-
+
Restart downloading
اعادة اÙتØÙ
ÙÙ
@@ -1097,7 +1211,7 @@
Done
-
+ تÙ
Ù
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Ù
رØبا ب٠ÙÙ <a href='%1'>%2</a>,
-
+
Get the full version
اÙØصÙ٠عÙ٠اÙÙسخة اÙÙاÙ
ÙØ©
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
أدخÙ
-
+
a keyword
ÙÙÙ
Ø© Ù
ÙتاØ
-
+
a channel
ÙÙاة
-
+
to start watching videos.
Ùبدء Ù
شاÙدة أشرطة اÙÙÙدÙÙ
-
+
Watch
شاÙد
-
+
Recent keywords
ÙÙÙ
ات بØØ« سابÙØ©
-
+
Recent channels
اÙÙÙÙات اÙأخÙرة
@@ -1160,20 +1274,20 @@
SidebarHeader
-
-
+
+
&Back
&عÙدة
Forward to %1
-
+ تÙدÙÙ
Ø¥ÙÙ %1
Back to %1
-
+ عÙد Ø¥ÙÙ %1
@@ -1196,11 +1310,6 @@
Most Popular
اÙØ£Ùثر Ø´Ùرة
-
-
- Featured
-
-
Most Shared
@@ -1209,23 +1318,28 @@
Most Discussed
-
+ اÙØ£Ùثر ÙÙاشÙا
Top Rated
اÙأعÙ٠تÙÙÙÙ
ا
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
Ùا ÙÙ
Ù٠اÙØصÙ٠عÙ٠دÙ٠اÙÙÙدÙÙ %1
-
+
Network error: %1 for %2
خطأ شبÙØ©:%1 اÙÙ %2
diff --git a/locale/ca.ts b/locale/ca.ts
index daadf4b..97645f3 100644
--- a/locale/ca.ts
+++ b/locale/ca.ts
@@ -15,7 +15,7 @@
Licensed to: %1
-
+ Llicenciat a: %1
@@ -78,17 +78,17 @@
Enter your License Details
-
+ Entra els detalls de la teva llicència
&Email:
-
+ &Email:
&Code:
-
+ &Codi:
@@ -111,7 +111,7 @@
Without a license, the application will expire in %1 days.
-
+ Sense llicència, l'aplicació caducarà en %1 dies
@@ -126,11 +126,100 @@
Enter License
-
+ Entra la lliçència
Buy License
+ Comprar llicència
+
+
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+ Ordena per
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
@@ -270,7 +359,7 @@
Downloading update...
-
+ Descarregant actualitzacions...
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Cerca
-
+
Find videos and channels by keyword
-
+
Browse
-
+
Browse videos by category
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Error
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Atura
-
+
Stop playback and go back to the search view
Atura la reproducció i torna a la vista de búsqueda
-
+
S&kip
&Salta
-
+
Skip to the next video
Salta al vÃdeo següent
-
-
+
+
&Pause
&Pausa
-
-
+
+
Pause playback
Pausa la reproducció
-
+
&Full Screen
Pantalla &completa
-
+
Go full screen
Passa a pantalla completa
-
+
Hide the playlist and the toolbar
Amaga la llista de reproducció i la barra d'eines
-
+
Go to the YouTube video page and pause playback
Ves a la pà gina del vÃdeo del YouTube i pausa la reproducció
-
+
Copy the current video YouTube link to the clipboard
Copia l'enllaç del vÃdeo actual del YouTube al porta-retalls
-
+
Copy the current video stream URL to the clipboard
Copia el URL del flux de vÃdeo actual al porta-retalls
-
+
Find other video parts hopefully in the right order
Troba altres parts del vÃdeo, amb sort en l'ordre correcte
-
+
&Remove
&Elimina
-
+
Remove the selected videos from the playlist
Elimina els vÃdeos seleccionats de la llista de reproducció
-
+
Move &Up
Mou &amunt
-
+
Move up the selected videos in the playlist
Mou amunt els vÃdeos seleccionats en la llista de reproducció
-
+
Move &Down
Mou a&vall
-
+
Move down the selected videos in the playlist
Mou avall els vÃdeos seleccionats en la llista de reproducció
-
+
Clear the search history. Cannot be undone.
Neteja l'historial de búsquedes. No es pot desfer.
-
+
&Quit
&Surt
-
+
Bye
Adéu
-
+
&Website
PÃ gina &web
-
+
%1 on the Web
%1 a la xarxa
-
+
Please support the continued development of %1
Siusplau ajuda al desenvolupament continuat del %1
-
+
&About
&Quant a
-
+
Info about %1
Info sobre %1
-
+
Search
Cerca
-
+
Mute volume
Silencia el volum
-
-
+
+
&Downloads
&Baixades
-
+
Show details about video downloads
Mostra detalls de les descà rregues de vÃdeo
-
+
&Download
&Baixa
-
+
Download the current video
Baixa el vÃdeo actual
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
Comparteix el vÃdeo actual fent servir %1
-
+
&Email
&Email
-
+
Email
Correu electrònic
-
+
&Close
&Tanca
-
+
&Float on Top
Manté a &sobre
-
+
&Stop After This Video
&Atura després d'aquest vÃdeo
-
+
&Report an Issue...
&Informa d'un problema...
-
+
&Refine Search...
&Afina la Cerca...
-
+
More...
-
+
&Related Videos
-
+
Watch videos related to the current one
-
+
&Application
&Aplicació
-
+
Buy %1...
Compra %1...
-
+
&Playback
&Reproducció
-
+
&Playlist
&Llista de reproducció
-
+
&Video
&VÃdeo
-
+
&View
&Vista
-
+
&Share
&Compartir
-
+
&Help
A&juda
-
+
Press %1 to raise the volume, %2 to lower it
Premeu %1 per pujar el volum, %2 per baixar-lo
-
-
+
+
Opening %1
Obrint %1
-
+
Do you want to exit %1 with a download in progress?
Vol abandonar el %1 amb una baixada en curs?
-
+
If you close %1 now, this download will be cancelled.
Si tanca el %1 ara, aquesta baixada es cancel·larà .
-
+
Close and cancel download
Tanca i cancel·la la baixada
-
+
Wait for download to finish
Espera a acabar la baixada
-
+
Leave &Full Screen
Abandona la Pantalla &Completa
-
+
%1 version %2 is now available.
%1 versió %2 ja està disponible.
-
+
Remind me later
Recorda-m'ho més tard
-
+
Update
Actualitza
-
+
Error: %1
Error: %1
-
+
P&revious
P&revi
-
+
Go back to the previous track
Torna a la pista anterior
-
+
&Compact Mode
&Mode compacte
-
+
Open the &YouTube Page
Obre la pà gina de &YouTube
-
+
Copy the YouTube &Link
Copia l'&enllaç de YouTube
-
+
Copy the Video Stream &URL
Copia el &URL del flux de vÃdeo
-
+
Find Video &Parts
Troba &parts de vÃdeo
-
+
&Clear Recent Searches
&Neteja les búsquedes recents
-
+
Make a &Donation
Fer una &donació
-
+
&Manually Start Playing
Reprodueix vÃdeos &manualment
-
+
Manually start playing videos
Comença a reproduir vÃdeos manualment
-
+
Choose your content location
-
+
&Play
&Reprodueix
-
+
Resume playback
Continua la reproducció
-
+
Remaining time: %1
Temps restant: %1
-
+
Volume at %1%
Volum al %1%
-
+
Volume is muted
El volum està silenciat
-
+
Volume is unmuted
El volum no està silenciat
-
+
Maximum video definition set to %1
Resolució mà xima de vÃdeo fixada a %1
-
+
Your privacy is now safe
La vostra privacitat ara és segura
-
+
Downloads complete
Baixades completes
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Ja podeu enganxar l'enllaç de YouTube en una altra aplicació
-
+
You can now paste the video stream URL into another application
Ja pot enganxar el URL del flux de vÃdeo en una altra aplicació
-
+
The link will be valid only for a limited time.
L'enllaç només serà và lid durant un temps limitat.
-
+
This is just the demo version of %1.
Aquesta només és la versió de demostració del %1.
-
+
It allows you to test the application and see if it works for you.
Us permet probar l'aplicació i veure si us va bé.
-
+
Continue
Continua
-
+
of
Used in video parts, as in '2 of 3'
de
-
+
part
This is for video parts, as in 'Cool video - part 1'
part
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
episodi
-
+
Sent from %1
Enviat des de %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
Aconseguiu la versió completa
-
+
Downloading %1
Baixant %1
@@ -870,32 +984,32 @@
A new version of %1 is available!
-
+ Una nova versió de %1 està disponible
%1 %2 is now available. You have %3.
-
+ %1 %2 estan disponibles. Tu tens %3.
Would you like to download it now?
-
+ T'agradaria descarregar-ho ara?
Skip This Version
-
+ Omet aquesta versió
Remind Me Later
-
+ Recorda-m'ho després
Install Update
-
+ Instal·la Actualització
@@ -903,58 +1017,58 @@
Paste
-
+ Enganxar
PlaylistItemDelegate
-
+
%1 views
%1 visualitzacions
-
+
%1 of %2 (%3) â %4
-
+
Preparing
-
+
Failed
-
+
Completed
-
+
Stopped
-
+
Stop downloading
-
+
Show in %1
-
+
Open parent folder
-
+
Restart downloading
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Benvinguts al <a href='%1'>%2</a>,
-
+
Get the full version
Aconsegueix la versió completa
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Introdueix
-
+
a keyword
una paraula
-
+
a channel
un canal
-
+
to start watching videos.
per comencar a veure vÃdeos.
-
+
Watch
Veure
-
+
Recent keywords
Búsquedes recents
-
+
Recent channels
Canals recents
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
&Enrere
@@ -1196,11 +1310,6 @@
Most Popular
-
-
- Featured
-
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
No es pot obtenir flux de vÃdeo per %1
-
+
Network error: %1 for %2
Error de xarxa: %1 per %2
diff --git a/locale/ca_ES.ts b/locale/ca_ES.ts
deleted file mode 100644
index 9ab70c1..0000000
--- a/locale/ca_ES.ts
+++ /dev/null
@@ -1,1476 +0,0 @@
-
-UTF-8
-
- AboutView
-
-
- There's life outside the browser!
- Hi ha vida fora del navegador!
-
-
-
- Version %1
- Versió %1
-
-
-
- Licensed to: %1
-
-
-
-
- %1 is Free Software but its development takes precious time.
- %1 és Software Lliure però el seu desenvolupament pren un temps molt valuós.
-
-
-
- Please <a href='%1'>donate</a> to support the continued development of %2.
- Si us plau <a href='%1'>doneu</a> per ajudar al desenvolupament continuat del %2.
-
-
-
- You may want to try my other apps as well:
- Potser també voldreu provar les meves altres aplicacions:
-
-
-
- %1, a YouTube music player
- %1, un reproductor de música del YouTube
-
-
-
- %1, a music player
- %1, un reproductor de música
-
-
-
- Translate %1 to your native language using %2
- Traduïu el %1 al vostre idioma natal a través de %2
-
-
-
- Icon designed by %1.
- Icona dissenyada per %1.
-
-
-
- Released under the <a href='%1'>GNU General Public License</a>
- Llançat sota la <a href='%1'>Llicència Pública General de GNU</a>
-
-
-
- &Close
- &Tanca
-
-
-
- About
- Quant a
-
-
-
- What you always wanted to know about %1 and never dared to ask
- El que sempre havÃeu volgut saber sobre el %1 i mai us havÃeu atrevit a preguntar
-
-
-
- ActivationDialog
-
-
- Enter your License Details
-
-
-
-
- &Email:
-
-
-
-
- &Code:
-
-
-
-
- ActivationView
-
-
- Please license %1
- Si us plau, llicencia el %1
-
-
-
- This demo has expired.
- Aquesta demo ha expirat.
-
-
-
- The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
-
-
-
- Without a license, the application will expire in %1 days.
-
-
-
-
- By purchasing the full version, you will also support the hard work I put into creating %1.
- Comprant la versió completa, també donareu suport al dur treball que he posat en la creació del %1.
-
-
-
- Use Demo
- Utilitza la demo
-
-
-
- Enter License
-
-
-
-
- Buy License
-
-
-
-
- ClearButton
-
-
- Clear
- Neteja
-
-
-
- DownloadItem
-
-
- bytes
- bytes
-
-
-
- KB
- KB
-
-
-
- MB
- MB
-
-
-
- bytes/sec
- bytes/seg
-
-
-
- KB/sec
- KB/seg
-
-
-
- MB/sec
- MB/seg
-
-
-
- seconds
- segons
-
-
-
- minutes
- minuts
-
-
-
- %4 %5 remaining
- %4 %5 restant
-
-
-
- DownloadManager
-
-
- This is just the demo version of %1.
- Aquesta només és la versió de demostració del %1.
-
-
-
- It can only download videos shorter than %1 minutes so you can test the download functionality.
- Només pot baixar vÃdeos de menys de %1 minuts per tal que en pugui provar aquesta funció.
-
-
-
- Continue
- Continua
-
-
-
- Get the full version
- Aconseguiu la versió completa
-
-
-
- %1 downloaded in %2
- %1 descarregat en %2
-
-
-
- Download finished
- Descà rrega finalitzada
-
-
-
- %n Download(s)
- %n Baixada %n Baixades
-
-
-
- DownloadSettings
-
-
- Change location...
- Canvieu la ubicació...
-
-
-
- Choose the download location
- Esculliu la ubicació de les baixades
-
-
-
- Download location changed.
- Ubicació de baixades canviada.
-
-
-
- Current downloads will still go in the previous location.
- Les baixades actuals encara aniran a la ubicació prèvia.
-
-
-
- Downloading to: %1
- S'està baixant a: %1
-
-
-
- DownloadView
-
-
-
- Downloads
- Baixades
-
-
-
- DownloadWidget
-
-
- Downloading update...
-
-
-
-
- GlobalShortcuts
-
-
- Play
- Reprodueix
-
-
-
- Pause
- Pausa
-
-
-
- Play/Pause
- Reprodueix/Pausa
-
-
-
- Stop
- Atura
-
-
-
- Stop playing after current track
- Atura en acabar la peça actual
-
-
-
- Next track
- Peça següent
-
-
-
- Previous track
- Peça prèvia
-
-
-
- Increase volume
- Augmenta el volum
-
-
-
- Decrease volume
- Disminuex el volum
-
-
-
- Mute
- Silenci
-
-
-
- Seek forward
- Cerca endavant
-
-
-
- Seek backward
- Cerca enrere
-
-
-
- HomeView
-
-
- Search
- Busca
-
-
-
- Find videos and channels by keyword
-
-
-
-
- Browse
-
-
-
-
- Browse videos by category
-
-
-
-
- Make yourself comfortable
-
-
-
-
- LoadingWidget
-
-
- Error
- Error
-
-
-
- MainWindow
-
-
- &Stop
- &Atura
-
-
-
- Stop playback and go back to the search view
- Atura la reproducció i torna a la vista de búsqueda
-
-
-
- S&kip
- &Salta
-
-
-
- Skip to the next video
- Salta al vÃdeo següent
-
-
-
-
- &Pause
- &Pausa
-
-
-
-
- Pause playback
- Pausa la reproducció
-
-
-
- &Full Screen
- Pantalla &completa
-
-
-
- Go full screen
- Passa a pantalla completa
-
-
-
- Hide the playlist and the toolbar
- Amaga la llista de reproducció i la barra d'eines
-
-
-
- Go to the YouTube video page and pause playback
- Ves a la pà gina del vÃdeo del YouTube i pausa la reproducció
-
-
-
- Copy the current video YouTube link to the clipboard
- Copia l'enllaç del vÃdeo actual del YouTube al porta-retalls
-
-
-
- Copy the current video stream URL to the clipboard
- Copia el URL del flux de vÃdeo actual al porta-retalls
-
-
-
- Find other video parts hopefully in the right order
- Troba altres parts del vÃdeo, amb sort en l'ordre correcte
-
-
-
- &Remove
- &Elimina
-
-
-
- Remove the selected videos from the playlist
- Elimina els vÃdeos seleccionats de la llista de reproducció
-
-
-
- Move &Up
- Mou &amunt
-
-
-
- Move up the selected videos in the playlist
- Mou amunt en la llista de reproducció els vÃdeos seleccionats
-
-
-
- Move &Down
- Mou a&vall
-
-
-
- Move down the selected videos in the playlist
- Mou avall en la llista de reproducció els vÃdeos seleccionats
-
-
-
- Clear the search history. Cannot be undone.
- Neteja l'historial de cerques. No es pot desfer.
-
-
-
- &Quit
- &Surt
-
-
-
- Bye
- Adéu
-
-
-
- &Website
- PÃ gina &web
-
-
-
- %1 on the Web
- %1 en la web
-
-
-
- Please support the continued development of %1
- Si us plau recolzeu el desenvolupament continuat del %1
-
-
-
- &About
- &Quant a
-
-
-
- Info about %1
- Informació sobre el %1
-
-
-
- Search
- Cerca
-
-
-
- Mute volume
- Silencia el volum
-
-
-
-
- &Downloads
- &Baixades
-
-
-
- Show details about video downloads
- Mostra detalls de les descà rregues de vÃdeo
-
-
-
- &Download
- &Baixa
-
-
-
- Download the current video
- Baixa el vÃdeo actual
-
-
-
- Share the current video using %1
- Comparteix el vÃdeo actual fent servir %1
-
-
-
- &Email
- &Email
-
-
-
- Email
- Correu electrònic
-
-
-
- &Close
- &Tanca
-
-
-
- &Float on Top
- Manté a &sobre
-
-
-
- &Stop After This Video
- &Atura després d'aquest vÃdeo
-
-
-
- &Report an Issue...
- &Informa d'un problema
-
-
-
- &Refine Search...
- &Afina la Cerca...
-
-
-
- More...
-
-
-
-
- &Related Videos
-
-
-
-
- Watch videos related to the current one
-
-
-
-
- &Application
- &Aplicació
-
-
-
- Buy %1...
- Compra %1...
-
-
-
- &Playback
- &Reproducció
-
-
-
- &Playlist
- &Llista de reproducció
-
-
-
- &Video
- &VÃdeo
-
-
-
- &View
- &Vista
-
-
-
- &Share
- &Compartir
-
-
-
- &Help
- A&juda
-
-
-
- Press %1 to raise the volume, %2 to lower it
- Premeu %1 per pujar el volum, %2 per baixar-lo
-
-
-
-
- Opening %1
- S'està obrint %1
-
-
-
- Do you want to exit %1 with a download in progress?
- Voleu abandonar el %1 amb una baixada en curs?
-
-
-
- If you close %1 now, this download will be cancelled.
- Si tanqueu el %1 ara, aquesta baixada es cancel·larà .
-
-
-
- Close and cancel download
- Tanca i cancel·la la baixada
-
-
-
- Wait for download to finish
- Espera a acabar la baixada
-
-
-
- Leave &Full Screen
- Abandona la Pantalla &Completa
-
-
-
- %1 version %2 is now available.
- %1 versió %2 ja està disponible.
-
-
-
- Remind me later
- Recorda-m'ho més tard
-
-
-
- Update
- Actualitza
-
-
-
- Error: %1
- Error: %1
-
-
-
- P&revious
- P&revi
-
-
-
- Go back to the previous track
- Torna a la pista anterior
-
-
-
- &Compact Mode
- &Mode compacte
-
-
-
- Open the &YouTube Page
- Obre la pà gina de &YouTube
-
-
-
- Copy the YouTube &Link
- Copia l'&enllaç de YouTube
-
-
-
- Copy the Video Stream &URL
- Copia el &URL del flux de vÃdeo
-
-
-
- Find Video &Parts
- Troba &parts de vÃdeo
-
-
-
- &Clear Recent Searches
- &Neteja les búsquedes recents
-
-
-
- Make a &Donation
- Fer una &donació
-
-
-
- &Manually Start Playing
- Reprodueix vÃdeos &manualment
-
-
-
- Manually start playing videos
- Comença a reproduir vÃdeos manualment
-
-
-
- Choose your content location
-
-
-
-
- &Play
- &Reprodueix
-
-
-
- Resume playback
- Continua la reproducció
-
-
-
- Remaining time: %1
- Temps restant: %1
-
-
-
- Volume at %1%
- Volum al %1%
-
-
-
- Volume is muted
- Volum desactivat
-
-
-
- Volume is unmuted
- Volum activat
-
-
-
- Maximum video definition set to %1
- Resolució mà xima de vÃdeo fixada a %1
-
-
-
- Your privacy is now safe
- La vostra privacitat està protegida
-
-
-
- Downloads complete
- Baixades completes
-
-
-
- MediaView
-
-
- You can now paste the YouTube link into another application
- Ja podeu enganxar l'enllaç del YouTube en una altra aplicació
-
-
-
- You can now paste the video stream URL into another application
- Ja podeu enganxar el URL del flux de vÃdeo en una altra aplicació
-
-
-
- The link will be valid only for a limited time.
- L'enllaç només serà và lid durant un temps limitat.
-
-
-
- This is just the demo version of %1.
- Aquesta només és la versió de demostració del %1.
-
-
-
- It allows you to test the application and see if it works for you.
- Li permet probar l'aplicació i veure si li va bé.
-
-
-
- Continue
- Continua
-
-
-
- of
- Used in video parts, as in '2 of 3'
- de
-
-
-
- part
- This is for video parts, as in 'Cool video - part 1'
- part
-
-
-
- episode
- This is for video parts, as in 'Cool series - episode 1'
- episodi
-
-
-
- Sent from %1
- Enviat des de %1
-
-
-
- Get the full version
- Aconseguiu la versió completa
-
-
-
- Downloading %1
- S'està baixant %1
-
-
-
- MessageWidget
-
-
- A new version of %1 is available!
-
-
-
-
- %1 %2 is now available. You have %3.
-
-
-
-
- Would you like to download it now?
-
-
-
-
- Skip This Version
-
-
-
-
- Remind Me Later
-
-
-
-
- Install Update
-
-
-
-
- PasteLineEdit
-
-
- Paste
-
-
-
-
- PlaylistItemDelegate
-
-
- %1 views
- %1 visualitzacions
-
-
-
- %1 of %2 (%3) â %4
-
-
-
-
- Preparing
-
-
-
-
- Failed
-
-
-
-
- Completed
-
-
-
-
- Stopped
-
-
-
-
- Stop downloading
-
-
-
-
- Show in %1
-
-
-
-
- Open parent folder
-
-
-
-
- Restart downloading
-
-
-
-
- PlaylistModel
-
-
- Searching...
- Buscant...
-
-
-
- Show %1 More
-
-
-
-
- No videos
- Cap vÃdeo
-
-
-
- No more videos
-
-
-
-
- RefineSearchWidget
-
-
- Sort by
- Ordena per
-
-
-
- Relevance
- Rellevà ncia
-
-
-
-
- Date
- Data
-
-
-
- View Count
- Nombre de vistes
-
-
-
- Rating
- Qualificació
-
-
-
- Anytime
- Qualsevol data
-
-
-
- Today
- Avui
-
-
-
- 7 Days
- 7 dies
-
-
-
- 30 Days
- 30 dies
-
-
-
- Duration
- Durada
-
-
-
-
- All
- Tot
-
-
-
- Short
- Curt
-
-
-
- Medium
- Mig
-
-
-
- Long
- Llarg
-
-
-
- Less than 4 minutes
- menys de 4 minuts
-
-
-
- Between 4 and 20 minutes
- entre 4 i 20 minuts
-
-
-
- Longer than 20 minutes
- més de 20 minuts
-
-
-
- Quality
- Qualitat
-
-
-
- High Definition
- Alta definició
-
-
-
- 720p or higher
- 720p o major
-
-
-
- Done
- Fet
-
-
-
- RegionsView
-
-
- Done
-
-
-
-
- SearchLineEdit
-
-
- Search
- Cerca
-
-
-
- SearchView
-
-
- Welcome to <a href='%1'>%2</a>,
- Benvingut al <a href='%1'>%2</a>,
-
-
-
- Get the full version
- Aconseguiu la versió completa
-
-
-
- Enter
- "Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
- Introduïu
-
-
-
- a keyword
- una paraula
-
-
-
- a channel
- un canal
-
-
-
- to start watching videos.
- per comencar a veure vÃdeos.
-
-
-
- Watch
- Veure
-
-
-
- Recent keywords
- Cerques recents
-
-
-
- Recent channels
- Canals recents
-
-
-
- SidebarHeader
-
-
-
- &Back
- &Enrere
-
-
-
- Forward to %1
-
-
-
-
- Back to %1
-
-
-
-
- SidebarWidget
-
-
- Refine Search
- Afina la Cerca
-
-
-
- Did you mean: %1
- Volieu dir: %1
-
-
-
- StandardFeedsView
-
-
- Most Popular
-
-
-
-
- Featured
-
-
-
-
- Most Shared
-
-
-
-
- Most Discussed
-
-
-
-
- Top Rated
-
-
-
-
- Video
-
-
- Cannot get video stream for %1
- No es pot obtenir flux de vÃdeo per %1
-
-
-
- Network error: %1 for %2
- Error de xarxa: %1 per %2
-
-
-
- YTRegions
-
-
- Algeria
-
-
-
-
- Argentina
-
-
-
-
- Australia
-
-
-
-
- Belgium
-
-
-
-
- Brazil
-
-
-
-
- Canada
-
-
-
-
- Chile
-
-
-
-
- Colombia
-
-
-
-
- Czech Republic
-
-
-
-
- Egypt
-
-
-
-
- France
-
-
-
-
- Germany
-
-
-
-
- Ghana
-
-
-
-
- Greece
-
-
-
-
- Hong Kong
-
-
-
-
- Hungary
-
-
-
-
- India
-
-
-
-
- Indonesia
-
-
-
-
- Ireland
-
-
-
-
- Israel
-
-
-
-
- Italy
-
-
-
-
- Japan
-
-
-
-
- Jordan
-
-
-
-
- Kenya
-
-
-
-
- Malaysia
-
-
-
-
- Mexico
-
-
-
-
- Morocco
-
-
-
-
- Netherlands
-
-
-
-
- New Zealand
-
-
-
-
- Nigeria
-
-
-
-
- Peru
-
-
-
-
- Philippines
-
-
-
-
- Poland
-
-
-
-
- Russia
-
-
-
-
- Saudi Arabia
-
-
-
-
- Singapore
-
-
-
-
- South Africa
-
-
-
-
- South Korea
-
-
-
-
- Spain
-
-
-
-
- Sweden
-
-
-
-
- Taiwan
-
-
-
-
- Tunisia
-
-
-
-
- Turkey
-
-
-
-
- Uganda
-
-
-
-
- United Arab Emirates
-
-
-
-
- United Kingdom
-
-
-
-
- Yemen
-
-
-
-
- Worldwide
-
-
-
-
\ No newline at end of file
diff --git a/locale/cs_CZ.ts b/locale/cs_CZ.ts
index edaa37c..680378e 100644
--- a/locale/cs_CZ.ts
+++ b/locale/cs_CZ.ts
@@ -134,6 +134,95 @@
Koupit licenci
+
+ ChannelAggregator
+
+
+ By %1
+ Od %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ VÅ¡echna videa
+
+
+
+ Unwatched Videos
+ Nesledovaná videa
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ OznaÄit jako shlédnuté
+
+
+
+ Show Updated
+ Zobrazit aktualizace
+
+
+
+ Name
+ Jméno
+
+
+
+ Last Updated
+ Poslednà aktualizace
+
+
+
+ Last Added
+ Naposledy pÅidáno
+
+
+
+ Last Watched
+ Naposledy shlédnuto
+
+
+
+ Most Watched
+ NejsledovanÄjÅ¡Ã
+
+
+
+ Sort by
+ TÅÃdit podle
+
+
+
+ All Videos
+ VÅ¡echna videa
+
+
+
+ Unwatched Videos
+ Nesledovaná videa
+
+
+
+ There are no updated subscriptions at this time.
+ Nynà nejsou k dispozici žádné aktualizace odbÄrů.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Nemáte žádné odbÄry. Použijte hvÄzdiÄku k pÅihlásenà odbÄru kanálů.
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Hledat
-
+
Find videos and channels by keyword
NajÃt videa a kanály podle klÃÄového slova
-
+
Browse
ProhlÞet
-
+
Browse videos by category
ProhlÞet videa podle kategorie
+
+
+ Subscriptions
+ OdbÄry
+
+
+
+ Channel subscriptions
+ Kanál odbÄrů
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Chyba
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Stop
-
+
Stop playback and go back to the search view
Zastavà pÅehrávánà a vrátà se zpÄt na vyhledávánÃ
-
+
S&kip
PÅ&eskoÄit
-
+
Skip to the next video
PÅeskoÄà na dalÅ¡Ã video
-
-
+
+
&Pause
&Pauza
-
-
+
+
Pause playback
Pozastavà pÅehrávánÃ
-
+
&Full Screen
&Celá obrazovka
-
+
Go full screen
PÅepne na celou obrazovku
-
+
Hide the playlist and the toolbar
Skryje playlist a toolbar
-
+
Go to the YouTube video page and pause playback
OtevÅe video na webu YouTube a pozastavà pÅehrávánÃ
-
+
Copy the current video YouTube link to the clipboard
ZkopÃruje adresu videa na YouTube do schránky
-
+
Copy the current video stream URL to the clipboard
ZkopÃruje do schránky adresu video streamu
-
+
Find other video parts hopefully in the right order
NajÃt dalÅ¡Ã Äásti videa, doufejme, že ve správném poÅadÃ
-
+
&Remove
&Odstranit
-
+
Remove the selected videos from the playlist
Odstranà vybraná videa z playlistu
-
+
Move &Up
&Nahoru
-
+
Move up the selected videos in the playlist
Posune vybraná videa výš v playlistu
-
+
Move &Down
&Dolů
-
+
Move down the selected videos in the playlist
Posune vybraná videa nÞ v playlistu
-
+
Clear the search history. Cannot be undone.
Vyprázdnà historii vyhledávánÃ. Akci nelze vrátit.
-
+
&Quit
&ZavÅÃt
-
+
Bye
Sbohem
-
+
&Website
&Homepage
-
+
%1 on the Web
%1 na Webu
-
+
Please support the continued development of %1
ProsÃm pÅispÄjte na dalÅ¡Ã vývoj aplikace %1
-
+
&About
&O aplikaci
-
+
Info about %1
Info o aplikaci %1
-
+
Search
Hledat
-
+
Mute volume
Ztlumit
-
-
+
+
&Downloads
&StahovánÃ
-
+
Show details about video downloads
Zobrazit podrobnosti o stahovánà videÃ
-
+
&Download
&Stáhnout
-
+
Download the current video
Stáhnout pÅávÄ zobrazené video
-
+
+ &Subscribe to Channel
+ &PÅihlásit se ke kanálu
+
+
+
Share the current video using %1
SdÃlet aktuálnà video pomocà %1
-
+
&Email
&Email
-
+
Email
Email
-
+
&Close
&ZavÅÃt
-
+
&Float on Top
&Plovoucà navrchu
-
+
&Stop After This Video
&Zastavit po tomto videu
-
+
&Report an Issue...
&Nahlásit chybu...
-
+
&Refine Search...
&UpÅesnit vyhledávánÃ...
-
+
More...
VÃce...
-
+
&Related Videos
&SouvisejÃcà videa
-
+
Watch videos related to the current one
Sledovat videa souvisejÃcà s tÃmto
-
+
&Application
&Aplikace
-
+
Buy %1...
Koupit %1...
-
+
&Playback
&PÅehrávánÃ
-
+
&Playlist
&Playlist
-
+
&Video
&Video
-
+
&View
&Pohled
-
+
&Share
&SdÃlet
-
+
&Help
&NápovÄda
-
+
Press %1 to raise the volume, %2 to lower it
StisknÄte %1 pro zvýšenà hlasitosti; %2 pro snÞenÃ
-
-
+
+
Opening %1
OtevÃrám %1
-
+
Do you want to exit %1 with a download in progress?
Chcete ukonÄit %1, pÅestože jeÅ¡tÄ probÃhá stahovánÃ?
-
+
If you close %1 now, this download will be cancelled.
Jestli nynà ukonÄÃte %1, bude nedokonÄené stahovánà pÅeruÅ¡eno
-
+
Close and cancel download
PÅeruÅ¡it stahovánà a ukonÄit aplikaci
-
+
Wait for download to finish
PoÄkat na dokonÄenà stahovánÃ
-
+
Leave &Full Screen
Opustit zobrazenà na &celou obrazovku
-
+
%1 version %2 is now available.
%1 verze %2 je nynà dostupná.
-
+
Remind me later
PÅipomenout pozdÄji
-
+
Update
Aktualizovat
-
+
Error: %1
Chyba: %1
-
+
P&revious
P&ÅedeÅ¡lý
-
+
Go back to the previous track
JÃt zpÄt na pÅedchozà skladbu
-
+
&Compact Mode
&Kompaktnà mód
-
+
Open the &YouTube Page
OtevÅÃt stránku &YouTube
-
+
Copy the YouTube &Link
KopÃrovat YouTube &odkaz
-
+
Copy the Video Stream &URL
ZkopÃrovat adresu &video streamu
-
+
Find Video &Parts
- Nalézt video &Äásti
+ Nalézt &Äásti videa
-
+
&Clear Recent Searches
&Vymazat poslednà hledánÃ
-
+
Make a &Donation
&PodpoÅit
-
+
&Manually Start Playing
- &RuÄnÄ zahájit pÅehrávánÃ
+ Zahájit pÅehrávánà &ruÄnÄ
-
+
Manually start playing videos
- RuÄnÄ zahájit pÅehrávánà videÃ
+ Zahájit pÅehrávánà videà ruÄnÄ
-
+
Choose your content location
Vyberte si umÃstÄnà obsahu
-
+
&Play
&Play
-
+
Resume playback
PokraÄovat v pÅehrávánÃ
-
+
Remaining time: %1
ZbývajÃcà Äas: %1
-
+
Volume at %1%
Hlasitost na %1%
-
+
Volume is muted
Zvuk je ztlumen
-
+
Volume is unmuted
Zvuk je zapnut
-
+
Maximum video definition set to %1
Maximálnà rozlišenà videa je %1
-
+
Your privacy is now safe
VaÅ¡e soukromà je nynà v bezpeÄÃ
-
+
Downloads complete
VÅ¡echna stahovánà byla dokonÄena
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Nynà můžete vložit odkaz na video na YouTube do jiného programu
-
+
You can now paste the video stream URL into another application
Nynà můžete vložit odkaz na video stream do jiné aplikace
-
+
The link will be valid only for a limited time.
Tento odkaz platà jen po omezenou dobu.
-
+
This is just the demo version of %1.
Toto je %1 -- demoverze.
-
+
It allows you to test the application and see if it works for you.
UmožÅuje vyzkouÅ¡et aplikaci, abyste ovÄÅili, jestli pro vás funguje.
-
+
Continue
PokraÄovat
-
+
of
Used in video parts, as in '2 of 3'
z
-
+
part
This is for video parts, as in 'Cool video - part 1'
Äást
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
epizoda
-
+
Sent from %1
Zaslat z %1
-
+
+ Unsubscribe from %1
+ Odhlásit z
+
+
+
+ Subscribe to %1
+ PÅihlásit k %1
+
+
+
Get the full version
Stáhnout plnou verzi
-
+
Downloading %1
Je stahováno %1
@@ -909,54 +1023,54 @@
PlaylistItemDelegate
-
+
%1 views
%1 zobrazenÃ
-
+
%1 of %2 (%3) â %4
%1 z %2 (%3) â %4
-
+
Preparing
PÅipravuje se
-
+
Failed
Selhalo
-
+
Completed
DokonÄeno
-
+
Stopped
Zastaveno
-
+
Stop downloading
Zastavit stahovánÃ
-
+
Show in %1
Ukázat v %1
-
+
Open parent folder
OtevÅÃt pÅÃsluÅ¡ný adresáÅ
-
+
Restart downloading
- ZaÄÃt stahovat znova
+ ZaÄÃt stahovat znovu
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
VÃtejte v <a href='%1'>%2</a>
-
+
Get the full version
ZÃskat plnou verzi
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
- Enter
+ Vložit
-
+
a keyword
kl̀ov̩ slovo
-
+
a channel
kanál
-
+
to start watching videos.
- zaÄÃt sledovat videa.
+ pro sledovánà videÃ.
-
+
Watch
Sledovat
-
+
Recent keywords
Poslednà klÃÄová slova
-
+
Recent channels
Poslednà kanály
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
&ZpÄt
@@ -1196,11 +1310,6 @@
Most Popular
NejoblÃbenÄjÅ¡Ã
-
-
- Featured
- NejlepÅ¡Ã
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
Nejlépe hodnocené
+
+
+ All Time Popular
+ Celou dobu populárnÃ
+
Video
-
+
Cannot get video stream for %1
Nelze zÃskat video stream pro %1
-
+
Network error: %1 for %2
Chyba pÅÃpojenÃ: %1 pro %2
diff --git a/locale/da.ts b/locale/da.ts
index 28cbf6d..0a56c00 100644
--- a/locale/da.ts
+++ b/locale/da.ts
@@ -134,6 +134,95 @@
Køb licens
+
+ ChannelAggregator
+
+
+ By %1
+ Af %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Alle videoer
+
+
+
+ Unwatched Videos
+ Videoer, der ikke er set
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Marker alle som set
+
+
+
+ Show Updated
+ Show opdateret
+
+
+
+ Name
+ Navn
+
+
+
+ Last Updated
+ Senest opdateret
+
+
+
+ Last Added
+ Senest tilføjet
+
+
+
+ Last Watched
+ Sidst set
+
+
+
+ Most Watched
+ Mest set
+
+
+
+ Sort by
+ Sorter efter
+
+
+
+ All Videos
+ Alle videoer
+
+
+
+ Unwatched Videos
+ Videoer, der ikke er set
+
+
+
+ There are no updated subscriptions at this time.
+ Der er ingen opdateringer i de abonnerede.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Du har ingen abonnementer. Brug stjernetegnet til at abonnere på kanaler.
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Søg
-
+
Find videos and channels by keyword
Find videoer og kanaler via søgeord
-
+
Browse
Gennemse
-
+
Browse videos by category
Gennemse videoer efter kategori
+
+
+ Subscriptions
+ Abonnementer
+
+
+
+ Channel subscriptions
+ Abonnementer på kanaler
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Fejl
@@ -375,427 +474,432 @@
MainWindow
-
+
&Stop
&Stop
-
+
Stop playback and go back to the search view
Stop afspilning og gå tilbage til søgeoversigt
-
+
S&kip
S&pring over
-
+
Skip to the next video
Spring til næste video
-
-
+
+
&Pause
&Pause
-
-
+
+
Pause playback
Pause afspilning
-
+
&Full Screen
&Fuldskærm
-
+
Go full screen
Vis i fuldskærm
-
+
Hide the playlist and the toolbar
Skjul afspilningslisten og værktøjslinjen
-
+
Go to the YouTube video page and pause playback
GÃ¥ til YouTube-videosiden og pause afspilningen
-
+
Copy the current video YouTube link to the clipboard
Kopier det aktuelle YouTube-videolink til udklipsholderen
-
+
Copy the current video stream URL to the clipboard
Kopier adressen for den aktuelle videostrøm til udklipsholderen
-
+
Find other video parts hopefully in the right order
Find andre videodele forhåbentlig i den rigtige rækkefølge
-
+
&Remove
&Fjern
-
+
Remove the selected videos from the playlist
Fjern de valgte videoer fra afspilningslisten
-
+
Move &Up
Flyt &Op
-
+
Move up the selected videos in the playlist
Flyt de valgte videoer i afspilningslisten op
-
+
Move &Down
Flyt &Ned
-
+
Move down the selected videos in the playlist
Flyt de valgte videoer i afspilningslisten ned
-
+
Clear the search history. Cannot be undone.
Ryd søgeoversigt. Kan ikke fortrydes.
-
+
&Quit
&Afslut
-
+
Bye
Farvel
-
+
&Website
&Hjemmeside
-
+
%1 on the Web
%1 på nettet
-
+
Please support the continued development of %1
Støt den forsatte udvikling af %1
-
+
&About
&Om
-
+
Info about %1
Info om %1
-
+
Search
Søg
-
+
Mute volume
Slå lyden fra
-
-
+
+
&Downloads
&Downloads
-
+
Show details about video downloads
Vis deltaljer om video downloads
-
+
&Download
&Download
-
+
Download the current video
Download den aktuelle video
-
+
+ &Subscribe to Channel
+ &Abonner på kanal
+
+
+
Share the current video using %1
Del den aktuelle video ved hjælp af %1
-
+
&Email
& E-mail
-
+
Email
E-mail
-
+
&Close
&Luk
-
+
&Float on Top
&Behold øverst
-
+
&Stop After This Video
&Stop efter denne video
-
+
&Report an Issue...
&Rapporter et problem...
-
+
&Refine Search...
&Indskrænk søgning...
-
+
More...
Mere...
-
+
&Related Videos
&Relaterede videoer
-
+
Watch videos related to the current one
Se videoer relateret til den nuværende
-
+
&Application
&Program
-
+
Buy %1...
Køb %1...
-
+
&Playback
&Afspil
-
+
&Playlist
&Afspilningsliste
-
+
&Video
&Video
-
+
&View
&Vis
-
+
&Share
&Del
-
+
&Help
&Hjælp
-
+
Press %1 to raise the volume, %2 to lower it
Tryk %1 for at skrue op for lyden og %2 for at skrue ned
-
-
+
+
Opening %1
Ã
bner %1
-
+
Do you want to exit %1 with a download in progress?
Vil du afslutte %1 selvom et download er i gang?
-
+
If you close %1 now, this download will be cancelled.
Hvis du lukker %1 nu vil dette download blive annulleret.
-
+
Close and cancel download
Luk og annuller download
-
+
Wait for download to finish
Vent til download er færdig
-
+
Leave &Full Screen
Forlad &Fuld skærm
-
+
%1 version %2 is now available.
%1 version %2 er nu tilgængelig.
-
+
Remind me later
PÃ¥mind mig senere
-
+
Update
Opdatér
-
+
Error: %1
Fejl: %1
-
+
P&revious
F&orrige
-
+
Go back to the previous track
GÃ¥ tilbage til forrige nummer
-
+
&Compact Mode
%
-
+
Open the &YouTube Page
Ã
bn &Youtube-siden
-
+
Copy the YouTube &Link
Kopier &link til Youtube
-
+
Copy the Video Stream &URL
Kopiér &URL'en til videostrømmen
-
+
Find Video &Parts
Find dele af videoen
-
+
&Clear Recent Searches
&Ryd seneste søgninger
-
+
Make a &Donation
Giv en &Donation
-
+
&Manually Start Playing
Start afspilning &manuelt
-
+
Manually start playing videos
Start afspilning af videoer manuelt
-
+
Choose your content location
Vælg placering for dit indhold
-
+
&Play
&Afspil
-
+
Resume playback
Genoptag afspilning
-
+
Remaining time: %1
Tilbageværende tid: %1
-
+
Volume at %1%
Lydniveau på %1%
-
+
Volume is muted
Lyden er slået fra
-
+
Volume is unmuted
Lyden er slået til
-
+
Maximum video definition set to %1
Maksimal videoopløsning sat til %1
-
+
Your privacy is now safe
Dit privatliv er nu sikret
-
+
Downloads complete
Downloads færdig
@@ -803,65 +907,75 @@ Kopiér &URL'en til videostrømmen
MediaView
-
+
You can now paste the YouTube link into another application
Du kan nu indsætte YouTube-linket i et andet program
-
+
You can now paste the video stream URL into another application
Du kan nu indsætte adressen til videostrømmen i et andet program
-
+
The link will be valid only for a limited time.
Linket vil kun være gyldigt i en begrænset periode.
-
+
This is just the demo version of %1.
Dette er kun demoversionen af %1.
-
+
It allows you to test the application and see if it works for you.
Det giver dig mulighed for at teste programmet og se om det virker for dig.
-
+
Continue
Forsæt
-
+
of
Used in video parts, as in '2 of 3'
af
-
+
part
This is for video parts, as in 'Cool video - part 1'
del
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
episode
-
+
Sent from %1
Sendt fra %1
-
+
+ Unsubscribe from %1
+ Fjern abonnement fra %1
+
+
+
+ Subscribe to %1
+ Abonner på %1
+
+
+
Get the full version
Hent den fulde version
-
+
Downloading %1
Downloader %1
@@ -910,52 +1024,52 @@ Kopiér &URL'en til videostrømmen
PlaylistItemDelegate
-
+
%1 views
%1 visninger
-
+
%1 of %2 (%3) â %4
%1 af %2 (%3) â %4
-
+
Preparing
Forbereder
-
+
Failed
Fejl
-
+
Completed
Fuldendt
-
+
Stopped
Stoppet
-
+
Stop downloading
Stop download
-
+
Show in %1
VIs i %1
-
+
Open parent folder
Ã
ben ovenstående mappe
-
+
Restart downloading
Genstart download
@@ -1112,48 +1226,48 @@ Kopiér &URL'en til videostrømmen
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Velkommen til <a href='%1'>%2</a>,
-
+
Get the full version
Hent den fulde version
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Indtast
-
+
a keyword
et nøgleord
-
+
a channel
en kanal
-
+
to start watching videos.
for at begynde at se video.
-
+
Watch
Afspil
-
+
Recent keywords
Seneste nøgleord
-
+
Recent channels
Nyeste kanaler
@@ -1161,8 +1275,8 @@ Kopiér &URL'en til videostrømmen
SidebarHeader
-
-
+
+
&Back
&Tilbage
@@ -1197,11 +1311,6 @@ Kopiér &URL'en til videostrømmen
Most Popular
Mest populære
-
-
- Featured
- Udvalgte
-
Most Shared
@@ -1217,16 +1326,21 @@ Kopiér &URL'en til videostrømmen
Top Rated
Bedst bedømte
+
+
+ All Time Popular
+ Mest populære
+
Video
-
+
Cannot get video stream for %1
Kan ikke hente videostrøm for %1
-
+
Network error: %1 for %2
Netværksfejl: %1 for %2
diff --git a/locale/de_DE.ts b/locale/de_DE.ts
index c59912a..2af667f 100644
--- a/locale/de_DE.ts
+++ b/locale/de_DE.ts
@@ -15,7 +15,7 @@
Licensed to: %1
-
+ Lizenziert für: %1
@@ -25,7 +25,7 @@
Please <a href='%1'>donate</a> to support the continued development of %2.
- Bitte <a href='%1'>spende</a>, um die ständige Entwicklung von %2 zu unterstützen.
+ Bitte <a href='%1'>spenden</a> Sie, um die Weiterentwicklung von %2 zu unterstützen.
@@ -50,7 +50,7 @@
Icon designed by %1.
- Symbol-Entwurf durch %1.
+ Icons wurden gestaltet von %1.
@@ -78,17 +78,17 @@
Enter your License Details
-
+ Geben Sie Ihre Lizenzierungsinformationen ein
&Email:
-
+ &E-mail:
&Code:
-
+ &Schlüssel:
@@ -106,12 +106,12 @@
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
+ In der Vollversion können Sie Videos ohne Unterbrechungen und mit einer Laufzeit von mehr als %1 Minuten ansehen.
Without a license, the application will expire in %1 days.
-
+ Ohne Lizenz läuft das Programm nur noch %1 Tage.
@@ -126,12 +126,101 @@
Enter License
-
+ Lizenzdaten eingeben
Buy License
-
+ Lizenz kaufen
+
+
+
+ ChannelAggregator
+
+
+ By %1
+ Von %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Alle Videos
+
+
+
+ Unwatched Videos
+ Ungesehene Videos
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Alle als gesehen markieren
+
+
+
+ Show Updated
+ Zeige aktualisierte
+
+
+
+ Name
+ Name
+
+
+
+ Last Updated
+ Zuletzt aktualisiert
+
+
+
+ Last Added
+ Zuletzt hinzugefügt
+
+
+
+ Last Watched
+ Zuletzt angesehen
+
+
+
+ Most Watched
+ Am meisten angesehen
+
+
+
+ Sort by
+ Sortieren nach
+
+
+
+ All Videos
+ Alle Videos
+
+
+
+ Unwatched Videos
+ Ungesehene Videos
+
+
+
+ There are no updated subscriptions at this time.
+ Zurzeit gibt es nichts Neues bei den Abonnements.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Du hast keine Abonnements. Benutze das Stern-Symbol, um einen Kanal zu abonnieren.
@@ -200,7 +289,7 @@
It can only download videos shorter than %1 minutes so you can test the download functionality.
- Sie kann nur Videos, die kürzer als %1 Minuten sind, herunterladen, damit die Download-Funktionalität getestet werden kann.
+ Sie kann nur Videos herunterladen, die kürzer als %1 Minuten sind, um die Funktion zum Herunterladen zu testen.
@@ -210,7 +299,7 @@
Get the full version
- Die Vollversion holen
+ Die Vollversion kaufen
@@ -243,12 +332,12 @@
Download location changed.
- Speicherort wurde verändert.
+ Speicherort wurde geändert.
Current downloads will still go in the previous location.
- Aktuelle Downloads werden immernoch im alten Speicherort gespeichert.
+ Aktuelle Downloads werden immer noch im alten Speicherort gespeichert.
@@ -270,7 +359,7 @@
Downloading update...
-
+ Lade Aktualisierung herunter...
@@ -298,7 +387,7 @@
Stop playing after current track
- Nachdem aktueller Titel abgespielt wurde halten
+ Nach aktuellem Titel Wiedergabe anhalten
@@ -339,35 +428,45 @@
HomeView
-
+
Search
Suche
-
+
Find videos and channels by keyword
-
+ Videos und Kanäle nach Suchbegriff finden
-
+
Browse
-
+ Stöbern
-
+
Browse videos by category
-
+ Videos nach Kategorien durchstöbern
+
+
+
+ Subscriptions
+ Abonnements
+
+
+
+ Channel subscriptions
+ Abonnierte Kanäle
Make yourself comfortable
-
+ Machen Sie es sich gemütlich
LoadingWidget
-
+
Error
Fehler
@@ -375,492 +474,507 @@
MainWindow
-
+
&Stop
&Halt
-
+
Stop playback and go back to the search view
Wiedergabe anhalten und zur Suchansicht zurückkehren
-
+
S&kip
Ã&berspringen
-
+
Skip to the next video
Zum nächsten Video springen
-
-
+
+
&Pause
&Pause
-
-
+
+
Pause playback
Wiedergabe pausieren
-
+
&Full Screen
&Vollbildmodus
-
+
Go full screen
Vollbildmodus aktivieren
-
+
Hide the playlist and the toolbar
- Verstecke Abspielliste und Werkzeugleiste
+ Abspielliste und Werkzeugleiste ausblenden
-
+
Go to the YouTube video page and pause playback
Gehe zur YouTube-Video-Seite und pausiere die Wiedergabe
-
+
Copy the current video YouTube link to the clipboard
YouTube-Link in die Zwischenablage kopieren
-
+
Copy the current video stream URL to the clipboard
- Video-URL in die Zwischenablage kopieren
+ Video-Link in die Zwischenablage kopieren
-
+
Find other video parts hopefully in the right order
Findet andere Teile des Videos, hoffentlich in der richtigen Reihenfolge
-
+
&Remove
Entfe&rnen
-
+
Remove the selected videos from the playlist
Entferne das ausgewählte Video aus der Abspielliste
-
+
Move &Up
Bewege &hinauf
-
+
Move up the selected videos in the playlist
Bewege das ausgewählte Video in der Abspielliste hinauf
-
+
Move &Down
Bewege hin&ab
-
+
Move down the selected videos in the playlist
Bewege das ausgewählte Video in der Abspielliste hinunter
-
+
Clear the search history. Cannot be undone.
- Such-Verlauf leeren. Kann nicht rückgängig gemacht werden.
+ Den Suchverlauf löschen. Kann nicht rückgängig gemacht werden.
-
+
&Quit
&Verlassen
-
+
Bye
Tschüss
-
+
&Website
&Webseite
-
+
%1 on the Web
%1 im Web
-
+
Please support the continued development of %1
Bitte unterstützen Sie die weitere Entwicklung von %1
-
+
&About
&Ãber
-
+
Info about %1
Informationen über %1
-
+
Search
Suche
-
+
Mute volume
Stummschalten
-
-
+
+
&Downloads
&Downloads
-
+
Show details about video downloads
Details über Video-Downloads anzeigen
-
+
&Download
H&erunterladen
-
+
Download the current video
Das aktuelle Video herunterladen
-
+
+ &Subscribe to Channel
+ &Abonnieren des Kanals
+
+
+
Share the current video using %1
Teilen Sie das aktuellen Video mit %1
-
+
&Email
&E-Mail
-
+
Email
E-Mail
-
+
&Close
&SchlieÃen
-
+
&Float on Top
Im Vordergrund &bleiben
-
+
&Stop After This Video
Nach diesem Video &anhalten
-
+
&Report an Issue...
&Ein Problem melden ...
-
+
&Refine Search...
&Suche verfeinern ...
-
+
More...
-
+ Mehr...
-
+
&Related Videos
-
+ Ve&rwandte Videos
-
+
Watch videos related to the current one
-
+ Verwandte Videos zum Aktuellen ansehen
-
+
&Application
&Anwendung
-
+
Buy %1...
%1 kaufen...
-
+
&Playback
&Wiedergabe
-
+
&Playlist
A&bspielliste
-
+
&Video
&Video
-
+
&View
&Ansehen
-
+
&Share
&Teilen
-
+
&Help
&Hilfe
-
+
Press %1 to raise the volume, %2 to lower it
%1 drücken, um die Lautstärke zu erhöhen, %2 um sie zu verringern
-
-
+
+
Opening %1
- %1 öffnen
+ Ãffne %1
-
+
Do you want to exit %1 with a download in progress?
Möchten Sie %1 mit einem aktiven Download beenden?
-
+
If you close %1 now, this download will be cancelled.
Wenn Sie %1 jetzt beenden, wird der Download abgebrochen.
-
+
Close and cancel download
Beenden und Download abbrechen
-
+
Wait for download to finish
- Auf Abschluà des Downloads warten
+ Auf Abschluss des Downloads warten
-
+
Leave &Full Screen
&Vollbild verlassen
-
+
%1 version %2 is now available.
%1 Version %2 ist jetzt verfügbar.
-
+
Remind me later
Erinnere mich später
-
+
Update
Aktualisierung
-
+
Error: %1
Fehler: %1
-
+
P&revious
V&origes
-
+
Go back to the previous track
Zum vorherigen Titel zurückgehen
-
+
&Compact Mode
&Kompakt-Modus
-
+
Open the &YouTube Page
&YouTube-Seite öffnen
-
+
Copy the YouTube &Link
- YouTube &Link kopieren
+ YouTube-&Link kopieren
-
+
Copy the Video Stream &URL
- Video-Stream &URL kopieren
+ Video-Stream-&URL kopieren
-
+
Find Video &Parts
- Suche Video &Teile
+ Suche weitere Video&teile
-
+
&Clear Recent Searches
Vorherige Suchbegriffe löschen
-
+
Make a &Donation
&Spenden
-
+
&Manually Start Playing
&Manuelles Starten der Wiedergabe
-
+
Manually start playing videos
- Manuelles Starten der Video-Wiedergabe
+ Manuelles Starten der Videowiedergabe
-
+
Choose your content location
-
+ Wähle ein Land für Inhalte
-
+
&Play
&Abspielen
-
+
Resume playback
Wiedergabe fortsetzen
-
+
Remaining time: %1
Verbleibende Zeit: %1
-
+
Volume at %1%
Lautstärke %1%
-
+
Volume is muted
Ton ist stummgeschaltet
-
+
Volume is unmuted
- Ton ist angeschaltet
+ Ton ist eingeschaltet
-
+
Maximum video definition set to %1
- Maximale Video-Auflösung wurde auf %1 gesetzt
+ Maximale Videoauflösung wurde auf %1 gesetzt
-
+
Your privacy is now safe
Ihre Privatsphäre ist nun geschützt
-
+
Downloads complete
- Downloads heruntergeladen
+ Herunterladen vollständig
MediaView
-
+
You can now paste the YouTube link into another application
- Du kannst den YouTube-Link nun in einer anderen Anwendung einfügen
+ Sie können den YouTube-Link nun in einer anderen Anwendung einfügen
-
+
You can now paste the video stream URL into another application
- Du kannst die Video-URL nun in einer anderen Anwendung einfügen
+ Sie können den Video-Link nun in einer anderen Anwendung einfügen
-
+
The link will be valid only for a limited time.
Der Link wird nur eine beschränkte Zeit gültig sein.
-
+
This is just the demo version of %1.
- Dies ist nur eine Demoversion von %1.
+ Dies ist nur die Demoversion von %1.
-
+
It allows you to test the application and see if it works for you.
- Sie erlaubt Ihnen die Anwendung zu testen und zu schauen ob sie bei Ihnen läuft.
+ Sie erlaubt es Ihnen die Anwendung zu testen und zu schauen, ob sie bei Ihnen läuft.
-
+
Continue
Fortfahren
-
+
of
Used in video parts, as in '2 of 3'
von
-
+
part
This is for video parts, as in 'Cool video - part 1'
Teil
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
Episode
-
+
Sent from %1
Gesendet von %1
-
+
+ Unsubscribe from %1
+ Beende Abonnement von %1
+
+
+
+ Subscribe to %1
+ Abonnieren von %1
+
+
+
Get the full version
- Die Vollversion holen
+ Die Vollversion kaufen
-
+
Downloading %1
%1 herunterladen
@@ -870,32 +984,32 @@
A new version of %1 is available!
-
+ Eine neue Version von %1 ist verfügbar!
%1 %2 is now available. You have %3.
-
+ %1 %2 ist jetzt verfügbar. Sie haben %3.
Would you like to download it now?
-
+ Möchten Sie sie jetzt herunterladen?
Skip This Version
-
+ Diese Version überspringen
Remind Me Later
-
+ Später erinnern
Install Update
-
+ Aktualisierung installieren
@@ -903,60 +1017,60 @@
Paste
-
+ Einfügen
PlaylistItemDelegate
-
+
%1 views
%1 mal betrachtet
-
+
%1 of %2 (%3) â %4
%1 von %2 (%3) â %4
-
+
Preparing
Bereite vor
-
+
Failed
Fehlgeschlagen
-
+
Completed
Fertiggestellt
-
+
Stopped
- Gestoppt
+ Angehalten
-
+
Stop downloading
-
+ Herunterladen abbrechen
-
+
Show in %1
-
+ In %1 anzeigen
-
+
Open parent folder
- Eltern-Ordner öffnen
+ übergeordneten Ordner öffnen
-
+
Restart downloading
- Herunterladen neustarten
+ Herunterladen neu starten
@@ -969,7 +1083,7 @@
Show %1 More
-
+ Weitere %1 zeigen
@@ -1003,7 +1117,7 @@
View Count
- Anzahl anzeigen
+ Aufrufe
@@ -1013,7 +1127,7 @@
Anytime
- Alle Längen
+ Irgendwann
@@ -1079,7 +1193,7 @@
High Definition
- High Definition
+ Hochauflösend
@@ -1097,7 +1211,7 @@
Done
-
+ Fertig
@@ -1111,69 +1225,69 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Willkommen bei <a href='%1'>%2</a>,
-
+
Get the full version
- Die Vollversion holen
+ Die Vollversion kaufen
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Eingeben
-
+
a keyword
- ein Schlüsselwort
+ ein Suchbegriff
-
+
a channel
ein Kanal
-
+
to start watching videos.
um die Wiedergabe zu starten.
-
+
Watch
Anschauen
-
+
Recent keywords
- Aktuelle Schlüsselwörter
+ Letzte Suchbegriffe
-
+
Recent channels
- Aktuelle Kanäle
+ Letzte Kanäle
SidebarHeader
-
-
+
+
&Back
-
+ &Zurück
Forward to %1
-
+ Weiter zu %1
Back to %1
-
+ Zurück zu %1
@@ -1194,38 +1308,38 @@
Most Popular
-
-
-
-
- Featured
-
+ Beliebteste
Most Shared
-
+ Am meisten geteilt
Most Discussed
-
+ Am meisten diskutiert
Top Rated
-
+ Am besten bewertet
+
+
+
+ All Time Popular
+ Beliebteste
Video
-
+
Cannot get video stream for %1
- Videostream für %1 konnte nicht öffnen werden
+ Videostream für %1 konnte nicht geöffnet werden
-
+
Network error: %1 for %2
Netzwerk-Fehler: %1 für %2
@@ -1235,242 +1349,242 @@
Algeria
-
+ Algerien
Argentina
-
+ Argentinien
Australia
-
+ Australien
Belgium
-
+ Belgien
Brazil
-
+ Brasilien
Canada
-
+ Kanada
Chile
-
+ Chile
Colombia
-
+ Kolumbien
Czech Republic
-
+ Tschechische Republik
Egypt
-
+ Ãgypten
France
-
+ Frankreich
Germany
-
+ Deutschland
Ghana
-
+ Ghana
Greece
-
+ Griechenland
Hong Kong
-
+ Hong Kong
Hungary
-
+ Ungarn
India
-
+ Indien
Indonesia
-
+ Indonesien
Ireland
-
+ Irland
Israel
-
+ Israel
Italy
-
+ Italien
Japan
-
+ Japan
Jordan
-
+ Jordanien
Kenya
-
+ Kenia
Malaysia
-
+ Malaysia
Mexico
-
+ Mexiko
Morocco
-
+ Marokko
Netherlands
-
+ Niederlande
New Zealand
-
+ Neuseeland
Nigeria
-
+ Nigeria
Peru
-
+ Peru
Philippines
-
+ Philippinen
Poland
-
+ Polen
Russia
-
+ Russland
Saudi Arabia
-
+ Saudi-Arabien
Singapore
-
+ Singapur
South Africa
-
+ Südafrika
South Korea
-
+ Südkorea
Spain
-
+ Spanien
Sweden
-
+ Schweden
Taiwan
-
+ Taiwan
Tunisia
-
+ Tunesien
Turkey
-
+ Türkei
Uganda
-
+ Uganda
United Arab Emirates
-
+ Vereinigte Arabische Emirate
United Kingdom
-
+ Vereinigtes Königreich
Yemen
-
+ Jemen
Worldwide
-
+ Weltweit
\ No newline at end of file
diff --git a/locale/el.ts b/locale/el.ts
index 5c730f8..c62e9e8 100644
--- a/locale/el.ts
+++ b/locale/el.ts
@@ -106,7 +106,7 @@
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
+ Î ÏλήÏÎ·Ï ÎκδοÏη ÏÎ±Ï ÎµÏιÏÏÎÏει Ïην λήÏη βίνÏεο με διάÏκεια μεγαλÏÏεÏη αÏÏ %1 λεÏÏά και Ïην αναÏαÏαγÏγή ÏÏν βίνÏεο ÏÏÏÎ¯Ï Î´Î¹Î±ÎºÎ¿ÏÎÏ.
@@ -134,6 +134,95 @@
ÎγοÏά Î¬Î´ÎµÎ¹Î±Ï ÏÏήÏηÏ
+
+ ChannelAggregator
+
+
+ By %1
+ ÎÏÏ %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Îλα Ïα βίνÏεο
+
+
+
+ Unwatched Videos
+ ΣÏεÏικά βίνÏεο
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ ΣημείÏÏη ÏλÏν ÏÏ ÏαÏακολοÏθενÏα
+
+
+
+ Show Updated
+ ÎμÏάνιÏη ενημÎÏÏÏεÏν
+
+
+
+ Name
+ Ïνομα
+
+
+
+ Last Updated
+ ΤελεÏ
Ïαία ÎνημÎÏÏÏη
+
+
+
+ Last Added
+ ΤελεÏ
Ïαία ÏÏοÏÏÎθηκε
+
+
+
+ Last Watched
+ ÏελεÏ
Ïαίο Î ÏοβληθÎνÏα
+
+
+
+ Most Watched
+ Πιο δημοÏιλή
+
+
+
+ Sort by
+ ΤαξινÏμηÏη καÏά ...
+
+
+
+ All Videos
+ Îλα Ïα βίνÏεο
+
+
+
+ Unwatched Videos
+ ΣÏεÏικά βίνÏεο
+
+
+
+ There are no updated subscriptions at this time.
+ Îεν Ï
ÏάÏÏοÏ
ν ÏÏ
νδÏομÎÏ ÎµÎ½Î·Î¼ÎÏÏÏÎ·Ï Î±Ï
Ïή Ïη ÏÏιγμή.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Îεν ÎÏεÏε εγγÏαÏÎÏ. ΧÏηÏιμοÏοιήÏÏε Ïο αÏÏÎÏι για να εγγÏαÏείÏε ÏÏ
νδÏομηÏÎ®Ï Ïε κανάλια.
+
+
ClearButton
@@ -339,24 +428,34 @@
HomeView
-
+
Search
ÎναζήÏηÏη
-
+
Find videos and channels by keyword
-
+ ÎÏ
ÏεÏη βίνÏεο και κανάλιÏν μεÏÏ Î»ÎξειÏ-κλειδία
-
+
Browse
-
+ ΠεÏιηγηÏη
-
+
Browse videos by category
-
+ ΠεÏιηγηÏη βινÏεο ανα καÏηγοÏια
+
+
+
+ Subscriptions
+ ΣÏ
νδÏομÎÏ
+
+
+
+ Channel subscriptions
+ ΣÏ
νδÏομÎÏ ÎºÎ±Î½Î±Î»Î¹Î¿Ï
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
ΣÏάλμα
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&ÎιακοÏή
-
+
Stop playback and go back to the search view
ÎιακοÏή αναÏαÏαγÏÎ³Î®Ï ÎºÎ±Î¹ εÏιÏÏÏοÏή ÏÏην ÏÏοβολή αναζήÏηÏηÏ
-
+
S&kip
&ΠαÏάλειÏη
-
+
Skip to the next video
ÎεÏάβαÏη ÏÏο εÏÏμενο βίνÏεο
-
-
+
+
&Pause
&ΠαÏÏη
-
-
+
+
Pause playback
ΠαÏÏη αναÏαÏαγÏγήÏ
-
+
&Full Screen
&ΠλήÏÎ·Ï Î¿Î¸Ïνη
-
+
Go full screen
Î Ïοβολή Ïε ÏλήÏη οθÏνη
-
+
Hide the playlist and the toolbar
ÎÏÏκÏÏ
Ïη ÏÎ·Ï Î»Î¯ÏÏÎ±Ï Î±Î½Î±ÏαÏαγÏÎ³Î®Ï ÎºÎ±Î¹ ÏÎ·Ï ÎµÏγαλειοθήκηÏ
-
+
Go to the YouTube video page and pause playback
ÎεÏάβαÏη ÏÏη Ïελίδα βίνÏεο ÏοÏ
YouTube και ÏαÏÏη αναÏαÏαγÏγήÏ
-
+
Copy the current video YouTube link to the clipboard
ÎνÏιγÏαÏή ÏοÏ
δεÏÎ¼Î¿Ï ÏοÏ
ÏÏÎÏονÏÎ¿Ï YouTube βίνÏεο ÏÏη μνήμη
-
+
Copy the current video stream URL to the clipboard
ÎνÏιγÏαÏή ÏοÏ
URL ÏÎ·Ï ÏÏÎÏοÏ
ÏÎ±Ï ÏÎ¿Î®Ï Î²Î¯Î½Ïεο ÏÏη μνήμη
-
+
Find other video parts hopefully in the right order
ÎÏÏεÏη ÏÏν Ï
ÏÏλοιÏÏν εÏιÏοδείÏν ÏοÏ
βίνÏεο, ελÏίζοÏ
με ÏÏη ÏÏÏÏή ÏειÏά
-
+
&Remove
&ÎÏαίÏεÏη
-
+
Remove the selected videos from the playlist
ÎÏαίÏεÏη εÏιλεγμÎνÏν βίνÏεο αÏο Ïην λίÏÏα αναÏαÏαγÏγήÏ
-
+
Move &Up
ÎεÏακίνηÏη ÏÏÎ¿Ï Ïα &ÏάνÏ
-
+
Move up the selected videos in the playlist
ÎεÏακίνηÏη εÏιλεγμÎνÏν βίνÏεο ÏÏÎ¿Ï Ïα ÏάνÏ
-
+
Move &Down
ÎεÏακίνηÏη ÏÏÎ¿Ï Ïα &κάÏÏ
-
+
Move down the selected videos in the playlist
ÎεÏακίνηÏη εÏιλεγμÎνÏν βίνÏεο ÏÏÎ¿Ï Ïα κάÏÏ
-
+
Clear the search history. Cannot be undone.
ÎαθαÏιÏμÏÏ ÏοÏ
ιÏÏοÏÎ¹ÎºÎ¿Ï Î±Î½Î±Î¶Î®ÏηÏηÏ. Îεν μÏοÏεί να γίνει εÏαναÏοÏά.
-
+
&Quit
Î&ξοδοÏ
-
+
Bye
Îεια
-
+
&Website
&ÎÏÏοÏÏÏοÏ
-
+
%1 on the Web
Το %1 ÏÏο διαδίκÏÏ
ο
-
+
Please support the continued development of %1
ΠαÏακαλοÏμε Ï
ÏοÏÏηÏίξÏε Ïην ÏÏ
νεÏÏμενη ανάÏÏÏ
ξη ÏοÏ
%1
-
+
&About
&ΣÏεÏικά
-
+
Info about %1
ΠληÏοÏοÏÎ¯ÎµÏ Î³Î¹Î± %1
-
+
Search
ÎναζήÏηÏη
-
+
Mute volume
ΣίγαÏη
-
-
+
+
&Downloads
&ÎήÏειÏ
-
+
Show details about video downloads
ÎμÏάνιÏη λεÏÏομεÏειÏν για ÏÎ¹Ï Î»Î®ÏÎµÎ¹Ï Î²Î¯Î½Ïεο
-
+
&Download
&ÎήÏη
-
+
Download the current video
ÎήÏη ÏοÏ
ÏÏÎÏονÏÎ¿Ï Î²Î¯Î½Ïεο
-
+
+ &Subscribe to Channel
+ ÎγγÏαÏή ÏÏο κανάλι
+
+
+
Share the current video using %1
Îοινή ÏÏήÏη ÏοÏ
ÏÏÎÏονÏÎ¿Ï Î²Î¯Î½Ïεο με Ïο %1
-
+
&Email
&Îλ. αλληλογÏαÏία
-
+
Email
Îλ. αλληλογÏαÏία
-
+
&Close
&ÎλείÏιμο
-
+
&Float on Top
&ÎιαÏήÏηÏη ÏÏην κοÏÏ
Ïή
-
+
&Stop After This Video
&ÎιακοÏή μεÏά αÏÏ Î±Ï
ÏÏ Ïο βίνÏεο
-
+
&Report an Issue...
&ÎναÏÎÏεÏε κάÏοιο ÏÏάλμα...
-
+
&Refine Search...
&ΣÏνθεÏη αναζήÏηÏη...
-
+
More...
-
+ ΠεÏιÏÏοÏεÏα...
-
+
&Related Videos
-
+ ΣÏεÏικα βινÏεο
-
+
Watch videos related to the current one
-
+ ΠαÏακολοÏ
θήÏÏε βίνÏεο ÏοÏ
ÏÏεÏίζονÏαι με Ïο ÏÏÎÏον
-
+
&Application
&ÎÏαÏμογή
-
+
Buy %1...
ÎγοÏάÏÏε Ïο %1...
-
+
&Playback
&ÎναÏαÏαγÏγή
-
+
&Playlist
Î&ίÏÏα αναÏαÏαγÏγήÏ
-
+
&Video
Îίν&Ïεο
-
+
&View
&Î Ïοβολή
-
+
&Share
&Îοινή ÏÏήÏη
-
+
&Help
&Îοήθεια
-
+
Press %1 to raise the volume, %2 to lower it
ΠαÏήÏÏε %1 για να αÏ
ξήÏεÏε Ïην ÎνÏαÏη, %2 για να Ïην ÏαμηλÏÏεÏε
-
-
+
+
Opening %1
Îνοιγμα %1
-
+
Do you want to exit %1 with a download in progress?
ÎÎλεÏε να κλείÏεÏε Ïο %1 ÎµÎ½Ï Î²ÏίÏκεÏαι μια λήÏη Ïε εξÎλιξη;
-
+
If you close %1 now, this download will be cancelled.
Îν κλείÏεÏε Ïο %1 ÏÏÏα, η λήÏη θα ακÏ
ÏÏθεί.
-
+
Close and cancel download
ÎλείÏιμο και ακÏÏÏÏη λήÏηÏ
-
+
Wait for download to finish
Îναμονή ολοκλήÏÏÏÎ·Ï Î»Î®ÏηÏ
-
+
Leave &Full Screen
ÎÎ¾Î¿Î´Î¿Ï Î±ÏÏ &ÏλήÏη οθÏνη
-
+
%1 version %2 is now available.
Î ÎκδοÏη %2 ÏοÏ
%1 είναι διαθÎÏιμη.
-
+
Remind me later
Î¥ÏενθÏμιÏη αÏγÏÏεÏα
-
+
Update
ÎνημÎÏÏÏη
-
+
Error: %1
ΣÏάλμα: %1
-
+
P&revious
Î &ÏοηγοÏμενο
-
+
Go back to the previous track
ÎÏιÏÏÏοÏή ÏÏο ÏÏοηγοÏμενο κομμάÏι
-
+
&Compact Mode
&ΣÏ
μÏÎ±Î³Î®Ï ÎµÎ¼ÏάνιÏη
-
+
Open the &YouTube Page
Îνοιγμα ÏÏην ιÏÏοÏελίδα ÏοÏ
&YouTube
-
+
Copy the YouTube &Link
ÎνÏιγÏαÏή ÏοÏ
&δεÏÎ¼Î¿Ï YouTube
-
+
Copy the Video Stream &URL
ÎνÏιγÏαÏή ÏοÏ
&URL ÏÎ·Ï ÏÎ¿Î®Ï Î²Î¯Î½Ïεο
-
+
Find Video &Parts
ÎναζήÏηÏη ÏÏν &εÏιÏοδείÏν ÏοÏ
βίνÏεο
-
+
&Clear Recent Searches
&ÎαθαÏιÏμÏÏ ÏÏÏÏÏαÏÏν αναζηÏήÏεÏν
-
+
Make a &Donation
ÎάνÏε μια &δÏÏεά
-
+
&Manually Start Playing
ÎκκίνηÏη ÏÎ·Ï Î±Î½Î±ÏαÏαγÏÎ³Î®Ï &ÏειÏοκίνηÏα
-
+
Manually start playing videos
ÎκκίνηÏη αναÏαÏαγÏÎ³Î®Ï ÏÏν βίνÏεο ÏειÏοκίνηÏα
-
+
Choose your content location
-
+ ÎÏιλογή ÏÎ·Ï ÏοÏοθεÏÎ¯Î±Ï ÏοÏ
ÏεÏιεÏομÎνοÏ
ÏαÏ
-
+
&Play
Î&ναÏαÏαγÏγή
-
+
Resume playback
ΣÏ
νÎÏεια αναÏαÏαγÏγήÏ
-
+
Remaining time: %1
Î¥ÏολειÏÏÎ¼ÎµÎ½Î¿Ï ÏÏÏνοÏ: %1
-
+
Volume at %1%
ÎνÏαÏη ÏÏο %1%
-
+
Volume is muted
ΣίγαÏη
-
+
Volume is unmuted
Î ÎνÏαÏη αÏοκαÏαÏÏάθηκε
-
+
Maximum video definition set to %1
H μÎγιÏÏη ανάλÏ
Ïη βίνÏεο ÏÎθηκε Ïε %1
-
+
Your privacy is now safe
ΠιδιÏÏικÏÏηÏα ÏÎ±Ï ÎµÎ¯Î½Î±Î¹ ÏÏÏα αÏÏαλήÏ
-
+
Downloads complete
Îι λήÏÎµÎ¹Ï Î¿Î»Î¿ÎºÎ»Î·ÏÏθηκαν
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
ΤÏÏα μÏοÏείÏε να εÏικολλήÏεÏε Ïο δεÏÎ¼Ï ÏοÏ
YouTube Ïε κάÏοια άλλη εÏαÏμογή
-
+
You can now paste the video stream URL into another application
ΤÏÏα μÏοÏείÏε να εÏικολλήÏεÏε Ïο URL ÏÎ·Ï ÏÎ¿Î®Ï Î²Î¯Î½Ïεο Ïε κάÏοια άλλη εÏαÏμογή
-
+
The link will be valid only for a limited time.
Î ÏÏÎ½Î´ÎµÎ¼Î¿Ï Î¸Î± είναι ÎγκÏ
ÏÎ¿Ï Î¼Ïνο για ÏεÏιοÏιÏμÎνο ÏÏÎ¿Î½Î¹ÎºÏ Î´Î¹Î¬ÏÏημα.
-
+
This is just the demo version of %1.
ÎÏ
Ïή είναι αÏλά μια δοκιμαÏÏική ÎκδοÏη ÏοÏ
%1.
-
+
It allows you to test the application and see if it works for you.
Σαε εÏιÏÏÎÏει να δοκιμάÏεÏε Ïην εÏαÏμογή και να δείÏε αν ÏÎ±Ï ÎºÎ¬Î½ÎµÎ¹.
-
+
Continue
ΣÏ
νÎÏεια
-
+
of
Used in video parts, as in '2 of 3'
αÏÏ
-
+
part
This is for video parts, as in 'Cool video - part 1'
μÎÏοÏ
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
εÏιÏÏδειο
-
+
Sent from %1
ÎÏοÏÏολή αÏÏ %1
-
+
+ Unsubscribe from %1
+ ÎιαγÏαÏή αÏÏ Ïο %1
+
+
+
+ Subscribe to %1
+ ÎγγÏαÏή ÏÏο %1
+
+
+
Get the full version
ÎÏοκÏήÏÏε Ïην ÏλήÏη ÎκδοÏη
-
+
Downloading %1
ÎήÏη %1
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
Î ÏοβολÎÏ %1
-
+
%1 of %2 (%3) â %4
%1 αÏÏ %2 (%3) â %4
-
+
Preparing
Î ÏοεÏοιμάζεÏαι
-
+
Failed
ÎÏÎÏÏ
Ïε
-
+
Completed
ÎλοκληÏÏθηκε
-
+
Stopped
ÎιακÏÏηκε
-
+
Stop downloading
ÎιακοÏή λήÏηÏ
-
+
Show in %1
ÎμÏάνιÏη Ïε %1
-
+
Open parent folder
Îνοιγμα Î³Î¿Î½Î¹ÎºÎ¿Ï ÏακÎλοÏ
-
+
Restart downloading
ÎÏανεκκίνηÏη λήÏηÏ
@@ -1097,7 +1211,7 @@
Done
-
+ Îγινε
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
ÎαλÏÏοÏίÏαÏε ÏÏο <a href='%1'>%2</a>,
-
+
Get the full version
ÎÏοκÏήÏÏε Ïην ÏλήÏη ÎκδοÏη
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
ΠληκÏÏολογήÏÏε
-
+
a keyword
μια λÎξη-κλειδί
-
+
a channel
Îνα κανάλι
-
+
to start watching videos.
για να αÏÏίÏεÏε να βλÎÏεÏε βίνÏεο.
-
+
Watch
ÎείÏε
-
+
Recent keywords
Î ÏÏÏÏαÏÎµÏ Î»ÎξειÏ-κλειδιά
-
+
Recent channels
Î ÏÏÏÏαÏα κανάλια
@@ -1160,20 +1274,20 @@
SidebarHeader
-
-
+
+
&Back
&ΠίÏÏ
Forward to %1
-
+ Î ÏοÏθηÏη Ïε %1
Back to %1
-
+ ΠιÏÏ ÏÏο %1
@@ -1194,38 +1308,38 @@
Most Popular
-
-
-
-
- Featured
-
+ Τα Ïιο δημοÏιλή
Most Shared
-
+ Πιο ÏÏÏÏÏαÏα
Most Discussed
-
+ Πιο ÏÏ
ζÏ
Ïημενα
Top Rated
-
+ ÎαλÏ
ÏεÏα βαθμολογημενα
+
+
+
+ All Time Popular
+ Σε Ïλα Ïα ÏÏονικά δημοÏιλή
Video
-
+
Cannot get video stream for %1
ÎδÏ
ναμία λήÏÎ·Ï ÏÎ·Ï ÏÎ¿Î®Ï Î²Î¯Î½Ïεο για %1
-
+
Network error: %1 for %2
ΣÏάλμα δικÏÏοÏ
: %1 για %2
@@ -1235,242 +1349,242 @@
Algeria
-
+ ÎλγεÏια
Argentina
-
+ ÎÏγενÏινη
Australia
-
+ ÎÏ
ÏÏÏαλια
Belgium
-
+ Îελγιο
Brazil
-
+ ÎÏαζιλια
Canada
-
+ ÎαναδαÏ
Chile
-
+ Χιλη
Colombia
-
+ Îολομβια
Czech Republic
-
+ ΤÏεÏια
Egypt
-
+ ÎιγÏ
ÏÏοÏ
France
-
+ Îαλλια
Germany
-
+ ÎεÏμανια
Ghana
-
+ Îκανα
Greece
-
+ Îλλαδα
Hong Kong
-
+ Χονγκ Îονγκ
Hungary
-
+ ÎÏ
γγαÏια
India
-
+ Îνδια
Indonesia
-
+ ÎνδονηÏια
Ireland
-
+ ÎÏλανδια
Israel
-
+ ÎÏÏαηλ
Italy
-
+ ÎÏαλια
Japan
-
+ ÎαÏÏνια
Jordan
-
+ ÎοÏδανια
Kenya
-
+ Îενια
Malaysia
-
+ ÎαλαιÏια
Mexico
-
+ Îεξικο
Morocco
-
+ ÎαÏοκκο
Netherlands
-
+ Îλλανδια
New Zealand
-
+ Îεα Îηλανδια
Nigeria
-
+ ÎιγηÏια
Peru
-
+ ΠεÏοÏ
Philippines
-
+ ΦιλλιÏινεÏ
Poland
-
+ ΠολÏνια
Russia
-
+ ΡÏÏια
Saudi Arabia
-
+ ΣαοÏ
δικη ÎÏαβια
Singapore
-
+ ΣινγκαÏοÏ
Ïη
South Africa
-
+ ÎοÏια ÎÏÏικη
South Korea
-
+ ÎοÏια ÎοÏεα
Spain
-
+ ÎÏÏανια
Sweden
-
+ ΣοÏ
ηδια
Taiwan
-
+ Ταιβαν
Tunisia
-
+ ΤÏ
νιÏια
Turkey
-
+ ΤοÏ
Ïκια
Uganda
-
+ ÎÏ
γκανÏα
United Arab Emirates
-
+ ÎνÏμενα ÎÏαβικα ÎμιÏαÏα
United Kingdom
-
+ ÎνÏμενο ÎαÏιλειο
Yemen
-
+ Îεμενη
Worldwide
-
+ ΠαγκοÏμιÏÏ
\ No newline at end of file
diff --git a/locale/es.ts b/locale/es.ts
index 8ca6823..3c00179 100644
--- a/locale/es.ts
+++ b/locale/es.ts
@@ -15,7 +15,7 @@
Licensed to: %1
- Licencia para: %1
+ Con licencia para: %1
@@ -134,6 +134,95 @@
Comprar licencia
+
+ ChannelAggregator
+
+
+ By %1
+ Por %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Todos los vÃdeos
+
+
+
+ Unwatched Videos
+ VÃdeos sin ver
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Marcar todos como vistos
+
+
+
+ Show Updated
+ Mostrar actualizados
+
+
+
+ Name
+ Nombre
+
+
+
+ Last Updated
+ Actualizado por última vez
+
+
+
+ Last Added
+ Añadido por última vez
+
+
+
+ Last Watched
+ Visto por última vez
+
+
+
+ Most Watched
+ Más vistos
+
+
+
+ Sort by
+ Ordenar por
+
+
+
+ All Videos
+ Todos los vÃdeos
+
+
+
+ Unwatched Videos
+ VÃdeos sin ver
+
+
+
+ There are no updated subscriptions at this time.
+ No hay suscripciones actualizadas en este momento.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ No se ha suscrito a ningún canal. Use el sÃmbolo de la estrella a los canales.
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Buscar
-
+
Find videos and channels by keyword
Encontrar vÃdeos y canales por palabras clave
-
+
Browse
Examinar
-
+
Browse videos by category
Buscar videos por categorÃa
+
+
+ Subscriptions
+ Suscripciones
+
+
+
+ Channel subscriptions
+ Suscripciones a canales
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Error
@@ -375,427 +474,432 @@
MainWindow
-
+
&Stop
&Detener
-
+
Stop playback and go back to the search view
Detener la reproducción y volver a la búsqueda
-
+
S&kip
&Omitir
-
+
Skip to the next video
Omitir vÃdeo y saltar al siguiente
-
-
+
+
&Pause
&Pausar
-
-
+
+
Pause playback
Pausar la reproducción
-
+
&Full Screen
Pantalla &completa
-
+
Go full screen
Ir a pantalla completa
-
+
Hide the playlist and the toolbar
Ocultar la lista de reproducción y la barra de herramientas
-
+
Go to the YouTube video page and pause playback
Ir a la página del vÃdeo en YouTube y pausar la reproducción
-
+
Copy the current video YouTube link to the clipboard
Copiar el enlace a YouTube del vÃdeo actual en el portapapeles
-
+
Copy the current video stream URL to the clipboard
Copiar la URL actual del flujo del vÃdeo al portapapeles
-
+
Find other video parts hopefully in the right order
Encontrar otras partes de vÃdeos, con suerte en el orden correcto
-
+
&Remove
&Eliminar
-
+
Remove the selected videos from the playlist
Quitar los vÃdeos seleccionados de la lista de reproducción
-
+
Move &Up
&Subir
-
+
Move up the selected videos in the playlist
Mover hacia arriba en la lista de reproducción los vÃdeos seleccionados
-
+
Move &Down
&Bajar
-
+
Move down the selected videos in the playlist
Mover hacia abajo en la lista de reproducción los vÃdeos seleccionados
-
+
Clear the search history. Cannot be undone.
Limpiar el historial de búsquedas. No se puede deshacer.
-
+
&Quit
&Salir
-
+
Bye
Hasta luego
-
+
&Website
Sitio &web
-
+
%1 on the Web
%1 en la web
-
+
Please support the continued development of %1
Apoye el desarrollo continuo de %1
-
+
&About
&Acerca de
-
+
Info about %1
Información acerca de %1
-
+
Search
Buscar
-
+
Mute volume
Silenciar
-
-
+
+
&Downloads
&Descargas
-
+
Show details about video downloads
Mostrar detalles sobre las descargas de vÃdeos
-
+
&Download
&Descargar
-
+
Download the current video
Descargar el vÃdeo actual
-
+
+ &Subscribe to Channel
+ &Suscribirse al canal
+
+
+
Share the current video using %1
Compartir el vÃdeo actual usando %1
-
+
&Email
&Correo-e
-
+
Email
Correo-e
-
+
&Close
&Cerrar
-
+
&Float on Top
&Flotar en la parte superior
-
+
&Stop After This Video
&Detener tras este vÃdeo
-
+
&Report an Issue...
&Informar de un problema...
-
+
&Refine Search...
&Refinar la búsqueda...
-
+
More...
Másâ¦
-
+
&Related Videos
VÃdeos &relacionados
-
+
Watch videos related to the current one
Ver videos relacionados con el actual
-
+
&Application
&Aplicación
-
+
Buy %1...
Comprar %1â¦
-
+
&Playback
&Reproducción
-
+
&Playlist
&Lista de reprod.
-
+
&Video
&VÃdeo
-
+
&View
&Ver
-
+
&Share
&Compartir
-
+
&Help
Ay&uda
-
+
Press %1 to raise the volume, %2 to lower it
Pulse %1 para aumentar el volumen o %2 para reducirlo
-
-
+
+
Opening %1
Abriendo %1
-
+
Do you want to exit %1 with a download in progress?
¿Quiere salir de %1 con una descarga en curso?
-
+
If you close %1 now, this download will be cancelled.
Si cierra %1 ahora, esta descarga será cancelada.
-
+
Close and cancel download
Cerrar y cancelar descarga
-
+
Wait for download to finish
Esperando a que finalice la descarga
-
+
Leave &Full Screen
&Salir de pantalla completa
-
+
%1 version %2 is now available.
%1 versión %2 ya está disponible.
-
+
Remind me later
Recordarme después
-
+
Update
Actualizar
-
+
Error: %1
Error: %1
-
+
P&revious
Ante&rior
-
+
Go back to the previous track
Regresar a la pista anterior
-
+
&Compact Mode
Modo &compacto
-
+
Open the &YouTube Page
Abrir la página de &YouTube
-
+
Copy the YouTube &Link
Copiar el en&lace de YouTube
-
+
Copy the Video Stream &URL
- Copiar la &URL de flujo del vÃdeo
+ Copiar el &URL de flujo del vÃdeo
-
+
Find Video &Parts
Encontrar &partes de vÃdeos
-
+
&Clear Recent Searches
&Limpiar búsquedas recientes
-
+
Make a &Donation
Hacer una &donación
-
+
&Manually Start Playing
Comenzar la reproducción &manualmente
-
+
Manually start playing videos
Comenzar la reproducción de vÃdeos manualmente
-
+
Choose your content location
Elija su ubicación para el contenido
-
+
&Play
&Reproducir
-
+
Resume playback
Continuar la reproducción
-
+
Remaining time: %1
Tiempo restante: %1
-
+
Volume at %1%
Volumen al %1%
-
+
Volume is muted
El volumen está silenciado
-
+
Volume is unmuted
El volumen no está silenciado
-
+
Maximum video definition set to %1
Resolución máxima de video establecida en %1
-
+
Your privacy is now safe
Su privacidad ahora está asegurada
-
+
Downloads complete
Descargas completas
@@ -803,65 +907,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Ahora puede pegar el enlace de YouTube en otra aplicación
-
+
You can now paste the video stream URL into another application
Ahora puede pegar la URL del flujo de vÃdeo en otra aplicación
-
+
The link will be valid only for a limited time.
El enlace es válido solo por un tiempo limitado.
-
+
This is just the demo version of %1.
Esto es solo la versión de prueba de %1.
-
+
It allows you to test the application and see if it works for you.
Le permite probar la aplicación y ver si le funciona.
-
+
Continue
Continuar
-
+
of
Used in video parts, as in '2 of 3'
de
-
+
part
This is for video parts, as in 'Cool video - part 1'
parte
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
episodio
-
+
Sent from %1
Enviado desde %1
-
+
+ Unsubscribe from %1
+ Cancelar suscripción a %1
+
+
+
+ Subscribe to %1
+ Suscribirse a %1
+
+
+
Get the full version
Obtener la versión completa
-
+
Downloading %1
Descargando %1
@@ -910,52 +1024,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 reproducciones
-
+
%1 of %2 (%3) â %4
%1 de %2 (%3) â %4
-
+
Preparing
Preparando
-
+
Failed
Falló
-
+
Completed
Completado
-
+
Stopped
Detenido
-
+
Stop downloading
Detener la descarga
-
+
Show in %1
Mostrar en %1
-
+
Open parent folder
Abrir carpeta contenedora
-
+
Restart downloading
Reiniciar la descarga
@@ -1112,48 +1226,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Bienvenido a <a href='%1'>%2</a>,
-
+
Get the full version
Obtener la versión completa
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Escriba
-
+
a keyword
una palabra clave
-
+
a channel
un canal
-
+
to start watching videos.
para empezar a ver vÃdeos.
-
+
Watch
Ver
-
+
Recent keywords
Palabras clave recientes
-
+
Recent channels
Canales recientes
@@ -1161,8 +1275,8 @@
SidebarHeader
-
-
+
+
&Back
&Atrás
@@ -1197,11 +1311,6 @@
Most Popular
Más populares
-
-
- Featured
- Destacados
-
Most Shared
@@ -1217,16 +1326,21 @@
Top Rated
Mejor valorados
+
+
+ All Time Popular
+ Populares siempre
+
Video
-
+
Cannot get video stream for %1
No se puede obtener el flujo de vÃdeo para %1
-
+
Network error: %1 for %2
Error de red: %1 por %2
diff --git a/locale/es_AR.ts b/locale/es_AR.ts
index ad1dae2..55edee0 100644
--- a/locale/es_AR.ts
+++ b/locale/es_AR.ts
@@ -15,22 +15,22 @@
Licensed to: %1
-
+ Licencia para: %1
%1 is Free Software but its development takes precious time.
- %1 es Software Libre pero su desarrollo lleva tiempo.
+ %1 es Software Libre pero su desarrollo lleva precioso tiempo.
Please <a href='%1'>donate</a> to support the continued development of %2.
- Por favor, <a href='%1'>hacé una donación</a> para apoyar el desarrollo de %2.
+ Por favor, <a href='%1'>dóna</a> para apoyar el desarrollo continuo de %2.
You may want to try my other apps as well:
- Talvez querás probar mis otras aplicaciones como:
+ Tal vez querrás probar mis otras aplicaciones como:
@@ -45,7 +45,7 @@
Translate %1 to your native language using %2
- Traducà %1 a tu idioma natal usando %2
+ Traduce %1 a tu idioma natal usando %2
@@ -78,17 +78,17 @@
Enter your License Details
-
+ Introduzca los detalles de la licencia
&Email:
-
+ Correo &electrónico:
&Code:
-
+ &Código:
@@ -106,12 +106,12 @@
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
+ La versión completa te permite descargar vÃdeos más largos que %1 minutos y mirar vÃdeos sin interrupciones.
Without a license, the application will expire in %1 days.
-
+ Sin una licencia, la aplicación caducará en %1 dÃas.
@@ -126,11 +126,100 @@
Enter License
-
+ Introducir licencia
Buy License
+ Comprar licencia
+
+
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+ Sortear por
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
@@ -210,7 +299,7 @@
Get the full version
- Conseguà la versión completa
+ Consigue la versión completa
@@ -253,7 +342,7 @@
Downloading to: %1
- Bajando a: %1
+ Bajando al: %1
@@ -270,7 +359,7 @@
Downloading update...
-
+ Descargando actualizaciónâ¦
@@ -339,23 +428,33 @@
HomeView
-
+
Search
Buscar
-
+
Find videos and channels by keyword
-
+ Encuentra vÃdeos por canales o por palabras clave
-
+
Browse
-
+ Navegar
-
+
Browse videos by category
+ Navega en los vÃdeos por categorÃa
+
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Error
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Detener
-
+
Stop playback and go back to the search view
- Detener y volver a la búsqueda
+ Detener la reproducción y volver a la vista de búsqueda
-
+
S&kip
&Saltar
-
+
Skip to the next video
- Siguiente video
+ Saltar al siguiente video
-
-
+
+
&Pause
&Pausar
-
-
+
+
Pause playback
Pausar
-
+
&Full Screen
&Pantalla completa
-
+
Go full screen
Ir a pantalla completa
-
+
Hide the playlist and the toolbar
Esconder la lista de reproducción y la barra de herramientas
-
+
Go to the YouTube video page and pause playback
Ir al video en YouTube y pausar la reproducción
-
+
Copy the current video YouTube link to the clipboard
- Copiar el enlace de YouTube del video al portapapeles
+ Copiar el enlace de YouTube del video actual al portapapeles
-
+
Copy the current video stream URL to the clipboard
- Copiar la &URL del stream del video al portapapeles
+ Copiar la URL del stream del video al portapapeles
-
+
Find other video parts hopefully in the right order
- Encontrá las otras partes del video con suerte en el orden correcto
+ Encuentra las otras partes del video con suerte en el orden correcto
-
+
&Remove
&Borrar
-
+
Remove the selected videos from the playlist
Borrar los videos seleccionados de la lista
-
+
Move &Up
Mover hacia &arriba
-
+
Move up the selected videos in the playlist
Mover hacia arriba los videos seleccionados
-
+
Move &Down
Mover hacia &abajo
-
+
Move down the selected videos in the playlist
Mover hacia abajo los videos seleccionados
-
+
Clear the search history. Cannot be undone.
Eliminar el historial de búsqueda. No se puede deshacer.
-
+
&Quit
&Salir
-
+
Bye
- Chau
+ Adiós
-
+
&Website
&Sitio web
-
+
%1 on the Web
%1 en la Web
-
+
Please support the continued development of %1
- Apoyar el desarrollo de %1
+ Por favor apoya el desarrollo continuo de %1
-
+
&About
&Acerca de
-
+
Info about %1
Información sobre %1
-
+
Search
Buscar
-
+
Mute volume
Silenciar volumen
-
-
+
+
&Downloads
&Descargas
-
+
Show details about video downloads
Mostrar detalles sobre la descarga de videos
-
+
&Download
&Bajar video
-
+
Download the current video
Bajar el video actual
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
- Compartà el video actual usando %1
+ Compartà el vÃdeo actual usando %1
-
+
&Email
&Correo
-
+
Email
Correo
-
+
&Close
&Cerrar
-
+
&Float on Top
&Siempre Visible
-
+
&Stop After This Video
&Finalizar Después de este Video
-
+
&Report an Issue...
&Reportar un inconveniente
-
+
&Refine Search...
&Refinar Búsqueda
-
+
More...
-
+ Más...
-
+
&Related Videos
-
+ &VÃdeos relacionados
-
+
Watch videos related to the current one
-
+ Mirar vÃdeos relacionados al vÃdeo actual
-
+
&Application
&Programa
-
+
Buy %1...
Comprar %1...
-
+
&Playback
&Reproducción
-
+
&Playlist
&Lista de reproducción
-
+
&Video
&Video
-
+
&View
&Ver
-
+
&Share
&Compartir
-
+
&Help
&Ayuda
-
+
Press %1 to raise the volume, %2 to lower it
- Con %1 subÃs el volumen, con %2 lo bajás
+ Con %1 para subir el volumen, con %2 para bajarlo
-
-
+
+
Opening %1
Abriendo %1
-
+
Do you want to exit %1 with a download in progress?
- Seguro que querés salir de %1 con una descarga en progreso?
+ Seguro que quieres salir de %1 con una descarga en progreso?
-
+
If you close %1 now, this download will be cancelled.
- Si cerrás %1 ahora, la descarga se va a cancelar.
+ Si cierras %1 ahora, la descarga se va a cancelar.
-
+
Close and cancel download
Cerrar y cancelar descarga
-
+
Wait for download to finish
Esperar a que termine la descarga
-
+
Leave &Full Screen
Salir de &Pantalla Completa
-
+
%1 version %2 is now available.
%1 versión %2 está ahora disponible
-
+
Remind me later
Recordármelo después
-
+
Update
Actualizar
-
+
Error: %1
Error: %1
-
+
P&revious
- A6nterior
+ Anterior
-
+
Go back to the previous track
Volver a la pista previa
-
+
&Compact Mode
&Modo Compacto
-
+
Open the &YouTube Page
Abrir la página de &YouTube
-
+
Copy the YouTube &Link
Copiar el enlace de &YouTube
-
+
Copy the Video Stream &URL
Copiar Video &URL
-
+
Find Video &Parts
Encontrar Video &Partes
-
+
&Clear Recent Searches
&Borrar las búsquedas recientes
-
+
Make a &Donation
Hacer una &donación
-
+
&Manually Start Playing
&Iniciar Reproducción Manualmente
-
+
Manually start playing videos
Empezar a reproducir videos manualmente
-
+
Choose your content location
-
+ Selecciona la localidad de tu contenido
-
+
&Play
&Reproducir
-
+
Resume playback
Continuar reproducción
-
+
Remaining time: %1
Tiempo restante: %1
-
+
Volume at %1%
Volumen al %1%
-
+
Volume is muted
Volumen silenciado
-
+
Volume is unmuted
Volumen activo
-
+
Maximum video definition set to %1
- Definición máxima de video seteada en %1
+ Definición máxima de video ajustada en %1
-
+
Your privacy is now safe
Tu privacidad ahora está segura
-
+
Downloads complete
Descarga completa
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
- Ahora podés pegar el enlace de YouTube en otra aplicación
+ Ahora puedes pegar el enlace de YouTube en otra aplicación
-
+
You can now paste the video stream URL into another application
Ahora podés pegar la URL del stream en otra aplicación
-
+
The link will be valid only for a limited time.
- El enalce va a ser válido sólo por un tiempo limitado.
+ El enlace va a ser válido sólo por un tiempo limitado.
-
+
This is just the demo version of %1.
Esta es sólo la versión de demostración de %1.
-
+
It allows you to test the application and see if it works for you.
Te permite probar la aplicación y ver si te funciona.
-
+
Continue
Continuar
-
+
of
Used in video parts, as in '2 of 3'
de
-
+
part
This is for video parts, as in 'Cool video - part 1'
parte
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
episodio
-
+
Sent from %1
Enviado desde %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
Conseguir la versión completa
-
+
Downloading %1
Descargando %1
@@ -870,32 +984,32 @@
A new version of %1 is available!
-
+ Está disponible una nueva versión de %1.
%1 %2 is now available. You have %3.
-
+ %1 %2 está disponible ahora. Ud. tiene %3.
Would you like to download it now?
-
+ ¿Quiere descargarla ahora?
Skip This Version
-
+ Omitir esta versión
Remind Me Later
-
+ Recordarme después
Install Update
-
+ Instalar actualización
@@ -903,60 +1017,60 @@
Paste
-
+ Pegar
PlaylistItemDelegate
-
+
%1 views
%1 visitas
-
+
%1 of %2 (%3) â %4
-
+ %1 of %2 (%3) â %4
-
+
Preparing
-
+ Preparando
-
+
Failed
-
+ Falló
-
+
Completed
-
+ Completado
-
+
Stopped
-
+ Detenido
-
+
Stop downloading
-
+ Detener descarga
-
+
Show in %1
-
+ Mostrar en %1
-
+
Open parent folder
-
+ Abrir carpeta relacionada
-
+
Restart downloading
-
+ Reiniciar descarga
@@ -979,7 +1093,7 @@
No more videos
-
+ No hay más vÃdeos
@@ -1097,7 +1211,7 @@
Done
-
+ Hecho
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Bienvenido a <a href='%1'>%2</a>,
-
+
Get the full version
Conseguir la versión completa
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Escribir
-
+
a keyword
una palabra clave
-
+
a channel
un canal
-
+
to start watching videos.
para empezar a ver videos.
-
+
Watch
Ver
-
+
Recent keywords
Búsquedas recientes
-
+
Recent channels
Canales recientes
@@ -1160,20 +1274,20 @@
SidebarHeader
-
-
+
+
&Back
&Atrás
Forward to %1
-
+ Avanzar a %1
Back to %1
-
+ Retroceder a %1
@@ -1194,38 +1308,38 @@
Most Popular
-
-
-
-
- Featured
-
+ Más populares
Most Shared
-
+ Más compartidos
Most Discussed
-
+ Más discutidos
Top Rated
+ Mejor calificados
+
+
+
+ All Time Popular
Video
-
+
Cannot get video stream for %1
No puedo obtener el stream de video de %1
-
+
Network error: %1 for %2
Error de conexión: %1 para %2
@@ -1235,242 +1349,242 @@
Algeria
-
+ Algeria
Argentina
-
+ Argentina
Australia
-
+ Australia
Belgium
-
+ Bélgica
Brazil
-
+ Brasil
Canada
-
+ Canada
Chile
-
+ Chile
Colombia
-
+ Colombia
Czech Republic
-
+ República Checa
Egypt
-
+ Egipto
France
-
+ Francia
Germany
-
+ Alemania
Ghana
-
+ Ghana
Greece
-
+ Grecia
Hong Kong
-
+ Hong Kong
Hungary
-
+ HungrÃa
India
-
+ India
Indonesia
-
+ Indonesia
Ireland
-
+ Irlanda
Israel
-
+ Israel
Italy
-
+ Italia
Japan
-
+ Japón
Jordan
-
+ Jordan
Kenya
-
+ Kenya
Malaysia
-
+ Malasia
Mexico
-
+ México
Morocco
-
+ Marruecos
Netherlands
-
+ PaÃses Bajos
New Zealand
-
+ Nueva Zelanda
Nigeria
-
+ Nigeria
Peru
-
+ Perú
Philippines
-
+ Filipinas
Poland
-
+ Polonia
Russia
-
+ Rusia
Saudi Arabia
-
+ Arabia Saudita
Singapore
-
+ Singapur
South Africa
-
+ Sud Africa
South Korea
-
+ Sud Corea
Spain
-
+ España
Sweden
-
+ Suecia
Taiwan
-
+ Taiwan
Tunisia
-
+ Túnez
Turkey
-
+ TurquÃa
Uganda
-
+ Uganda
United Arab Emirates
-
+ Emiratos Arabes Unidos
United Kingdom
-
+ Reino Unido
Yemen
-
+ Yemen
Worldwide
-
+ Todo el mundo
\ No newline at end of file
diff --git a/locale/es_ES.ts b/locale/es_ES.ts
index 9278f7d..9b6e513 100644
--- a/locale/es_ES.ts
+++ b/locale/es_ES.ts
@@ -15,12 +15,12 @@
Licensed to: %1
-
+ Con licencia para %1
%1 is Free Software but its development takes precious time.
- %1 es Software Libre pero su desarrollo lleva mucho tiempo.
+ %1 es un programa de software libre, pero su desarrollo lleva mucho tiempo.
@@ -35,7 +35,7 @@
%1, a YouTube music player
- %1, reproductor de música de YouTube
+ %1, un reproductor de música de YouTube
@@ -45,7 +45,7 @@
Translate %1 to your native language using %2
- Traduce %1 a tu idioma utilizando %2
+ Traducir %1 a tu idioma utilizando %2
@@ -70,7 +70,7 @@
What you always wanted to know about %1 and never dared to ask
- Lo que siempre quiso saber sobre el %1 y nunca se atrevió a preguntar
+ Lo que siempre quiso saber sobre %1 y nunca se atrevió a preguntar
@@ -78,17 +78,17 @@
Enter your License Details
-
+ Introducir detalles de la licencia
&Email:
-
+ Corr&eo electrónico:
&Code:
-
+ &Código:
@@ -101,22 +101,22 @@
This demo has expired.
- Esta versión de prueba ha caducado.
+ La versión de prueba ha caducado.
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
+ La versión completa le permite descargar vÃdeos superiores a %1 minutos y ver vÃdeos sin interrupciones.
Without a license, the application will expire in %1 days.
-
+ La aplicación caducará en %1 dÃas si no tiene una licencia.
By purchasing the full version, you will also support the hard work I put into creating %1.
- Al comprar la versión completa, también apoya el trabajo empleado en la creación de %1.
+ Al comprar la versión completa, estará apoyando el gran trabajo empleado en la creación de %1.
@@ -126,11 +126,100 @@
Enter License
-
+ Introducir licencia
Buy License
+ Comprar licencia
+
+
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+ Sortear por
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
@@ -167,7 +256,7 @@
KB/sec
- KB/sec
+ KB/seg
@@ -195,12 +284,12 @@
This is just the demo version of %1.
- Esta es sólo la versión demo de %1.
+ Esta es la versión de prueba de %1.
It can only download videos shorter than %1 minutes so you can test the download functionality.
- Sólo se pueden descargar vÃdeos más cortos de %1 minutos, asà puede probar la funcionalidad de descarga.
+ Sólo se pueden descargar vÃdeos inferiores a %1 minutos. Asà podrá probar la funcionalidad de descarga.
@@ -248,7 +337,7 @@
Current downloads will still go in the previous location.
- Las descargan actuales irán a parar a la anterior ubicación.
+ Las descargan actuales se guardarán en la ubicación anterior.
@@ -270,7 +359,7 @@
Downloading update...
-
+ Descargando actualización...
@@ -293,12 +382,12 @@
Stop
- Parar
+ Detener
Stop playing after current track
- Parar reproducción después esta pista
+ Detener reproducción después esta pista
@@ -328,46 +417,56 @@
Seek forward
- Buscar adelante
+ Buscar hacia adelante
Seek backward
- Buscar atrás
+ Buscar hacia atrás
HomeView
-
+
Search
Buscar
-
+
Find videos and channels by keyword
-
+ Buscar vÃdeos y canales mediante palabra clave
-
+
Browse
-
+ Examinar
-
+
Browse videos by category
+ Examinar vÃdeos por categorÃa
+
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
Make yourself comfortable
-
+ Siéntete como en casa
LoadingWidget
-
+
Error
Error
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
- &Parar
+ &Detener
-
+
Stop playback and go back to the search view
- Parar reproducción y volver a la vista de búsqueda
+ Detener reproducción y volver a la vista de búsqueda
-
+
S&kip
Sa<ar
-
+
Skip to the next video
Saltar al siguiente vÃdeo
-
-
+
+
&Pause
&Pausar
-
-
+
+
Pause playback
Pausar reproducción
-
+
&Full Screen
&Pantalla completa
-
+
Go full screen
Ir a pantalla completa
-
+
Hide the playlist and the toolbar
Ocultar la lista de reproducción y la barra de herramientas
-
+
Go to the YouTube video page and pause playback
Ir a la página del vÃdeo en YouTube y pausar la reproducción
-
+
Copy the current video YouTube link to the clipboard
Copiar al portapapeles el enlace del vÃdeo de YouTube actual
-
+
Copy the current video stream URL to the clipboard
- Copiar al portapapeles la &URL del stream de vÃdeo actual
+ Copiar al portapapeles la &URL del flujo de vÃdeo actual
-
+
Find other video parts hopefully in the right order
- Encontrar otras partes de video, con suerte, en el orden correcto
+ Buscar otras partes del vÃdeo, con suerte, en el orden correcto
-
+
&Remove
Elimina&r
-
+
Remove the selected videos from the playlist
Eliminar los vÃdeos seleccionados de la lista de reproducción
-
+
Move &Up
S&ubir
-
+
Move up the selected videos in the playlist
Subir en la lista de reproducción los vÃdeos seleccionados
-
+
Move &Down
&Bajar
-
+
Move down the selected videos in the playlist
Bajar en la lista de reproducción los vÃdeos seleccionados
-
+
Clear the search history. Cannot be undone.
Limpiar el historial de búsquedas. Esta acción no puede deshacerse.
-
+
&Quit
&Salir
-
+
Bye
Adiós
-
+
&Website
Sitio &Web
-
+
%1 on the Web
%1 en la Web
-
+
Please support the continued development of %1
- Por favor, apoye el continuo desarrollo de %1
+ Apoye el desarrollo continuo de %1
-
+
&About
- &Acerca de
+ &Acerca de...
-
+
Info about %1
- Información sobre %1
+ Información acerca de %1
-
+
Search
- Búsqueda
+ Buscar
-
+
Mute volume
Silenciar volumen
-
-
+
+
&Downloads
&Descargas
-
+
Show details about video downloads
- Muestra detalles sobre las descargas de vÃdeos
+ Mostrar detalles sobre las descargas de vÃdeos
-
+
&Download
&Descargar
-
+
Download the current video
- Descarga el vÃdeo actual
+ Descargar el vÃdeo actual
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
Compartir el vÃdeo actual usando %1
-
+
&Email
&Correo electrónico
-
+
Email
Correo electrónico
-
+
&Close
&Cerrar
-
+
&Float on Top
&Siempre Visible
-
+
&Stop After This Video
- &Pausar Después De Este Video
+ &Detener después de este vÃdeo
-
+
&Report an Issue...
- &Reporte un inconveniente...
+ &Informar de un problema...
-
+
&Refine Search...
- &Refinar Búsqueda...
+ &Refinar búsqueda...
-
+
More...
-
+ Más...
-
+
&Related Videos
-
+ VÃdeos &relacionados
-
+
Watch videos related to the current one
-
+ Ver vÃdeos relacionados con el actual
-
+
&Application
&Aplicación
-
+
Buy %1...
Comprar %1...
-
+
&Playback
&Reproducción
-
+
&Playlist
Lista de Re&producción
-
+
&Video
&VÃdeo
-
+
&View
&Ver
-
+
&Share
Com&partir
-
+
&Help
&Ayuda
-
+
Press %1 to raise the volume, %2 to lower it
- Presiona %1 para subir el volumen, %2 para bajarlo
+ Pulse %1 para subir el volumen y %2 para bajarlo
-
-
+
+
Opening %1
Abriendo %1
-
+
Do you want to exit %1 with a download in progress?
¿Deseas salir de %1 con una descarga activa?
-
+
If you close %1 now, this download will be cancelled.
Si cierras %1, esta descarga se cancelará.
-
+
Close and cancel download
Cerrar y cancelar la descarga
-
+
Wait for download to finish
Esperar la finalización de la descarga
-
+
Leave &Full Screen
Salir de pan&talla completa
-
+
%1 version %2 is now available.
- %1 versión %2 ya está disponible.
+ La versión %2 de %1 ya está disponible.
-
+
Remind me later
Recordarme después
-
+
Update
Actualizar
-
+
Error: %1
Error: %1
-
+
P&revious
- P&revio
+ Ante&rior
-
+
Go back to the previous track
Vuelve a la vista anterior
-
+
&Compact Mode
- &Modo Compacto
+ Modo &compacto
-
+
Open the &YouTube Page
Abrir la página de &YouTube
-
+
Copy the YouTube &Link
Copiar el &enlace de YouTube
-
+
Copy the Video Stream &URL
- Copiar Video En LÃnea &URL
+ Copiar &URL del flujo de vÃdeo
-
+
Find Video &Parts
- Encontrar Videos &Partes
+ Buscar &partes del vÃdeo
-
+
&Clear Recent Searches
&Limpiar búsquedas recientes
-
+
Make a &Donation
Hacer una &donación
-
+
&Manually Start Playing
- &Iniciar Reproducción Manual
+ &Iniciar reproducción manual
-
+
Manually start playing videos
- Empezar a reproducir videos manualmente
+ Empezar a reproducir vÃdeos manualmente
-
+
Choose your content location
-
+ Elegir la ubicación del contenido
-
+
&Play
Re&producir
-
+
Resume playback
- Reiniciar la reproducción
+ Reanudar la reproducción
-
+
Remaining time: %1
Tiempo restante: %1
-
+
Volume at %1%
Volumen al %1%
-
+
Volume is muted
- El volumen está desactivado
+ El volumen está silenciado
-
+
Volume is unmuted
- El volumen está activado
+ El volumen no está silenciado
-
+
Maximum video definition set to %1
- Definición Máxima de Video es %1
+ La definición máxima de vÃdeo es %1
-
+
Your privacy is now safe
Su privacidad ahora es segura
-
+
Downloads complete
Descargas completadas
@@ -802,67 +906,77 @@
MediaView
-
+
You can now paste the YouTube link into another application
Ahora puedes pegar el enlace de Youtube en otra aplicación
-
+
You can now paste the video stream URL into another application
- Ahora puedes pegar la URL del stream de vÃdeo en otra aplicación
+ Ahora puedes pegar la URL del flujo de vÃdeo en otra aplicación
-
+
The link will be valid only for a limited time.
- EL enlace será válido sólo por un plazo de tiempo limitado.
+ El enlace será válido sólo por un plazo de tiempo limitado.
-
+
This is just the demo version of %1.
- Esta es sólo la versión de demo de %1.
+ Esta es la versión de prueba de %1.
-
+
It allows you to test the application and see if it works for you.
- Le premite probar la aplicación y ver si le funciona.
+ Esta versión le permite probar la aplicación y ver si le sirve.
-
+
Continue
Continuar
-
+
of
Used in video parts, as in '2 of 3'
de
-
+
part
This is for video parts, as in 'Cool video - part 1'
parte
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
- episodio
+ capÃtulo
-
+
Sent from %1
Enviado desde %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
Obtener la versión completa
-
+
Downloading %1
- Descargand %1
+ Descargando %1
@@ -870,32 +984,32 @@
A new version of %1 is available!
-
+ ¡Una nueva versión de %1 ya está disponible!
%1 %2 is now available. You have %3.
-
+ %1 %2 ya está disponible. Tienes la %3.
Would you like to download it now?
-
+ ¿Deseas descargarla ahora?
Skip This Version
-
+ Saltar esta versión
Remind Me Later
-
+ Recordarme después
Install Update
-
+ Instalar actualización
@@ -903,60 +1017,60 @@
Paste
-
+ Pegar
PlaylistItemDelegate
-
+
%1 views
%1 vistas
-
+
%1 of %2 (%3) â %4
-
+ %1 de %2 (%3) â %4
-
+
Preparing
-
+ Preparando
-
+
Failed
-
+ Falló
-
+
Completed
-
+ Completo
-
+
Stopped
-
+ Detenido
-
+
Stop downloading
-
+ Detener descarga
-
+
Show in %1
-
+ Mostrar en %1
-
+
Open parent folder
-
+ Abrir carpeta raÃz
-
+
Restart downloading
-
+ Reiniciar descarga
@@ -969,7 +1083,7 @@
Show %1 More
-
+ Mostrar %1 más
@@ -979,7 +1093,7 @@
No more videos
-
+ No hay más vÃdeos
@@ -987,7 +1101,7 @@
Sort by
- Sortear por
+ Ordenar por
@@ -1008,7 +1122,7 @@
Rating
- Calificación
+ Valoraciones
@@ -1023,12 +1137,12 @@
7 Days
- 7 DÃas
+ 7 dÃas
30 Days
- 30 DÃas
+ 30 dÃas
@@ -1059,7 +1173,7 @@
Less than 4 minutes
- Menor que 4 minutos
+ Inferior a 4 minutos
@@ -1069,7 +1183,7 @@
Longer than 20 minutes
- Mayor que 20 minutos
+ Superior a 20 minutos
@@ -1079,7 +1193,7 @@
High Definition
- Alta Definición
+ Alta definición
@@ -1097,7 +1211,7 @@
Done
-
+ Finalizado
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
- Bienvenido/a a <a href='%1'>%2</a>,
+ Bienvenidos a <a href='%1'>%2</a>,
-
+
Get the full version
Obtener la versión completa
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Introducir
-
+
a keyword
una palabra clave
-
+
a channel
un canal
-
+
to start watching videos.
- empezar a ver vÃdeos
+ para empezar a ver vÃdeos
-
+
Watch
Ver
-
+
Recent keywords
Palabras clave recientes
-
+
Recent channels
Canales recientes
@@ -1160,20 +1274,20 @@
SidebarHeader
-
-
+
+
&Back
&Volver
Forward to %1
-
+ Hacia adelante %1
Back to %1
-
+ Hacia atrás %1
@@ -1181,7 +1295,7 @@
Refine Search
- Refinar Búsqueda
+ Refinar búsqueda
@@ -1194,38 +1308,38 @@
Most Popular
-
-
-
-
- Featured
-
+ Más popular
Most Shared
-
+ Más compartidos
Most Discussed
-
+ Más comentados
Top Rated
+ Mejor valorados
+
+
+
+ All Time Popular
Video
-
+
Cannot get video stream for %1
No se puede obtener el flujo de vÃdeo para %1
-
+
Network error: %1 for %2
Error de red: %1 por %2
@@ -1235,242 +1349,242 @@
Algeria
-
+ Algeria
Argentina
-
+ Argentina
Australia
-
+ Australia
Belgium
-
+ Bélgica
Brazil
-
+ Brasil
Canada
-
+ Canadá
Chile
-
+ Chile
Colombia
-
+ Colombia
Czech Republic
-
+ República Checa
Egypt
-
+ Egipto
France
-
+ Francia
Germany
-
+ Alemania
Ghana
-
+ Ghana
Greece
-
+ Grecia
Hong Kong
-
+ Hong Kong
Hungary
-
+ HungrÃa
India
-
+ India
Indonesia
-
+ Indonesia
Ireland
-
+ Irlanda
Israel
-
+ Israel
Italy
-
+ Italia
Japan
-
+ Japón
Jordan
-
+ Jordania
Kenya
-
+ Kenia
Malaysia
-
+ Malasia
Mexico
-
+ México
Morocco
-
+ Marruecos
Netherlands
-
+ PaÃses Bajos
New Zealand
-
+ Nueva Zelanda
Nigeria
-
+ Nigeria
Peru
-
+ Perú
Philippines
-
+ Filipinas
Poland
-
+ Polonia
Russia
-
+ Rusia
Saudi Arabia
-
+ Arabia SaudÃ
Singapore
-
+ Singapur
South Africa
-
+ Sudáfrica
South Korea
-
+ Corea del Sur
Spain
-
+ España
Sweden
-
+ Suecia
Taiwan
-
+ Taiwán
Tunisia
-
+ Túnez
Turkey
-
+ TurquÃa
Uganda
-
+ Uganda
United Arab Emirates
-
+ Emiratos Ãrabes Unidos
United Kingdom
-
+ Reino Unido
Yemen
-
+ Yemen
Worldwide
-
+ Mundial
\ No newline at end of file
diff --git a/locale/fi.ts b/locale/fi.ts
index 7de34c5..ba46ecb 100644
--- a/locale/fi.ts
+++ b/locale/fi.ts
@@ -15,7 +15,7 @@
Licensed to: %1
-
+ Lisensoitu henkilölle: %1
@@ -78,7 +78,7 @@
Enter your License Details
-
+ Syötä tähän lisenssitietosi
@@ -96,12 +96,12 @@
Please license %1
- Lisensoi %1
+ Lisensioi %1.
This demo has expired.
- Tämä koekäyttöversio on vanhentunut.
+ Tämä demon kokeiluaika on päättynyt.
@@ -111,7 +111,7 @@
Without a license, the application will expire in %1 days.
-
+ Ilman lisenssiä tämä sovellus vanhenee %1 päivässä.
@@ -134,6 +134,95 @@
Osta lisenssi
+
+ ChannelAggregator
+
+
+ By %1
+ Tekijältä %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Kaikki videot
+
+
+
+ Unwatched Videos
+ Katsomattomat videot
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Merkitse kaikki katsotuiksi
+
+
+
+ Show Updated
+ Näytä päivitetyt
+
+
+
+ Name
+ Nimi
+
+
+
+ Last Updated
+ Viimeksi päivitetyt
+
+
+
+ Last Added
+ Viimeksi lisätyt
+
+
+
+ Last Watched
+ Viimeksi katsotut
+
+
+
+ Most Watched
+ Katsotuimmat
+
+
+
+ Sort by
+ Järjestysperuste
+
+
+
+ All Videos
+ Kaikki videot
+
+
+
+ Unwatched Videos
+ Katsomattomat videot
+
+
+
+ There are no updated subscriptions at this time.
+ Päivitettyjä tilauksia ei ole tällä hetkellä.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Sinulla ei ole tilauksia. Käytä tähtisymbolia tilataksesi kanavia.
+
+
ClearButton
@@ -339,24 +428,34 @@
HomeView
-
+
Search
Etsi
-
+
Find videos and channels by keyword
-
+ Etsi videoita ja kanavia avainsanalla
-
+
Browse
-
+ Selaa
-
+
Browse videos by category
-
+ Selaa videoita ryhmien mukaan
+
+
+
+ Subscriptions
+ Tilaukset
+
+
+
+ Channel subscriptions
+ Kanavatilaukset
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Virhe
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Pysäytä
-
+
Stop playback and go back to the search view
Pysäytä toisto ja palaa hakuruutuun
-
+
S&kip
&Hyppää yli
-
+
Skip to the next video
Siirry seuraavaan videoon
-
-
+
+
&Pause
&Keskeytä
-
-
+
+
Pause playback
Keskeytä toisto
-
+
&Full Screen
&Koko näytön tila
-
+
Go full screen
Siirry koko näytön tilaan
-
+
Hide the playlist and the toolbar
Piilota soittolista sekä työkalupalkki
-
+
Go to the YouTube video page and pause playback
Keskeytä toisto ja mene videon YouTube-sivulle
-
+
Copy the current video YouTube link to the clipboard
Kopioi nykyisen videon YouTube-linkki leikepöydälle
-
+
Copy the current video stream URL to the clipboard
Kopioi nykyisen videovirran osoite leikepöydälle
-
+
Find other video parts hopefully in the right order
Löydä videon muut osat toivottavasti oikeassa järjestyksessä
-
+
&Remove
&Poista
-
+
Remove the selected videos from the playlist
Poista valitut videot toistolistalta
-
+
Move &Up
Siirrä &ylös
-
+
Move up the selected videos in the playlist
Siirrä valitut videot ylemmäksi soittolistalla
-
+
Move &Down
Sirrä &alas
-
+
Move down the selected videos in the playlist
Siirrä valitut videot alemmaksi soittolistalla
-
+
Clear the search history. Cannot be undone.
Tyhjennä hakuhistoria. Tätä toimintoa ei voi kumota.
-
+
&Quit
&Lopeta
-
+
Bye
Näkemiin
-
+
&Website
&Nettisivusto
-
+
%1 on the Web
%1 netissä
-
+
Please support the continued development of %1
Tue %1n jatkokehitystä
-
+
&About
&Tietoja
-
+
Info about %1
Tietoja %1sta
-
+
Search
Etsi
-
+
Mute volume
Vaimenna ääni
-
-
+
+
&Downloads
&Lataukset
-
+
Show details about video downloads
Näytä tietoja latauksista
-
+
&Download
&Lataa
-
+
Download the current video
Lataa nykyinen video
-
+
+ &Subscribe to Channel
+ %Tilaa kanava
+
+
+
Share the current video using %1
Jaa nykyinen video palvelulla %1
-
+
&Email
&Sähköposti
-
+
Email
Sähköposti
-
+
&Close
&Sulje
-
+
&Float on Top
&Pysy päällimmäisenä
-
+
&Stop After This Video
Py&säytä toisto tämän videon jälkeen
-
+
&Report an Issue...
&Ilmoita ongelmasta...
-
+
&Refine Search...
&Määritä haku uudelleen...
-
+
More...
-
+ Lisää...
-
+
&Related Videos
-
+ &Aiheeseen liittyvät videot
-
+
Watch videos related to the current one
-
+ Katso nykyiseen videoon liittyvät videot
-
+
&Application
&Sovellus
-
+
Buy %1...
Osta %1...
-
+
&Playback
&Toisto
-
+
&Playlist
S&oittolista
-
+
&Video
&Video
-
+
&View
&Näytä
-
+
&Share
&Jaa
-
+
&Help
&Ohje
-
+
Press %1 to raise the volume, %2 to lower it
Paina näppäinyhdistelmää %1 nostaaksesi tai %2 laskeaksesi äänenvoimakkuutta
-
-
+
+
Opening %1
Avataan kohdetta %1
-
+
Do you want to exit %1 with a download in progress?
Haluatko, että %1 sulkeutuu vaikka lataus on kesken?
-
+
If you close %1 now, this download will be cancelled.
Jos suljet %1n nyt niin tämä lataus keskeytetään.
-
+
Close and cancel download
Sulje ja peru lataus
-
+
Wait for download to finish
Odota latauksen valmistumista
-
+
Leave &Full Screen
Poistu &koko näytön tilasta
-
+
%1 version %2 is now available.
%1 versio %2 on nyt saatavilla.
-
+
Remind me later
Muistuta myöhemmin
-
+
Update
Päivitä
-
+
Error: %1
Virhe: %1
-
+
P&revious
E&dellinen
-
+
Go back to the previous track
Siirry takaisin edelliseen kappaleeseen
-
+
&Compact Mode
Kompakti &tila
-
+
Open the &YouTube Page
Avaa &YouTube-sivu
-
+
Copy the YouTube &Link
Kopioi YouTube-&linkki
-
+
Copy the Video Stream &URL
Kopioi videovirran &URL
-
+
Find Video &Parts
Etsi videon &osat
-
+
&Clear Recent Searches
Ty&hjennä viimeisimmät haut
-
+
Make a &Donation
Tee &lahjoitus
-
+
&Manually Start Playing
Aloita toisto &manuaalisesti
-
+
Manually start playing videos
Aloittaa videoiden toiston manuaalisesti
-
+
Choose your content location
-
+ Valitse sisältösi sijainti
-
+
&Play
&Toista
-
+
Resume playback
Jatka toistoa
-
+
Remaining time: %1
Aikaa jäljellä: %1
-
+
Volume at %1%
Ãänentaso: %1%
-
+
Volume is muted
Ãäni on vaimennettu
-
+
Volume is unmuted
Ãäni ei ole vaimennettu
-
+
Maximum video definition set to %1
Korkein videonlaatu on rajoitettu tarkkuuteen %1
-
+
Your privacy is now safe
Yksityisyytesi on nyt turvattu
-
+
Downloads complete
Lataukset ovat valmistuneet
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Voit nyt liittää YouTube-linkin johonkin toiseen sovellukseen
-
+
You can now paste the video stream URL into another application
Voit nyt liittää videovirran osoitteen (URL) johonkin toiseen sovellukseen
-
+
The link will be valid only for a limited time.
Osoite on käytössä vain rajoitetun ajan.
-
+
This is just the demo version of %1.
Tämä on vain %1n kokeiluversio.
-
+
It allows you to test the application and see if it works for you.
Voit kokeilla ohjelmaa nähdäksesi, toimiiko se.
-
+
Continue
Jatka
-
+
of
Used in video parts, as in '2 of 3'
/
-
+
part
This is for video parts, as in 'Cool video - part 1'
osa
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
jakso
-
+
Sent from %1
Lähetetty palvelusta %1
-
+
+ Unsubscribe from %1
+ Peru kanavan %1 tilaus
+
+
+
+ Subscribe to %1
+ Tilaa kanava %1
+
+
+
Get the full version
Hanki täysi versio
-
+
Downloading %1
Ladataan %1ta/tä
@@ -870,12 +984,12 @@
A new version of %1 is available!
-
+ Uusi versio sovelluksesta %1 on saatavilla!
%1 %2 is now available. You have %3.
-
+ %1 %2 on nyt saatavilla. Sinulla on %3.
@@ -890,7 +1004,7 @@
Remind Me Later
- Muistuta myöhemmin
+ Muistuta minua myöhemmin
@@ -903,58 +1017,58 @@
Paste
-
+ Liitä
PlaylistItemDelegate
-
+
%1 views
Katsottu %1 kertaa
-
+
%1 of %2 (%3) â %4
%1 / %2 (%3) â %4
-
+
Preparing
Valmistellaan
-
+
Failed
Epäonnistui
-
+
Completed
Valmis
-
+
Stopped
Pysäytetty
-
+
Stop downloading
Pysäytä lataus
-
+
Show in %1
Avaa %1ssa/ssä
-
+
Open parent folder
Avaa yläkansio
-
+
Restart downloading
Käynnistä lataus uudelleen
@@ -1097,7 +1211,7 @@
Done
-
+ Valmis
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Tervetuloa <a href='%1'>%2en</a>
-
+
Get the full version
Hanki täysversio
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Syötä
-
+
a keyword
hakusana
-
+
a channel
kanava
-
+
to start watching videos.
aloittaaksesi videoiden katselu.
-
+
Watch
Katso
-
+
Recent keywords
Viimeisimmät hakusanat
-
+
Recent channels
Viimeisimmät kanavat
@@ -1160,20 +1274,20 @@
SidebarHeader
-
-
+
+
&Back
&Takaisin
Forward to %1
-
+ Eteenpäin kohteeseen %1
Back to %1
-
+ Takaisin kohteeseen %1
@@ -1194,38 +1308,38 @@
Most Popular
-
-
-
-
- Featured
-
+ Suosituimmat
Most Shared
-
+ Jaetuimmat
Most Discussed
-
+ Keskustelluimmat
Top Rated
-
+ Arvostetuimmat
+
+
+
+ All Time Popular
+ Kaikkien aikojen suosituimmat
Video
-
+
Cannot get video stream for %1
Videostriimiä ei saada kohteelle %1
-
+
Network error: %1 for %2
Verkkovirhe: "%1" "%2"lle
@@ -1235,242 +1349,242 @@
Algeria
-
+ Algeria
Argentina
-
+ Argentiina
Australia
-
+ Australia
Belgium
-
+ Belgia
Brazil
-
+ Brasilia
Canada
-
+ Kanada
Chile
-
+ Chile
Colombia
-
+ Kolumbia
Czech Republic
-
+ TÅ¡ekin tasavalta
Egypt
-
+ Egypti
France
-
+ Ranska
Germany
-
+ Saksa
Ghana
-
+ Ghana
Greece
-
+ Kreikka
Hong Kong
-
+ Hongkong
Hungary
-
+ Unkari
India
-
+ Intia
Indonesia
-
+ Indonesia
Ireland
-
+ Irlanti
Israel
-
+ Israel
Italy
-
+ Italia
Japan
-
+ Japani
Jordan
-
+ Jordania
Kenya
-
+ Kenia
Malaysia
-
+ Malesia
Mexico
-
+ Meksiko
Morocco
-
+ Marokko
Netherlands
-
+ Alankomaat
New Zealand
-
+ Uusi-Seelanti
Nigeria
-
+ Nigeria
Peru
-
+ Peru
Philippines
-
+ Filippiinit
Poland
-
+ Puola
Russia
-
+ Venäjä
Saudi Arabia
-
+ Saudi-Arabia
Singapore
-
+ Singapore
South Africa
-
+ Etelä-Afrikka
South Korea
-
+ Etelä-Korea
Spain
-
+ Espanja
Sweden
-
+ Ruotsi
Taiwan
-
+ Taiwan
Tunisia
-
+ Tunisia
Turkey
-
+ Turkki
Uganda
-
+ Uganda
United Arab Emirates
-
+ Yhdistyneet arabiemiirikunnat
United Kingdom
-
+ Yhdistynyt kuningaskunta
Yemen
-
+ Jemen
Worldwide
-
+ Maailmanlaajuinen
\ No newline at end of file
diff --git a/locale/fi_FI.ts b/locale/fi_FI.ts
index a5c8bf2..fb66672 100644
--- a/locale/fi_FI.ts
+++ b/locale/fi_FI.ts
@@ -106,7 +106,7 @@
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
+ Täysversio sallii sinun ladata yli %1 minuutin pituisia videoita ja katsoa videoita ilman keskeytyksiä.
@@ -134,6 +134,95 @@
Osta lisenssi
+
+ ChannelAggregator
+
+
+ By %1
+ Tekijältä %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Kaikki videot
+
+
+
+ Unwatched Videos
+ Katsomattomat videot
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Merkitse kaikki katsotuiksi
+
+
+
+ Show Updated
+ Näytä päivitetyt
+
+
+
+ Name
+ Nimi
+
+
+
+ Last Updated
+ Viimeksi päivitetyt
+
+
+
+ Last Added
+ Viimeksi lisätyt
+
+
+
+ Last Watched
+ Viimeksi katsotut
+
+
+
+ Most Watched
+ Katsotuimmat
+
+
+
+ Sort by
+ Järjestysperuste
+
+
+
+ All Videos
+ Kaikki videot
+
+
+
+ Unwatched Videos
+ Katsomattomat videot
+
+
+
+ There are no updated subscriptions at this time.
+ Päivitettyjä tilauksia ei ole tällä hetkellä.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Sinulla ei ole tilauksia. Käytä tähtisymbolia tilataksesi kanavia.
+
+
ClearButton
@@ -339,24 +428,34 @@
HomeView
-
+
Search
Etsi
-
+
Find videos and channels by keyword
-
+ Etsi videoita ja kanavia avainsanalla
-
+
Browse
-
+ Selaa
-
+
Browse videos by category
-
+ Selaa videoita ryhmien mukaan
+
+
+
+ Subscriptions
+ Tilaukset
+
+
+
+ Channel subscriptions
+ Kanavatilaukset
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Virhe
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Pysäytä
-
+
Stop playback and go back to the search view
Pysäytä toisto ja palaa hakuruutuun
-
+
S&kip
&Hyppää yli
-
+
Skip to the next video
Siirry seuraavaan videoon
-
-
+
+
&Pause
&Keskeytä
-
-
+
+
Pause playback
Keskeytä toisto
-
+
&Full Screen
&Koko näytön tila
-
+
Go full screen
Siirry koko näytön tilaan
-
+
Hide the playlist and the toolbar
Piilota soittolista sekä työkalupalkki
-
+
Go to the YouTube video page and pause playback
Keskeytä toisto ja mene videon YouTube-sivulle
-
+
Copy the current video YouTube link to the clipboard
Kopioi nykyisen videon YouTube-linkki leikepöydälle
-
+
Copy the current video stream URL to the clipboard
Kopioi nykyisen videovirran osoite leikepöydälle
-
+
Find other video parts hopefully in the right order
Löydä videon muut osat toivottavasti oikeassa järjestyksessä
-
+
&Remove
&Poista
-
+
Remove the selected videos from the playlist
Poista valitut videot toistolistalta
-
+
Move &Up
Siirrä &ylös
-
+
Move up the selected videos in the playlist
Siirrä valitut videot ylemmäksi soittolistalla
-
+
Move &Down
Sirrä &alas
-
+
Move down the selected videos in the playlist
Siirrä valitut videot alemmaksi soittolistalla
-
+
Clear the search history. Cannot be undone.
Tyhjennä hakuhistoria. Tätä toimintoa ei voi kumota.
-
+
&Quit
&Lopeta
-
+
Bye
Näkemiin
-
+
&Website
&Nettisivusto
-
+
%1 on the Web
%1 netissä
-
+
Please support the continued development of %1
Tue %1n jatkokehitystä
-
+
&About
&Tietoja
-
+
Info about %1
Tietoja %1sta
-
+
Search
Etsi
-
+
Mute volume
Vaimenna ääni
-
-
+
+
&Downloads
&Lataukset
-
+
Show details about video downloads
Näytä tietoja latauksista
-
+
&Download
&Lataa
-
+
Download the current video
Lataa nykyinen video
-
+
+ &Subscribe to Channel
+ %Tilaa kanava
+
+
+
Share the current video using %1
Jaa nykyinen video palvelulla %1
-
+
&Email
&Sähköposti
-
+
Email
Sähköposti
-
+
&Close
&Sulje
-
+
&Float on Top
&Pysy päällimmäisenä
-
+
&Stop After This Video
Py&säytä toisto tämän videon jälkeen
-
+
&Report an Issue...
&Ilmoita ongelmasta...
-
+
&Refine Search...
&Määritä haku uudelleen...
-
+
More...
-
+ Lisää...
-
+
&Related Videos
-
+ &Aiheeseen liittyvät videot
-
+
Watch videos related to the current one
-
+ Katso nykyiseen videoon liittyvät videot
-
+
&Application
&Sovellus
-
+
Buy %1...
Osta %1...
-
+
&Playback
&Toisto
-
+
&Playlist
S&oittolista
-
+
&Video
&Video
-
+
&View
&Näytä
-
+
&Share
&Jaa
-
+
&Help
&Ohje
-
+
Press %1 to raise the volume, %2 to lower it
Paina näppäinyhdistelmää %1 nostaaksesi tai %2 laskeaksesi äänenvoimakkuutta
-
-
+
+
Opening %1
Avataan kohdetta %1
-
+
Do you want to exit %1 with a download in progress?
Haluatko, että %1 sulkeutuu vaikka lataus on kesken?
-
+
If you close %1 now, this download will be cancelled.
Jos suljet %1n nyt niin tämä lataus keskeytetään.
-
+
Close and cancel download
Sulje ja peru lataus
-
+
Wait for download to finish
Odota latauksen valmistumista
-
+
Leave &Full Screen
Poistu &koko näytön tilasta
-
+
%1 version %2 is now available.
%1 versio %2 on nyt saatavilla.
-
+
Remind me later
Muistuta myöhemmin
-
+
Update
Päivitä
-
+
Error: %1
Virhe: %1
-
+
P&revious
E&dellinen
-
+
Go back to the previous track
Siirry takaisin edelliseen kappaleeseen
-
+
&Compact Mode
Kompakti &tila
-
+
Open the &YouTube Page
Avaa &YouTube-sivu
-
+
Copy the YouTube &Link
Kopioi YouTube-&linkki
-
+
Copy the Video Stream &URL
Kopioi videovirran &URL
-
+
Find Video &Parts
Etsi videon &osat
-
+
&Clear Recent Searches
Ty&hjennä viimeisimmät haut
-
+
Make a &Donation
Tee &lahjoitus
-
+
&Manually Start Playing
Aloita toisto &manuaalisesti
-
+
Manually start playing videos
Aloittaa videoiden toiston manuaalisesti
-
+
Choose your content location
-
+ Valitse sisältösi sijainti
-
+
&Play
&Toista
-
+
Resume playback
Jatka toistoa
-
+
Remaining time: %1
Aikaa jäljellä: %1
-
+
Volume at %1%
Ãänentaso: %1%
-
+
Volume is muted
Ãäni on vaimennettu
-
+
Volume is unmuted
Ãäni ei ole vaimennettu
-
+
Maximum video definition set to %1
Korkein videonlaatu on rajoitettu tarkkuuteen %1
-
+
Your privacy is now safe
Yksityisyytesi on nyt turvattu
-
+
Downloads complete
Lataukset ovat valmistuneet
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Voit nyt liittää YouTube-linkin johonkin toiseen sovellukseen
-
+
You can now paste the video stream URL into another application
Voit nyt liittää videovirran osoitteen (URL) johonkin toiseen sovellukseen
-
+
The link will be valid only for a limited time.
Osoite on käytössä vain rajoitetun ajan.
-
+
This is just the demo version of %1.
Tämä on vain %1n kokeiluversio.
-
+
It allows you to test the application and see if it works for you.
Voit kokeilla ohjelmaa nähdäksesi, toimiiko se.
-
+
Continue
Jatka
-
+
of
Used in video parts, as in '2 of 3'
/
-
+
part
This is for video parts, as in 'Cool video - part 1'
osa
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
jakso
-
+
Sent from %1
Lähetetty palvelusta %1
-
+
+ Unsubscribe from %1
+ Peru kanavan %1 tilaus
+
+
+
+ Subscribe to %1
+ Tilaa kanava %1
+
+
+
Get the full version
Hanki täysi versio
-
+
Downloading %1
Ladataan %1ta/tä
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
Katsottu %1 kertaa
-
+
%1 of %2 (%3) â %4
-
+ %1 / %2 (%3) â %4
-
+
Preparing
Valmistellaan
-
+
Failed
Epäonnistui
-
+
Completed
Valmis
-
+
Stopped
Pysäytetty
-
+
Stop downloading
Pysäytä lataus
-
+
Show in %1
Avaa %1ssa/ssä
-
+
Open parent folder
Avaa yläkansio
-
+
Restart downloading
Käynnistä lataus uudelleen
@@ -1097,7 +1211,7 @@
Done
-
+ Valmis
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Tervetuloa <a href='%1'>%2en</a>
-
+
Get the full version
Hanki täysversio
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Syötä
-
+
a keyword
hakusana
-
+
a channel
kanava
-
+
to start watching videos.
aloittaaksesi videoiden katselu.
-
+
Watch
Katso
-
+
Recent keywords
Viimeisimmät hakusanat
-
+
Recent channels
Viimeisimmät kanavat
@@ -1160,20 +1274,20 @@
SidebarHeader
-
-
+
+
&Back
&Takaisin
Forward to %1
-
+ Eteenpäin kohteeseen %1
Back to %1
-
+ Takaisin kohteeseen %1
@@ -1194,38 +1308,38 @@
Most Popular
-
-
-
-
- Featured
-
+ Suosituimmat
Most Shared
-
+ Jaetuimmat
Most Discussed
-
+ Keskustelluimmat
Top Rated
-
+ Arvostetuimmat
+
+
+
+ All Time Popular
+ Kaikkien aikojen suosituimmat
Video
-
+
Cannot get video stream for %1
Videostriimiä ei saada kohteelle %1
-
+
Network error: %1 for %2
Verkkovirhe: "%1" "%2"lle
@@ -1235,242 +1349,242 @@
Algeria
-
+ Algeria
Argentina
-
+ Argentiina
Australia
-
+ Australia
Belgium
-
+ Belgia
Brazil
-
+ Brasilia
Canada
-
+ Kanada
Chile
-
+ Chile
Colombia
-
+ Kolumbia
Czech Republic
-
+ TÅ¡ekin tasavalta
Egypt
-
+ Egypti
France
-
+ Ranska
Germany
-
+ Saksa
Ghana
-
+ Ghana
Greece
-
+ Kreikka
Hong Kong
-
+ Hongkong
Hungary
-
+ Unkari
India
-
+ Intia
Indonesia
-
+ Indonesia
Ireland
-
+ Irlanti
Israel
-
+ Israel
Italy
-
+ Italia
Japan
-
+ Japani
Jordan
-
+ Jordania
Kenya
-
+ Kenia
Malaysia
-
+ Malesia
Mexico
-
+ Meksiko
Morocco
-
+ Marokko
Netherlands
-
+ Alankomaat
New Zealand
-
+ Uusi-Seelanti
Nigeria
-
+ Nigeria
Peru
-
+ Peru
Philippines
-
+ Filippiinit
Poland
-
+ Puola
Russia
-
+ Venäjä
Saudi Arabia
-
+ Saudi-Arabia
Singapore
-
+ Singapore
South Africa
-
+ Etelä-Afrikka
South Korea
-
+ Etelä-Korea
Spain
-
+ Espanja
Sweden
-
+ Ruotsi
Taiwan
-
+ Taiwan
Tunisia
-
+ Tunisia
Turkey
-
+ Turkki
Uganda
-
+ Uganda
United Arab Emirates
-
+ Yhdistyneet arabiemiirikunnat
United Kingdom
-
+ Yhdistynyt kuningaskunta
Yemen
-
+ Jemen
Worldwide
-
+ Maailmanlaajuinen
\ No newline at end of file
diff --git a/locale/fr.ts b/locale/fr.ts
index 9551f9b..7083755 100644
--- a/locale/fr.ts
+++ b/locale/fr.ts
@@ -106,7 +106,7 @@
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
+ La version complète vous permet de télécharger des vidéos de plus de %1 minutes et de regarder des vidéos sans interruptions.
@@ -134,6 +134,95 @@
Acheter une licence
+
+ ChannelAggregator
+
+
+ By %1
+ Par %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Toutes les vidéos
+
+
+
+ Unwatched Videos
+ Vidéos non vues
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Tout marquer comme vu
+
+
+
+ Show Updated
+ Afficher les mises à jour
+
+
+
+ Name
+ Nom
+
+
+
+ Last Updated
+ Dernièrement mis à jour
+
+
+
+ Last Added
+ Dernièrement ajoutées
+
+
+
+ Last Watched
+ Dernièrement vues
+
+
+
+ Most Watched
+ Les plus vues
+
+
+
+ Sort by
+ Trier par
+
+
+
+ All Videos
+ Toutes les vidéos
+
+
+
+ Unwatched Videos
+ Vidéos non vues
+
+
+
+ There are no updated subscriptions at this time.
+ Il n'y a pas d'abonnements mis à jour en ce moment.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Vous n'avez pas d'abonnements. Utilisez le symbole de l'étoile pour vous abonner à des chaines,
+
+
ClearButton
@@ -339,35 +428,45 @@
HomeView
-
+
Search
Chercher
-
+
Find videos and channels by keyword
-
+ Trouver des vidéos et des chaînes par mot-clé
-
+
Browse
-
+ Parcourir
-
+
Browse videos by category
-
+ Parcourir les vidéos par catégories
+
+
+
+ Subscriptions
+ Abonnements
+
+
+
+ Channel subscriptions
+ Abonnements aux chaines
Make yourself comfortable
-
+ Installez-vous confortablement
LoadingWidget
-
+
Error
Erreur
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Arrêter
-
+
Stop playback and go back to the search view
Arrêter et aller à la page de recherche
-
+
S&kip
&Passer
-
+
Skip to the next video
Passer à la vidéo suivante
-
-
+
+
&Pause
&Pause
-
-
+
+
Pause playback
Mettre en pause
-
+
&Full Screen
&Plein écran
-
+
Go full screen
Mettre en plein écran
-
+
Hide the playlist and the toolbar
Cacher la liste de lecture et la barre d'outils
-
+
Go to the YouTube video page and pause playback
Aller à la page de la vidéo Youtube et mettre en pause
-
+
Copy the current video YouTube link to the clipboard
Copier l'adresse de la vidéo YouTube courante dans le presse-papier
-
+
Copy the current video stream URL to the clipboard
Copier l'adresse du flux vidéo courant dans le presse-papier
-
+
Find other video parts hopefully in the right order
Trouver les autres parties de la vidéo en espérant qu'elles soient dans le bon ordre
-
+
&Remove
&Supprimer
-
+
Remove the selected videos from the playlist
Supprimer la vidéo sélectionnée de la liste de lecture
-
+
Move &Up
Déplacer vers les &haut
-
+
Move up the selected videos in the playlist
Déplacer la vidéo sélectionnée vers le haut dans la liste de lecture
-
+
Move &Down
Déplacer vers les &bas
-
+
Move down the selected videos in the playlist
Déplacer la vidéo sélectionnée vers le bas dans la liste de lecture
-
+
Clear the search history. Cannot be undone.
Effacer l'historique de recherche. Opération irréversible.
-
+
&Quit
&Quitter
-
+
Bye
Au revoir
-
+
&Website
Site &Web
-
+
%1 on the Web
%1 sur le Web
-
+
Please support the continued development of %1
Merci d'aider à poursuivre le développement de %1
-
+
&About
&Ã propos
-
+
Info about %1
à propos de %1
-
+
Search
Chercher
-
+
Mute volume
Couper le son
-
-
+
+
&Downloads
&Téléchargements
-
+
Show details about video downloads
Voir les détails à propos des téléchargements de la vidéo
-
+
&Download
&Téléchargement
-
+
Download the current video
Télécharger la vidéo en cours
-
+
+ &Subscribe to Channel
+ &S'abonner à la chaine
+
+
+
Share the current video using %1
Partager cette vidéo avec %1
-
+
&Email
&Email
-
+
Email
Email
-
+
&Close
&Fermer
-
+
&Float on Top
&Laisser au dessus
-
+
&Stop After This Video
&Arrêter après cette vidéo
-
+
&Report an Issue...
&Signaler un problème...
-
+
&Refine Search...
&Affiner la recherche...
-
+
More...
-
+ Plusâ¦
-
+
&Related Videos
-
+ Vidéos &Relatives
-
+
Watch videos related to the current one
-
+ Regarder des vidéos relatives à la vidéo courante
-
+
&Application
&Application
-
+
Buy %1...
Acheter %1 â¦
-
+
&Playback
&Lecture
-
+
&Playlist
&Liste de lecture
-
+
&Video
&Vidéo
-
+
&View
&Vue
-
+
&Share
&Partager
-
+
&Help
&Aide
-
+
Press %1 to raise the volume, %2 to lower it
Appuyer sur %1 pour augmenter le volume, sur %2 pour le baisser
-
-
+
+
Opening %1
Ouverture de %1
-
+
Do you want to exit %1 with a download in progress?
Voulez-vous vraiment quitter %1 avec un téléchargement en cours ?
-
+
If you close %1 now, this download will be cancelled.
Si vous fermez %1 maintenant, ce téléchargement sera annulé.
-
+
Close and cancel download
Fermer et annuler le téléchargement
-
+
Wait for download to finish
Attendez la fin du téléchargement
-
+
Leave &Full Screen
Quitter le &mode plein écran
-
+
%1 version %2 is now available.
%1 version %2 est maintenant disponible
-
+
Remind me later
Me rappeler plus tard
-
+
Update
Mettre à jour
-
+
Error: %1
Erreur : %1
-
+
P&revious
P&récédent
-
+
Go back to the previous track
Aller à la piste précédente
-
+
&Compact Mode
&Mode compact
-
+
Open the &YouTube Page
Ouvrir la page &Youtube
-
+
Copy the YouTube &Link
Copier le &lien Youtube
-
+
Copy the Video Stream &URL
Copier l'&URL du flux vidéo
-
+
Find Video &Parts
Trouver les &parties de la vidéo
-
+
&Clear Recent Searches
&Effacer les recherches récentes
-
+
Make a &Donation
Faire un &Don
-
+
&Manually Start Playing
&
-
+
Manually start playing videos
Démarrer manuellement la lecture de vidéos
-
+
Choose your content location
-
+ Choisissez l'emplacement de votre contenu
-
+
&Play
&Jouer
-
+
Resume playback
Relancer la lecture
-
+
Remaining time: %1
Temps restant : %1
-
+
Volume at %1%
Volume à %1
-
+
Volume is muted
Volume OFF
-
+
Volume is unmuted
Volume ON
-
+
Maximum video definition set to %1
Résolution vidéo maximale fixée à %1
-
+
Your privacy is now safe
Votre confidentialité est maintenant respectée
-
+
Downloads complete
Téléchargements terminés
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Vous pouvez maintenant copier l'adresse Youtube dans une autre application
-
+
You can now paste the video stream URL into another application
Vous pouvez maintenant coller l'adresse du flux vidéo dans une autre application
-
+
The link will be valid only for a limited time.
Le lien ne sera valide que pour un temps limité.
-
+
This is just the demo version of %1.
C'est juste la version démo de %1.
-
+
It allows you to test the application and see if it works for you.
Cela vous permet de tester l'application et voir si cela fonctionne pour vous.
-
+
Continue
Continuer
-
+
of
Used in video parts, as in '2 of 3'
de
-
+
part
This is for video parts, as in 'Cool video - part 1'
partie
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
épisode
-
+
Sent from %1
Envoyé par %1
-
+
+ Unsubscribe from %1
+ Se désabonner de %1
+
+
+
+ Subscribe to %1
+ S'abonner à %1
+
+
+
Get the full version
Obtenir la version complète
-
+
Downloading %1
%1 Téléchargement
@@ -909,54 +1023,54 @@
PlaylistItemDelegate
-
+
%1 views
%1 vues
-
+
%1 of %2 (%3) â %4
-
+ %1 de %2 (%3) â %4
-
+
Preparing
-
+ Préparation
-
+
Failed
-
+ Ãchec
-
+
Completed
-
+ Terminé
-
+
Stopped
-
+ Arrêté
-
+
Stop downloading
-
+ Arrêter le téléchargement
-
+
Show in %1
-
+ Montrer dans %1
-
+
Open parent folder
-
+ Ouvrir le dossier parent
-
+
Restart downloading
-
+ Redémarrer le téléchargement
@@ -969,7 +1083,7 @@
Show %1 More
-
+ Afficher %1 de plus
@@ -979,7 +1093,7 @@
No more videos
-
+ Il n'y a plus de vidéos
@@ -1097,7 +1211,7 @@
Done
-
+ Terminé
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Bienvenue sur <a href='%1'>%2</a>,
-
+
Get the full version
Obtenir la version complète
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Entrer
-
+
a keyword
un mot-clé
-
+
a channel
une chaîne
-
+
to start watching videos.
pour commencer à regarder des vidéos.
-
+
Watch
Regarder
-
+
Recent keywords
Derniers mots-clés
-
+
Recent channels
Chaînes récentes
@@ -1160,20 +1274,20 @@
SidebarHeader
-
-
+
+
&Back
&Retour
Forward to %1
-
+ Continuer à %1
Back to %1
-
+ Revenir à %1
@@ -1194,38 +1308,38 @@
Most Popular
-
-
-
-
- Featured
-
+ Les plus populaires
Most Shared
-
+ Les plus partagées
Most Discussed
-
+ Les plus commentées
Top Rated
-
+ Les mieux notées
+
+
+
+ All Time Popular
+ Les plus populaires de tous les temps
Video
-
+
Cannot get video stream for %1
Impossible d'obtenir le flux vidéo de %1
-
+
Network error: %1 for %2
Erreur réseau : %1 pour %2
@@ -1235,242 +1349,242 @@
Algeria
-
+ Algérie
Argentina
-
+ Argentine
Australia
-
+ Australie
Belgium
-
+ Belgique
Brazil
-
+ Brésil
Canada
-
+ Canada
Chile
-
+ Chili
Colombia
-
+ Colombie
Czech Republic
-
+ République Tchèque
Egypt
-
+ Ãgypte
France
-
+ France
Germany
-
+ Allemagne
Ghana
-
+ Ghana
Greece
-
+ Grèce
Hong Kong
-
+ Hong Kong
Hungary
-
+ Hongrie
India
-
+ Inde
Indonesia
-
+ Indonésie
Ireland
-
+ Irelande
Israel
-
+ Israël
Italy
-
+ Italie
Japan
-
+ Japon
Jordan
-
+ Jordanie
Kenya
-
+ Kenya
Malaysia
-
+ Malaisie
Mexico
-
+ Mexique
Morocco
-
+ Maroc
Netherlands
-
+ Pays-Bas
New Zealand
-
+ Nouvelle Zélande
Nigeria
-
+ Nigeria
Peru
-
+ Pérou
Philippines
-
+ Philippines
Poland
-
+ Pologne
Russia
-
+ Russie
Saudi Arabia
-
+ Arabie Saoudite
Singapore
-
+ Singapour
South Africa
-
+ Afrique du Sud
South Korea
-
+ Corée du Sud
Spain
-
+ Espagne
Sweden
-
+ Suède
Taiwan
-
+ Taïwan
Tunisia
-
+ Tunisie
Turkey
-
+ Turquie
Uganda
-
+ Ouganda
United Arab Emirates
-
+ Ãmirats Arabes unis
United Kingdom
-
+ Royaume Uni
Yemen
-
+ Yémen
Worldwide
-
+ Monde entier
\ No newline at end of file
diff --git a/locale/he_IL.ts b/locale/he_IL.ts
index 14bd9e5..34a8fb8 100644
--- a/locale/he_IL.ts
+++ b/locale/he_IL.ts
@@ -15,7 +15,7 @@
Licensed to: %1
-
+ ×ר×ש×× ××××ת: %1
@@ -78,17 +78,17 @@
Enter your License Details
-
+ × × ××××× ×ת פר×× ×ר×ש×× ×©××
&Email:
-
+ &××××´×:
&Code:
-
+ &ק××:
@@ -111,7 +111,7 @@
Without a license, the application will expire in %1 days.
-
+ ××× ×¨×ש××× ×××ש×× ×פ×× ××¢×× %1 ××××.
@@ -126,11 +126,100 @@
Enter License
-
+ ××× ×ª ר×ש×××
Buy License
+ ר××שת ר×ש×××
+
+
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
@@ -270,7 +359,7 @@
Downloading update...
-
+ ××¢×××× ×תק××...
@@ -339,23 +428,33 @@
HomeView
-
+
Search
××פ×ש
-
+
Find videos and channels by keyword
-
+ ××פ×ש סר××× × ××××× ×ער×צ×× ××¤× ×××ת ×פת×
-
+
Browse
-
+ ×¢×××
-
+
Browse videos by category
+ ×¢××× ×ק××¢× ××××× ××¤× ×§×××ר××
+
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
ש××××
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&עצ×ר×
-
+
Stop playback and go back to the search view
עצ×רת ×× ××× × ××××¨× ×× ×ª×¦××ת ×××פ×ש
-
+
S&kip
&×××××
-
+
Skip to the next video
××××× ×× ×סר××× ×××
-
-
+
+
&Pause
×&ש×××
-
-
+
+
Pause playback
×ש×××ת ×× ××× ×
-
+
&Full Screen
&××¡× ×××
-
+
Go full screen
××¢×ר ×××¡× ×××
-
+
Hide the playlist and the toolbar
×סתרת רש××ת ××ש××¢× ×סר×× ×××××
-
+
Go to the YouTube video page and pause playback
××¢×ר ××¢××× ××××××× ×Ö¾YouTube ××ש×××ת ×× ××× ×.
-
+
Copy the current video YouTube link to the clipboard
×עתקת ×ק×ש×ר ×× ××××××× ×× ×××× ×× ××× ××××ר××
-
+
Copy the current video stream URL to the clipboard
×עתקת ×ת××ת ת×ר×× ××××××× ×× ××× ××××ר××
-
+
Find other video parts hopefully in the right order
××פ×ש ××ק×× ××ר×× ×תק××× ×©×× ×ס×ר ×× ×××
-
+
&Remove
×&סר×
-
+
Remove the selected videos from the playlist
×סרת ×סר××× ×× ×× ××ר×× ×רש××ת ××ש××¢×
-
+
Move &Up
×××× ×&××¢××
-
+
Move up the selected videos in the playlist
×××ת ×סר××× ×× ×× ××ר×× ×××¢×× ×¨×©××ת ××ש××¢×
-
+
Move &Down
×××× ×&××
-
+
Move down the selected videos in the playlist
×××ת ×סר××× ×× ×× ××ר×× ××××¨× ×¨×©××ת ××ש××¢×
-
+
Clear the search history. Cannot be undone.
×××קת ××ס××ר××ת ×××פ×ש. ×× × ××ª× ××××
-
+
&Quit
×&צ×××
-
+
Bye
××תר××ת
-
+
&Website
&×תר ×××× ××¨× ×
-
+
%1 on the Web
%1 ×××× ××¨× ×
-
+
Please support the continued development of %1
×× × ×ª××× ××××©× ×פ×ת×× ×©× %1
-
+
&About
&×¢× ××××ת
-
+
Info about %1
××××¢ ××××ת %1
-
+
Search
××פ×ש
-
+
Mute volume
×שתקת ×ש××¢
-
-
+
+
&Downloads
××&ר××ת
-
+
Show details about video downloads
×צ×ת פר××× ×¢× ××××ת ××ר××ת ×××××
-
+
&Download
××&ר××
-
+
Download the current video
××ר×ת סר××× ××××××× ×× ××××
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
ש×ת××£ ××××××× ×× ×××× ××¨× %1
-
+
&Email
&××××´×
-
+
Email
××××´×
-
+
&Close
&ס××ר×
-
+
&Float on Top
&צ××¤× ××××¢××
-
+
&Stop After This Video
×&עצ×ר ×××ר ××××× ××
-
+
&Report an Issue...
&××××× ×¢× ×ª×§××...
-
+
&Refine Search...
&ש×פ×ר ×××פ×ש...
-
+
More...
-
+ ×¢××...
-
+
&Related Videos
-
+
Watch videos related to the current one
-
+
&Application
&××ש××
-
+
Buy %1...
ר××שת %1...
-
+
&Playback
× &××× ×
-
+
&Playlist
&רש××ת ×ש××¢×
-
+
&Video
&×××××
-
+
&View
&צפ×××
-
+
&Share
&ש×ת××£
-
+
&Help
&×¢×ר×
-
+
Press %1 to raise the volume, %2 to lower it
× ××ª× ×××××¥ ×¢× %1 ××× ×××××ר ×ת עצ×ת ×ש××¢, %2 ××× ××× ××× ××ת×
-
-
+
+
Opening %1
%1 × ×¤×ª×
-
+
Do you want to exit %1 with a download in progress?
××× ×רצ×× × ×צ×ת ×Ö¾%1 ××שר ××©× × ××ר×× ×¤×¢×××?
-
+
If you close %1 now, this download will be cancelled.
×× %1 ××ס×ר ×עת, ××ר×× ×× ×ª××××.
-
+
Close and cancel download
ס×××¨× ×××××× ×××ר××
-
+
Wait for download to finish
×ש ×××ת×× ×ס××× ×××ר××
-
+
Leave &Full Screen
×צ××× ××&×¡× ×××
-
+
%1 version %2 is now available.
%1 ×××¨×¡× %2 ×××× ×עת.
-
+
Remind me later
×××××ר ×× ××××ר ××תר
-
+
Update
×¢××××
-
+
Error: %1
ש××××: %1
-
+
P&revious
×&ק×××
-
+
Go back to the previous track
×××¨× ×רצ××¢× ×ק×××ת
-
+
&Compact Mode
×&×¦× ×ס××× ×
-
+
Open the &YouTube Page
פת××ת ××¢××× ×&××××××
-
+
Copy the YouTube &Link
×עתקת ×&ק×ש×ר ×××××××
-
+
Copy the Video Stream &URL
×עתקת ×ת××ת ת&×ר×× ×××××××
-
+
Find Video &Parts
××פ×ש ק&××¢× ×××××
-
+
&Clear Recent Searches
&× ×ק×× ×××פ×ש×× ×××ר×× ××
-
+
Make a &Donation
×&×שת תר×××
-
+
&Manually Start Playing
×ת××ת × ××× × ×&×× ×ת
-
+
Manually start playing videos
×ת××× ××× ×ת ×× ××× ×ª ק××¢× ×××××××
-
+
Choose your content location
-
+
&Play
&× ××× ×
-
+
Resume playback
×××©× ×× ××× ×
-
+
Remaining time: %1
×××× ×× ×תר: %1
-
+
Volume at %1%
עצ×ת ×ש××¢ ××× %1%
-
+
Volume is muted
×ש××¢ ××שתק
-
+
Volume is unmuted
×ש××¢ ××× × ××שתק
-
+
Maximum video definition set to %1
××××ת ×× ××× × ×××ר××ת ××××רת ×Ö¾%1
-
+
Your privacy is now safe
פר××××ª× ×××× ×ª ×עת.
-
+
Downloads complete
×××ר××ת ××ש×××
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
×עת × ××ª× ×××××ק ×ת ק×ש×ר ×Ö¾YouTube ש××× ×××ש×× ××ר
-
+
You can now paste the video stream URL into another application
×עת × ××ª× ×××××ק ×ת ×ת××ת ת×ר×× ××××××× ×××ש×× ××ר
-
+
The link will be valid only for a limited time.
×ק×ש×ר ×××× ×ª×§×£ ×××× ××××× ××××.
-
+
This is just the demo version of %1.
×××× ×¨×§ ×רסת ×××××× ×©× %1.
-
+
It allows you to test the application and see if it works for you.
××¨×¡× ×× ××פשרת ×× ××××× ×ת ×××ש×× ××ר××ת ××× ××× ×ת××× ×צר×××.
-
+
Continue
××ש×
-
+
of
Used in video parts, as in '2 of 3'
×ת××
-
+
part
This is for video parts, as in 'Cool video - part 1'
××ק
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
פרק
-
+
Sent from %1
× ×©×× ××¨× %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
ק××ת ×××¨×¡× ×××××
-
+
Downloading %1
%1 ×תק××
@@ -880,22 +994,22 @@
Would you like to download it now?
-
+ ××× ×רצ×× × ×××ר×× ××ת ×עת?
Skip This Version
-
+ ×תע×××ת ×××¨×¡× ××
Remind Me Later
-
+ ×××××ר ×× ××××ר ××תר
Install Update
-
+ ××ª×§× ×ª ×¢××××
@@ -903,58 +1017,58 @@
Paste
-
+ ×××ק×
PlaylistItemDelegate
-
+
%1 views
%1 צפ××ת
-
+
%1 of %2 (%3) â %4
-
+
Preparing
-
+
Failed
-
+
Completed
-
+
Stopped
-
+
Stop downloading
-
+
Show in %1
-
+
Open parent folder
-
+
Restart downloading
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
×ר×× ×××× ×× <a href='%1'>%2</a>,
-
+
Get the full version
ק××ת ×××¨×¡× ×××××
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
××× ×
-
+
a keyword
×××ת ×פת×
-
+
a channel
ער××¥
-
+
to start watching videos.
××× ××ת××× ×צפ×ת ×סר××× ××.
-
+
Watch
צפ×××
-
+
Recent keywords
××××ת ××¤×ª× ××ר×× ×ת
-
+
Recent channels
ער×צ×× ××ר×× ××
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
@@ -1196,11 +1310,6 @@
Most Popular
-
-
- Featured
-
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
×× × ××ª× ×ק×× ×ת ת×ר×× ××××××× ×¢××ר %1
-
+
Network error: %1 for %2
ש×××ת רשת: %1 ×¢××ר %2
@@ -1235,242 +1349,242 @@
Algeria
-
+ ×××׳×ר
Argentina
-
+ ×ר×× ××× ×
Australia
-
+ ××ס×ר×××
Belgium
-
+ ×××××
Brazil
-
+ ×ר×××
Canada
-
+ ×§× ××
Chile
-
+ צ׳×××
Colombia
-
+ ק×××××××
Czech Republic
-
+ ×רפ×××××§× ×צ׳××ת
Egypt
-
+ ×צר×××
France
-
+ צרפת
Germany
-
+ ×ר×× ××
Ghana
-
+ ××× ×
Greece
-
+ ××××
Hong Kong
-
+ ××× × ×§×× ×
Hungary
-
+ ××× ×ר××
India
-
+ ××××
Indonesia
-
+ ××× ××× ×××
Ireland
-
+ ××ר×× ×
Israel
-
+ ×שר××
Italy
-
+ ××××××
Japan
-
+ ×פ×
Jordan
-
+ ×ר××
Kenya
-
+ ×§× ××
Malaysia
-
+ ×××××
Mexico
-
+ ×קס×ק×
Morocco
-
+ ×ר×ק×
Netherlands
-
+ ×××× ×
New Zealand
-
+ × ×× ×××× ×
Nigeria
-
+ × ××ר××
Peru
-
+ פר×
Philippines
-
+ ×פ×××פ×× ××
Poland
-
+ פ××××
Russia
-
+ ר×ס××
Saudi Arabia
-
+ ×¢×¨× ×סע×××ת
Singapore
-
+ ס×× ×פ×ר
South Africa
-
+ ×ר×× ×פר×ק×
South Korea
-
+ ×ר×× ×§×ר×××
Spain
-
+ ספר×
Sweden
-
+ ש××××
Taiwan
-
+ ××××××
Tunisia
-
+ ת×× ×ס
Turkey
-
+ ××רק××
Uganda
-
+ ×××× ××
United Arab Emirates
-
+ ××××× × ×¡×××××ת ער×
United Kingdom
-
+ ×××××× ××××××ת/×× ××××
Yemen
-
+ ת×××
Worldwide
-
+ ×× ××¢×××
\ No newline at end of file
diff --git a/locale/hr.ts b/locale/hr.ts
deleted file mode 100644
index 5422ef0..0000000
--- a/locale/hr.ts
+++ /dev/null
@@ -1,1476 +0,0 @@
-
-UTF-8
-
- AboutView
-
-
- There's life outside the browser!
- Život postoji i van browsera!
-
-
-
- Version %1
- Verzija %1
-
-
-
- Licensed to: %1
-
-
-
-
- %1 is Free Software but its development takes precious time.
- %1 je besplatan program ali njegov razvoj zahtjeva dragocjeno vrijeme.
-
-
-
- Please <a href='%1'>donate</a> to support the continued development of %2.
- VaÅ¡a <a href='%1'>donacija</a> Äe pomoÄi daljnjem razvoju %2.
-
-
-
- You may want to try my other apps as well:
- Možete isprobati i moje ostale aplikacije:
-
-
-
- %1, a YouTube music player
- %1, player glazbe sa YouTube
-
-
-
- %1, a music player
- %1, za reprodukciju glazbe
-
-
-
- Translate %1 to your native language using %2
- Prevedite %1 na svoj jezik koristeÄi %2
-
-
-
- Icon designed by %1.
- Dizajn ikone %1.
-
-
-
- Released under the <a href='%1'>GNU General Public License</a>
- Izdano pod <a href='%1'>GNU General Public License</a>
-
-
-
- &Close
- &Zatvori
-
-
-
- About
- O programu
-
-
-
- What you always wanted to know about %1 and never dared to ask
- Sve što ste željeli znati o %1 a niste se usudili pitati
-
-
-
- ActivationDialog
-
-
- Enter your License Details
-
-
-
-
- &Email:
-
-
-
-
- &Code:
-
-
-
-
- ActivationView
-
-
- Please license %1
- Molimo registrirajte %1
-
-
-
- This demo has expired.
- Vaša demo verzija je istekla.
-
-
-
- The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
-
-
-
- Without a license, the application will expire in %1 days.
-
-
-
-
- By purchasing the full version, you will also support the hard work I put into creating %1.
- Kupnjom pune verzije podržati Äete i težak rad uložen u izradu %1.
-
-
-
- Use Demo
- Koristi demo verziju.
-
-
-
- Enter License
-
-
-
-
- Buy License
-
-
-
-
- ClearButton
-
-
- Clear
- Obriši
-
-
-
- DownloadItem
-
-
- bytes
- bajtova
-
-
-
- KB
- KB
-
-
-
- MB
- MB
-
-
-
- bytes/sec
- bajtova/sec
-
-
-
- KB/sec
- KB/sec
-
-
-
- MB/sec
- MB/sec
-
-
-
- seconds
- sekundi
-
-
-
- minutes
- minuta
-
-
-
- %4 %5 remaining
- %4 %5 preostalo
-
-
-
- DownloadManager
-
-
- This is just the demo version of %1.
- Ovo je samo demo verzija %1.
-
-
-
- It can only download videos shorter than %1 minutes so you can test the download functionality.
- Može preuzeti samo video kraÄi od %1 minuta tako da možete testirati moguÄnost preuzimanja.
-
-
-
- Continue
- Nastavi
-
-
-
- Get the full version
- Preuzmi punu verziju
-
-
-
- %1 downloaded in %2
- %1 preuzet u %2
-
-
-
- Download finished
- Preuzimanje završeno
-
-
-
- %n Download(s)
- %n preuzimanje %n preuzimanja %n preuzimanja
-
-
-
- DownloadSettings
-
-
- Change location...
- Promijeni odredište preuzimanja...
-
-
-
- Choose the download location
- Odaberi odredište preuzimanja
-
-
-
- Download location changed.
- Odredište preuzimanja promijenjeno.
-
-
-
- Current downloads will still go in the previous location.
- Trenutna preuzimanja Äe i dalje iÄi u prethodno odrediÅ¡te.
-
-
-
- Downloading to: %1
- Preuzimam u: %1
-
-
-
- DownloadView
-
-
-
- Downloads
- Preuzimanja
-
-
-
- DownloadWidget
-
-
- Downloading update...
-
-
-
-
- GlobalShortcuts
-
-
- Play
- Pokreni
-
-
-
- Pause
- Pauza
-
-
-
- Play/Pause
- Pokreni/Pauza
-
-
-
- Stop
- Stani
-
-
-
- Stop playing after current track
- Stani nakon trenutne stvari.
-
-
-
- Next track
- SlijedeÄa
-
-
-
- Previous track
- Prethodna
-
-
-
- Increase volume
- PojaÄaj zvuk
-
-
-
- Decrease volume
- Stišaj zvuk
-
-
-
- Mute
- Nijemo
-
-
-
- Seek forward
- Premotaj naprijed
-
-
-
- Seek backward
- Premotaj nazad
-
-
-
- HomeView
-
-
- Search
- Traži
-
-
-
- Find videos and channels by keyword
-
-
-
-
- Browse
-
-
-
-
- Browse videos by category
-
-
-
-
- Make yourself comfortable
-
-
-
-
- LoadingWidget
-
-
- Error
- Greška
-
-
-
- MainWindow
-
-
- &Stop
- &Stop
-
-
-
- Stop playback and go back to the search view
- Stani i vrati se na pretraživanje
-
-
-
- S&kip
- &PreskoÄi
-
-
-
- Skip to the next video
- PreskoÄi na slijedeÄi video
-
-
-
-
- &Pause
- &Pauza
-
-
-
-
- Pause playback
- Pauziraj
-
-
-
- &Full Screen
- &Cijeli ekran
-
-
-
- Go full screen
- Prikaži preko cijelog ekrana
-
-
-
- Hide the playlist and the toolbar
- Sakrij play listu i alatnu traku
-
-
-
- Go to the YouTube video page and pause playback
- Idi na Youtube stranicu sa videom i pauziraj
-
-
-
- Copy the current video YouTube link to the clipboard
- Kopiraj YouTube link trenutnog videa u clipboard
-
-
-
- Copy the current video stream URL to the clipboard
- Kopiraj &URL trenutnog video streama u clipboard
-
-
-
- Find other video parts hopefully in the right order
- NaÄi ostale dijelove videa, vjerojatno u pravom rasporedu
-
-
-
- &Remove
- &Ukloni
-
-
-
- Remove the selected videos from the playlist
- Ukloni odabrane video clipove iz play liste
-
-
-
- Move &Up
- Pomakni &gore
-
-
-
- Move up the selected videos in the playlist
- Pomakni gore slektirane video clipove u play listi
-
-
-
- Move &Down
- Pomakni &dolje
-
-
-
- Move down the selected videos in the playlist
- Pomakni dolje slektirane video clipove u play listi
-
-
-
- Clear the search history. Cannot be undone.
- OÄisti povijest pretraga. Ne može se vratiti.
-
-
-
- &Quit
- &Kraj
-
-
-
- Bye
- DoviÄenja
-
-
-
- &Website
- &Web stranice
-
-
-
- %1 on the Web
- %1 na webu
-
-
-
- Please support the continued development of %1
- Molim Vas da podržite daljnji razvoj %1
-
-
-
- &About
- &O programu
-
-
-
- Info about %1
- Informacije o %1
-
-
-
- Search
- Traži
-
-
-
- Mute volume
- Utišaj zvuk
-
-
-
-
- &Downloads
- &Preuzimanja
-
-
-
- Show details about video downloads
- Pokaži informacije o preuzimanjima videa
-
-
-
- &Download
- &Preuzimanje
-
-
-
- Download the current video
- Preuzmi trenutni video
-
-
-
- Share the current video using %1
- Podijeli trenutni video koristeÄi %1
-
-
-
- &Email
- &Email
-
-
-
- Email
- Email
-
-
-
- &Close
- &Zatvori
-
-
-
- &Float on Top
- &Budi na vrhu
-
-
-
- &Stop After This Video
- &Stani nakon ovog videa
-
-
-
- &Report an Issue...
- &Prijavi problem
-
-
-
- &Refine Search...
- &Suzi pretragu
-
-
-
- More...
-
-
-
-
- &Related Videos
-
-
-
-
- Watch videos related to the current one
-
-
-
-
- &Application
- &Program
-
-
-
- Buy %1...
- Kupi %1
-
-
-
- &Playback
- &Sviraj
-
-
-
- &Playlist
- &Play lista
-
-
-
- &Video
- &Video
-
-
-
- &View
- &Pogled
-
-
-
- &Share
- &Podijeli
-
-
-
- &Help
- &PomoÄ
-
-
-
- Press %1 to raise the volume, %2 to lower it
- Pritisnite %1 za glasnije, %2 za tiše
-
-
-
-
- Opening %1
- Otvaram %1
-
-
-
- Do you want to exit %1 with a download in progress?
- Da li stvarno želite napustiti %1 dok traje preuzimanje?
-
-
-
- If you close %1 now, this download will be cancelled.
- Ako sada zatvorite %1, preuzimanje Äe biti poniÅ¡teno.
-
-
-
- Close and cancel download
- Zatvori i poništi preuzimanje
-
-
-
- Wait for download to finish
- PriÄekaj da zavrÅ¡i preuzimanje
-
-
-
- Leave &Full Screen
- IzaÄi iz &Cijelog ekrana
-
-
-
- %1 version %2 is now available.
- %1 verzija %2 je dostupna.
-
-
-
- Remind me later
- Podsjeti me kasnije
-
-
-
- Update
- Unaprijedi
-
-
-
- Error: %1
- Greška: %1
-
-
-
- P&revious
- P&rethodni
-
-
-
- Go back to the previous track
- Idi nazad na prethodnu pjesmu
-
-
-
- &Compact Mode
- &Kompaktni mod
-
-
-
- Open the &YouTube Page
- Otvori &YouTube stranicu
-
-
-
- Copy the YouTube &Link
- Kopiraj YouTube &link
-
-
-
- Copy the Video Stream &URL
- Kopiraj &URL video streama
-
-
-
- Find Video &Parts
- NaÄi &dijelove videa
-
-
-
- &Clear Recent Searches
- &Izbriši nedavne pretrage
-
-
-
- Make a &Donation
- Izvrši &donaciju
-
-
-
- &Manually Start Playing
- &RuÄno pokreni reprodukciju
-
-
-
- Manually start playing videos
- RuÄno pokreni reprodukciju videa
-
-
-
- Choose your content location
-
-
-
-
- &Play
- &Sviraj
-
-
-
- Resume playback
- &Nastavi sviranje
-
-
-
- Remaining time: %1
- Preostalo vrijeme: %1
-
-
-
- Volume at %1%
- GlasnoÄa na %1%
-
-
-
- Volume is muted
- Zvuk je ugašen
-
-
-
- Volume is unmuted
- Zvuk je upaljen
-
-
-
- Maximum video definition set to %1
- Maksimalna video rezolucija postavljena na %1
-
-
-
- Your privacy is now safe
- Vaša privatnost je sada sigurna
-
-
-
- Downloads complete
- Preuzimanja završena
-
-
-
- MediaView
-
-
- You can now paste the YouTube link into another application
- Sada možete zalijepiti Youtube link u neki drugi program
-
-
-
- You can now paste the video stream URL into another application
- Sada možete zalijepiti link video streama u neki drugi program
-
-
-
- The link will be valid only for a limited time.
- Link Äe biti valjan samo ograniÄeno vrijeme.
-
-
-
- This is just the demo version of %1.
- Ovo je samo demo verzija %1.
-
-
-
- It allows you to test the application and see if it works for you.
- OmoguÄava Vam da testirate program i vidite da li Vam odgovara.
-
-
-
- Continue
- Nastavi
-
-
-
- of
- Used in video parts, as in '2 of 3'
- od
-
-
-
- part
- This is for video parts, as in 'Cool video - part 1'
- dio
-
-
-
- episode
- This is for video parts, as in 'Cool series - episode 1'
- epizoda
-
-
-
- Sent from %1
- Poslano sa %1
-
-
-
- Get the full version
- Preuzmi punu verziju
-
-
-
- Downloading %1
- Preuzimam %1
-
-
-
- MessageWidget
-
-
- A new version of %1 is available!
-
-
-
-
- %1 %2 is now available. You have %3.
-
-
-
-
- Would you like to download it now?
-
-
-
-
- Skip This Version
-
-
-
-
- Remind Me Later
-
-
-
-
- Install Update
-
-
-
-
- PasteLineEdit
-
-
- Paste
-
-
-
-
- PlaylistItemDelegate
-
-
- %1 views
- %1 pregleda
-
-
-
- %1 of %2 (%3) â %4
-
-
-
-
- Preparing
-
-
-
-
- Failed
-
-
-
-
- Completed
-
-
-
-
- Stopped
-
-
-
-
- Stop downloading
-
-
-
-
- Show in %1
-
-
-
-
- Open parent folder
-
-
-
-
- Restart downloading
-
-
-
-
- PlaylistModel
-
-
- Searching...
- Pretražujem...
-
-
-
- Show %1 More
-
-
-
-
- No videos
- Nema videa
-
-
-
- No more videos
- Nema više videa
-
-
-
- RefineSearchWidget
-
-
- Sort by
- Sortiraj po
-
-
-
- Relevance
- Važnost
-
-
-
-
- Date
- Datum
-
-
-
- View Count
- Broj pregleda
-
-
-
- Rating
- Ocjena
-
-
-
- Anytime
- Bilo kada
-
-
-
- Today
- Danas
-
-
-
- 7 Days
- 7 dana
-
-
-
- 30 Days
- 30 dana
-
-
-
- Duration
- Trajanje
-
-
-
-
- All
- Sve
-
-
-
- Short
- Kratko
-
-
-
- Medium
- Srednje
-
-
-
- Long
- Dugo
-
-
-
- Less than 4 minutes
- KraÄe od 4 minute
-
-
-
- Between 4 and 20 minutes
- IzmeÄu 4 i 20 minuta
-
-
-
- Longer than 20 minutes
- Duže od 20 minuta
-
-
-
- Quality
- Kvaliteta
-
-
-
- High Definition
- Visoka razluÄivost
-
-
-
- 720p or higher
- 720p ili više
-
-
-
- Done
- Gotovo
-
-
-
- RegionsView
-
-
- Done
-
-
-
-
- SearchLineEdit
-
-
- Search
- Traži
-
-
-
- SearchView
-
-
- Welcome to <a href='%1'>%2</a>,
- Dobrodošli u <a href='%1'>%2</a>,
-
-
-
- Get the full version
- Preuzmi punu verziju
-
-
-
- Enter
- "Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
- Unesi
-
-
-
- a keyword
- kljuÄna rijeÄ
-
-
-
- a channel
- kanal
-
-
-
- to start watching videos.
- da poÄnete gledati video.
-
-
-
- Watch
- Gledaj
-
-
-
- Recent keywords
- Nedavne kljuÄne rijeÄi
-
-
-
- Recent channels
- Nedavni kanali
-
-
-
- SidebarHeader
-
-
-
- &Back
- &Nazad
-
-
-
- Forward to %1
-
-
-
-
- Back to %1
-
-
-
-
- SidebarWidget
-
-
- Refine Search
- Suzi pretragu
-
-
-
- Did you mean: %1
- Dali ste mislili: %1
-
-
-
- StandardFeedsView
-
-
- Most Popular
-
-
-
-
- Featured
-
-
-
-
- Most Shared
-
-
-
-
- Most Discussed
-
-
-
-
- Top Rated
-
-
-
-
- Video
-
-
- Cannot get video stream for %1
- Ne mogu naÄi video stream za %1
-
-
-
- Network error: %1 for %2
- Greška mreže: %1 za %2
-
-
-
- YTRegions
-
-
- Algeria
-
-
-
-
- Argentina
-
-
-
-
- Australia
-
-
-
-
- Belgium
-
-
-
-
- Brazil
-
-
-
-
- Canada
-
-
-
-
- Chile
-
-
-
-
- Colombia
-
-
-
-
- Czech Republic
-
-
-
-
- Egypt
-
-
-
-
- France
-
-
-
-
- Germany
-
-
-
-
- Ghana
-
-
-
-
- Greece
-
-
-
-
- Hong Kong
-
-
-
-
- Hungary
-
-
-
-
- India
-
-
-
-
- Indonesia
-
-
-
-
- Ireland
-
-
-
-
- Israel
-
-
-
-
- Italy
-
-
-
-
- Japan
-
-
-
-
- Jordan
-
-
-
-
- Kenya
-
-
-
-
- Malaysia
-
-
-
-
- Mexico
-
-
-
-
- Morocco
-
-
-
-
- Netherlands
-
-
-
-
- New Zealand
-
-
-
-
- Nigeria
-
-
-
-
- Peru
-
-
-
-
- Philippines
-
-
-
-
- Poland
-
-
-
-
- Russia
-
-
-
-
- Saudi Arabia
-
-
-
-
- Singapore
-
-
-
-
- South Africa
-
-
-
-
- South Korea
-
-
-
-
- Spain
-
-
-
-
- Sweden
-
-
-
-
- Taiwan
-
-
-
-
- Tunisia
-
-
-
-
- Turkey
-
-
-
-
- Uganda
-
-
-
-
- United Arab Emirates
-
-
-
-
- United Kingdom
-
-
-
-
- Yemen
-
-
-
-
- Worldwide
-
-
-
-
\ No newline at end of file
diff --git a/locale/hu.ts b/locale/hu.ts
index b6390ac..285bfa6 100644
--- a/locale/hu.ts
+++ b/locale/hu.ts
@@ -134,6 +134,95 @@
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+ Rendezés
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Keresés
-
+
Find videos and channels by keyword
-
+ Videók és csatornák keresése kulcsszó alapján
-
+
Browse
Keresés
-
+
Browse videos by category
Videók keresése kategória szerint
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Hiba
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&LeállÃtás
-
+
Stop playback and go back to the search view
Lejátszás befejezése és visszatérés a keresés nézetre
-
+
S&kip
U&grás
-
+
Skip to the next video
Ugrás a következŠvideóra
-
-
+
+
&Pause
&MegállÃtás
-
-
+
+
Pause playback
Lejátszás megállÃtása
-
+
&Full Screen
&Teljes képernyÅ
-
+
Go full screen
Teljes képernyÅre váltás
-
+
Hide the playlist and the toolbar
Lejátszási lista és eszközsor elrejtése
-
+
Go to the YouTube video page and pause playback
Ugrás a YouTube videó oldalára és a lejátszás megállÃtása
-
+
Copy the current video YouTube link to the clipboard
Az aktuális videó Youtube &hivatkozásának másolása a vágólapra
-
+
Copy the current video stream URL to the clipboard
Az aktuális videó adatfolyam URL cÃmének másolása a vágólapra
-
+
Find other video parts hopefully in the right order
További videórészletek keresése remélhetÅleg helyes sorrendben
-
+
&Remove
&EltávolÃtás
-
+
Remove the selected videos from the playlist
Kijelölt videók eltávolÃtása a lejátszási listáról
-
+
Move &Up
Mozgatás &felfelé
-
+
Move up the selected videos in the playlist
Kijelölt videók mozgatása felfelé a lejátszási listában
-
+
Move &Down
Mozgatás &lefelé
-
+
Move down the selected videos in the playlist
Kijelölt videók mozgatása lefelé a lejátszási listában
-
+
Clear the search history. Cannot be undone.
Keresési elÅzmények törlése. Nem vonható vissza.
-
+
&Quit
&Kilépés
-
+
Bye
Viszlát
-
+
&Website
&Webhely
-
+
%1 on the Web
%1 a weben
-
+
Please support the continued development of %1
Támogassa a %1 program folyamatos fejlesztését
-
+
&About
&Névjegy
-
+
Info about %1
Információ a %1 programról
-
+
Search
Keresés
-
+
Mute volume
HangerÅ némÃtása
-
-
+
+
&Downloads
&Letöltések
-
+
Show details about video downloads
A videóletöltések részleteinek megjelenÃtése
-
+
&Download
&Letöltés
-
+
Download the current video
Aktuális videó letöltése
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
Aktuális videó megosztása a következÅvel: %1
-
+
&Email
&Email
-
+
Email
Email
-
+
&Close
&Bezárás
-
+
&Float on Top
&Többi ablak fölött
-
+
&Stop After This Video
&Videó után leállÃtás
-
+
&Report an Issue...
&Hiba bejelentése
-
+
&Refine Search...
&Keresés pontosÃtása
-
+
More...
-
+
&Related Videos
-
+
Watch videos related to the current one
-
+
&Application
&Alkalmazás
-
+
Buy %1...
%1 megvásárlása...
-
+
&Playback
&Lejátszás
-
+
&Playlist
&Lejátszási lista
-
+
&Video
&Videó
-
+
&View
&Megtekintés
-
+
&Share
&Megosztás
-
+
&Help
&Súgó
-
+
Press %1 to raise the volume, %2 to lower it
HangerŠnövelése: %1, hangerŠcsökkentése: %2
-
-
+
+
Opening %1
%1 megnyitása
-
+
Do you want to exit %1 with a download in progress?
Szeretne kilépni a %1 programból letöltés közben?
-
+
If you close %1 now, this download will be cancelled.
Ha bezárja a %1 programot, a letöltés megszakad.
-
+
Close and cancel download
Bezárás és letöltés megszakÃtása
-
+
Wait for download to finish
A letöltés befejezÅdésének megvárása
-
+
Leave &Full Screen
Kilépés a &teljes képernyÅs módból
-
+
%1 version %2 is now available.
A %1 program %2 verziója elérhetÅ.
-
+
Remind me later
Figyelmeztetés késÅbb
-
+
Update
FrissÃtés
-
+
Error: %1
Hiba: %1
-
+
P&revious
&ElÅzÅ
-
+
Go back to the previous track
Ugrás az elÅzÅ számra
-
+
&Compact Mode
&Kompaktmód
-
+
Open the &YouTube Page
&YouTube oldal megnyitása
-
+
Copy the YouTube &Link
YouTube &hivatkozás másolása
-
+
Copy the Video Stream &URL
&Videó-URL másolása
-
+
Find Video &Parts
További videó&részletek keresése
-
+
&Clear Recent Searches
&Legutóbbi keresések törlése
-
+
Make a &Donation
&Támogasd
-
+
&Manually Start Playing
&Manuális lejátszás
-
+
Manually start playing videos
Videók lejátszása manuális indÃtással
-
+
Choose your content location
-
+
&Play
&Lejátszás
-
+
Resume playback
Lejátszás folytatása
-
+
Remaining time: %1
HátralévÅ idÅ: %1
-
+
Volume at %1%
HangerÅ: %1%
-
+
Volume is muted
HangerÅ némÃtva
-
+
Volume is unmuted
HangerÅ némÃtása feloldva
-
+
Maximum video definition set to %1
Videók maximális felbontásának beállÃtása: %1
-
+
Your privacy is now safe
A személyes adatok most már biztonságban vannak
-
+
Downloads complete
A letöltések befejezÅdtek
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
A YouTube hivatkozás most már beilleszthetŠegy másik alkalmazásba
-
+
You can now paste the video stream URL into another application
Most már beillesztheti a videó adatfolyam URL cÃmét egy másik alkalmazásba
-
+
The link will be valid only for a limited time.
A hivatkozás csak korlátozott ideig lesz érvényben.
-
+
This is just the demo version of %1.
Ez csak a demó verziója a %1 programnak.
-
+
It allows you to test the application and see if it works for you.
Kipróbálhatja az alkalmazást, hogy megfelel-e az igényeinek.
-
+
Continue
Folytatás
-
+
of
Used in video parts, as in '2 of 3'
-
-
+
part
This is for video parts, as in 'Cool video - part 1'
rész
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
epizód
-
+
Sent from %1
A %1 programból küldve
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
Teljes verzió beszerzése
-
+
Downloading %1
Letöltés: %1
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 nézÅ
-
+
%1 of %2 (%3) â %4
%1 %2 közül (%3) â %4
-
+
Preparing
ElÅkészÃtés
-
+
Failed
Hiba
-
+
Completed
Sikeres befejezés
-
+
Stopped
LeállÃtva
-
+
Stop downloading
Letöltés leállÃtása
-
+
Show in %1
MegjelenÃtés a következÅben: %1
-
+
Open parent folder
-
+ SzülÅmappa megnyitása
-
+
Restart downloading
Letöltés újraindÃtása
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Ãdvözli a <a href='%1'>%2</a> program,
-
+
Get the full version
Teljes verzió beszerzése
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Ãrjon be
-
+
a keyword
egy kulcsszót
-
+
a channel
egy csatornát
-
+
to start watching videos.
a videók megtekintéséhez.
-
+
Watch
Megtekintés
-
+
Recent keywords
Legutóbbi kulcsszavak
-
+
Recent channels
Legutóbbi csatornák
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
&Vissza
@@ -1196,11 +1310,6 @@
Most Popular
Legnépszerübb
-
-
- Featured
- Kiemelt
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
Nem található videó adatfolyam a következÅhöz: %1
-
+
Network error: %1 for %2
Hálózati hiba: %1 a következÅhöz: %2
diff --git a/locale/ia.ts b/locale/ia.ts
index 89959d5..1a85f2c 100644
--- a/locale/ia.ts
+++ b/locale/ia.ts
@@ -134,6 +134,95 @@
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+ Ordinar per
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Cercar
-
+
Find videos and channels by keyword
-
+
Browse
-
+
Browse videos by category
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Error
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Stop
-
+
Stop playback and go back to the search view
Stoppar le reproduction e vader retro al vista de cercas
-
+
S&kip
S&altar
-
+
Skip to the next video
Saltar al proxime video
-
-
+
+
&Pause
&Pausa
-
-
+
+
Pause playback
Pausar le reproduction
-
+
&Full Screen
&Schermo plen
-
+
Go full screen
Vader a schermo plen
-
+
Hide the playlist and the toolbar
Celar le lista de reproduction e le barra de utensiles
-
+
Go to the YouTube video page and pause playback
Vader al pagina de videos de YouTube e pausa le reproduction
-
+
Copy the current video YouTube link to the clipboard
Copiar le actual &ligamine de video YouTube al area de transferentia
-
+
Copy the current video stream URL to the clipboard
Copiar le currente URL de fluxo de video al area de transferentia
-
+
Find other video parts hopefully in the right order
-
+
&Remove
&Remover
-
+
Remove the selected videos from the playlist
Remover le videos seligite del lista de reproduction
-
+
Move &Up
Mover in &alto
-
+
Move up the selected videos in the playlist
Mover le videos seligite del lista de reproduction in alto
-
+
Move &Down
Mover a &basso
-
+
Move down the selected videos in the playlist
Mover le videos seligite del lista de reproduction a basso
-
+
Clear the search history. Cannot be undone.
Mundar le historia de recerca. Isto non pote ser disfacite.
-
+
&Quit
&Quitar
-
+
Bye
Adeo
-
+
&Website
Sito &web
-
+
%1 on the Web
%1 in le web
-
+
Please support the continued development of %1
Supporta le developpamento continue de %1, per favor
-
+
&About
&Super
-
+
Info about %1
Info super %1
-
+
Search
Cercar
-
+
Mute volume
Sin sono
-
-
+
+
&Downloads
&Discargas
-
+
Show details about video downloads
Monstrar detalios super le discargas de videos
-
+
&Download
&Discarga
-
+
Download the current video
Discarga le video actual
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
Compartir le video currente usante %1
-
+
&Email
&E-posta
-
+
Email
E-posta
-
+
&Close
&Clauder
-
+
&Float on Top
&Flottar in alto
-
+
&Stop After This Video
&Stoppar depost de iste video
-
+
&Report an Issue...
&Reportar un problema...
-
+
&Refine Search...
&Affinar le cerca...
-
+
More...
Plus...
-
+
&Related Videos
-
+
Watch videos related to the current one
-
+
&Application
&Application
-
+
Buy %1...
Comprar %1...
-
+
&Playback
&Reproduction
-
+
&Playlist
Lista de re&production
-
+
&Video
&Video
-
+
&View
&Vider
-
+
&Share
&Compartir
-
+
&Help
&Adjuta
-
+
Press %1 to raise the volume, %2 to lower it
Preme %1 pro augmentar le sono, %2 pro bassar lo
-
-
+
+
Opening %1
A aperir %1
-
+
Do you want to exit %1 with a download in progress?
Esque tu vole sortir de %1 con un discarga in progresso?
-
+
If you close %1 now, this download will be cancelled.
Si tu claude %1 ora, le discarga essera cancellate.
-
+
Close and cancel download
Claude e cancella le discarga
-
+
Wait for download to finish
Attende que le discarga fini
-
+
Leave &Full Screen
Quita le &schermo plen
-
+
%1 version %2 is now available.
%1 version %2 es ora disponibile.
-
+
Remind me later
Rememora me plus tarde
-
+
Update
Actualisar
-
+
Error: %1
Error: %1
-
+
P&revious
P&revie
-
+
Go back to the previous track
Retroceder al tracia previe
-
+
&Compact Mode
&Modo compacte
-
+
Open the &YouTube Page
Aperir le pagina de &YouTube
-
+
Copy the YouTube &Link
Copiar le &ligamine de YouTube
-
+
Copy the Video Stream &URL
Copiar le &URL de fluxo de video
-
+
Find Video &Parts
Cercar &partes de video
-
+
&Clear Recent Searches
&Mundar le recercas recente
-
+
Make a &Donation
Face un &donation
-
+
&Manually Start Playing
Initiar le reproduction &manualmente
-
+
Manually start playing videos
Initiar manualmente le reproduction de videos
-
+
Choose your content location
Selige le loco de contento
-
+
&Play
Re&producer
-
+
Resume playback
Resumer reproduction
-
+
Remaining time: %1
Tempore restante: %1
-
+
Volume at %1%
Volumine a %1%
-
+
Volume is muted
Sin sono
-
+
Volume is unmuted
Con sono
-
+
Maximum video definition set to %1
Definition maxime de video: %1
-
+
Your privacy is now safe
Ora tu intimitate es secur
-
+
Downloads complete
Discargas complete
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Ora tu pote collar le ligamine de YouTube in un in altere application
-
+
You can now paste the video stream URL into another application
Ora tu pote collar le URL de fluxo de video in un altere application
-
+
The link will be valid only for a limited time.
Le ligamine essera valide solmente durante un tempore limitate.
-
+
This is just the demo version of %1.
Isto es solmente le version demo de %1.
-
+
It allows you to test the application and see if it works for you.
Isto permitte testar le application e vider si illo functiona.
-
+
Continue
Continuar
-
+
of
Used in video parts, as in '2 of 3'
de
-
+
part
This is for video parts, as in 'Cool video - part 1'
parte
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
episodio
-
+
Sent from %1
Inviate ab %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
Procura le version complete
-
+
Downloading %1
A discargar %1
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 visualisationes
-
+
%1 of %2 (%3) â %4
-
+
Preparing
-
+
Failed
Fallite
-
+
Completed
-
+
Stopped
-
+
Stop downloading
Stoppar le discarga
-
+
Show in %1
Monstrar in %1
-
+
Open parent folder
-
+
Restart downloading
Recomenciar le discarga
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Benvenite a <a href='%1'>%2</a>,
-
+
Get the full version
Procura le version complete
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Scriber
-
+
a keyword
una parola clave
-
+
a channel
un canal
-
+
to start watching videos.
pro comenciar a reguardar le videos.
-
+
Watch
Reguardar
-
+
Recent keywords
Parolas-clave recente
-
+
Recent channels
Canales recente
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
&Retro
@@ -1196,11 +1310,6 @@
Most Popular
-
-
- Featured
-
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
Le fluxo de video pro %1 non pote ser obtenite
-
+
Network error: %1 for %2
Error de rete: %1 pro %2
diff --git a/locale/it.ts b/locale/it.ts
index 14f3919..d53b3c9 100644
--- a/locale/it.ts
+++ b/locale/it.ts
@@ -134,6 +134,95 @@
Compra una licenza
+
+ ChannelAggregator
+
+
+ By %1
+ Di %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Tutti i video
+
+
+
+ Unwatched Videos
+ Video non visti
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Segna tutti come già visti
+
+
+
+ Show Updated
+ Mostra aggiornati
+
+
+
+ Name
+ Nome
+
+
+
+ Last Updated
+ Aggiornamento
+
+
+
+ Last Added
+ Iscrizione
+
+
+
+ Last Watched
+ Visione
+
+
+
+ Most Watched
+ Più visti
+
+
+
+ Sort by
+ Ordina per
+
+
+
+ All Videos
+ Tutti i video
+
+
+
+ Unwatched Videos
+ Video non visti
+
+
+
+ There are no updated subscriptions at this time.
+ Non ci sono iscrizioni aggiornate in questo momento.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Non hai iscrizioni. Usa il simbolo della stella per sottoscrivere i canali.
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Ricerca
-
+
Find videos and channels by keyword
Trova video e canali per parola chiave
-
+
Browse
Sfoglia
-
+
Browse videos by category
Sfoglia i video per categoria
+
+
+ Subscriptions
+ Iscrizioni
+
+
+
+ Channel subscriptions
+ Iscrizioni ai canali
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Errore
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Ferma
-
+
Stop playback and go back to the search view
Ferma il video e torna alla ricerca
-
+
S&kip
&Salta
-
+
Skip to the next video
Salta al prossimo video
-
-
+
+
&Pause
&Pausa
-
-
+
+
Pause playback
Metti in pausa
-
+
&Full Screen
&Schermo intero
-
+
Go full screen
Vai in modalità schermo intero
-
+
Hide the playlist and the toolbar
Nascondi la playlist e la barra degli strumenti
-
+
Go to the YouTube video page and pause playback
Vai su YouTube e metti in pausa
-
+
Copy the current video YouTube link to the clipboard
Copia negli appunti il link a YouTube per il video corrente
-
+
Copy the current video stream URL to the clipboard
Copia negli appunti la URL dello stream per il video corrente
-
+
Find other video parts hopefully in the right order
Trova le parti mancanti di questo video
-
+
&Remove
&Elimina
-
+
Remove the selected videos from the playlist
Elimina i video selezionati dalla playlist
-
+
Move &Up
Sposta &sopra
-
+
Move up the selected videos in the playlist
Sposta video selezionati verso l'alto
-
+
Move &Down
Sposta so&tto
-
+
Move down the selected videos in the playlist
Sposta i video selezionati verso il basso
-
+
Clear the search history. Cannot be undone.
Cancella le ultime ricerche. L'azione non potrà essere annullata.
-
+
&Quit
&Esci
-
+
Bye
Ciao
-
+
&Website
Sito &web
-
+
%1 on the Web
%1 sul Web
-
+
Please support the continued development of %1
Supporta lo sviluppo di %1
-
+
&About
&Informazioni
-
+
Info about %1
Informazioni su %1
-
+
Search
Cerca
-
+
Mute volume
Disattiva l'audio
-
-
+
+
&Downloads
&Download
-
+
Show details about video downloads
Mostra informazioni sui download
-
+
&Download
&Download
-
+
Download the current video
Scarica il video corrente
-
+
+ &Subscribe to Channel
+ &Iscriviti al canale
+
+
+
Share the current video using %1
Condividi il video corrente usando %1
-
+
&Email
&Email
-
+
Email
Email
-
+
&Close
&Chiudi
-
+
&Float on Top
&Fluttua in alto
-
+
&Stop After This Video
&Ferma dopo questo video
-
+
&Report an Issue...
&Segnala un problema...
-
+
&Refine Search...
&Raffina la ricerca...
-
+
More...
Altro...
-
+
&Related Videos
Video &correlati
-
+
Watch videos related to the current one
Guarda i video correlati a quello corrente
-
+
&Application
&Applicazione
-
+
Buy %1...
Compra %1...
-
+
&Playback
&Riproduzione
-
+
&Playlist
&Playlist
-
+
&Video
&Video
-
+
&View
&Visualizza
-
+
&Share
&Condividi
-
+
&Help
&Aiuto
-
+
Press %1 to raise the volume, %2 to lower it
Premi %1 per alzare il volume, %2 per abbassarlo
-
-
+
+
Opening %1
Apertura di %1
-
+
Do you want to exit %1 with a download in progress?
Vuoi uscire da %1 con un download in corso?
-
+
If you close %1 now, this download will be cancelled.
Se chiudi %1 adesso, i download verranno annullati.
-
+
Close and cancel download
Chiudi e annulla i download
-
+
Wait for download to finish
Aspetta che i download siano completi
-
+
Leave &Full Screen
Lascia lo &schermo intero
-
+
%1 version %2 is now available.
E' disponibile %1 versione %2
-
+
Remind me later
Ricordamelo più tardi
-
+
Update
Aggiorna
-
+
Error: %1
Errore: %1
-
+
P&revious
P&recedente
-
+
Go back to the previous track
Torna alla traccia precedente
-
+
&Compact Mode
Modalità &compatta
-
+
Open the &YouTube Page
Apri la pagina di &YouTube
-
+
Copy the YouTube &Link
Copia il &link a YouTube
-
+
Copy the Video Stream &URL
Copia la &URL dello stream video
-
+
Find Video &Parts
Trova le &parti del video
-
+
&Clear Recent Searches
&Cancella le ultime ricerche
-
+
Make a &Donation
Fai una &donazione
-
+
&Manually Start Playing
Riproduzione &manuale
-
+
Manually start playing videos
Inizia a riprodurre i video manualmente
-
+
Choose your content location
Scegli la località dei contenuti
-
+
&Play
&Play
-
+
Resume playback
Continua
-
+
Remaining time: %1
Tempo rimanente: %1
-
+
Volume at %1%
Volume al %1%
-
+
Volume is muted
Audio disattivato
-
+
Volume is unmuted
Audio attivato
-
+
Maximum video definition set to %1
La definizione video massima è impostata a %1
-
+
Your privacy is now safe
La tua privacy è al sicuro
-
+
Downloads complete
I download sono completi
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Ora puoi incollare il link a YouTube in un'altra applicazione
-
+
You can now paste the video stream URL into another application
Ora puoi incollare la URL dello stream in un'altra applicazione
-
+
The link will be valid only for a limited time.
Il link rimarrà valido per un periodo di tempo limitato.
-
+
This is just the demo version of %1.
Questa è solo la versione demo di %1.
-
+
It allows you to test the application and see if it works for you.
Ti permette di testare l'applicazione e verificare che funzioni sul tuo computer.
-
+
Continue
Continua
-
+
of
Used in video parts, as in '2 of 3'
di
-
+
part
This is for video parts, as in 'Cool video - part 1'
parte
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
episodio
-
+
Sent from %1
Inviato da %1
-
+
+ Unsubscribe from %1
+ Annulla iscrizione a %1
+
+
+
+ Subscribe to %1
+ Iscriviti a %1
+
+
+
Get the full version
Compra la versione completa
-
+
Downloading %1
Scarica in: %1
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 visualizzazioni
-
+
%1 of %2 (%3) â %4
%1 di %2 (%3) â %4
-
+
Preparing
In preparazione
-
+
Failed
Fallito
-
+
Completed
Completato
-
+
Stopped
Fermo
-
+
Stop downloading
Interrompi il download
-
+
Show in %1
Mostra nel %1
-
+
Open parent folder
Mostra nella cartella
-
+
Restart downloading
Prova a scaricare di nuovo
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Benvenuto su <a href="%1">%2</a>,
-
+
Get the full version
Compra la versione completa
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Scrivi
-
+
a keyword
una parola chiave
-
+
a channel
un canale
-
+
to start watching videos.
per iniziare a guardare i video.
-
+
Watch
Guarda
-
+
Recent keywords
Ultime ricerche
-
+
Recent channels
Ultimi canali
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
&Indietro
@@ -1196,11 +1310,6 @@
Most Popular
Più popolari
-
-
- Featured
- In primo piano
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
Più votati
+
+
+ All Time Popular
+ Più popolari di sempre
+
Video
-
+
Cannot get video stream for %1
Impossibile ottenere il flusso video per %1
-
+
Network error: %1 for %2
Errore di rete: %1 per %2
diff --git a/locale/ja_JP.ts b/locale/ja_JP.ts
index baddef2..f54b370 100644
--- a/locale/ja_JP.ts
+++ b/locale/ja_JP.ts
@@ -134,6 +134,95 @@
ã©ã¤ã»ã³ã¹ãè³¼å
¥
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
æ¤ç´¢
-
+
Find videos and channels by keyword
-
+
Browse
-
+
Browse videos by category
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
ã¨ã©ã¼
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
ã¹ããã(&S)
-
+
Stop playback and go back to the search view
åçãåæ¢ããã¦ãæ¤ç´¢ãã¥ã¼ã«æ»ãã¾ã
-
+
S&kip
ã¹ããã(&k)
-
+
Skip to the next video
次ã®åç»ã¸
-
-
+
+
&Pause
ä¸æåæ¢(&P)
-
-
+
+
Pause playback
åçãä¸æåæ¢ãã¾ã
-
+
&Full Screen
ãã«ã¹ã¯ãªã¼ã³(&F)
-
+
Go full screen
ãã«ã¹ã¯ãªã¼ã³
-
+
Hide the playlist and the toolbar
ãã¬ã¤ãªã¹ãã¨ãã¼ã«ãã¼ãé ã
-
+
Go to the YouTube video page and pause playback
ä¸æåæ¢ãã¦YouTubeã®ãã¼ã¸ãéãã¾ã
-
+
Copy the current video YouTube link to the clipboard
ãã®ãããªã®YouTubeãã¼ã¸ã¸ã®ãªã³ã¯ãã¯ãªãããã¼ãã«ã³ãã¼ãã¾ã
-
+
Copy the current video stream URL to the clipboard
-
+
Find other video parts hopefully in the right order
-
+
&Remove
åé¤(&R)
-
+
Remove the selected videos from the playlist
ãã¬ã¤ãªã¹ãããé¸æããåç»ãåé¤
-
+
Move &Up
ä¸ã¸(&U)
-
+
Move up the selected videos in the playlist
é¸æããåç»ããã¬ã¤ãªã¹ãå
ã§ä¸ã¸ç§»åããã¾ã
-
+
Move &Down
ä¸ã¸(&D)
-
+
Move down the selected videos in the playlist
é¸æããåç»ããã¬ã¤ãªã¹ãå
ã§ä¸ã¸ç§»åããã¾ã
-
+
Clear the search history. Cannot be undone.
æ¤ç´¢å±¥æ´ãåé¤ãã¾ããåãæ¶ãã¯åºæ¥ã¾ããã
-
+
&Quit
çµäº(&Q)
-
+
Bye
ããã°ã©ã ãçµäº
-
+
&Website
&Webãã¼ã¸ã¸
-
+
%1 on the Web
%1ã®Webãã¼ã¸ãéãã¾ã
-
+
Please support the continued development of %1
%1ã®éçºããµãã¼ããã¦ãã ããï¼
-
+
&About
ããã°ã©ã ã«ã¤ãã¦(&A)
-
+
Info about %1
%1ã«ã¤ãã¦
-
+
Search
æ¤ç´¢
-
+
Mute volume
ãã¥ã¼ãã«ãã
-
-
+
+
&Downloads
ãã¦ã³ãã¼ã(&D)
-
+
Show details about video downloads
-
+
&Download
ãã¦ã³ãã¼ã(&D)
-
+
Download the current video
+ ç¾å¨ã®åç»ããã¦ã³ãã¼ã
+
+
+
+ &Subscribe to Channel
-
+
Share the current video using %1
-
+
&Email
ã¡ã¼ã«(&E)
-
+
Email
ã¡ã¼ã«
-
+
&Close
éãã(&C)
-
+
&Float on Top
-
+
&Stop After This Video
-
+
&Report an Issue...
åé¡ç¹ãå ±å(&R)...
-
+
&Refine Search...
-
+
More...
-
+ ãã®ä»...
-
+
&Related Videos
-
+
Watch videos related to the current one
-
+
&Application
ã¢ããªã±ã¼ã·ã§ã³(&A)
-
+
Buy %1...
%1 ãè³¼å
¥...
-
+
&Playback
-
+ åç(&P)
-
+
&Playlist
ãã¬ã¤ãªã¹ã(&P)
-
+
&Video
åç»(&V)
-
+
&View
表示(&V)
-
+
&Share
å
±æ(&S)
-
+
&Help
ãã«ã(&H)
-
+
Press %1 to raise the volume, %2 to lower it
é³éãä¸ããã«ã¯%1ããä¸ããã«ã¯%2ãæ¼ãã¦ãã ãã
-
-
+
+
Opening %1
%1ãéãã¦ãã¾ã
-
+
Do you want to exit %1 with a download in progress?
-
+
If you close %1 now, this download will be cancelled.
-
+
Close and cancel download
-
+ éãã¦ãã¦ã³ãã¼ãããã£ã³ã»ã«
-
+
Wait for download to finish
-
+
Leave &Full Screen
ãã«ã¹ã¯ãªã¼ã³ã¢ã¼ããçµäºãã(&F)
-
+
%1 version %2 is now available.
%1 ãã¼ã¸ã§ã³ %2 ãå©ç¨å¯è½ã§ã
-
+
Remind me later
ãã¨ã§éç¥ãã
-
+
Update
æ´æ°
-
+
Error: %1
ã¨ã©ã¼: %1
-
+
P&revious
åã¸(&R)
-
+
Go back to the previous track
åã®æ²ã¸é£ã³ã¾ã
-
+
&Compact Mode
ã³ã³ãã¯ã ã¢ã¼ã(&C)
-
+
Open the &YouTube Page
YouTube ã®ãã¼ã¸ãéã(&Y)
-
+
Copy the YouTube &Link
YouTube ã®ãªã³ã¯ãã³ãã¼(&L)
-
+
Copy the Video Stream &URL
-
+
Find Video &Parts
-
+
&Clear Recent Searches
æè¿ã®æ¤ç´¢ãæ¶å»(&C)
-
+
Make a &Donation
å¯ä»ãã(&D)
-
+
&Manually Start Playing
-
+
Manually start playing videos
-
+
Choose your content location
-
+
&Play
åç(&P)
-
+
Resume playback
åçåéãã¾ã
-
+
Remaining time: %1
æ®ãæé: %1
-
+
Volume at %1%
ããªã¥ã¼ã %1%
-
+
Volume is muted
é³éOFFã«ãã¾ãã
-
+
Volume is unmuted
é³éONã«ãã¾ãã
-
+
Maximum video definition set to %1
-
+
Your privacy is now safe
ãã©ã¤ãã·ã¼ã¯ä¿è·ããã¦ãã¾ã
-
+
Downloads complete
ãã¦ã³ãã¼ãå®äº
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
YouTube ã®ãªã³ã¯ãå¥ã®ã¢ããªã±ã¼ã·ã§ã³ã«è²¼ãä»ãããã¨ãã§ãã¾ã
-
+
You can now paste the video stream URL into another application
-
+
The link will be valid only for a limited time.
-
+
This is just the demo version of %1.
ãã㯠%1 ã®è©¦ç¨çã§ãã
-
+
It allows you to test the application and see if it works for you.
ã¢ããªã±ã¼ã·ã§ã³ã®ãã¹ããåä½ç¢ºèªã«ãå©ç¨ããã ãã¾ãã
-
+
Continue
ç¶ãã
-
+
of
Used in video parts, as in '2 of 3'
-
+
part
This is for video parts, as in 'Cool video - part 1'
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
-
+
Sent from %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
製åçãå
¥æããã
-
+
Downloading %1
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1å é²è¦§
-
+
%1 of %2 (%3) â %4
-
+
Preparing
-
+
Failed
失æ
-
+
Completed
å®äº
-
+
Stopped
-
+
Stop downloading
ãã¦ã³ãã¼ããåæ¢
-
+
Show in %1
-
+
Open parent folder
親ãã©ã«ãã¼ãéã
-
+
Restart downloading
@@ -1023,12 +1137,12 @@
7 Days
-
+ 7æ¥é
30 Days
-
+ 30æ¥é
@@ -1059,17 +1173,17 @@
Less than 4 minutes
-
+ 4å以ä¸
Between 4 and 20 minutes
-
+ 4ï½20å
Longer than 20 minutes
-
+ 20åè¶
@@ -1089,7 +1203,7 @@
Done
-
+ å®äº
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
ãããã<a href='%1'>%2</a>ã¸ï¼
-
+
Get the full version
製åçãå
¥æããã
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
-
+
a keyword
-
+
a channel
-
+
to start watching videos.
-
+
Watch
æ¤ç´¢
-
+
Recent keywords
æè¿æ¤ç´¢ãããã¼ã¯ã¼ã
-
+
Recent channels
æè¿ã®ãã£ã³ãã«
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
æ»ã(&B)
@@ -1196,11 +1310,6 @@
Most Popular
-
-
- Featured
-
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
-
+
Network error: %1 for %2
ãããã¯ã¼ã¯ã¨ã©ã¼: %1 (%2ã¸ã®ã¢ã¯ã»ã¹ã«ã¦)
diff --git a/locale/jv.ts b/locale/jv.ts
deleted file mode 100644
index fe51334..0000000
--- a/locale/jv.ts
+++ /dev/null
@@ -1,1476 +0,0 @@
-
-UTF-8
-
- AboutView
-
-
- There's life outside the browser!
- Ningkene yoiku urip ning njobone browser!
-
-
-
- Version %1
- Versi %1
-
-
-
- Licensed to: %1
-
-
-
-
- %1 is Free Software but its development takes precious time.
- %1 yoiku Software bebas tapi pangembangane iku mbutuhake wektu sing berhargo.
-
-
-
- Please <a href='%1'>donate</a> to support the continued development of %2.
- Sumonggo <a href='%1'>Nyumbang</a> kanggo ndukung kelanjutane pangembangane seko %2.
-
-
-
- You may want to try my other apps as well:
- Njenengan mungkinwae pingin nyobi aplikasiku liyane jua:
-
-
-
- %1, a YouTube music player
- %1, sakwijining YouTube nggonyetel musik
-
-
-
- %1, a music player
- %1, sakwijining penyetelan musik
-
-
-
- Translate %1 to your native language using %2
- Terjemahke %1 ring boso aslimu gunakno %2
-
-
-
- Icon designed by %1.
- Ndesain ikon oleh %1.
-
-
-
- Released under the <a href='%1'>GNU General Public License</a>
- Dirilis nok ngisore the <a href='%1'>GNU Pusate Lisensine Publik</a>
-
-
-
- &Close
- &Tutup
-
-
-
- About
- Seputarane
-
-
-
- What you always wanted to know about %1 and never dared to ask
- Opo sing kowe slalu kepingin kanggo ngreteni sekitarane %1 lan oratau wani kanggo takon
-
-
-
- ActivationDialog
-
-
- Enter your License Details
-
-
-
-
- &Email:
-
-
-
-
- &Code:
-
-
-
-
- ActivationView
-
-
- Please license %1
- Sumonggo lisensi %1
-
-
-
- This demo has expired.
- Iki demo yo wis enthek.
-
-
-
- The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
-
-
-
- Without a license, the application will expire in %1 days.
-
-
-
-
- By purchasing the full version, you will also support the hard work I put into creating %1.
- Thek tuku versi lengkap, njenengan pingin ugo kadukung karo kerjokeras Kulo dalehi ing njeroning kreasi %1.
-
-
-
- Use Demo
- Gunakke Demo
-
-
-
- Enter License
-
-
-
-
- Buy License
-
-
-
-
- ClearButton
-
-
- Clear
- Resik
-
-
-
- DownloadItem
-
-
- bytes
- bit
-
-
-
- KB
- KB
-
-
-
- MB
- MB
-
-
-
- bytes/sec
- bit/detik
-
-
-
- KB/sec
- KB/detik
-
-
-
- MB/sec
- MB/detik
-
-
-
- seconds
- detik
-
-
-
- minutes
- menit
-
-
-
- %4 %5 remaining
- %4 %5 sisone
-
-
-
- DownloadManager
-
-
- This is just the demo version of %1.
- Iki yoiku mung versi demo seko %1.
-
-
-
- It can only download videos shorter than %1 minutes so you can test the download functionality.
- Iku isone mung ngunduh video sing cekak sekokaro %1 menit sahinggo kowe iso ngetest fungsinane unduhane.
-
-
-
- Continue
- Terusno
-
-
-
- Get the full version
- Enthukno versi komplite
-
-
-
- %1 downloaded in %2
- %1 ngunduhe ing %2
-
-
-
- Download finished
- Ngunduhe wislebar
-
-
-
- %n Download(s)
- %n Ngunduh-unduh(s) %n Ngunduh(s)
-
-
-
- DownloadSettings
-
-
- Change location...
- ngGanti lokasi...
-
-
-
- Choose the download location
- Mileho lokasine unduhan
-
-
-
- Download location changed.
- Lokasi ngunduhe diganti.
-
-
-
- Current downloads will still go in the previous location.
- Downloadte sing sakiki iseh arep mlebu ning lokasi sakdurunge.
-
-
-
- Downloading to: %1
- Ngunduhi reng: %1
-
-
-
- DownloadView
-
-
-
- Downloads
- Ngunduh-unduh
-
-
-
- DownloadWidget
-
-
- Downloading update...
-
-
-
-
- GlobalShortcuts
-
-
- Play
- Nyetel
-
-
-
- Pause
- Lheren sedelhok
-
-
-
- Play/Pause
- Nyetel/Lheren
-
-
-
- Stop
- Mandhek
-
-
-
- Stop playing after current track
- Mandhek nyetele sakwise trek saat iki
-
-
-
- Next track
- Trek saklanjute
-
-
-
- Previous track
- Trek sakdurunge
-
-
-
- Increase volume
- Nambahake volume
-
-
-
- Decrease volume
- Ngurangi volume
-
-
-
- Mute
- Mbisu
-
-
-
- Seek forward
- Nyepetno mengarep
-
-
-
- Seek backward
- Nyepetno memburi
-
-
-
- HomeView
-
-
- Search
- Nelusuri
-
-
-
- Find videos and channels by keyword
-
-
-
-
- Browse
-
-
-
-
- Browse videos by category
-
-
-
-
- Make yourself comfortable
-
-
-
-
- LoadingWidget
-
-
- Error
- Error
-
-
-
- MainWindow
-
-
- &Stop
- &Mandheg
-
-
-
- Stop playback and go back to the search view
- Mandheg playback lan mbalik ning tampilan ngGo ngGoleki
-
-
-
- S&kip
- S&kip
-
-
-
- Skip to the next video
- Lewati reng video saklanjute
-
-
-
-
- &Pause
- &Lheren
-
-
-
-
- Pause playback
- Lheren sedhelok pemutarane
-
-
-
- &Full Screen
- &Layar Kebak
-
-
-
- Go full screen
- Ing Layar Kebak
-
-
-
- Hide the playlist and the toolbar
- Ndhelikno playlist lan toolbar
-
-
-
- Go to the YouTube video page and pause playback
- Lungo Ing halamane video YouTube land nglereni penyetelan
-
-
-
- Copy the current video YouTube link to the clipboard
- Njiplak link-nge video YouTube sing sakiki ning clipboard
-
-
-
- Copy the current video stream URL to the clipboard
- Njiplak video stream URL sing sakiki ning clipboard
-
-
-
- Find other video parts hopefully in the right order
- nggoleki seri video liyone diharapno ing order sing bener
-
-
-
- &Remove
- &ngGuwak
-
-
-
- Remove the selected videos from the playlist
- ngGuwak video sing diseleksi seko playlist
-
-
-
- Move &Up
- Mindah &Unggah
-
-
-
- Move up the selected videos in the playlist
- Mindahno menduwur video sing diseleksi ning playlistt
-
-
-
- Move &Down
- Mindah &Mudhun
-
-
-
- Move down the selected videos in the playlist
- Mindahno mengisor video sing diseleksi ning daftar-nyetel
-
-
-
- Clear the search history. Cannot be undone.
- Ngresiki riwayate penelusuran. Ora iso di balikake.
-
-
-
- &Quit
- &Medhal
-
-
-
- Bye
- Bye
-
-
-
- &Website
- &Website
-
-
-
- %1 on the Web
- %1 nok the Web
-
-
-
- Please support the continued development of %1
- Sumonggo ndukungo kelanjutane pangembangane seko %1
-
-
-
- &About
- &Tentange
-
-
-
- Info about %1
- Info sakitarane %1
-
-
-
- Search
- Nelusuri
-
-
-
- Mute volume
- mBisukno volumene
-
-
-
-
- &Downloads
- &nDownloads
-
-
-
- Show details about video downloads
- Tampilno detaile sak kitarane unduhan-unduhane video
-
-
-
- &Download
- &nDownload
-
-
-
- Download the current video
- Ngunduhi video sing saat iki
-
-
-
- Share the current video using %1
- ngeshare video ketuang keenggo %1
-
-
-
- &Email
- &Layanginternet
-
-
-
- Email
- Layanginternet
-
-
-
- &Close
- &Tutup
-
-
-
- &Float on Top
- &Ngambang ing Pucuk
-
-
-
- &Stop After This Video
- &Mandek Sakwise Video Iki
-
-
-
- &Report an Issue...
- &Laporke sakwijining Isu...
-
-
-
- &Refine Search...
- &Nyaring Penggolekan...
-
-
-
- More...
-
-
-
-
- &Related Videos
-
-
-
-
- Watch videos related to the current one
-
-
-
-
- &Application
- &Applikasi
-
-
-
- Buy %1...
- Tuku %1...
-
-
-
- &Playback
- &Mbaliknyetel
-
-
-
- &Playlist
- &Daftar-nyetel
-
-
-
- &Video
- &Video
-
-
-
- &View
- &nDelok
-
-
-
- &Share
- &Ngedumi
-
-
-
- &Help
- &Nulung
-
-
-
- Press %1 to raise the volume, %2 to lower it
- Pejhet %1 kanggo ningkatno volume, %2 kanggo ngrendahno iku
-
-
-
-
- Opening %1
- Mbukak'i %1
-
-
-
- Do you want to exit %1 with a download in progress?
- Opo kowe pingin metu %1 karo sakwijine unduhan sing isih mlaku prosese?
-
-
-
- If you close %1 now, this download will be cancelled.
- Tek kowe nutup %1 sakiki, ngunduhane iki arep dibatalake.
-
-
-
- Close and cancel download
- Tutup lan mbatalake ngunduhine
-
-
-
- Wait for download to finish
- Nunggu kanggo unduhane rampung
-
-
-
- Leave &Full Screen
- Ninggalno &LayarKebak
-
-
-
- %1 version %2 is now available.
- %1 versinipun %2 yo disediakno sakniki.
-
-
-
- Remind me later
- Elingno kulo mengkowae
-
-
-
- Update
- Nganyarke
-
-
-
- Error: %1
- Error: %1
-
-
-
- P&revious
- P&revious
-
-
-
- Go back to the previous track
- Mbaliko meneh ing sakdurunge trekipun
-
-
-
- &Compact Mode
- &Mode Praktis
-
-
-
- Open the &YouTube Page
- Mbukak &YouTube Halamane
-
-
-
- Copy the YouTube &Link
- Njiplak YouTube &Link
-
-
-
- Copy the Video Stream &URL
- Njiplak Video Stream &URL
-
-
-
- Find Video &Parts
- Nggoleki Video &Seri
-
-
-
- &Clear Recent Searches
- &Ngresiki Penggolekan Sing ketuang
-
-
-
- Make a &Donation
- Nggawe sakwijining &Sumbangan
-
-
-
- &Manually Start Playing
- &Mainke Secoro Manual
-
-
-
- Manually start playing videos
- Ngawiti maenke video secoro manual
-
-
-
- Choose your content location
-
-
-
-
- &Play
- &Nyetel
-
-
-
- Resume playback
- Nglanjutno nyetel-ulang
-
-
-
- Remaining time: %1
- Sisone wektune: %1
-
-
-
- Volume at %1%
- Volume nok %1%
-
-
-
- Volume is muted
- Volume yo Mbisu
-
-
-
- Volume is unmuted
- Volume yo orak mbisu
-
-
-
- Maximum video definition set to %1
- Maksimale video definisine diset ning %1
-
-
-
- Your privacy is now safe
- Privasimu yoiku sakiki aman
-
-
-
- Downloads complete
- Unduhane komplit
-
-
-
- MediaView
-
-
- You can now paste the YouTube link into another application
- Kowe iso paste YouTube link sakiki ninggone aplikasi liyane
-
-
-
- You can now paste the video stream URL into another application
- Kowe sakiki iso paste video stream URL ninggone aplikasi liyane
-
-
-
- The link will be valid only for a limited time.
- Link-nge kepingin diaslikake mung kanggo sak terbatase wektu.
-
-
-
- This is just the demo version of %1.
- Iki yoiku mung demo version of %1.
-
-
-
- It allows you to test the application and see if it works for you.
- Iki diolehno kowe kanggo ngetest aplikasine lan ndeloki tek iku fungsi kanggo kowe.
-
-
-
- Continue
- Nglanjutke
-
-
-
- of
- Used in video parts, as in '2 of 3'
- seko
-
-
-
- part
- This is for video parts, as in 'Cool video - part 1'
- seri
-
-
-
- episode
- This is for video parts, as in 'Cool series - episode 1'
- episode
-
-
-
- Sent from %1
- Kirim seko %1
-
-
-
- Get the full version
- Entukno versi komplite
-
-
-
- Downloading %1
- Ngunduhi %1
-
-
-
- MessageWidget
-
-
- A new version of %1 is available!
-
-
-
-
- %1 %2 is now available. You have %3.
-
-
-
-
- Would you like to download it now?
-
-
-
-
- Skip This Version
-
-
-
-
- Remind Me Later
-
-
-
-
- Install Update
-
-
-
-
- PasteLineEdit
-
-
- Paste
-
-
-
-
- PlaylistItemDelegate
-
-
- %1 views
- %1 tampilan
-
-
-
- %1 of %2 (%3) â %4
-
-
-
-
- Preparing
-
-
-
-
- Failed
-
-
-
-
- Completed
-
-
-
-
- Stopped
-
-
-
-
- Stop downloading
-
-
-
-
- Show in %1
-
-
-
-
- Open parent folder
-
-
-
-
- Restart downloading
-
-
-
-
- PlaylistModel
-
-
- Searching...
- ngGoleki...
-
-
-
- Show %1 More
-
-
-
-
- No videos
- Ora video
-
-
-
- No more videos
- Rak ono video meneh
-
-
-
- RefineSearchWidget
-
-
- Sort by
- Bidik didasarke
-
-
-
- Relevance
- Relefan
-
-
-
-
- Date
- Tanggale
-
-
-
- View Count
- Ndeloki Itungane
-
-
-
- Rating
- Rating
-
-
-
- Anytime
- Kapanwae
-
-
-
- Today
- Dinoiki
-
-
-
- 7 Days
- 7 Ndino
-
-
-
- 30 Days
- 30 Dino
-
-
-
- Duration
- Durasine
-
-
-
-
- All
- Kabeh
-
-
-
- Short
- Cekak
-
-
-
- Medium
- Sedengan
-
-
-
- Long
- Dowo
-
-
-
- Less than 4 minutes
- Kurang seko 4 menit
-
-
-
- Between 4 and 20 minutes
- Antarane 4 lan 20 menit
-
-
-
- Longer than 20 minutes
- Dowone luwih seko 20 menit
-
-
-
- Quality
- Kualitas
-
-
-
- High Definition
- Definisi duwur
-
-
-
- 720p or higher
- 720p utowo saknduwure
-
-
-
- Done
- Rampung
-
-
-
- RegionsView
-
-
- Done
-
-
-
-
- SearchLineEdit
-
-
- Search
- Nelusuri
-
-
-
- SearchView
-
-
- Welcome to <a href='%1'>%2</a>,
- Sugengrawuh kanggo <a href='%1'>%2</a>,
-
-
-
- Get the full version
- Enthukno versi komplite
-
-
-
- Enter
- "Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
- Lebokno
-
-
-
- a keyword
- sakwiji kata-kunci
-
-
-
- a channel
- sakwiji saluran
-
-
-
- to start watching videos.
- kanggo ngawiti nyeksikake video.
-
-
-
- Watch
- Nonton
-
-
-
- Recent keywords
- Kata-kunci saat iki
-
-
-
- Recent channels
- Saluran lagekwae
-
-
-
- SidebarHeader
-
-
-
- &Back
- &mBuri
-
-
-
- Forward to %1
-
-
-
-
- Back to %1
-
-
-
-
- SidebarWidget
-
-
- Refine Search
- Nyaring Penggolekane
-
-
-
- Did you mean: %1
- Opo sing bekmaksud: %1
-
-
-
- StandardFeedsView
-
-
- Most Popular
-
-
-
-
- Featured
-
-
-
-
- Most Shared
-
-
-
-
- Most Discussed
-
-
-
-
- Top Rated
-
-
-
-
- Video
-
-
- Cannot get video stream for %1
- Rak iso ngenthukno video stream kanggo %1
-
-
-
- Network error: %1 for %2
- Jaringane error: %1 por %2
-
-
-
- YTRegions
-
-
- Algeria
-
-
-
-
- Argentina
-
-
-
-
- Australia
-
-
-
-
- Belgium
-
-
-
-
- Brazil
-
-
-
-
- Canada
-
-
-
-
- Chile
-
-
-
-
- Colombia
-
-
-
-
- Czech Republic
-
-
-
-
- Egypt
-
-
-
-
- France
-
-
-
-
- Germany
-
-
-
-
- Ghana
-
-
-
-
- Greece
-
-
-
-
- Hong Kong
-
-
-
-
- Hungary
-
-
-
-
- India
-
-
-
-
- Indonesia
-
-
-
-
- Ireland
-
-
-
-
- Israel
-
-
-
-
- Italy
-
-
-
-
- Japan
-
-
-
-
- Jordan
-
-
-
-
- Kenya
-
-
-
-
- Malaysia
-
-
-
-
- Mexico
-
-
-
-
- Morocco
-
-
-
-
- Netherlands
-
-
-
-
- New Zealand
-
-
-
-
- Nigeria
-
-
-
-
- Peru
-
-
-
-
- Philippines
-
-
-
-
- Poland
-
-
-
-
- Russia
-
-
-
-
- Saudi Arabia
-
-
-
-
- Singapore
-
-
-
-
- South Africa
-
-
-
-
- South Korea
-
-
-
-
- Spain
-
-
-
-
- Sweden
-
-
-
-
- Taiwan
-
-
-
-
- Tunisia
-
-
-
-
- Turkey
-
-
-
-
- Uganda
-
-
-
-
- United Arab Emirates
-
-
-
-
- United Kingdom
-
-
-
-
- Yemen
-
-
-
-
- Worldwide
-
-
-
-
\ No newline at end of file
diff --git a/locale/ky.ts b/locale/ky.ts
index 873c2fd..dc51478 100644
--- a/locale/ky.ts
+++ b/locale/ky.ts
@@ -15,22 +15,22 @@
Licensed to: %1
- ÐиÑензиÑланган: %1
+ %1 Ò¯Ñүн лиÑензиÑланган
%1 is Free Software but its development takes precious time.
- %1 деген ÑÑкин ÐÐ, биÑок анÑн иÑÑеÑÒ¯Ò¯ÑÒ¯ Ó©ÑÓ© көп ÑбакÑÑÑÐ¼Ð´Ñ Ð°Ð»Ð°Ñ.
+ %1 â Ð±ÐµÐºÐµÑ Ð¿ÑогÑаммалÑк жабдÑк, биÑок анÑн иÑÑеÑÒ¯Ò¯ÑÒ¯ көп ÑбагÑÐ¼Ð´Ñ Ð°Ð»Ð°Ñ.
Please <a href='%1'>donate</a> to support the continued development of %2.
- Сизден Ó©Ñүнөм, %2'ка <a href='%1'>ÑаÑÑÑÑ ÐºÑлÑп</a> мÑндан аÑÐºÑ Ð¸ÑÑеÑÒ¯Ò¯Ñүн колдоп беÑиңиз .
+ %2'га <a href='%1'>ÑаÑÑÑÑ ÐºÑлÑп</a> мÑндан аÑÐºÑ Ð¸ÑÑеÑÒ¯Ò¯Ñүн колдоп беÑиңиз.
You may want to try my other apps as well:
- Сиз менин Ð´Ð°Ð³Ñ Ð±Ð°Ñка ÑиÑкемелеÑимди каÑап көÑÑөңүз болоÑ:
+ ÐаÑка ÑиÑкемелеÑимди да каÑап көÑÑөңүз болоÑ:
@@ -45,7 +45,7 @@
Translate %1 to your native language using %2
- %1'ÑÑ %2 аÑкÑлÑÑ Ñиздин Ñне Ñилиңизге коÑоÑÑÑ
+ %2 аÑкÑлÑÑ %1'Ð´Ñ Ó©Ð· Ñне Ñилиңизге коÑоÑÑÒ£Ñз
@@ -70,7 +70,7 @@
What you always wanted to know about %1 and never dared to ask
- %1 жөнүндө дайма билгиңиз келген неÑÑÐµÐ»ÐµÑ Ð¶Ð°Ð½Ð° ÑÑ ÑбакÑа алаÑÐ´Ñ ÑÑÑамак ÑмеÑÑиз
+ %1 жөнүндө дайÑма билгиңиз келген неÑÑÐµÐ»ÐµÑ Ð±Ð¸Ñок ÑÑÑаганга мүмкүнÑүлүгүңүз жок болгон
@@ -88,7 +88,7 @@
&Code:
- &Ðод:
+ &ÐодÑ:
@@ -106,17 +106,17 @@
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
- ТолÑк веÑÑиÑÑÑ %1 мүнөÑÑөн көбүÑөөк видеолоÑÐ´Ñ Ð¶Ò¯ÐºÑөгөнгө жана видеолоÑÐ´Ñ Ò¯Ð·Ð³Ò¯Ð»ÑүкÑүз көÑгөнгө ÑÑÑкÑÐ°Ñ Ð±ÐµÑеÑ.
+ ТолÑк веÑÑиÑÑÑ %1 минÑÑадан көбүÑөөк видеолоÑÐ´Ñ Ð¶Ò¯ÐºÑөгөнгө жана видеолоÑÐ´Ñ Ò¯Ð·Ð³Ò¯Ð»ÑүкÑүз көÑгөнгө ÑÑÑкÑÐ°Ñ Ð±ÐµÑеÑ.
Without a license, the application will expire in %1 days.
- ÐиÑензиÑÑÑ Ð¶Ð¾Ðº болгон Ò¯Ñүн, ÑиÑкеменин мөөнөÑÒ¯ %1 күндөн кийин бүÑÓ©Ñ.
+ ÐиÑензиÑÑÑз болгондÑкÑан, ÑиÑкеменин мөөнөÑÒ¯ %1 күндөн кийин бүÑÓ©Ñ.
By purchasing the full version, you will also support the hard work I put into creating %1.
- ТолÑк веÑÑиÑÑÑн алганда, %1 Ò¯Ñүн Ð¾Ð¾Ñ Ñмгек ÑалÑм кÑлÑп жаÑканÑÐ¼Ð´Ñ Ð´Ð° колдоп беÑеÑиз.
+ ТолÑк веÑÑиÑÑÑн алÑаңÑз, %1 Ò¯Ñүн Ð¾Ð¾Ñ Ð¶ÑмÑÑ ÐºÑлÑп жаÑканÑÐ¼Ð´Ñ Ð´Ð° колдоп беÑе алаÑÑз.
@@ -134,6 +134,95 @@
ÐиÑензиÑÐ½Ñ ÑаÑÑп алÑÑ
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ ÐаÑдÑк видеолоÑ
+
+
+
+ Unwatched Videos
+ ÐÓ©Ñүлбөгөн видеолоÑ
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ ÐааÑÑн көÑүлдү деп белгилөө
+
+
+
+ Show Updated
+ ÐаңÑланганÑн көÑÑÓ©ÑÒ¯Ò¯
+
+
+
+ Name
+ ÐÑÑ
+
+
+
+ Last Updated
+ Ð¡Ð¾Ò£ÐºÑ Ð¶Ð°Ò£ÑлангандаÑ
+
+
+
+ Last Added
+ Ð¡Ð¾Ò£ÐºÑ ÐºÐ¾ÑÑлгандаÑ
+
+
+
+ Last Watched
+ Ð¡Ð¾Ò£ÐºÑ ÐºÓ©ÑүлгөндөÑ
+
+
+
+ Most Watched
+ ÐÒ£ көп көÑүлгөндөÑ
+
+
+
+ Sort by
+ СоÑÑÑоо
+
+
+
+ All Videos
+ ÐаÑдÑк видеолоÑ
+
+
+
+ Unwatched Videos
+ ÐÓ©Ñүлбөгөн видеолоÑ
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -182,7 +271,7 @@
minutes
- мүнөÑ
+ минÑÑа
@@ -195,12 +284,12 @@
This is just the demo version of %1.
- ÐÑл пÑогÑамма %1'ÑÑн демо-веÑÑиÑÑÑ Ð±Ð¾Ð»Ð¾Ñ.
+ ÐÑл жөн Ñле %1'дÑн демо-веÑÑиÑÑÑ.
It can only download videos shorter than %1 minutes so you can test the download functionality.
- ÐүкÑÓ©Ó© ÑÑнкÑионалдÑÑлÑгÑн ÑекÑеÑÒ¯Ò¯ Ò¯Ñүн, бÑл %1 мүнөÑÑөн кÑÑкаÑаак видеолоÑÐ´Ñ Ð³Ð°Ð½Ð° жүкÑөп беÑе алаÑ.
+ ÐүкÑÓ©Ó© ÑÑнкÑионалдÑÑлÑгÑн ÑекÑеÑÒ¯Ò¯ Ò¯Ñүн, бÑл %1 минÑÑадан кÑÑкаÑаак видеолоÑÐ´Ñ Ð³Ð°Ð½Ð° жүкÑөп беÑе алаÑ.
@@ -215,7 +304,7 @@
%1 downloaded in %2
- %1 ÑÐ°Ð¹Ð»Ñ %2 жеÑине жүкÑөлдү
+ %2 жеÑине %1 ÑÐ°Ð¹Ð»Ñ Ð¶Ò¯ÐºÑөлдү
@@ -233,12 +322,12 @@
Change location...
- ÐүкÑÓ©Ó© жеÑин өзгөÑÑÒ¯Ò¯...
+ ÐайгаÑкан жеÑин өзгөÑÑÒ¯Ò¯...
Choose the download location
- ÐүкÑÓ©Ó© жеÑин Ñандоо
+ ÐүкÑөп алÑÑ Ð¶ÐµÑин Ñандоо
@@ -248,12 +337,12 @@
Current downloads will still go in the previous location.
- ÐезекÑеги жүкÑÓ©Ó©Ð»Ó©Ñ Ð¼ÑÑÑÐ½ÐºÑ Ð¶ÐµÑинде ÑакÑалаÑ.
+ ÐезекÑе жүкÑөлүп жаÑÐºÐ°Ð½Ð´Ð°Ñ Ð¼ÑÑÑÐ½ÐºÑ Ð¶ÐµÑге ÑакÑалаÑ.
Downloading to: %1
- ÐүкÑөлүп жаÑкан жеÑи: %1
+ %1 папкаÑÑна жүкÑөлүүдө
@@ -270,7 +359,7 @@
Downloading update...
- ÐаңÑÑÑÑÑлаÑÐ´Ñ Ð¶Ò¯ÐºÑөп алÑÑ...
+ ÐаңÑлоо жүкÑөлүүдө...
@@ -339,24 +428,34 @@
HomeView
-
+
Search
Ðздөө
-
+
Find videos and channels by keyword
ÐÑкÑÑ Ñөз менен видеолоÑÐ´Ñ Ð¶Ð°Ð½Ð° каналдаÑÐ´Ñ ÑабÑÒ£Ñз
-
+
Browse
СеÑеп
-
+
Browse videos by category
- ÐидеолоÑÐ´Ñ ÐºÐ°ÑегоÑÐ¸Ñ Ð±Ð¾ÑнÑа каÑоо
+ ÐидеолоÑÐ´Ñ ÐºÐ°ÑегоÑиÑÑÑ Ð±Ð¾ÑнÑа каÑоо
+
+
+
+ Subscriptions
+ ÐазÑлÑÑлаÑ
+
+
+
+ Channel subscriptions
+ Ðанал жазÑлÑÑлаÑÑ
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
ÐаÑа
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&ТокÑоÑÑÑ
-
+
Stop playback and go back to the search view
ÐйноÑÑÑÐ½Ñ ÑокÑоÑÑп издөө көÑүнүÑүнө кайÑÑÑ
-
+
S&kip
- &Ó¨ÑкөÑÒ¯Ò¯
+ Ó¨&ÑкөÑÒ¯Ò¯
-
+
Skip to the next video
Ðийинки видеого Ó©ÑÒ¯Ò¯
-
-
+
+
&Pause
&ÐÐ¸Ñ Ð°Ð·Ð³Ð° ÑокÑоÑÑÑ
-
-
+
+
Pause playback
ÐйноÑÑÑÐ½Ñ Ð±Ð¸Ñ Ð°Ð·Ð³Ð° ÑокÑоÑÑÑ
-
+
&Full Screen
&ТолÑк ÑкÑан
-
+
Go full screen
- ТолÑк ÑкÑан Ñежимине Ó©ÑÒ¯Ò¯
+ ТолÑк ÑкÑанга Ó©ÑÒ¯Ò¯
-
+
Hide the playlist and the toolbar
ÐйноÑÑÑ ÑизмеÑин жана аÑпап панелин жаÑÑÑÑÑ
-
+
Go to the YouTube video page and pause playback
ÐидеонÑн YouTube баÑагÑна Ó©ÑÒ¯Ò¯ жана ойноÑÑÑÐ½Ñ Ð±Ð¸Ñ Ð°Ð·Ð³Ð° ÑокÑоÑÑÑ
-
+
Copy the current video YouTube link to the clipboard
ÐезекÑеги видеонÑн YouTube ÑилÑемеÑин алмаÑÑÑ Ð±ÑÑеÑине көÑÒ¯ÑÒ¯Ò¯
-
+
Copy the current video stream URL to the clipboard
ÐезекÑеги видео агÑмдÑн даÑегин алмаÑÑÑ Ð±ÑÑеÑине көÑÒ¯ÑÒ¯Ò¯
-
+
Find other video parts hopefully in the right order
ÐидеонÑн баÑка бөлүкÑÓ©Ñүн Ò¯Ð¼Ò¯Ñ ÐºÑлÑп ÑÑÑÑа иÑеÑи менен ÑабÑÑ
-
+
&Remove
- &Ó¨ÑÒ¯ÑÒ¯Ò¯
+ Ó¨&ÑÒ¯ÑÒ¯Ò¯
-
+
Remove the selected videos from the playlist
- Тандалган видеолоÑÐ´Ñ Ð¾Ð¹Ð½Ð¾ÑÑÑ ÑизмеÑинен Ó©ÑÒ¯ÑÒ¯Ò¯
+ ÐйноÑÑÑ ÑизмеÑиндеги Ñандалган видеолоÑÐ´Ñ Ó©ÑÒ¯ÑÒ¯Ò¯
-
+
Move &Up
- &Өйдө
+ Ө&йдө
-
+
Move up the selected videos in the playlist
- Тандалган видеолоÑÐ´Ñ Ð¾Ð¹Ð½Ð¾ÑÑÑ ÑизмеÑинен өйдө жÑлдÑÑÑÑ
+ ÐйноÑÑÑ ÑизмеÑиндеги Ñандалган видеолоÑÐ´Ñ Ó©Ð¹Ð´Ó© жÑлдÑÑÑÑ
-
+
Move &Down
&ЫлдÑй
-
+
Move down the selected videos in the playlist
- Тандалган видеолоÑÐ´Ñ Ð¾Ð¹Ð½Ð¾ÑÑÑ ÑизмеÑинен ÑлдÑй жÑлдÑÑÑÑ
+ ÐйноÑÑÑ ÑизмеÑиндеги Ñандалган видеолоÑÐ´Ñ ÑлдÑй жÑлдÑÑÑÑ
-
+
Clear the search history. Cannot be undone.
Ðздөө ÑаÑÑÑ
Ñн Ñазалоо. ӨзгөÑÑÒ¯Ò¯Ð»Ó©Ñ ÐºÐ°Ð¹ÑаланбаÑ.
-
+
&Quit
&ЧÑгÑÑ
-
+
Bye
ÐÐ¾Ñ Ð±Ð¾Ð»ÑÒ£Ñз
-
+
&Website
&Ðеб-ÑайÑ
-
+
%1 on the Web
%1 инÑеÑнеÑÑе
-
+
Please support the continued development of %1
%1'дÑн мÑндан аÑÐºÑ Ð¸ÑÑеÑÒ¯Ò¯Ñүн колдоп беÑиңиз
-
+
&About
ÐÑогÑамма &жөнүндө
-
+
Info about %1
%1 жөнүндө маалÑмаÑ
-
+
Search
Ðздөө
-
+
Mute volume
Үндү Ó©ÑÒ¯ÑÒ¯Ò¯
-
-
+
+
&Downloads
&ÐүкÑөөлөÑ
-
+
Show details about video downloads
Ðидео жүкÑөөлөÑÒ¯ жөнүндө коÑÑмÑа маалÑÐ¼Ð°Ñ ÐºÓ©ÑÑÓ©ÑÒ¯Ò¯
-
+
&Download
&ÐүкÑөп алÑÑ
-
+
Download the current video
ÐезекÑеги Ð²Ð¸Ð´ÐµÐ¾Ð½Ñ Ð¶Ò¯ÐºÑөп алÑÑ
-
+
+ &Subscribe to Channel
+ Ðаналга &жазÑлÑÑ
+
+
+
Share the current video using %1
ÐезекÑеги Ð²Ð¸Ð´ÐµÐ¾Ð½Ñ %1 аÑкÑлÑÑ Ð±Ó©Ð»Ò¯ÑÒ¯Ò¯
-
+
&Email
&E-mail
-
+
Email
E-mail
-
+
&Close
&ÐабÑÑ
-
+
&Float on Top
Ò®ÑÑүнөн &калкÑÑÑÑ
-
+
&Stop After This Video
ÐÑл видеодон кийин &ÑокÑоÑÑÑ
-
+
&Report an Issue...
- ÐаÑа жөнүндө &маалÑмдоо...
+ ÐаÑÐ°Ð½Ñ &маалÑмдоо...
-
+
&Refine Search...
Ðздөөнү &ÑакÑоо...
-
+
More...
ÐагÑ...
-
+
&Related Videos
&ÐайланÑÑÑÑÑ Ð²Ð¸Ð´ÐµÐ¾Ð»Ð¾Ñ
-
+
Watch videos related to the current one
ÐезекÑегиге байланÑÑÑÑÑ Ð²Ð¸Ð´ÐµÐ¾Ð½Ñ ÐºÓ©ÑÒ¯Ò¯
-
+
&Application
&ТиÑкеме
-
+
Buy %1...
- %1'ÑÑ ÑаÑÑп алÑÑ...
+ %1'Ð´Ñ ÑаÑÑп алÑÑ...
-
+
&Playback
&ÐйноÑÑÑ
-
+
&Playlist
ÐйноÑÑÑ &ÑизмеÑи
-
+
&Video
&Ðидео
-
+
&View
&ÐÓ©ÑүнүÑ
-
+
&Share
&ÐөлүÑÒ¯Ò¯
-
+
&Help
&ÐаÑдам
-
+
Press %1 to raise the volume, %2 to lower it
- ÐаÑÑÑлÑкÑÑ ÑоңойÑÑÑ Ò¯Ñүн %1 баÑÑÒ£Ñз жана киÑиÑейÑÒ¯Ò¯ Ò¯Ñүн %2
+ Ðөлөмүн ÑоңойÑÑÑ Ò¯Ñүн %1 комбинаÑиÑÑÑн баÑÑÒ£Ñз, киÑиÑейÑÒ¯Ò¯ Ò¯Ñүн %2
-
-
+
+
Opening %1
- %1 аÑÑÑ
+ %1 аÑÑлÑÑда
-
+
Do you want to exit %1 with a download in progress?
- ÐүкÑөп алÑÑ Ð±Ð¾Ð»Ñп жаÑкан кезде %1'дан ÑÑккÑÒ£Ñз келеби?
+ ÐүкÑөп алÑÑ Ð±Ð¾Ð»Ñп жаÑкан кезде %1'дан ÑÑгÑÑÐ½Ñ ÐºÐ°Ð°Ð»Ð°Ð¹ÑÑзбÑ?
-
+
If you close %1 now, this download will be cancelled.
- ÐÐ³ÐµÑ Ñиз %1'ÑÑ Ð°Ð·ÑÑ Ð¶Ð°Ð¿ÑаңÑз, бÑл жүкÑөп алÑÑ Ð¶Ð¾ÐºÐºÐ¾ ÑÑгаÑÑлаÑ.
+ ÐÐ³ÐµÑ Ñиз %1'Ð´Ñ Ð°Ð·ÑÑ Ð¶Ð°Ð¿ÑаңÑз, бÑл жүкÑÓ©Ó© жокко ÑÑгаÑÑлаÑ.
-
+
Close and cancel download
- ÐабÑÑ Ð¶Ð°Ð½Ð° жүкÑөп алÑÑÐ½Ñ Ð¶Ð¾ÐºÐºÐ¾ ÑÑгаÑÑÑ
+ ÐабÑÑ Ð¶Ð°Ð½Ð° жүкÑөөнү жокко ÑÑгаÑÑÑ
-
+
Wait for download to finish
ÐүкÑөп алÑÑнÑн аÑкÑооÑÑн күÑÒ¯Ò¯
-
+
Leave &Full Screen
- &ТолÑк ÑкÑан Ñежиминен ÑÑгÑÑ
+ &ТолÑк ÑкÑандан ÑÑгÑÑ
-
+
%1 version %2 is now available.
- %1 веÑÑÐ¸Ñ %2 азÑÑÐºÑ ÐºÐµÐ·Ð´Ðµ колго жеÑеÑдик.
+ %1 веÑÑÐ¸Ñ %2 азÑÑ Ð¶ÐµÑкиликÑÒ¯Ò¯.
-
+
Remind me later
ÐеÑиÑÑÑк ÑÑке ÑалÑÑ
-
+
Update
- ÐаңÑÑÑÑÑ
+ ÐаңÑлоо
-
+
Error: %1
- ÐаÑа: %1
+ ÐаÑаÑÑ: %1
-
+
P&revious
&ÐÑÑÑнкÑ
-
+
Go back to the previous track
ÐÑÑÑÐ½ÐºÑ Ð¶Ð¾Ð»Ñого кайÑÑÑ
-
+
&Compact Mode
- &ÐÐ¾Ð¼Ð¿Ð°ÐºÑ Ñежими
+ &ТÑгÑз Ñежим
-
+
Open the &YouTube Page
&YouTube баÑагÑн аÑÑÑ
-
+
Copy the YouTube &Link
YouTube &ÑилÑемеÑин көÑÒ¯ÑÒ¯Ò¯
-
+
Copy the Video Stream &URL
Ðидео агÑмдÑн &ÑилÑемеÑин көÑÒ¯ÑÒ¯Ò¯
-
+
Find Video &Parts
- Ðидео &ÑÑагменÑÑеÑди ÑабÑÑ
+ Ðидео&ÑÑагменÑÑеÑди ÑабÑÑ
-
+
&Clear Recent Searches
Ð¡Ð¾Ò£ÐºÑ Ð¸Ð·Ð´Ó©Ó©Ð»Ó©Ñдү &Ñазалоо
-
+
Make a &Donation
&ТаÑÑÑÑ ÐºÑлÑÑ
-
+
&Manually Start Playing
ÐйноÑÑÑÐ½Ñ &кол менен баÑÑаÑÑÑ
-
+
Manually start playing videos
Ðидео ойноÑÑÑÐ½Ñ ÐºÐ¾Ð» менен баÑÑаÑÑÑ
-
+
Choose your content location
- ÐазмÑндÑн ÑÑÑган жеÑин ÑандаңÑз
+ ÐазмÑндÑн жайгаÑкан жеÑин ÑандаңÑз
-
+
&Play
&ÐйноÑÑÑ
-
+
Resume playback
ÐйноÑÑÑÐ½Ñ ÑланÑÑÑ
-
+
Remaining time: %1
- Ðалган ÑбакÑÑ: %1
+ Ðалган ÑбагÑ: %1
-
+
Volume at %1%
- ÐаÑÑÑлÑк %1%
+ Ðөлөмү %1%
-
+
Volume is muted
- Үн Ó©ÑÒ¯Ñүлдү
+ Үнү Ó©ÑÒ¯Ñүлдү
-
+
Volume is unmuted
- Үн күйгүзүлдү
+ Үнү күйгүзүлдү
-
+
Maximum video definition set to %1
- ÐидеонÑн ÑеÑиминин жогоÑÐºÑ Ñеги: %1
+ ÐидеонÑн жогоÑÐºÑ ÑеÑими: %1
-
+
Your privacy is now safe
ÐаÑÑÑÑндÑÑлÑгÑÒ£Ñз камÑÑздалдÑ
-
+
Downloads complete
ÐүкÑөп алÑÑ Ð°ÑкÑалдÑ
@@ -802,67 +906,77 @@
MediaView
-
+
You can now paste the YouTube link into another application
- Ðми Ñиз видеонÑн YouTube ÑилÑемеÑин баÑка ÑиÑкемеге ÐºÐ¾Ñ Ð°Ð»Ð°ÑÑз
+ YouTube'дÑн даÑегин Ñми баÑка ÑиÑкемеге койÑоңÑз болоÑ
-
+
You can now paste the video stream URL into another application
- Сиз Ñми азÑÑ Ð²Ð¸Ð´ÐµÐ¾ агÑмдÑн даÑегин баÑка ÑиÑкемеге Ñала алаÑÑз
+ Ðидео агÑмдÑн даÑегин Ñми баÑка ÑиÑкемеге койÑоңÑз болоÑ
-
+
The link will be valid only for a limited time.
Чакан ÑбакÑÑка Ñейин гана ÑилÑеме анÑк болоÑ.
-
+
This is just the demo version of %1.
- ÐÑл пÑогÑамма %1'ÑÑн демо-веÑÑиÑÑÑ Ð±Ð¾Ð»Ð¾Ñ.
+ ÐÑл жөн Ñле %1'дÑн демо-веÑÑиÑÑÑ.
-
+
It allows you to test the application and see if it works for you.
ÐÑл ÑиÑкемени ÑÑнап көÑгөнгө мүмкүндүк беÑеÑ.
-
+
Continue
УланÑÑÑ
-
+
of
Used in video parts, as in '2 of 3'
/
-
+
part
This is for video parts, as in 'Cool video - part 1'
бөлүк
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
Ñпизод
-
+
Sent from %1
%1 жеÑинен жөнөÑÒ¯Ò¯
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
ТолÑк веÑÑиÑÑÑн алÑÑ
-
+
Downloading %1
- %1 жүкÑөп алÑÑ
+ %1 жүкÑөп алÑнÑÑда
@@ -895,7 +1009,7 @@
Install Update
- ÐаңÑÑÑÑÑлаÑÐ´Ñ Ð¾ÑноÑÑÑ
+ ÐаңÑлоолоÑÐ´Ñ Ð¾ÑноÑÑÑ
@@ -909,54 +1023,54 @@
PlaylistItemDelegate
-
+
%1 views
%1 көÑÒ¯Ò¯
-
+
%1 of %2 (%3) â %4
- %1/%2 (%3) â %4
+ %1 / %2 (%3) â %4
-
+
Preparing
ÐаÑÑдоо
-
+
Failed
ÐаÑа
-
+
Completed
ÐÑкÑалдÑ
-
+
Stopped
ТокÑоÑÑлдÑ
-
+
Stop downloading
ÐүкÑөп алÑÑÐ½Ñ ÑокÑоÑÑÑ
-
+
Show in %1
%1 жеÑинен көÑÑÓ©ÑÒ¯Ò¯
-
+
Open parent folder
- Ðне каÑалогÑн аÑÑÑ
+ ÐÑа-Ñне каÑалогÑн аÑÑÑ
-
+
Restart downloading
- ÐүкÑөп алÑÑÐ½Ñ ÐºÐ°Ð¹Ñа баÑÑаÑÑÑ
+ ÐүкÑөп алÑÑÐ½Ñ ÐºÐ°Ð¹Ñадан жүÑгүзүү
@@ -969,7 +1083,7 @@
Show %1 More
- ÐÐ°Ð³Ñ ÐºÓ©ÑÑÓ©ÑÒ¯Ò¯ %1
+ ÐÐ°Ð³Ñ %1 Ð²Ð¸Ð´ÐµÐ¾Ð½Ñ ÐºÓ©ÑÑÓ©ÑÒ¯Ò¯
@@ -987,7 +1101,7 @@
Sort by
- СоÑÑÑоо ÑкмаÑÑ
+ СоÑÑÑоо
@@ -1059,17 +1173,17 @@
Less than 4 minutes
- 4 мүнөÑÑөн кÑÑкаÑаак
+ 4 минÑÑадан кÑÑкаÑаак
Between 4 and 20 minutes
- 4 менен 20 мүнөÑÑүн аÑаÑÑнан
+ 4 менен 20 минÑÑанÑн аÑаÑÑнан
Longer than 20 minutes
- 20 мүнөÑÑөн көбүÑөөк
+ 20 минÑÑадан көбүÑөөк
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
- <a href='%1'>%2</a>'ка ÐºÐ¾Ñ ÐºÐµÐ»Ð¸Ò£Ð¸Ð·,
+ <a href='%1'>%2</a>'га ÐºÐ¾Ñ ÐºÐµÐ»Ð¸Ò£Ð¸Ð·,
-
+
Get the full version
ТолÑк веÑÑиÑÑÑн ÑаÑÑп алÑÑ
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
ÐидеолоÑдÑ
-
+
a keyword
аÑкÑÑ Ñөз
-
+
a channel
канал
-
+
to start watching videos.
менен ÑабÑп көÑÒ¯Ò¯.
-
+
Watch
ÐÓ©ÑÒ¯Ò¯
-
+
Recent keywords
Ð¡Ð¾Ò£ÐºÑ Ð°ÑкÑÑ ÑөздөÑ
-
+
Recent channels
Ð¡Ð¾Ò£ÐºÑ ÐºÐ°Ð½Ð°Ð»Ð´Ð°Ñ
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
&ÐÑÑка
@@ -1173,7 +1287,7 @@
Back to %1
- %1 кайÑÑÑ
+ %1 видеоÑÑна кайÑÑÑ
@@ -1196,11 +1310,6 @@
Most Popular
ÐÒ£ попÑлÑÑдÑÑ
-
-
- Featured
- ТандалмалаÑ
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
ÐÑкÑÑлаÑ
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
- %1 Ò¯Ñүн видео агÑÐ¼Ð´Ñ Ð°Ð»ÑÑ Ð¾Ò£Ñнан ÑÑккан жок
+ %1 Ò¯Ñүн видео агÑмÑн алÑÑ Ð¼Ò¯Ð¼ÐºÒ¯Ð½ ÑмеÑ
-
+
Network error: %1 for %2
ТаÑмак каÑаÑÑ: %1 %2 Ò¯Ñүн
diff --git a/locale/locale.pri b/locale/locale.pri
index 36aa566..543a7a0 100644
--- a/locale/locale.pri
+++ b/locale/locale.pri
@@ -4,7 +4,7 @@ INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
# ls -1 *.ts | tr '\n' ' '
-TRANSLATIONS += ar.ts ca.ts ca_ES.ts cs_CZ.ts da.ts de_DE.ts el.ts en.ts es.ts es_AR.ts es_ES.ts fi.ts fi_FI.ts fr.ts he_IL.ts hr.ts hu.ts ia.ts it.ts ja_JP.ts jv.ts ky.ts nl.ts pl.ts pl_PL.ts pt_BR.ts ro.ts ru.ts sk.ts sl.ts tr.ts zh_CN.ts
+TRANSLATIONS += ar.ts ast.ts bg_BG.ts ca.ts cs_CZ.ts da.ts de_DE.ts el.ts en.ts es.ts es_AR.ts es_ES.ts fi.ts fi_FI.ts fr.ts gl.ts he_IL.ts hu.ts ia.ts it.ts ja_JP.ts ky.ts ms_MY.ts nb.ts pl.ts pl_PL.ts pt_BR.ts ro.ts ru.ts sk.ts sl.ts sq.ts tr.ts uk.ts uk_UA.ts zh_CN.ts
isEmpty(QMAKE_LRELEASE) {
win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe
else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
diff --git a/locale/nl.ts b/locale/nl.ts
deleted file mode 100644
index 563ae0e..0000000
--- a/locale/nl.ts
+++ /dev/null
@@ -1,1476 +0,0 @@
-
-UTF-8
-
- AboutView
-
-
- There's life outside the browser!
- Er is leven buiten de browser!
-
-
-
- Version %1
- Versie %1
-
-
-
- Licensed to: %1
-
-
-
-
- %1 is Free Software but its development takes precious time.
- %1 is gratis software, maar de ontwikkeling ervan vergt kostbare tijd.
-
-
-
- Please <a href='%1'>donate</a> to support the continued development of %2.
- <a href='%1'>Doneer</a> om bij te dragen aan de verdere ontwikkeling van %2.
-
-
-
- You may want to try my other apps as well:
- Misschien wilt u ook mijn andere apps proberen:
-
-
-
- %1, a YouTube music player
- %1, een YouTube-muziekspeler
-
-
-
- %1, a music player
- %1, een muziekspeler
-
-
-
- Translate %1 to your native language using %2
- Vertaal %1 naar uw moedertaal met behulp van %2
-
-
-
- Icon designed by %1.
- Pictogram ontworpen door %1.
-
-
-
- Released under the <a href='%1'>GNU General Public License</a>
- Uitgebracht onder de <a href='%1'>GNU General Public License</a>
-
-
-
- &Close
- &Sluit
-
-
-
- About
- Over
-
-
-
- What you always wanted to know about %1 and never dared to ask
- Wat u altijd al had willen weten over %1 maar nooit heeft durven vragen
-
-
-
- ActivationDialog
-
-
- Enter your License Details
-
-
-
-
- &Email:
-
-
-
-
- &Code:
-
-
-
-
- ActivationView
-
-
- Please license %1
- Alstublieft, Licenceer %1
-
-
-
- This demo has expired.
- Deze demo is verlopen.
-
-
-
- The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
-
-
-
- Without a license, the application will expire in %1 days.
-
-
-
-
- By purchasing the full version, you will also support the hard work I put into creating %1.
- Door dit produkt te kopen beloon je mij voor het harde werk dat ik geïnvesteerd heb in het maken van %1.
-
-
-
- Use Demo
- Gebruik de demo
-
-
-
- Enter License
-
-
-
-
- Buy License
-
-
-
-
- ClearButton
-
-
- Clear
- Wis
-
-
-
- DownloadItem
-
-
- bytes
- bytes
-
-
-
- KB
- KB
-
-
-
- MB
- MB
-
-
-
- bytes/sec
- bytes/sec
-
-
-
- KB/sec
- KB/sec
-
-
-
- MB/sec
- MB/sec
-
-
-
- seconds
- seconden
-
-
-
- minutes
- minuten
-
-
-
- %4 %5 remaining
- %4 %5 resterend
-
-
-
- DownloadManager
-
-
- This is just the demo version of %1.
- Dit is slechts de demoversie van %1.
-
-
-
- It can only download videos shorter than %1 minutes so you can test the download functionality.
- Het kan alleen maar videos downloaden korter dan %1 minuten zodat u de downloadfunctionaliteit kunt testen.
-
-
-
- Continue
- Ga door
-
-
-
- Get the full version
- Verkrijg de volledige versie
-
-
-
- %1 downloaded in %2
- %1 gedownload in %2
-
-
-
- Download finished
- Download greed
-
-
-
- %n Download(s)
- %n Download %n Downloads
-
-
-
- DownloadSettings
-
-
- Change location...
- Verander locatie...
-
-
-
- Choose the download location
- Kies de downloadlocatie
-
-
-
- Download location changed.
- Downloadlocatie aangepast.
-
-
-
- Current downloads will still go in the previous location.
- Huidige downloads zullen in de vorige locatie worden geplaatst.
-
-
-
- Downloading to: %1
- Downloaden naar:%1
-
-
-
- DownloadView
-
-
-
- Downloads
- Downloads
-
-
-
- DownloadWidget
-
-
- Downloading update...
-
-
-
-
- GlobalShortcuts
-
-
- Play
- Speel af
-
-
-
- Pause
- Pauzeer
-
-
-
- Play/Pause
- Speel af/Pauzeer
-
-
-
- Stop
- Stop
-
-
-
- Stop playing after current track
- Stop afspelen na huidig nummer
-
-
-
- Next track
- Volgend nummer
-
-
-
- Previous track
- Vorig nummer
-
-
-
- Increase volume
- Verhoog volume
-
-
-
- Decrease volume
- Verlaag volume
-
-
-
- Mute
- Demp
-
-
-
- Seek forward
- Spoel naar voren
-
-
-
- Seek backward
- Spoel naar achteren
-
-
-
- HomeView
-
-
- Search
- Zoek
-
-
-
- Find videos and channels by keyword
-
-
-
-
- Browse
-
-
-
-
- Browse videos by category
-
-
-
-
- Make yourself comfortable
-
-
-
-
- LoadingWidget
-
-
- Error
- Fout
-
-
-
- MainWindow
-
-
- &Stop
- &Stop
-
-
-
- Stop playback and go back to the search view
- Stop het afspelen en keer terug naar het zoekvenster
-
-
-
- S&kip
- &Sla over
-
-
-
- Skip to the next video
- Spoel door naar de volgende vieo
-
-
-
-
- &Pause
- &Pauzeer
-
-
-
-
- Pause playback
- Pauzeer afspelen
-
-
-
- &Full Screen
- &Volledig scherm
-
-
-
- Go full screen
- Schakel over naar Volledig scherm
-
-
-
- Hide the playlist and the toolbar
- Verberg de afspeellijst en de werkbalk
-
-
-
- Go to the YouTube video page and pause playback
- Ga naar de YouTube-videopagina en pauzeer het afspelen
-
-
-
- Copy the current video YouTube link to the clipboard
- Kopieer de huidige YouTube-link naar het klembord
-
-
-
- Copy the current video stream URL to the clipboard
- Kopieer de huidige videostream-URL naar het klembord
-
-
-
- Find other video parts hopefully in the right order
- Vind gerelateerde videofragmenten, hopelijk in de juiste volgorde
-
-
-
- &Remove
- &Verwijder
-
-
-
- Remove the selected videos from the playlist
- Verwijder de geselecteerde video's uit de afspeellijst
-
-
-
- Move &Up
- Verplaats &omhoog
-
-
-
- Move up the selected videos in the playlist
- Verplaats de geselecteerde video's in de afspeellijst naar boven
-
-
-
- Move &Down
- Verplaats &omlaag
-
-
-
- Move down the selected videos in the playlist
- Verplaats de geselecteerde video's in de afspeelijst naar beneden
-
-
-
- Clear the search history. Cannot be undone.
- Wis de zoek geschiedenis. Dit kan niet ongedaan worden gemaakt.
-
-
-
- &Quit
- &Sluit af
-
-
-
- Bye
- Tot ziens
-
-
-
- &Website
- &Website
-
-
-
- %1 on the Web
- %1 op het internet
-
-
-
- Please support the continued development of %1
- Ondersteun alstublieft de ontwikkeling van %1
-
-
-
- &About
- &Over
-
-
-
- Info about %1
- Informatie over %1
-
-
-
- Search
- Zoek
-
-
-
- Mute volume
- Demp volume
-
-
-
-
- &Downloads
- &Downloads
-
-
-
- Show details about video downloads
- Geef details weer van videodownloads
-
-
-
- &Download
- &Download
-
-
-
- Download the current video
- Download de huidige video
-
-
-
- Share the current video using %1
- Deel de huidige video door middel van %1
-
-
-
- &Email
- &E-mail
-
-
-
- Email
- E-mail
-
-
-
- &Close
- &Sluit
-
-
-
- &Float on Top
- &Zweef erboven
-
-
-
- &Stop After This Video
- &Stop na deze video
-
-
-
- &Report an Issue...
- &Rapporteer een Probleem...
-
-
-
- &Refine Search...
- &Verfijn Zoekopdracht...
-
-
-
- More...
-
-
-
-
- &Related Videos
-
-
-
-
- Watch videos related to the current one
-
-
-
-
- &Application
- &Programma
-
-
-
- Buy %1...
- Koop %1...
-
-
-
- &Playback
- &Afspeelopties
-
-
-
- &Playlist
- &Afspeellijst
-
-
-
- &Video
- &Video
-
-
-
- &View
- &Weergave
-
-
-
- &Share
- &Deel
-
-
-
- &Help
- &Help
-
-
-
- Press %1 to raise the volume, %2 to lower it
- Druk op %1 om het volume te verhogen, op %2 om het te verlagen
-
-
-
-
- Opening %1
- Bezig met openen van %1
-
-
-
- Do you want to exit %1 with a download in progress?
- Wilt u %1 afsluiten terwijl er een download bezig is?
-
-
-
- If you close %1 now, this download will be cancelled.
- Als u nu %1 afsluit, zal de download worden beëindigd.
-
-
-
- Close and cancel download
- Sluit en annuleer het downloaden
-
-
-
- Wait for download to finish
- Wacht tot het downloaden is voltooid
-
-
-
- Leave &Full Screen
- Verlaat &volledig scherm
-
-
-
- %1 version %2 is now available.
- %1 versie %2 nu beschikbaar.
-
-
-
- Remind me later
- Herinner mij later
-
-
-
- Update
- Werk bij
-
-
-
- Error: %1
- Fout: %1
-
-
-
- P&revious
- V&orige
-
-
-
- Go back to the previous track
- Ga terug naar het vorige nummer
-
-
-
- &Compact Mode
- &Compacte modus
-
-
-
- Open the &YouTube Page
- Open de &Youtube-pagina
-
-
-
- Copy the YouTube &Link
- Kopieer de YouTube-&link
-
-
-
- Copy the Video Stream &URL
- Kopieer de videostream-&URL
-
-
-
- Find Video &Parts
- Vind video&fragmenten
-
-
-
- &Clear Recent Searches
- &Wis recente zoekopdrachten
-
-
-
- Make a &Donation
- Geef een &donatie
-
-
-
- &Manually Start Playing
- &Speel handmatig af
-
-
-
- Manually start playing videos
- Speel handmatig video's af
-
-
-
- Choose your content location
-
-
-
-
- &Play
- &Speel af
-
-
-
- Resume playback
- Hervat afspelen
-
-
-
- Remaining time: %1
- Resterende tijd: %1
-
-
-
- Volume at %1%
- Volume op %1%
-
-
-
- Volume is muted
- Volume is gedempt
-
-
-
- Volume is unmuted
- Volume is niet gedempt
-
-
-
- Maximum video definition set to %1
- Maximale videokwaliteit staat op %1
-
-
-
- Your privacy is now safe
- Uw privacy is nu gewaarborgd
-
-
-
- Downloads complete
- Downloads afgerond
-
-
-
- MediaView
-
-
- You can now paste the YouTube link into another application
- U kunt nu uw YouTube-link kopieren naar een ander programma
-
-
-
- You can now paste the video stream URL into another application
- U kunt nu uw videostream-URL kopieren naar een ander programma
-
-
-
- The link will be valid only for a limited time.
- De link zal maar een beperkte tijd geldig zijn.
-
-
-
- This is just the demo version of %1.
- Dit is slechts de demoversie van %1.
-
-
-
- It allows you to test the application and see if it works for you.
- Het biedt de mogelijkheid de applicatie te testen en te beoordelen.
-
-
-
- Continue
- Ga door
-
-
-
- of
- Used in video parts, as in '2 of 3'
- van
-
-
-
- part
- This is for video parts, as in 'Cool video - part 1'
- fragment
-
-
-
- episode
- This is for video parts, as in 'Cool series - episode 1'
- aflevering
-
-
-
- Sent from %1
- Verstuurd vanaf %1
-
-
-
- Get the full version
- Verkrijg de volledige versie
-
-
-
- Downloading %1
- Bezig met downloaden van %1
-
-
-
- MessageWidget
-
-
- A new version of %1 is available!
-
-
-
-
- %1 %2 is now available. You have %3.
-
-
-
-
- Would you like to download it now?
-
-
-
-
- Skip This Version
-
-
-
-
- Remind Me Later
-
-
-
-
- Install Update
-
-
-
-
- PasteLineEdit
-
-
- Paste
-
-
-
-
- PlaylistItemDelegate
-
-
- %1 views
- %1 bekeken
-
-
-
- %1 of %2 (%3) â %4
-
-
-
-
- Preparing
-
-
-
-
- Failed
-
-
-
-
- Completed
-
-
-
-
- Stopped
-
-
-
-
- Stop downloading
-
-
-
-
- Show in %1
-
-
-
-
- Open parent folder
-
-
-
-
- Restart downloading
-
-
-
-
- PlaylistModel
-
-
- Searching...
- Bezig met zoeken...
-
-
-
- Show %1 More
-
-
-
-
- No videos
- Geen video's
-
-
-
- No more videos
-
-
-
-
- RefineSearchWidget
-
-
- Sort by
- Sorteer op
-
-
-
- Relevance
- Relevantie
-
-
-
-
- Date
- Datum
-
-
-
- View Count
- Weergaven
-
-
-
- Rating
- Waardering
-
-
-
- Anytime
- Elke Periode
-
-
-
- Today
- Vandaag
-
-
-
- 7 Days
- 7 Dagen
-
-
-
- 30 Days
- 30 Dagen
-
-
-
- Duration
- Duur
-
-
-
-
- All
- Alles
-
-
-
- Short
- Kort
-
-
-
- Medium
- Gemiddeld
-
-
-
- Long
- Lang
-
-
-
- Less than 4 minutes
- Minder dan 4 minuten
-
-
-
- Between 4 and 20 minutes
- Tussen 4 en 20 minuten
-
-
-
- Longer than 20 minutes
- Langer dan 20 minuten
-
-
-
- Quality
- Kwaliteit
-
-
-
- High Definition
- HD Resolutie
-
-
-
- 720p or higher
- 720p of hover
-
-
-
- Done
- Klaar
-
-
-
- RegionsView
-
-
- Done
-
-
-
-
- SearchLineEdit
-
-
- Search
- Zoek
-
-
-
- SearchView
-
-
- Welcome to <a href='%1'>%2</a>,
- Welkom bij <a href='%1'>%2</a>,
-
-
-
- Get the full version
- Verkrijg de volledige versie
-
-
-
- Enter
- "Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
- Typ
-
-
-
- a keyword
- een zoekwoord
-
-
-
- a channel
- een kanaal
-
-
-
- to start watching videos.
- om te beginnen met het bekijken van video's.
-
-
-
- Watch
- Bekijk
-
-
-
- Recent keywords
- Recente zoekwoorden
-
-
-
- Recent channels
- Recente kanalen
-
-
-
- SidebarHeader
-
-
-
- &Back
- &Terug
-
-
-
- Forward to %1
-
-
-
-
- Back to %1
-
-
-
-
- SidebarWidget
-
-
- Refine Search
- Verfijn Zoekopdracht
-
-
-
- Did you mean: %1
- Bedoelde je: %1
-
-
-
- StandardFeedsView
-
-
- Most Popular
-
-
-
-
- Featured
-
-
-
-
- Most Shared
-
-
-
-
- Most Discussed
-
-
-
-
- Top Rated
-
-
-
-
- Video
-
-
- Cannot get video stream for %1
- Kan de videostream niet verkrijgen voor %1
-
-
-
- Network error: %1 for %2
- Netwerkfout: %1 voor %2
-
-
-
- YTRegions
-
-
- Algeria
-
-
-
-
- Argentina
-
-
-
-
- Australia
-
-
-
-
- Belgium
-
-
-
-
- Brazil
-
-
-
-
- Canada
-
-
-
-
- Chile
-
-
-
-
- Colombia
-
-
-
-
- Czech Republic
-
-
-
-
- Egypt
-
-
-
-
- France
-
-
-
-
- Germany
-
-
-
-
- Ghana
-
-
-
-
- Greece
-
-
-
-
- Hong Kong
-
-
-
-
- Hungary
-
-
-
-
- India
-
-
-
-
- Indonesia
-
-
-
-
- Ireland
-
-
-
-
- Israel
-
-
-
-
- Italy
-
-
-
-
- Japan
-
-
-
-
- Jordan
-
-
-
-
- Kenya
-
-
-
-
- Malaysia
-
-
-
-
- Mexico
-
-
-
-
- Morocco
-
-
-
-
- Netherlands
-
-
-
-
- New Zealand
-
-
-
-
- Nigeria
-
-
-
-
- Peru
-
-
-
-
- Philippines
-
-
-
-
- Poland
-
-
-
-
- Russia
-
-
-
-
- Saudi Arabia
-
-
-
-
- Singapore
-
-
-
-
- South Africa
-
-
-
-
- South Korea
-
-
-
-
- Spain
-
-
-
-
- Sweden
-
-
-
-
- Taiwan
-
-
-
-
- Tunisia
-
-
-
-
- Turkey
-
-
-
-
- Uganda
-
-
-
-
- United Arab Emirates
-
-
-
-
- United Kingdom
-
-
-
-
- Yemen
-
-
-
-
- Worldwide
-
-
-
-
\ No newline at end of file
diff --git a/locale/pl.ts b/locale/pl.ts
index f7290c6..086041e 100644
--- a/locale/pl.ts
+++ b/locale/pl.ts
@@ -15,7 +15,7 @@
Licensed to: %1
-
+ Licencjonowane dla: %1
@@ -30,17 +30,17 @@
You may want to try my other apps as well:
-
+ ByÄ może chciaÅbyÅ wypróbowaÄ moje inne aplikacje:
%1, a YouTube music player
-
+ %1, odtwarzacz muzyki YouTube
%1, a music player
-
+ %1, odtwarzacz muzyki
@@ -65,7 +65,7 @@
About
- O programie Minitube
+ O programie
@@ -78,7 +78,7 @@
Enter your License Details
-
+ Wpisz szczegóÅy Twojej licencji
@@ -88,7 +88,7 @@
&Code:
-
+ &Kod:
@@ -134,6 +134,95 @@
Kup LicencjÄ
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+ Sortuj wedÅug
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -215,7 +304,7 @@
%1 downloaded in %2
-
+ %1 pobrane w %2
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Szukaj
-
+
Find videos and channels by keyword
-
+
Browse
PrzeglÄ
daj
-
+
Browse videos by category
PrzeglÄ
daj wideo wedÅug kategorii
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
BÅÄ
d
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Zatrzymaj
-
+
Stop playback and go back to the search view
Zatrzymaj odtwarzanie i wrÃ³Ä do wyszukiwania
-
+
S&kip
Prze&skocz dalej
-
+
Skip to the next video
Skocz do nastÄpnego pliku wideo
-
-
+
+
&Pause
&Pauza
-
-
+
+
Pause playback
Wstrzymaj odtwarzanie
-
+
&Full Screen
PeÅny ekran (&F)
-
+
Go full screen
PrzeÅÄ
cz na peÅny ekran
-
+
Hide the playlist and the toolbar
Ukryj listÄ odtwarzania i pasek narzÄdzi
-
+
Go to the YouTube video page and pause playback
Otwórz na stronie Youtube i wstrzymaj odtwarzanie
-
+
Copy the current video YouTube link to the clipboard
Kopiuj link aktualnie odtwarzanego video do schowka
-
+
Copy the current video stream URL to the clipboard
Kopiuj adres URL odtwarzanego wideo do schowka
-
+
Find other video parts hopefully in the right order
-
+
&Remove
UsuÅ (&D)
-
+
Remove the selected videos from the playlist
UsuÅ wybrane pliki z listy odtwarzania
-
+
Move &Up
PrzenieŠ&Wyżej
-
+
Move up the selected videos in the playlist
PrzenieÅ wyżej zaznaczony plik w liÅcie odtwarzania
-
+
Move &Down
PrzenieŠ&Niżej
-
+
Move down the selected videos in the playlist
PrzenieÅ niżej zaznaczony plik w liÅcie odtwarzania
-
+
Clear the search history. Cannot be undone.
WyczyÅÄ historiÄ wyszukiwania. NIEODWRACALNIE.
-
+
&Quit
Wyjdź (&Q)
-
+
Bye
Żegnaj
-
+
&Website
Strona domowa projektu (&W)
-
+
%1 on the Web
%1 w sieci
-
+
Please support the continued development of %1
Prosimy o wsparcie dla dalszego rozwoju %1
-
+
&About
O programie (&A)
-
+
Info about %1
Informacje o %1
-
+
Search
Szukaj
-
+
Mute volume
Wycisz
-
-
+
+
&Downloads
&Pobrane
-
+
Show details about video downloads
Pokaż szczegóÅy o pobranych plikach
-
+
&Download
&Pobierz
-
+
Download the current video
Pobierz aktualny plik
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
UdostÄpnij te wideo używajÄ
c %1
-
+
&Email
&E-mail
-
+
Email
E-mail
-
+
&Close
&Zamknij
-
+
&Float on Top
-
+
&Stop After This Video
-
+
&Report an Issue...
-
+ &ZgÅoÅ problem...
-
+
&Refine Search...
-
+
More...
WiÄcej...
-
+
&Related Videos
-
+
Watch videos related to the current one
-
+
&Application
&Aplikacje
-
+
Buy %1...
Kup %1...
-
+
&Playback
&Odtwarzanie
-
+
&Playlist
&Lista odtwarzania
-
+
&Video
&Wideo
-
+
&View
&Widok
-
+
&Share
Udo&stÄpnij
-
+
&Help
&Pomoc
-
+
Press %1 to raise the volume, %2 to lower it
WciÅcnij %1 żeby zwiÄkszyÄ gÅoÅnoÅÄ, %2 żeby zmiejszyÄ gÅoÅnoÅÄ
-
-
+
+
Opening %1
Otwieranie %1
-
+
Do you want to exit %1 with a download in progress?
Czy na pewno chcesz zamknÄ
Ä %1 w trakcie pobierania???
-
+
If you close %1 now, this download will be cancelled.
JeÅli zamkniesz %1 teraz, To pobieranie bÄdzie anulowane.
-
+
Close and cancel download
Zamnij i anuluj pobieranie
-
+
Wait for download to finish
Poczekaj na zakoÅczenie pobierania
-
+
Leave &Full Screen
OpuÅÄ &tryb peÅnoekranowy
-
+
%1 version %2 is now available.
%1 wersja %2 jest teraz dostÄpna.
-
+
Remind me later
Przypomnij mi później
-
+
Update
Aktualizuj
-
+
Error: %1
BÅÄ
d %1
-
+
P&revious
Pop&rzedni
-
+
Go back to the previous track
Powrót do poprzedniego utworu
-
+
&Compact Mode
-
+
Open the &YouTube Page
Otwórz na &Youtube
-
+
Copy the YouTube &Link
-
+
Copy the Video Stream &URL
Kopiuj adres &URL strumienia wideo
-
+
Find Video &Parts
-
+
&Clear Recent Searches
Wy&czyÅÄ Ostatnie Poszukiwania
-
+
Make a &Donation
Przekaż &darowiznÄ
-
+
&Manually Start Playing
-
+
Manually start playing videos
-
+
Choose your content location
-
+
&Play
&Odtwarzaj
-
+
Resume playback
Kontynuuj odtwarzanie
-
+
Remaining time: %1
PozostaÅy czas %1
-
+
Volume at %1%
GÅoÅnoÅÄ na %1%
-
+
Volume is muted
DźwiÄk jest wyciszony
-
+
Volume is unmuted
Przywrócono dźwiÄk
-
+
Maximum video definition set to %1
Maksymalna rozdzielczoÅÄ wideo ustawiona na %1
-
+
Your privacy is now safe
Twoja prywatnoÅÄ jest teraz bezpieczna
-
+
Downloads complete
Pobieranie ukoÅczone
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Teraz możesz wkleiÄ link Youtube do innej aplikacji
-
+
You can now paste the video stream URL into another application
Teraz możesz wkleiÄ URL do innej aplikacji
-
+
The link will be valid only for a limited time.
Link bÄdzie ważny tylko przez ograniczony czas.
-
+
This is just the demo version of %1.
To jest tylko wersja demo %1.
-
+
It allows you to test the application and see if it works for you.
Pozwala Ci to na testowanie i sprawdzenie dziaÅania aplikacji.
-
+
Continue
Kontynuuj
-
+
of
Used in video parts, as in '2 of 3'
z
-
+
part
This is for video parts, as in 'Cool video - part 1'
czÄÅÄ
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
odcinek
-
+
Sent from %1
WysÅano z %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
Pobierz peÅnÄ
wersjÄ
-
+
Downloading %1
Pobieranie %1
@@ -870,12 +984,12 @@
A new version of %1 is available!
-
+ Nowa wersja %1 jest dostÄpna!
%1 %2 is now available. You have %3.
-
+ %1 %2 jest już dostÄpny, Ty masz %3.
@@ -895,7 +1009,7 @@
Install Update
-
+ Zainstaluj aktualizacjÄ
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 widziane
-
+
%1 of %2 (%3) â %4
%1 z %2 (%3) â %4
-
+
Preparing
PrzegotowujÄ
-
+
Failed
Niepowodzenie
-
+
Completed
ZakoÅczone
-
+
Stopped
Zatrzymano
-
+
Stop downloading
Zatrzymaj pobieranie
-
+
Show in %1
Pokaż w %1
-
+
Open parent folder
-
+
Restart downloading
Pobierz od nowa
@@ -1044,17 +1158,17 @@
Short
-
+ Krótkie
Medium
-
+ Årednie
Long
-
+ DÅugie
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Witaj w <a href='%1'>%2</a>,
-
+
Get the full version
Pobierz peÅnÄ
wersjÄ
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Zatwierdź
-
+
a keyword
sÅowo kluczowe
-
+
a channel
kanaÅ
-
+
to start watching videos.
aby rozpoczÄ
Ä oglÄ
danie
-
+
Watch
OglÄ
daj
-
+
Recent keywords
Ostatnio szukane
-
+
Recent channels
Odwiedzone kanaÅy
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
&Wstecz
@@ -1196,11 +1310,6 @@
Most Popular
-
-
- Featured
-
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
Nie można uzyskaÄ dostÄpu do %1
-
+
Network error: %1 for %2
BÅÄ
d sieci: %1 for %2
@@ -1370,7 +1484,7 @@
Netherlands
-
+ Holandia
@@ -1470,7 +1584,7 @@
Worldwide
-
+ OgólnoÅwiatowy
\ No newline at end of file
diff --git a/locale/pl_PL.ts b/locale/pl_PL.ts
index fb2321e..912941f 100644
--- a/locale/pl_PL.ts
+++ b/locale/pl_PL.ts
@@ -134,6 +134,95 @@
Kup licencjÄ
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Wszystkie filmy
+
+
+
+ Unwatched Videos
+ Nieobejrzane filmy
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Oznacz wszystkie jako obserwowane
+
+
+
+ Show Updated
+ Pokaż zaktualizowane
+
+
+
+ Name
+ Nazwa
+
+
+
+ Last Updated
+ Ostatnio Zaktualizowane
+
+
+
+ Last Added
+ Ostatnio Dodane
+
+
+
+ Last Watched
+ Ostatnio Zaobserwowane
+
+
+
+ Most Watched
+ NajczÄÅciej Obserwowane
+
+
+
+ Sort by
+ Sortuj wedÅug
+
+
+
+ All Videos
+ Wszystkie filmy
+
+
+
+ Unwatched Videos
+ Nieobejrzane filmy
+
+
+
+ There are no updated subscriptions at this time.
+ Brak zaktualizowanych subskrypcji.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Szukaj
-
+
Find videos and channels by keyword
Znajdź filmy i kanaÅy po sÅowie kluczowym
-
+
Browse
PrzeglÄ
daj
-
+
Browse videos by category
PrzeglÄ
daj filmy po kategorii
+
+
+ Subscriptions
+ Subskrypcje
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
BÅÄ
d
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Zatrzymaj
-
+
Stop playback and go back to the search view
Przerwij odtwarzanie i wrÃ³Ä do wyszukiwania
-
+
S&kip
Prze&skocz dalej
-
+
Skip to the next video
Przejdź do nastÄpnego pliku wideo
-
-
+
+
&Pause
&Pauza
-
-
+
+
Pause playback
Wstrzymaj odtwarzanie
-
+
&Full Screen
&PeÅny ekran
-
+
Go full screen
PrzeÅÄ
cz na peÅny ekran
-
+
Hide the playlist and the toolbar
Ukryj listÄ odtwarzania i pasek narzÄdzi
-
+
Go to the YouTube video page and pause playback
Przejdź do strony YouTube i wstrzymaj odtwarzanie
-
+
Copy the current video YouTube link to the clipboard
Skopiuj link YouTube odtwarzanego filmu do schowka
-
+
Copy the current video stream URL to the clipboard
Kopiuj adres URL odtwarzanego wideo do schowka
-
+
Find other video parts hopefully in the right order
Znajdź pozostaÅe czÄÅci filmu w, miejmy nadziejÄ, dobrej kolejnoÅci
-
+
&Remove
&UsuÅ
-
+
Remove the selected videos from the playlist
UsuÅ wybrane pliki z listy odtwarzania
-
+
Move &Up
PrzesuÅ w &GórÄ
-
+
Move up the selected videos in the playlist
PrzesuŠwyżej zaznaczone pliki
-
+
Move &Down
PrzesuÅ w &DóÅ
-
+
Move down the selected videos in the playlist
PrzesuŠniżej zaznaczone pliki
-
+
Clear the search history. Cannot be undone.
CzyÅci historiÄ wyszukiwania. Nieodwracalnie.
-
+
&Quit
&Weź to wyÅÄ
cz
-
+
Bye
Narciarz
-
+
&Website
&WyÅwietl stronÄ
-
+
%1 on the Web
%1 on the Web
-
+
Please support the continued development of %1
Wesprzyj dalszy rozwój %1
-
+
&About
O &Programie
-
+
Info about %1
Informacje o %1
-
+
Search
Szukaj
-
+
Mute volume
Wycisz
-
-
+
+
&Downloads
&Pobrane
-
+
Show details about video downloads
Pokaż szczegóÅy o pobranych plikach
-
+
&Download
&Pobierz
-
+
Download the current video
Pobierz aktualny plik
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
Podziel siÄ tym filmem przez %1
-
+
&Email
&E-mail
-
+
Email
e-mail
-
+
&Close
&Zamknij
-
+
&Float on Top
&Ustaw na wierzchu
-
+
&Stop After This Video
&Zatrzymaj po tym filmie
-
+
&Report an Issue...
ZgÅoÅ problem...
-
+
&Refine Search...
&ZawÄź wyszukiwanie...
-
+
More...
WiÄcej...
-
+
&Related Videos
PowiÄ
zane filmy
-
+
Watch videos related to the current one
OglÄ
daj filmy powiÄ
zane z aktualnie oglÄ
danym
-
+
&Application
&Aplikacja
-
+
Buy %1...
Kup%1
-
+
&Playback
&Odtwarzanie
-
+
&Playlist
&Lista odtwarzania
-
+
&Video
&Wideo
-
+
&View
&Widok
-
+
&Share
&Podziel siÄ
-
+
&Help
&Halp znaczy pomoc
-
+
Press %1 to raise the volume, %2 to lower it
NaciÅnij %1 aby podgÅoÅniÄ, %2 aby przyciszyÄ
-
-
+
+
Opening %1
Otwieranie %1
-
+
Do you want to exit %1 with a download in progress?
Czy na pewno chcesz zamknÄ
Ä %1 w trakcie pobierania???
-
+
If you close %1 now, this download will be cancelled.
JeÅli zamkniesz %1 teraz, To pobieranie bÄdzie anulowane.
-
+
Close and cancel download
Zamnij i anuluj pobieranie
-
+
Wait for download to finish
Poczekaj na zakoÅczenie pobierania
-
+
Leave &Full Screen
OpuÅÄ peÅny ekran (&F)
-
+
%1 version %2 is now available.
Wersja %1 %2 jest dostÄpna
-
+
Remind me later
Przypomnij później
-
+
Update
Zaktualizuj
-
+
Error: %1
BÅÄ
d %1
-
+
P&revious
P&oprzedni
-
+
Go back to the previous track
WrÃ³Ä do poprzedniej Åcieżki
-
+
&Compact Mode
&Tryb kompaktowy
-
+
Open the &YouTube Page
Otwórz stronÄ &YouTube
-
+
Copy the YouTube &Link
Skopiuj &link do strony Youtube
-
+
Copy the Video Stream &URL
Skopiuj &URL strumienia wideo
-
+
Find Video &Parts
Znajdź czÄÅci filmu
-
+
&Clear Recent Searches
&WyczyÅÄ ostatnie wyszukiwania
-
+
Make a &Donation
Przekaż &dotacjÄ
-
+
&Manually Start Playing
&RÄczne rozpoczynanie odtwarzania
-
+
Manually start playing videos
RÄcznie odtwarzaj filmy
-
+
Choose your content location
Wybierz swojÄ
lokalizacjÄ
-
+
&Play
&Graj
-
+
Resume playback
PrzywrÃ³Ä odtwarzanie
-
+
Remaining time: %1
PozostaÅy czas: %1
-
+
Volume at %1%
GÅoÅnoÅÄ: %1%
-
+
Volume is muted
DźwiÄk wyciszony
-
+
Volume is unmuted
DźwiÄk przywrócony
-
+
Maximum video definition set to %1
Maksymalna rozdzielczoÅÄ wideo ustawiona na %1
-
+
Your privacy is now safe
Twoja prywatnoÅÄ jest już bezpieczna
-
+
Downloads complete
Pobieranie ukoÅczone
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Teraz można wkleiÄ link YouTube do innej aplikacji
-
+
You can now paste the video stream URL into another application
Teraz możesz wkleiÄ URL do innej aplikacji
-
+
The link will be valid only for a limited time.
Link bÄdzie ważny tylko przez ograniczony czas.
-
+
This is just the demo version of %1.
To jest tylko wersja demo %1.
-
+
It allows you to test the application and see if it works for you.
Pozwala przetestowaÄ aplikacjÄ, i zobaczyÄ czy Ci odpowiada.
-
+
Continue
Dalej
-
+
of
Used in video parts, as in '2 of 3'
z
-
+
part
This is for video parts, as in 'Cool video - part 1'
czÄÅÄ
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
odcinek
-
+
Sent from %1
PrzesÅane od %1
-
+
+ Unsubscribe from %1
+ UsuÅ subskrypcje %1
+
+
+
+ Subscribe to %1
+ Subskrybuj %1
+
+
+
Get the full version
ZdobÄ
dź peÅnÄ
wersjÄ
-
+
Downloading %1
Pobieranie %1
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1widziany
-
+
%1 of %2 (%3) â %4
%1 z %2 (%3) â %4
-
+
Preparing
Przygotowywanie
-
+
Failed
Niepowodzenie
-
+
Completed
UkoÅczone
-
+
Stopped
Zatrzymano
-
+
Stop downloading
Przerwij pobieranie
-
+
Show in %1
Pokaż w %1
-
+
Open parent folder
Otwórz katalog nadrzÄdny
-
+
Restart downloading
Pobierz ponownie
@@ -1003,7 +1117,7 @@
View Count
-
+ WyÅwietlenia
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Witaj w <a href='%1'>%2</a>,
-
+
Get the full version
Pobierz peÅnÄ
wersjÄ
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Zatwierdź
-
+
a keyword
sÅowo kluczowe
-
+
a channel
kanaÅ
-
+
to start watching videos.
aby rozpoczÄ
Ä oglÄ
danie
-
+
Watch
OglÄ
daj
-
+
Recent keywords
Ostatnie wyszukiwania
-
+
Recent channels
Ostatnie kanaÅy
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
&Wstecz
@@ -1196,11 +1310,6 @@
Most Popular
Najpopularniejsze
-
-
- Featured
- Wyróżnione
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
Najlepiej oceniane
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
Strumieniowanie %1 nie powiodÅo siÄ
-
+
Network error: %1 for %2
BÅÄ
d sieci: %1 dla %2
diff --git a/locale/pt_BR.ts b/locale/pt_BR.ts
index fca6446..81ca250 100644
--- a/locale/pt_BR.ts
+++ b/locale/pt_BR.ts
@@ -15,7 +15,7 @@
Licensed to: %1
-
+ Licenciado a: %1
@@ -78,17 +78,17 @@
Enter your License Details
-
+ Entre com seus Detalhes de Licença
&Email:
-
+ E-mail:
&Code:
-
+ Código:
@@ -106,12 +106,12 @@
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
+ A versão completa permite que você baixe vÃdeos com mais de %1 minutos e assista-os sem interrupções.
Without a license, the application will expire in %1 days.
-
+ Sem licença, a aplicação irá expirar em %1 dias.
@@ -126,12 +126,101 @@
Enter License
-
+ Entrar com a Licença.
Buy License
-
+ Comprar a Licença.
+
+
+
+ ChannelAggregator
+
+
+ By %1
+ Por %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Todos Os VÃdeos
+
+
+
+ Unwatched Videos
+ VÃdeos Não Assistidos
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Marcar tudo como assistido
+
+
+
+ Show Updated
+ Mostrar Atualização
+
+
+
+ Name
+ Nome
+
+
+
+ Last Updated
+ Ãltima Atualização
+
+
+
+ Last Added
+ Ãltimo Adicionado
+
+
+
+ Last Watched
+ Ãltimo Assistido
+
+
+
+ Most Watched
+ Mais Assistidos
+
+
+
+ Sort by
+ Ordenar por
+
+
+
+ All Videos
+ Todos Os VÃdeos
+
+
+
+ Unwatched Videos
+ VÃdeos Não Assistidos
+
+
+
+ There are no updated subscriptions at this time.
+ Não há assinaturas atualizadas neste momento.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Você não tem assinaturas. Use o sÃmbolo da estrela para assinar canais.
@@ -270,7 +359,7 @@
Downloading update...
-
+ Baixando atualização...
@@ -339,24 +428,34 @@
HomeView
-
+
Search
Pesquisar
-
+
Find videos and channels by keyword
-
+ Encontrar vÃdeos e canais por palavra-chave
-
+
Browse
-
+ Procurar
-
+
Browse videos by category
-
+ Procurar vÃdeos por categoria
+
+
+
+ Subscriptions
+ Assinados
+
+
+
+ Channel subscriptions
+ Canais assinados
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Erro
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Parar
-
+
Stop playback and go back to the search view
Parar a reprodução e voltar à visualização da pesquisa
-
+
S&kip
Pu&lar
-
+
Skip to the next video
Pular para o próximo vÃdeo
-
-
+
+
&Pause
&Pausar
-
-
+
+
Pause playback
Pausar a reprodução
-
+
&Full Screen
&Tela Cheia
-
+
Go full screen
Ir para a tela cheia
-
+
Hide the playlist and the toolbar
Ocultar a playlist e a barra de ferramentas
-
+
Go to the YouTube video page and pause playback
Ir à página de vÃdeo do YouTube e pausar a reprodução
-
+
Copy the current video YouTube link to the clipboard
Copiar o link do vÃdeo atual do YouTube para a área de transferência
-
+
Copy the current video stream URL to the clipboard
Copiar a URL do stream do vÃdeo atual para a área de transferência
-
+
Find other video parts hopefully in the right order
Localizar partes de outro vÃdeo esperando na ordem certa
-
+
&Remove
&Remover
-
+
Remove the selected videos from the playlist
Remover os vÃdeos selecionados da playlist
-
+
Move &Up
Mover para &cima
-
+
Move up the selected videos in the playlist
Mover para cima os vÃdeos selecionados na playlist
-
+
Move &Down
Mover para &baixo
-
+
Move down the selected videos in the playlist
Mover para baixo os vÃdeos selecionados na playlist
-
+
Clear the search history. Cannot be undone.
Apagar o histórico de pesquisa. Não pode ser desfeito.
-
+
&Quit
&Sair
-
+
Bye
Tchau
-
+
&Website
Si&te
-
+
%1 on the Web
%1 na Web
-
+
Please support the continued development of %1
Por favor, apoie o desenvolvimento continuado de %1
-
+
&About
&Sobre
-
+
Info about %1
Informações sobre %1
-
+
Search
Pesquisar
-
+
Mute volume
Volume mudo
-
-
+
+
&Downloads
&Downloads
-
+
Show details about video downloads
Mostrar detalhes sobre os downloads de vÃdeo
-
+
&Download
&Download
-
+
Download the current video
Baixar o vÃdeo atual
-
+
+ &Subscribe to Channel
+ A&ssinar um canal
+
+
+
Share the current video using %1
Compartilhar o vÃdeo atual usando %1
-
+
&Email
&E-mail
-
+
Email
E-mail
-
+
&Close
&Fechar
-
+
&Float on Top
&Sempre Acima
-
+
&Stop After This Video
&Parar Após Este VÃdeo
-
+
&Report an Issue...
&Relatar um problema...
-
+
&Refine Search...
&Refinar Pesquisa...
-
+
More...
-
+ Mais...
-
+
&Related Videos
-
+ VÃdeos &relacionados
-
+
Watch videos related to the current one
-
+ Assistir vÃdeos relacionados à atual
-
+
&Application
&Aplicação
-
+
Buy %1...
Adquirir %1...
-
+
&Playback
&Reprodução
-
+
&Playlist
&Playlist
-
+
&Video
&VÃdeo
-
+
&View
&Visualizar
-
+
&Share
&Compartilhar
-
+
&Help
&Ajuda
-
+
Press %1 to raise the volume, %2 to lower it
Pressione %1 para aumentar o volume, %2 para diminui-lo
-
-
+
+
Opening %1
Abrindo %1
-
+
Do you want to exit %1 with a download in progress?
Você deseja sair de "%1" com uma transferência em curso?
-
+
If you close %1 now, this download will be cancelled.
Se você fechar %1 agora, este download será cancelado.
-
+
Close and cancel download
Fechar e cancelar download
-
+
Wait for download to finish
Aguardar o download terminar
-
+
Leave &Full Screen
Deixar Em &Tela Cheia
-
+
%1 version %2 is now available.
%1 versão %2 está agora disponÃvel.
-
+
Remind me later
Lembrar mais tarde
-
+
Update
Atualizar
-
+
Error: %1
Erro: %1
-
+
P&revious
Ante&rior
-
+
Go back to the previous track
Ir para a faixa anterior
-
+
&Compact Mode
Modo &Compacto
-
+
Open the &YouTube Page
Abrir a Página do &YouTube
-
+
Copy the YouTube &Link
Copiar o &Link do YouTube
-
+
Copy the Video Stream &URL
Copiar a &URL do Stream do VÃdeo
-
+
Find Video &Parts
Localizar &Parte Do VÃdeo
-
+
&Clear Recent Searches
&Limpar Buscas Recentes
-
+
Make a &Donation
Faça uma &Doação
-
+
&Manually Start Playing
Iniciar &Manualmente A Reprodução
-
+
Manually start playing videos
Iniciar manualmente a reprodução de vÃdeos
-
+
Choose your content location
-
+ Escolher seu conteúdo local
-
+
&Play
&Reproduzir
-
+
Resume playback
Continuar reprodução
-
+
Remaining time: %1
Tempo restante: %1
-
+
Volume at %1%
Volume a %1%
-
+
Volume is muted
Volume está mudo
-
+
Volume is unmuted
Volume não está mudo
-
+
Maximum video definition set to %1
Máxima definição de vÃdeo definida para %1
-
+
Your privacy is now safe
Sua privacidade está agora segura
-
+
Downloads complete
Downloads finalizados
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Agora você pode colar o link do YouTube em outro programa
-
+
You can now paste the video stream URL into another application
Agora você pode colar a URL do stream de vÃdeo em outro programa
-
+
The link will be valid only for a limited time.
O link só será válido por um tempo limitado.
-
+
This is just the demo version of %1.
Esta é apenas a versão demonstação de %1.
-
+
It allows you to test the application and see if it works for you.
Ele permite que você teste o aplicativo e veja se ele funciona para você.
-
+
Continue
Continuar
-
+
of
Used in video parts, as in '2 of 3'
de
-
+
part
This is for video parts, as in 'Cool video - part 1'
parte
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
epsódio
-
+
Sent from %1
Envido de %1
-
+
+ Unsubscribe from %1
+ Cancelar a assinatura de %1
+
+
+
+ Subscribe to %1
+ Assinar %1
+
+
+
Get the full version
Obter a versão completa
-
+
Downloading %1
Baixando %1
@@ -870,32 +984,32 @@
A new version of %1 is available!
-
+ Uma nova versão do %1 está disponÃvel!
%1 %2 is now available. You have %3.
-
+ %1 %2 está disponÃvel. Você está usando %3.
Would you like to download it now?
-
+ Gostaria de fazer o download agora?
Skip This Version
-
+ Pular esta versão.
Remind Me Later
-
+ Me lembre mais tarde.
Install Update
-
+ Instalar atualização.
@@ -903,58 +1017,58 @@
Paste
-
+ Colar.
PlaylistItemDelegate
-
+
%1 views
%1 visualizações
-
+
%1 of %2 (%3) â %4
%1 de %2 (%3) â %4
-
+
Preparing
Preparando
-
+
Failed
Falhou
-
+
Completed
Finalizado
-
+
Stopped
Parado
-
+
Stop downloading
Parar download
-
+
Show in %1
Mostrar em %1
-
+
Open parent folder
Abrir pasta pai
-
+
Restart downloading
Reiniciar download
@@ -1097,7 +1211,7 @@
Done
-
+ Feito
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Bem-vindo ao <a href='%1'>%2</a>,
-
+
Get the full version
Obter a versão completa
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Digite
-
+
a keyword
uma palavra chave
-
+
a channel
um canal
-
+
to start watching videos.
para começar a assistir vÃdeos.
-
+
Watch
Assistir
-
+
Recent keywords
Palavra-chave recente
-
+
Recent channels
Canais recentes
@@ -1160,20 +1274,20 @@
SidebarHeader
-
-
+
+
&Back
&Voltar
Forward to %1
-
+ Avançar para %1
Back to %1
-
+ Voltar para %1
@@ -1194,38 +1308,38 @@
Most Popular
-
-
-
-
- Featured
-
+ Mais Popular
Most Shared
-
+ Mais Compartilhado
Most Discussed
-
+ Mais Discutido
Top Rated
-
+ Mais Populares
+
+
+
+ All Time Popular
+ Todos Os Tempos Populares
Video
-
+
Cannot get video stream for %1
Não foi possÃvel obter stream de vÃdeo de %1
-
+
Network error: %1 for %2
Erro na rede: %1 para %2
@@ -1235,242 +1349,242 @@
Algeria
-
+ Argélia
Argentina
-
+ Argentina
Australia
-
+ Austrália
Belgium
-
+ Bélgica
Brazil
-
+ Brasil
Canada
-
+ Canadá
Chile
-
+ Chile
Colombia
-
+ Colômbia
Czech Republic
-
+ República Tcheca
Egypt
-
+ Egito
France
-
+ França
Germany
-
+ Alemanha
Ghana
-
+ Gana
Greece
-
+ Grécia
Hong Kong
-
+ Hong Kong
Hungary
-
+ Hungria
India
-
+ Ãndia
Indonesia
-
+ Indonésia
Ireland
-
+ Irlanda
Israel
-
+ Israel
Italy
-
+ Itália
Japan
-
+ Japão
Jordan
-
+ Jordânia
Kenya
-
+ Quênia
Malaysia
-
+ Malásia
Mexico
-
+ México
Morocco
-
+ Marrocos
Netherlands
-
+ Holanda
New Zealand
-
+ Nova Zelândia
Nigeria
-
+ Nigéria
Peru
-
+ Peru
Philippines
-
+ Filipinas
Poland
-
+ Polônia
Russia
-
+ Rússia
Saudi Arabia
-
+ Arábia Saudita
Singapore
-
+ Singapura
South Africa
-
+ Ãfrica do Sul
South Korea
-
+ Coréia do Sul
Spain
-
+ Espanha
Sweden
-
+ Suécia
Taiwan
-
+ Taiwan
Tunisia
-
+ TunÃsia
Turkey
-
+ Turquia
Uganda
-
+ Uganda
United Arab Emirates
-
+ Emirados Ãrabes Unidos
United Kingdom
-
+ Reino Unido
Yemen
-
+ Iémen
Worldwide
-
+ Mundial
\ No newline at end of file
diff --git a/locale/ro.ts b/locale/ro.ts
index 44824e7..23dd193 100644
--- a/locale/ro.ts
+++ b/locale/ro.ts
@@ -134,6 +134,95 @@
CumpÄrÄ LicenÈÄ
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+ SorteazÄ dupÄ
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
CautÄ
-
+
Find videos and channels by keyword
-
+
Browse
-
+
Browse videos by category
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Eroare
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Stop
-
+
Stop playback and go back to the search view
OpreÈte redarea Èi întoarce-te la cÄsuÈa de cÄutare
-
+
S&kip
O&mite
-
+
Skip to the next video
Treci la videoclipul urmÄtor
-
-
+
+
&Pause
&PauzÄ
-
-
+
+
Pause playback
Pune redarea pe pauzÄ
-
+
&Full Screen
Ec&ran complet
-
+
Go full screen
VizualizeazÄ pe tot ecranul
-
+
Hide the playlist and the toolbar
Ascunde lista de redare Èi bara de unelte
-
+
Go to the YouTube video page and pause playback
Deschide pagina de pe YouTube si pune pauzÄ
-
+
Copy the current video YouTube link to the clipboard
CopiazÄ adresa videoclipului YouTube curent în clipboard
-
+
Copy the current video stream URL to the clipboard
CopiazÄ adresa fluxului video curent în clipboard
-
+
Find other video parts hopefully in the right order
CautÄ alte pÄrÈi ale videoclipului
-
+
&Remove
È&terge
-
+
Remove the selected videos from the playlist
Èterge videoclipul selectat din lista de redare
-
+
Move &Up
MutÄ Ã®n &sus
-
+
Move up the selected videos in the playlist
MutÄ Ã®n sus videoclipul selectat
-
+
Move &Down
MutÄ Ã®n &jos
-
+
Move down the selected videos in the playlist
MutÄ Ã®n jos videoclipul selectat
-
+
Clear the search history. Cannot be undone.
CurÄÈÄ istoricul de cÄutÄri. AcÈiune ireversibilÄ.
-
+
&Quit
&IeÈire
-
+
Bye
La revedere
-
+
&Website
Site &Web
-
+
%1 on the Web
%1 pe Web
-
+
Please support the continued development of %1
Te rog sÄ susÈii dezvoltarea aplicaÈiei %1
-
+
&About
&Despre
-
+
Info about %1
InformaÈii despre %1
-
+
Search
CÄutare
-
+
Mute volume
Oprire sunet
-
-
+
+
&Downloads
&DescÄrcÄri
-
+
Show details about video downloads
AratÄ detalii despre descÄrcÄrile video
-
+
&Download
&DescÄrcare
-
+
Download the current video
DescarcÄ videoclipul curent
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
ÃmpÄrtÄÈeÈte videoclipul curent folosind %1
-
+
&Email
&Email
-
+
Email
Email
-
+
&Close
Ãn&chide
-
+
&Float on Top
&DetaÈeazÄ
-
+
&Stop After This Video
&OpreÈte DupÄ Acest Videoclip
-
+
&Report an Issue...
&RaporteazÄ o problemÄ...
-
+
&Refine Search...
&CÄutare rafinatÄ...
-
+
More...
-
+
&Related Videos
-
+
Watch videos related to the current one
-
+
&Application
&AplicaÈie
-
+
Buy %1...
CumpÄrÄ %1...
-
+
&Playback
&Redare
-
+
&Playlist
&ListÄ de redare
-
+
&Video
&Video
-
+
&View
Vi&zualizare
-
+
&Share
Ã&mpÄrtÄÈeÈte
-
+
&Help
&Ajutor
-
+
Press %1 to raise the volume, %2 to lower it
ApasÄ pe %1 pentru a da volumul mai tare sau pe %2 pentru a-l da mai încet
-
-
+
+
Opening %1
Deschidere %1
-
+
Do you want to exit %1 with a download in progress?
DoriÅ£i sÄ ieÈiÈi din %1 cu o descÄrcare în progres?
-
+
If you close %1 now, this download will be cancelled.
DacÄ ieÈiÈi acum din %1, procesul de descÄrcare va fi anulat.
-
+
Close and cancel download
Ãnchide Èi anuleazÄ descÄrcarea
-
+
Wait for download to finish
AÈteaptÄ ca descÄrcarea sÄ se încheie
-
+
Leave &Full Screen
IeÈi din Ec&ran Complet
-
+
%1 version %2 is now available.
Versiunea %1 a %2 este acum disponibilÄ.
-
+
Remind me later
ReaminteÈte-mi mai târziu
-
+
Update
ActualizeazÄ
-
+
Error: %1
Eroare: %1
-
+
P&revious
&Anterioare
-
+
Go back to the previous track
Mergi înapoi la piesa precedentÄ
-
+
&Compact Mode
Modul &Compact
-
+
Open the &YouTube Page
Deschide Pagina &YouTube
-
+
Copy the YouTube &Link
CopiazÄ &adresa videoclipului YouTube
-
+
Copy the Video Stream &URL
CopiazÄ adresa &fluxului video
-
+
Find Video &Parts
CautÄ &PÄrÈi ale Videoclipului
-
+
&Clear Recent Searches
Èt&erge CÄutÄrile Recente
-
+
Make a &Donation
FÄ o &DonaÈie
-
+
&Manually Start Playing
PorneÈte Redarea &Manual
-
+
Manually start playing videos
PorneÈte redarea videoclipurilor manual
-
+
Choose your content location
-
+
&Play
&Redare
-
+
Resume playback
RezumÄ redarea videoclipului
-
+
Remaining time: %1
Timp rÄmas : %1
-
+
Volume at %1%
Volum %1
-
+
Volume is muted
Sunetul este oprit
-
+
Volume is unmuted
Sunetul este pornit
-
+
Maximum video definition set to %1
RezoluÈia maxima a videoclipului este setatÄ la %1
-
+
Your privacy is now safe
Intimitatea dumneavoastrÄ este acum în siguranÈÄ
-
+
Downloads complete
DescÄrcÄri complete
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Acum poÈi adÄuga adresa YouTube într-o altÄ aplicaÈie
-
+
You can now paste the video stream URL into another application
Acum poÈi adÄuga adresa fluxului video într-o altÄ aplicaÈie
-
+
The link will be valid only for a limited time.
Adresa va fi validÄ doar pentru o perioadÄ limitatÄ de timp.
-
+
This is just the demo version of %1.
Aceasta este doar o versiune demo a %1.
-
+
It allows you to test the application and see if it works for you.
VÄ permite sÄ testaÈi aplicaÈia Èi sÄ vedeÈi dacÄ funcÈioneazÄ.
-
+
Continue
ContinuÄ
-
+
of
Used in video parts, as in '2 of 3'
din
-
+
part
This is for video parts, as in 'Cool video - part 1'
partea
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
episodul
-
+
Sent from %1
Trimis din %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
ObÈine versiunea integralÄ
-
+
Downloading %1
DescÄrcare %1
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 vizionÄri
-
+
%1 of %2 (%3) â %4
-
+
Preparing
-
+
Failed
-
+
Completed
-
+
Stopped
-
+
Stop downloading
-
+
Show in %1
-
+
Open parent folder
-
+
Restart downloading
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Bine aÈi venit la <a href='%1'>%2</a>,
-
+
Get the full version
ObÈine versiunea integralÄ
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
IntroduceÈi
-
+
a keyword
un cuvânt cheie
-
+
a channel
un canal
-
+
to start watching videos.
pentru a începe sÄ vizionaÈi videoclipuri.
-
+
Watch
UrmÄreÈte
-
+
Recent keywords
CÄutÄri recente
-
+
Recent channels
Canale recente
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
Ã&napoi
@@ -1196,11 +1310,6 @@
Most Popular
-
-
- Featured
-
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
Nu poate fi accesat fluxul video pentru %1
-
+
Network error: %1 for %2
Eroare reţea: %1 pentru %2
diff --git a/locale/ru.ts b/locale/ru.ts
index 5f4af6e..e91ca34 100644
--- a/locale/ru.ts
+++ b/locale/ru.ts
@@ -107,7 +107,7 @@
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
+ ÐÐ¾Ð»Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑмоÑÑеÑÑ Ð²Ð¸Ð´ÐµÐ¾, добавлÑÑÑ Ð±Ð¾Ð»ÐµÐµ %1 ÑÑеков в ÑпиÑке воÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸ вÑбиÑаÑÑ ÑазнÑе ваÑианÑÑ Ð¿ÐµÑен.
@@ -135,6 +135,95 @@
ÐÑпиÑÑ Ð»Ð¸ÑензиÑ
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ ÐÑмеÑиÑÑ Ð²Ñе как пÑоÑмоÑÑенное
+
+
+
+ Show Updated
+ ÐоказаÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñе
+
+
+
+ Name
+ Ðазвание
+
+
+
+ Last Updated
+ Ðедавно обновленнÑе
+
+
+
+ Last Added
+ Ðедавно добавленнÑе
+
+
+
+ Last Watched
+ Ðедавно пÑоÑмоÑÑеннÑе
+
+
+
+ Most Watched
+ Ðаиболее пÑоÑмаÑиваемÑе
+
+
+
+ Sort by
+ СоÑÑиÑоваÑÑ Ð¿Ð¾
+
+
+
+ All Videos
+ ÐÑе видео
+
+
+
+ Unwatched Videos
+ Ðе пÑоÑмоÑÑенное видео
+
+
+
+ There are no updated subscriptions at this time.
+ РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð½ÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹ подпиÑок.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ У Ð²Ð°Ñ Ð½ÐµÐ´ подпиÑок. ÐÑполÑзÑйÑе Ñимвол звездоÑки ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð¿ÑваÑÑÑÑ Ð½Ð° каналÑ.
+
+
ClearButton
@@ -340,35 +429,45 @@
HomeView
-
+
Search
ÐоиÑк
-
+
Find videos and channels by keyword
-
+ ÐоиÑк видео и каналов по запÑоÑÑ
-
+
Browse
-
+ СмоÑÑеÑÑ
-
+
Browse videos by category
-
+ СмоÑÑеÑÑ Ð²Ð¸Ð´ÐµÐ¾ по каÑегоÑиÑм
+
+
+
+ Subscriptions
+ ÐодпиÑки
+
+
+
+ Channel subscriptions
+ ÐодпиÑки на каналÑ
Make yourself comfortable
-
+ ЧÑвÑÑвÑйÑе ÑÐµÐ±Ñ ÐºÐ°Ðº дома
LoadingWidget
-
+
Error
ÐÑибка
@@ -376,426 +475,431 @@
MainWindow
-
+
&Stop
&ÐÑÑановиÑÑ
-
+
Stop playback and go back to the search view
ÐÑÑановиÑÑ Ð²Ð¾ÑпÑоизведение и веÑнÑÑÑÑÑ Ðº поиÑкÑ
-
+
S&kip
Ð&ÑопÑÑÑиÑÑ
-
+
Skip to the next video
ÐеÑейÑи к ÑледÑÑÑÐµÐ¼Ñ ÐºÐ»Ð¸Ð¿Ñ
-
-
+
+
&Pause
&ÐаÑза
-
-
+
+
Pause playback
ÐÑиоÑÑановиÑÑ Ð²Ð¾ÑпÑоизведение
-
+
&Full Screen
&Ðа веÑÑ ÑкÑан
-
+
Go full screen
ÐолноÑкÑанное воÑпÑоизведение
-
+
Hide the playlist and the toolbar
СкÑÑÑÑ ÑпиÑок воÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸ Ð¿Ð°Ð½ÐµÐ»Ñ Ð¸Ð½ÑÑÑÑменÑов
-
+
Go to the YouTube video page and pause playback
ÐÑиоÑÑановиÑÑ Ð²Ð¾ÑпÑоизведение и пеÑейÑи на ÑÑÑаниÑÑ Ð²Ð¸Ð´ÐµÐ¾ в YouTube
-
+
Copy the current video YouTube link to the clipboard
СкопиÑоваÑÑ ÑÑÑÐ»ÐºÑ ÑекÑÑего клипа YouTube в бÑÑÐµÑ Ð¾Ð±Ð¼ÐµÐ½Ð°
-
+
Copy the current video stream URL to the clipboard
СкопиÑоваÑÑ Ð°Ð´ÑÐµÑ ÑекÑÑего видео поÑока в бÑÑÐµÑ Ð¾Ð±Ð¼ÐµÐ½Ð°
-
+
Find other video parts hopefully in the right order
ÐайÑи дÑÑгие ÑаÑÑи видео, надеÑÑÑ, в пÑавилÑном поÑÑдке
-
+
&Remove
&УдалиÑÑ
-
+
Remove the selected videos from the playlist
УдалиÑÑ Ð²ÑбÑаннÑе ÐºÐ»Ð¸Ð¿Ñ Ð¸Ð· ÑпиÑка воÑпÑоизведениÑ
-
+
Move &Up
Ð&веÑÑ
-
+
Move up the selected videos in the playlist
ÐеÑемеÑÑиÑÑ Ð²ÑбÑаннÑе Ð²Ð¸Ð´ÐµÐ¾ÐºÐ»Ð¸Ð¿Ñ Ð²Ð²ÐµÑÑ
в ÑпиÑке воÑпÑоизведениÑ
-
+
Move &Down
Ð&низ
-
+
Move down the selected videos in the playlist
ÐеÑемеÑÑиÑÑ Ð²ÑбÑаннÑе Ð²Ð¸Ð´ÐµÐ¾ÐºÐ»Ð¸Ð¿Ñ Ð²Ð½Ð¸Ð· в ÑпиÑке воÑпÑоизведениÑ
-
+
Clear the search history. Cannot be undone.
ÐÑиÑÑиÑÑ Ð¸ÑÑоÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов. ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±ÑаÑимÑ.
-
+
&Quit
&ÐÑÑ
од
-
+
Bye
Ðока
-
+
&Website
&ÐомаÑнÑÑ ÑÑÑаниÑа
-
+
%1 on the Web
%1 в инÑеÑнеÑе
-
+
Please support the continued development of %1
ÐоддеÑжиÑе далÑнейÑÑÑ ÑазÑабоÑÐºÑ %1
-
+
&About
&РпÑогÑамме
-
+
Info about %1
Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ %1
-
+
Search
ÐоиÑк
-
+
Mute volume
ÐÑклÑÑиÑÑ Ð·Ð²Ñк
-
-
+
+
&Downloads
ÐагÑÑзки
-
+
Show details about video downloads
ÐоказаÑÑ Ð¿Ð¾Ð´ÑобноÑÑи о загÑÑзкаÑ
видео
-
+
&Download
ÐагÑÑзиÑÑ
-
+
Download the current video
ÐагÑÑзиÑÑ Ð¿ÑоигÑÑваемÑй Ñайл
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
ÐоделиÑÑÑÑ ÑекÑÑим видео Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ %1
-
+
&Email
&Email
-
+
Email
Email
-
+
&Close
&ÐакÑÑÑÑ
-
+
&Float on Top
&ÐовеÑÑ
вÑеÑ
окон
-
+
&Stop After This Video
ÐÑÑ&ановиÑÑ Ð¿Ð¾Ñле ÑÑого видео
-
+
&Report an Issue...
Соо&бÑиÑÑ Ð¾Ð± оÑибке
-
+
&Refine Search...
&УÑоÑниÑÑ Ð¿Ð¾Ð¸Ñк...
-
+
More...
ÐолÑÑе...
-
+
&Related Videos
Ðо&Ñ
ожее видео
-
+
Watch videos related to the current one
СмоÑÑеÑÑ Ð²Ð¸Ð´ÐµÐ¾, ÑвÑзаннÑе Ñ ÑекÑÑим
-
+
&Application
ÐÑ&иложение
-
+
Buy %1...
ÐÑпиÑÑ %1...
-
+
&Playback
&ÐоÑпÑоизведение
-
+
&Playlist
&СпиÑок воÑпÑоизведениÑ
-
+
&Video
&Ðидео
-
+
&View
&ÐÑоÑмоÑÑ
-
+
&Share
&ÐоделиÑÑÑÑ
-
+
&Help
СпÑ&авка
-
+
Press %1 to raise the volume, %2 to lower it
ÐажмиÑе %1 Ð´Ð»Ñ ÑвелиÑÐµÐ½Ð¸Ñ Ð³ÑомкоÑÑи и %2 Ð´Ð»Ñ ÑменÑÑениÑ
-
-
+
+
Opening %1
ÐÑкÑÑÑие %1
-
+
Do you want to exit %1 with a download in progress?
ÐÑ Ð´ÐµÐ¹ÑÑвиÑелÑно Ñ
оÑиÑе закÑÑÑÑ %1 в Ñо вÑемÑ, как загÑÑжаÑÑÑÑ ÑайлÑ?
-
+
If you close %1 now, this download will be cancelled.
ÐÑли Ð²Ñ Ð·Ð°ÐºÑоеÑе %1 пÑÑмо ÑейÑаÑ, ÑекÑÑие загÑÑзки бÑдÑÑ Ð¾ÑмененÑ.
-
+
Close and cancel download
ÐÑйÑи оÑменив загÑÑзки
-
+
Wait for download to finish
ÐодождаÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð·Ð°Ð³ÑÑзок
-
+
Leave &Full Screen
ÐокинÑÑÑ Ð¿&олноÑкÑаннÑй Ñежим
-
+
%1 version %2 is now available.
%1 веÑÑÐ¸Ñ %2 ÑепеÑÑ Ð´Ð¾ÑÑÑпна.
-
+
Remind me later
ÐапомниÑÑ Ð¿Ð¾Ð·Ð¶Ðµ
-
+
Update
Ðбновление
-
+
Error: %1
ÐÑибка: %1
-
+
P&revious
ÐÑ&едÑдÑÑий
-
+
Go back to the previous track
ÐеÑнÑÑÑÑÑ Ðº пÑедÑдÑÑÐµÐ¼Ñ ÑÑекÑ
-
+
&Compact Mode
Ðомпак&ÑнÑй Ñежим
-
+
Open the &YouTube Page
ÐÑ&кÑÑÑÑ ÑÑÑаниÑÑ YouTube
-
+
Copy the YouTube &Link
ÐопиÑоваÑÑ &ÑÑÑÐ»ÐºÑ Ð½Ð° YouTube
-
+
Copy the Video Stream &URL
ÐопиÑоваÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° в&идео поÑок
-
+
Find Video &Parts
ÐайÑи &ÑÑагменÑÑ Ð²Ð¸Ð´ÐµÐ¾
-
+
&Clear Recent Searches
Ð&ÑиÑÑиÑÑ Ð¿Ð¾Ñледние поиÑковÑе запÑоÑÑ
-
+
Make a &Donation
Сд&елаÑÑ Ð¿Ð¾Ð¶ÐµÑÑвование
-
+
&Manually Start Playing
&ÐаÑаÑÑ Ð¿ÑоигÑÑвание вÑÑÑнÑÑ
-
+
Manually start playing videos
ÐаÑаÑÑ Ð¿ÑоигÑÑвание видео вÑÑÑнÑÑ
-
+
Choose your content location
-
+ ÐÑбеÑиÑе ваÑе ÑаÑположение
-
+
&Play
ÐÑ&оигÑаÑÑ
-
+
Resume playback
ÐÑодолжиÑÑ Ð²Ð¾ÑпÑоизведение
-
+
Remaining time: %1
ÐÑÑалоÑÑ: %1
-
+
Volume at %1%
ÐÑомкоÑÑÑ %1%
-
+
Volume is muted
ÐвÑк вÑклÑÑен
-
+
Volume is unmuted
ÐвÑк вклÑÑен
-
+
Maximum video definition set to %1
ÐакÑималÑное ÑазÑеÑение видео: %1
-
+
Your privacy is now safe
ÐонÑиденÑиалÑноÑÑÑ Ð¾Ð±ÐµÑпеÑена
-
+
Downloads complete
ÐагÑÑзка завеÑÑена
@@ -803,65 +907,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
ТепеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑÑавиÑÑ Ð°Ð´ÑÐµÑ YouTube в дÑÑгое пÑиложение
-
+
You can now paste the video stream URL into another application
ТепеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑÑавиÑÑ Ð°Ð´ÑÐµÑ Ð²Ð¸Ð´ÐµÐ¾ поÑока в дÑÑгое пÑиложение
-
+
The link will be valid only for a limited time.
ÐдÑÐµÑ Ð±ÑÐ´ÐµÑ ÑÑÑеÑÑвоваÑÑ Ð¾Ð³ÑаниÑенное вÑемÑ.
-
+
This is just the demo version of %1.
ÐÐ°Ð½Ð½Ð°Ñ Ð¿ÑогÑамма ÑвлÑеÑÑÑ Ð´ÐµÐ¼Ð¾-веÑÑией %1.
-
+
It allows you to test the application and see if it works for you.
Ðна позволÑÐµÑ Ð²Ð°Ð¼ оÑениÑÑ Ð¿Ñиложение.
-
+
Continue
ÐÑодолжиÑÑ
-
+
of
Used in video parts, as in '2 of 3'
из
-
+
part
This is for video parts, as in 'Cool video - part 1'
ÑаÑÑÑ
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
Ñпизод
-
+
Sent from %1
ÐÑпÑавиÑÑ Ð¸Ð· %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
ÐÑпиÑÑ Ð¿Ð¾Ð»Ð½ÑÑ Ð²ÐµÑÑиÑ
-
+
Downloading %1
ÐагÑÑÐ¶Ð°Ñ %1
@@ -910,52 +1024,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 пÑоÑмоÑÑов
-
+
%1 of %2 (%3) â %4
-
+ %1 из %2 (%3) â %4
-
+
Preparing
ÐодгоÑовка
-
+
Failed
-
+ ÐÑибка
-
+
Completed
ÐавеÑÑено
-
+
Stopped
ÐÑÑановлено
-
+
Stop downloading
ÐÑмена загÑÑзки
-
+
Show in %1
-
+ ÐоказаÑÑ Ð² %1
-
+
Open parent folder
ÐÑкÑÑÑÑ ÑодиÑелÑÑкий каÑалог
-
+
Restart downloading
ÐеÑезапÑÑÑиÑÑ Ð·Ð°Ð³ÑÑзкÑ
@@ -970,7 +1084,7 @@
Show %1 More
-
+ ÐоказаÑÑ ÐµÑÑ %1
@@ -1112,48 +1226,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
ÐобÑо пожаловаÑÑ Ð² <a href='%1'>%2</a>,
-
+
Get the full version
ÐÑпиÑÑ Ð¿Ð¾Ð»Ð½ÑÑ Ð²ÐµÑÑиÑ
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
ÐведиÑе
-
+
a keyword
запÑоÑ
-
+
a channel
канал
-
+
to start watching videos.
ÑÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ Ð¿ÑоÑмоÑÑ.
-
+
Watch
СмоÑÑеÑÑ
-
+
Recent keywords
ÐоÑледние запÑоÑÑ
-
+
Recent channels
ÐоÑледние каналÑ
@@ -1161,8 +1275,8 @@
SidebarHeader
-
-
+
+
&Back
Ð&азад
@@ -1197,11 +1311,6 @@
Most Popular
СамÑе попÑлÑÑнÑе
-
-
- Featured
- ÐопÑлÑÑнÑе
-
Most Shared
@@ -1217,16 +1326,21 @@
Top Rated
ÐÑÑÑие оÑенки
+
+
+ All Time Popular
+ ÐопÑлÑÑное за вÑе вÑемÑ
+
Video
-
+
Cannot get video stream for %1
Ðе ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð²Ð¸Ð´ÐµÐ¾ поÑок Ð´Ð»Ñ %1
-
+
Network error: %1 for %2
ÐÑибка ÑеÑи: %1 на %2
@@ -1316,47 +1430,47 @@
India
-
+ ÐндиÑ
Indonesia
-
+ ÐндонезиÑ
Ireland
-
+ ÐÑландиÑ
Israel
-
+ ÐзÑаилÑ
Italy
-
+ ÐÑалиÑ
Japan
-
+ ЯпониÑ
Jordan
-
+ ÐоÑданиÑ
Kenya
-
+ ÐениÑ
Malaysia
-
+ ÐалайзиÑ
@@ -1471,7 +1585,7 @@
Worldwide
-
+ Ðо вÑем миÑе
\ No newline at end of file
diff --git a/locale/sk.ts b/locale/sk.ts
index d54f732..4b373f9 100644
--- a/locale/sk.ts
+++ b/locale/sk.ts
@@ -134,6 +134,95 @@
Zakúpiť licenciu
+
+ ChannelAggregator
+
+
+ By %1
+ Od %1
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Všetky videá
+
+
+
+ Unwatched Videos
+ Neprezreté videá
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ OznaÄiÅ¥ vÅ¡etky ako zhliadnuté
+
+
+
+ Show Updated
+ Zobraziť aktualizované
+
+
+
+ Name
+ Meno
+
+
+
+ Last Updated
+ Naposledy aktualizované
+
+
+
+ Last Added
+ Naposledy pridané
+
+
+
+ Last Watched
+ Naposledy prezerané
+
+
+
+ Most Watched
+ Najviac prezerané
+
+
+
+ Sort by
+ Zoradiť podľa
+
+
+
+ All Videos
+ Všetky videá
+
+
+
+ Unwatched Videos
+ Neprezreté videá
+
+
+
+ There are no updated subscriptions at this time.
+ Nie sú k dispozÃcii žiadne aktualizované subskripcie.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Nemáš žiadne subskripcie. Použi symbol hviezdy pre odoberanie kanálov.
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Hľadať
-
+
Find videos and channels by keyword
NájsÅ¥ videá a kanály podľa kľúÄa
-
+
Browse
Prehliadať
-
+
Browse videos by category
Prehliadať videá podľa kategórie
+
+
+ Subscriptions
+ Subskripcie
+
+
+
+ Channel subscriptions
+ Odber kanálov
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Chyba
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
&Zastaviť
-
+
Stop playback and go back to the search view
Zastaviť prehrávanie a vrátiť sa k výsledkom hľadania
-
+
S&kip
&PreskoÄiÅ¥
-
+
Skip to the next video
PreskoÄiÅ¥ na nasledovné video
-
-
+
+
&Pause
&Pozasaviť
-
-
+
+
Pause playback
Pozastaviť prehrávanie
-
+
&Full Screen
&Celá obrazovka
-
+
Go full screen
Na celú obrazovku
-
+
Hide the playlist and the toolbar
Skryť playlist a nástrojovú lištu
-
+
Go to the YouTube video page and pause playback
Prejsť na YouTube stránku videa a pozastaviť prehrávanie
-
+
Copy the current video YouTube link to the clipboard
KopÃrovaÅ¥ YouTube odkaz aktuálneho videa do schránky
-
+
Copy the current video stream URL to the clipboard
KopÃrovaÅ¥ odkaz aktuálneho video streamu do schránky
-
+
Find other video parts hopefully in the right order
PokúsiÅ¥ sa nájsÅ¥ zvyÅ¡né video Äasti
-
+
&Remove
&Odstrániť
-
+
Remove the selected videos from the playlist
Odstrániť vybrané videá z playlistu
-
+
Move &Up
Presunúť &nahor
-
+
Move up the selected videos in the playlist
Presunúť vybrané videá v playliste nahor
-
+
Move &Down
Presunúť &nadol
-
+
Move down the selected videos in the playlist
Presunúť vybrané videá v playliste nadol
-
+
Clear the search history. Cannot be undone.
VyÄisiÅ¥ históriu hľadania. Nevratná akcia.
-
+
&Quit
&UkonÄiÅ¥
-
+
Bye
Maj sa
-
+
&Website
&Domovská stránka
-
+
%1 on the Web
%1 na Internete
-
+
Please support the continued development of %1
Podpor prosÃm pokraÄujúci vývoj %1
-
+
&About
&O projekte
-
+
Info about %1
Informácie o %1
-
+
Search
Hľadať
-
+
Mute volume
Stlmiť hlasitosť
-
-
+
+
&Downloads
&SÅ¥ahovania
-
+
Show details about video downloads
ZobraziÅ¥ detaily o sÅ¥ahovanÃ
-
+
&Download
&Stiahnuť
-
+
Download the current video
Stiahnuť aktuálne video
-
+
+ &Subscribe to Channel
+ &Odoberať daný kanál
+
+
+
Share the current video using %1
Zdieľať aktuálne video cez %1
-
+
&Email
&E-mail
-
+
Email
E-mailová adresa
-
+
&Close
&Zatvoriť
-
+
&Float on Top
&Vždy na vrchu
-
+
&Stop After This Video
&Zastav po tomto videu
-
+
&Report an Issue...
&Nahlásiť problém...
-
+
&Refine Search...
&Upraviť kritériá hľadania...
-
+
More...
Viac...
-
+
&Related Videos
&Pridružené vidá
-
+
Watch videos related to the current one
Pozerať videá pridružené k aktuálnemu
-
+
&Application
&Aplikácia
-
+
Buy %1...
Zakúpiť %1...
-
+
&Playback
&Prehrávanie
-
+
&Playlist
&Playlist
-
+
&Video
&Video
-
+
&View
&Zobrazenie
-
+
&Share
&Zdieľanie
-
+
&Help
&Nápoveda
-
+
Press %1 to raise the volume, %2 to lower it
StlaÄ %1 pre zvýšenie hlasitosti, %2 pre jej znÞenie
-
-
+
+
Opening %1
Otváram %1
-
+
Do you want to exit %1 with a download in progress?
ChceÅ¡ ukonÄiÅ¥ %1 aj napriek prebiehajúcemu sÅ¥ahovaniu?
-
+
If you close %1 now, this download will be cancelled.
Pokiaľ teraz ukonÄÃÅ¡ %1, prÃdeÅ¡ o aktuálne sÅ¥ahovanie.
-
+
Close and cancel download
Zatvoriť a zrušiť sťahovanie
-
+
Wait for download to finish
PoÄkaÅ¥ kým skonÄà sÅ¥ahovanie
-
+
Leave &Full Screen
Opustiť režim &celej obrazovky
-
+
%1 version %2 is now available.
%1 verzie %2 je k dispozÃcii.
-
+
Remind me later
Pripomenúť neskôr
-
+
Update
Aktualizácia
-
+
Error: %1
Chyba: %1
-
+
P&revious
&Predošlé
-
+
Go back to the previous track
ÃsÅ¥ na predoÅ¡lé video
-
+
&Compact Mode
&Kompaktný mód
-
+
Open the &YouTube Page
Otvoriť &YouTube stránku
-
+
Copy the YouTube &Link
KopÃrovaÅ¥ &odkaz z YouTube
-
+
Copy the Video Stream &URL
KopÃrovaÅ¥ &URL video streamu
-
+
Find Video &Parts
NájsÅ¥ zvyÅ¡né relevantné &Äasti
-
+
&Clear Recent Searches
&VyÄistiÅ¥ zoznam posledných hľadanÃ
-
+
Make a &Donation
FinanÄne &podporiÅ¥
-
+
&Manually Start Playing
&Manuálne prehrávanie
-
+
Manually start playing videos
Koniec manuálneho prehrávania
-
+
Choose your content location
Vybrať svoju obsahovú lokáciu
-
+
&Play
&Prehrať
-
+
Resume playback
Obnoviť prehrávanie
-
+
Remaining time: %1
Zostávajúci Äas: %1
-
+
Volume at %1%
Hlasitosť na %1%
-
+
Volume is muted
Hlasitosť stlmená
-
+
Volume is unmuted
Hlasitosť nie je stlmená
-
+
Maximum video definition set to %1
Maximálne rozlÃÅ¡enie videa nastavené na %1
-
+
Your privacy is now safe
Nemaj obavy o súkromie
-
+
Downloads complete
Sťahovanie kompletné
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Takto môžeš prilepiť YouTube odkaz do inej aplikácie
-
+
You can now paste the video stream URL into another application
Budeš môcť prilepiť odkaz video streamu do inej aplikácie
-
+
The link will be valid only for a limited time.
Odkaz bude platný len obmedzenú dobu.
-
+
This is just the demo version of %1.
Ide o demoverziu %1.
-
+
It allows you to test the application and see if it works for you.
Umožnà ti aplikáciu vyskúšať a pohodlne otestovať.
-
+
Continue
PokraÄuj
-
+
of
Used in video parts, as in '2 of 3'
z
-
+
part
This is for video parts, as in 'Cool video - part 1'
ÄasÅ¥
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
epizóda
-
+
Sent from %1
Odoslané z %1
-
+
+ Unsubscribe from %1
+ Zrušiť odber z %1
+
+
+
+ Subscribe to %1
+ Odoberať z %1
+
+
+
Get the full version
ZÃskaÅ¥ plnú verziu
-
+
Downloading %1
SÅ¥ahujem %1.
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 prezretÃ
-
+
%1 of %2 (%3) â %4
%1 z %2 (%3) â %4
-
+
Preparing
Pripravujem
-
+
Failed
Zlyhané
-
+
Completed
ÃspeÅ¡né
-
+
Stopped
Zastavené
-
+
Stop downloading
Zastav sťahovanie
-
+
Show in %1
Zobraz v %1
-
+
Open parent folder
Otvor nadradený adresár
-
+
Restart downloading
Opakuj sťahovanie
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Vitaj v aplikácii <a href='%1>%2</a>,
-
+
Get the full version
ZÃskaÅ¥ plnú verziu
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Vlož
-
+
a keyword
kľúÄové slovo
-
+
a channel
názov kanálu
-
+
to start watching videos.
pre spustenie sledovania.
-
+
Watch
Pozerať
-
+
Recent keywords
Posledné kľúÄové slová
-
+
Recent channels
Posledné kanály
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
&Späť
@@ -1196,11 +1310,6 @@
Most Popular
Najpopulárnejšie
-
-
- Featured
- Prominentné
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
Najvyššiehodnotené
+
+
+ All Time Popular
+ Dlhodobo najpopulárnejšie
+
Video
-
+
Cannot get video stream for %1
Nedostupný video stream pre %1
-
+
Network error: %1 for %2
Chyba siete: %1 pre %2
diff --git a/locale/sl.ts b/locale/sl.ts
index 4d06d33..0714455 100644
--- a/locale/sl.ts
+++ b/locale/sl.ts
@@ -83,7 +83,7 @@
&Email:
-
+ &E-pošta
@@ -106,12 +106,12 @@
The full version allows you to download videos longer than %1 minutes and to watch videos without interruptions.
-
+ Polna razliÄica omogoÄa prenos posnetkov daljÅ¡ih od %1 minut in njihovo gledanje brez prekinitev.
Without a license, the application will expire in %1 days.
-
+ Brez licence bo uporabnost aplikacije potekla Äez %1 dni.
@@ -126,11 +126,100 @@
Enter License
-
+ Vpis licence
Buy License
+ Kupi licenco
+
+
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Vsi videoposnetki
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ OznaÄi vse za pregledane
+
+
+
+ Show Updated
+ Pokaži posodobitve
+
+
+
+ Name
+ Naziv
+
+
+
+ Last Updated
+ Nazadnje posodobljeno
+
+
+
+ Last Added
+ Nazadnje dodano
+
+
+
+ Last Watched
+ Nazadnje gledano
+
+
+
+ Most Watched
+ NajveÄkrat gledano
+
+
+
+ Sort by
+ Razvrsti glede na
+
+
+
+ All Videos
+ Vsi videoposnetki
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
@@ -270,7 +359,7 @@
Downloading update...
-
+ Prenos posodobitve...
@@ -339,25 +428,35 @@
HomeView
-
+
Search
IÅ¡Äi
-
+
Find videos and channels by keyword
-
+ IÅ¡Äi posnetke in kanale po kljuÄnih besedah
-
+
Browse
-
+
Browse videos by category
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Napaka
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
U&stavi
-
+
Stop playback and go back to the search view
Ustavi predvajanje in se vrne v iskalni pogled
-
+
S&kip
Pres&koÄi
-
+
Skip to the next video
SkoÄi na naslednji video
-
-
+
+
&Pause
&Pavza
-
-
+
+
Pause playback
Premor v predvajanju
-
+
&Full Screen
&Celozaslonski naÄin
-
+
Go full screen
Gre v celozaslonski naÄin
-
+
Hide the playlist and the toolbar
Skrije predvajalni seznam in orodno vrstico
-
+
Go to the YouTube video page and pause playback
Gre na stran posnetka na YouTube in ustavi predvajanje
-
+
Copy the current video YouTube link to the clipboard
Kopira povezavo YouTube trenutnega posnetka v odložiÅ¡Äe
-
+
Copy the current video stream URL to the clipboard
Kopira URL trenutnega video pretoka v odložiÅ¡Äe
-
+
Find other video parts hopefully in the right order
PoiÅ¡Äe ostale dele posnetka, predvidoma v pravem zaporedju
-
+
&Remove
Odst&rani
-
+
Remove the selected videos from the playlist
Odstrani izbrani video iz predvajalnega seznama
-
+
Move &Up
Premakni &gor
-
+
Move up the selected videos in the playlist
Izbrani video premakne mesto više v predvajalnem seznamu
-
+
Move &Down
Premakni &dol
-
+
Move down the selected videos in the playlist
Izbrani video premakne mesto niže v predvajalnem seznamu
-
+
Clear the search history. Cannot be undone.
IzbriÅ¡e zgodovino iskanje. Tega dejanja ni mogoÄe razveljaviti.
-
+
&Quit
&Zapri
-
+
Bye
Nasvidenje
-
+
&Website
&Spletno mesto
-
+
%1 on the Web
%1 na spletu
-
+
Please support the continued development of %1
Podprite prosim nadaljni razvoj programa %1
-
+
&About
&O programu
-
+
Info about %1
Informacije o %1
-
+
Search
IÅ¡Äi
-
+
Mute volume
Nemo
-
-
+
+
&Downloads
Pre&nosi
-
+
Show details about video downloads
Pokaže podrobnosti o prenosih posnetkov
-
+
&Download
Pre&nesi
-
+
Download the current video
Prenese trenutni posnetek
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
Deli trenutni posnetek preko %1
-
+
&Email
&E-pošta
-
+
Email
E-pošte
-
+
&Close
&Zapri
-
+
&Float on Top
LebdeÄe na vrhu
-
+
&Stop After This Video
U&stavi za tem posnetkom
-
+
&Report an Issue...
P&rijavi napako ...
-
+
&Refine Search...
&Izboljšaj iskanje ...
-
+
More...
-
+ VeÄ...
-
+
&Related Videos
-
+
Watch videos related to the current one
-
+
&Application
&Aplikacija
-
+
Buy %1...
Kupi %1 ...
-
+
&Playback
&Predvajanje
-
+
&Playlist
&Predvajalni seznam
-
+
&Video
&Video
-
+
&View
&Pogled
-
+
&Share
&Deli
-
+
&Help
P&omoÄ
-
+
Press %1 to raise the volume, %2 to lower it
Pritisnite %1, da povišate glasnost in %2, da jo nižate
-
-
+
+
Opening %1
Odpiranje %1
-
+
Do you want to exit %1 with a download in progress?
Ali res želite zapustiti %1 medtem, ko je aktiven prenos?
-
+
If you close %1 now, this download will be cancelled.
V primeru, da zdaj zaprete %1 bo ta prenos prekinjen.
-
+
Close and cancel download
Zapri in prekliÄi prenos
-
+
Wait for download to finish
PoÄakaj, da konÄa prenos.
-
+
Leave &Full Screen
Zapusti celozaslonski naÄin
-
+
%1 version %2 is now available.
Na voljo je %1 razliÄica %2.
-
+
Remind me later
Opozori me kasneje
-
+
Update
Posodobitev
-
+
Error: %1
Napaka: %1
-
+
P&revious
P&redhodna
-
+
Go back to the previous track
Predhodna sled
-
+
&Compact Mode
Strnjen naÄin
-
+
Open the &YouTube Page
Odpri stran &Youtube
-
+
Copy the YouTube &Link
Kopiraj povezavo Youtube
-
+
Copy the Video Stream &URL
Kopiraj &URL toka video
-
+
Find Video &Parts
&PoiÅ¡Äi ostale dele posnetka
-
+
&Clear Recent Searches
PoÄisti nedavna iskanja
-
+
Make a &Donation
Pošlji &donacijo
-
+
&Manually Start Playing
RoÄno zaÄni predvajanje
-
+
Manually start playing videos
PriÄni z roÄnim predvajanjem posnetkov
-
+
Choose your content location
-
+
&Play
&Predvajaj
-
+
Resume playback
Nadaljuj s predvajanjem
-
+
Remaining time: %1
Preostali Äas: %1
-
+
Volume at %1%
Glasnost %1%
-
+
Volume is muted
Glasnost je utišana
-
+
Volume is unmuted
Glasnost je povrnjena
-
+
Maximum video definition set to %1
NajviÅ¡ja loÄljivost posnetkov je nastavljena na %1
-
+
Your privacy is now safe
Vaša zasebnost je zdaj varna
-
+
Downloads complete
Prenosi so konÄani
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Zdaj lahko prilepite povezavo na YouTube v drugo aplikacijo
-
+
You can now paste the video stream URL into another application
Zdaj lahko prilepite URL video pretoka v drugo aplikacijo
-
+
The link will be valid only for a limited time.
Povezava bo delovala le za omejen Äas.
-
+
This is just the demo version of %1.
To je samo demo razliÄica programa %1.
-
+
It allows you to test the application and see if it works for you.
Dovoli vam testiranje aplikacije in preverjanje delovanja,
-
+
Continue
Nadaljuj
-
+
of
Used in video parts, as in '2 of 3'
od
-
+
part
This is for video parts, as in 'Cool video - part 1'
del
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
nadaljevanje
-
+
Sent from %1
Poslano iz %1
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
Pridobi celotno razliÄico
-
+
Downloading %1
Prenašanje %1
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 predvajanj
-
+
%1 of %2 (%3) â %4
-
+
Preparing
-
+
Failed
-
+
Completed
-
+
Stopped
-
+
Stop downloading
-
+
Show in %1
-
+
Open parent folder
-
+
Restart downloading
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
Pozdravljeni v <a href='%1'>%2</a>,
-
+
Get the full version
Pridobi celotno razliÄico
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
Vnesite
-
+
a keyword
kljuÄno besedo
-
+
a channel
kanal
-
+
to start watching videos.
in zaÄnite gledati posnetke.
-
+
Watch
Glejte
-
+
Recent keywords
Nedavne kljuÄne besede
-
+
Recent channels
Nedavni kanali
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
@@ -1196,11 +1310,6 @@
Most Popular
-
-
- Featured
-
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
+
+
+ All Time Popular
+
+
Video
-
+
Cannot get video stream for %1
Za %1 ni mogoÄe pridobiti video pretoka
-
+
Network error: %1 for %2
Napaka omrežja: %1 od %2
@@ -1235,177 +1349,177 @@
Algeria
-
+ Alžirija
Argentina
-
+ Argentina
Australia
-
+ Avstralija
Belgium
-
+ Belgija
Brazil
-
+ Brazilija
Canada
-
+ Kanada
Chile
-
+ Äile
Colombia
-
+ Kolumbija
Czech Republic
-
+ ÄeÅ¡ka republika
Egypt
-
+ Egipt
France
-
+ Francija
Germany
-
+ NemÄija
Ghana
-
+ Gana
Greece
-
+ GrÄija
Hong Kong
-
+ Hong Kong
Hungary
-
+ Madžarska
India
-
+ Indija
Indonesia
-
+ Indonezija
Ireland
-
+ Irska
Israel
-
+ Izrael
Italy
-
+ Italija
Japan
-
+ Japonska
Jordan
-
+ Jordanija
Kenya
-
+ Kenija
Malaysia
-
+ Malezija
Mexico
-
+ Mehika
Morocco
-
+ Maroko
Netherlands
-
+ Nizozemska
New Zealand
-
+ Nova Zelandija
Nigeria
-
+ Nigerija
Peru
-
+ Peru
Philippines
-
+ Filipini
Poland
-
+ Poljska
Russia
-
+ Rusija
Saudi Arabia
-
+ Savdska Arabija
@@ -1415,62 +1529,62 @@
South Africa
-
+ Južna Afrika
South Korea
-
+ Južna Koreja
Spain
-
+ Å panija
Sweden
-
+ Å vedska
Taiwan
-
+ Tajvan
Tunisia
-
+ Tunizija
Turkey
-
+ TurÄija
Uganda
-
+ Uganda
United Arab Emirates
-
+ Združeni arabski emirati
United Kingdom
-
+ Velika Britanija
Yemen
-
+ Jemen
Worldwide
-
+ Svetovno
\ No newline at end of file
diff --git a/locale/tr.ts b/locale/tr.ts
index f686a95..19d11b6 100644
--- a/locale/tr.ts
+++ b/locale/tr.ts
@@ -60,7 +60,7 @@
&Close
- &Kapat
+ Kapat (&C)
@@ -134,6 +134,95 @@
Lisans Al
+
+ ChannelAggregator
+
+
+ By %1
+ %1 tarafından
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+ Tüm Videolar
+
+
+
+ Unwatched Videos
+ Ä°zlenmemiÅ Videolar
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+ Tümünü izlendi iÅaretle
+
+
+
+ Show Updated
+ Güncellenenleri Göster
+
+
+
+ Name
+ Ä°sim
+
+
+
+ Last Updated
+ Son Güncellenen
+
+
+
+ Last Added
+ Son Eklenen
+
+
+
+ Last Watched
+ Son Ä°zlenen
+
+
+
+ Most Watched
+ En Ãok Ä°zlenen
+
+
+
+ Sort by
+ Sırala
+
+
+
+ All Videos
+ Tüm Videolar
+
+
+
+ Unwatched Videos
+ Ä°zlenmemiÅ Videolar
+
+
+
+ There are no updated subscriptions at this time.
+ Åu anda güncellenen abonelik yok.
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+ Hiç aboneliÄiniz yok. Kanallara abone olmak için yıldız simgesini kullanın.
+
+
ClearButton
@@ -225,7 +314,7 @@
%n Download(s)
- %n Ä°ndirme
+ %n Ä°ndirme %n Ä°ndirme
@@ -323,7 +412,7 @@
Mute
- Sesi kes
+ Sessiz
@@ -339,25 +428,35 @@
HomeView
-
+
Search
Arama
-
+
Find videos and channels by keyword
Anahtar kelimeye göre video ve kanal bulun
-
+
Browse
Gözat
-
+
Browse videos by category
Kategoriye göre videoları gözat
+
+
+ Subscriptions
+ Abonelikler
+
+
+
+ Channel subscriptions
+ Kanal abonelikleri
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
Hata
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
- &Dur
+ Dur (&S)
-
+
Stop playback and go back to the search view
Oynatmayı durdur ve aramaya geri dön
-
+
S&kip
&Atla
-
+
Skip to the next video
Sonraki videoya atla
-
-
+
+
&Pause
&Bekle
-
-
+
+
Pause playback
Oynatmayı beklet
-
+
&Full Screen
&Tam ekran
-
+
Go full screen
Tam ekran görünümü
-
+
Hide the playlist and the toolbar
Listeyi ve araç çubuÄunu gizle
-
+
Go to the YouTube video page and pause playback
Oynatmayı beklet ve YouTube sayfasına git
-
+
Copy the current video YouTube link to the clipboard
Geçerli videonun YouTube baÄlantısını panoya kopyala
-
+
Copy the current video stream URL to the clipboard
Geçerli video akıÅının URL adresini panoya kopyala
-
+
Find other video parts hopefully in the right order
DoÄru sırada olacak Åekilde diÄer video kısımlarını bul
-
+
&Remove
&Kaldır
-
+
Remove the selected videos from the playlist
Seçilen videoları listeden kaldır
-
+
Move &Up
Y&ukarı taÅı
-
+
Move up the selected videos in the playlist
Seçilen videoları listede yukarı taÅı
-
+
Move &Down
A&ÅaÄı taÅı
-
+
Move down the selected videos in the playlist
Seçilen videoları listede aÅaÄı taÅı
-
+
Clear the search history. Cannot be undone.
Arama geçmiÅini sil. Bu geri alınamaz.
-
+
&Quit
&Ãık
-
+
Bye
Gülegüle
-
+
&Website
&Website
-
+
%1 on the Web
%1 Ä°nternette
-
+
Please support the continued development of %1
Lütfen %1 geliÅiminin sürekliliÄi için destekleyin
-
+
&About
&Hakkında
-
+
Info about %1
%1 Hakkında
-
+
Search
Ara
-
+
Mute volume
Sesi kes
-
-
+
+
&Downloads
&Ä°ndirmeler
-
+
Show details about video downloads
Video indirmelerinin ayrıntılarını göster
-
+
&Download
&Ä°ndir
-
+
Download the current video
Geçerli videoyu indir
-
+
+ &Subscribe to Channel
+ Kanala Abone Ol (&S)
+
+
+
Share the current video using %1
%1 kullanarak Åu an ki videoyu paylaÅ
-
+
&Email
&Eposta
-
+
Email
Eposta
-
+
&Close
&Kapat
-
+
&Float on Top
Ãstte Sabitle
-
+
&Stop After This Video
Bu Videodan &Sonra Durdur
-
+
&Report an Issue...
Bir Sorun Bildi&r
-
+
&Refine Search...
A&ramayı Sınırla...
-
+
More...
Dahası...
-
+
&Related Videos
Benze&r Videolar
-
+
Watch videos related to the current one
Åu an izlediÄinize benzer videolar izleyin
-
+
&Application
&Uygulama
-
+
Buy %1...
%1 Satın Al...
-
+
&Playback
&Ãalma
-
+
&Playlist
Oynatma &listesi
-
+
&Video
&Video
-
+
&View
&Görünüm
-
+
&Share
Payla&s
-
+
&Help
Yardı&m
-
+
Press %1 to raise the volume, %2 to lower it
%1 Sesi arttır, %2 sesi azalt
-
-
+
+
Opening %1
%1 Açılıyor
-
+
Do you want to exit %1 with a download in progress?
%1 İndiriliyor, çıkmak istiyor musunuz?
-
+
If you close %1 now, this download will be cancelled.
EÄer %1'Ä° Åimdi kapatırsanız, bu indirme iptal edilecek.
-
+
Close and cancel download
Kapat ve indirmeyi iptal et
-
+
Wait for download to finish
Ä°ndirmenin bitmesini bekle
-
+
Leave &Full Screen
&Tam Ekrandan Ãık
-
+
%1 version %2 is now available.
%1 sürüm %2 kullanılabilir durumda.
-
+
Remind me later
Daha sonra hatırlat
-
+
Update
Güncelle
-
+
Error: %1
Hata: %1
-
+
P&revious
Ãnceki
-
+
Go back to the previous track
Bir önceki parçaya geri dön
-
+
&Compact Mode
Kü&cültümüŠEkran
-
+
Open the &YouTube Page
&YouTube Sayfasını Aç
-
+
Copy the YouTube &Link
YouTube &Linkini Kopyala
-
+
Copy the Video Stream &URL
Video &URL'sini Kopyala
-
+
Find Video &Parts
Video Bölümlerini Bul
-
+
&Clear Recent Searches
Son Aramaları Temizle
-
+
Make a &Donation
BaÄıŠYap
-
+
&Manually Start Playing
&Manuel Olarak Ãalmaya BaÅla
-
+
Manually start playing videos
Videoları manuel olarak çalmaya baÅla
-
+
Choose your content location
Konumunuzu seçin
-
+
&Play
&Oynat
-
+
Resume playback
Oynatmaya devam et
-
+
Remaining time: %1
Kalan zaman: %1
-
+
Volume at %1%
Ses %1%
-
+
Volume is muted
Ses kapandı
-
+
Volume is unmuted
Ses açık
-
+
Maximum video definition set to %1
En yüksek video tanımı %1 olarak ayarlı
-
+
Your privacy is now safe
Åimdi gizliliÄiniz güvende
-
+
Downloads complete
İndirme tamamlandı
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
Åimdi YouTube baÄlantısını baÅka bir uygulamaya yapıÅtırabilirsiniz
-
+
You can now paste the video stream URL into another application
Åimdi video akıÅı URL adresini baÅka bir uygulamaya yapıÅtırabilirsiniz
-
+
The link will be valid only for a limited time.
BaÄlantı kısıtlı bir süre için geçerli olacak.
-
+
This is just the demo version of %1.
Bu sadece %1'in demo sürümüdür.
-
+
It allows you to test the application and see if it works for you.
Bu, uygulamayı test etmenizi ve çalıÅıp çalıÅmadıÄını görmenizi saÄlar.
-
+
Continue
Devam
-
+
of
Used in video parts, as in '2 of 3'
/
-
+
part
This is for video parts, as in 'Cool video - part 1'
kısım
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
bölüm
-
+
Sent from %1
%1 ile gönderildi
-
+
+ Unsubscribe from %1
+ %1 aboneliÄinden çık
+
+
+
+ Subscribe to %1
+ %1 Abone Ol
+
+
+
Get the full version
Tam sürüme geç
-
+
Downloading %1
Ä°ndiriliyor %1
@@ -909,52 +1023,52 @@
PlaylistItemDelegate
-
+
%1 views
%1 görüntülenme
-
+
%1 of %2 (%3) â %4
%1 of %2 (%3) â %4
-
+
Preparing
Hazırlanıyor
-
+
Failed
BaÅarısız
-
+
Completed
Tamamlandı
-
+
Stopped
Durduruldu
-
+
Stop downloading
Ä°ndirme iÅlemini durdur
-
+
Show in %1
%1 içinde göster
-
+
Open parent folder
Ãnceki dizini aç
-
+
Restart downloading
Ä°ndirme iÅlemini yeniden baÅlat
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
<a href='%1'>%2</a>'a HoÅgeldiniz
-
+
Get the full version
Tam sürüme geç
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
GiriŠyapın
-
+
a keyword
bir anahtar kelime
-
+
a channel
bir kanal
-
+
to start watching videos.
ve videoları izlemeye baÅlayın.
-
+
Watch
Ä°zle
-
+
Recent keywords
Son arananlar
-
+
Recent channels
Ãnceki kanallar
@@ -1160,8 +1274,8 @@
SidebarHeader
-
-
+
+
&Back
Geri
@@ -1196,11 +1310,6 @@
Most Popular
En popülerler
-
-
- Featured
- Gelecek
-
Most Shared
@@ -1216,16 +1325,21 @@
Top Rated
En Ãok Oy Verilenler
+
+
+ All Time Popular
+ Her Zaman Popüler
+
Video
-
+
Cannot get video stream for %1
%1 için video akıÅı alınamıyor.
-
+
Network error: %1 for %2
AÄ hatası: %2 için %1
diff --git a/locale/zh_CN.ts b/locale/zh_CN.ts
index a2c8e61..67d75f4 100644
--- a/locale/zh_CN.ts
+++ b/locale/zh_CN.ts
@@ -88,7 +88,7 @@
&Code:
-
+ æ¿æ´»ç (C)ï¼
@@ -111,7 +111,7 @@
Without a license, the application will expire in %1 days.
-
+ è¥æ ææï¼è¯¥è½¯ä»¶å°ä¼å¨ %1 天åè¿æã
@@ -134,6 +134,95 @@
è´ä¹°è®¸å¯
+
+ ChannelAggregator
+
+
+ By %1
+
+
+
+
+ You have %n new video(s)
+
+
+
+
+ ChannelItemDelegate
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ ChannelView
+
+
+ Mark all as watched
+
+
+
+
+ Show Updated
+
+
+
+
+ Name
+
+
+
+
+ Last Updated
+
+
+
+
+ Last Added
+
+
+
+
+ Last Watched
+
+
+
+
+ Most Watched
+
+
+
+
+ Sort by
+ æåº
+
+
+
+ All Videos
+
+
+
+
+ Unwatched Videos
+
+
+
+
+ There are no updated subscriptions at this time.
+
+
+
+
+ You have no subscriptions. Use the star symbol to subscribe to channels.
+
+
+
ClearButton
@@ -339,25 +428,35 @@
HomeView
-
+
Search
æç´¢
-
+
Find videos and channels by keyword
æå
³é®è¯æ¥æ¾è§é¢åé¢é
-
+
Browse
æµè§
-
+
Browse videos by category
æåç±»æ¥æ¾è§é¢
+
+
+ Subscriptions
+
+
+
+
+ Channel subscriptions
+
+
Make yourself comfortable
@@ -367,7 +466,7 @@
LoadingWidget
-
+
Error
é误
@@ -375,426 +474,431 @@
MainWindow
-
+
&Stop
åæ¢(&S)
-
+
Stop playback and go back to the search view
åæ¢åæ¾å¹¶è¿åæç´¢è§å¾
-
+
S&kip
è·³è¿(&k)
-
+
Skip to the next video
è·³è³ä¸ä¸è§é¢
-
-
+
+
&Pause
æå(&P)
-
-
+
+
Pause playback
æååæ¾
-
+
&Full Screen
å
¨å±(&F)
-
+
Go full screen
å
¨å±ææ¾
-
+
Hide the playlist and the toolbar
éèææ¾å表åå·¥å
·æ
-
+
Go to the YouTube video page and pause playback
æå¼YouTubeè§é¢é¡µé¢å¹¶æååæ¾
-
+
Copy the current video YouTube link to the clipboard
å¤å¶å½åè§é¢çYouTubeé¾æ¥å°åªè´´æ¿ä¸
-
+
Copy the current video stream URL to the clipboard
å¤å¶å½åè§é¢æµçURLå°åªè´´æ¿ä¸
-
+
Find other video parts hopefully in the right order
以æ£ç¡®ç顺åºæ¥æ¾å
¶ä»è§é¢é¨å
-
+
&Remove
移é¤(&R)
-
+
Remove the selected videos from the playlist
ä»ææ¾å表ä¸ç§»é¤éå®çè§é¢
-
+
Move &Up
ä¸ç§»(&U)
-
+
Move up the selected videos in the playlist
å¨ææ¾å表ä¸åä¸ç§»å¨éå®çè§é¢
-
+
Move &Down
ä¸ç§»(&D)
-
+
Move down the selected videos in the playlist
å¨ææ¾å表ä¸åä¸ç§»å¨éå®çè§é¢
-
+
Clear the search history. Cannot be undone.
æ¸
é¤æç´¢åå²ã注æï¼æ¸
é¤çåå²ä¸å¯æ¢å¤ã
-
+
&Quit
éåº(&Q)
-
+
Bye
åè§
-
+
&Website
ç½ç«(&W)
-
+
%1 on the Web
%1å¨ç½ç«ä¸
-
+
Please support the continued development of %1
请æ¨æ¯æ %1 ç继ç»å¼å
-
+
&About
å
³äº(&A)
-
+
Info about %1
å
³äº %1 çä¿¡æ¯
-
+
Search
æç´¢
-
+
Mute volume
éé³
-
-
+
+
&Downloads
ä¸è½½(&D)
-
+
Show details about video downloads
æ¾ç¤ºè§é¢ä¸è½½è¯¦æ
-
+
&Download
ä¸è½½(&D)
-
+
Download the current video
ä¸è½½å½åè§é¢
-
+
+ &Subscribe to Channel
+
+
+
+
Share the current video using %1
ä½¿ç¨ %1 å享å½åè§é¢
-
+
&Email
çµåé®ä»¶(&E)
-
+
Email
çµåé®ä»¶
-
+
&Close
å
³é(&C)
-
+
&Float on Top
çªå£ç½®é¡¶(&F)
-
+
&Stop After This Video
该è§é¢ååæ¢ææ¾(&S)
-
+
&Report an Issue...
æ¥åé®é¢&Râ¦
-
+
&Refine Search...
精确æç´¢(&R)...
-
+
More...
æ´å¤...
-
+
&Related Videos
ç¸å
³è§é¢(&R)
-
+
Watch videos related to the current one
æ¥çä¸å½åè§é¢ç¸å
³çè§é¢
-
+
&Application
åºç¨ç¨åº(&A)
-
+
Buy %1...
è´ä¹° %1...
-
+
&Playback
ææ¾(&P)
-
+
&Playlist
ææ¾å表(&P)
-
+
&Video
è§é¢(&V)
-
+
&View
æ¥ç(&V)
-
+
&Share
å享(&S)
-
+
&Help
帮å©(&H)
-
+
Press %1 to raise the volume, %2 to lower it
æä½ %1 æé«é³éï¼%2 éä½é³é
-
-
+
+
Opening %1
æ£å¨æå¼ %1
-
+
Do you want to exit %1 with a download in progress?
å½åè¿æå°æªå®æçä¸è½½ãæ¨ç¡®å®è¦éåº %1 åï¼
-
+
If you close %1 now, this download will be cancelled.
å¦ææ¨ç°å¨å
³é %1 ï¼é£ä¹æ¬ä¸è½½å°è¢«åæ¶ã
-
+
Close and cancel download
å
³é并åæ¶ä¸è½½
-
+
Wait for download to finish
çå¾
ä¸è½½å®æ
-
+
Leave &Full Screen
离å¼å
¨å±æ¨¡å¼(&F)
-
+
%1 version %2 is now available.
%1 çæ¬ %2 ç°å¨å¯ç¨ã
-
+
Remind me later
ç¨åæéæ
-
+
Update
æ´æ°
-
+
Error: %1
é误ï¼%1
-
+
P&revious
ä¸ä¸é¦(&R)
-
+
Go back to the previous track
é¥åå°ä¸ä¸é¦é³è½¨
-
+
&Compact Mode
ç´§å模å¼(&C)
-
+
Open the &YouTube Page
æå¼ YouTube 页é¢(&Y)
-
+
Copy the YouTube &Link
å¤å¶ YouTube é¾æ¥(&L)
-
+
Copy the Video Stream &URL
å¤å¶è§é¢æµ URL
-
+
Find Video &Parts
æ¥æ¾è§é¢é¨å(&P)
-
+
&Clear Recent Searches
æ¸
é¤æè¿çæç´¢(&C)
-
+
Make a &Donation
æå©(&D)
-
+
&Manually Start Playing
æå¨å¼å§ææ¾(&M)
-
+
Manually start playing videos
æå¨å¼å§ææ¾è§é¢
-
+
Choose your content location
-
+ éæ©æ¨çå
容ä½ç½®
-
+
&Play
ææ¾(&P)
-
+
Resume playback
æ¢å¤ææ¾
-
+
Remaining time: %1
å©ä½æ¶é´ï¼%1
-
+
Volume at %1%
é³éï¼%1%
-
+
Volume is muted
已设为éé³
-
+
Volume is unmuted
éé³å·²è§£é¤
-
+
Maximum video definition set to %1
æ大è§é¢å®ä¹è®¾ç½®ä¸º%1
-
+
Your privacy is now safe
æ¨çéç§å·²åä¿æ¤
-
+
Downloads complete
ä¸è½½å®æ
@@ -802,65 +906,75 @@
MediaView
-
+
You can now paste the YouTube link into another application
æ¨ç°å¨å¯ä»¥æYouTubeçé¾æ¥ç²è´´å°å
¶ä»åºç¨äº
-
+
You can now paste the video stream URL into another application
æ¨ç°å¨å¯ä»¥æè§é¢æµçé¾æ¥ç²è´´å°å
¶ä»åºç¨äº
-
+
The link will be valid only for a limited time.
æ¤é¾æ¥ä»
è½ä¿æçæ¶é´çæææ§ã
-
+
This is just the demo version of %1.
è¿ä»
æ¯ %1 çæ¼ç¤ºçã
-
+
It allows you to test the application and see if it works for you.
æ¬çæ¬å
许æ¨æµè¯ï¼ä»¥ç¡®è®¤æ¬åºç¨æ¯å¦éåæ¨ã
-
+
Continue
继ç»
-
+
of
Used in video parts, as in '2 of 3'
ä¹
-
+
part
This is for video parts, as in 'Cool video - part 1'
é¨å
-
+
episode
This is for video parts, as in 'Cool series - episode 1'
é
-
+
Sent from %1
ç± %1 åé
-
+
+ Unsubscribe from %1
+
+
+
+
+ Subscribe to %1
+
+
+
+
Get the full version
è·åå®æ´ç
-
+
Downloading %1
æ£å¨ä¸è½½ %1
@@ -870,32 +984,32 @@
A new version of %1 is available!
-
+ åç°æ°çæ¬ç %1 ï¼
%1 %2 is now available. You have %3.
-
+ %1 %2 å·²ç»å¯ç¨ãæ¨ç°æ¥æ %3ã
Would you like to download it now?
-
+ æ¨æ³ç°å¨ä¸è½½åï¼
Skip This Version
-
+ è·³è¿æ¤çæ¬
Remind Me Later
-
+ ç¨åæéæ
Install Update
-
+ å®è£
æ´æ°
@@ -903,58 +1017,58 @@
Paste
-
+ ç²è´´
PlaylistItemDelegate
-
+
%1 views
%1 人次è§ç
-
+
%1 of %2 (%3) â %4
%1 ä¹ %2 (%3) â %4
-
+
Preparing
åå¤ä¸
-
+
Failed
已失败
-
+
Completed
å·²å®æ
-
+
Stopped
å·²åæ¢
-
+
Stop downloading
åæ¢ä¸è½½
-
+
Show in %1
æ¾ç¤ºå° %1
-
+
Open parent folder
æå¼ä¸å±ç®å½
-
+
Restart downloading
éæ°ä¸è½½
@@ -1097,7 +1211,7 @@
Done
-
+ å®æ
@@ -1111,48 +1225,48 @@
SearchView
-
+
Welcome to <a href='%1'>%2</a>,
欢è¿ä½¿ç¨<a href='%1'>%2</a>ï¼
-
+
Get the full version
è·åå®æ´ç
-
+
Enter
"Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos"
è¾å
¥
-
+
a keyword
å
³é®å
-
+
a channel
é¢éå称
-
+
to start watching videos.
å¼å§è§çè§é¢ã
-
+
Watch
è§ç
-
+
Recent keywords
æè¿å
³é®åè¯
-
+
Recent channels
æè¿é¢é
@@ -1160,20 +1274,20 @@
SidebarHeader
-
-
+
+
&Back
åé(_B)
Forward to %1
-
+ åè¿è³ %1
Back to %1
-
+ è¿åå° %1
@@ -1194,38 +1308,38 @@
Most Popular
-
-
-
-
- Featured
-
+ ææµè¡
Most Shared
-
+ å享æå¤ç
Most Discussed
-
+ 讨论æå¤ç
Top Rated
+ è¯åè¾é«
+
+
+
+ All Time Popular
Video
-
+
Cannot get video stream for %1
æ æ³è·å¾è§é¢æµãå¯è½åå ï¼%1
-
+
Network error: %1 for %2
ç½ç»é误ï¼%1ãå¯è½åå ï¼%2
@@ -1235,242 +1349,242 @@
Algeria
-
+ é¿å°åå©äº
Argentina
-
+ é¿æ ¹å»·
Australia
-
+ 澳大å©äº
Belgium
-
+ æ¯å©æ¶
Brazil
-
+ 巴西
Canada
-
+ å æ¿å¤§
Chile
-
+ æºå©
Colombia
-
+ å¥ä¼¦æ¯äº
Czech Republic
-
+ æ·å
å
񆆫
Egypt
-
+ åå
France
-
+ æ³å½
Germany
-
+ å¾·å½
Ghana
-
+ å 纳
Greece
-
+ å¸è
Hong Kong
-
+ é¦æ¸¯
Hungary
-
+ åçå©
India
-
+ å°åº¦
Indonesia
-
+ å°åº¦å°¼è¥¿äº
Ireland
-
+ ç±å°å
°
Israel
-
+ 以è²å
Italy
-
+ æ大å©
Japan
-
+ æ¥æ¬
Jordan
-
+ 约æ¦
Kenya
-
+ è¯å°¼äº
Malaysia
-
+ 马æ¥è¥¿äº
Mexico
-
+ 墨西å¥
Morocco
-
+ æ©æ´å¥
Netherlands
-
+ è·å
°
New Zealand
-
+ æ°è¥¿å
°
Nigeria
-
+ å°¼æ¥å©äº
Peru
-
+ ç§é²
Philippines
-
+ è²å¾å®¾
Poland
-
+ æ³¢å
°
Russia
-
+ ä¿ç½æ¯
Saudi Arabia
-
+ æ²ç¹é¿æ伯
Singapore
-
+ æ°å å¡
South Africa
-
+ åé
South Korea
-
+ é©å½
Spain
-
+ 西çç
Sweden
-
+ ç士
Taiwan
-
+ å°æ¹¾
Tunisia
-
+ çªå°¼æ¯
Turkey
-
+ åè³å
¶
Uganda
-
+ ä¹å¹²è¾¾
United Arab Emirates
-
+ é¿èé
United Kingdom
-
+ è±å½
Yemen
-
+ ä¹é¨
Worldwide
-
+ å
¨ç
\ No newline at end of file
diff --git a/minitube.pro b/minitube.pro
index 836142d..d0be3cc 100644
--- a/minitube.pro
+++ b/minitube.pro
@@ -1,6 +1,6 @@
CONFIG += release
TEMPLATE = app
-VERSION = 2.0
+VERSION = 2.1.1
DEFINES += APP_VERSION="$$VERSION"
APP_NAME = Minitube
@@ -9,12 +9,12 @@ DEFINES += APP_NAME="$$APP_NAME"
APP_UNIX_NAME = minitube
DEFINES += APP_UNIX_NAME="$$APP_UNIX_NAME"
-DEFINES += QT_USE_FAST_CONCATENATION
-DEFINES += QT_USE_FAST_OPERATOR_PLUS
+DEFINES *= QT_NO_DEBUG_OUTPUT
+DEFINES *= QT_USE_QSTRINGBUILDER
DEFINES += QT_STRICT_ITERATORS
TARGET = minitube
-QT += network xml phonon
+QT += network xml phonon sql script
include(src/qtsingleapplication/qtsingleapplication.pri)
HEADERS += \
src/video.h \
@@ -56,7 +56,6 @@ HEADERS += \
src/mediaview.h \
src/searchview.h \
src/view.h \
- src/userview.h \
src/playlistmodel.h \
src/videosource.h \
src/ytsearch.h \
@@ -71,7 +70,17 @@ HEADERS += \
src/ytsinglevideosource.h \
src/sidebarheader.h \
src/utils.h \
- src/diskcache.h
+ src/diskcache.h \
+ src/gridwidget.h \
+ src/painterutils.h \
+ src/database.h \
+ src/ytuser.h \
+ src/channelaggregator.h \
+ src/channelmodel.h \
+ src/aggregatevideosource.h \
+ src/channelview.h \
+ src/channelitemdelegate.h \
+ src/jsfunctions.h
SOURCES += src/main.cpp \
src/searchlineedit.cpp \
src/urllineedit.cpp \
@@ -108,7 +117,6 @@ SOURCES += src/main.cpp \
src/mediaview.cpp \
src/aboutview.cpp \
src/searchview.cpp \
- src/userview.cpp \
src/playlistitemdelegate.cpp \
src/playlistmodel.cpp \
src/videosource.cpp \
@@ -124,7 +132,17 @@ SOURCES += src/main.cpp \
src/ytsinglevideosource.cpp \
src/sidebarheader.cpp \
src/utils.cpp \
- src/diskcache.cpp
+ src/diskcache.cpp \
+ src/gridwidget.cpp \
+ src/painterutils.cpp \
+ src/database.cpp \
+ src/ytuser.cpp \
+ src/channelaggregator.cpp \
+ src/channelmodel.cpp \
+ src/aggregatevideosource.cpp \
+ src/channelview.cpp \
+ src/channelitemdelegate.cpp \
+ src/jsfunctions.cpp
RESOURCES += resources.qrc
DESTDIR = build/target/
OBJECTS_DIR = build/obj/
@@ -185,4 +203,4 @@ unix:!mac {
icon512.path = $$DATADIR/icons/hicolor/512x512/apps
icon512.files += data/512x512/minitube.png
}
-mac|win32:include(local/local.pri)
+mac|win32|contains(DEFINES, APP_UBUNTU):include(local/local.pri)
diff --git a/resources.qrc b/resources.qrc
index cf89be9..2f15768 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -55,5 +55,13 @@
flags/ye.png
style.css
images/worldwide.png
+ images/show-updated.png
+ images/sort.png
+ images/mark-watched.png
+ images/channels.png
+ images/unwatched.png
+ images/badge.png
+ images/badge3.png
+ images/badge4.png
diff --git a/src/Suggester.h b/src/Suggester.h
index ad39f92..e14492f 100644
--- a/src/Suggester.h
+++ b/src/Suggester.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef SUGGESTER_H
#define SUGGESTER_H
diff --git a/src/aboutview.cpp b/src/aboutview.cpp
index 4ab0fb9..f173a38 100644
--- a/src/aboutview.cpp
+++ b/src/aboutview.cpp
@@ -1,6 +1,26 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "aboutview.h"
#include "constants.h"
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
#include "extra.h"
#endif
#ifdef APP_ACTIVATION
@@ -38,7 +58,7 @@ AboutView::AboutView(QWidget *parent) : QWidget(parent) {
info += "" + tr("Licensed to: %1").arg("" + Activation::instance().getEmail() + " ");
#endif
-#ifdef Q_WS_X11
+#ifndef APP_EXTRA
info += "
" + tr("%1 is Free Software but its development takes precious time.").arg(Constants::NAME) + " "
+ tr("Please donate to support the continued development of %2.")
.arg(QString(Constants::WEBSITE).append("#donate"), Constants::NAME) + "
";
@@ -65,7 +85,7 @@ AboutView::AboutView(QWidget *parent) : QWidget(parent) {
+ tr("Icon designed by %1.").arg("David Nel ")
+ "
"
- #ifdef Q_WS_X11
+ #ifndef APP_EXTRA
"" + tr("Released under the GNU General Public License ")
.arg("http://www.gnu.org/licenses/gpl.html") + "
"
#endif
@@ -81,10 +101,9 @@ AboutView::AboutView(QWidget *parent) : QWidget(parent) {
buttonLayout->setSpacing(0);
buttonLayout->setAlignment(Qt::AlignLeft);
- QPushButton *closeButton = new QPushButton(tr("&Close"), this);
+ closeButton = new QPushButton(tr("&Close"));
closeButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
closeButton->setDefault(true);
- closeButton->setFocus(Qt::OtherFocusReason);
connect(closeButton, SIGNAL(clicked()), parent, SLOT(goBack()));
buttonLayout->addWidget(closeButton);
@@ -111,4 +130,5 @@ void AboutView::appear() {
mac::CheckForUpdates();
#endif
#endif
+ closeButton->setFocus();
}
diff --git a/src/aboutview.h b/src/aboutview.h
index 912c63c..14c0bd1 100644
--- a/src/aboutview.h
+++ b/src/aboutview.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef ABOUTVIEW_H
#define ABOUTVIEW_H
@@ -24,5 +44,8 @@ public:
protected:
void paintEvent(QPaintEvent *);
+private:
+ QPushButton *closeButton;
+
};
#endif
diff --git a/src/aggregatevideosource.cpp b/src/aggregatevideosource.cpp
new file mode 100644
index 0000000..55e72dc
--- /dev/null
+++ b/src/aggregatevideosource.cpp
@@ -0,0 +1,79 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "aggregatevideosource.h"
+#include "video.h"
+#include "database.h"
+#include
+
+AggregateVideoSource::AggregateVideoSource(QObject *parent) :
+ VideoSource(parent),
+ unwatched(false) { }
+
+void AggregateVideoSource::loadVideos(int max, int skip) {
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ QString sql = "select v.video_id,"
+ "v.published,"
+ "v.title,"
+ "v.author,"
+ "v.user_id,"
+ "v.description,"
+ "v.url,"
+ "v.thumb_url,"
+ "v.views,"
+ "v.duration";
+ if (unwatched)
+ sql += " from subscriptions_videos v, subscriptions s where v.channel_id=s.id "
+ "and v.added>s.watched and v.published>s.watched and v.watched=0 "
+ "order by v.published desc ";
+ else
+ sql += " from subscriptions_videos v order by published desc ";
+ sql += "limit ?,?";
+ query.prepare(sql);
+ query.bindValue(0, skip - 1);
+ query.bindValue(1, max);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+ QList videos;
+ while (query.next()) {
+ Video *video = new Video();
+ video->setId(query.value(0).toString());
+ video->setPublished(QDateTime::fromTime_t(query.value(1).toUInt()));
+ video->setTitle(query.value(2).toString());
+ video->setAuthor(query.value(3).toString());
+ video->setUserId(query.value(4).toString());
+ video->setDescription(query.value(5).toString());
+ video->setWebpage(query.value(6).toString());
+ video->setThumbnailUrl(query.value(7).toString());
+ video->setViewCount(query.value(8).toInt());
+ video->setDuration(query.value(9).toInt());
+ videos << video;
+ }
+ emit gotVideos(videos);
+ emit finished(videos.size());
+}
+
+const QStringList & AggregateVideoSource::getSuggestions() {
+ QStringList *l = new QStringList();
+ return *l;
+}
+
+void AggregateVideoSource::abort() { }
diff --git a/src/aggregatevideosource.h b/src/aggregatevideosource.h
new file mode 100644
index 0000000..49de4a0
--- /dev/null
+++ b/src/aggregatevideosource.h
@@ -0,0 +1,46 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef AGGREGATEVIDEOSOURCE_H
+#define AGGREGATEVIDEOSOURCE_H
+
+#include
+#include "videosource.h"
+
+class AggregateVideoSource : public VideoSource {
+
+ Q_OBJECT
+
+public:
+ AggregateVideoSource(QObject *parent = 0);
+ void loadVideos(int max, int skip);
+ virtual void abort();
+ virtual const QStringList & getSuggestions();
+ QString getName() { return name; }
+ void setName(QString name) { this->name = name; }
+ void setUnwatched(bool enable) { unwatched = enable; }
+
+private:
+ QString name;
+ bool unwatched;
+
+};
+
+#endif // AGGREGATEVIDEOSOURCE_H
diff --git a/src/autocomplete.cpp b/src/autocomplete.cpp
index ac09e9c..f915408 100644
--- a/src/autocomplete.cpp
+++ b/src/autocomplete.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "autocomplete.h"
#include "suggester.h"
#ifdef APP_MAC
diff --git a/src/autocomplete.h b/src/autocomplete.h
index 0f0e267..17a5953 100644
--- a/src/autocomplete.h
+++ b/src/autocomplete.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef SUGGESTCOMPLETION_H
#define SUGGESTCOMPLETION_H
diff --git a/src/channelaggregator.cpp b/src/channelaggregator.cpp
new file mode 100644
index 0000000..f27f23e
--- /dev/null
+++ b/src/channelaggregator.cpp
@@ -0,0 +1,279 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "channelaggregator.h"
+#include "ytuser.h"
+#include "ytsearch.h"
+#include "searchparams.h"
+#include "database.h"
+#include "video.h"
+#ifdef APP_MAC
+#include "macutils.h"
+#endif
+
+ChannelAggregator::ChannelAggregator(QObject *parent) : QObject(parent),
+ unwatchedCount(-1),
+ running(false),
+ stopped(false) {
+ QSettings settings;
+ checkInterval = settings.value("subscriptionsCheckInterval", 1800).toUInt();
+
+ timer = new QTimer(this);
+ timer->setInterval(60000 * 5);
+ connect(timer, SIGNAL(timeout()), SLOT(run()));
+}
+
+ChannelAggregator* ChannelAggregator::instance() {
+ static ChannelAggregator* i = new ChannelAggregator();
+ return i;
+}
+
+void ChannelAggregator::start() {
+ updateUnwatchedCount();
+ QTimer::singleShot(0, this, SLOT(run()));
+ timer->start();
+}
+
+void ChannelAggregator::stop() {
+ timer->stop();
+ stopped = true;
+}
+
+YTUser* ChannelAggregator::getChannelToCheck() {
+ if (stopped) return 0;
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("select user_id from subscriptions where checked "
+ "order by checked limit 1");
+ query.bindValue(0, QDateTime::currentDateTime().toTime_t() - checkInterval);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+ if (query.next())
+ return YTUser::forId(query.value(0).toString());
+ return 0;
+}
+
+void ChannelAggregator::run() {
+ if (running) return;
+ if (stopped) return;
+ if (!Database::exists()) return;
+ running = true;
+ newVideoCount = 0;
+ updatedChannels.clear();
+ if (!Database::instance().getConnection().transaction())
+ qWarning() << "Transaction failed" << __PRETTY_FUNCTION__;
+ processNextChannel();
+}
+
+void ChannelAggregator::processNextChannel() {
+ if (stopped) return;
+ qApp->processEvents();
+ YTUser* user = getChannelToCheck();
+ if (user) {
+ SearchParams *params = new SearchParams();
+ params->setAuthor(user->getUserId());
+ params->setSortBy(SearchParams::SortByNewest);
+ params->setTransient(true);
+ YTSearch *videoSource = new YTSearch(params, this);
+ connect(videoSource, SIGNAL(gotVideos(QList)),
+ SLOT(videosLoaded(QList)));
+ videoSource->loadVideos(10, 1);
+ user->updateChecked();
+ } else finish();
+}
+
+void ChannelAggregator::finish() {
+ foreach (YTUser *user, updatedChannels)
+ if (user->updateNotifyCount())
+ emit channelChanged(user);
+
+ updateUnwatchedCount();
+
+ QSqlDatabase db = Database::instance().getConnection();
+ if (!db.commit())
+ qWarning() << "Commit failed" << __PRETTY_FUNCTION__;
+ /*
+ QByteArray b = db.databaseName().right(20).toLocal8Bit();
+ const char* s = b.constData();
+ const int l = strlen(s);
+ int t = 1;
+ for (int i = 0; i < l; i++)
+ t += t % 2 ? s[i] / l : s[i] / t;
+ if (t != s[0]) return;
+ */
+
+#ifdef Q_WS_MAC
+ if (newVideoCount > 0 && unwatchedCount > 0 && mac::canNotify()) {
+ QString channelNames;
+ const int total = updatedChannels.size();
+ for (int i = 0; i < total; ++i) {
+ YTUser *user = updatedChannels.at(i);
+ channelNames += user->getDisplayName();
+ if (i < total-1) channelNames.append(", ");
+ }
+ channelNames = tr("By %1").arg(channelNames);
+ int actualNewVideoCount = qMin(newVideoCount, unwatchedCount);
+ mac::notify(tr("You have %n new video(s)", "", actualNewVideoCount),
+ channelNames, QString());
+ }
+#endif
+
+ running = false;
+}
+
+void ChannelAggregator::videosLoaded(QList videos) {
+ sender()->deleteLater();
+ foreach (Video* video, videos) {
+ qApp->processEvents();
+ addVideo(video);
+ video->deleteLater();
+ }
+ processNextChannel();
+}
+
+void ChannelAggregator::updateUnwatchedCount() {
+ if (!Database::exists()) return;
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("select sum(notify_count) from subscriptions");
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+ if (!query.next()) return;
+ int newUnwatchedCount = query.value(0).toInt();
+ if (newUnwatchedCount != unwatchedCount) {
+ unwatchedCount = newUnwatchedCount;
+ emit unwatchedCountChanged(unwatchedCount);
+ }
+}
+
+void ChannelAggregator::addVideo(Video *video) {
+ QSqlDatabase db = Database::instance().getConnection();
+
+ QSqlQuery query(db);
+ query.prepare("select count(*) from subscriptions_videos where video_id=?");
+ query.bindValue(0, video->id());
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+ if (!query.next()) return;
+ int count = query.value(0).toInt();
+ if (count > 0) return;
+
+ // qDebug() << "Inserting" << video->author() << video->title();
+
+ QString userId = video->userId();
+ YTUser *user = YTUser::forId(userId);
+ if (!updatedChannels.contains(user))
+ updatedChannels << user;
+ int channelId = user->getId();
+
+ uint now = QDateTime::currentDateTime().toTime_t();
+ uint published = video->published().toTime_t();
+ if (published > now) {
+ qDebug() << "fixing publish time";
+ published = now;
+ }
+
+ query = QSqlQuery(db);
+ query.prepare("insert into subscriptions_videos "
+ "(video_id,channel_id,published,added,watched,"
+ "title,author,user_id,description,url,thumb_url,views,duration) "
+ "values (?,?,?,?,?,?,?,?,?,?,?,?,?)");
+ query.bindValue(0, video->id());
+ query.bindValue(1, channelId);
+ query.bindValue(2, published);
+ query.bindValue(3, now);
+ query.bindValue(4, 0);
+ query.bindValue(5, video->title());
+ query.bindValue(6, video->author());
+ query.bindValue(7, video->userId());
+ query.bindValue(8, video->description());
+ query.bindValue(9, video->webpage());
+ query.bindValue(10, video->thumbnailUrl());
+ query.bindValue(11, video->viewCount());
+ query.bindValue(12, video->duration());
+ success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+
+ newVideoCount++;
+
+ query = QSqlQuery(db);
+ query.prepare("update subscriptions set updated=? where user_id=?");
+ query.bindValue(0, published);
+ query.bindValue(1, userId);
+ success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+}
+
+void ChannelAggregator::markAllAsWatched() {
+ uint now = QDateTime::currentDateTime().toTime_t();
+
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("update subscriptions set watched=?, notify_count=0");
+ query.bindValue(0, now);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+ unwatchedCount = 0;
+
+ foreach (YTUser *user, YTUser::getCachedUsers()) {
+ user->setWatched(now);
+ user->setNotifyCount(0);
+ }
+
+ emit unwatchedCountChanged(0);
+}
+
+void ChannelAggregator::videoWatched(Video *video) {
+ if (!Database::exists()) return;
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("update subscriptions_videos set watched=? where video_id=?");
+ query.bindValue(0, QDateTime::currentDateTime().toTime_t());
+ query.bindValue(1, video->id());
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+ if (query.numRowsAffected() > 0) {
+ YTUser *user = YTUser::forId(video->userId());
+ user->updateNotifyCount();
+ }
+}
+
+void ChannelAggregator::cleanup() {
+ static const int maxVideos = 1000;
+ static const int maxDeletions = 1000;
+ if (!Database::exists()) return;
+ QSqlDatabase db = Database::instance().getConnection();
+
+ QSqlQuery query(db);
+ bool success = query.exec("select count(*) from subscriptions_videos");
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+ if (!query.next()) return;
+ int count = query.value(0).toInt();
+ if (count <= maxVideos) return;
+
+ query = QSqlQuery(db);
+ query.prepare("delete from subscriptions_videos where id in "
+ "(select id from subscriptions_videos "
+ "order by published desc limit ?,?)");
+ query.bindValue(0, maxVideos);
+ query.bindValue(1, maxDeletions);
+ success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+}
diff --git a/src/channelaggregator.h b/src/channelaggregator.h
new file mode 100644
index 0000000..966fa70
--- /dev/null
+++ b/src/channelaggregator.h
@@ -0,0 +1,71 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef CHANNELAGGREGATOR_H
+#define CHANNELAGGREGATOR_H
+
+#include
+
+class YTUser;
+class Video;
+
+class ChannelAggregator : public QObject {
+
+ Q_OBJECT
+
+public:
+ static ChannelAggregator* instance();
+ int getUnwatchedCount() { return unwatchedCount; }
+ void markAllAsWatched();
+ void videoWatched(Video *video);
+ void cleanup();
+
+public slots:
+ void start();
+ void stop();
+ void run();
+
+signals:
+ void channelChanged(YTUser*);
+ void unwatchedCountChanged(int count);
+
+private slots:
+ void videosLoaded(QList videos);
+
+private:
+ ChannelAggregator(QObject *parent = 0);
+ YTUser* getChannelToCheck();
+ void processNextChannel();
+ void addVideo(Video* video);
+ void updateUnwatchedCount();
+ void finish();
+
+ uint checkInterval;
+ int unwatchedCount;
+ bool running;
+
+ int newVideoCount;
+ QList updatedChannels;
+
+ QTimer *timer;
+ bool stopped;
+};
+
+#endif // CHANNELAGGREGATOR_H
diff --git a/src/channelitemdelegate.cpp b/src/channelitemdelegate.cpp
new file mode 100644
index 0000000..b06e861
--- /dev/null
+++ b/src/channelitemdelegate.cpp
@@ -0,0 +1,167 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "channelitemdelegate.h"
+#include "channelmodel.h"
+#include "ytuser.h"
+#include "fontutils.h"
+#include "channelaggregator.h"
+#include "painterutils.h"
+
+static const int ITEM_WIDTH = 128;
+static const int ITEM_HEIGHT = 128;
+static const int THUMB_WIDTH = 88;
+static const int THUMB_HEIGHT = 88;
+
+ChannelItemDelegate::ChannelItemDelegate(QObject *parent) : QStyledItemDelegate(parent) {
+
+}
+
+QSize ChannelItemDelegate::sizeHint(const QStyleOptionViewItem& /*option*/,
+ const QModelIndex& /*index*/ ) const {
+ return QSize(ITEM_WIDTH, ITEM_HEIGHT);
+}
+
+void ChannelItemDelegate::paint( QPainter* painter,
+ const QStyleOptionViewItem& option,
+ const QModelIndex& index ) const {
+ const int itemType = index.data(ChannelModel::ItemTypeRole).toInt();
+ if (itemType == ChannelModel::ItemChannel)
+ paintChannel(painter, option, index);
+ else if (itemType == ChannelModel::ItemAggregate)
+ paintAggregate(painter, option, index);
+ else if (itemType == ChannelModel::ItemUnwatched)
+ paintUnwatched(painter, option, index);
+ else
+ QStyledItemDelegate::paint(painter, option, index);
+}
+
+void ChannelItemDelegate::paintAggregate(QPainter* painter,
+ const QStyleOptionViewItem& option,
+ const QModelIndex& index) const {
+ painter->save();
+
+ painter->translate(option.rect.topLeft());
+ const QRect line(0, 0, option.rect.width(), option.rect.height());
+
+ static const QPixmap thumbnail = QPixmap(":/images/channels.png");
+
+ QString name = tr("All Videos");
+
+ drawItem(painter, line, thumbnail, name);
+
+ painter->restore();
+}
+
+void ChannelItemDelegate::paintUnwatched(QPainter* painter,
+ const QStyleOptionViewItem& option,
+ const QModelIndex& index) const {
+ painter->save();
+
+ painter->translate(option.rect.topLeft());
+ const QRect line(0, 0, option.rect.width(), option.rect.height());
+
+ static const QPixmap thumbnail = QPixmap(":/images/unwatched.png");
+
+ QString name = tr("Unwatched Videos");
+
+ drawItem(painter, line, thumbnail, name);
+
+ int notifyCount = ChannelAggregator::instance()->getUnwatchedCount();
+ QString notifyText = QString::number(notifyCount);
+ if (notifyCount > 0) paintBadge(painter, line, notifyText);
+
+ painter->restore();
+}
+
+void ChannelItemDelegate::paintChannel(QPainter* painter,
+ const QStyleOptionViewItem& option,
+ const QModelIndex& index) const {
+ const QVariant dataObject = index.data(ChannelModel::DataObjectRole);
+ const YTUserPointer channelPointer = dataObject.value();
+ YTUser *user = channelPointer.data();
+ if (!user) return;
+
+ painter->save();
+
+ painter->translate(option.rect.topLeft());
+ const QRect line(0, 0, option.rect.width(), option.rect.height());
+
+ // const bool isActive = index.data( ActiveItemRole ).toBool();
+ // const bool isHovered = index.data(ChannelsModel::HoveredItemRole ).toBool();
+ // const bool isSelected = option.state & QStyle::State_Selected;
+
+ QPixmap thumbnail = user->getThumbnail();
+ if (thumbnail.isNull()) {
+ user->loadThumbnail();
+ painter->restore();
+ return;
+ }
+
+ QString name = user->getDisplayName();
+ drawItem(painter, line, thumbnail, name);
+
+ int notifyCount = user->getNotifyCount();
+ if (notifyCount > 0)
+ paintBadge(painter, line, QString::number(notifyCount));
+
+ painter->restore();
+}
+
+void ChannelItemDelegate::drawItem(QPainter *painter,
+ const QRect &line,
+ const QPixmap &thumbnail,
+ const QString &name) const {
+ painter->drawPixmap((line.width() - THUMB_WIDTH) / 2, 8, thumbnail);
+
+ QRect nameBox = line;
+ nameBox.adjust(0, 0, 0, -THUMB_HEIGHT - 16);
+ nameBox.translate(0, line.height() - nameBox.height());
+ bool tooBig = false;
+
+ QRect textBox = painter->boundingRect(nameBox,
+ Qt::AlignTop | Qt::AlignHCenter | Qt::TextWordWrap,
+ name);
+ if (textBox.height() > nameBox.height() || textBox.width() > nameBox.width()) {
+ painter->setFont(FontUtils::small());
+ textBox = painter->boundingRect(nameBox,
+ Qt::AlignTop | Qt::AlignHCenter | Qt::TextWordWrap,
+ name);
+ if (textBox.height() > nameBox.height()) {
+ painter->setClipRect(nameBox);
+ tooBig = true;
+ }
+ }
+ if (tooBig)
+ painter->drawText(nameBox, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, name);
+ else
+ painter->drawText(textBox, Qt::AlignCenter | Qt::TextWordWrap, name);
+}
+
+void ChannelItemDelegate::paintBadge(QPainter *painter,
+ const QRect &line,
+ const QString &text) const {
+ const int topLeft = (line.width() + THUMB_WIDTH) / 2;
+ painter->save();
+ painter->translate(topLeft, 0);
+ painter->setClipping(false);
+ PainterUtils::paintBadge(painter, text, true);
+ painter->restore();
+}
diff --git a/src/channelitemdelegate.h b/src/channelitemdelegate.h
new file mode 100644
index 0000000..6e5543a
--- /dev/null
+++ b/src/channelitemdelegate.h
@@ -0,0 +1,45 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef CHANNELITEMDELEGATE_H
+#define CHANNELITEMDELEGATE_H
+
+#include
+
+class ChannelItemDelegate : public QStyledItemDelegate {
+
+ Q_OBJECT
+
+public:
+ ChannelItemDelegate(QObject* parent = 0);
+ QSize sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const;
+ void paint(QPainter*, const QStyleOptionViewItem&, const QModelIndex&) const;
+
+private:
+ void paintChannel(QPainter*, const QStyleOptionViewItem&, const QModelIndex&) const;
+ void paintAggregate(QPainter*, const QStyleOptionViewItem&, const QModelIndex&) const;
+ void paintUnwatched(QPainter*, const QStyleOptionViewItem&, const QModelIndex&) const;
+ void paintBadge(QPainter *painter, const QRect &line, const QString &text) const;
+ void drawItem(QPainter *painter, const QRect &line,
+ const QPixmap &thumbnail, const QString &name) const;
+
+};
+
+#endif // CHANNELITEMDELEGATE_H
diff --git a/src/channelmodel.cpp b/src/channelmodel.cpp
new file mode 100644
index 0000000..2aa6c43
--- /dev/null
+++ b/src/channelmodel.cpp
@@ -0,0 +1,129 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "channelmodel.h"
+#include "ytuser.h"
+
+static const int channelOffset = 2;
+
+ChannelModel::ChannelModel(QObject *parent) :
+ QAbstractListModel(parent),
+ hoveredRow(-1) { }
+
+
+int ChannelModel::rowCount(const QModelIndex &) const {
+ return channels.isEmpty() ? 0 : channelOffset + channels.size();
+}
+
+QVariant ChannelModel::data(const QModelIndex &index, int role) const {
+ switch (role) {
+
+ case ChannelModel::ItemTypeRole:
+ return typeForIndex(index);
+
+ case ChannelModel::DataObjectRole:
+ if (typeForIndex(index) == ChannelModel::ItemChannel)
+ return QVariant::fromValue(QPointer(userForIndex(index)));
+ break;
+
+ case ChannelModel::HoveredItemRole:
+ return hoveredRow == index.row();
+
+ case Qt::StatusTipRole:
+ if (typeForIndex(index) == ChannelModel::ItemChannel)
+ return userForIndex(index)->getDescription();
+
+ }
+
+ return QVariant();
+}
+
+YTUser* ChannelModel::userForIndex(const QModelIndex &index) const {
+ return channels.at(index.row() - channelOffset);
+}
+
+ChannelModel::ItemTypes ChannelModel::typeForIndex(const QModelIndex &index) const {
+ switch (index.row()) {
+ case 0:
+ return ChannelModel::ItemAggregate;
+ case 1:
+ return ChannelModel::ItemUnwatched;
+ default:
+ return ChannelModel::ItemChannel;
+ }
+}
+
+void ChannelModel::setQuery(const QString &query, const QSqlDatabase &db) {
+ channels.clear();
+ sqlError = QSqlError();
+
+ QSqlQuery q(db);
+ q.prepare(query);
+ bool success = q.exec();
+ if (!success) {
+ qWarning() << q.lastQuery() << q.lastError().text();
+ sqlError = q.lastError();
+ }
+ while (q.next()) {
+ YTUser *user = YTUser::forId(q.value(0).toString());
+ connect(user, SIGNAL(thumbnailLoaded()), SLOT(updateSender()), Qt::UniqueConnection);
+ channels << user;
+ }
+
+ reset();
+}
+
+QSqlError ChannelModel::lastError() const {
+ return sqlError;
+}
+
+void ChannelModel::updateSender() {
+ YTUser *user = static_cast(sender());
+ if (!user) {
+ qWarning() << "Cannot get sender" << __PRETTY_FUNCTION__;
+ return;
+ }
+ updateChannel(user);
+}
+
+void ChannelModel::updateChannel(YTUser *user) {
+ int row = channels.indexOf(user);
+ if (row == -1) return;
+ row += channelOffset;
+ QModelIndex i = createIndex(row, 0);
+ emit dataChanged(i, i);
+}
+
+void ChannelModel::updateUnwatched() {
+ QModelIndex i = createIndex(1, 0);
+ emit dataChanged(i, i);
+}
+
+void ChannelModel::setHoveredRow(int row) {
+ int oldRow = hoveredRow;
+ hoveredRow = row;
+ emit dataChanged( createIndex( oldRow, 0 ), createIndex( oldRow, 0 ) );
+ emit dataChanged( createIndex( hoveredRow, 0 ), createIndex( hoveredRow, 0 ) );
+}
+
+void ChannelModel::clearHover() {
+ emit dataChanged( createIndex( hoveredRow, 0 ), createIndex( hoveredRow, 0 ) );
+ hoveredRow = -1;
+}
diff --git a/src/channelmodel.h b/src/channelmodel.h
new file mode 100644
index 0000000..3d89d4d
--- /dev/null
+++ b/src/channelmodel.h
@@ -0,0 +1,70 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef CHANNELMODEL_H
+#define CHANNELMODEL_H
+
+#include
+#include
+
+class YTUser;
+
+class ChannelModel : public QAbstractListModel {
+
+ Q_OBJECT
+
+public:
+ ChannelModel(QObject *parent = 0);
+
+ enum DataRoles {
+ ItemTypeRole = Qt::UserRole,
+ DataObjectRole,
+ HoveredItemRole
+ };
+
+ enum ItemTypes {
+ ItemChannel = 1,
+ ItemAggregate,
+ ItemUnwatched
+ };
+
+ void setQuery(const QString &query, const QSqlDatabase &db);
+ QSqlError lastError() const;
+ ItemTypes typeForIndex(const QModelIndex &index) const;
+ YTUser* userForIndex(const QModelIndex &index) const;
+ void setHoveredRow(int row);
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const;
+ QVariant data(const QModelIndex &index, int role) const;
+
+public slots:
+ void clearHover();
+ void updateSender();
+ void updateChannel(YTUser *user);
+ void updateUnwatched();
+
+private:
+ QList channels;
+ int hoveredRow;
+ QSqlError sqlError;
+
+};
+
+#endif // CHANNELMODEL_H
diff --git a/src/channelsuggest.cpp b/src/channelsuggest.cpp
index 757c534..6d0d1ff 100644
--- a/src/channelsuggest.cpp
+++ b/src/channelsuggest.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "channelsuggest.h"
#include "networkaccess.h"
diff --git a/src/channelsuggest.h b/src/channelsuggest.h
index 85cbef9..c4bdec9 100644
--- a/src/channelsuggest.h
+++ b/src/channelsuggest.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef CHANNELSUGGEST_H
#define CHANNELSUGGEST_H
diff --git a/src/channelview.cpp b/src/channelview.cpp
new file mode 100644
index 0000000..eba0591
--- /dev/null
+++ b/src/channelview.cpp
@@ -0,0 +1,301 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "channelview.h"
+#include "ytuser.h"
+#include "ytsearch.h"
+#include "searchparams.h"
+#include "channelmodel.h"
+#include "channelitemdelegate.h"
+#include "database.h"
+#include "ytsearch.h"
+#include "channelaggregator.h"
+#include "aggregatevideosource.h"
+#include "painterutils.h"
+#include "mainwindow.h"
+#include "utils.h"
+#ifdef APP_EXTRA
+#include "extra.h"
+#endif
+
+static const char *sortByKey = "subscriptionsSortBy";
+static const char *showUpdatedKey = "subscriptionsShowUpdated";
+
+ChannelView::ChannelView(QWidget *parent) : QListView(parent),
+ showUpdated(false),
+ sortBy(SortByName) {
+
+ setItemDelegate(new ChannelItemDelegate(this));
+ setSelectionMode(QAbstractItemView::NoSelection);
+
+ // layout
+ setSpacing(15);
+ setFlow(QListView::LeftToRight);
+ setWrapping(true);
+ setResizeMode(QListView::Adjust);
+ setMovement(QListView::Static);
+ setUniformItemSizes(true);
+
+ // cosmetics
+ setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+ setFrameShape(QFrame::NoFrame);
+ setAttribute(Qt::WA_MacShowFocusRect, false);
+
+ QPalette p = palette();
+ /*
+ p.setColor(QPalette::Base, p.window().color());
+ p.setColor(QPalette::Text, p.windowText().color());
+ */
+ p.setColor(QPalette::Disabled, QPalette::Base, p.base().color());
+ p.setColor(QPalette::Disabled, QPalette::Text, p.text().color());
+ setPalette(p);
+
+ verticalScrollBar()->setPageStep(3);
+ verticalScrollBar()->setSingleStep(1);
+
+ setMouseTracking(true);
+
+ connect(this, SIGNAL(clicked(const QModelIndex &)),
+ SLOT(itemActivated(const QModelIndex &)));
+ connect(this, SIGNAL(entered(const QModelIndex &)),
+ SLOT(itemEntered(const QModelIndex &)));
+
+ channelsModel = new ChannelModel(this);
+ setModel(channelsModel);
+ connect(this, SIGNAL(viewportEntered()),
+ channelsModel, SLOT(clearHover()));
+
+ setupActions();
+
+ connect(ChannelAggregator::instance(), SIGNAL(channelChanged(YTUser*)),
+ channelsModel, SLOT(updateChannel(YTUser*)));
+ connect(ChannelAggregator::instance(), SIGNAL(unwatchedCountChanged(int)),
+ SLOT(unwatchedCountChanged(int)));
+
+ unwatchedCountChanged(ChannelAggregator::instance()->getUnwatchedCount());
+}
+
+void ChannelView::setupActions() {
+ QSettings settings;
+
+ markAsWatchedAction = new QAction(
+ Utils::icon("mark-watched"), tr("Mark all as watched"), this);
+ markAsWatchedAction->setEnabled(false);
+ markAsWatchedAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_W));
+ connect(markAsWatchedAction, SIGNAL(triggered()), SLOT(markAllAsWatched()));
+ statusActions << markAsWatchedAction;
+
+ showUpdated = settings.value(showUpdatedKey, false).toBool();
+ QAction *showUpdatedAction = new QAction(
+ Utils::icon("show-updated"), tr("Show Updated"), this);
+ showUpdatedAction->setCheckable(true);
+ showUpdatedAction->setChecked(showUpdated);
+ showUpdatedAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_U));
+ connect(showUpdatedAction, SIGNAL(toggled(bool)), SLOT(toggleShowUpdated(bool)));
+ statusActions << showUpdatedAction;
+
+ SortBy sortBy = static_cast(settings.value(sortByKey, SortByName).toInt());
+
+ QMenu *sortMenu = new QMenu(this);
+ QActionGroup *sortGroup = new QActionGroup(this);
+
+ QAction *sortByNameAction = new QAction(tr("Name"), this);
+ sortByNameAction->setActionGroup(sortGroup);
+ sortByNameAction->setCheckable(true);
+ if (sortBy == SortByName) sortByNameAction->setChecked(true);
+ connect(sortByNameAction, SIGNAL(triggered()), SLOT(setSortByName()));
+ sortMenu->addAction(sortByNameAction);
+
+ QAction *sortByUpdatedAction = new QAction(tr("Last Updated"), this);
+ sortByUpdatedAction->setActionGroup(sortGroup);
+ sortByUpdatedAction->setCheckable(true);
+ if (sortBy == SortByUpdated) sortByUpdatedAction->setChecked(true);
+ connect(sortByUpdatedAction, SIGNAL(triggered()), SLOT(setSortByUpdated()));
+ sortMenu->addAction(sortByUpdatedAction);
+
+ QAction *sortByAddedAction = new QAction(tr("Last Added"), this);
+ sortByAddedAction->setActionGroup(sortGroup);
+ sortByAddedAction->setCheckable(true);
+ if (sortBy == SortByAdded) sortByAddedAction->setChecked(true);
+ connect(sortByAddedAction, SIGNAL(triggered()), SLOT(setSortByAdded()));
+ sortMenu->addAction(sortByAddedAction);
+
+ QAction *sortByLastWatched = new QAction(tr("Last Watched"), this);
+ sortByLastWatched->setActionGroup(sortGroup);
+ sortByLastWatched->setCheckable(true);
+ if (sortBy == SortByLastWatched) sortByLastWatched->setChecked(true);
+ connect(sortByLastWatched, SIGNAL(triggered()), SLOT(setSortByLastWatched()));
+ sortMenu->addAction(sortByLastWatched);
+
+ QAction *sortByMostWatched = new QAction(tr("Most Watched"), this);
+ sortByMostWatched->setActionGroup(sortGroup);
+ sortByMostWatched->setCheckable(true);
+ if (sortBy == SortByMostWatched) sortByMostWatched->setChecked(true);
+ connect(sortByMostWatched, SIGNAL(triggered()), SLOT(setSortByMostWatched()));
+ sortMenu->addAction(sortByMostWatched);
+
+ QToolButton *sortButton = new QToolButton(this);
+ sortButton->setText(tr("Sort by"));
+ sortButton->setIcon(Utils::icon("sort"));
+ sortButton->setIconSize(QSize(16, 16));
+ sortButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ sortButton->setPopupMode(QToolButton::InstantPopup);
+ sortButton->setMenu(sortMenu);
+ QWidgetAction *widgetAction = new QWidgetAction(this);
+ widgetAction->setDefaultWidget(sortButton);
+ widgetAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_O));
+ statusActions << widgetAction;
+
+ foreach (QAction *action, statusActions) {
+ window()->addAction(action);
+ Utils::setupAction(action);
+ }
+}
+
+void ChannelView::appear() {
+ updateQuery();
+ foreach (QAction* action, statusActions)
+ MainWindow::instance()->showActionInStatusBar(action, true);
+ setFocus();
+ ChannelAggregator::instance()->run();
+}
+
+void ChannelView::disappear() {
+ foreach (QAction* action, statusActions)
+ MainWindow::instance()->showActionInStatusBar(action, false);
+}
+
+void ChannelView::mouseMoveEvent(QMouseEvent *event) {
+ QListView::mouseMoveEvent(event);
+ const QModelIndex index = indexAt(event->pos());
+ if (index.isValid()) setCursor(Qt::PointingHandCursor);
+ else unsetCursor();
+}
+
+void ChannelView::leaveEvent(QEvent *event) {
+ QListView::leaveEvent(event);
+ // channelsModel->clearHover();
+}
+
+void ChannelView::itemEntered(const QModelIndex &index) {
+ // channelsModel->setHoveredRow(index.row());
+}
+
+void ChannelView::itemActivated(const QModelIndex &index) {
+ ChannelModel::ItemTypes itemType = channelsModel->typeForIndex(index);
+ if (itemType == ChannelModel::ItemChannel) {
+ YTUser *user = channelsModel->userForIndex(index);
+ SearchParams *params = new SearchParams();
+ params->setAuthor(user->getUserId());
+ params->setSortBy(SearchParams::SortByNewest);
+ params->setTransient(true);
+ YTSearch *videoSource = new YTSearch(params, this);
+ emit activated(videoSource);
+ user->updateWatched();
+ } else if (itemType == ChannelModel::ItemAggregate) {
+ AggregateVideoSource *videoSource = new AggregateVideoSource(this);
+ videoSource->setName(tr("All Videos"));
+ emit activated(videoSource);
+ } else if (itemType == ChannelModel::ItemUnwatched) {
+ AggregateVideoSource *videoSource = new AggregateVideoSource(this);
+ videoSource->setName(tr("Unwatched Videos"));
+ videoSource->setUnwatched(true);
+ emit activated(videoSource);
+ }
+}
+
+void ChannelView::paintEvent(QPaintEvent *event) {
+ if (model()->rowCount() < 3) {
+ QString msg;
+ if (!errorMessage.isEmpty())
+ msg = errorMessage;
+ else if (showUpdated)
+ msg = tr("There are no updated subscriptions at this time.");
+ else
+ msg = tr("You have no subscriptions. "
+ "Use the star symbol to subscribe to channels.");
+ PainterUtils::centeredMessage(msg, viewport());
+ } else QListView::paintEvent(event);
+ PainterUtils::topShadow(viewport());
+}
+
+void ChannelView::toggleShowUpdated(bool enable) {
+ showUpdated = enable;
+ updateQuery(true);
+ QSettings settings;
+ settings.setValue(showUpdatedKey, showUpdated);
+}
+
+void ChannelView::updateQuery(bool transition) {
+ errorMessage.clear();
+ if (!Database::exists()) return;
+
+ QString sql = "select user_id from subscriptions";
+ if (showUpdated)
+ sql += " where notify_count>0";
+
+ switch (sortBy) {
+ case SortByUpdated:
+ sql += " order by updated desc";
+ break;
+ case SortByAdded:
+ sql += " order by added desc";
+ break;
+ case SortByLastWatched:
+ sql += " order by watched desc";
+ break;
+ case SortByMostWatched:
+ sql += " order by views desc";
+ break;
+ default:
+ sql += " order by name collate nocase";
+ break;
+ }
+
+#ifdef APP_EXTRA
+ if (transition)
+ Extra::fadeInWidget(this, this);
+#endif
+
+ channelsModel->setQuery(sql, Database::instance().getConnection());
+ if (channelsModel->lastError().isValid()) {
+ qWarning() << channelsModel->lastError().text();
+ errorMessage = channelsModel->lastError().text();
+ }
+}
+
+void ChannelView::setSortBy(SortBy sortBy) {
+ this->sortBy = sortBy;
+ updateQuery(true);
+ QSettings settings;
+ settings.setValue(sortByKey, (int)sortBy);
+}
+
+void ChannelView::markAllAsWatched() {
+ ChannelAggregator::instance()->markAllAsWatched();
+ updateQuery();
+ markAsWatchedAction->setEnabled(false);
+}
+
+void ChannelView::unwatchedCountChanged(int count) {
+ markAsWatchedAction->setEnabled(count > 0);
+ channelsModel->updateUnwatched();
+ updateQuery();
+}
diff --git a/src/channelview.h b/src/channelview.h
new file mode 100644
index 0000000..a5013c9
--- /dev/null
+++ b/src/channelview.h
@@ -0,0 +1,84 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef CHANNELSVIEW_H
+#define CHANNELSVIEW_H
+
+#include
+#include "view.h"
+
+class VideoSource;
+class ChannelModel;
+
+class ChannelView : public QListView, public View {
+
+ Q_OBJECT
+
+public:
+ ChannelView(QWidget *parent = 0);
+
+signals:
+ void activated(VideoSource *videoSource);
+
+public slots:
+ void appear();
+ void disappear();
+
+protected:
+ void mouseMoveEvent(QMouseEvent *event);
+ void leaveEvent(QEvent *event);
+ void paintEvent(QPaintEvent *event);
+
+private:
+ enum SortBy {
+ SortByName = 0,
+ SortByAdded,
+ SortByUpdated,
+ SortByLastWatched,
+ SortByMostWatched
+ };
+
+private slots:
+ void itemEntered(const QModelIndex &index);
+ void itemActivated(const QModelIndex &index);
+ void toggleShowUpdated(bool enable);
+ void setSortBy(SortBy sortBy);
+ void setSortByName() { setSortBy(SortByName); }
+ void setSortByUpdated() { setSortBy(SortByUpdated); }
+ void setSortByAdded() { setSortBy(SortByAdded); }
+ void setSortByLastWatched() { setSortBy(SortByLastWatched); }
+ void setSortByMostWatched() { setSortBy(SortByMostWatched); }
+ void markAllAsWatched();
+ void unwatchedCountChanged(int count);
+
+private:
+ void updateQuery(bool transition = false);
+ void setupActions();
+
+ ChannelModel *channelsModel;
+ QList statusActions;
+ bool showUpdated;
+ SortBy sortBy;
+ QString errorMessage;
+ QAction *markAsWatchedAction;
+
+};
+
+#endif // CHANNELSVIEW_H
diff --git a/src/constants.cpp b/src/constants.cpp
index f065959..0a54292 100644
--- a/src/constants.cpp
+++ b/src/constants.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "constants.h"
#define STR(x) #x
diff --git a/src/constants.h b/src/constants.h
index 2e1f55f..a4cdc10 100644
--- a/src/constants.h
+++ b/src/constants.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef CONSTANTS_H
#define CONSTANTS_H
diff --git a/src/database.cpp b/src/database.cpp
new file mode 100644
index 0000000..37e8433
--- /dev/null
+++ b/src/database.cpp
@@ -0,0 +1,210 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "database.h"
+#include "constants.h"
+#include
+
+static const int DATABASE_VERSION = 1;
+static const QString dbName = QLatin1String(Constants::UNIX_NAME) + ".db";
+static Database *databaseInstance = 0;
+
+Database::Database() {
+
+ QString dataLocation = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
+ QDir().mkpath(dataLocation);
+ dbLocation = dataLocation + "/" + dbName;
+
+ QMutexLocker locker(&lock);
+
+ if(QFile::exists(dbLocation)) {
+ // check db version
+ int databaseVersion = getAttribute("version").toInt();
+ if (databaseVersion != DATABASE_VERSION)
+ qWarning("Wrong database version: %d", databaseVersion);
+ } else createDatabase();
+}
+
+Database::~Database() {
+ closeConnections();
+}
+
+void Database::createDatabase() {
+
+ qWarning() << "Creating the database";
+
+ const QSqlDatabase db = getConnection();
+
+ QSqlQuery("create table subscriptions ("
+ "id integer primary key autoincrement,"
+ "user_id varchar,"
+ "user_name varchar,"
+ "name varchar,"
+ "description varchar,"
+ "thumb_url varchar,"
+ "country varchar,"
+ "added integer,"
+ "checked integer," // last check for videos on YT APIs
+ "updated integer," // most recent video added
+ "watched integer," // last time the user watched this channel
+ "loaded integer," // last time channel metadata was loaded from YT APIs
+ "notify_count integer," // new videos since "watched"
+ "views integer)" // number of times the user watched this channel
+ , db);
+ QSqlQuery("create unique index idx_user_id on subscriptions(user_id)", db);
+
+ QSqlQuery("create table subscriptions_videos ("
+ "id integer primary key autoincrement,"
+ "video_id varchar,"
+ "channel_id integer,"
+ "published integer,"
+ "added integer,"
+ "watched integer,"
+ "title varchar,"
+ "author varchar,"
+ "user_id varchar,"
+ "description varchar,"
+ "url varchar,"
+ "thumb_url varchar,"
+ "views integer,"
+ "duration integer)"
+ , db);
+ QSqlQuery("create unique index idx_video_id on subscriptions_videos(video_id)", db);
+
+ QSqlQuery("create table attributes (name varchar, value)", db);
+ QSqlQuery("insert into attributes (name, value) values ('version', "
+ + QString::number(DATABASE_VERSION) + ")", db);
+}
+
+QString Database::getDbLocation() {
+ static QString dataLocation = QDesktopServices::storageLocation(
+ QDesktopServices::DataLocation);
+ return dataLocation + "/" + dbName;
+}
+
+bool Database::exists() {
+ static bool fileExists = false;
+ if (!fileExists)
+ fileExists = QFile::exists(getDbLocation());
+ return fileExists;
+}
+
+Database& Database::instance() {
+ static QMutex mutex;
+ QMutexLocker locker(&mutex);
+ if (!databaseInstance) databaseInstance = new Database();
+ return *databaseInstance;
+}
+
+QSqlDatabase Database::getConnection() {
+ QThread *currentThread = QThread::currentThread();
+ if (!currentThread) {
+ qDebug() << "current thread is null";
+ return QSqlDatabase();
+ }
+
+ const QString threadName = currentThread->objectName();
+ // qDebug() << "threadName" << threadName << currentThread;
+ if (connections.contains(currentThread)) {
+ return connections.value(currentThread);
+ } else {
+ // qDebug() << "Creating db connection for" << threadName;
+ QSqlDatabase connection = QSqlDatabase::addDatabase("QSQLITE", threadName);
+ connection.setDatabaseName(dbLocation);
+ if(!connection.open()) {
+ qWarning() << QString("Cannot connect to database %1 in thread %2").arg(dbLocation, threadName);
+ }
+ connections.insert(currentThread, connection);
+ return connection;
+ }
+}
+
+QVariant Database::getAttribute(QString name) {
+ QSqlQuery query("select value from attributes where name=?", getConnection());
+ query.bindValue(0, name);
+
+ bool success = query.exec();
+ if (!success) qDebug() << query.lastQuery() << query.boundValues().values() << query.lastError().text();
+ if (query.next())
+ return query.value(0);
+ return QVariant();
+}
+
+void Database::setAttribute(QString name, QVariant value) {
+ QSqlQuery query(getConnection());
+ query.prepare("update attributes set value=? where name=?");
+ query.bindValue(0, value);
+ query.bindValue(1, name);
+ bool success = query.exec();
+ if (!success) qDebug() << query.lastError().text();
+}
+
+/**
+ * After calling this method you have to reacquire a valid instance using instance()
+ */
+void Database::drop() {
+ /// closeConnections();
+ if (!QFile::remove(dbLocation)) {
+ qWarning() << "Cannot delete database" << dbLocation;
+
+ // fallback to delete records in tables
+ const QSqlDatabase db = getConnection();
+ QSqlQuery query(db);
+ if (!query.exec("select name from sqlite_master where type='table'")) {
+ qWarning() << query.lastQuery() << query.lastError().text();
+ }
+
+ while (query.next()) {
+ QString tableName = query.value(0).toString();
+ if (tableName.startsWith("sqlite_") || tableName == "attributes") continue;
+ QString dropSQL = "delete from " + tableName;
+ QSqlQuery query2(db);
+ if (!query2.exec(dropSQL))
+ qWarning() << query2.lastQuery() << query2.lastError().text();
+ }
+
+ query.exec("delete from sqlite_sequence");
+
+ }
+ if (databaseInstance) delete databaseInstance;
+ databaseInstance = 0;
+}
+
+void Database::closeConnections() {
+ foreach(QSqlDatabase connection, connections.values()) {
+ // qDebug() << "Closing connection" << connection;
+ connection.close();
+ }
+ connections.clear();
+}
+
+void Database::closeConnection() {
+ QThread *currentThread = QThread::currentThread();
+ if (!connections.contains(currentThread)) return;
+ QSqlDatabase connection = connections.take(currentThread);
+ // qDebug() << "Closing connection" << connection;
+ connection.close();
+}
+
+void Database::shutdown() {
+ if (!databaseInstance) return;
+ QSqlQuery("vacuum", databaseInstance->getConnection());
+ databaseInstance->closeConnections();
+}
diff --git a/src/database.h b/src/database.h
new file mode 100644
index 0000000..74ab8b7
--- /dev/null
+++ b/src/database.h
@@ -0,0 +1,54 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef DATABASE_H
+#define DATABASE_H
+
+#include
+#include
+
+class Database : public QObject {
+
+ Q_OBJECT
+
+public:
+ static bool exists();
+ static Database& instance();
+ static void shutdown();
+ QSqlDatabase getConnection();
+ ~Database();
+ void drop();
+ void closeConnections();
+ void closeConnection();
+
+private:
+ Database();
+ static QString getDbLocation();
+ void createDatabase();
+ QVariant getAttribute(QString name);
+ void setAttribute(QString name, QVariant value);
+
+ QMutex lock;
+ QString dbLocation;
+ QHash connections;
+
+};
+
+#endif // DATABASE_H
diff --git a/src/diskcache.cpp b/src/diskcache.cpp
index f6a45f6..36234d1 100644
--- a/src/diskcache.cpp
+++ b/src/diskcache.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "diskcache.h"
#include
diff --git a/src/diskcache.h b/src/diskcache.h
index 80791a6..1f3cdc9 100644
--- a/src/diskcache.h
+++ b/src/diskcache.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef DISKCACHE_H
#define DISKCACHE_H
diff --git a/src/downloaditem.cpp b/src/downloaditem.cpp
index 0ff2396..12bb7c2 100644
--- a/src/downloaditem.cpp
+++ b/src/downloaditem.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "downloaditem.h"
#include "networkaccess.h"
#include "video.h"
diff --git a/src/downloaditem.h b/src/downloaditem.h
index bb9245f..7a100e0 100644
--- a/src/downloaditem.h
+++ b/src/downloaditem.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef DOWNLOADITEM_H
#define DOWNLOADITEM_H
diff --git a/src/downloadlistview.cpp b/src/downloadlistview.cpp
index 4ebb34c..7a1fafd 100644
--- a/src/downloadlistview.cpp
+++ b/src/downloadlistview.cpp
@@ -1,6 +1,27 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "downloadlistview.h"
#include "downloadmodel.h"
#include "playlistitemdelegate.h"
+#include "painterutils.h"
DownloadListView::DownloadListView(QWidget *parent) : QListView(parent) {
@@ -57,3 +78,8 @@ bool DownloadListView::isHoveringPlayIcon(QMouseEvent *event) {
const int y = event->y() - itemRect.y() - buttonRect.y();
return x > 0 && x < buttonRect.width() && y > 0 && y < buttonRect.height();
}
+
+void DownloadListView::paintEvent(QPaintEvent *event) {
+ QListView::paintEvent(event);
+ PainterUtils::topShadow(viewport());
+}
diff --git a/src/downloadlistview.h b/src/downloadlistview.h
index 72f457a..59514c6 100644
--- a/src/downloadlistview.h
+++ b/src/downloadlistview.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef DOWNLOADLISTVIEW_H
#define DOWNLOADLISTVIEW_H
@@ -16,6 +36,7 @@ protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
bool isHoveringPlayIcon(QMouseEvent *event);
+ void paintEvent(QPaintEvent *event);
signals:
void downloadButtonPushed(QModelIndex index);
diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp
index 21115d3..33d2ada 100644
--- a/src/downloadmanager.cpp
+++ b/src/downloadmanager.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "downloadmanager.h"
#include "downloaditem.h"
#include "downloadmodel.h"
@@ -7,8 +27,8 @@
#ifdef APP_ACTIVATION
#include "activation.h"
#endif
-#ifdef Q_WS_MAC
-#include "macutils.h"
+#ifdef APP_EXTRA
+#include "extra.h"
#endif
static DownloadManager *downloadManagerInstance = 0;
@@ -103,9 +123,6 @@ void DownloadManager::gotStreamUrl(QUrl url) {
video->disconnect(this);
- QString path = currentDownloadFolder();
-
- // TODO ensure all chars are filename compatible
QString basename = video->title();
basename.replace('(', '[');
basename.replace(')', ']');
@@ -120,7 +137,12 @@ void DownloadManager::gotStreamUrl(QUrl url) {
basename.replace('*', ' ');
basename = basename.simplified();
- QString filename = path + "/" + basename + ".mp4";
+ if (!basename.isEmpty() && basename.at(0) == '.')
+ basename = basename.mid(1).trimmed();
+
+ if (basename.isEmpty()) basename = video->id();
+
+ QString filename = currentDownloadFolder() + "/" + basename + ".mp4";
Video *videoCopy = video->clone();
DownloadItem *item = new DownloadItem(videoCopy, url, filename, this);
@@ -138,8 +160,7 @@ void DownloadManager::gotStreamUrl(QUrl url) {
void DownloadManager::itemFinished() {
if (activeItems() == 0) emit finished();
-#ifdef Q_WS_MAC
- if (mac::canNotify()) {
+#ifdef APP_EXTRA
DownloadItem *item = static_cast(sender());
if (!item) {
qDebug() << "Cannot get item in" << __FUNCTION__;
@@ -150,8 +171,7 @@ void DownloadManager::itemFinished() {
QString stats = tr("%1 downloaded in %2").arg(
DownloadItem::formattedFilesize(item->bytesTotal()),
DownloadItem::formattedTime(item->totalTime(), false));
- mac::notify(tr("Download finished"), video->title(), stats);
- }
+ Extra::notify(tr("Download finished"), video->title(), stats);
#endif
}
diff --git a/src/downloadmanager.h b/src/downloadmanager.h
index 789ee03..a07d7e3 100644
--- a/src/downloadmanager.h
+++ b/src/downloadmanager.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef DOWNLOADMANAGER_H
#define DOWNLOADMANAGER_H
diff --git a/src/downloadmodel.cpp b/src/downloadmodel.cpp
index 2031d3f..d5d36e9 100644
--- a/src/downloadmodel.cpp
+++ b/src/downloadmodel.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "downloadmodel.h"
#include "downloadmanager.h"
#include "downloaditem.h"
diff --git a/src/downloadmodel.h b/src/downloadmodel.h
index 26a43de..7dd8f49 100644
--- a/src/downloadmodel.h
+++ b/src/downloadmodel.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef DOWNLOADMODEL_H
#define DOWNLOADMODEL_H
diff --git a/src/downloadsettings.cpp b/src/downloadsettings.cpp
index d73182e..1afb2d5 100644
--- a/src/downloadsettings.cpp
+++ b/src/downloadsettings.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "downloadsettings.h"
#include "downloadmanager.h"
#include "mainwindow.h"
diff --git a/src/downloadsettings.h b/src/downloadsettings.h
index 968c8aa..f6d8e01 100644
--- a/src/downloadsettings.h
+++ b/src/downloadsettings.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef DOWNLOADSETTINGS_H
#define DOWNLOADSETTINGS_H
diff --git a/src/downloadview.cpp b/src/downloadview.cpp
index 42db96b..2ad4763 100644
--- a/src/downloadview.cpp
+++ b/src/downloadview.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "downloadview.h"
#include "downloadmodel.h"
#include "downloadmanager.h"
diff --git a/src/downloadview.h b/src/downloadview.h
index 2ac7b3d..731c6f9 100644
--- a/src/downloadview.h
+++ b/src/downloadview.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef DOWNLOADVIEW_H
#define DOWNLOADVIEW_H
diff --git a/src/fontutils.cpp b/src/fontutils.cpp
index b3418d6..5e3f3c1 100644
--- a/src/fontutils.cpp
+++ b/src/fontutils.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "fontutils.h"
static const int MIN_PIXEL_SIZE = 11;
diff --git a/src/fontutils.h b/src/fontutils.h
index 077b2d7..7048ea8 100644
--- a/src/fontutils.h
+++ b/src/fontutils.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef FONTUTILS_H
#define FONTUTILS_H
diff --git a/src/global.h b/src/global.h
index d2aad7a..6057a83 100644
--- a/src/global.h
+++ b/src/global.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef GLOBAL_H
#define GLOBAL_H
diff --git a/src/globalshortcutbackend.cpp b/src/globalshortcutbackend.cpp
index 8646b7a..910425a 100644
--- a/src/globalshortcutbackend.cpp
+++ b/src/globalshortcutbackend.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "globalshortcutbackend.h"
#include "globalshortcuts.h"
diff --git a/src/globalshortcutbackend.h b/src/globalshortcutbackend.h
index e6844bb..46edb7b 100644
--- a/src/globalshortcutbackend.h
+++ b/src/globalshortcutbackend.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef GLOBALSHORTCUTBACKEND_H
#define GLOBALSHORTCUTBACKEND_H
diff --git a/src/globalshortcuts.cpp b/src/globalshortcuts.cpp
index 39eda6d..e747322 100644
--- a/src/globalshortcuts.cpp
+++ b/src/globalshortcuts.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "globalshortcuts.h"
#include "globalshortcutbackend.h"
diff --git a/src/globalshortcuts.h b/src/globalshortcuts.h
index 62cd935..754ad74 100644
--- a/src/globalshortcuts.h
+++ b/src/globalshortcuts.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef GLOBALSHORTCUTS_H
#define GLOBALSHORTCUTS_H
diff --git a/src/gnomeglobalshortcutbackend.cpp b/src/gnomeglobalshortcutbackend.cpp
index 6fc3594..1b07d59 100644
--- a/src/gnomeglobalshortcutbackend.cpp
+++ b/src/gnomeglobalshortcutbackend.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "gnomeglobalshortcutbackend.h"
#include "globalshortcuts.h"
diff --git a/src/gnomeglobalshortcutbackend.h b/src/gnomeglobalshortcutbackend.h
index bf6dd89..4aecca4 100644
--- a/src/gnomeglobalshortcutbackend.h
+++ b/src/gnomeglobalshortcutbackend.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef GNOMEGLOBALSHORTCUTBACKEND_H
#define GNOMEGLOBALSHORTCUTBACKEND_H
diff --git a/src/gridwidget.cpp b/src/gridwidget.cpp
new file mode 100644
index 0000000..3e445aa
--- /dev/null
+++ b/src/gridwidget.cpp
@@ -0,0 +1,65 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "gridwidget.h"
+
+GridWidget::GridWidget(QWidget *parent) :
+ QWidget(parent),
+ hovered(false),
+ pressed(false) {
+ setCursor(Qt::PointingHandCursor);
+ setFocusPolicy(Qt::StrongFocus);
+}
+
+void GridWidget::mouseMoveEvent(QMouseEvent *event) {
+ QWidget::mouseMoveEvent(event);
+ hovered = rect().contains(event->pos());
+}
+
+void GridWidget::mousePressEvent(QMouseEvent *event) {
+ QWidget::mousePressEvent(event);
+ if (event->button() != Qt::LeftButton) return;
+ pressed = true;
+ update();
+}
+
+void GridWidget::mouseReleaseEvent(QMouseEvent *event) {
+ QWidget::mouseReleaseEvent(event);
+ if (event->button() != Qt::LeftButton) return;
+ pressed = false;
+ if (hovered) emit activated();
+}
+
+void GridWidget::leaveEvent(QEvent *event) {
+ QWidget::leaveEvent(event);
+ hovered = false;
+ update();
+}
+
+void GridWidget::enterEvent(QEvent *event) {
+ QWidget::enterEvent(event);
+ hovered = true;
+ update();
+}
+
+void GridWidget::keyReleaseEvent(QKeyEvent *event) {
+ if (event->key() == Qt::Key_Return)
+ emit activated();
+}
diff --git a/src/gridwidget.h b/src/gridwidget.h
new file mode 100644
index 0000000..25756ca
--- /dev/null
+++ b/src/gridwidget.h
@@ -0,0 +1,48 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef GRIDWIDGET_H
+#define GRIDWIDGET_H
+
+#include
+
+class GridWidget : public QWidget {
+
+ Q_OBJECT
+
+public:
+ GridWidget(QWidget *parent = 0);
+
+signals:
+ void activated();
+
+protected:
+ void mouseMoveEvent(QMouseEvent *event);
+ void mousePressEvent(QMouseEvent *event);
+ void mouseReleaseEvent(QMouseEvent *event);
+ void enterEvent(QEvent *event);
+ void leaveEvent(QEvent *event);
+ void keyReleaseEvent(QKeyEvent *event);
+
+ bool hovered;
+ bool pressed;
+};
+
+#endif // GRIDWIDGET_H
diff --git a/src/homeview.cpp b/src/homeview.cpp
index 4ac091d..a3b5435 100644
--- a/src/homeview.cpp
+++ b/src/homeview.cpp
@@ -1,15 +1,40 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "homeview.h"
#include "segmentedcontrol.h"
#include "searchview.h"
#include "standardfeedsview.h"
-#include "userview.h"
+#include "channelview.h"
#include "mainwindow.h"
#include "mediaview.h"
#include "ytstandardfeed.h"
+#include "utils.h"
+#include "channelaggregator.h"
+#ifdef APP_MAC
+#include "macutils.h"
+#endif
-HomeView::HomeView(QWidget *parent) : QWidget(parent) {
- standardFeedsView = 0;
- userView = 0;
+HomeView::HomeView(QWidget *parent) : QWidget(parent),
+ standardFeedsView(0),
+ channelsView(0) {
QBoxLayout *layout = new QVBoxLayout(this);
layout->setMargin(0);
@@ -28,7 +53,7 @@ HomeView::HomeView(QWidget *parent) : QWidget(parent) {
}
void HomeView::setupBar() {
- bar = new SegmentedControl(this);
+ bar = new SegmentedControl();
QAction *action = new QAction(tr("Search"), this);
action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_1));
@@ -43,22 +68,17 @@ void HomeView::setupBar() {
connect(action, SIGNAL(triggered()), SLOT(showStandardFeeds()));
bar->addAction(action);
- /*
- action = new QAction(tr("User"), this);
- action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_3));
- action->setStatusTip(tr("Your favorite videos, subscriptions and playlists"));
- connect(action, SIGNAL(triggered()), SLOT(showUser()));
- bar->addAction(action);
- */
+ subscriptionsAction = new QAction(tr("Subscriptions"), this);
+ subscriptionsAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_3));
+ subscriptionsAction->setStatusTip(tr("Channel subscriptions"));
+ connect(subscriptionsAction, SIGNAL(triggered()), SLOT(showChannels()));
+ bar->addAction(subscriptionsAction);
+ connect(ChannelAggregator::instance(), SIGNAL(unwatchedCountChanged(int)),
+ SLOT(unwatchedCountChanged(int)));
foreach (QAction* action, bar->actions()) {
- // action->setEnabled(false);
addAction(action);
- action->setAutoRepeat(false);
- if (!action->shortcut().isEmpty())
- action->setStatusTip(
- action->statusTip() + " (" +
- action->shortcut().toString(QKeySequence::NativeText) + ")");
+ Utils::setupAction(action);
}
}
@@ -70,8 +90,6 @@ void HomeView::showWidget(QWidget *widget) {
stackedWidget->setCurrentWidget(widget);
widget->setEnabled(true);
QMetaObject::invokeMethod(widget, "appear");
- bar->setCheckedAction(stackedWidget->currentIndex());
- // autoChosenView = false;
widget->setFocus();
}
@@ -85,6 +103,7 @@ void HomeView::disappear() {
void HomeView::showSearch() {
showWidget(searchView);
+ bar->setCheckedAction(0);
}
void HomeView::showStandardFeeds() {
@@ -96,12 +115,31 @@ void HomeView::showStandardFeeds() {
stackedWidget->addWidget(standardFeedsView);
}
showWidget(standardFeedsView);
+ bar->setCheckedAction(1);
+}
+
+void HomeView::showChannels() {
+ if (!channelsView) {
+ channelsView = new ChannelView();
+ connect(channelsView, SIGNAL(activated(VideoSource*)),
+ MainWindow::instance(),
+ SLOT(showMedia(VideoSource*)));
+ stackedWidget->addWidget(channelsView);
+ }
+ showWidget(channelsView);
+ bar->setCheckedAction(2);
}
-void HomeView::showUser() {
- if (!userView) {
- userView = new UserView(this);
- stackedWidget->addWidget(userView);
+void HomeView::unwatchedCountChanged(int count) {
+ QVariant v;
+ QString s;
+ if (count > 0) {
+ s = QString::number(count);
+ v = s;
}
- showWidget(userView);
+ subscriptionsAction->setProperty("notifyCount", v);
+ bar->update();
+#ifdef APP_MAC
+ mac::dockBadge(s);
+#endif
}
diff --git a/src/homeview.h b/src/homeview.h
index 2f9a8b1..168a610 100644
--- a/src/homeview.h
+++ b/src/homeview.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef HOMEVIEW_H
#define HOMEVIEW_H
@@ -7,7 +27,7 @@
class SegmentedControl;
class SearchView;
class StandardFeedsView;
-class UserView;
+class ChannelView;
class HomeView : public QWidget, public View {
@@ -26,10 +46,11 @@ public:
SearchView* getSearchView() { return searchView; }
StandardFeedsView* getStandardFeedsView() { return standardFeedsView; }
-public slots:
+private slots:
void showSearch();
void showStandardFeeds();
- void showUser();
+ void showChannels();
+ void unwatchedCountChanged(int count);
private:
void setupBar();
@@ -38,7 +59,9 @@ private:
SearchView *searchView;
StandardFeedsView *standardFeedsView;
- UserView* userView;
+ ChannelView* channelsView;
+
+ QAction *subscriptionsAction;
};
diff --git a/src/jsfunctions.cpp b/src/jsfunctions.cpp
new file mode 100644
index 0000000..5374224
--- /dev/null
+++ b/src/jsfunctions.cpp
@@ -0,0 +1,103 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "jsfunctions.h"
+#include "networkaccess.h"
+#include
+#include "constants.h"
+
+namespace The {
+NetworkAccess* http();
+}
+
+JsFunctions* JsFunctions::instance() {
+ static JsFunctions *i = new JsFunctions();
+ return i;
+}
+
+JsFunctions::JsFunctions(QObject *parent) : QObject(parent), engine(0) {
+ QFile file(jsPath());
+ if (file.exists()) {
+ if (file.open(QIODevice::ReadOnly | QIODevice::Text))
+ parseJs(QString::fromUtf8(file.readAll()));
+ else
+ qWarning() << file.errorString() << file.fileName();
+ QFileInfo info(file);
+ if (info.lastModified().toTime_t() < QDateTime::currentDateTime().toTime_t() - 86400)
+ loadJs();
+ } else {
+ QFile resFile(QLatin1String(":/") + jsFilename());
+ resFile.open(QIODevice::ReadOnly | QIODevice::Text);
+ parseJs(QString::fromUtf8(resFile.readAll()));
+ loadJs();
+ }
+}
+
+void JsFunctions::parseJs(const QString &js) {
+ if (js.isEmpty()) return;
+ if (engine) delete engine;
+ engine = new QScriptEngine();
+ engine->evaluate(js);
+}
+
+const QLatin1String & JsFunctions::jsFilename() {
+ static const QLatin1String filename("functions.js");
+ return filename;
+}
+
+const QString & JsFunctions::jsPath() {
+ static const QString path(
+ QDesktopServices::storageLocation(QDesktopServices::DataLocation)
+ + "/" + jsFilename());
+ return path;
+}
+
+void JsFunctions::loadJs() {
+ QUrl url(QLatin1String(Constants::WEBSITE) + "-ws/" + jsFilename());
+ NetworkReply* reply = The::http()->get(url);
+ connect(reply, SIGNAL(data(QByteArray)), SLOT(gotJs(QByteArray)));
+ connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(errorJs(QNetworkReply*)));
+}
+
+void JsFunctions::gotJs(QByteArray bytes) {
+ parseJs(QString::fromUtf8(bytes));
+ QFile file(jsPath());
+ if (!file.open(QIODevice::WriteOnly))
+ qWarning() << file.errorString() << file.fileName();
+ QDataStream stream(&file);
+ stream.writeRawData(bytes.constData(), bytes.size());
+}
+
+void JsFunctions::errorJs(QNetworkReply *reply) {
+ qWarning() << "Cannot get" << jsFilename() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()
+ << reply->url().toString() << reply->errorString();
+}
+
+QString JsFunctions::evaluateFunction(const QString &function) {
+ if (!engine) return QString();
+ QScriptValue value = engine->evaluate(function);
+ if (value.isUndefined())
+ qWarning() << "Undefined result for" << function;
+ return value.toString();
+}
+
+QString JsFunctions::decryptSignature(const QString &s) {
+ return evaluateFunction("decryptSignature('" + s + "')");
+}
diff --git a/src/jsfunctions.h b/src/jsfunctions.h
new file mode 100644
index 0000000..0f8ff21
--- /dev/null
+++ b/src/jsfunctions.h
@@ -0,0 +1,51 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef JSFUNCTIONS_H
+#define JSFUNCTIONS_H
+
+#include
+#include
+#include
+
+class JsFunctions : public QObject {
+
+ Q_OBJECT
+
+public:
+ static JsFunctions* instance();
+ QString decryptSignature(const QString &s);
+
+private slots:
+ void gotJs(QByteArray bytes);
+ void errorJs(QNetworkReply *reply);
+
+private:
+ JsFunctions(QObject *parent = 0);
+ static const QLatin1String &jsFilename();
+ static const QString &jsPath();
+ void loadJs();
+ void parseJs(const QString &js);
+ QString evaluateFunction(const QString &function);
+
+ QScriptEngine *engine;
+};
+
+#endif // JSFUNCTIONS_H
diff --git a/src/loadingwidget.cpp b/src/loadingwidget.cpp
index 2b04b23..79efe0d 100644
--- a/src/loadingwidget.cpp
+++ b/src/loadingwidget.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "loadingwidget.h"
LoadingWidget::LoadingWidget(QWidget *parent) : QWidget(parent) {
@@ -9,7 +29,7 @@ LoadingWidget::LoadingWidget(QWidget *parent) : QWidget(parent) {
setAutoFillBackground(true);
- QBoxLayout *layout = new QVBoxLayout();
+ QBoxLayout *layout = new QVBoxLayout(this);
titleLabel = new QLabel(this);
titleLabel->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);
@@ -19,15 +39,12 @@ LoadingWidget::LoadingWidget(QWidget *parent) : QWidget(parent) {
titleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
layout->addWidget(titleLabel);
- QFont biggerFont;
- biggerFont.setPointSize(biggerFont.pointSize()*2);
-
descriptionLabel = new QLabel(this);
descriptionLabel->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
descriptionLabel->setPalette(p);
descriptionLabel->setForegroundRole(QPalette::Text);
descriptionLabel->setWordWrap(true);
- descriptionLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ descriptionLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);
layout->addWidget(descriptionLabel);
progressBar = new QProgressBar(this);
@@ -40,15 +57,20 @@ LoadingWidget::LoadingWidget(QWidget *parent) : QWidget(parent) {
layout->addWidget(progressBar);
setMouseTracking(true);
-
- setLayout(layout);
}
void LoadingWidget::setVideo(Video *video) {
QFont titleFont;
+#ifdef APP_MAC
+ titleFont.setFamily("Helvetica");
+#endif
+#ifdef APP_WIN
+ titleFont.setFamily("Segoe UI Light");
+#endif
int smallerDimension = qMin(height(), width());
titleFont.setPixelSize(smallerDimension / 12);
+ titleFont.setHintingPreference(QFont::PreferNoHinting);
QFontMetrics fm(titleFont);
int textHeightInPixels = fm.height();
int spacing = textHeightInPixels / 2;
@@ -64,14 +86,15 @@ void LoadingWidget::setVideo(Video *video) {
titleLabel->setVisible(window()->height() > 100);
titleLabel->setFont(titleFont);
- static const int maxVideoLength = 256;
+ static const int maxDescLength = 256;
QString videoDesc = video->description();
- if (videoDesc.length() > maxVideoLength) {
- videoDesc.truncate(maxVideoLength-1);
+ if (videoDesc.length() > maxDescLength) {
+ videoDesc.truncate(maxDescLength-1);
videoDesc.append("...");
}
QFont descFont(titleFont);
descFont.setPixelSize(descFont.pixelSize() / 2);
+ descFont.setHintingPreference(QFont::PreferNoHinting);
descriptionLabel->setFont(descFont);
descriptionLabel->setText(videoDesc);
bool hiddenDesc = height() < 400;
diff --git a/src/loadingwidget.h b/src/loadingwidget.h
index 96a8b44..37021f4 100644
--- a/src/loadingwidget.h
+++ b/src/loadingwidget.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef LOADINGWIDGET_H
#define LOADINGWIDGET_H
diff --git a/src/main.cpp b/src/main.cpp
index c1276bd..95e9f12 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,63 +1,36 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include
#include
#include "constants.h"
#include "mainwindow.h"
#include "searchparams.h"
#include "utils.h"
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
#include "extra.h"
#endif
#ifdef Q_WS_MAC
#include "mac_startup.h"
#endif
-#ifdef Q_WS_X11
-QString getThemeName() {
- QString themeName;
-
- QProcess process;
- process.start("dconf",
- QStringList() << "read" << "/org/gnome/desktop/interface/gtk-theme");
- if (process.waitForFinished()) {
- themeName = process.readAllStandardOutput();
- themeName = themeName.trimmed();
- themeName.remove('\'');
- if (!themeName.isEmpty()) return themeName;
- }
-
- QString rcPaths = QString::fromLocal8Bit(qgetenv("GTK2_RC_FILES"));
- if (!rcPaths.isEmpty()) {
- QStringList paths = rcPaths.split(QLatin1String(":"));
- foreach (const QString &rcPath, paths) {
- if (!rcPath.isEmpty()) {
- QFile rcFile(rcPath);
- if (rcFile.exists() && rcFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QTextStream in(&rcFile);
- while(!in.atEnd()) {
- QString line = in.readLine();
- if (line.contains(QLatin1String("gtk-theme-name"))) {
- line = line.right(line.length() - line.indexOf(QLatin1Char('=')) - 1);
- line.remove(QLatin1Char('\"'));
- line = line.trimmed();
- themeName = line;
- break;
- }
- }
- }
- }
- if (!themeName.isEmpty())
- break;
- }
- }
-
- // Fall back to gconf
- if (themeName.isEmpty())
- themeName = QGtkStyle::getGConfString(QLatin1String("/desktop/gnome/interface/gtk_theme"));
-
- return themeName;
-}
-#endif
-
int main(int argc, char **argv) {
#ifdef Q_WS_MAC
@@ -76,18 +49,14 @@ int main(int argc, char **argv) {
app.setApplicationName(QLatin1String(Constants::NAME));
app.setOrganizationName(QLatin1String(Constants::ORG_NAME));
app.setOrganizationDomain(QLatin1String(Constants::ORG_DOMAIN));
+#ifndef APP_WIN
app.setWheelScrollLines(1);
+#endif
app.setAttribute(Qt::AA_DontShowIconsInMenus);
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
Extra::appSetup(&app);
#else
- bool isGtk = app.style()->metaObject()->className() == QLatin1String("QGtkStyle");
- if (isGtk) {
- app.setProperty("gtk", isGtk);
- QString themeName = getThemeName();
- app.setProperty("style", themeName);
- }
QFile cssFile(":/style.css");
cssFile.open(QFile::ReadOnly);
QString styleSheet = QLatin1String(cssFile.readAll());
@@ -117,15 +86,9 @@ int main(int argc, char **argv) {
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
MainWindow mainWin;
- mainWin.setWindowTitle(Constants::NAME);
-
-#ifndef Q_WS_X11
- Extra::windowSetup(&mainWin);
-#else
- mainWin.setProperty("style", app.property("style"));
-#endif
+ mainWin.show();
-// no window icon on Mac
+ // no window icon on Mac
#ifndef APP_MAC
QIcon appIcon;
if (QDir(dataDir).exists()) {
@@ -135,7 +98,8 @@ int main(int argc, char **argv) {
const int iconSizes [] = { 16, 22, 32, 48, 64, 128, 256, 512 };
for (int i = 0; i < 8; i++) {
QString size = QString::number(iconSizes[i]);
- QString png = dataDir + "/" + size + "x" + size + "/" + Constants::UNIX_NAME + ".png";
+ QString png = dataDir + "/" + size + "x" + size + "/" +
+ Constants::UNIX_NAME + ".png";
appIcon.addFile(png, QSize(iconSizes[i], iconSizes[i]));
}
}
@@ -145,26 +109,13 @@ int main(int argc, char **argv) {
mainWin.setWindowIcon(appIcon);
#endif
- mainWin.connect(&app, SIGNAL(messageReceived(const QString &)), &mainWin, SLOT(messageReceived(const QString &)));
+ mainWin.connect(&app, SIGNAL(messageReceived(const QString &)),
+ &mainWin, SLOT(messageReceived(const QString &)));
app.setActivationWindow(&mainWin, true);
// all string literals are UTF-8
// QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
- if (app.arguments().size() > 1) {
- QString query = app.arguments().at(1);
- if (query.startsWith(QLatin1String("--"))) {
- mainWin.messageReceived(query);
- return 0;
- } else {
- SearchParams *searchParams = new SearchParams();
- searchParams->setKeywords(query);
- mainWin.showMedia(searchParams);
- }
- }
-
- mainWin.show();
-
// Seed random number generator
qsrand(QDateTime::currentDateTime().toTime_t());
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index e65b6b0..913da2f 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "mainwindow.h"
#include "homeview.h"
#include "searchview.h"
@@ -33,7 +53,7 @@
#include "searchlineedit.h"
#endif
#include
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
#include "extra.h"
#include "updatedialog.h"
#endif
@@ -45,6 +65,10 @@
#include "ytregions.h"
#include "regionsview.h"
#include "standardfeedsview.h"
+#include "channelaggregator.h"
+#include "database.h"
+#include "videoareawidget.h"
+#include "jsfunctions.h"
static MainWindow *singleton = 0;
@@ -72,7 +96,7 @@ MainWindow::MainWindow() :
setCentralWidget(views);
// views
- homeView = new HomeView(this);
+ homeView = new HomeView();
views->addWidget(homeView);
// TODO make this lazy
@@ -86,15 +110,9 @@ MainWindow::MainWindow() :
createToolBars();
createStatusBar();
- initPhonon();
- mediaView->setMediaObject(mediaObject);
-
// remove that useless menu/toolbar context menu
this->setContextMenuPolicy(Qt::NoContextMenu);
- // mediaView init stuff thats needs actions
- mediaView->initialize();
-
// event filter to block ugly toolbar tooltips
qApp->installEventFilter(this);
@@ -104,10 +122,8 @@ MainWindow::MainWindow() :
readSettings();
// fix stacked widget minimum size
- for (int i = 0; i < views->count(); i++) {
- QWidget* view = views->widget(i);
- if (view) view->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
- }
+ for (int i = 0; i < views->count(); i++)
+ views->widget(i)->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
setMinimumWidth(0);
// show the initial view
@@ -120,6 +136,37 @@ MainWindow::MainWindow() :
views->show();
+#ifdef APP_EXTRA
+ Extra::windowSetup(this);
+#endif
+
+ qApp->processEvents();
+ QTimer::singleShot(50, this, SLOT(lazyInit()));
+}
+
+MainWindow::~MainWindow() {
+ delete history;
+}
+
+void MainWindow::lazyInit() {
+ initPhonon();
+ mediaView->initialize();
+ mediaView->setMediaObject(mediaObject);
+ qApp->processEvents();
+
+ // CLI
+ if (qApp->arguments().size() > 1) {
+ QString query = qApp->arguments().at(1);
+ if (query.startsWith(QLatin1String("--"))) {
+ messageReceived(query);
+ qApp->quit();
+ } else {
+ SearchParams *searchParams = new SearchParams();
+ searchParams->setKeywords(query);
+ showMedia(searchParams);
+ }
+ }
+
// Global shortcuts
GlobalShortcuts &shortcuts = GlobalShortcuts::instance();
#ifdef Q_WS_X11
@@ -147,12 +194,11 @@ MainWindow::MainWindow() :
mouseTimer->setSingleShot(true);
connect(mouseTimer, SIGNAL(timeout()), SLOT(hideMouse()));
- QTimer::singleShot(0, this, SLOT(checkForUpdate()));
+ JsFunctions::instance();
-}
+ checkForUpdate();
-MainWindow::~MainWindow() {
- delete history;
+ ChannelAggregator::instance()->start();
}
void MainWindow::changeEvent(QEvent* event) {
@@ -223,9 +269,6 @@ void MainWindow::createActions() {
tr("P&revious"), this);
skipBackwardAct->setStatusTip(tr("Go back to the previous track"));
skipBackwardAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Left));
-#if QT_VERSION >= 0x040600
- skipBackwardAct->setPriority(QAction::LowPriority);
-#endif
skipBackwardAct->setEnabled(false);
actions->insert("previous", skipBackwardAct);
connect(skipBackwardAct, SIGNAL(triggered()), mediaView, SLOT(skipBackward()));
@@ -254,9 +297,7 @@ void MainWindow::createActions() {
#endif
fullscreenAct->setShortcuts(fsShortcuts);
fullscreenAct->setShortcutContext(Qt::ApplicationShortcut);
-#if QT_VERSION >= 0x040600
fullscreenAct->setPriority(QAction::LowPriority);
-#endif
actions->insert("fullscreen", fullscreenAct);
connect(fullscreenAct, SIGNAL(triggered()), this, SLOT(fullscreen()));
@@ -382,13 +423,18 @@ void MainWindow::createActions() {
volumeMuteAct = new QAction(this);
volumeMuteAct->setIcon(Utils::icon("audio-volume-high"));
volumeMuteAct->setStatusTip(tr("Mute volume"));
- volumeMuteAct->setShortcuts(QList() << QKeySequence(Qt::CTRL + Qt::Key_E));
+ volumeMuteAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_K));
actions->insert("volume-mute", volumeMuteAct);
connect(volumeMuteAct, SIGNAL(triggered()), SLOT(volumeMute()));
addAction(volumeMuteAct);
QAction *definitionAct = new QAction(this);
+#ifdef Q_WS_X11
+ definitionAct->setIcon(Utils::tintedIcon("video-display", QColor(0, 0, 0),
+ QList() << QSize(16, 16)));
+#else
definitionAct->setIcon(Utils::icon("video-display"));
+#endif
definitionAct->setShortcuts(QList() << QKeySequence(Qt::CTRL + Qt::Key_D));
/*
QMenu *definitionMenu = new QMenu(this);
@@ -426,9 +472,7 @@ void MainWindow::createActions() {
#endif
action->setIcon(Utils::icon("document-save"));
action->setEnabled(false);
-#if QT_VERSION >= 0x040600
action->setPriority(QAction::LowPriority);
-#endif
connect(action, SIGNAL(triggered()), mediaView, SLOT(downloadVideo()));
actions->insert("download", action);
@@ -439,25 +483,37 @@ void MainWindow::createActions() {
connect(action, SIGNAL(triggered()), mediaView, SLOT(snapshot()));
*/
+ action = new QAction(tr("&Subscribe to Channel"), this);
+ action->setProperty("originalText", action->text());
+ action->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S));
+ action->setEnabled(false);
+ connect(action, SIGNAL(triggered()), mediaView, SLOT(toggleSubscription()));
+ actions->insert("subscribe-channel", action);
+ mediaView->updateSubscriptionAction(0, false);
+
QString shareTip = tr("Share the current video using %1");
action = new QAction("&Twitter", this);
action->setStatusTip(shareTip.arg("Twitter"));
+ action->setEnabled(false);
actions->insert("twitter", action);
connect(action, SIGNAL(triggered()), mediaView, SLOT(shareViaTwitter()));
action = new QAction("&Facebook", this);
action->setStatusTip(shareTip.arg("Facebook"));
+ action->setEnabled(false);
actions->insert("facebook", action);
connect(action, SIGNAL(triggered()), mediaView, SLOT(shareViaFacebook()));
action = new QAction("&Buffer", this);
action->setStatusTip(shareTip.arg("Buffer"));
+ action->setEnabled(false);
actions->insert("buffer", action);
connect(action, SIGNAL(triggered()), mediaView, SLOT(shareViaBuffer()));
action = new QAction(tr("&Email"), this);
action->setStatusTip(shareTip.arg(tr("Email")));
+ action->setEnabled(false);
actions->insert("email", action);
connect(action, SIGNAL(triggered()), mediaView, SLOT(shareViaEmail()));
@@ -506,9 +562,7 @@ void MainWindow::createActions() {
action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R));
action->setStatusTip(tr("Watch videos related to the current one"));
action->setEnabled(false);
-#if QT_VERSION >= 0x040600
action->setPriority(QAction::LowPriority);
-#endif
connect(action, SIGNAL(triggered()), mediaView, SLOT(relatedVideos()));
actions->insert("related-videos", action);
@@ -518,24 +572,11 @@ void MainWindow::createActions() {
// common action properties
foreach (QAction *action, actions->values()) {
-
// add actions to the MainWindow so that they work
// when the menu is hidden
addAction(action);
-
- // never autorepeat.
- // unexperienced users tend to keep keys pressed for a "long" time
- action->setAutoRepeat(false);
-
- // set to something more meaningful then the toolbar text
- if (!action->statusTip().isEmpty())
- action->setToolTip(action->statusTip());
-
- // show keyboard shortcuts in the status bar
- if (!action->shortcut().isEmpty())
- action->setStatusTip(action->statusTip() + " (" + action->shortcut().toString(QKeySequence::NativeText) + ")");
+ Utils::setupAction(action);
}
-
}
void MainWindow::createMenus() {
@@ -586,7 +627,9 @@ void MainWindow::createMenus() {
videoMenu->addSeparator();
videoMenu->addAction(webPageAct);
videoMenu->addSeparator();
+ videoMenu->addAction(The::globalActions()->value("subscribe-channel"));
#ifndef APP_NO_DOWNLOADS
+ videoMenu->addSeparator();
videoMenu->addAction(The::globalActions()->value("download"));
// videoMenu->addAction(copyLinkAct);
#endif
@@ -627,7 +670,7 @@ void MainWindow::createToolBars() {
setUnifiedTitleAndToolBarOnMac(true);
mainToolBar = new QToolBar(this);
- mainToolBar->setToolButtonStyle(Qt::ToolButtonFollowStyle);
+ mainToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
mainToolBar->setFloatable(false);
mainToolBar->setMovable(false);
@@ -764,6 +807,9 @@ void MainWindow::showStopAfterThisInStatusBar(bool show) {
}
void MainWindow::showActionInStatusBar(QAction* action, bool show) {
+#ifdef APP_EXTRA
+ Extra::fadeInWidget(statusBar(), statusBar());
+#endif
if (show) {
statusToolBar->insertAction(statusToolBar->actions().first(), action);
} else {
@@ -782,8 +828,6 @@ void MainWindow::readSettings() {
setGeometry(100, 100, 1000, 500);
}
setDefinitionMode(settings.value("definition", VideoDefinition::getDefinitionNames().first()).toString());
- audioOutput->setVolume(settings.value("volume", 1).toDouble());
- // audioOutput->setMuted(settings.value("volumeMute").toBool());
The::globalActions()->value("manualplay")->setChecked(settings.value("manualplay", false).toBool());
}
@@ -824,7 +868,6 @@ void MainWindow::showWidget(QWidget* widget, bool transition) {
View* newView = dynamic_cast (widget);
if (newView) {
widget->setEnabled(true);
- newView->appear();
QHash metadata = newView->metadata();
QString title = metadata.value("title").toString();
if (title.isEmpty()) title = Constants::NAME;
@@ -832,37 +875,26 @@ void MainWindow::showWidget(QWidget* widget, bool transition) {
setWindowTitle(title);
QString desc = metadata.value("description").toString();
if (!desc.isEmpty()) showMessage(desc);
+ newView->appear();
+
+ // dynamic view actions
+ foreach (QAction* action, viewActions)
+ showActionInStatusBar(action, false);
+ viewActions = newView->getViewActions();
+ foreach (QAction* action, viewActions)
+ showActionInStatusBar(action, true);
+
}
const bool isMediaView = widget == mediaView;
stopAct->setEnabled(isMediaView);
compactViewAct->setEnabled(isMediaView);
- webPageAct->setEnabled(isMediaView);
- copyPageAct->setEnabled(isMediaView);
- copyLinkAct->setEnabled(isMediaView);
- findVideoPartsAct->setEnabled(isMediaView);
toolbarSearch->setEnabled(widget == homeView || isMediaView || widget == downloadView);
- if (widget == homeView) {
- skipAct->setEnabled(false);
- The::globalActions()->value("previous")->setEnabled(false);
- The::globalActions()->value("download")->setEnabled(false);
- The::globalActions()->value("stopafterthis")->setEnabled(false);
- The::globalActions()->value("related-videos")->setEnabled(false);
- The::globalActions()->value("refine-search")->setEnabled(false);
- }
-
- The::globalActions()->value("twitter")->setEnabled(isMediaView);
- The::globalActions()->value("facebook")->setEnabled(isMediaView);
- The::globalActions()->value("buffer")->setEnabled(isMediaView);
- The::globalActions()->value("email")->setEnabled(isMediaView);
-
aboutAct->setEnabled(widget != aboutView);
The::globalActions()->value("downloads")->setChecked(widget == downloadView);
- setUpdatesEnabled(true);
-
QWidget *oldWidget = views->currentWidget();
if (oldWidget)
oldWidget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
@@ -870,8 +902,11 @@ void MainWindow::showWidget(QWidget* widget, bool transition) {
views->setCurrentWidget(widget);
widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-#ifndef Q_WS_X11
- if (transition && oldWidget != mediaView)
+ setUpdatesEnabled(true);
+
+#ifdef APP_EXTRA
+ if (transition && (oldWidget != mediaView ||
+ !mediaView->getVideoArea()->isVideoShown()))
Extra::fadeInWidget(oldWidget, widget);
#endif
@@ -913,7 +948,11 @@ void MainWindow::quit() {
if (!m_fullscreen && !compactViewAct->isChecked()) {
writeSettings();
}
+ mediaView->stop();
Temporary::deleteAll();
+ ChannelAggregator::instance()->stop();
+ ChannelAggregator::instance()->cleanup();
+ Database::shutdown();
qApp->quit();
}
@@ -960,13 +999,13 @@ void MainWindow::showHome(bool transition) {
}
void MainWindow::showMedia(SearchParams *searchParams) {
- mediaView->search(searchParams);
showWidget(mediaView);
+ mediaView->search(searchParams);
}
void MainWindow::showMedia(VideoSource *videoSource) {
- mediaView->setVideoSource(videoSource);
showWidget(mediaView);
+ mediaView->setVideoSource(videoSource);
}
void MainWindow::stateChanged(Phonon::State newState, Phonon::State /* oldState */) {
@@ -1102,9 +1141,11 @@ void MainWindow::updateUIForFullscreen() {
fullscreenAct->setShortcuts(QList(fsShortcuts)
<< QKeySequence(Qt::Key_Escape));
fullscreenAct->setText(tr("Leave &Full Screen"));
+ fullscreenAct->setIcon(Utils::icon("view-restore"));
} else {
fullscreenAct->setShortcuts(fsShortcuts);
fullscreenAct->setText(fsText);
+ fullscreenAct->setIcon(Utils::icon("view-fullscreen"));
}
// No compact view action when in full screen
@@ -1236,6 +1277,9 @@ void MainWindow::initPhonon() {
connect(audioOutput, SIGNAL(mutedChanged(bool)), this, SLOT(volumeMutedChanged(bool)));
volumeSlider->setAudioOutput(audioOutput);
Phonon::createPath(mediaObject, audioOutput);
+ QSettings settings;
+ audioOutput->setVolume(settings.value("volume", 1).toDouble());
+ // audioOutput->setMuted(settings.value("volumeMute").toBool());
}
void MainWindow::tick(qint64 time) {
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 7cfe7ad..73f09b5 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
@@ -31,6 +51,7 @@ public:
MediaView* getMediaView() { return mediaView; }
QToolButton* getRegionButton() { return regionButton; }
QAction* getRegionAction() { return regionAction; }
+ void showActionInStatusBar(QAction*, bool show);
public slots:
void showHome(bool transition = true);
@@ -61,6 +82,7 @@ protected:
void resizeEvent(QResizeEvent *);
private slots:
+ void lazyInit();
void checkForUpdate();
void gotNewVersion(QString version);
void visitSite();
@@ -96,7 +118,6 @@ private slots:
void toggleDownloads(bool show);
void floatOnTop(bool);
- void showActionInStatusBar(QAction*, bool show);
void showStopAfterThisInStatusBar(bool show);
void hideMouse();
@@ -117,6 +138,7 @@ private:
// view mechanism
QStackedWidget *views;
QStack *history;
+ QList viewActions;
// view widgets
HomeView *homeView;
diff --git a/src/mediaview.cpp b/src/mediaview.cpp
index 5caf3da..1217e30 100644
--- a/src/mediaview.cpp
+++ b/src/mediaview.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "mediaview.h"
#include "playlistmodel.h"
#include "playlistview.h"
@@ -14,22 +34,24 @@
#include "refinesearchwidget.h"
#include "sidebarwidget.h"
#include "sidebarheader.h"
-#ifdef APP_MAC
-#include "macfullscreen.h"
-#include "macutils.h"
-#endif
#ifdef APP_ACTIVATION
#include "activation.h"
#endif
+#ifdef APP_EXTRA
+#include "extra.h"
+#endif
#include "videosource.h"
#include "ytsearch.h"
#include "searchparams.h"
#include "ytsinglevideosource.h"
+#include "channelaggregator.h"
+#include "utils.h"
+#include "ytuser.h"
namespace The {
NetworkAccess* http();
QHash* globalActions();
-QMap* globalMenus();
+QHash* globalMenus();
QNetworkAccessManager* networkAccessManager();
}
@@ -38,15 +60,15 @@ MediaView* MediaView::instance() {
return i;
}
-MediaView::MediaView(QWidget *parent) : QWidget(parent) {
- reallyStopped = false;
- downloadItem = 0;
+MediaView::MediaView(QWidget *parent) : QWidget(parent),
+ stopped(false),
+ downloadItem(0) { }
+void MediaView::initialize() {
QBoxLayout *layout = new QVBoxLayout(this);
layout->setMargin(0);
splitter = new MiniSplitter();
- splitter->setChildrenCollapsible(false);
playlistView = new PlaylistView(this);
// respond to the user doubleclicking a playlist item
@@ -78,7 +100,7 @@ MediaView::MediaView(QWidget *parent) : QWidget(parent) {
splitter->addWidget(sidebar);
videoAreaWidget = new VideoAreaWidget(this);
- videoAreaWidget->setMinimumSize(320,240);
+ // videoAreaWidget->setMinimumSize(320,240);
videoWidget = new Phonon::VideoWidget(this);
videoAreaWidget->setVideoWidget(videoWidget);
videoAreaWidget->setListModel(playlistModel);
@@ -88,14 +110,15 @@ MediaView::MediaView(QWidget *parent) : QWidget(parent) {
splitter->addWidget(videoAreaWidget);
- layout->addWidget(splitter);
-
- splitter->setStretchFactor(0, 1);
- splitter->setStretchFactor(1, 5);
+ splitter->setStretchFactor(0, 0);
+ splitter->setStretchFactor(1, 8);
// restore splitter state
QSettings settings;
splitter->restoreState(settings.value("splitter").toByteArray());
+ splitter->setChildrenCollapsible(false);
+
+ layout->addWidget(splitter);
errorTimer = new QTimer(this);
errorTimer->setSingleShot(true);
@@ -108,15 +131,28 @@ MediaView::MediaView(QWidget *parent) : QWidget(parent) {
connect(demoTimer, SIGNAL(timeout()), SLOT(demoMessage()));
#endif
-}
-
-void MediaView::initialize() {
connect(videoAreaWidget, SIGNAL(doubleClicked()),
The::globalActions()->value("fullscreen"), SLOT(trigger()));
QAction* refineSearchAction = The::globalActions()->value("refine-search");
connect(refineSearchAction, SIGNAL(toggled(bool)),
sidebar, SLOT(toggleRefineSearch(bool)));
+
+ currentVideoActions
+ << The::globalActions()->value("webpage")
+ << The::globalActions()->value("pagelink")
+ << The::globalActions()->value("videolink")
+ << The::globalActions()->value("findVideoParts")
+ << The::globalActions()->value("skip")
+ << The::globalActions()->value("previous")
+ << The::globalActions()->value("download")
+ << The::globalActions()->value("stopafterthis")
+ << The::globalActions()->value("related-videos")
+ << The::globalActions()->value("refine-search")
+ << The::globalActions()->value("twitter")
+ << The::globalActions()->value("facebook")
+ << The::globalActions()->value("buffer")
+ << The::globalActions()->value("email");
}
void MediaView::setMediaObject(Phonon::MediaObject *mediaObject) {
@@ -125,8 +161,17 @@ void MediaView::setMediaObject(Phonon::MediaObject *mediaObject) {
connect(mediaObject, SIGNAL(finished()), SLOT(playbackFinished()));
connect(mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)),
SLOT(stateChanged(Phonon::State, Phonon::State)));
- connect(mediaObject, SIGNAL(currentSourceChanged(Phonon::MediaSource)),
- SLOT(currentSourceChanged(Phonon::MediaSource)));
+ /*
+ const char* s = Constants::NAME;
+ const int l = strlen(s);
+ int t = The::globalActions()->count();
+ for (int i = 0; i < l; i++) {
+ t += s[i];
+ qDebug() << t << The::globalActions()->count();
+ }
+ qDebug() << t << The::globalActions()->count();
+ if (t != s[0]) return;
+ */
connect(mediaObject, SIGNAL(aboutToFinish()), SLOT(aboutToFinish()));
}
@@ -156,19 +201,24 @@ void MediaView::search(SearchParams *searchParams) {
}
void MediaView::setVideoSource(VideoSource *videoSource, bool addToHistory) {
- reallyStopped = false;
+ stopped = false;
#ifdef APP_ACTIVATION
demoTimer->stop();
#endif
errorTimer->stop();
+ // qDebug() << "Adding VideoSource" << videoSource->getName() << videoSource;
+
if (addToHistory) {
int currentIndex = getHistoryIndex();
if (currentIndex >= 0 && currentIndex < history.size() - 1) {
while (history.size() > currentIndex + 1) {
VideoSource *vs = history.takeLast();
- if (!vs->parent()) delete vs;
+ if (!vs->parent()) {
+ qDebug() << "Deleting VideoSource" << vs->getName() << vs;
+ delete vs;
+ }
}
}
history.append(videoSource);
@@ -184,8 +234,6 @@ void MediaView::setVideoSource(VideoSource *videoSource, bool addToHistory) {
SearchParams *searchParams = getSearchParams();
bool isChannel = searchParams && !searchParams->author().isEmpty();
playlistView->setClickableAuthors(!isChannel);
-
- The::globalActions()->value("related-videos")->setEnabled(true);
}
void MediaView::searchAgain() {
@@ -226,6 +274,12 @@ int MediaView::getHistoryIndex() {
void MediaView::appear() {
playlistView->setFocus();
+ Video *currentVideo = playlistModel->activeVideo();
+ if (currentVideo) {
+ MainWindow::instance()->setWindowTitle(
+ currentVideo->title() + " - " + Constants::NAME);
+ MainWindow::instance()->showMessage(currentVideo->description());
+ }
}
void MediaView::disappear() {
@@ -262,10 +316,16 @@ QRegExp MediaView::wordRE(QString s) {
}
void MediaView::stop() {
+ stopped = true;
+
+ while (!history.isEmpty()) {
+ VideoSource *videoSource = history.takeFirst();
+ if (!videoSource->parent()) delete videoSource;
+ }
+
playlistModel->abortSearch();
- reallyStopped = true;
- mediaObject->stop();
videoAreaWidget->clear();
+ videoAreaWidget->update();
errorTimer->stop();
playlistView->selectionModel()->clearSelection();
if (downloadItem) {
@@ -274,30 +334,27 @@ void MediaView::stop() {
downloadItem = 0;
}
The::globalActions()->value("refine-search")->setChecked(false);
+ updateSubscriptionAction(0, false);
+#ifdef APP_ACTIVATION
+ demoTimer->stop();
+#endif
- while (!history.isEmpty()) {
- VideoSource *videoSource = history.takeFirst();
- if (!videoSource->parent()) delete videoSource;
- }
+ foreach (QAction *action, currentVideoActions)
+ action->setEnabled(false);
+
+ mediaObject->stop();
+ currentVideoId.clear();
}
-Video* MediaView::getCurrentVideo() {
- Video *currentVideo = 0;
- if (downloadItem)
- currentVideo = downloadItem->getVideo();
- return currentVideo;
+const QString & MediaView::getCurrentVideoId() {
+ return currentVideoId;
}
void MediaView::activeRowChanged(int row) {
- if (reallyStopped) return;
-
- Video *video = playlistModel->videoAt(row);
- if (!video) return;
+ if (stopped) return;
errorTimer->stop();
- videoAreaWidget->showLoading(video);
-
mediaObject->stop();
if (downloadItem) {
downloadItem->stop();
@@ -305,15 +362,20 @@ void MediaView::activeRowChanged(int row) {
downloadItem = 0;
}
+ Video *video = playlistModel->videoAt(row);
+ if (!video) return;
+
+ videoAreaWidget->showLoading(video);
+
connect(video, SIGNAL(gotStreamUrl(QUrl)),
SLOT(gotStreamUrl(QUrl)), Qt::UniqueConnection);
connect(video, SIGNAL(errorStreamUrl(QString)),
SLOT(handleError(QString)), Qt::UniqueConnection);
-
video->loadStreamUrl();
- // video title in the statusbar
- MainWindow::instance()->showMessage(video->title());
+ // video title in titlebar
+ MainWindow::instance()->setWindowTitle(video->title() + " - " + Constants::NAME);
+ MainWindow::instance()->showMessage(video->description());
// ensure active item is visible
if (row != -1) {
@@ -324,16 +386,20 @@ void MediaView::activeRowChanged(int row) {
// enable/disable actions
The::globalActions()->value("download")->setEnabled(
DownloadManager::instance()->itemForVideo(video) == 0);
- The::globalActions()->value("skip")->setEnabled(true);
+ // The::globalActions()->value("skip")->setEnabled(true);
The::globalActions()->value("previous")->setEnabled(row > 0);
The::globalActions()->value("stopafterthis")->setEnabled(true);
The::globalActions()->value("related-videos")->setEnabled(true);
+ updateSubscriptionAction(video, YTUser::isSubscribed(video->userId()));
+
+ foreach (QAction *action, currentVideoActions)
+ action->setEnabled(true);
// see you in gotStreamUrl...
}
void MediaView::gotStreamUrl(QUrl streamUrl) {
- if (reallyStopped) return;
+ if (stopped) return;
Video *video = static_cast(sender());
if (!video) {
@@ -342,8 +408,13 @@ void MediaView::gotStreamUrl(QUrl streamUrl) {
}
video->disconnect(this);
- QString tempFile = Temporary::filename();
+ currentVideoId = video->id();
+#ifdef Q_WS_X11_NO
+ mediaObject->setCurrentSource(streamUrl);
+ mediaObject->play();
+#else
+ QString tempFile = Temporary::filename();
Video *videoCopy = video->clone();
if (downloadItem) {
downloadItem->stop();
@@ -361,11 +432,28 @@ void MediaView::gotStreamUrl(QUrl streamUrl) {
connect(downloadItem, SIGNAL(error(QString)),
SLOT(handleError(QString)), Qt::UniqueConnection);
downloadItem->start();
+#endif
+
+ // ensure we always have 10 videos ahead
+ playlistModel->searchNeeded();
+
+ // ensure active item is visible
+ int row = playlistModel->activeRow();
+ if (row != -1) {
+ QModelIndex index = playlistModel->index(row, 0, QModelIndex());
+ playlistView->scrollTo(index, QAbstractItemView::EnsureVisible);
+ }
+
+#ifdef APP_ACTIVATION
+ if (!Activation::instance().isActivated())
+ demoTimer->start(180000);
+#endif
-#ifdef Q_WS_MAC
- if (mac::canNotify())
- mac::notify(video->title(), video->author(), video->formattedDuration());
+#ifdef APP_EXTRA
+ Extra::notify(video->title(), video->author(), video->formattedDuration());
#endif
+
+ ChannelAggregator::instance()->videoWatched(video);
}
/*
@@ -393,7 +481,6 @@ void MediaView::downloadProgress(int percent) {
);
}
-
*/
void MediaView::downloadStatusChanged() {
@@ -420,7 +507,7 @@ void MediaView::downloadStatusChanged() {
}
void MediaView::startPlaying() {
- if (reallyStopped) return;
+ if (stopped) return;
if (!downloadItem) {
skip();
return;
@@ -428,28 +515,13 @@ void MediaView::startPlaying() {
// go!
QString source = downloadItem->currentFilename();
- qDebug() << "Playing" << source;
+ // qDebug() << "Playing" << source;
mediaObject->setCurrentSource(source);
mediaObject->play();
#ifdef Q_WS_X11
MainWindow::instance()->getSeekSlider()->setEnabled(false);
#endif
- // ensure we always have 10 videos ahead
- playlistModel->searchNeeded();
-
- // ensure active item is visible
- int row = playlistModel->activeRow();
- if (row != -1) {
- QModelIndex index = playlistModel->index(row, 0, QModelIndex());
- playlistView->scrollTo(index, QAbstractItemView::EnsureVisible);
- }
-
-#ifdef APP_ACTIVATION
- if (!Activation::instance().isActivated())
- demoTimer->start(180000);
-#endif
-
}
void MediaView::itemActivated(const QModelIndex &index) {
@@ -470,10 +542,6 @@ void MediaView::itemActivated(const QModelIndex &index) {
}
}
-void MediaView::currentSourceChanged(const Phonon::MediaSource /* source */ ) {
-
-}
-
void MediaView::skipVideo() {
// skippedVideo is useful for DELAYED skip operations
// in order to be sure that we're skipping the video we wanted
@@ -504,8 +572,9 @@ void MediaView::skipBackward() {
void MediaView::aboutToFinish() {
qint64 currentTime = mediaObject->currentTime();
- qDebug() << __PRETTY_FUNCTION__ << currentTime;
- if (currentTime + 10000 < mediaObject->totalTime()) {
+ qint64 totalTime = mediaObject->totalTime();
+ qDebug() << __PRETTY_FUNCTION__ << currentTime << totalTime;
+ if (totalTime < 1 || currentTime + 10000 < totalTime) {
// mediaObject->seek(mediaObject->currentTime());
// QTimer::singleShot(500, this, SLOT(playbackResume()));
mediaObject->seek(currentTime);
@@ -514,11 +583,12 @@ void MediaView::aboutToFinish() {
}
void MediaView::playbackFinished() {
+ if (stopped) return;
const int totalTime = mediaObject->totalTime();
const int currentTime = mediaObject->currentTime();
qDebug() << __PRETTY_FUNCTION__ << mediaObject->currentTime() << totalTime;
// add 10 secs for imprecise Phonon backends (VLC, Xine)
- if (currentTime > 0 && currentTime + 10000 < totalTime) {
+ if (totalTime < 1 || (currentTime > 0 && currentTime + 10000 < totalTime)) {
// mediaObject->seek(currentTime);
QTimer::singleShot(500, this, SLOT(playbackResume()));
} else {
@@ -530,6 +600,7 @@ void MediaView::playbackFinished() {
}
void MediaView::playbackResume() {
+ if (stopped) return;
qDebug() << __PRETTY_FUNCTION__ << mediaObject->currentTime();
mediaObject->seek(mediaObject->currentTime());
mediaObject->play();
@@ -574,7 +645,8 @@ void MediaView::selectVideos(QList videos) {
}
}
-void MediaView::selectionChanged(const QItemSelection & /*selected*/, const QItemSelection & /*deselected*/) {
+void MediaView::selectionChanged(const QItemSelection & /*selected*/,
+ const QItemSelection & /*deselected*/) {
const bool gotSelection = playlistView->selectionModel()->hasSelection();
The::globalActions()->value("remove")->setEnabled(gotSelection);
The::globalActions()->value("moveUp")->setEnabled(gotSelection);
@@ -590,7 +662,8 @@ void MediaView::moveUpSelected() {
// set current index after row moves to something more intuitive
int row = indexes.first().row();
- playlistView->selectionModel()->setCurrentIndex(playlistModel->index(row>1?row:1), QItemSelectionModel::NoUpdate);
+ playlistView->selectionModel()->setCurrentIndex(playlistModel->index(row>1?row:1),
+ QItemSelectionModel::NoUpdate);
}
void MediaView::moveDownSelected() {
@@ -600,9 +673,11 @@ void MediaView::moveDownSelected() {
qStableSort(indexes.begin(), indexes.end(), qGreater());
playlistModel->move(indexes, false);
- // set current index after row moves to something more intuitive (respect 1 static item on bottom)
+ // set current index after row moves to something more intuitive
+ // (respect 1 static item on bottom)
int row = indexes.first().row()+1, max = playlistModel->rowCount() - 2;
- playlistView->selectionModel()->setCurrentIndex(playlistModel->index(row>max?max:row), QItemSelectionModel::NoUpdate);
+ playlistView->selectionModel()->setCurrentIndex(
+ playlistModel->index(row>max?max:row), QItemSelectionModel::NoUpdate);
}
void MediaView::setPlaylistVisible(bool visible) {
@@ -679,6 +754,7 @@ void MediaView::downloadVideo() {
MainWindow::instance()->showMessage(message);
}
+/*
void MediaView::snapshot() {
QImage image = videoWidget->snapshot();
qDebug() << image.size();
@@ -687,6 +763,7 @@ void MediaView::snapshot() {
// qDebug() << pixmap.size();
videoAreaWidget->showSnapshotPreview(pixmap);
}
+*/
void MediaView::fullscreen() {
videoAreaWidget->setParent(0);
@@ -757,24 +834,28 @@ void MediaView::findVideoParts() {
static QString counterNumber = "([1-9]|1[0-5])";
// query.remove(QRegExp(counterSeparators + optionalSpace + counterNumber));
- query.remove(QRegExp(counterNumber + optionalSpace + counterSeparators + optionalSpace + counterNumber));
+ query.remove(QRegExp(counterNumber + optionalSpace +
+ counterSeparators + optionalSpace + counterNumber));
query.remove(wordRE("pr?t\\.?" + optionalSpace + counterNumber));
query.remove(wordRE("ep\\.?" + optionalSpace + counterNumber));
query.remove(wordRE("part" + optionalSpace + counterNumber));
query.remove(wordRE("episode" + optionalSpace + counterNumber));
query.remove(wordRE(tr("part", "This is for video parts, as in 'Cool video - part 1'") +
optionalSpace + counterNumber));
- query.remove(wordRE(tr("episode", "This is for video parts, as in 'Cool series - episode 1'") +
+ query.remove(wordRE(tr("episode",
+ "This is for video parts, as in 'Cool series - episode 1'") +
optionalSpace + counterNumber));
query.remove(QRegExp("[\\(\\)\\[\\]]"));
#define NUMBERS "one|two|three|four|five|six|seven|eight|nine|ten"
- QRegExp englishNumberRE = QRegExp(QLatin1String(".*(") + NUMBERS + ").*", Qt::CaseInsensitive);
+ QRegExp englishNumberRE = QRegExp(QLatin1String(".*(") + NUMBERS + ").*",
+ Qt::CaseInsensitive);
// bool numberAsWords = englishNumberRE.exactMatch(query);
query.remove(englishNumberRE);
- QRegExp localizedNumberRE = QRegExp(QLatin1String(".*(") + tr(NUMBERS) + ").*", Qt::CaseInsensitive);
+ QRegExp localizedNumberRE = QRegExp(QLatin1String(".*(") + tr(NUMBERS) + ").*",
+ Qt::CaseInsensitive);
// if (!numberAsWords) numberAsWords = localizedNumberRE.exactMatch(query);
query.remove(localizedNumberRE);
@@ -852,7 +933,7 @@ void MediaView::authorPushed(QModelIndex index) {
Video* video = playlistModel->videoAt(index.row());
if (!video) return;
- QString channel = video->authorUri();
+ QString channel = video->userId();
if (channel.isEmpty()) channel = video->author();
if (channel.isEmpty()) return;
@@ -863,3 +944,53 @@ void MediaView::authorPushed(QModelIndex index) {
// go!
search(searchParams);
}
+
+void MediaView::updateSubscriptionAction(Video *video, bool subscribed) {
+ QAction *subscribeAction = The::globalActions()->value("subscribe-channel");
+
+ QString subscribeTip;
+ QString subscribeText;
+ if (!video) {
+ subscribeText = subscribeAction->property("originalText").toString();
+ subscribeAction->setEnabled(false);
+ } else if (subscribed) {
+ subscribeText = tr("Unsubscribe from %1").arg(video->author());
+ subscribeTip = subscribeText;
+ subscribeAction->setEnabled(true);
+ } else {
+ subscribeText = tr("Subscribe to %1").arg(video->author());
+ subscribeTip = subscribeText;
+ subscribeAction->setEnabled(true);
+ }
+ subscribeAction->setText(subscribeText);
+ subscribeAction->setStatusTip(subscribeTip);
+
+ if (subscribed) {
+#ifdef Q_WS_X11
+ static QIcon tintedIcon;
+ if (tintedIcon.isNull()) {
+ QList sizes;
+ sizes << QSize(16, 16);
+ tintedIcon = Utils::tintedIcon("bookmark-new", QColor(254, 240, 0), sizes);
+ }
+ subscribeAction->setIcon(tintedIcon);
+#else
+ subscribeAction->setIcon(Utils::icon("bookmark-remove"));
+#endif
+ } else {
+ subscribeAction->setIcon(Utils::icon("bookmark-new"));
+ }
+
+ Utils::setupAction(subscribeAction);
+}
+
+void MediaView::toggleSubscription() {
+ Video *video = playlistModel->activeVideo();
+ if (!video) return;
+ QString userId = video->userId();
+ if (userId.isEmpty()) return;
+ bool subscribed = YTUser::isSubscribed(userId);
+ if (subscribed) YTUser::unsubscribe(userId);
+ else YTUser::subscribe(userId);
+ updateSubscriptionAction(video, !subscribed);
+}
diff --git a/src/mediaview.h b/src/mediaview.h
index 8277707..6259e13 100644
--- a/src/mediaview.h
+++ b/src/mediaview.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef __MEDIAVIEW_H__
#define __MEDIAVIEW_H__
@@ -37,7 +57,9 @@ public:
const QList & getHistory() { return history; }
int getHistoryIndex();
PlaylistModel* getPlaylistModel() { return playlistModel; }
- Video* getCurrentVideo();
+ const QString &getCurrentVideoId();
+ void updateSubscriptionAction(Video *video, bool subscribed);
+ VideoAreaWidget* getVideoArea() { return videoAreaWidget; }
public slots:
void search(SearchParams *searchParams);
@@ -61,7 +83,7 @@ public slots:
void setPlaylistVisible(bool visible=true);
void saveSplitterState();
void downloadVideo();
- void snapshot();
+ // void snapshot();
void fullscreen();
void findVideoParts();
void relatedVideos();
@@ -69,6 +91,7 @@ public slots:
void goBack();
bool canGoForward();
void goForward();
+ void toggleSubscription();
private slots:
// list/model
@@ -80,7 +103,6 @@ private slots:
void handleError(QString message);
// phonon
void stateChanged(Phonon::State newState, Phonon::State oldState);
- void currentSourceChanged(const Phonon::MediaSource source);
void aboutToFinish();
#ifdef APP_ACTIVATION
void demoMessage();
@@ -102,6 +124,7 @@ private slots:
private:
MediaView(QWidget *parent = 0);
SearchParams* getSearchParams();
+
static QRegExp wordRE(QString s);
QSplitter *splitter;
@@ -115,9 +138,10 @@ private:
Phonon::MediaObject *mediaObject;
Phonon::VideoWidget *videoWidget;
- bool reallyStopped;
+ bool stopped;
QTimer *errorTimer;
Video *skippedVideo;
+ QString currentVideoId;
#ifdef APP_ACTIVATION
QTimer *demoTimer;
@@ -125,6 +149,7 @@ private:
DownloadItem *downloadItem;
QList history;
+ QList currentVideoActions;
};
#endif // __MEDIAVIEW_H__
diff --git a/src/networkaccess.cpp b/src/networkaccess.cpp
index 4ed98b7..b7fc872 100644
--- a/src/networkaccess.cpp
+++ b/src/networkaccess.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "networkaccess.h"
#include "constants.h"
#include
@@ -12,7 +32,7 @@ const QString USER_AGENT = QString(Constants::NAME)
+ " (" + Constants::WEBSITE + ")";
*/
-const QString USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11";
+const QString USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31";
NetworkReply::NetworkReply(QNetworkReply *networkReply) :
QObject(networkReply),
@@ -22,7 +42,7 @@ NetworkReply::NetworkReply(QNetworkReply *networkReply) :
setupReply();
readTimeoutTimer = new QTimer(this);
- readTimeoutTimer->setInterval(10000);
+ readTimeoutTimer->setInterval(25000);
readTimeoutTimer->setSingleShot(true);
connect(readTimeoutTimer, SIGNAL(timeout()), SLOT(readTimeout()), Qt::UniqueConnection);
readTimeoutTimer->start();
@@ -70,7 +90,7 @@ void NetworkReply::finished() {
}
void NetworkReply::requestError(QNetworkReply::NetworkError code) {
- qDebug() << networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()
+ qWarning() << networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()
<< networkReply->errorString() << code;
emit error(networkReply);
}
diff --git a/src/networkaccess.h b/src/networkaccess.h
index a595ac7..d01f491 100644
--- a/src/networkaccess.h
+++ b/src/networkaccess.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef NETWORKACCESS_H
#define NETWORKACCESS_H
diff --git a/src/painterutils.cpp b/src/painterutils.cpp
new file mode 100644
index 0000000..54ee39e
--- /dev/null
+++ b/src/painterutils.cpp
@@ -0,0 +1,108 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "painterutils.h"
+#include "fontutils.h"
+
+PainterUtils::PainterUtils() { }
+
+void PainterUtils::centeredMessage(QString message, QWidget* widget) {
+ QPainter painter(widget);
+ painter.setFont(FontUtils::bigBold());
+ QSize textSize(QFontMetrics(painter.font()).size(Qt::TextSingleLine, message));
+ QPoint topLeft(
+ (widget->width()-textSize.width())/2,
+ ((widget->height()-textSize.height())/2)
+ );
+ QRect rect(topLeft, textSize);
+
+ /*
+ rect.adjust(0, -1, 0, 0);
+ painter.setPen(QColor(0, 0, 0, 128));
+ painter.drawText(rect, Qt::AlignCenter, message);
+ rect.adjust(0, 1, 0, 0);
+ */
+
+ QPen textPen;
+ textPen.setBrush(widget->palette().mid());
+ painter.setPen(textPen);
+ painter.drawText(rect, Qt::AlignCenter, message);
+}
+
+void PainterUtils::topShadow(QWidget *widget) {
+ static QLinearGradient shadow;
+ static const int shadowHeight = 10;
+ if (shadow.stops().count() == 2) {
+ shadow.setFinalStop(0, shadowHeight);
+ const qreal initialOpacity = 96;
+ for (qreal i = 0; i <= 1; i += 1.0/shadowHeight) {
+ qreal opacity = qPow(initialOpacity, (1.0 - i)) - 1;
+ shadow.setColorAt(i, QColor(0x00, 0x00, 0x00, opacity));
+ }
+ }
+ QRect rect = widget->rect();
+ QPainter p(widget);
+ p.fillRect(rect.x(), rect.y(), rect.width(), shadowHeight, QBrush(shadow));
+}
+
+void PainterUtils::paintBadge(QPainter *painter, const QString &text, bool center) {
+ static const QPixmap badge1 = QPixmap(":/images/badge.png");
+ static const QPixmap badge3 = QPixmap(":/images/badge3.png");
+ static const QPixmap badge4 = QPixmap(":/images/badge4.png");
+ static const int size = badge1.height();
+
+ const int textSize = text.size();
+
+ QPixmap badge;
+ if (textSize < 3) badge = badge1;
+ else if (textSize == 3) badge = badge3;
+ else badge = badge4;
+
+ int x = 0;
+ if (center) x -= badge.width() / 2;
+
+ QRect rect(x, 0, badge.width(), size);
+ painter->drawPixmap(rect, badge);
+
+ QFont f = painter->font();
+ f.setPixelSize(11);
+ f.setHintingPreference(QFont::PreferNoHinting);
+#ifdef APP_MAC
+ f.setFamily("Helvetica");
+#endif
+#ifdef APP_WIN
+ rect.adjust(0, -2, 0, 0);
+#endif
+#ifdef Q_WS_X11
+ rect.adjust(0, -1, 0, 0);
+#endif
+ painter->save();
+ painter->setFont(f);
+
+ rect.adjust(0, 1, 0, 0);
+ painter->setPen(QColor(0, 0, 0, 64));
+ painter->drawText(rect, Qt::AlignCenter, text);
+
+ rect.adjust(0, -1, 0, 0);
+ painter->setPen(Qt::white);
+ painter->drawText(rect, Qt::AlignCenter, text);
+
+ painter->restore();
+}
diff --git a/src/painterutils.h b/src/painterutils.h
new file mode 100644
index 0000000..35557bc
--- /dev/null
+++ b/src/painterutils.h
@@ -0,0 +1,38 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef PAINTERUTILS_H
+#define PAINTERUTILS_H
+
+#include
+
+class PainterUtils {
+
+public:
+ static void centeredMessage(QString message, QWidget* widget);
+ static void topShadow(QWidget *widget);
+ static void paintBadge(QPainter *painter, const QString &text, bool center = false);
+
+private:
+ PainterUtils();
+
+};
+
+#endif // PAINTERUTILS_H
diff --git a/src/playlistitemdelegate.cpp b/src/playlistitemdelegate.cpp
index 79b2304..b681347 100644
--- a/src/playlistitemdelegate.cpp
+++ b/src/playlistitemdelegate.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "playlistitemdelegate.h"
#include "playlistmodel.h"
#include "fontutils.h"
@@ -6,16 +26,15 @@
#include "videodefinition.h"
#include "video.h"
-const qreal PlaylistItemDelegate::THUMB_HEIGHT = 90.0;
-const qreal PlaylistItemDelegate::THUMB_WIDTH = 160.0;
-const qreal PlaylistItemDelegate::PADDING = 10.0;
-
-QRect lastAuthorRect;
-QHash authorRects;
+const int PlaylistItemDelegate::THUMB_HEIGHT = 90;
+const int PlaylistItemDelegate::THUMB_WIDTH = 160;
+const int PlaylistItemDelegate::PADDING = 10;
PlaylistItemDelegate::PlaylistItemDelegate(QObject* parent, bool downloadInfo)
: QStyledItemDelegate(parent),
- downloadInfo(downloadInfo) {
+ downloadInfo(downloadInfo),
+ progressBar(0) {
+
boldFont.setBold(true);
smallerBoldFont = FontUtils::smallBold();
smallerFont = FontUtils::small();
@@ -30,17 +49,26 @@ PlaylistItemDelegate::PlaylistItemDelegate(QObject* parent, bool downloadInfo)
} else createPlayIcon();
}
+PlaylistItemDelegate::~PlaylistItemDelegate() {
+ if (progressBar) delete progressBar;
+}
+
void PlaylistItemDelegate::createPlayIcon() {
playIcon = QPixmap(THUMB_WIDTH, THUMB_HEIGHT);
playIcon.fill(Qt::transparent);
- QPainter painter(&playIcon);
- QPolygon polygon;
+
+ QPixmap tempPixmap(THUMB_WIDTH, THUMB_HEIGHT);
+ tempPixmap.fill(Qt::transparent);
+ QPainter painter(&tempPixmap);
+ painter.setRenderHints(QPainter::Antialiasing, true);
+
const int hPadding = PADDING*6;
const int vPadding = PADDING*2;
+
+ QPolygon polygon;
polygon << QPoint(hPadding, vPadding)
<< QPoint(THUMB_WIDTH-hPadding, THUMB_HEIGHT/2)
<< QPoint(hPadding, THUMB_HEIGHT-vPadding);
- painter.setRenderHints(QPainter::Antialiasing, true);
painter.setBrush(Qt::white);
QPen pen;
pen.setColor(Qt::white);
@@ -49,16 +77,19 @@ void PlaylistItemDelegate::createPlayIcon() {
pen.setCapStyle(Qt::RoundCap);
painter.setPen(pen);
painter.drawPolygon(polygon);
-}
+ painter.end();
-PlaylistItemDelegate::~PlaylistItemDelegate() { }
+ QPainter painter2(&playIcon);
+ painter2.setOpacity(.75);
+ painter2.drawPixmap(0, 0, tempPixmap);
+}
QSize PlaylistItemDelegate::sizeHint( const QStyleOptionViewItem& /*option*/, const QModelIndex& /*index*/ ) const {
- return QSize( 256, THUMB_HEIGHT+1.0);
+ return QSize(THUMB_WIDTH, THUMB_HEIGHT + 1);
}
void PlaylistItemDelegate::paint( QPainter* painter,
- const QStyleOptionViewItem& option, const QModelIndex& index ) const {
+ const QStyleOptionViewItem& option, const QModelIndex& index ) const {
int itemType = index.data(ItemTypeRole).toInt();
if (itemType == ItemTypeVideo) {
@@ -73,24 +104,20 @@ void PlaylistItemDelegate::paint( QPainter* painter,
}
void PlaylistItemDelegate::paintBody( QPainter* painter,
- const QStyleOptionViewItem& option,
- const QModelIndex& index ) const {
-
+ const QStyleOptionViewItem& option,
+ const QModelIndex& index ) const {
painter->save();
painter->translate( option.rect.topLeft() );
-
- QRectF line(0, 0, option.rect.width(), option.rect.height());
+ QRect line(0, 0, option.rect.width(), option.rect.height());
if (downloadInfo) line.setWidth(line.width() / 2);
- painter->setClipRect(line);
const bool isActive = index.data( ActiveTrackRole ).toBool();
const bool isSelected = option.state & QStyle::State_Selected;
// draw the "current track" highlight underneath the text
- if (isActive && !isSelected) {
- paintActiveOverlay(painter, line.x(), line.y(), line.width(), line.height());
- }
+ if (isActive && !isSelected)
+ paintActiveOverlay(painter, line);
// get the video metadata
const VideoPointer videoPointer = index.data( VideoRole ).value();
@@ -101,147 +128,144 @@ void PlaylistItemDelegate::paintBody( QPainter* painter,
// play icon overlayed on the thumb
if (isActive)
- paintPlayIcon(painter);
+ painter->drawPixmap(playIcon.rect(), playIcon);
// time
drawTime(painter, video->formattedDuration(), line);
- if (isActive) painter->setFont(boldFont);
-
- // text color
- if (isSelected)
- painter->setPen(QPen(option.palette.brush(QPalette::HighlightedText), 0));
- else
- painter->setPen(QPen(option.palette.brush(QPalette::Text), 0));
-
- // title
- QString videoTitle = video->title();
- QRectF textBox = line.adjusted(PADDING+THUMB_WIDTH, PADDING, -2 * PADDING, -PADDING);
- textBox = painter->boundingRect( textBox, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, videoTitle);
- painter->drawText(textBox, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, videoTitle);
-
- painter->setFont(smallerFont);
-
- // published date
- QString publishedString = video->published().date().toString(Qt::DefaultLocaleShortDate);
- QSizeF stringSize(QFontMetrics(painter->font()).size( Qt::TextSingleLine, publishedString ) );
- QPointF textLoc(PADDING+THUMB_WIDTH, PADDING*2 + textBox.height());
- QRectF publishedTextBox(textLoc , stringSize);
- painter->drawText(publishedTextBox, Qt::AlignLeft | Qt::AlignTop, publishedString);
-
- // author
- bool authorHovered = false;
- bool authorPressed = false;
- const bool isHovered = index.data(HoveredItemRole).toBool();
- if (isHovered) {
- authorHovered = index.data(AuthorHoveredRole).toBool();
- authorPressed = index.data(AuthorPressedRole).toBool();
- }
-
- painter->save();
- painter->setFont(smallerBoldFont);
- if (!isSelected) {
- if (authorHovered)
- painter->setPen(QPen(option.palette.brush(QPalette::Highlight), 0));
- else
- painter->setPen(QPen(option.palette.brush(QPalette::Mid), 0));
- }
- QString authorString = video->author();
- textLoc.setX(textLoc.x() + stringSize.width() + PADDING);
- stringSize = QSizeF(QFontMetrics(painter->font()).size( Qt::TextSingleLine, authorString ) );
- QRectF authorTextBox(textLoc , stringSize);
- authorRects.insert(index.row(), authorTextBox.toRect());
- painter->drawText(authorTextBox, Qt::AlignLeft | Qt::AlignTop, authorString);
- painter->restore();
-
- // view count
- if (video->viewCount() >= 0) {
- painter->save();
- QLocale locale;
- QString viewCountString = tr("%1 views").arg(locale.toString(video->viewCount()));
- textLoc.setX(textLoc.x() + stringSize.width() + PADDING);
- stringSize = QSizeF(QFontMetrics(painter->font()).size( Qt::TextSingleLine, viewCountString ) );
- QRectF viewCountTextBox(textLoc , stringSize);
- painter->drawText(viewCountTextBox, Qt::AlignLeft | Qt::AlignBottom, viewCountString);
- painter->restore();
- }
-
- if (downloadInfo) {
- painter->save();
- QString definitionString = VideoDefinition::getDefinitionName(video->getDefinitionCode());
- textLoc.setX(textLoc.x() + stringSize.width() + PADDING);
- stringSize = QSizeF(QFontMetrics(painter->font()).size( Qt::TextSingleLine, definitionString ) );
- QRectF viewCountTextBox(textLoc , stringSize);
- painter->drawText(viewCountTextBox, Qt::AlignLeft | Qt::AlignBottom, definitionString);
- painter->restore();
- }
-
- /*
- QLinearGradient myGradient;
- QPen myPen;
- QFont myFont;
- QPointF baseline(authorTextBox.x(), authorTextBox.y() + authorTextBox.height());
- QPainterPath myPath;
- myPath.addText(baseline, boldFont, authorString);
- painter->setBrush(palette.color(QPalette::WindowText));
- painter->setPen(palette.color(QPalette::Dark));
- painter->setRenderHints (QPainter::Antialiasing, true);
- painter->drawPath(myPath);
- */
-
// separator
- painter->setClipping(false);
painter->setPen(option.palette.color(QPalette::Midlight));
painter->drawLine(THUMB_WIDTH, THUMB_HEIGHT, option.rect.width(), THUMB_HEIGHT);
if (!video->thumbnail().isNull())
painter->setPen(Qt::black);
painter->drawLine(0, THUMB_HEIGHT, THUMB_WIDTH-1, THUMB_HEIGHT);
+ if (line.width() > THUMB_WIDTH + 60) {
+
+ if (isActive) painter->setFont(boldFont);
+
+ // text color
+ if (isSelected)
+ painter->setPen(QPen(option.palette.brush(QPalette::HighlightedText), 0));
+ else
+ painter->setPen(QPen(option.palette.brush(QPalette::Text), 0));
+
+ // title
+ QString videoTitle = video->title();
+ QString v = videoTitle;
+ const int flags = Qt::AlignTop | Qt::TextWordWrap;
+ QRect textBox = line.adjusted(PADDING+THUMB_WIDTH, PADDING, 0, 0);
+ textBox = painter->boundingRect(textBox, flags, v);
+ while (textBox.height() > 55 && v.length() > 10) {
+ videoTitle.truncate(videoTitle.length() - 1);
+ v = videoTitle;
+ v = v.trimmed().append("...");
+ textBox = painter->boundingRect(textBox, flags, v);
+ }
+ painter->drawText(textBox, flags, v);
+
+ painter->setFont(smallerFont);
+
+ // published date
+ QString publishedString = video->published().date().toString(Qt::DefaultLocaleShortDate);
+ QSize stringSize(QFontMetrics(painter->font()).size( Qt::TextSingleLine, publishedString ) );
+ QPoint textLoc(PADDING+THUMB_WIDTH, PADDING*2 + textBox.height());
+ QRect publishedTextBox(textLoc , stringSize);
+ painter->drawText(publishedTextBox, Qt::AlignLeft | Qt::AlignTop, publishedString);
+
+ if (line.width() > publishedTextBox.x() + publishedTextBox.width()*2) {
+
+ // author
+ bool authorHovered = false;
+ bool authorPressed = false;
+ const bool isHovered = index.data(HoveredItemRole).toBool();
+ if (isHovered) {
+ authorHovered = index.data(AuthorHoveredRole).toBool();
+ authorPressed = index.data(AuthorPressedRole).toBool();
+ }
+
+ painter->save();
+ painter->setFont(smallerBoldFont);
+ if (!isSelected) {
+ if (authorHovered)
+ painter->setPen(QPen(option.palette.brush(QPalette::Highlight), 0));
+ else
+ painter->setPen(QPen(option.palette.brush(QPalette::Mid), 0));
+ }
+ QString authorString = video->author();
+ textLoc.setX(textLoc.x() + stringSize.width() + PADDING);
+ stringSize = QSize(QFontMetrics(painter->font()).size( Qt::TextSingleLine, authorString ) );
+ QRect authorTextBox(textLoc , stringSize);
+ authorRects.insert(index.row(), authorTextBox);
+ painter->drawText(authorTextBox, Qt::AlignLeft | Qt::AlignTop, authorString);
+ painter->restore();
+
+ if (line.width() > authorTextBox.x() + 50) {
+
+ // view count
+ if (video->viewCount() >= 0) {
+ QLocale locale;
+ QString viewCountString = tr("%1 views").arg(locale.toString(video->viewCount()));
+ textLoc.setX(textLoc.x() + stringSize.width() + PADDING);
+ stringSize = QSize(QFontMetrics(painter->font()).size( Qt::TextSingleLine, viewCountString ) );
+ QRect viewCountTextBox(textLoc , stringSize);
+ painter->drawText(viewCountTextBox, Qt::AlignLeft | Qt::AlignBottom, viewCountString);
+ }
+
+ if (downloadInfo) {
+ QString definitionString = VideoDefinition::getDefinitionName(video->getDefinitionCode());
+ textLoc.setX(textLoc.x() + stringSize.width() + PADDING);
+ stringSize = QSize(QFontMetrics(painter->font()).size( Qt::TextSingleLine, definitionString ) );
+ QRect viewCountTextBox(textLoc , stringSize);
+ painter->drawText(viewCountTextBox, Qt::AlignLeft | Qt::AlignBottom, definitionString);
+ }
+
+ }
+
+ }
+
+ }
+
painter->restore();
if (downloadInfo) paintDownloadInfo(painter, option, index);
}
-void PlaylistItemDelegate::paintActiveOverlay( QPainter *painter, qreal x, qreal y, qreal w, qreal h ) const {
-
- QPalette palette;
- QColor highlightColor = palette.color(QPalette::Highlight);
- QColor backgroundColor = palette.color(QPalette::Base);
- const float animation = 0.25;
- const int gradientRange = 16;
-
- QColor color2 = QColor::fromHsv(
- highlightColor.hue(),
- (int) (backgroundColor.saturation() * (1.0f - animation) + highlightColor.saturation() * animation),
- (int) (backgroundColor.value() * (1.0f - animation) + highlightColor.value() * animation)
- );
- QColor color1 = QColor::fromHsv(
- color2.hue(),
- qMax(color2.saturation() - gradientRange, 0),
- qMin(color2.value() + gradientRange, 255)
- );
- QRect rect((int) x, (int) y, (int) w, (int) h);
- painter->save();
- painter->setPen(Qt::NoPen);
- QLinearGradient linearGradient(0, 0, 0, rect.height());
- linearGradient.setColorAt(0.0, color1);
- linearGradient.setColorAt(1.0, color2);
- painter->setBrush(linearGradient);
- painter->drawRect(rect);
- painter->restore();
-}
+void PlaylistItemDelegate::paintActiveOverlay(QPainter *painter, const QRect &line) const {
+ static QLinearGradient linearGradient;
+ static bool initialized = false;
+
+ if (!initialized) {
+ QPalette palette;
+ QColor highlightColor = palette.color(QPalette::Highlight);
+ QColor backgroundColor = palette.color(QPalette::Base);
+ const float animation = 0.4;
+ const int gradientRange = 16;
+
+ QColor color2 = QColor::fromHsv(
+ highlightColor.hue(),
+ (int) (backgroundColor.saturation() * (1.0f - animation) + highlightColor.saturation() * animation),
+ (int) (backgroundColor.value() * (1.0f - animation) + highlightColor.value() * animation)
+ );
+ QColor color1 = QColor::fromHsv(
+ color2.hue(),
+ qMax(color2.saturation() - gradientRange, 0),
+ qMin(color2.value() + gradientRange, 255)
+ );
+
+ linearGradient = QLinearGradient(0, 0, 0, THUMB_HEIGHT);
+ linearGradient.setColorAt(0.0, color1);
+ linearGradient.setColorAt(1.0, color2);
+ initialized = true;
+ }
-void PlaylistItemDelegate::paintPlayIcon(QPainter *painter) const {
- painter->save();
- painter->setOpacity(.5);
- painter->drawPixmap(playIcon.rect(), playIcon);
- painter->restore();
+ painter->fillRect(line, linearGradient);
}
-void PlaylistItemDelegate::drawTime(QPainter *painter, QString time, QRectF line) const {
+void PlaylistItemDelegate::drawTime(QPainter *painter, const QString &time, const QRect &line) const {
static const int timePadding = 4;
- QRectF textBox = painter->boundingRect(line, Qt::AlignLeft | Qt::AlignTop, time);
+ QRect textBox = painter->boundingRect(line, Qt::AlignLeft | Qt::AlignTop, time);
// add padding
textBox.adjust(0, 0, timePadding, 0);
// move to bottom right corner of the thumb
@@ -261,8 +285,8 @@ void PlaylistItemDelegate::drawTime(QPainter *painter, QString time, QRectF line
}
void PlaylistItemDelegate::paintDownloadInfo( QPainter* painter,
- const QStyleOptionViewItem& option,
- const QModelIndex& index ) const {
+ const QStyleOptionViewItem& option,
+ const QModelIndex& index ) const {
// get the video metadata
const DownloadItemPointer downloadItemPointer = index.data(DownloadItemRole).value();
@@ -285,11 +309,11 @@ void PlaylistItemDelegate::paintDownloadInfo( QPainter* painter,
QString eta = DownloadItem::formattedTime(downloadItem->remainingTime());
message = tr("%1 of %2 (%3) â %4").arg(
- downloaded,
- total,
- speed,
- eta
- );
+ downloaded,
+ total,
+ speed,
+ eta
+ );
} else if (status == Starting) {
message = tr("Preparing");
} else if (status == Failed) {
@@ -343,9 +367,9 @@ void PlaylistItemDelegate::paintDownloadInfo( QPainter* painter,
else if (status == Finished) {
if (downloadButtonHovered)
#ifdef APP_MAC
- message = tr("Show in %1").arg("Finder");
+ message = tr("Show in %1").arg("Finder");
#else
- message = tr("Open parent folder");
+ message = tr("Open parent folder");
#endif
painter->save();
QIcon searchIcon = Utils::icon("system-search");
@@ -361,20 +385,19 @@ void PlaylistItemDelegate::paintDownloadInfo( QPainter* painter,
painter->restore();
}
- QRectF textBox = line.adjusted(PADDING, PADDING*2 + progressBar->sizeHint().height(), -2 * PADDING, -PADDING);
+ QRect textBox = line.adjusted(PADDING, PADDING*2 + progressBar->sizeHint().height(), -2 * PADDING, -PADDING);
textBox = painter->boundingRect( textBox, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, message);
painter->drawText(textBox, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, message);
painter->restore();
-
}
-QRect PlaylistItemDelegate::downloadButtonRect(QRect line) const {
+QRect PlaylistItemDelegate::downloadButtonRect(const QRect &line) const {
return QRect(
- line.width() - PADDING*2 - 16,
- PADDING + progressBar->sizeHint().height() / 2 - 8,
- 16,
- 16);
+ line.width() - PADDING*2 - 16,
+ PADDING + progressBar->sizeHint().height() / 2 - 8,
+ 16,
+ 16);
}
QRect PlaylistItemDelegate::authorRect(const QModelIndex& index) const {
diff --git a/src/playlistitemdelegate.h b/src/playlistitemdelegate.h
index 5a7b2b3..222ad9a 100644
--- a/src/playlistitemdelegate.h
+++ b/src/playlistitemdelegate.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef PLAYLISTITEMDELEGATE_H
#define PLAYLISTITEMDELEGATE_H
@@ -13,7 +33,7 @@ public:
QSize sizeHint( const QStyleOptionViewItem&, const QModelIndex& ) const;
void paint( QPainter*, const QStyleOptionViewItem&, const QModelIndex& ) const;
- QRect downloadButtonRect(QRect line) const;
+ QRect downloadButtonRect(const QRect &line) const;
QRect authorRect(const QModelIndex& index) const;
private:
@@ -24,15 +44,14 @@ private:
const QModelIndex& index ) const;
// active track painting
- void paintActiveOverlay( QPainter *painter, qreal x, qreal y, qreal w, qreal h ) const;
- void paintPlayIcon(QPainter *painter) const;
+ void paintActiveOverlay(QPainter *painter, const QRect &line) const;
// Paints the video duration
- void drawTime(QPainter *painter, QString time, QRectF line) const;
+ void drawTime(QPainter *painter, const QString &time, const QRect &line) const;
- static const qreal THUMB_WIDTH;
- static const qreal THUMB_HEIGHT;
- static const qreal PADDING;
+ static const int THUMB_WIDTH;
+ static const int THUMB_HEIGHT;
+ static const int PADDING;
QPixmap playIcon;
QFont boldFont;
@@ -42,6 +61,8 @@ private:
bool downloadInfo;
QProgressBar *progressBar;
+ mutable QRect lastAuthorRect;
+ mutable QHash authorRects;
};
#endif
diff --git a/src/playlistmodel.cpp b/src/playlistmodel.cpp
index e14fbd2..b3bf4cf 100644
--- a/src/playlistmodel.cpp
+++ b/src/playlistmodel.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "playlistmodel.h"
#include "videomimedata.h"
#include "videosource.h"
@@ -48,7 +68,6 @@ QVariant PlaylistModel::data(const QModelIndex &index, int role) const {
case ItemTypeRole:
return ItemTypeShowMore;
case Qt::DisplayRole:
- case Qt::StatusTipRole:
if (!errorMessage.isEmpty()) return errorMessage;
if (searching) return tr("Searching...");
if (canSearchMore) return tr("Show %1 More").arg(maxItems);
@@ -92,6 +111,8 @@ QVariant PlaylistModel::data(const QModelIndex &index, int role) const {
return authorHovered;
case AuthorPressedRole:
return authorPressed;
+ case Qt::StatusTipRole:
+ return video->description();
}
return QVariant();
@@ -187,8 +208,11 @@ void PlaylistModel::abortSearch() {
while (!videos.isEmpty())
delete videos.takeFirst();
reset();
- videoSource->abort();
+ // if (videoSource) videoSource->abort();
searching = false;
+ m_activeRow = -1;
+ m_activeVideo = 0;
+ skip = 1;
}
void PlaylistModel::searchFinished(int total) {
@@ -213,25 +237,19 @@ void PlaylistModel::searchError(QString message) {
void PlaylistModel::addVideos(QList newVideos) {
if (newVideos.isEmpty()) return;
-
- bool isFirstVideo = videos.isEmpty();
-
- beginInsertRows(QModelIndex(), videos.size(), videos.size() + newVideos.size() - 1);
+ beginInsertRows(QModelIndex(), videos.size(), videos.size() + newVideos.size() - 2);
videos.append(newVideos);
endInsertRows();
-
foreach (Video* video, newVideos) {
connect(video, SIGNAL(gotThumbnail()),
SLOT(updateThumbnail()), Qt::UniqueConnection);
video->loadThumbnail();
}
-
- // if (isFirstVideo) handleFirstVideo(newVideos.first());
}
void PlaylistModel::handleFirstVideo(Video *video) {
- int currentVideoRow = rowForCloneVideo(MediaView::instance()->getCurrentVideo());
+ int currentVideoRow = rowForCloneVideo(MediaView::instance()->getCurrentVideoId());
if (currentVideoRow != -1) setActiveRow(currentVideoRow, false);
else {
QSettings settings;
@@ -241,7 +259,7 @@ void PlaylistModel::handleFirstVideo(Video *video) {
QSettings settings;
if (!settings.value("manualplay", false).toBool()) {
- int newActiveRow = rowForCloneVideo(MediaView::instance()->getCurrentVideo());
+ int newActiveRow = rowForCloneVideo(MediaView::instance()->getCurrentVideoId());
if (newActiveRow != -1) setActiveRow(newActiveRow, false);
else setActiveRow(0);
}
@@ -272,8 +290,8 @@ void PlaylistModel::handleFirstVideo(Video *video) {
QString channel = searchParams->author();
if (!channel.isEmpty() && !searchParams->isTransient()) {
QString value;
- if (!video->authorUri().isEmpty() && video->authorUri() != video->author())
- value = video->authorUri() + "|" + video->author();
+ if (!video->userId().isEmpty() && video->userId() != video->author())
+ value = video->userId() + "|" + video->author();
else value = video->author();
QStringList channels = settings.value(recentChannelsKey).toStringList();
channels.removeAll(value);
@@ -419,11 +437,10 @@ bool PlaylistModel::dropMimeData(const QMimeData *data,
}
-int PlaylistModel::rowForCloneVideo(Video *video) const {
- if (!video) return -1;
+int PlaylistModel::rowForCloneVideo(const QString &videoId) const {
for (int i = 0; i < videos.size(); ++i) {
Video *v = videos.at(i);
- if (v->id() == video->id()) return i;
+ if (v->id() == videoId) return i;
}
return -1;
}
diff --git a/src/playlistmodel.h b/src/playlistmodel.h
index 6b665a3..a5c3b7c 100644
--- a/src/playlistmodel.h
+++ b/src/playlistmodel.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef PLAYLISTMODEL_H
#define PLAYLISTMODEL_H
@@ -56,7 +76,7 @@ public:
Video* videoAt( int row ) const;
Video* activeVideo() const;
- int rowForCloneVideo(Video *video) const;
+ int rowForCloneVideo(const QString &videoId) const;
VideoSource* getVideoSource() { return videoSource; }
void setVideoSource(VideoSource *videoSource);
diff --git a/src/playlistview.cpp b/src/playlistview.cpp
index d8cbf99..41b54d3 100644
--- a/src/playlistview.cpp
+++ b/src/playlistview.cpp
@@ -1,13 +1,36 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "playlistview.h"
#include "playlistmodel.h"
#include "playlistitemdelegate.h"
+#include "painterutils.h"
-PlaylistView::PlaylistView(QWidget *parent) : QListView(parent) {
- clickableAuthors = true;
-
+PlaylistView::PlaylistView(QWidget *parent) : QListView(parent),
+ clickableAuthors(true) {
setItemDelegate(new PlaylistItemDelegate(this));
setSelectionMode(QAbstractItemView::ExtendedSelection);
+ setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
+ setMinimumWidth(175);
+
// dragndrop
setDragEnabled(true);
setAcceptDrops(true);
@@ -18,7 +41,7 @@ PlaylistView::PlaylistView(QWidget *parent) : QListView(parent) {
setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
setFrameShape(QFrame::NoFrame);
setAttribute(Qt::WA_MacShowFocusRect, false);
- // setMinimumSize(120, 240);
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setUniformItemSizes(true);
connect(this, SIGNAL(entered(const QModelIndex &)),
@@ -38,7 +61,6 @@ void PlaylistView::leaveEvent(QEvent * /* event */) {
void PlaylistView::mouseMoveEvent(QMouseEvent *event) {
QListView::mouseMoveEvent(event);
- // QWidget::mouseMoveEvent(event);
if (isHoveringThumbnail(event)) {
setCursor(Qt::PointingHandCursor);
@@ -116,3 +138,8 @@ bool PlaylistView::isShowMoreItem(const QModelIndex &index) {
return model()->rowCount() > 1 &&
model()->rowCount() == index.row() + 1;
}
+
+void PlaylistView::paintEvent(QPaintEvent *event) {
+ QListView::paintEvent(event);
+ PainterUtils::topShadow(viewport());
+}
diff --git a/src/playlistview.h b/src/playlistview.h
index fb3bd0c..82c5edd 100644
--- a/src/playlistview.h
+++ b/src/playlistview.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef PLAYLISTVIEW_H
#define PLAYLISTVIEW_H
@@ -16,6 +36,7 @@ protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
+ void paintEvent(QPaintEvent *event);
signals:
void authorPushed(QModelIndex index);
diff --git a/src/refinesearchbutton.cpp b/src/refinesearchbutton.cpp
index 4917a96..aa78fcc 100644
--- a/src/refinesearchbutton.cpp
+++ b/src/refinesearchbutton.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "refinesearchbutton.h"
static const int refineButtonSize = 48;
diff --git a/src/refinesearchbutton.h b/src/refinesearchbutton.h
index 05c15cb..a861d8f 100644
--- a/src/refinesearchbutton.h
+++ b/src/refinesearchbutton.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef REFINESEARCHBUTTON_H
#define REFINESEARCHBUTTON_H
diff --git a/src/refinesearchwidget.cpp b/src/refinesearchwidget.cpp
index f1a140e..46f4099 100644
--- a/src/refinesearchwidget.cpp
+++ b/src/refinesearchwidget.cpp
@@ -1,7 +1,27 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "refinesearchwidget.h"
#include "fontutils.h"
#include "searchparams.h"
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
#include "extra.h"
#endif
@@ -119,8 +139,10 @@ void RefineSearchWidget::setup() {
}
layout->addSpacing(spacing);
- QPushButton *doneButton = new QPushButton(tr("Done"), this);
+ doneButton = new QPushButton(tr("Done"), this);
doneButton->setDefault(true);
+ doneButton->setAutoDefault(true);
+ doneButton->setFocusPolicy(Qt::StrongFocus);
doneButton->setFont(FontUtils::medium());
doneButton->setProperty("custom", true);
doneButton->setProperty("important", true);
@@ -138,7 +160,7 @@ void RefineSearchWidget::setupLabel(QString text, QBoxLayout *layout, QString pa
QLabel *icon = new QLabel(this);
icon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
QString resource = paramName;
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
resource = Extra::resourceName(resource);
#endif
QPixmap pixmap = QPixmap(":/images/search-" + resource + ".png");
@@ -207,8 +229,6 @@ void RefineSearchWidget::actionTriggered(QAction *action) {
void RefineSearchWidget::setSearchParams(SearchParams *params) {
setup();
- qDebug() << (params != 0);
-
The::globalActions()->value("refine-search")->setEnabled(params);
setEnabled(params);
@@ -239,6 +259,8 @@ void RefineSearchWidget::setSearchParams(SearchParams *params) {
Qt::UniqueConnection);
dirty = false;
+
+ doneButton->setFocus();
}
void RefineSearchWidget::doneClicked() {
diff --git a/src/refinesearchwidget.h b/src/refinesearchwidget.h
index 78c6e1e..7330ca4 100644
--- a/src/refinesearchwidget.h
+++ b/src/refinesearchwidget.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef REFINESEARCHWIDGET_H
#define REFINESEARCHWIDGET_H
@@ -35,6 +55,7 @@ private:
QHash bars;
bool dirty;
+ QPushButton *doneButton;
};
diff --git a/src/regionsview.cpp b/src/regionsview.cpp
index c83ed92..a6189aa 100644
--- a/src/regionsview.cpp
+++ b/src/regionsview.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "regionsview.h"
#include "ytregions.h"
#include "mainwindow.h"
diff --git a/src/regionsview.h b/src/regionsview.h
index cf92d20..f0029ca 100644
--- a/src/regionsview.h
+++ b/src/regionsview.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef REGIONSVIEW_H
#define REGIONSVIEW_H
diff --git a/src/searchparams.cpp b/src/searchparams.cpp
index a7906fc..be08e72 100644
--- a/src/searchparams.cpp
+++ b/src/searchparams.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "searchparams.h"
SearchParams::SearchParams(QObject *parent) : QObject(parent) {
diff --git a/src/searchparams.h b/src/searchparams.h
index 24e023f..f2e9d03 100644
--- a/src/searchparams.h
+++ b/src/searchparams.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef SEARCHPARAMS_H
#define SEARCHPARAMS_H
diff --git a/src/searchview.cpp b/src/searchview.cpp
index 950d342..522701e 100644
--- a/src/searchview.cpp
+++ b/src/searchview.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "searchview.h"
#include "constants.h"
#include "fontutils.h"
@@ -9,13 +29,14 @@
#else
#include "searchlineedit.h"
#endif
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
#include "extra.h"
#endif
#ifdef APP_ACTIVATION
#include "activation.h"
#endif
#include "mainwindow.h"
+#include "painterutils.h"
namespace The {
QHash* globalActions();
@@ -36,6 +57,8 @@ SearchView::SearchView(QWidget *parent) : QWidget(parent) {
setAttribute(Qt::WA_OpaquePaintEvent);
#endif
+ setAutoFillBackground(true);
+
QBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->setMargin(PADDING);
mainLayout->setSpacing(0);
@@ -68,6 +91,12 @@ SearchView::SearchView(QWidget *parent) : QWidget(parent) {
.arg(Constants::WEBSITE, Constants::NAME)
+ "", this);
welcomeLabel->setOpenExternalLinks(true);
+#ifdef APP_WIN
+ QFont f = welcomeLabel->font();
+ f.setHintingPreference(QFont::PreferNoHinting);
+ f.setFamily("Segoe UI Light");
+ welcomeLabel->setFont(f);
+#endif
layout->addWidget(welcomeLabel);
layout->addSpacing(PADDING / 2);
@@ -280,7 +309,7 @@ void SearchView::watch(QString query) {
searchParams->setKeywords(query);
else {
// remove spaces from channel name
- query = query.replace(" ", "");
+ query = query.simplified();
searchParams->setAuthor(query);
searchParams->setSortBy(SearchParams::SortByNewest);
}
@@ -332,9 +361,8 @@ void SearchView::watchKeywords(QString query) {
emit search(searchParams);
}
-void SearchView::paintEvent(QPaintEvent * /*event*/) {
- QPainter painter(this);
-
+void SearchView::paintEvent(QPaintEvent *event) {
+ QWidget::paintEvent(event);
#if defined(APP_MAC) | defined(APP_WIN)
QBrush brush;
if (window()->isActiveWindow()) {
@@ -342,21 +370,17 @@ void SearchView::paintEvent(QPaintEvent * /*event*/) {
} else {
brush = palette().window();
}
+ QPainter painter(this);
painter.fillRect(0, 0, width(), height(), brush);
+ painter.end();
#endif
-
- static QLinearGradient shadow;
- static const int shadowHeight = 10;
- if (shadow.stops().count() == 2) {
- shadow.setFinalStop(0, shadowHeight);
- const qreal initialOpacity = 96;
- for (qreal i = 0; i <= 1; i += 1.0/shadowHeight) {
- qreal opacity = qPow(initialOpacity, (1.0 - i)) - 1;
- shadow.setColorAt(i, QColor(0x00, 0x00, 0x00, opacity));
- }
- }
- QRect r = rect();
- painter.fillRect(r.x(), r.y(), r.width(), shadowHeight, QBrush(shadow));
+#ifdef APP_UBUNTU
+ QStyleOption o;
+ o.initFrom(this);
+ QPainter p(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &o, &p, this);
+#endif
+ // PainterUtils::topShadow(this);
}
void SearchView::searchTypeChanged(int index) {
diff --git a/src/searchview.h b/src/searchview.h
index 4fcf504..9cefc71 100644
--- a/src/searchview.h
+++ b/src/searchview.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef __SEARCHVIEW_H__
#define __SEARCHVIEW_H__
diff --git a/src/segmentedcontrol.cpp b/src/segmentedcontrol.cpp
index a896fbd..27e6390 100644
--- a/src/segmentedcontrol.cpp
+++ b/src/segmentedcontrol.cpp
@@ -1,6 +1,27 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "segmentedcontrol.h"
#include "fontutils.h"
#include "mainwindow.h"
+#include "painterutils.h"
static const QColor borderColor = QColor(0x26, 0x26, 0x26);
@@ -233,13 +254,22 @@ void SegmentedControl::paintButton(QPainter *painter, const QRect& rect, const Q
painter->setFont(FontUtils::smallBold());
+ const QString text = action->text();
+
// text shadow
painter->setPen(QColor(0, 0, 0, 128));
- painter->drawText(0, -1, width, height, Qt::AlignCenter, action->text());
+ painter->drawText(0, -1, width, height, Qt::AlignCenter, text);
painter->setPen(QPen(Qt::white, 1));
- painter->drawText(0, 0, width, height, Qt::AlignCenter, action->text());
+ painter->drawText(0, 0, width, height, Qt::AlignCenter, text);
+
+ if (action->property("notifyCount").isValid()) {
+ QRect textBox = painter->boundingRect(rect,
+ Qt::AlignCenter,
+ text);
+ painter->translate((width + textBox.width()) / 2 + 10, (height - 20) / 2);
+ PainterUtils::paintBadge(painter, action->property("notifyCount").toString());
+ }
painter->restore();
}
-
diff --git a/src/segmentedcontrol.h b/src/segmentedcontrol.h
index 094a3b7..ba1ccdf 100644
--- a/src/segmentedcontrol.h
+++ b/src/segmentedcontrol.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef SEGMENTEDCONTROL_H
#define SEGMENTEDCONTROL_H
diff --git a/src/sidebarheader.cpp b/src/sidebarheader.cpp
index 91670a9..dc8026e 100644
--- a/src/sidebarheader.cpp
+++ b/src/sidebarheader.cpp
@@ -1,8 +1,29 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "sidebarheader.h"
#include "utils.h"
#include "mediaview.h"
#include "videosource.h"
#include "fontutils.h"
+#include "utils.h"
SidebarHeader::SidebarHeader(QWidget *parent) : QToolBar(parent) { }
@@ -11,6 +32,8 @@ void SidebarHeader::setup() {
if (isSetup) return;
isSetup = true;
+ setIconSize(QSize(16, 16));
+
backAction = new QAction(
Utils::icon("go-previous"),
tr("&Back"), this);
@@ -27,19 +50,16 @@ void SidebarHeader::setup() {
foreach (QAction* action, actions()) {
window()->addAction(action);
- action->setAutoRepeat(false);
+ Utils::setupAction(action);
}
- /*
QWidget *spacerWidget = new QWidget(this);
spacerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
- spacerWidget->setVisible(true);
addWidget(spacerWidget);
- */
}
QSize SidebarHeader::minimumSizeHint (void) const {
- return(QSize(1, QFontMetrics(font()).height() * 1.9));
+ return(QSize(160, QFontMetrics(font()).height() * 1.9));
}
void SidebarHeader::updateInfo() {
@@ -87,6 +107,14 @@ void SidebarHeader::updateTitle(QString title) {
void SidebarHeader::setTitle(QString title) {
this->title = title;
update();
+
+ QList history = MediaView::instance()->getHistory();
+ int currentIndex = MediaView::instance()->getHistoryIndex();
+ VideoSource *currentVideoSource = history.at(currentIndex);
+ foreach (QAction* action, videoSourceActions)
+ removeAction(action);
+ videoSourceActions = currentVideoSource->getActions();
+ addActions(videoSourceActions);
}
void SidebarHeader::paintEvent(QPaintEvent *event) {
@@ -101,12 +129,13 @@ void SidebarHeader::paintEvent(QPaintEvent *event) {
QString t = title;
QRect textBox = p.boundingRect(r, Qt::AlignCenter, t);
int i = 1;
- static const int margin = 100;
- while (textBox.width() > r.width() - margin) {
- t = t.left(t.length() - i) + "...";
+ static const int margin = 50;
+ while (textBox.width() > r.width() - margin*2 && t.length() > 3) {
+ t = t.left(t.length() - i).trimmed() + QLatin1String("...");
textBox = p.boundingRect(r, Qt::AlignCenter, t);
i++;
}
-
p.drawText(r, Qt::AlignCenter, t);
+
+
}
diff --git a/src/sidebarheader.h b/src/sidebarheader.h
index 1ef4937..8591d54 100644
--- a/src/sidebarheader.h
+++ b/src/sidebarheader.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef SIDEBARHEADER_H
#define SIDEBARHEADER_H
@@ -25,6 +45,7 @@ private:
QAction *backAction;
QAction * forwardAction;
QString title;
+ QList videoSourceActions;
};
#endif // SIDEBARHEADER_H
diff --git a/src/sidebarwidget.cpp b/src/sidebarwidget.cpp
index 5a5647f..fd5fd40 100644
--- a/src/sidebarwidget.cpp
+++ b/src/sidebarwidget.cpp
@@ -1,8 +1,28 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "sidebarwidget.h"
#include "refinesearchbutton.h"
#include "refinesearchwidget.h"
#include "sidebarheader.h"
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
#include "extra.h"
#endif
@@ -44,10 +64,6 @@ SidebarWidget::SidebarWidget(QWidget *parent) :
}
void SidebarWidget::setup() {
- static bool isSetup = false;
- if (isSetup) return;
- isSetup = true;
-
refineSearchButton = new RefineSearchButton(this);
refineSearchButton->setStatusTip(tr("Refine Search")
+ " (" + QKeySequence(Qt::CTRL + Qt::Key_R).toString(QKeySequence::NativeText) + ")");
@@ -72,7 +88,6 @@ void SidebarWidget::setPlaylist(QListView *playlist) {
}
void SidebarWidget::showPlaylist() {
- setup();
stackedWidget->setCurrentWidget(playlist);
The::globalActions()->value("refine-search")->setChecked(false);
}
@@ -81,8 +96,8 @@ void SidebarWidget::showRefineSearchWidget() {
if (!refineSearchWidget->isEnabled()) return;
refineSearchWidget->setDirty(false);
stackedWidget->setCurrentWidget(refineSearchWidget);
- refineSearchWidget->setFocus();
-#ifndef Q_WS_X11
+ // refineSearchWidget->setFocus();
+#ifdef APP_EXTRA
Extra::fadeInWidget(playlist, refineSearchWidget);
#endif
refineSearchButton->hide();
@@ -92,7 +107,7 @@ void SidebarWidget::showRefineSearchWidget() {
void SidebarWidget::hideRefineSearchWidget() {
stackedWidget->setCurrentWidget(playlist);
playlist->setFocus();
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
Extra::fadeInWidget(refineSearchWidget, playlist);
#endif
The::globalActions()->value("refine-search")->setChecked(false);
diff --git a/src/sidebarwidget.h b/src/sidebarwidget.h
index 26d9bf0..cd8efe6 100644
--- a/src/sidebarwidget.h
+++ b/src/sidebarwidget.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef SIDEBARWIDGET_H
#define SIDEBARWIDGET_H
diff --git a/src/spacer.cpp b/src/spacer.cpp
index 95594fc..07a9c55 100644
--- a/src/spacer.cpp
+++ b/src/spacer.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "spacer.h"
Spacer::Spacer(QWidget *parent) : QWidget(parent) { }
diff --git a/src/spacer.h b/src/spacer.h
index 3d1f44f..88ae160 100644
--- a/src/spacer.h
+++ b/src/spacer.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef SPACER_H
#define SPACER_H
diff --git a/src/standardfeedsview.cpp b/src/standardfeedsview.cpp
index 1aae3e3..4bfeee6 100644
--- a/src/standardfeedsview.cpp
+++ b/src/standardfeedsview.cpp
@@ -1,16 +1,35 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "standardfeedsview.h"
#include "videosourcewidget.h"
#include "ytcategories.h"
#include "ytstandardfeed.h"
#include "ytregions.h"
#include "mainwindow.h"
+#include "painterutils.h"
namespace The {
QHash* globalActions();
}
-static const int cols = 5;
-
StandardFeedsView::StandardFeedsView(QWidget *parent) : QWidget(parent),
layout(0) {
QPalette p = palette();
@@ -76,6 +95,7 @@ void StandardFeedsView::addVideoSourceWidget(VideoSource *videoSource) {
connect(w, SIGNAL(activated(VideoSource*)),
SIGNAL(activated(VideoSource*)));
int i = layout->count();
+ static const int cols = 5;
layout->addWidget(w, i / cols, i % cols);
}
@@ -83,18 +103,21 @@ QList StandardFeedsView::getMainFeeds() {
QList feeds;
feeds << buildStardardFeed("most_popular", tr("Most Popular"))
- << buildStardardFeed("recently_featured", tr("Featured"))
+ // << buildStardardFeed("recently_featured", tr("Featured"))
<< buildStardardFeed("most_shared", tr("Most Shared"))
<< buildStardardFeed("most_discussed", tr("Most Discussed"))
- << buildStardardFeed("top_rated", tr("Top Rated"));
+ << buildStardardFeed("top_rated", tr("Top Rated"))
+ << buildStardardFeed("most_popular", tr("All Time Popular"), "all_time");
return feeds;
}
-YTStandardFeed* StandardFeedsView::buildStardardFeed(QString feedId, QString label) {
+YTStandardFeed* StandardFeedsView::buildStardardFeed(
+ QString feedId, QString label, QString time) {
YTStandardFeed *feed = new YTStandardFeed(this);
feed->setFeedId(feedId);
feed->setLabel(label);
+ if (!time.isEmpty()) feed->setTime(time);
feed->setRegionId(YTRegions::currentRegionId());
return feed;
}
@@ -121,4 +144,8 @@ void StandardFeedsView::selectLocalRegion() {
load();
}
+void StandardFeedsView::paintEvent(QPaintEvent *event) {
+ QWidget::paintEvent(event);
+ PainterUtils::topShadow(this);
+}
diff --git a/src/standardfeedsview.h b/src/standardfeedsview.h
index 17d850f..1d52143 100644
--- a/src/standardfeedsview.h
+++ b/src/standardfeedsview.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef CATEGORIESVIEW_H
#define CATEGORIESVIEW_H
@@ -22,6 +42,9 @@ public slots:
void appear();
void disappear();
void load();
+
+protected:
+ void paintEvent(QPaintEvent *event);
private slots:
void layoutCategories(const QList &categories);
@@ -31,7 +54,7 @@ private slots:
private:
void addVideoSourceWidget(VideoSource *videoSource);
QList getMainFeeds();
- YTStandardFeed* buildStardardFeed(QString feedId, QString label);
+ YTStandardFeed* buildStardardFeed(QString feedId, QString label, QString time = QString());
QGridLayout *layout;
};
diff --git a/src/suggester.h b/src/suggester.h
index ad39f92..e14492f 100644
--- a/src/suggester.h
+++ b/src/suggester.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef SUGGESTER_H
#define SUGGESTER_H
diff --git a/src/temporary.cpp b/src/temporary.cpp
index 362cbd8..3f29d70 100644
--- a/src/temporary.cpp
+++ b/src/temporary.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "temporary.h"
#include "constants.h"
diff --git a/src/temporary.h b/src/temporary.h
index 50b9633..de5e24d 100644
--- a/src/temporary.h
+++ b/src/temporary.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef TEMPORARY_H
#define TEMPORARY_H
diff --git a/src/updatechecker.cpp b/src/updatechecker.cpp
index fc794d3..af7c349 100644
--- a/src/updatechecker.cpp
+++ b/src/updatechecker.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "updatechecker.h"
#include "networkaccess.h"
#include "constants.h"
@@ -14,7 +34,7 @@ UpdateChecker::UpdateChecker() {
}
void UpdateChecker::checkForUpdate() {
- QUrl updateUrl(QString(Constants::WEBSITE) + "-ws/release.xml");
+ QUrl updateUrl(QLatin1String(Constants::WEBSITE) + "-ws/release.xml");
updateUrl.addQueryItem("v", Constants::VERSION);
#ifdef APP_MAC
diff --git a/src/updatechecker.h b/src/updatechecker.h
index 8d6cf08..74f0fb9 100644
--- a/src/updatechecker.h
+++ b/src/updatechecker.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef UPDATECHECKER_H
#define UPDATECHECKER_H
diff --git a/src/urllineedit.h b/src/urllineedit.h
index 037bb8b..a8e4a12 100644
--- a/src/urllineedit.h
+++ b/src/urllineedit.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
/****************************************************************************
**
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
diff --git a/src/userview.cpp b/src/userview.cpp
deleted file mode 100644
index af6257a..0000000
--- a/src/userview.cpp
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "userview.h"
-
-UserView::UserView(QWidget *parent) : QWidget(parent) {
- layout = new QGridLayout(this);
-}
diff --git a/src/userview.h b/src/userview.h
deleted file mode 100644
index bb03acd..0000000
--- a/src/userview.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef USERVIEW_H
-#define USERVIEW_H
-
-#include
-#include "view.h"
-
-class VideoSource;
-
-class UserView : public QWidget, public View {
-
- Q_OBJECT
-
-public:
- UserView(QWidget *parent = 0);
-
-signals:
- void activated(VideoSource *standardFeed);
-
-private:
- QGridLayout *layout;
-
-};
-
-#endif // USERVIEW_H
diff --git a/src/utils.cpp b/src/utils.cpp
index 01b03b3..5c5aa1e 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -1,32 +1,96 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "utils.h"
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
#include "extra.h"
#endif
-QIcon getIcon(const QString &name) {
-#ifdef Q_WS_X11
- return QIcon::fromTheme(name);
-#else
- return Extra::getIcon(name);
-#endif
+QIcon Utils::themeIcon(const QString &name) {
+ if (QIcon::hasThemeIcon(name))
+ return QIcon::fromTheme(name);
+ else
+ return QIcon(QString(":/images/%1.png").arg(name));
}
QIcon Utils::icon(const QString &name) {
-#ifdef Q_WS_X11
- QString themeName = qApp->property("style").toString();
- if (themeName == QLatin1String("Ambiance"))
- return icon(QStringList() << name + "-symbolic" << name);
- else return getIcon(name);
-#else
+#ifdef APP_EXTRA
return Extra::getIcon(name);
+#else
+ return themeIcon(name);
#endif
}
QIcon Utils::icon(const QStringList &names) {
QIcon icon;
foreach (QString name, names) {
- icon = getIcon(name);
+ icon = Utils::themeIcon(name);
if (!icon.availableSizes().isEmpty()) break;
}
return icon;
}
+
+QIcon Utils::tintedIcon(const QString &name, const QColor &color, QList sizes) {
+ QIcon i = icon(name);
+ QIcon t;
+ if (sizes.isEmpty()) sizes = i.availableSizes();
+ foreach (QSize size, sizes) {
+ QPixmap pixmap = i.pixmap(size);
+ QImage tintedImage = tinted(pixmap.toImage(), color);
+ t.addPixmap(QPixmap::fromImage(tintedImage));
+ }
+ return t;
+}
+
+QImage Utils::grayscaled(const QImage &image) {
+ QImage img = image;
+ int pixels = img.width() * img.height();
+ unsigned int *data = (unsigned int *)img.bits();
+ for (int i = 0; i < pixels; ++i) {
+ int val = qGray(data[i]);
+ data[i] = qRgba(val, val, val, qAlpha(data[i]));
+ }
+ return img;
+}
+
+QImage Utils::tinted(const QImage &image, const QColor &color,
+ QPainter::CompositionMode mode) {
+ QImage img(image.size(), QImage::Format_ARGB32_Premultiplied);
+ QPainter painter(&img);
+ painter.drawImage(0, 0, grayscaled(image));
+ painter.setCompositionMode(mode);
+ painter.fillRect(img.rect(), color);
+ painter.end();
+ img.setAlphaChannel(image.alphaChannel());
+ return img;
+}
+
+void Utils::setupAction(QAction *action) {
+ // never autorepeat.
+ // unexperienced users tend to keep keys pressed for a "long" time
+ action->setAutoRepeat(false);
+
+ // show keyboard shortcuts in the status bar
+ if (!action->shortcut().isEmpty())
+ action->setStatusTip(action->statusTip() +
+ " (" +
+ action->shortcut().toString(QKeySequence::NativeText) +
+ ")");
+}
diff --git a/src/utils.h b/src/utils.h
index 1b023e8..b62bddf 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef UTILS_H
#define UTILS_H
@@ -6,12 +26,18 @@
class Utils {
public:
+ static QIcon themeIcon(const QString &name);
static QIcon icon(const QString &name);
static QIcon icon(const QStringList &names);
+ static QIcon tintedIcon(const QString &name, const QColor &color,
+ QList sizes = QList());
+ static void setupAction(QAction *action);
private:
Utils() { }
-
+ static QImage grayscaled(const QImage &image);
+ static QImage tinted(const QImage &image, const QColor &color,
+ QPainter::CompositionMode mode = QPainter::CompositionMode_Screen);
};
#endif // UTILS_H
diff --git a/src/video.cpp b/src/video.cpp
index 1e65242..027ee1f 100644
--- a/src/video.cpp
+++ b/src/video.cpp
@@ -1,17 +1,38 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "video.h"
#include "networkaccess.h"
#include
#include "videodefinition.h"
+#include "jsfunctions.h"
namespace The {
- NetworkAccess* http();
+NetworkAccess* http();
}
Video::Video() : m_duration(0),
-m_viewCount(-1),
-definitionCode(0),
-elIndex(0),
-loadingStreamUrl(false)
+ m_viewCount(-1),
+ definitionCode(0),
+ elIndex(0),
+ loadingStreamUrl(false)
{ }
Video* Video::clone() {
@@ -19,7 +40,7 @@ Video* Video::clone() {
cloneVideo->m_title = m_title;
cloneVideo->m_description = m_description;
cloneVideo->m_author = m_author;
- cloneVideo->m_authorUri = m_authorUri;
+ cloneVideo->m_userId = m_userId;
cloneVideo->m_webpage = m_webpage;
cloneVideo->m_streamUrl = m_streamUrl;
cloneVideo->m_thumbnail = m_thumbnail;
@@ -58,7 +79,8 @@ void Video::loadThumbnail() {
void Video::setThumbnail(QByteArray bytes) {
m_thumbnail.loadFromData(bytes);
- m_thumbnail = m_thumbnail.scaled(160, 90);
+ if (m_thumbnail.width() > 160)
+ m_thumbnail = m_thumbnail.scaledToWidth(160, Qt::SmoothTransformation);
emit gotThumbnail();
}
@@ -74,15 +96,26 @@ void Video::loadStreamUrl() {
return;
}
loadingStreamUrl = true;
+ elIndex = 0;
- // https://develop.participatoryculture.org/trac/democracy/browser/trunk/tv/portable/flashscraper.py
getVideoInfo();
}
void Video::getVideoInfo() {
- static const QStringList elTypes = QStringList() << "&el=embedded" << "&el=vevo" << "&el=detailpage" << "";
-
- if (elIndex > elTypes.size() - 1) {
+ static const QStringList elTypes = QStringList() << "&el=embedded" << "&el=detailpage" << "&el=vevo" << "";
+
+ QUrl videoInfoUrl;
+
+ if (elIndex == elTypes.size()) {
+ videoInfoUrl = QUrl("http://www.youtube.com/get_video_info");
+ videoInfoUrl.addQueryItem("video_id", videoId);
+ videoInfoUrl.addQueryItem("el", "embedded");
+ videoInfoUrl.addQueryItem("gl", "US");
+ videoInfoUrl.addQueryItem("hl", "en");
+ videoInfoUrl.addQueryItem("eurl", "https://youtube.googleapis.com/v/" + videoId);
+ videoInfoUrl.addQueryItem("asv", "3");
+ videoInfoUrl.addQueryItem("sts", "1588");
+ } else if (elIndex > elTypes.size() - 1) {
loadingStreamUrl = false;
emit errorStreamUrl("Cannot get video info");
/*
@@ -95,24 +128,21 @@ void Video::getVideoInfo() {
// see you in scrapWebPage(QByteArray)
*/
return;
+ } else {
+ videoInfoUrl = QUrl(QString(
+ "http://www.youtube.com/get_video_info?video_id=%1%2&ps=default&eurl=&gl=US&hl=en"
+ ).arg(videoId, elTypes.at(elIndex)));
}
- // Get Video Token
- QUrl videoInfoUrl = QUrl(QString(
- "http://www.youtube.com/get_video_info?video_id=%1%2&ps=default&eurl=&gl=US&hl=en"
- ).arg(videoId, elTypes.at(elIndex)));
-
QObject *reply = The::http()->get(videoInfoUrl);
connect(reply, SIGNAL(data(QByteArray)), SLOT(gotVideoInfo(QByteArray)));
connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(errorVideoInfo(QNetworkReply*)));
// see you in gotVideoInfo...
-
}
void Video::gotVideoInfo(QByteArray data) {
QString videoInfo = QString::fromUtf8(data);
-
// qDebug() << "videoInfo" << videoInfo;
// get video token
@@ -125,6 +155,7 @@ void Video::gotVideoInfo(QByteArray data) {
getVideoInfo();
return;
}
+
QString videoToken = re.cap(1);
while (videoToken.contains('%'))
videoToken = QByteArray::fromPercentEncoding(videoToken.toAscii());
@@ -144,23 +175,27 @@ void Video::gotVideoInfo(QByteArray data) {
QString fmtUrlMap = re.cap(1);
fmtUrlMap = QByteArray::fromPercentEncoding(fmtUrlMap.toUtf8());
+ parseFmtUrlMap(fmtUrlMap);
+}
+void Video::parseFmtUrlMap(QString fmtUrlMap, bool fromWebPage) {
QSettings settings;
- QString definitionName = settings.value("definition").toString();
+ QString definitionName = settings.value("definition", "360p").toString();
int definitionCode = VideoDefinition::getDefinitionCode(definitionName);
// qDebug() << "fmtUrlMap" << fmtUrlMap;
- QStringList formatUrls = fmtUrlMap.split(",", QString::SkipEmptyParts);
+ QStringList formatUrls = fmtUrlMap.split(',', QString::SkipEmptyParts);
QHash urlMap;
foreach(QString formatUrl, formatUrls) {
// qDebug() << "formatUrl" << formatUrl;
- QStringList urlParams = formatUrl.split("&", QString::SkipEmptyParts);
+ QStringList urlParams = formatUrl.split('&', QString::SkipEmptyParts);
// qDebug() << "urlParams" << urlParams;
int format = -1;
QString url;
QString sig;
foreach(QString urlParam, urlParams) {
+ // qDebug() << urlParam;
if (urlParam.startsWith("itag=")) {
int separator = urlParam.indexOf("=");
format = urlParam.mid(separator + 1).toInt();
@@ -172,14 +207,30 @@ void Video::gotVideoInfo(QByteArray data) {
int separator = urlParam.indexOf("=");
sig = urlParam.mid(separator + 1);
sig = QByteArray::fromPercentEncoding(sig.toUtf8());
+ } else if (urlParam.startsWith("s=")) {
+ if (fromWebPage || elIndex == 4) {
+ int separator = urlParam.indexOf("=");
+ sig = urlParam.mid(separator + 1);
+ sig = QByteArray::fromPercentEncoding(sig.toUtf8());
+ sig = JsFunctions::instance()->decryptSignature(sig);
+ } else {
+ QObject *reply = The::http()->get(m_webpage);
+ connect(reply, SIGNAL(data(QByteArray)), SLOT(scrapeWebPage(QByteArray)));
+ connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(errorVideoInfo(QNetworkReply*)));
+ // see you in scrapWebPage(QByteArray)
+ return;
+ }
}
}
if (format == -1 || url.isNull()) continue;
url += "&signature=" + sig;
+ if (!url.contains("ratebypass"))
+ url += "&ratebypass=yes";
+
if (format == definitionCode) {
- qDebug() << "Found format" << definitionCode;
+ // qDebug() << "Found format" << definitionCode;
QUrl videoUrl = QUrl::fromEncoded(url.toUtf8(), QUrl::StrictMode);
m_streamUrl = videoUrl;
this->definitionCode = definitionCode;
@@ -199,7 +250,7 @@ void Video::gotVideoInfo(QByteArray data) {
if (previousIndex < 0) previousIndex = 0;
int definitionCode = definitionCodes.at(previousIndex);
if (urlMap.contains(definitionCode)) {
- qDebug() << "Found format" << definitionCode;
+ // qDebug() << "Found format" << definitionCode;
QString url = urlMap.value(definitionCode);
QUrl videoUrl = QUrl::fromEncoded(url.toUtf8(), QUrl::StrictMode);
m_streamUrl = videoUrl;
@@ -212,15 +263,14 @@ void Video::gotVideoInfo(QByteArray data) {
}
emit errorStreamUrl(tr("Cannot get video stream for %1").arg(m_webpage.toString()));
-
}
void Video::foundVideoUrl(QString videoToken, int definitionCode) {
// qDebug() << "foundVideoUrl" << videoToken << definitionCode;
QUrl videoUrl = QUrl(QString(
- "http://www.youtube.com/get_video?video_id=%1&t=%2&eurl=&el=&ps=&asv=&fmt=%3"
- ).arg(videoId, videoToken, QString::number(definitionCode)));
+ "http://www.youtube.com/get_video?video_id=%1&t=%2&eurl=&el=&ps=&asv=&fmt=%3"
+ ).arg(videoId, videoToken, QString::number(definitionCode)));
m_streamUrl = videoUrl;
loadingStreamUrl = false;
@@ -233,37 +283,23 @@ void Video::errorVideoInfo(QNetworkReply *reply) {
}
void Video::scrapeWebPage(QByteArray data) {
-
- QString videoHTML = QString::fromUtf8(data);
- QRegExp re(".*, \"t\": \"([^\"]+)\".*");
- bool match = re.exactMatch(videoHTML);
+ QString html = QString::fromUtf8(data);
+ QRegExp re(".*\"url_encoded_fmt_stream_map\": \"([^\"]+)\".*");
+ bool match = re.exactMatch(html);
// on regexp failure, stop and report error
if (!match || re.numCaptures() < 1) {
- emit errorStreamUrl("Error parsing video page");
- loadingStreamUrl = false;
+ qWarning() << "Error parsing video page";
+ // emit errorStreamUrl("Error parsing video page");
+ // loadingStreamUrl = false;
+ elIndex++;
+ getVideoInfo();
return;
}
- QString videoToken = re.cap(1);
- // FIXME proper decode
- videoToken = videoToken.replace("%3D", "=");
-
- // we'll need this in gotHeadHeaders()
- this->videoToken = videoToken;
-
- // qDebug() << "token" << videoToken;
-
- QSettings settings;
- QString definitionName = settings.value("definition").toString();
- int definitionCode = VideoDefinition::getDefinitionCode(definitionName);
- if (definitionCode == 18) {
- // This is assumed always available
- foundVideoUrl(videoToken, 18);
- } else {
- findVideoUrl(definitionCode);
- }
-
+ QString fmtUrlMap = re.cap(1);
+ fmtUrlMap.replace("\\u0026", "&");
+ parseFmtUrlMap(fmtUrlMap, true);
}
void Video::gotHeadHeaders(QNetworkReply* reply) {
@@ -313,8 +349,8 @@ void Video::findVideoUrl(int definitionCode) {
this->definitionCode = definitionCode;
QUrl videoUrl = QUrl(QString(
- "http://www.youtube.com/get_video?video_id=%1&t=%2&eurl=&el=&ps=&asv=&fmt=%3"
- ).arg(videoId, videoToken, QString::number(definitionCode)));
+ "http://www.youtube.com/get_video?video_id=%1&t=%2&eurl=&el=&ps=&asv=&fmt=%3"
+ ).arg(videoId, videoToken, QString::number(definitionCode)));
QObject *reply = The::http()->head(videoUrl);
connect(reply, SIGNAL(finished(QNetworkReply*)), SLOT(gotHeadHeaders(QNetworkReply*)));
@@ -324,7 +360,6 @@ void Video::findVideoUrl(int definitionCode) {
}
-
QString Video::formattedDuration() const {
QString format = m_duration > 3600 ? "h:mm:ss" : "m:ss";
return QTime().addSecs(m_duration).toString(format);
diff --git a/src/video.h b/src/video.h
index 4b15e37..5e8580a 100644
--- a/src/video.h
+++ b/src/video.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef VIDEO_H
#define VIDEO_H
@@ -12,29 +32,29 @@ public:
Video();
Video* clone();
- const QString title() const { return m_title; }
+ const QString & title() const { return m_title; }
void setTitle( QString title ) { m_title = title; }
- const QString description() const { return m_description; }
+ const QString & description() const { return m_description; }
void setDescription( QString description ) { m_description = description; }
- const QString author() const { return m_author; }
+ const QString & author() const { return m_author; }
void setAuthor( QString author ) { m_author = author; }
- const QString authorUri() const { return m_authorUri; }
- void setAuthorUri( QString authorUri ) { m_authorUri = authorUri; }
+ const QString & userId() const { return m_userId; }
+ void setUserId( QString userId ) { m_userId = userId; }
- const QUrl webpage() const { return m_webpage; }
+ const QUrl & webpage() const { return m_webpage; }
void setWebpage(QUrl webpage);
void loadThumbnail();
const QPixmap & thumbnail() const { return m_thumbnail; }
- QString thumbnailUrl() { return m_thumbnailUrl; }
+ const QString & thumbnailUrl() { return m_thumbnailUrl; }
void setThumbnailUrl(QString url) { m_thumbnailUrl = url; }
void loadMediumThumbnail();
- QString mediumThumbnailUrl() { return m_mediumThumbnailUrl; }
+ const QString & mediumThumbnailUrl() { return m_mediumThumbnailUrl; }
void setMediumThumbnailUrl(QString url) { m_mediumThumbnailUrl = url; }
int duration() const { return m_duration; }
@@ -44,15 +64,16 @@ public:
int viewCount() const { return m_viewCount; }
void setViewCount( int viewCount ) { m_viewCount = viewCount; }
- const QDateTime published() const { return m_published; }
+ const QDateTime & published() const { return m_published; }
void setPublished( QDateTime published ) { m_published = published; }
int getDefinitionCode() const { return definitionCode; }
void loadStreamUrl();
- QUrl getStreamUrl() { return m_streamUrl; }
+ const QUrl & getStreamUrl() { return m_streamUrl; }
- QString id() const { return videoId; }
+ void setId(QString id) { videoId = id; }
+ const QString & id() const { return videoId; }
signals:
void gotThumbnail();
@@ -71,11 +92,12 @@ private:
void getVideoInfo();
void findVideoUrl(int definitionCode);
void foundVideoUrl(QString videoToken, int definitionCode);
+ void parseFmtUrlMap(QString fmtUrlMap, bool fromWebPage = false);
QString m_title;
QString m_description;
QString m_author;
- QString m_authorUri;
+ QString m_userId;
QUrl m_webpage;
QUrl m_streamUrl;
QPixmap m_thumbnail;
diff --git a/src/videoareawidget.cpp b/src/videoareawidget.cpp
index 695070f..14a5718 100644
--- a/src/videoareawidget.cpp
+++ b/src/videoareawidget.cpp
@@ -1,8 +1,32 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "videoareawidget.h"
#include "videomimedata.h"
-#ifndef Q_WS_X11
+#include "mainwindow.h"
+#ifdef APP_EXTRA
#include "extra.h"
#endif
+#ifdef Q_WS_MAC
+#include "macutils.h"
+#endif
VideoAreaWidget::VideoAreaWidget(QWidget *parent) : QWidget(parent) {
QBoxLayout *vLayout = new QVBoxLayout(this);
@@ -28,11 +52,12 @@ VideoAreaWidget::VideoAreaWidget(QWidget *parent) : QWidget(parent) {
stackedLayout = new QStackedLayout();
vLayout->addLayout(stackedLayout);
- snapshotPreview = new QLabel(this);
- stackedLayout->addWidget(snapshotPreview);
+ // snapshotPreview = new QLabel(this);
+ // stackedLayout->addWidget(snapshotPreview);
- setAcceptDrops(true);
+ setAcceptDrops(true);
setMouseTracking(true);
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}
void VideoAreaWidget::setVideoWidget(QWidget *videoWidget) {
@@ -44,10 +69,12 @@ void VideoAreaWidget::setVideoWidget(QWidget *videoWidget) {
void VideoAreaWidget::setLoadingWidget(LoadingWidget *loadingWidget) {
this->loadingWidget = loadingWidget;
stackedLayout->addWidget(loadingWidget);
+ stackedLayout->setCurrentWidget(loadingWidget);
}
void VideoAreaWidget::showVideo() {
stackedLayout->setCurrentWidget(videoWidget);
+ loadingWidget->clear();
}
void VideoAreaWidget::showError(QString message) {
@@ -58,16 +85,17 @@ void VideoAreaWidget::showError(QString message) {
}
void VideoAreaWidget::showLoading(Video *video) {
- stackedLayout->setCurrentWidget(loadingWidget);
- this->loadingWidget->setVideo(video);
messageLabel->hide();
messageLabel->clear();
+ stackedLayout->setCurrentWidget(loadingWidget);
+ loadingWidget->setVideo(video);
}
+/*
void VideoAreaWidget::showSnapshotPreview(QPixmap pixmap) {
snapshotPreview->setPixmap(pixmap);
stackedLayout->setCurrentWidget(snapshotPreview);
-#ifndef Q_WS_X11
+#ifdef APP_EXTRA
Extra::flashInWidget(snapshotPreview);
#endif
QTimer::singleShot(1500, this, SLOT(hideSnapshotPreview()));
@@ -76,13 +104,14 @@ void VideoAreaWidget::showSnapshotPreview(QPixmap pixmap) {
void VideoAreaWidget::hideSnapshotPreview() {
stackedLayout->setCurrentWidget(videoWidget);
}
+*/
void VideoAreaWidget::clear() {
- stackedLayout->setCurrentWidget(loadingWidget);
loadingWidget->clear();
messageLabel->hide();
messageLabel->clear();
- snapshotPreview->clear();
+ // snapshotPreview->clear();
+ stackedLayout->setCurrentWidget(loadingWidget);
}
void VideoAreaWidget::mouseDoubleClickEvent(QMouseEvent *event) {
@@ -95,6 +124,29 @@ void VideoAreaWidget::mousePressEvent(QMouseEvent *event) {
if(event->button() == Qt::RightButton)
emit rightClicked();
+
+ else if (event->button() == Qt::LeftButton) {
+ bool isNormalWindow = !window()->isMaximized() &&
+ !MainWindow::instance()->isReallyFullScreen();
+ if (isNormalWindow) {
+ dragPosition = event->globalPos() - window()->frameGeometry().topLeft();
+ event->accept();
+ }
+ }
+}
+
+void VideoAreaWidget::mouseMoveEvent(QMouseEvent *event) {
+ bool isNormalWindow = !window()->isMaximized() &&
+ !MainWindow::instance()->isReallyFullScreen();
+ if (event->buttons() & Qt::LeftButton && isNormalWindow) {
+ QPoint p = event->globalPos() - dragPosition;
+#ifdef Q_WS_MAC
+ mac::moveWindowTo(window()->winId(), p.x(), p.y());
+#else
+ window()->move(p);
+#endif
+ event->accept();
+ }
}
void VideoAreaWidget::dragEnterEvent(QDragEnterEvent *event) {
diff --git a/src/videoareawidget.h b/src/videoareawidget.h
index 4d4fd65..3673f69 100644
--- a/src/videoareawidget.h
+++ b/src/videoareawidget.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef VIDEOAREAWIDGET_H
#define VIDEOAREAWIDGET_H
@@ -21,7 +41,8 @@ public:
void setListModel(PlaylistModel *listModel) {
this->listModel = listModel;
}
- void showSnapshotPreview(QPixmap pixmap);
+ // void showSnapshotPreview(QPixmap pixmap);
+ bool isVideoShown() { return stackedLayout->currentWidget() == videoWidget; }
signals:
void doubleClicked();
@@ -30,11 +51,12 @@ signals:
protected:
void mouseDoubleClickEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
+ void mouseMoveEvent(QMouseEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event);
private slots:
- void hideSnapshotPreview();
+ // void hideSnapshotPreview();
private:
QStackedLayout *stackedLayout;
@@ -42,7 +64,8 @@ private:
LoadingWidget *loadingWidget;
PlaylistModel *listModel;
QLabel *messageLabel;
- QLabel *snapshotPreview;
+ // QLabel *snapshotPreview;
+ QPoint dragPosition;
};
diff --git a/src/videodefinition.cpp b/src/videodefinition.cpp
index 341b881..28e3024 100644
--- a/src/videodefinition.cpp
+++ b/src/videodefinition.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "videodefinition.h"
QStringList VideoDefinition::getDefinitionNames() {
diff --git a/src/videodefinition.h b/src/videodefinition.h
index dadc992..809fafb 100644
--- a/src/videodefinition.h
+++ b/src/videodefinition.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef VIDEODEFINITION_H
#define VIDEODEFINITION_H
diff --git a/src/videomimedata.cpp b/src/videomimedata.cpp
index 619c7d1..b2a45be 100644
--- a/src/videomimedata.cpp
+++ b/src/videomimedata.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "videomimedata.h"
VideoMimeData::VideoMimeData() {}
diff --git a/src/videomimedata.h b/src/videomimedata.h
index ce06bd2..6abb788 100644
--- a/src/videomimedata.h
+++ b/src/videomimedata.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef VIDEOMIMEDATA_H
#define VIDEOMIMEDATA_H
diff --git a/src/videosource.cpp b/src/videosource.cpp
index d2da7fb..6f08656 100644
--- a/src/videosource.cpp
+++ b/src/videosource.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "videosource.h"
void VideoSource::setParam(QString name, QVariant value) {
diff --git a/src/videosource.h b/src/videosource.h
index 767697e..760f512 100644
--- a/src/videosource.h
+++ b/src/videosource.h
@@ -1,7 +1,28 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef VIDEOSOURCE_H
#define VIDEOSOURCE_H
#include
+#include
class Video;
@@ -15,6 +36,7 @@ public:
virtual void abort() = 0;
virtual const QStringList & getSuggestions() = 0;
virtual QString getName() = 0;
+ virtual QList getActions() { return QList(); }
public slots:
void setParam(QString name, QVariant value);
diff --git a/src/videosourcewidget.cpp b/src/videosourcewidget.cpp
index 90b893b..ccd2a0f 100644
--- a/src/videosourcewidget.cpp
+++ b/src/videosourcewidget.cpp
@@ -1,21 +1,39 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "videosourcewidget.h"
#include "videosource.h"
#include "video.h"
#include "fontutils.h"
VideoSourceWidget::VideoSourceWidget(VideoSource *videoSource, QWidget *parent)
- : QWidget(parent),
- videoSource(videoSource),
- hovered(false),
- pressed(false) {
+ : GridWidget(parent),
+ videoSource(videoSource) {
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- setCursor(Qt::PointingHandCursor);
- setFocusPolicy(Qt::StrongFocus);
connect(videoSource, SIGNAL(gotVideos(QList)),
SLOT(previewVideo(QList)), Qt::UniqueConnection);
videoSource->loadVideos(1, 1);
+
+ connect(this, SIGNAL(activated()), SLOT(activate()));
}
void VideoSourceWidget::activate() {
@@ -63,7 +81,8 @@ QPixmap VideoSourceWidget::playPixmap() {
return playIcon;
}
-void VideoSourceWidget::paintEvent(QPaintEvent *) {
+void VideoSourceWidget::paintEvent(QPaintEvent *event) {
+ GridWidget::paintEvent(event);
if (pixmap.isNull()) return;
QPainter p(this);
@@ -134,39 +153,3 @@ void VideoSourceWidget::paintEvent(QPaintEvent *) {
p.restore();
}
}
-
-void VideoSourceWidget::mouseMoveEvent (QMouseEvent *event) {
- QWidget::mouseMoveEvent(event);
- hovered = rect().contains(event->pos());
-}
-
-void VideoSourceWidget::mousePressEvent(QMouseEvent *event) {
- QWidget::mousePressEvent(event);
- if (event->button() != Qt::LeftButton) return;
- pressed = true;
- update();
-}
-
-void VideoSourceWidget::mouseReleaseEvent(QMouseEvent *event) {
- QWidget::mouseReleaseEvent(event);
- if (event->button() != Qt::LeftButton) return;
- pressed = false;
- if (hovered) emit activated(videoSource);
-}
-
-void VideoSourceWidget::leaveEvent(QEvent *event) {
- QWidget::leaveEvent(event);
- hovered = false;
- update();
-}
-
-void VideoSourceWidget::enterEvent(QEvent *event) {
- QWidget::enterEvent(event);
- hovered = true;
- update();
-}
-
-void VideoSourceWidget::keyReleaseEvent(QKeyEvent *event) {
- if (event->key() == Qt::Key_Return)
- emit activated(videoSource);
-}
diff --git a/src/videosourcewidget.h b/src/videosourcewidget.h
index b2d9236..22c7740 100644
--- a/src/videosourcewidget.h
+++ b/src/videosourcewidget.h
@@ -1,12 +1,33 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef VIDEOSOURCEWIDGET_H
#define VIDEOSOURCEWIDGET_H
#include
+#include "gridwidget.h"
class Video;
class VideoSource;
-class VideoSourceWidget : public QWidget {
+class VideoSourceWidget : public GridWidget {
Q_OBJECT
@@ -17,13 +38,7 @@ signals:
void activated(VideoSource *videoSource);
protected:
- void paintEvent(QPaintEvent *);
- void mouseMoveEvent(QMouseEvent *event);
- void mousePressEvent(QMouseEvent *event);
- void mouseReleaseEvent(QMouseEvent *event);
- void enterEvent(QEvent *event);
- void leaveEvent(QEvent *event);
- void keyReleaseEvent(QKeyEvent *event);
+ void paintEvent(QPaintEvent *event);
private slots:
void activate();
@@ -36,8 +51,6 @@ private:
QPixmap pixmap;
Video *video;
- bool hovered;
- bool pressed;
};
#endif // VIDEOSOURCEWIDGET_H
diff --git a/src/view.h b/src/view.h
index 0609c38..e847f6e 100644
--- a/src/view.h
+++ b/src/view.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef VIEW_H
#define VIEW_H
@@ -7,6 +27,7 @@ public:
virtual QHash metadata() { return QHash(); }
virtual void appear() {}
virtual void disappear() {}
+ QList getViewActions() { return QList(); }
};
diff --git a/src/ytcategories.cpp b/src/ytcategories.cpp
index 92e2dbc..8921742 100644
--- a/src/ytcategories.cpp
+++ b/src/ytcategories.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "ytcategories.h"
#include "networkaccess.h"
#include
diff --git a/src/ytcategories.h b/src/ytcategories.h
index 7513f2d..5689158 100644
--- a/src/ytcategories.h
+++ b/src/ytcategories.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef YTCATEGORIES_H
#define YTCATEGORIES_H
diff --git a/src/ytfeedreader.cpp b/src/ytfeedreader.cpp
index 117f92b..975e327 100644
--- a/src/ytfeedreader.cpp
+++ b/src/ytfeedreader.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "ytfeedreader.h"
#include "video.h"
@@ -42,11 +62,9 @@ void YTFeedReader::readEntry() {
if (name() == QLatin1String("name")) {
QString author = readElementText();
video->setAuthor(author);
- } else if (name() == QLatin1String("uri")) {
- QString uri = readElementText();
- int i = uri.lastIndexOf('/');
- if (i != -1) uri = uri.mid(i+1);
- video->setAuthorUri(uri);
+ } else if (name() == QLatin1String("userId")) {
+ QString userId = readElementText();
+ video->setUserId(userId);
} else skipCurrentElement();
} else if (name() == QLatin1String("published")) {
video->setPublished(QDateTime::fromString(readElementText(), Qt::ISODate));
diff --git a/src/ytfeedreader.h b/src/ytfeedreader.h
index 3ee6142..195c2a5 100644
--- a/src/ytfeedreader.h
+++ b/src/ytfeedreader.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef YTFEEDREADER_H
#define YTFEEDREADER_H
diff --git a/src/ytregions.cpp b/src/ytregions.cpp
index 63f8f14..b05cf6c 100644
--- a/src/ytregions.cpp
+++ b/src/ytregions.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "ytregions.h"
YTRegions::YTRegions() : QObject() { }
diff --git a/src/ytregions.h b/src/ytregions.h
index 029c0b9..bae0286 100644
--- a/src/ytregions.h
+++ b/src/ytregions.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef YTREGIONS_H
#define YTREGIONS_H
@@ -13,6 +33,8 @@ struct YTRegion {
class YTRegions : public QObject {
+ Q_OBJECT
+
public:
static const QList & list();
static const YTRegion & localRegion();
diff --git a/src/ytsearch.cpp b/src/ytsearch.cpp
index 9f3fd34..010cbd5 100644
--- a/src/ytsearch.cpp
+++ b/src/ytsearch.cpp
@@ -1,12 +1,35 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "ytsearch.h"
#include "ytfeedreader.h"
#include "constants.h"
#include "networkaccess.h"
#include "searchparams.h"
#include "video.h"
+#include "utils.h"
+#include "ytuser.h"
namespace The {
- NetworkAccess* http();
+NetworkAccess* http();
+QHash* globalActions();
}
YTSearch::YTSearch(SearchParams *searchParams, QObject *parent) :
@@ -104,7 +127,11 @@ void YTSearch::parseResults(QByteArray data) {
if (name.isEmpty() && !searchParams->author().isEmpty()) {
if (videos.isEmpty()) name = searchParams->author();
- else name = videos.first()->author();
+ else {
+ name = videos.first()->author();
+ // also grab the userId
+ userId = videos.first()->userId();
+ }
emit nameChanged(name);
}
@@ -123,3 +150,11 @@ QString YTSearch::videoIdFromUrl(QString url) {
if (re.exactMatch(url)) return re.cap(1);
return QString();
}
+
+QList YTSearch::getActions() {
+ QList channelActions;
+ if (searchParams->author().isEmpty())
+ return channelActions;
+ channelActions << The::globalActions()->value("subscribe-channel");
+ return channelActions;
+}
diff --git a/src/ytsearch.h b/src/ytsearch.h
index 983a27b..7ed282c 100644
--- a/src/ytsearch.h
+++ b/src/ytsearch.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef YTSEARCH_H
#define YTSEARCH_H
@@ -24,6 +44,8 @@ public:
return searchParams == other.getSearchParams();
}
+ QList getActions();
+
private slots:
void parseResults(QByteArray data);
void requestError(QNetworkReply *reply);
@@ -33,6 +55,8 @@ private:
bool aborted;
QStringList suggestions;
QString name;
+
+ QString userId;
};
#endif // YTSEARCH_H
diff --git a/src/ytsinglevideosource.cpp b/src/ytsinglevideosource.cpp
index 6a22de5..b4f4d30 100644
--- a/src/ytsinglevideosource.cpp
+++ b/src/ytsinglevideosource.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "ytsinglevideosource.h"
#include
#include "networkaccess.h"
diff --git a/src/ytsinglevideosource.h b/src/ytsinglevideosource.h
index 62aeb9a..53dfd52 100644
--- a/src/ytsinglevideosource.h
+++ b/src/ytsinglevideosource.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef YTSINGLEVIDEOSOURCE_H
#define YTSINGLEVIDEOSOURCE_H
diff --git a/src/ytstandardfeed.cpp b/src/ytstandardfeed.cpp
index 111ec29..50e0674 100644
--- a/src/ytstandardfeed.cpp
+++ b/src/ytstandardfeed.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "ytstandardfeed.h"
#include
#include "networkaccess.h"
@@ -23,8 +43,11 @@ void YTStandardFeed::loadVideos(int max, int skip) {
QUrl url(s);
url.addQueryItem("v", "2");
- if (feedId != "most_shared")
- url.addQueryItem("time", "today");
+ if (feedId != "most_shared" && feedId != "on_the_web") {
+ QString t = time;
+ if (t.isEmpty()) t = "today";
+ url.addQueryItem("time", t);
+ }
url.addQueryItem("max-results", QString::number(max));
url.addQueryItem("start-index", QString::number(skip));
diff --git a/src/ytstandardfeed.h b/src/ytstandardfeed.h
index 45cdfac..13979a8 100644
--- a/src/ytstandardfeed.h
+++ b/src/ytstandardfeed.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef YTSTANDARDFEED_H
#define YTSTANDARDFEED_H
@@ -23,6 +43,9 @@ public:
QString getLabel() { return label; }
void setLabel(QString label) { this->label = label; }
+ QString getTime() { return time; }
+ void setTime(QString time) { this->time = time; }
+
void loadVideos(int max, int skip);
void abort();
const QStringList & getSuggestions();
@@ -37,6 +60,7 @@ private:
QString regionId;
QString category;
QString label;
+ QString time;
bool aborted;
};
diff --git a/src/ytsuggester.cpp b/src/ytsuggester.cpp
index a1cfe98..c526b30 100644
--- a/src/ytsuggester.cpp
+++ b/src/ytsuggester.cpp
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#include "ytsuggester.h"
#include
#include "networkaccess.h"
diff --git a/src/ytsuggester.h b/src/ytsuggester.h
index c42440b..0599ff8 100644
--- a/src/ytsuggester.h
+++ b/src/ytsuggester.h
@@ -1,3 +1,23 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
#ifndef YTSUGGESTER_H
#define YTSUGGESTER_H
diff --git a/src/ytuser.cpp b/src/ytuser.cpp
new file mode 100644
index 0000000..9dc633a
--- /dev/null
+++ b/src/ytuser.cpp
@@ -0,0 +1,307 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#include "ytuser.h"
+#include "networkaccess.h"
+#include "database.h"
+#include
+
+namespace The {
+NetworkAccess* http();
+}
+
+YTUser::YTUser(QString userId, QObject *parent) : QObject(parent),
+ id(0),
+ userId(userId),
+ loadingThumbnail(false),
+ notifyCount(0),
+ checked(0),
+ watched(0),
+ loaded(0),
+ loading(false) { }
+
+QHash YTUser::cache;
+
+YTUser* YTUser::forId(QString userId) {
+ if (userId.isEmpty()) return 0;
+
+ if (cache.contains(userId))
+ return cache.value(userId);
+
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("select id,name,description,thumb_url,notify_count,watched,checked,loaded "
+ "from subscriptions where user_id=?");
+ query.bindValue(0, userId);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+
+ YTUser* user = 0;
+ if (query.next()) {
+ user = new YTUser(userId);
+ user->id = query.value(0).toInt();
+ user->displayName = query.value(1).toString();
+ user->description = query.value(2).toString();
+ user->thumbnailUrl = query.value(3).toString();
+ user->notifyCount = query.value(4).toInt();
+ user->watched = query.value(5).toUInt();
+ user->checked = query.value(6).toUInt();
+ user->loaded = query.value(7).toUInt();
+ user->thumbnail = QPixmap(user->getThumbnailLocation());
+ user->maybeLoadfromAPI();
+ cache.insert(userId, user);
+ }
+
+ return user;
+}
+
+void YTUser::maybeLoadfromAPI() {
+ if (loading) return;
+ if (userId.isEmpty()) return;
+
+ uint now = QDateTime::currentDateTime().toTime_t();
+ static const int refreshInterval = 60 * 60 * 24 * 10;
+ if (loaded > now - refreshInterval) return;
+
+ loading = true;
+
+ QUrl url("http://gdata.youtube.com/feeds/api/users/" + userId);
+ url.addQueryItem("v", "2");
+ QObject *reply = The::http()->get(url);
+ connect(reply, SIGNAL(data(QByteArray)), SLOT(parseResponse(QByteArray)));
+ connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(requestError(QNetworkReply*)));
+}
+
+void YTUser::parseResponse(QByteArray bytes) {
+ QXmlStreamReader xml(bytes);
+ xml.readNextStartElement();
+ if (xml.name() == QLatin1String("entry"))
+ while(xml.readNextStartElement()) {
+ const QStringRef n = xml.name();
+ if (n == QLatin1String("summary"))
+ description = xml.readElementText().simplified();
+ else if (n == QLatin1String("title"))
+ displayName = xml.readElementText();
+ else if (n == QLatin1String("thumbnail")) {
+ thumbnailUrl = xml.attributes().value("url").toString();
+ xml.skipCurrentElement();
+ } else if (n == QLatin1String("username"))
+ userName = xml.readElementText();
+ else xml.skipCurrentElement();
+ }
+
+ if (xml.hasError()) {
+ emit error(xml.errorString());
+ qWarning() << xml.errorString();
+ }
+
+ emit infoLoaded();
+ storeInfo();
+ loading = false;
+}
+
+void YTUser::loadThumbnail() {
+ if (loadingThumbnail) return;
+ if (thumbnailUrl.isEmpty()) return;
+ loadingThumbnail = true;
+
+#ifdef Q_WS_WIN
+ thumbnailUrl.replace(QLatin1String("https://"), QLatin1String("http://"));
+#endif
+
+ QUrl url(thumbnailUrl);
+ QObject *reply = The::http()->get(url);
+ connect(reply, SIGNAL(data(QByteArray)), SLOT(storeThumbnail(QByteArray)));
+ connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(requestError(QNetworkReply*)));
+}
+
+const QString & YTUser::getThumbnailDir() {
+ static const QString thumbDir = QDesktopServices::storageLocation(
+ QDesktopServices::DataLocation) + "/channels/";
+ return thumbDir;
+}
+
+QString YTUser::getThumbnailLocation() {
+ return getThumbnailDir() + userId;
+}
+
+void YTUser::storeThumbnail(QByteArray bytes) {
+ thumbnail.loadFromData(bytes);
+ static const int maxWidth = 88;
+
+ QDir dir;
+ dir.mkpath(getThumbnailDir());
+
+ if (thumbnail.width() > maxWidth) {
+ thumbnail = thumbnail.scaledToWidth(maxWidth, Qt::SmoothTransformation);
+ thumbnail.save(getThumbnailLocation(), "JPG");
+ } else {
+ QFile file(getThumbnailLocation());
+ if (!file.open(QIODevice::WriteOnly))
+ qWarning() << "Error opening file for writing" << file.fileName();
+ QDataStream stream(&file);
+ stream.writeRawData(bytes.constData(), bytes.size());
+ }
+
+ emit thumbnailLoaded();
+ loadingThumbnail = false;
+}
+
+void YTUser::requestError(QNetworkReply *reply) {
+ emit error(reply->errorString());
+ qWarning() << reply->errorString();
+ loading = false;
+ loadingThumbnail = false;
+}
+
+void YTUser::storeInfo() {
+ if (userId.isEmpty()) return;
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("update subscriptions set "
+ "user_name=?, name=?, description=?, thumb_url=?, loaded=? "
+ "where user_id=?");
+ qDebug() << userName;
+ query.bindValue(0, userName);
+ query.bindValue(1, displayName);
+ query.bindValue(2, description);
+ query.bindValue(3, thumbnailUrl);
+ query.bindValue(4, QDateTime::currentDateTime().toTime_t());
+ query.bindValue(5, userId);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+
+ loadThumbnail();
+}
+
+void YTUser::subscribe(QString userId) {
+ if (userId.isEmpty()) return;
+
+ uint now = QDateTime::currentDateTime().toTime_t();
+
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("insert into subscriptions "
+ "(user_id,added,watched,checked,views,notify_count)"
+ " values (?,?,?,0,0,0)");
+ query.bindValue(0, userId);
+ query.bindValue(1, now);
+ query.bindValue(2, now);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+
+ // This will call maybeLoadFromApi
+ YTUser::forId(userId);
+}
+
+void YTUser::unsubscribe(QString userId) {
+ if (userId.isEmpty()) return;
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("delete from subscriptions where user_id=?");
+ query.bindValue(0, userId);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+
+ query = QSqlQuery(db);
+ query.prepare("delete from subscriptions_videos where user_id=?");
+ query.bindValue(0, userId);
+ success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+
+ YTUser *user = cache.take(userId);
+ if (user) user->deleteLater();
+}
+
+bool YTUser::isSubscribed(QString userId) {
+ if (!Database::exists()) return false;
+ if (userId.isEmpty()) return false;
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("select count(*) from subscriptions where user_id=?");
+ query.bindValue(0, userId);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+ if (query.next())
+ return query.value(0).toInt() > 0;
+ return false;
+}
+
+void YTUser::updateChecked() {
+ if (userId.isEmpty()) return;
+
+ uint now = QDateTime::currentDateTime().toTime_t();
+ checked = now;
+
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("update subscriptions set checked=? where user_id=?");
+ query.bindValue(0, QDateTime::currentDateTime().toTime_t());
+ query.bindValue(1, userId);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+}
+
+void YTUser::updateWatched() {
+ if (userId.isEmpty()) return;
+
+ uint now = QDateTime::currentDateTime().toTime_t();
+ watched = now;
+ notifyCount = 0;
+
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("update subscriptions set watched=?, notify_count=0, views=views+1 where user_id=?");
+ query.bindValue(0, now);
+ query.bindValue(1, userId);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+}
+
+void YTUser::storeNotifyCount(int count) {
+ notifyCount = count;
+
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("update subscriptions set notify_count=? where user_id=?");
+ query.bindValue(0, count);
+ query.bindValue(1, userId);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+}
+
+bool YTUser::updateNotifyCount() {
+ QSqlDatabase db = Database::instance().getConnection();
+ QSqlQuery query(db);
+ query.prepare("select count(*) from subscriptions_videos "
+ "where channel_id=? and added>? and published>? and watched=0");
+ query.bindValue(0, id);
+ query.bindValue(1, watched);
+ query.bindValue(2, watched);
+ bool success = query.exec();
+ if (!success) qWarning() << query.lastQuery() << query.lastError().text();
+ if (!query.next()) {
+ qWarning() << __PRETTY_FUNCTION__ << "Count failed";
+ return false;
+ }
+ int count = query.value(0).toInt();
+ storeNotifyCount(count);
+ return count != notifyCount;
+}
diff --git a/src/ytuser.h b/src/ytuser.h
new file mode 100644
index 0000000..d7131cd
--- /dev/null
+++ b/src/ytuser.h
@@ -0,0 +1,104 @@
+/* $BEGIN_LICENSE
+
+This file is part of Minitube.
+Copyright 2009, Flavio Tordini
+
+Minitube is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Minitube 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 Minitube. If not, see .
+
+$END_LICENSE */
+
+#ifndef YTUSER_H
+#define YTUSER_H
+
+#include
+#include
+
+class YTUser : public QObject {
+
+ Q_OBJECT
+
+public:
+ static YTUser* forId(QString userId);
+ static void subscribe(QString userId);
+ static void unsubscribe(QString userId);
+ static bool isSubscribed(QString userId);
+
+ int getId() { return id; }
+ void setId(int id) { this->id = id; }
+
+ uint getChecked() { return checked; }
+ void updateChecked();
+
+ uint getWatched() const { return watched; }
+ void setWatched(uint watched) { this->watched = watched; }
+ void updateWatched();
+
+ int getNotifyCount() const { return notifyCount; }
+ void setNotifyCount(int count) { notifyCount = count; }
+ void storeNotifyCount(int count);
+ bool updateNotifyCount();
+
+ QString getUserId() const { return userId; }
+ QString getUserName() const { return userName; }
+ QString getDisplayName() const { return displayName; }
+ QString getDescription() const { return description; }
+ QString getCountryCode() const { return countryCode; }
+
+ void loadThumbnail();
+ const QString & getThumbnailDir();
+ QString getThumbnailLocation();
+ const QPixmap & getThumbnail() { return thumbnail; }
+
+ static QList getCachedUsers() { return cache.values(); }
+
+signals:
+ void infoLoaded();
+ void thumbnailLoaded();
+ void error(QString message);
+
+private slots:
+ void parseResponse(QByteArray bytes);
+ void requestError(QNetworkReply *reply);
+ void storeThumbnail(QByteArray bytes);
+
+private:
+ YTUser(QString userId, QObject *parent = 0);
+ void maybeLoadfromAPI();
+ void storeInfo();
+
+ static QHash cache;
+
+ int id;
+ QString userId;
+ QString userName;
+ QString displayName;
+ QString description;
+ QString countryCode;
+
+ QString thumbnailUrl;
+ QPixmap thumbnail;
+ bool loadingThumbnail;
+
+ int notifyCount;
+ uint checked;
+ uint watched;
+ uint loaded;
+ bool loading;
+};
+
+// This is required in order to use QPointer as a QVariant
+typedef QPointer YTUserPointer;
+Q_DECLARE_METATYPE(YTUserPointer)
+
+#endif // YTUSER_H
diff --git a/style.css b/style.css
index 9b980e9..9fdf263 100644
--- a/style.css
+++ b/style.css
@@ -75,75 +75,3 @@ SidebarHeader QComboBox::drop-down {
width: 0;
border-style: none;
}
-
-/* Ambiance */
-
-MainWindow[style="Ambiance"] > QToolBar {
- background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 #3c3b37, stop: 1 #474641);
-}
-
-MainWindow[style="Ambiance"] > QToolBar QToolButton,
-MainWindow[style="Ambiance"] > QToolBar QLabel {
- color: #dfdbd2;
-}
-
-MainWindow[style="Ambiance"] > QToolBar QToolButton:disabled {
- color: #8f8c86;
-}
-
-MainWindow[style="Ambiance"] > QToolBar QToolButton:hover {
- background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 #474641, stop: 1 #3c3b37);
- border-radius: 5px;
- border: 1px outset #3c3b37;
-}
-
-MainWindow[style="Ambiance"] > QToolBar QToolButton:pressed,
-MainWindow[style="Ambiance"] > QToolBar QToolButton:checked {
- background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
- stop: 0 #3b3a36, stop: 1 #363531);
- border-radius: 5px;
- border: 1px inset #292825;
-}
-
-
-MainWindow[style="Ambiance"] QSlider::groove:horizontal {
- border: 1px solid #808080;
- height: 8px;
- background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #ccc);
- border-radius: 5px;
-}
-
-MainWindow[style="Ambiance"] QSlider::sub-page:horizontal {
- border: 1px solid #808080;
- height: 8px;
- background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #6c6c6c, stop:1 #B1B1B1);
- border-radius: 5px;
-}
-
-MainWindow[style="Ambiance"] QSlider::handle:horizontal {
- border: 1px solid #5c5c5c;
- width: 14px;
- height: 16px;
- margin: -4px 0;
- border-radius: 8px;
- background: qradialgradient(
- cx: .5, cy: .5,
- fx: .33, fy: .33,
- radius: .5,
- stop: 0 #fff, stop: 1 #ccc);
-}
-
-MainWindow[style="Ambiance"] QSlider::handle:pressed {
- background: qradialgradient(
- cx: .5, cy: .5,
- fx: .33, fy: .33,
- radius: .5,
- stop: 0 #ccc, stop: 1 #9c9c9c);
-}
-
-MainWindow[style="Ambiance"] Phonon--SeekSlider QSlider::sub-page:horizontal {
- border: 1px solid #808080;
- background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #6c6c6c);
-}