pax_global_header00006660000000000000000000000064147733215520014523gustar00rootroot0000000000000052 comment=9d498244007158d2e9806e6ffee8e130967eae56 video-downloader-0.12.24/000077500000000000000000000000001477332155200151335ustar00rootroot00000000000000video-downloader-0.12.24/.gitignore000066400000000000000000000000531477332155200171210ustar00rootroot00000000000000*~ \#*\# /video-downloader_*.snap /po/*.mo video-downloader-0.12.24/COPYING000066400000000000000000001045141477332155200161730ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . video-downloader-0.12.24/README.md000066400000000000000000000043211477332155200164120ustar00rootroot00000000000000# Video Downloader [![Translation status](https://hosted.weblate.org/widgets/video-downloader/-/gui/svg-badge.svg)](https://hosted.weblate.org/engage/video-downloader/) Download videos from websites with an easy-to-use interface. Provides the following features: * Convert videos to MP3 * Supports password-protected and private videos * Download single videos or whole playlists * Automatically selects a video format based on your quality demands Based on [yt-dlp](https://github.com/yt-dlp/yt-dlp). ## Installation Download on Flathub ### Alternative installation methods * [Snap Store](https://snapcraft.io/video-downloader) * [Fedora](https://src.fedoraproject.org/rpms/video-downloader): `sudo dnf install video-downloader` * [Arch User Repository](https://aur.archlinux.org/packages/video-downloader) ## Translation We use [Weblate](https://hosted.weblate.org/engage/video-downloader/) to translate the UI, so feel free to contribute translations over there. ## Screenshots ![screenshot 1](https://raw.githubusercontent.com/Unrud/video-downloader/master/screenshots/1.png) ![screenshot 2](https://raw.githubusercontent.com/Unrud/video-downloader/master/screenshots/2.png) ![screenshot 3](https://raw.githubusercontent.com/Unrud/video-downloader/master/screenshots/3.png) ## Hidden configuration options The behavior of the program can be tweaked with GSettings. ### Automatic Subtitles List of additional automatic subtitles to download. The entry `all` matches all languages. The default is `[]`. #### Flatpak ``` flatpak run --command=gsettings com.github.unrud.VideoDownloader set com.github.unrud.VideoDownloader automatic-subtitles "['de','en']" ``` #### Snap ``` snap run --shell video-downloader -c 'gsettings "$@"' '' set com.github.unrud.VideoDownloader automatic-subtitles "['de','en']" ``` ## Debug To display messages from **yt-dlp** run program with the environment variable `G_MESSAGES_DEBUG=yt-dlp`. To display information about GOBject references, start the program with the environment variable `G_MESSAGES_DEBUG=gobject-ref`. video-downloader-0.12.24/build-aux/000077500000000000000000000000001477332155200170255ustar00rootroot00000000000000video-downloader-0.12.24/build-aux/meson/000077500000000000000000000000001477332155200201465ustar00rootroot00000000000000video-downloader-0.12.24/build-aux/meson/create-gresource.py000066400000000000000000000015701477332155200237620ustar00rootroot00000000000000import contextlib import os import sys import xml.etree.ElementTree as ET base_dirs = [ os.path.join(os.environ['MESON_SOURCE_ROOT'], os.environ['MESON_SUBDIR']), os.path.join(os.environ['MESON_BUILD_ROOT'], os.environ['MESON_SUBDIR']), ] _, prefix, *paths = sys.argv xml = ET.ElementTree() root_element = ET.Element('gresources') xml._setroot(root_element) resource_element = ET.Element('gresource') root_element.append(resource_element) resource_element.set('prefix', prefix) for path in paths: alias = path for base_dir in base_dirs: with contextlib.suppress(ValueError): alias = min(alias, os.path.relpath(path, base_dir), key=len) file_element = ET.Element('file') resource_element.append(file_element) file_element.set('alias', alias) file_element.text = path xml.write(sys.stdout.buffer, encoding='utf-8', xml_declaration=True) video-downloader-0.12.24/build-aux/meson/extract-xml.py000066400000000000000000000013001477332155200227620ustar00rootroot00000000000000import io import sys import xml.etree.ElementTree as ET from xml.sax import saxutils class CommentTreeBuilder(ET.TreeBuilder): def comment(self, data): self.start(ET.Comment, {}) self.data(data) self.end(ET.Comment) def make_xml_parser(): return ET.XMLParser(target=CommentTreeBuilder()) _, *flags, xml_path, search_xpath = sys.argv xml = ET.parse(xml_path, parser=make_xml_parser()) for element in xml.findall(search_xpath): xml._setroot(element) f = io.StringIO() xml.write(f, encoding='unicode') xml_text = f.getvalue() if '--escape' in flags: xml_text = saxutils.escape(xml_text) sys.stdout.buffer.write(xml_text.encode('utf-8')) video-downloader-0.12.24/build-aux/meson/merge-xml.py000066400000000000000000000011331477332155200224130ustar00rootroot00000000000000import sys import xml.etree.ElementTree as ET class CommentTreeBuilder(ET.TreeBuilder): def comment(self, data): self.start(ET.Comment, {}) self.data(data) self.end(ET.Comment) def make_xml_parser(): return ET.XMLParser(target=CommentTreeBuilder()) _, main_xml_path, insert_xml_path, insert_xpath = sys.argv main_xml = ET.parse(main_xml_path, parser=make_xml_parser()) insert_xml = ET.parse(insert_xml_path, parser=make_xml_parser()) main_xml.find(insert_xpath).append(insert_xml.getroot()) main_xml.write(sys.stdout.buffer, encoding='utf-8', xml_declaration=True) video-downloader-0.12.24/build-aux/meson/move.py000066400000000000000000000003621477332155200214670ustar00rootroot00000000000000from os import environ, path, sys from shutil import move destdir = environ.get('DESTDIR', '') prefix = environ['MESON_INSTALL_PREFIX'] source, dest = sys.argv[1:] move(destdir + path.join(prefix, source), destdir + path.join(prefix, dest)) video-downloader-0.12.24/com.github.unrud.VideoDownloader.json000066400000000000000000000147441477332155200243170ustar00rootroot00000000000000{ "app-id": "com.github.unrud.VideoDownloader", "runtime": "org.gnome.Platform", "runtime-version": "47", "sdk": "org.gnome.Sdk", "command": "video-downloader", "finish-args": [ "--share=network", "--share=ipc", "--socket=fallback-x11", "--device=dri", "--socket=wayland", "--filesystem=xdg-download/VideoDownloader:create" ], "cleanup": [ "/include", "/lib/pkgconfig", "/man", "/share/doc", "/share/gtk-doc", "/share/man", "/share/pkgconfig", "*.la", "*.a" ], "cleanup-commands": [ "mkdir -p /app/lib/ffmpeg" ], "add-extensions": { "org.freedesktop.Platform.ffmpeg-full": { "directory": "lib/ffmpeg", "version": "24.08", "add-ld-path": "." } }, "modules": [ { "name": "pyxattr", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/iustin/pyxattr/archive/refs/tags/v0.8.1.tar.gz", "sha256": "ce7ef783e751b96610a6eb32fc49a89340b5dc575fbe15054ce7935ebaf49edb", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/iustin/pyxattr/releases/latest", "version-query": ".tag_name", "url-query": "\"https://github.com/iustin/pyxattr/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "mutagen", "buildsystem": "simple", "build-commands": [ "pip3 install --no-build-isolation --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/quodlibet/mutagen/archive/refs/tags/release-1.47.0.tar.gz", "sha256": "f7489e19d375c31ba1962ab19e11eca8b9f86f05bfd99cef467f8dd875d8941e", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/quodlibet/mutagen/releases/latest", "version-query": ".tag_name", "url-query": "\"https://github.com/quodlibet/mutagen/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "pycryptodomex", "buildsystem": "simple", "build-commands": [ "touch .separate_namespace", "pip3 install --no-build-isolation --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/Legrandin/pycryptodome/archive/refs/tags/v3.22.0.tar.gz", "sha256": "d1499d50dfe0628fe45157956e9c522011f37043a2d3f2457631c97e56f9e6c1", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/Legrandin/pycryptodome/tags", "version-query": "[.[].name | select(test(\"^v?[0-9.]+$\"))] | sort_by(sub(\"^v\"; \"\") | split(\".\") | map(tonumber))[-1]", "url-query": "\"https://github.com/Legrandin/pycryptodome/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "websockets", "buildsystem": "simple", "build-commands": [ "pip3 install --no-build-isolation --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/aaugustin/websockets/archive/refs/tags/15.0.1.tar.gz", "sha256": "8451495265af3e368f794c4dc15c99ce90c771d95560f542bff8c64b5455af3b", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/aaugustin/websockets/tags", "version-query": "[.[].name | select(test(\"^v?[0-9.]+$\"))] | sort_by(sub(\"^v\"; \"\") | split(\".\") | map(tonumber))[-1]", "url-query": "\"https://github.com/aaugustin/websockets/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "brotli", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/google/brotli/archive/refs/tags/v1.1.0.tar.gz", "sha256": "e720a6ca29428b803f4ad165371771f5398faba397edf6778837a18599ea13ff", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/google/brotli/releases/latest", "version-query": ".tag_name", "url-query": "\"https://github.com/google/brotli/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "yt-dlp", "buildsystem": "simple", "build-commands": [ "pip3 install --no-dependencies --prefix=/app \"$(echo *.whl)[default]\"" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/a8/bf/7b0affb8f163376309696cfd1c677818fa0969fbb9d88225087208799afe/yt_dlp-2025.3.31-py3-none-any.whl", "sha256": "8ecb3aa218a3bebe431119f513a8972b9b9d992edf67168c00ab92329a03baec", "x-checker-data": { "type": "pypi", "name": "yt-dlp", "packagetype": "bdist_wheel" } } ] }, { "name": "video-downloader", "builddir": true, "buildsystem": "meson", "sources": [ { "type": "git", "path": "." } ] } ] } video-downloader-0.12.24/data/000077500000000000000000000000001477332155200160445ustar00rootroot00000000000000video-downloader-0.12.24/data/com.github.unrud.VideoDownloader-symbolic.svg000066400000000000000000000012361477332155200266650ustar00rootroot00000000000000 video-downloader-0.12.24/data/com.github.unrud.VideoDownloader.Source.svg000066400000000000000000000653631477332155200263200ustar00rootroot00000000000000 Adwaita Icon Template image/svg+xml GNOME Design Team Adwaita Icon Template Hicolor Symbolic video-downloader-0.12.24/data/com.github.unrud.VideoDownloader.desktop.in000066400000000000000000000007461477332155200263320ustar00rootroot00000000000000[Desktop Entry] Name=Video Downloader Comment=Download web videos Exec=video-downloader Icon=com.github.unrud.VideoDownloader Terminal=false Type=Application Categories=Network;GTK; StartupNotify=true X-GNOME-UsesNotifications=true Actions=new-window; # TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=YouTube;Download; [Desktop Action new-window] Name=New Window Exec=video-downloader video-downloader-0.12.24/data/com.github.unrud.VideoDownloader.gschema.xml000066400000000000000000000013341477332155200264540ustar00rootroot00000000000000 'xdg-download/VideoDownloader' false [] 'audio' 1080 video-downloader-0.12.24/data/com.github.unrud.VideoDownloader.metainfo-releases.xml.in000066400000000000000000000607051477332155200310640ustar00rootroot00000000000000
  • Add Arabic translation
  • Update Catalan translation
  • Update Uzbek translation
  • Add Tamil translation
  • Update Indonesian translation
  • Update Catalan translation
  • Only check file extension when mode is "audio"
  • Limit ID length
  • Add Basque translation
  • Add Portuguese (Brazil) translation
  • Fix download not starting in rare circumstances
  • Update Polish translation
  • Update Romanian translation
  • Update Belarusian translation
  • Update Chinese translation
  • Update Czech translation
  • Update Hebrew translation
  • Update Portuguese translation
  • Update Portuguese translation
  • Update Ukrainian translation
  • Add Greek translation
  • Add Polish translation
  • Limit status text update rate
  • Add Estonian translation
  • Update French translation
  • Add Finnish translation
  • Update Dutch translation
  • Update Italian translation
  • Update Russian translation
  • Update Slovak translation
  • Update Croatian translation
  • Update Czech translation
  • Update Dutch translation
  • Update Hindi translation
  • Update Hungarian translation
  • Update Japanese translation
  • Update Spanish translation
  • Update Swedish translation
  • Update Turkish translation
  • Update Ukrainian translation
  • Update Appdata
  • Workaround for xdg-desktop-portal bug that causes FileNotFoundError
  • Add Hindi translation
  • Update Uzbek translation
  • Add Kurdish translation
  • Display of downloaded titles on the success page and in the notification
  • Improved readability of links in the details view in dark mode
  • Skip missing thumbnails and subtitles
  • Update Slovak translation
  • Update Persian translation
  • Update Czech translation
  • Add Spanish translation
  • Update Ukrainian translation
  • Add Chinese (Simplified) translation
  • Update Indonesian translation
  • Add Chinese (Traditional) translation
  • Add Romanian translation
  • Fix display state of "Prefer MPEG format" switch after startup
  • Add Korean translation
  • Add Hebrew translation
  • Update Catalan translation
  • Show filenames when download is finished
  • Fix open download location without OpenURI portal
  • Add Indonesian translation
  • Update Croatian translation
  • Update Czech translation
  • Update Italian translation
  • Update Japanese translation
  • Add Belarusian translation
  • Update Dutch translation
  • Update Hungarian translation
  • Update Portuguese translation
  • Update Russian translation
  • Update German translation
  • Add option to change download folder
  • Fix opening download location when file deleted
  • Add Norwegian translation
  • Add Ukrainian translation
  • Update French translation
  • Update Italian translation
  • Update Spanish translation
  • Update Swedish translation
  • Update Turkish translation
  • Workaround for focusing the URL input field at program startup
  • Update French translation
  • Update Italian translation
  • Skip unavailable videos
  • Add switch to prefer MPEG format
  • Add tooltips
  • Add navigation shortcuts
  • Update Turkish translation
  • Improve about dialog
  • Update translations
  • Show library versions and environment in about dialog
  • Fix display activity during MP3 conversion
  • Update Hungarian translation
  • Use OpenURI portal
  • Redesign start page
  • Update French translation
  • Update German translation
  • Update Italian translation
  • Add keyboard shortcuts
  • Improve keyboard navigation
  • New start page layout
  • Fix memory leaks
  • Remove dark/light switcher
  • Remove metadata migration
  • Fix dialog cancel button
  • Remove quotation marks in URL input field when opening a new window
  • Update French translation
  • Switch to GTK 4
  • Set fixed height for thumbnail
  • Trim whitespace of shortened file names
  • Fix dialog windows blocking all instances
  • Apply settings immediately
  • Remove file-based locking
  • Update Turkish translation
  • Add support for freedesktop color-scheme preference
  • Add Russian translation
  • Add Uzbek translation
  • Update Spanish translation
  • Set input purpose of entry widgets
  • Fix subtitles containing multiple consecutive captions with leading spaces
  • Select automatic subtitles based on locale settings
  • Add support for translated subtitles
  • Minor improvements
  • Fix playlist download
  • Fix subtitles containing captions with leading spaces
  • Add automatic-subtitles setting
  • Switch from youtube-dl to yt-dlp
  • Download subtitles only once
  • Don't download subtitles and thumbnail while discovering playlists
  • Save info json and thumbnail in *.part directory
  • Improve prefer-mpeg setting
  • Add Catalan translation
  • Fix tests for Python<3.9
  • Fix tests
  • Update Croatian translation
  • Update Czech translation
  • Improve detection of authentication requests
  • Fix download error when video id is too long
  • Fix reporting of FFMPEG error message
  • Add Turkish translation
  • Improve compatibility of notifications with some desktop environments
  • Fix minor bug which could cause downloads to fail under rare circumstances
  • Update Slovak translation
  • Fix cancelling when external downloader is used by youtube-dl
  • Fix warning when closing window while download is in progress
  • Show notification when download is finished
  • Add "New Window" to menu
  • Update Hungarian translation
  • Run single instance with multiple windows
  • Update Dutch translation
  • Improve UI
  • Update Croatian translation
  • Add Croatian translation
  • Exclude release notes from translations
  • Add Czech translation
  • Update Italian translation
  • Redesign finish and error page
  • Don't save video description
  • Update Dutch translation
  • Add shortcut for menu
  • Implement dark mode switcher
  • Add Portuguese translation
  • Add Swedish translation
  • Update Japanese translation
  • Update italian translation
  • Use adaptive layout
  • Add about dialog
  • youtube-dl is back
  • Update dutch translation
  • Add slovak translation
  • Enable farsi/persian translation
  • Display unexpected errors
  • Add farsi/persian translation
  • Update hungarian translation
  • Update italian translation
  • Embed metadata
  • Add hungarian translation
  • Allow download to filesystem without xattr support
  • Improve error handling
  • Show activity while converting audio to MP3
  • Skip unsupported subtitles preventing download failure
  • Improve format selection
  • Ignore unsupported locale error
  • Add dutch translation
  • New logo (by @bertob)
  • Embed subtitles in videos
  • Fix download of incompatible audio and video formats
  • Kill remaining subprocesses of youtube-dl when cancelling downloads and exiting program
  • New logo
  • Add symbolic icon
  • Save downloads as TITLE.EXT (instead of TITLE-ID-FORMAT.EXT)
  • Store all partial files for a download in a folder named TITLE.part
  • Skip audio files that are already downloaded
  • Polish the GUI (by @Kekun)
  • Display errors accessing the download folder in the GUI
  • Use file-based locking to prevent multiple instances breaking downloads by writing to the same partial files
  • Cleanup temporary files of cancelled downloads
  • Remove ImageMagick dependency
  • New logo
  • Fix zero division error causing some downloads to fail
  • Retry downloads up to 10 times before giving up
  • Limit title length to 150 characters in file names
  • Fix bugs with thumbnails in unsupported formats
  • Limit size of thumbnails to 1024x1024 pixel
  • Add Japanese translation
  • Add French translation
  • Add action to open new window (Middle-click in Gnome Shell)
  • Allow skipping videos that require authentication
  • Fix detection of private videos
  • Add --url=URL commandline argument
  • Add Italian and Spanish translation
  • Show downloaded file in file manager
  • Add German translation

Fix format selection for extractors that provide either video width or height.

  • Save thumbnail in audio files
  • Save metadata in extended attributes
  • Snap/Flatpak: Remove support for RTMP
  • Snap: Remove video-downloader.youtube-dl

Stop downloader in case of error.

  • Allow multiple instances
  • Add description to authentication requests
  • Add format id to filenames
  • Fix download of files bigger than 4 GiB

Fix link to download folder.

Remember last settings and switch to GTK.

Adjust menu colors to theme.

Fix crash with non-integer X DPI.

Move AppData to metainfo.

Download all videos in playlist.

Set window icon.

Make window resizeable and fix font sizes.

Stop progress bar jumping around.

Support videos with emoticons in the title.

Initial release.

video-downloader-0.12.24/data/com.github.unrud.VideoDownloader.metainfo.xml.in000066400000000000000000000041401477332155200272520ustar00rootroot00000000000000 com.github.unrud.VideoDownloader CC0-1.0 GPL-3.0-or-later Video Downloader Download web videos

Download videos from websites with an easy-to-use interface. Provides the following features:

  • Convert videos to MP3
  • Supports password-protected and private videos
  • Download single videos or whole playlists
  • Automatically selects a video format based on your quality demands

Based on yt-dlp.

com.github.unrud.VideoDownloader.desktop https://github.com/Unrud/video-downloader/issues https://github.com/Unrud/video-downloader https://github.com/Unrud/video-downloader https://hosted.weblate.org/engage/video-downloader/ Unrud Unrud #ffbe6f #81111e unrud_AT_outlook.com video-downloader https://raw.githubusercontent.com/Unrud/video-downloader/v0.12.24/screenshots/1.png https://raw.githubusercontent.com/Unrud/video-downloader/v0.12.24/screenshots/2.png https://raw.githubusercontent.com/Unrud/video-downloader/v0.12.24/screenshots/3.png
video-downloader-0.12.24/data/com.github.unrud.VideoDownloader.svg000066400000000000000000000054151477332155200250510ustar00rootroot00000000000000 video-downloader-0.12.24/data/meson.build000066400000000000000000000050271477332155200202120ustar00rootroot00000000000000desktop_file = i18n.merge_file( input: 'com.github.unrud.VideoDownloader.desktop.in', output: 'com.github.unrud.VideoDownloader.desktop', type: 'desktop', po_dir: '../po', install: true, install_dir: get_option('datadir') / 'applications', ) desktop_utils = find_program('desktop-file-validate', required: false) if desktop_utils.found() test('Validate desktop file', desktop_utils, args: [desktop_file], ) endif base_appstream_file = i18n.merge_file( input: 'com.github.unrud.VideoDownloader.metainfo.xml.in', output: 'com.github.unrud.VideoDownloader-base.metainfo.xml', po_dir: '../po', ) appstream_file = custom_target('com.github.unrud.VideoDownloader.metainfo.xml', input: [ base_appstream_file, 'com.github.unrud.VideoDownloader.metainfo-releases.xml.in', ], output: 'com.github.unrud.VideoDownloader.metainfo.xml', command: [ python, merge_xml_aux, '@INPUT0@', '@INPUT1@', '.', ], capture: true, install: true, install_dir: get_option('datadir') / 'metainfo', ) appstream_util = find_program('appstream-util', required: false) if appstream_util.found() test('Validate appstream file', appstream_util, args: ['validate-relax', appstream_file], ) endif install_data('com.github.unrud.VideoDownloader.gschema.xml', install_dir: get_option('datadir') / 'glib-2.0' / 'schemas', ) compile_schemas = find_program('glib-compile-schemas', required: false) if compile_schemas.found() test('Validate schema file', compile_schemas, args: ['--strict', '--dry-run', meson.current_source_dir()], ) endif icon_id = 'com.github.unrud.VideoDownloader' icon_svg = icon_id + '.svg' install_data(icon_svg, install_dir: get_option('datadir') / 'icons' / 'hicolor' / 'scalable' / 'apps', ) install_data(icon_id + '-symbolic.svg', install_dir: get_option('datadir') / 'icons' / 'hicolor' / 'symbolic' / 'apps', ) rsvg_util = find_program('rsvg-convert') foreach res : [16, 32, 48, 64, 128, 256, 512] icon_install_dir = ( get_option('datadir') / 'icons' / 'hicolor' / '@0@x@0@'.format(res) / 'apps' ) icon_png = '@0@_@1@.png'.format(icon_id, res) custom_target(icon_png, input: icon_svg, output: icon_png, command: [ rsvg_util, '--height', '@0@'.format(res), '--keep-aspect-ratio', '--format', 'png', '--output', '@OUTPUT@', '@INPUT@', ], install: true, install_dir: icon_install_dir, ) # rename icon after installation meson.add_install_script(python, move_aux, icon_install_dir / icon_png, icon_install_dir / icon_id + '.png', ) endforeach video-downloader-0.12.24/meson.build000066400000000000000000000023551477332155200173020ustar00rootroot00000000000000project('video-downloader', version: '0.12.24', meson_version: '>= 0.62.0', default_options: ['warning_level=2', 'werror=false'], ) python_sources_for_linting = [] i18n = import('i18n') gnome = import('gnome') python = import('python').find_installation('python3') python_for_linting = import('python').find_installation('python3', modules: ['flake8'], required: false, ) create_gresource_aux = meson.current_source_dir() / 'build-aux' / 'meson' / 'create-gresource.py' python_sources_for_linting += create_gresource_aux extract_xml_aux = meson.current_source_dir() / 'build-aux' / 'meson' / 'extract-xml.py' python_sources_for_linting += extract_xml_aux merge_xml_aux = meson.current_source_dir() / 'build-aux' / 'meson' / 'merge-xml.py' python_sources_for_linting += merge_xml_aux move_aux = meson.current_source_dir() / 'build-aux' / 'meson' / 'move.py' python_sources_for_linting += move_aux subdir('data') subdir('src') subdir('po') gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true, update_desktop_database: true, ) if (python_for_linting.found() and python_sources_for_linting.length() > 0) test('Lint python sources', python_for_linting, args: ['-m', 'flake8', python_sources_for_linting], ) endif video-downloader-0.12.24/po/000077500000000000000000000000001477332155200155515ustar00rootroot00000000000000video-downloader-0.12.24/po/LINGUAS000066400000000000000000000002031477332155200165710ustar00rootroot00000000000000be ca cs de es fa fr he hr hu id it ja ko nb_NO nl pt ro ru sk sv tr uk uz zh_Hans zh_Hant ckb az hi fi et el pl ml pt_BR eu ta ar video-downloader-0.12.24/po/POTFILES000066400000000000000000000010101477332155200167110ustar00rootroot00000000000000data/com.github.unrud.VideoDownloader.metainfo.xml.in data/com.github.unrud.VideoDownloader.desktop.in data/com.github.unrud.VideoDownloader.gschema.xml src/about_dialog.py src/about_dialog.ui.in src/authentication_dialog.py src/authentication_dialog_login.ui src/authentication_dialog_password.ui src/main.py src/model.py src/playlist_dialog.py src/shortcuts_dialog.py src/shortcuts_dialog.ui src/util/connection.py src/util/__init__.py src/util/path.py src/util/response.py src/util/rpc.py src/window.py src/window.ui video-downloader-0.12.24/po/ar.po000066400000000000000000000174221477332155200165210ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # The Best Way , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-04-02 20:34+0000\n" "Last-Translator: The Best Way \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Weblate 5.11-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "تنزيل مقاطع فيديو من الويب" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "قم بتنزيل مقاطع الفيديو من مواقع الويب بواجهة سهلة الاستخدام تتوفر الميزات " "التالية:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "التحويل الى ملف صوتي بصيغة MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "يدعم مقاطع الفيديو الخاصة والمحمية بكلمة مرور" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "تحميل مقاطع الفيديو الفردية أو قوائم تشغيل بالكامل" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "أختيار تلقائيًا لتنسيق الفيديو بناءً على متطلبات الجودة الخاصة بك" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "" "مبنى على yt-dlp هو برنامج مفتوح المصدر يستخدم لتنزيل مقاطع الفيديو والصوت" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "نافذة جديدة" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "المصادقة المطلوبة" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "إلغاء" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "تسجيل الدخول" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "تخطى" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "الفيديو ليس عام" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "اسم المستخدم" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "كلمة المرور" #: src/main.py:38 msgid "Prefill URL field" msgstr "رابط الملء التلقائي" #: src/model.py:67 msgid "Best" msgstr "الأفضل" #: src/model.py:68 msgid "4320p (8K)" msgstr "الجودة 4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "الجودة 2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "الجودة 1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "الجودة 1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "الجودة 720p (HD)" #: src/model.py:73 msgid "480p" msgstr "الجودة 480p" #: src/model.py:74 msgid "360p" msgstr "الجودة 360p" #: src/model.py:75 msgid "240p" msgstr "الجودة 240p" #: src/model.py:76 msgid "144p" msgstr "الجودة 144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "مجلد تنزيل غير صالح" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "المسار التالي غير موجود" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "تم رفض الوصول" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "هل تريد تحميل قائمة التشغيل؟" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "الفيديو جزء من قائمة التشغيل." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "فيديو واحد" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "جميع مقاطع الفيديو في قائمة التشغيل" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "عام" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "فتح القائمة" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "إغلاق النافذة" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "خروج" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "إختصارات لوحة المفاتحي" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "التنقل" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "العودة الى الخلف" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "التبديل إلى الصوت" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "التبديل إلى الفيديو" #: src/window.py:187 msgid "Downloading" msgstr "جاري التحميل" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} من {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "غير معورف" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "خطاء في التحميل" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "تم الإنتهاء من التحميل بنجاح" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "فتح موقع التحميلات" #: src/window.py:329 msgid "Reset to Default" msgstr "إعادة الضبط الى الوضع الإفتراضي" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "تغيير موقع التحميل" #: src/window.py:360 msgid "Invalid folder selected" msgstr "خطاء في تحديد الممجلد" #: src/window.py:364 msgid "Select Folder" msgstr "تحديد المجلد" #: src/window.ui:41 msgid "About Video Downloader" msgstr "حول Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "القائمة الرئيسية" #: src/window.ui:105 msgid "Audio" msgstr "الصوتيات" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "عنوان الرابط URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "تحميل" #: src/window.ui:156 msgid "Video" msgstr "الفيديوهات" #: src/window.ui:186 msgid "Resolution" msgstr "الجودة" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "استخدام صيغ الفيديوالصوت التابعة لعائلة MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "العودة" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "التفاصيل" video-downloader-0.12.24/po/az.po000066400000000000000000000126371477332155200165340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Ariz Mirzəzadə , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: az\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "" #: src/main.py:38 msgid "Prefill URL field" msgstr "" #: src/model.py:67 msgid "Best" msgstr "" #: src/model.py:68 msgid "4320p (8K)" msgstr "" #: src/model.py:69 msgid "2160p (4K)" msgstr "" #: src/model.py:70 msgid "1440p (HD)" msgstr "" #: src/model.py:71 msgid "1080p (HD)" msgstr "" #: src/model.py:72 msgid "720p (HD)" msgstr "" #: src/model.py:73 msgid "480p" msgstr "" #: src/model.py:74 msgid "360p" msgstr "" #: src/model.py:75 msgid "240p" msgstr "" #: src/model.py:76 msgid "144p" msgstr "" #: src/model.py:159 msgid "Invalid download folder" msgstr "" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "" #: src/window.py:187 msgid "Downloading" msgstr "" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "" #: src/window.py:329 msgid "Reset to Default" msgstr "" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "" #: src/window.py:360 msgid "Invalid folder selected" msgstr "" #: src/window.py:364 msgid "Select Folder" msgstr "" #: src/window.ui:41 msgid "About Video Downloader" msgstr "" #: src/window.ui:91 msgid "Main Menu" msgstr "" #: src/window.ui:105 msgid "Audio" msgstr "" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "" #: src/window.ui:156 msgid "Video" msgstr "" #: src/window.ui:186 msgid "Resolution" msgstr "" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "" video-downloader-0.12.24/po/be.po000066400000000000000000000172731477332155200165110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Troja , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-08-02 23:04+0000\n" "Last-Translator: Troja \n" "Language-Team: Belarusian \n" "Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Спампуйце відэа з вэб-сайтаў" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Спампоўвайце відэа з вэб-сайтаў з простым у выкарыстанні інтэрфейсам. " "Прадастаўляе наступныя магчымасці:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Канвертаваць відэа ў MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Падтрымлівае абароненыя паролем і прыватныя відэа" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Спампуйце асобныя відэа ці цэлыя спісы прайгравання" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Аўтаматычна выбірае фармат відэа ў залежнасці ад вашых патрабаванняў да " "якасці" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Заснаваны на yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Спампаваць;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Новае акно" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Патрабуецца аўтэнтыфікацыя" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Адмяніць" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Увайсці" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Прапусціць" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Відэа не з'яўляецца агульнадаступным." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Імя карыстальніка" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Пароль" #: src/main.py:38 msgid "Prefill URL field" msgstr "Поле URL профілю" #: src/model.py:67 msgid "Best" msgstr "Найлепшае" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Няправільная папка спампоўкі" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Не каталог" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "У доступе адмоўлена" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Спампаваць спіс прайгравання?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Відэа з'яўляецца часткай плэйліста." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Асобнае відэа" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Усе відэа ў спісе прайгравання" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Агульны" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Адкрыць меню" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Зачыніць акно" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Выйсці" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Спалучэнні клавіш" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Навігацыя" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Вярнуцца назад" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Пераключыцца на Аўдыё" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Пераключыцца на Відэа" #: src/window.py:187 msgid "Downloading" msgstr "Спампоўка" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} з {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "невядома" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Памылка спампоўкі" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Спампоўка скончана" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Адкрыйце месцазнаходжанне загрузкі" #: src/window.py:329 msgid "Reset to Default" msgstr "Скід па змаўчанні" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Змяніць месца загрузкі" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Выбрана няправільная папка" #: src/window.py:364 msgid "Select Folder" msgstr "Выберыце папку" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Аб Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Галоўнае меню" #: src/window.ui:105 msgid "Audio" msgstr "Аўдыё" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Спампаваць" #: src/window.ui:156 msgid "Video" msgstr "Відэа" #: src/window.ui:186 msgid "Resolution" msgstr "Дазвол" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Аддайце перавагу фармату MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Назад" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Дэталі" video-downloader-0.12.24/po/ca.po000066400000000000000000000160021477332155200164730ustar00rootroot00000000000000# Catalan translation for video-downloader. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Ícar N. S. , 2021. # Roger VC , 2023. # Eder Etxebarria Rojo , 2024. # pau oliveres , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-03-28 09:01+0000\n" "Last-Translator: pau oliveres \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.11-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Descarregador de vídeo" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Descarrega vídeos de la web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Descarrega vídeos des de llocs web amb una interfície fàcil d'usar. Suporta " "les següents característiques:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converteix vídeos a MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Suporta vídeos protegits per contrasenya i privats" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Descarrega vídeos individuals o llistes de reproducció completes" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Selecciona automàticament un format de vídeo basat en la vostra resolució " "preferida" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basat en yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "Youtube;Descarrega;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Finestra nova" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Cal autenticació" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancel·la" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Inicia la sessió" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Omet" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "El vídeo no és públic." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nom d'usuari" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Contrasenya" #: src/main.py:38 msgid "Prefill URL field" msgstr "Omple el camp de la URL" #: src/model.py:67 msgid "Best" msgstr "Millor" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Carpeta de baixada no vàlida" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "No és un directori" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permís denegat" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Voleu baixar la llista de reproducció?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "El vídeo forma part d'una llista de reproducció." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Un sol vídeo" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Tots els vídeos a la llista de reproducció" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "General" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Obre el menú" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Tanca la finestra" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Surt" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Dreceres del teclat" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navegació" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Ves enrere" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Canviar a Àudio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Canviar a Vídeo" #: src/window.py:187 msgid "Downloading" msgstr "S'està baixant" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "desconegut" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Ha fallat la baixada" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "La baixada ha finalitzat" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Obre la ubicació de la descàrrega" #: src/window.py:329 msgid "Reset to Default" msgstr "Restableix al valor per defecte" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Canviar la ubicació de baixada" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Carpeta seleccionada no vàlida" #: src/window.py:364 msgid "Select Folder" msgstr "Seleccionar carpeta" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Sobre el Descarregador de vídeo" #: src/window.ui:91 msgid "Main Menu" msgstr "Menú principal" #: src/window.ui:105 msgid "Audio" msgstr "Àudio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Baixa" #: src/window.ui:156 msgid "Video" msgstr "Vídeo" #: src/window.ui:186 msgid "Resolution" msgstr "Resolució" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Prefereix el format MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Enrere" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalls" video-downloader-0.12.24/po/ckb.po000066400000000000000000000172151477332155200166560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # "Hoshmand M. Qadir" , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2023-10-14 21:23+0000\n" "Last-Translator: \"Hoshmand M. Qadir\" \n" "Language-Team: Kurdish (Central) \n" "Language: ckb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.1-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "دابەزێنەری ڤیدیۆ" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 #, fuzzy msgid "Download web videos" msgstr "داگرتنی ڤیدیۆ لە ماڵپەڕەکانی وەک یوتیوب و چەندانی تر" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "داگرتنی ڤیدیۆ لە ماڵپەڕەکانەوە بە ڕووکارێکی ئاسان بۆ بەکارهێنان. ئەم " "تایبەتمەندیانەی خوارەوە پێشکەش دەکات:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "گۆڕینی ڤیدیۆکان بۆ MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "پشتگیری لە ڤیدیۆی پارێزراو بە وشەی نهێنی و تایبەت دەکات" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "تاکە ڤیدیۆ یان تەواوی پلەی لیستەکان دابەزێنە" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "بە شێوەیەکی ئۆتۆماتیکی فۆرماتێکی ڤیدیۆیی هەڵدەبژێرێت بە پشتبەستن بە " "داواکارییەکانی کوالیتی" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "لەسەر بنەمای yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "پەنجەرەی نوێ" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "سەلماندن پێویستە" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ڕەتکردنەوە" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "چوونە ژوورەوە" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "پەڕاندن" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "ڤیدیۆکە گشتی نییە." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "ناوی بەکارهێنەر" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "وشەی نهێنی" #: src/main.py:38 msgid "Prefill URL field" msgstr "مەیدانی URL پێش پڕکردنەوە" #: src/model.py:67 msgid "Best" msgstr "باشترین" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "فۆڵدەری دابەزاندنی نادروست" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "فۆڵدەر نییە" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "مۆڵەت ڕەتکرایەوە" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "داگرتنی پلەی لیست؟" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "ڤیدیۆکە بەشێکە لە پلەی لیستێک." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "تاکە ڤیدیۆ" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "هەموو ڤیدیۆکان لە پلەیلیستدان" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "گشتی" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "مێنۆ بکەرەوە" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "پەنجەرەکە داخە" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "دەرچوون" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "کورتکراوەکانی تەختەکلیل" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "گەڕان" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "بگەڕێوە دواوە" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "بگۆڕە بۆ دەنگ" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "بگۆڕە بۆ ڤیدیۆ" #: src/window.py:187 msgid "Downloading" msgstr "دابەزاندن" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} لە {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "نەزانراو" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "داگرتنەکە سەرکەوتوو نەبوو" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "داگرتن تەواو بوو" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "شوێنی دابەزاندن بکەرەوە" #: src/window.py:329 msgid "Reset to Default" msgstr "ڕێست بکە بۆ باری سەرەکی" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "گۆڕینی شوێنی دابەزاندن" #: src/window.py:360 msgid "Invalid folder selected" msgstr "فۆڵدەری نادروست هەڵبژێردرا" #: src/window.py:364 msgid "Select Folder" msgstr "فۆڵدەر هەڵبژێرە" #: src/window.ui:41 msgid "About Video Downloader" msgstr "دەربارەی ڤیدیۆ دابەزێنەر" #: src/window.ui:91 msgid "Main Menu" msgstr "لیستی سه‌ره‌كی" #: src/window.ui:105 msgid "Audio" msgstr "دەنگ" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "دابەزاندن" #: src/window.ui:156 msgid "Video" msgstr "ڤیدیۆ" #: src/window.ui:186 msgid "Resolution" msgstr "ڕونی" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "فۆرماتەکەی MPEG بە باشتر دەزانرێت" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "گەڕانەوە" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "ووردەکاریەکان" video-downloader-0.12.24/po/cs.po000066400000000000000000000154551477332155200165300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Vojtěch Perník , 2021. # vikdevelop , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-08-02 23:04+0000\n" "Last-Translator: vikdevelop \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Stahování videí z webu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Stahujte videa z internetu pomocí jednoduchého rozhraní s následujícími " "funkcemi:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Převod videí do MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Podpora zaheslovaných a soukromých videí" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Stažení jednoho videa nebo celých playlistů" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Automatický výběr formátu videa podle zvolených požadavků na kvalitu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Založen na yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nové okno" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Je vyžadováno ověření" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Zrušit" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Přihlásit se" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Přeskočit" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video není veřejné." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Uživatelské jméno" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Heslo" #: src/main.py:38 msgid "Prefill URL field" msgstr "Předvyplněné pole URL" #: src/model.py:67 msgid "Best" msgstr "Nejlepší" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Neplatná složka pro stahování" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nikoliv adresář" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Povolení zamítnuto" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Stáhnout playlist?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video je součástí playlistu." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Jedno video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Všechna videa z playlistu" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Obecné" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Otevřít nabídku" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Zavřít okno" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Ukončit" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigace" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Přejít zpět" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Přejít ke Zvuku" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Přejít k Videu" #: src/window.py:187 msgid "Downloading" msgstr "Stahování" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} z {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "neznámý" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Stahování se nezdařilo" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Stahování dokončeno" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Otevřít adresář pro stahování" #: src/window.py:329 msgid "Reset to Default" msgstr "Resetovat na výchozí hodnoty" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Vybrat složku pro stahování" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Vybrána nesprávná složka" #: src/window.py:364 msgid "Select Folder" msgstr "Vybrat složku" #: src/window.ui:41 msgid "About Video Downloader" msgstr "O aplikaci Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Hlavní nabídka" #: src/window.ui:105 msgid "Audio" msgstr "Zvuk" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Stáhnout" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Rozlišení" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferovat formát MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Zpět" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detaily" video-downloader-0.12.24/po/de.po000066400000000000000000000154561477332155200165140ustar00rootroot00000000000000# German translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Roy Meissner , 2020. # Unrud , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2023-03-07 16:16+0000\n" "Last-Translator: Unrud \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.16.2-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Webvideos herunterladen" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Über eine einfach zu bedienende Oberfläche können Videos von vielen " "Webseiten heruntergeladen werden. Das Programm bietet:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Videos nach MP3 zu konvertieren" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Passwortgeschütze und private Videos herunterzuladen" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Einzelne Videos und ganze Wiedergabelisten herunterzuladen" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Automatisch das Videoformat auszuwählen, das den eigenen Qualitätsansprüchen " "entspricht" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basiert auf yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Neues Fenster" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Authentifizierung erforderlich" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Abbrechen" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Anmelden" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Überspringen" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Das Video ist nicht öffentlich." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Benutzername" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Passwort" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL-Feld vorausfüllen" #: src/model.py:67 msgid "Best" msgstr "Beste" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ungültiger Download-Ordner" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Kein Ordner" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Erlaubnis verweigert" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Wiedergabeliste herunterladen?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Das Video ist Teil einer Wiedergabeliste." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Einzelnes Video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Alle Videos der Liste" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Allgemein" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menü öffnen" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Fenster schließen" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Beenden" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Tastenkürzel" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigation" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Zurück gehen" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Zu Audio wechseln" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Zu Video wechseln" #: src/window.py:187 msgid "Downloading" msgstr "Lädt herunter" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} von {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "unbekannt" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Download fehlgeschlagen" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Download abgeschlossen" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Download-Ort öffnen" #: src/window.py:329 msgid "Reset to Default" msgstr "Zurücksetzen" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Download-Ort ändern" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Unzulässiger Ordner" #: src/window.py:364 msgid "Select Folder" msgstr "Ordner auswählen" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Info zu Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Hauptmenü" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Herunterladen" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Auflösung" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG-Format bevorzugen" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Zurück" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Details" video-downloader-0.12.24/po/el.po000066400000000000000000000167621477332155200165250ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Stratos Petrelis , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-07-09 18:09+0000\n" "Last-Translator: Stratos Petrelis \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Λήψη βίντεο από το διαδίκτυο" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Λήψη βίντεο από ιστοσελίδες με ένα εύκολο στην χρήση περιβάλλον. Προσφέρει " "τα ακόλουθα χαρακτηριστικά:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Μετατροπή βίντεο σε MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Υποστηρίζει προστατευόμενα με κωδικό και ιδιωτικά βίντεο" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Λήψη μεμονωμένου βίντεο ή ολόκληρων playlists" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Επιλέγει αυτόματα την μορφή του βίντεο ανάλογα με την επιθυμητή σας ποιότητα" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Βασισμένο στο yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Νέο Παράθυρο" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Απαιτείται Επαλήθευση" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Άκυρο" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Σύνδεση" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Παράληψη" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Το βίντεο δεν είναι δημόσιο." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Όνομα Χρήστη" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Κωδικός" #: src/main.py:38 msgid "Prefill URL field" msgstr "Συμπληρωμένο πεδίο URL" #: src/model.py:67 msgid "Best" msgstr "Καλύτερη" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Μη έγκυρος φάκελος λήψης" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Δεν είναι διαδρομή" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Εξουσιοδότηση απορρίπτεται" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Λήψη Playlist;" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Το βίντεο είναι μέρος ενός playlist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Μόνο Βίντεο" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Όλα τα Βίντεο στο Playlist" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Γενικά" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Άνοιγμα Μενού" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Κλείσιμο Παραθύρου" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Έξοδος" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Συντομεύσεις Πληκτρολογίου" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Περιήγηση" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Πίσω" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Αλλαγή σε Ήχο" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Αλλαγή σε Βίντεο" #: src/window.py:187 msgid "Downloading" msgstr "Λήψη" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} από {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "άγνωστο" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Η λήψη απέτυχε" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Η λήψη τελείωσε" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Άνοιγμα Θέσης Λήψης" #: src/window.py:329 msgid "Reset to Default" msgstr "Επαναφορά στην Προκαθορισμένη" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Αλλαγή Θέσης Λήψης" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Επιλέχτηκε μη έγκυρος φάκελος" #: src/window.py:364 msgid "Select Folder" msgstr "Επιλογή Φακέλου" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Σχετικά με Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Κύριο Μενού" #: src/window.ui:105 msgid "Audio" msgstr "Ήχος" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Λήψη" #: src/window.ui:156 msgid "Video" msgstr "Βίντεο" #: src/window.ui:186 msgid "Resolution" msgstr "Ανάλυση" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Προτίμηση μορφής MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Πίσω" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Λεπτομέρειες" video-downloader-0.12.24/po/es.po000066400000000000000000000161101477332155200165170ustar00rootroot00000000000000# Spanish translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Rafael Mardojai CM , 2020. # Óscar Fernández Díaz , 2022. # gallegonovato , 2023, 2024. # Óscar Fernández Díaz , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-05-30 19:09+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Descargador de vídeo" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Descargar vídeos de Internet" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Descargue vídeos de sitios web con una interfaz fácil de usar. Ofrece las " "siguientes características:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Convierte vídeos a MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Soporta vídeos privados protegidos por contraseña" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Descarga vídeos individuales o listas de reproducción completas" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Selecciona automáticamente un formato de vídeo en función de sus exigencias " "de calidad" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basado en yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Descargar;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Ventana nueva" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autenticación requerida" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancelar" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Iniciar sesión" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Omitir" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "El vídeo no es público." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nombre de usuario" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Contraseña" #: src/main.py:38 msgid "Prefill URL field" msgstr "Rellenar el campo URL" #: src/model.py:67 msgid "Best" msgstr "La mejor" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Carpeta de descarga no válida" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "No es un directorio" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permiso denegado" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "¿Descargar la lista de reproducción?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "El vídeo es parte de una lista de reproducción." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Vídeo individual" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Todos los vídeos en la lista de reproducción" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "General" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Abrir menú" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Cerrar la ventana" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Salir" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Atajos del teclado" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navegación" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Volver" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Cambiar a audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Cambiar a vídeo" #: src/window.py:187 msgid "Downloading" msgstr "Descargando" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "desconocido" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Descarga fallida" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Descarga finalizada" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Abrir la ubicación de la descarga" #: src/window.py:329 msgid "Reset to Default" msgstr "Restablecer los valores predeterminados" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Cambiar la ubicación de la descarga" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Carpeta seleccionada no válida" #: src/window.py:364 msgid "Select Folder" msgstr "Seleccione una carpeta" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Acerca de Descargador de vídeo" #: src/window.ui:91 msgid "Main Menu" msgstr "Menú principal" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Descargar" #: src/window.ui:156 msgid "Video" msgstr "Vídeo" #: src/window.ui:186 msgid "Resolution" msgstr "Resolución" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferir el formato MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Atrás" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalles" video-downloader-0.12.24/po/et.po000066400000000000000000000154751477332155200165350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Priit Jõerüüt , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-30 20:09+0000\n" "Last-Translator: Priit Jõerüüt \n" "Language-Team: Estonian \n" "Language: et\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Videote allalaadija" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Laadi alla veebivideoid" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Lihtsa kasutajaliidese abil laadi alla veebivideoid. Rakenduse " "funktsionaalsused:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "videote heliriba konverteerimine mp3 failiks" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "sobib nii salasõnaga kaitstud kui privaatsete videote allalaadimiseks" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "oskab allalaadida nii üksikuid videoid, kui terveid esitusloendeid" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "valib videovormingu automaatselt vastavalt sinu kvaliteedieelistustele" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Rakendus põhineb yt-dlp tarvikul." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;laadi alla;allalaadimine;veebivideod;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Uus aken" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autentimine on vajalik" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Katkesta" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Logi sisse" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Jäta vahele" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "See video pole avalik." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Kasutajanimi" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Salasõna" #: src/main.py:38 msgid "Prefill URL field" msgstr "Eeltäida aadressiväli" #: src/model.py:67 msgid "Best" msgstr "Parim" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Probleemne allalaadimiste kaust" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Tegemist pole kaustaga" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Õigused puuduvad" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Kas laadime esitusloendi alla?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "See video on osa esitusloendist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Laadi alla üksik video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Laadi alla kõik esitusloendi videod" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Üldised" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ava menüü" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Sulge aken" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Välju" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Klaviatuuri kiirklahvid" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Liikumine" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Mine tagasi" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Lülita heliribale" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Lülita videovoole" #: src/window.py:187 msgid "Downloading" msgstr "Laadime alla" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "teadmata" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Allalaadimine ei õnnestunud" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Allalaadimine lõppes" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Ava allalaadimiste kaust" #: src/window.py:329 msgid "Reset to Default" msgstr "Taasta algväärtused" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Muuda allalaadimiste kausta" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ebasobilik kaust on valitud" #: src/window.py:364 msgid "Select Folder" msgstr "Vali kaust" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Videote allalaadija teave" #: src/window.ui:91 msgid "Main Menu" msgstr "Põhimenüü" #: src/window.ui:105 msgid "Audio" msgstr "Heliriba" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "Võrguaadress" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Laadi alla" #: src/window.ui:156 msgid "Video" msgstr "Videovoog" #: src/window.ui:186 msgid "Resolution" msgstr "Resolutsioon" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Eelista MPEG-vormingut" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Tagasi" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Lisateave" video-downloader-0.12.24/po/eu.po000066400000000000000000000154521477332155200165310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Eder Etxebarria Rojo , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-11-27 02:54+0000\n" "Last-Translator: Eder Etxebarria Rojo \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.9-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Bideo Deskargatzailea" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Webguneetako bideoak deskargatu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Deskargatu bideoak webguneetatik, erabiltzeko erraza den interfaze batekin. " "Ezaugarri hauek eskaintzen ditu:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Bihurtu bideoak MP3ra" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Pasahitz bidez babestutako bideoak eta pribatuak onartzen ditu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Deskargatu bideoak banan-banan edo erreprodukzio-zerrenda osoak" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Bideo formatu bat automatikoki hautatzen du zure kalitate eskakizunen arabera" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Yt-dlp programan oinarritua." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "Youtube;Deskargatu;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Leiho berria" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autentikazioa derrigorrezkoa da" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Ezeztatu" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Saioa hasi" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Atzera egin" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Bideoa ez da publikoa." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Erabiltzailea" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Pasahitza" #: src/main.py:38 msgid "Prefill URL field" msgstr "Bete URL eremua" #: src/model.py:67 msgid "Best" msgstr "Onena" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Deskargen karpeta ez da zuzena" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ez da direktorio bat" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Baimena ezeztatua" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Erreprodukzio-zerrenda deskargatu?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Bideoa erreprodukzio-zerrenda baten barruan dago." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Bideo bakarra" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Erreprodukzio-zerrendaren bideo guztiak" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Orokorra" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ireki menua" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Itxi leihoa" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Atera" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Teklatuko lasterbideak" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Nabigazioa" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Atzera joan" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Audiora pasa" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Bideora pasa" #: src/window.py:187 msgid "Downloading" msgstr "Deskargatzen" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} {}etik" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "ezezagun" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Deskargak huts egin du" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Deskarga bukatu da" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Ireki deskargen kokapena" #: src/window.py:329 msgid "Reset to Default" msgstr "Berrezarri lehenetsitakoak" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Aldatu deskargen kokapena" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Baliogabeko karpeta hautatua" #: src/window.py:364 msgid "Select Folder" msgstr "Karpeta hautatu" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Bideo Deskargatzaileari buruz" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu orokorra" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Deskargatu" #: src/window.ui:156 msgid "Video" msgstr "Bideoa" #: src/window.ui:186 msgid "Resolution" msgstr "Bereizmena" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG formatua nahiago" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Atzera" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Zehaztasunak" video-downloader-0.12.24/po/fa.po000066400000000000000000000171331477332155200165040ustar00rootroot00000000000000# farsi/Persian translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Ali Khomami P. , 2020. # "P. A." , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2023-07-25 15:03+0000\n" "Last-Translator: \"P. A.\" \n" "Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.0-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 #, fuzzy msgid "Download web videos" msgstr "بارگیری ویدیو از سایت‌هایی مانند یوتیوب یا بسیاری از سایت‌های دیگر" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "به کمک این برنامه، با یک رابط کاربریِ آسان، از سایت‌های گوناگون ویدیو بارگیری " "کنید. این برنامه قابلیت‌های زیر را ارئه می‌دهد:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "تبدیل ویدیوها به MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "پشتیبانی از ویدیوهای گذرواژه‌دار و خصوصی" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "بارگیریِ تک ویدیو یا فهرست‌های پخش" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "انتخابِ خودکارِ فرمتِ مناسب، با توجه به نیاز شما به یک کیفیت خاص" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "بر پایهٔ برنامهٔ yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "پنجرهٔ جدید" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "راستی‌آزمایی لازم است" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "لغو" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "ورود" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "پرش" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "این ویدیو عمومی نیست." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "نام کاربری" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "گذرواژه" #: src/main.py:38 msgid "Prefill URL field" msgstr "کادرِ مربوط به نشانی اینترنتی را پر کنید" #: src/model.py:67 msgid "Best" msgstr "بهترین کیفیت" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "پوشه دانلود نامعتبر است" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "یک مسیر نیست" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "اجازه رد شد" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "همهٔ فهرست‌پخش را بارگیری می‌کنید؟" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "این ویدیو بخشی از یک فهرست پخش است." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "تک ویدیو" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "همهٔ ویدیوهای درون فهرست پخش" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "عمومی" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "گشودن فهرست" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "بستن پنجره" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "خروج" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "میان‌برهای صفحه‌کلید" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "ناوبری" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "عقب رفتن" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "تغییر به صوت/صدا" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "تغییر به ویدیو" #: src/window.py:187 msgid "Downloading" msgstr "در حال بارگیری" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} از {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "نامعلوم" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "بارگیری شکست خورد" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "بارگیری انجام شد" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "باز کردن مکان دانلود" #: src/window.py:329 msgid "Reset to Default" msgstr "بازگردانی تنظیمات پیش فرض" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "تغییر مکان دانلود" #: src/window.py:360 msgid "Invalid folder selected" msgstr "پوشه نامعتبری انتخاب شده است" #: src/window.py:364 msgid "Select Folder" msgstr "انتخاب پوشه" #: src/window.ui:41 msgid "About Video Downloader" msgstr "درباره دانلود کننده ویدیو" #: src/window.ui:91 msgid "Main Menu" msgstr "فهرست اصلی" #: src/window.ui:105 msgid "Audio" msgstr "صوت" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "نشانیِ اینترنتیِ ویدیو" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "بارگیری" #: src/window.ui:156 msgid "Video" msgstr "ویدیو" #: src/window.ui:186 msgid "Resolution" msgstr "وضوح" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "ترجیح دادن فرمت MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "بازگشت" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "جزییات" video-downloader-0.12.24/po/fi.po000066400000000000000000000153021477332155200165100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Jiri Grönroos , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-19 10:09+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-rc\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Lataa videoita verkosta" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Lataa videoita verkkosivustoilta helppokäyttöisellä käyttöliittymällä. " "Sisältää seuraavat ominaisuudet:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Muunna videot MP3-muotoon" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Tukee salasanalla suojattuja ja yksityisiä videoita" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Lataa yksittäisiä videoita tai kokonaisia soittolistoja" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Valitsee tiedostomuodon automaattisesti pohjautuen laatuvaatimuksiisi" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Perustuu yt-dlp:hen." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;lataa;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Uusi ikkuna" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Tunnistautuminen vaaditaan" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Peru" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Kirjaudu" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Ohita" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Tämä video ei ole julkinen." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Käyttäjätunnus" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Salasana" #: src/main.py:38 msgid "Prefill URL field" msgstr "Esitäytä verkko-osoitteen kenttä" #: src/model.py:67 msgid "Best" msgstr "Paras" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Virheellinen latauskansio" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ei kansio" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Pääsy evätty" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Ladataanko soittolista?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Tämä video on osa soittolistaa." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Yksittäinen video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Kaikki soittolistan videot" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Yleiset" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Avaa valikko" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Sulje ikkuna" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Lopeta" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Pikanäppäimet" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Liikkuminen" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Takaisin" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Vaihda ääniosioon" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Vaihda video-osioon" #: src/window.py:187 msgid "Downloading" msgstr "Ladataan" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{}/{}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "tuntematon" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Lataus epäonnistui" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Lataus valmistui" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Avaa lataussijainti" #: src/window.py:329 msgid "Reset to Default" msgstr "Palauta oletusasetus" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Vaihda lataussijainti" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Virheellinen kansio valittu" #: src/window.py:364 msgid "Select Folder" msgstr "Valitse kansio" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Tietoja - Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Päävalikko" #: src/window.ui:105 msgid "Audio" msgstr "Ääni" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "Verkko-osoite" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Lataa" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Resoluutio" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Suosi MPEG-muotoa" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Takaisin" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Yksityiskohdat" video-downloader-0.12.24/po/fr.po000066400000000000000000000162301477332155200165220ustar00rootroot00000000000000# French translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Thorfin89 , 2020. # Irénée THIRION , 2022. # "J. Lavoie" , 2023. # rene-coty , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-07-05 10:09+0000\n" "Last-Translator: rene-coty \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Téléchargeur de vidéos" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Téléchargez des vidéos à partir de sites web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Téléchargez des vidéos à partir de sites internet grâce à une interface " "simple à utiliser. L’application propose les fonctions suivantes :" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Extraire le son en MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Prise en charge des vidéos protégées par mot de passe et privées" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Télécharger une simple vidéo ou une liste complète" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Sélectionner automatiquement la vidéo en fonction de la qualité demandée" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basé sur yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;Télécharger;Vidéos;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nouvelle fenêtre" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Authentification requise" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Abandonner" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Se connecter" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Passer" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Cette vidéo n’est pas publique." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Identifiant" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Mot de passe" #: src/main.py:38 msgid "Prefill URL field" msgstr "Adresse URL préremplie" #: src/model.py:67 msgid "Best" msgstr "Meilleure" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Dossier de téléchargement invalide" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Pas un répertoire" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permission refusée" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Télécharger la liste de lecture ?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "La vidéo appartient à une liste de lecture." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Vidéo unique" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Toutes les vidéos de la liste de lecture" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Général" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ouvrir le menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Fermer la fenêtre" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Quitter" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Raccourcis clavier" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigation" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Retour" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Basculer vers l’audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Basculer vers la vidéo" #: src/window.py:187 msgid "Downloading" msgstr "Téléchargement" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "inconnue" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Le téléchargement a échoué" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Téléchargement terminé" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Ouvrir l’emplacement de téléchargement" #: src/window.py:329 msgid "Reset to Default" msgstr "Réinitialisation à la valeur par défaut" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Modifier l'emplacement du téléchargement" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Dossier sélectionné invalide" #: src/window.py:364 msgid "Select Folder" msgstr "Sélectionner le dossier" #: src/window.ui:41 msgid "About Video Downloader" msgstr "À propos de Téléchargeur de vidéos" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu principal" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Télécharger" #: src/window.ui:156 msgid "Video" msgstr "Vidéo" #: src/window.ui:186 msgid "Resolution" msgstr "Résolution" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Préférer le format MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Retour" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Détails" video-downloader-0.12.24/po/he.po000066400000000000000000000162751477332155200165200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # SPiRiT , 2023. # yoval keshet , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-08-29 09:09+0000\n" "Last-Translator: yoval keshet \n" "Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" "X-Generator: Weblate 5.7.1-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "מוריד הסרטונים" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 #, fuzzy msgid "Download web videos" msgstr "הורד סרטונים מאתרים כמו יוטיוב ורבים אחרים" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "הורדת סרטונים ממגוון אתרים, עם ממשק פשוט לשימוש שמאפשר:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "המרת סרטונים ל-MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "תמיכה בסרטונים מוגנים עם סיסמה וסרטונים פרטיים" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "הורדת סרטונים בודדים או פלייליסט שלם" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "בחירה אוטומטית של פורמט הסרטון, לפי דרישות האיכות שלך" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "מבוסס על yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "יוטיוב;הורדה;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "חלון חדש" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "נדרשת הזדהות" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ביטול" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "התחברות" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "דלג" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "הסרטון אינו ציבורי." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "שם משתמש" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "סיסמה" #: src/main.py:38 msgid "Prefill URL field" msgstr "קישור למילוי אוטומטי" #: src/model.py:67 msgid "Best" msgstr "הכי טובה" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "תיקיית הורדה לא תקינה" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "זו לא תיקייה" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "הגישה נדחתה" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "להוריד פלייליסט?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "הסרטון הוא חלק מפלייליסט." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "סרטון בודד" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "כל הסרטונים בפלייליסט" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "כללי" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "פתיחת תפריט" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "סגירת תפריט" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "יציאה" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "קיצורי דרך במקלדת" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "ניווט" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "אחורה" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "עבור לשמע" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "עבור לוידאו" #: src/window.py:187 msgid "Downloading" msgstr "מוריד" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} מתוך {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "לא ידוע" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "ההורדה נכשלה" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "ההורדה הושלמה" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "פתח תיקיית הורדות" #: src/window.py:329 msgid "Reset to Default" msgstr "ברירות מחדל" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "בחר תיקיית יעד להורדות" #: src/window.py:360 msgid "Invalid folder selected" msgstr "נבחרה תיקייה לא תקינה" #: src/window.py:364 msgid "Select Folder" msgstr "בחר תיקייה" #: src/window.ui:41 msgid "About Video Downloader" msgstr "אודות מוריד הסרטונים" #: src/window.ui:91 msgid "Main Menu" msgstr "תפריט ראשי" #: src/window.ui:105 msgid "Audio" msgstr "שמע" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "קישור" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "הורדה" #: src/window.ui:156 msgid "Video" msgstr "סרטון" #: src/window.ui:186 msgid "Resolution" msgstr "רזולוציה" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "עדיפות לפורמט MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "חזרה" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "פרטים" video-downloader-0.12.24/po/hi.po000066400000000000000000000204121477332155200165100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Scrambled777 , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-01 17:09+0000\n" "Last-Translator: Scrambled777 \n" "Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "वीडियो डाउनलोडर" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "वेब वीडियो डाउनलोड करें" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "उपयोग में आसान इंटरफ़ेस वाली वेबसाइटों से वीडियो डाउनलोड करें। निम्नलिखित " "सुविधाएं प्रदान करता है:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "वीडियो को MP3 में बदलें" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "पासवर्ड से सुरक्षित और निजी वीडियो का समर्थन करता है" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "एकल वीडियो या संपूर्ण प्लेलिस्ट डाउनलोड करें" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "आपकी गुणवत्ता की मांग के आधार पर स्वचालित रूप से एक वीडियो प्रारूप का चयन करता है" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp पर आधारित।" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;डाउनलोड;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "नई खिड़की" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "प्रमाणीकरण आवश्यक" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "रद्द करें" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "साइन इन" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "छोड़ें" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "वीडियो सार्वजनिक नहीं है।" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "उपयोक्तानाम" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "पासवर्ड" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL क्षेत्र पहले से भरें" #: src/model.py:67 msgid "Best" msgstr "श्रेष्ठ" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "अमान्य डाउनलोड फोल्डर" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "निर्देशिका नहीं" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "अनुमति नहीं मिली" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "प्लेलिस्ट डाउनलोड करें?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "वीडियो एक प्लेलिस्ट का हिस्सा है।" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "एकल वीडियो" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "प्लेलिस्ट में सभी वीडियो" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "सामान्य" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "मेनू खोलें" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "खिड़की बंद करें" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "छोड़ें" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "कीबोर्ड शॉर्टकट" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "पथ-प्रदर्शन" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "पीछे जाएं" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "ऑडियो पर जाएं" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "वीडियो पर जाएं" #: src/window.py:187 msgid "Downloading" msgstr "डाउनलोड हो रहा है" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} का {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "अज्ञात" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "डाउनलोड विफल" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "डाउनलोड समाप्त हो गया" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "डाउनलोड स्थान खोलें" #: src/window.py:329 msgid "Reset to Default" msgstr "तयशुदा पर रीसेट" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "डाउनलोड स्थान बदलें" #: src/window.py:360 msgid "Invalid folder selected" msgstr "अमान्य फोल्डर चयनित" #: src/window.py:364 msgid "Select Folder" msgstr "फोल्डर चुनें" #: src/window.ui:41 msgid "About Video Downloader" msgstr "वीडियो डाउनलोडर के बारे में" #: src/window.ui:91 msgid "Main Menu" msgstr "मुख्य मेनू" #: src/window.ui:105 msgid "Audio" msgstr "ऑडियो" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "डाउनलोड" #: src/window.ui:156 msgid "Video" msgstr "वीडियो" #: src/window.ui:186 msgid "Resolution" msgstr "रिजोल्यूशन" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG प्रारूप को प्राथमिकता दें" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "पीछे" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "विवरण" video-downloader-0.12.24/po/hr.po000066400000000000000000000154571477332155200165360ustar00rootroot00000000000000# Croatian translations for video-downloader package. # Copyright (C) 2021 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Milo Ivir , 2021, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-05 13:09+0000\n" "Last-Translator: Milo Ivir \n" "Language-Team: Croatian \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Preuzimanje videa" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Preuzmi web videa" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Preuzimanje videa s web-stranica s jednostavnim sučeljem. Sadrži sljedeće " "značajke:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Pretvaranje videa u MP3 format" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Podrška za privatna i lozinkom zaštićena videa" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Preuzimanje pojedinačnih videa ili cijelih zbirki" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Automatsko biranje videoformata na osnovi tražene kvalitete" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Zasnovano na biblioteci yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;preuzimanje;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Novi prozor" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Potrebna je autentifikacija" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Odustani" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Prijavi se" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Preskoči" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video nije javan." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Korisničko ime" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Lozinka" #: src/main.py:38 msgid "Prefill URL field" msgstr "Unaprijed ispuni polje URL-adrese" #: src/model.py:67 msgid "Best" msgstr "Najbolja" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320 p (8 K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160 p (4 K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440 p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080 p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720 p (HD)" #: src/model.py:73 msgid "480p" msgstr "480 p" #: src/model.py:74 msgid "360p" msgstr "360 p" #: src/model.py:75 msgid "240p" msgstr "240 p" #: src/model.py:76 msgid "144p" msgstr "144 p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Neispravna mapa za preuzimanja" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nije direktorij" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Dozvola je odbijena" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Preuzeti zbirku?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video je dio zbirke." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Jedan video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Sva videa u zbirci" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Općenito" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Otvori izbornik" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Zatvori prozor" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Zatvori" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Prečaci tipkovnice" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigacija" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Idi natrag" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Prijeđi na audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Prijeđi na video" #: src/window.py:187 msgid "Downloading" msgstr "Preuzimanje" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} od {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "nepoznato" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Neuspjelo preuzimanje" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Preuzimanje je gotovo" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Otvori mjesto preuzimanja" #: src/window.py:329 msgid "Reset to Default" msgstr "Resetiraj na standardne vrijednosti" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Promijeni mjesto preuzimanja" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Odabrana je neispravna mapa" #: src/window.py:364 msgid "Select Folder" msgstr "Odaberi mapu" #: src/window.ui:41 msgid "About Video Downloader" msgstr "O programu Preuzimanje videa" #: src/window.ui:91 msgid "Main Menu" msgstr "Glavni izbornik" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL-adresa" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Preuzmi" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Rezolucija" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferiraj MPEG format" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Natrag" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalji" video-downloader-0.12.24/po/hu.po000066400000000000000000000155421477332155200165340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # ovari <>, 2020-2023. # Balazs , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-06 20:09+0000\n" "Last-Translator: Balazs \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Videóletöltő" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Videók letöltése a YouTube és más webhelyről" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Töltsön le videókat weboldalakról egy könnyen használható kezelőfelülettel. " "Jellemzők:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Videók átalakítása mp3 formátumba" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Jelszóval védett és privát videók támogatása" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Egyes videók vagy teljes lejátszási listák letöltése" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Minőségi igényeknek megfelelő videoformátum automatikus kiválasztása" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "A \"yt-dlp\" program alapján." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "Youtube;Letöltés;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Új ablak" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Hitelesítés szükséges" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Mégsem" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Bejelentkezés" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Kihagyás" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "A videó nem nyilvános." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Felhasználónév" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Jelszó" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL-cím mező előtöltése" #: src/model.py:67 msgid "Best" msgstr "Legjobb" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Érvénytelen letöltési mappa" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nem könyvtár" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Hozzáférés megtagadva" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Lejátszási lista letöltése?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "A videó egy lejátszási lista része." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Egyetlen videó" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Összes videó a listában" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Általános" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menü megnyitása" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Ablak bezárása" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Kilépés" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Gyorsbillentyűk" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigáció" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Vissza" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Hangra váltás" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Videóra váltás" #: src/window.py:187 msgid "Downloading" msgstr "Letöltés folyamatban" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "ismeretlen" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Letöltés sikertelen" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Letöltés befejeződött" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Letöltési hely megnyitása" #: src/window.py:329 msgid "Reset to Default" msgstr "Visszaállítás alapértelmezettre" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Letöltési hely módosítása" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Érvénytelen mappa van kiválasztva" #: src/window.py:364 msgid "Select Folder" msgstr "Mappa kiválasztása" #: src/window.ui:41 msgid "About Video Downloader" msgstr "A Videóletöltő névjegye" #: src/window.ui:91 msgid "Main Menu" msgstr "Főmenü" #: src/window.ui:105 msgid "Audio" msgstr "Hang" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL-cím" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Letöltés" #: src/window.ui:156 msgid "Video" msgstr "Videó" #: src/window.ui:186 msgid "Resolution" msgstr "Felbontás" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG formátum előnyben részesítése" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Vissza" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Részletek" video-downloader-0.12.24/po/id.po000066400000000000000000000152661477332155200165170ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Christian Elbrianno , 2023. # Reza Almanda , 2023, 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-01-01 22:00+0000\n" "Last-Translator: Reza Almanda \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.10-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Pengunduh Video" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Unduh video web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Unduh video dari situs web dengan antarmuka yang mudah digunakan. " "Menyediakan fitur berikut:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Konversi video ke MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Mendukung video yang dilindungi kata sandi dan video pribadi" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Unduh satu video atau seluruh daftar putar" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Secara otomatis memilih format video berdasarkan kualitas yg anda pilih" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Berdasarkan yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Unduh;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Jendela Baru" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Otentikasi diperlukan" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Batal" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Masuk" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Lewati" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video ini tidak untuk umum." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nama pengguna" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Kata sandi" #: src/main.py:38 msgid "Prefill URL field" msgstr "Bidang URL yang sudah diisi sebelumnya" #: src/model.py:67 msgid "Best" msgstr "Terbaik" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Folder unduhan tidak valid" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Bukan sebuah direktori" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Izin ditolak" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Unduh Daftar Putar?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video ini merupakan bagian dari daftar putar." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Video Tunggal" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Semua Video dalam Daftar Putar" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Umum" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Buka Menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Tutup Jendela" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Keluar" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Pintasan Papan Tik" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigasi" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Kembali" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Ganti ke Audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Ganti ke Video" #: src/window.py:187 msgid "Downloading" msgstr "Mengunduh" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} dari {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "tidak diketahui" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Unduhan gagal" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Unduhan selesai" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Buka Lokasi Unduhan" #: src/window.py:329 msgid "Reset to Default" msgstr "Atur Ulang ke Asal" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Ganti Lokasi Unduhan" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Folder terpilih tidak valid" #: src/window.py:364 msgid "Select Folder" msgstr "Pilih Folder" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Tentang Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu Utama" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Unduh" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Resolusi" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Lebih suka format MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Kembali" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detail" video-downloader-0.12.24/po/it.po000066400000000000000000000155201477332155200165300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Albano Battistella , 2020-2023. # "J. Lavoie" , 2023. # albanobattistella , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-09 16:09+0000\n" "Last-Translator: albanobattistella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Scarica video dal web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Scarica video da siti Web con un'interfaccia facile da usare. Fornisce " "leseguenti caratteristiche:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converte video in MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Supporta video privati e protetti da password" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Scarica singoli video o intere playlist" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Seleziona automaticamente un formato video in base alla risoluzione preferita" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basato su yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Scarica;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nuova finestra" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autenticazione richiesta" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancella" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Accedi" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Salta" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Il video non è pubblico." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nome Utente" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Password" #: src/main.py:38 msgid "Prefill URL field" msgstr "Campo URL precompilato" #: src/model.py:67 msgid "Best" msgstr "Migliore" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Cartella di scaricamento non valida" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Non una directory" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permesso negato" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Scaricare playlist?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Il video fa parte di una playlist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Video Singolo" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Tutti i video nella playlist" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Generale" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Apri il menù" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Chiudi finestra" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Esci" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Scorciatoie da tastiera" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigazione" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Va indietro" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Passa ad Audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Passa aL Video" #: src/window.py:187 msgid "Downloading" msgstr "Download in corso" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} di {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "sconosciuto" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Download fallito" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Download terminato" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Apri Percorso di Download" #: src/window.py:329 msgid "Reset to Default" msgstr "Ripristina impostazioni predefinite" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Cambia posizione di download" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Cartella selezionata non valida" #: src/window.py:364 msgid "Select Folder" msgstr "Seleziona cartella" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Informazioni su Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menù principale" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Download" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Risoluzione" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferisci il formato MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Indietro" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Dettagli" video-downloader-0.12.24/po/ja.po000066400000000000000000000163261477332155200165130ustar00rootroot00000000000000# Japanese translations for video-downloader package. # Copyright (C) 2020-2021 video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # sicklylife , 2020-2021. # Ryo Nakano , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-05 13:09+0000\n" "Last-Translator: Ryo Nakano \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Web 動画をダウンロードします" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "使いやすいインターフェースでウェブサイトから動画をダウンロードします。以下の" "機能があります:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "動画を MP3 に変換" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "パスワードで保護された閲覧制限動画のサポート" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "単一の動画または再生リストに含まれる動画のダウンロード" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "指定した画質に最適な動画形式を自動で選択" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp を利用しています。" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;ダウンロード;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "新しいウィンドウ" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "認証が必要です" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "キャンセル" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "サインイン" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "スキップ" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "閲覧が制限されている動画です。" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "ユーザー名" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "パスワード" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL フィールドに事前入力する" #: src/model.py:67 msgid "Best" msgstr "最高" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "無効なダウンロードフォルダー" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "ディレクトリではありません" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "許可がありません" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "再生リストからダウンロードしますか?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "動画は再生リストに含まれています。" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "単一の動画" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "再生リスト内のすべての動画" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "全般" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "メニューを開く" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "ウィンドウを閉じる" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "終了する" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "キーボードショートカットを表示する" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "移動" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "左へ移動する" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "音声画面に切り替え" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "動画画面に切り替え" #: src/window.py:187 msgid "Downloading" msgstr "ダウンロード中" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "不明" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "ダウンロード失敗" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "ダウンロード完了" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "ダウンロード先を開く" #: src/window.py:329 msgid "Reset to Default" msgstr "デフォルトにリセット" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "ダウンロード先を変更" #: src/window.py:360 msgid "Invalid folder selected" msgstr "選択したフォルダーは無効です" #: src/window.py:364 msgid "Select Folder" msgstr "フォルダーを選択" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Video Downloader について" #: src/window.ui:91 msgid "Main Menu" msgstr "メインメニュー" #: src/window.ui:105 msgid "Audio" msgstr "音声" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "ダウンロード" #: src/window.ui:156 msgid "Video" msgstr "動画" #: src/window.ui:186 msgid "Resolution" msgstr "解像度" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG 形式で取得" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "戻る" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "詳細" video-downloader-0.12.24/po/ko.po000066400000000000000000000157111477332155200165270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Lee Junseo , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2023-04-25 08:48+0000\n" "Last-Translator: Lee Junseo \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.18-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "비디오 다운로더" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 #, fuzzy msgid "Download web videos" msgstr "유튜브, 또는 다양한 웹사이트에서 동영상을 다운받으세요" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "간편한 인터페이스로 웹사이트들에서 동영상을 다운받을 수 있습니다. 다음과 같" "은 기능들을 제공합니다:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "동영상을 MP3 형식으로 변환하기" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "암호가 있거나 비공개된 영상들을 지원합니다" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "동영상 한개, 또는 재생목록 전체를 다운받을 수 있습니다" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "당신의 영상 품질 선택에 따라 비디오의 형식을 자동으로 선택합니다" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp를 기반으로 합니다." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "새 창" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "인증 필요" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "취소" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "로그인" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "건너뛰기" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "이 영상은 공개 상태가 아닙니다." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "아이디" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "비밀번호" #: src/main.py:38 msgid "Prefill URL field" msgstr "미리 입력된 URL란" #: src/model.py:67 msgid "Best" msgstr "최상" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "잘못된 다운로드 폴더" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "경로가 아님" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "접근 권한 없음" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "재생목록을 다운로드 하시겠습니까?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "재생목록에 포함된 영상입니다." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "단일 영상" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "재생목록의 모든 동영상들" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "일반" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "매뉴 열기" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "창 닫기" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "나가기" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "키보드 단축키" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "네비게이션" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "뒤로가기" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "음성으로 전환하기" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "영상으로 전환하기" #: src/window.py:187 msgid "Downloading" msgstr "다운로드중" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} 의 {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "알수없음" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "다운로드 실패" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "다운로드 완료" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "다운로드 위치 열기" #: src/window.py:329 msgid "Reset to Default" msgstr "기본값으로 초기화" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "다운로드 위치 변경" #: src/window.py:360 msgid "Invalid folder selected" msgstr "잘못된 폴더 선택됨" #: src/window.py:364 msgid "Select Folder" msgstr "폴더 선택" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Video Downloader에 대하여" #: src/window.ui:91 msgid "Main Menu" msgstr "메인 매뉴" #: src/window.ui:105 msgid "Audio" msgstr "음성" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "다운로드" #: src/window.ui:156 msgid "Video" msgstr "동영상" #: src/window.ui:186 msgid "Resolution" msgstr "해상도" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG 형식 선호" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "뒤로가기" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "자세히 보기" video-downloader-0.12.24/po/meson.build000066400000000000000000000000611477332155200177100ustar00rootroot00000000000000i18n.gettext('video-downloader', preset: 'glib') video-downloader-0.12.24/po/ml.po000066400000000000000000000126371477332155200165320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Littux , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ml\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "" #: src/main.py:38 msgid "Prefill URL field" msgstr "" #: src/model.py:67 msgid "Best" msgstr "" #: src/model.py:68 msgid "4320p (8K)" msgstr "" #: src/model.py:69 msgid "2160p (4K)" msgstr "" #: src/model.py:70 msgid "1440p (HD)" msgstr "" #: src/model.py:71 msgid "1080p (HD)" msgstr "" #: src/model.py:72 msgid "720p (HD)" msgstr "" #: src/model.py:73 msgid "480p" msgstr "" #: src/model.py:74 msgid "360p" msgstr "" #: src/model.py:75 msgid "240p" msgstr "" #: src/model.py:76 msgid "144p" msgstr "" #: src/model.py:159 msgid "Invalid download folder" msgstr "" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "" #: src/window.py:187 msgid "Downloading" msgstr "" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "" #: src/window.py:329 msgid "Reset to Default" msgstr "" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "" #: src/window.py:360 msgid "Invalid folder selected" msgstr "" #: src/window.py:364 msgid "Select Folder" msgstr "" #: src/window.ui:41 msgid "About Video Downloader" msgstr "" #: src/window.ui:91 msgid "Main Menu" msgstr "" #: src/window.ui:105 msgid "Audio" msgstr "" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "" #: src/window.ui:156 msgid "Video" msgstr "" #: src/window.ui:186 msgid "Resolution" msgstr "" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "" video-downloader-0.12.24/po/nb_NO.po000066400000000000000000000152331477332155200171100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Allan Nordhøy , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2023-02-28 13:46+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.16-rc\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Videonedlaster" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 #, fuzzy msgid "Download web videos" msgstr "Last ned videoer fra nettsider som f.eks. YouTube og mange andre" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Last ned videoer med et lettfattelig brukergrensesnitt. Du kan gjøre bruk av " "følgende:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Konverter videoer til MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Støtter passordbeskyttede og private videoer" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Last ned enkeltvideoer eller hele spillelister" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Velg videoformat automatisk basert på dine kvalitetsinnstillinger" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basert på yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nytt vindu" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Identitetsbekreftelse kreves" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Avbryt" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Logg inn" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Hopp over" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Videoen er ikke offentlig." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Brukernavn" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Passord" #: src/main.py:38 msgid "Prefill URL field" msgstr "Forhåndsutfyll nettadressefelt" #: src/model.py:67 msgid "Best" msgstr "Best" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ugyldig nedlastingsmappe" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ikke en mappe" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Tilgang nektet" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Last ned spilleliste?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Videoen er en del av en spilleliste." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Enkeltvideo" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Alle videoer i spilleliste" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Generelt" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Åpne meny" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Lukk vindu" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Avslutt" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Tastatursnarveier" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigasjon" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Gå tilbake" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Bytt til lyd" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Bytt til video" #: src/window.py:187 msgid "Downloading" msgstr "Laster ned" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} av {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "ukjent" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Nedlasting mislyktes" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Nedlasting fullført" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Åpne nedlastingsmappe" #: src/window.py:329 msgid "Reset to Default" msgstr "Tilbakestill til forvalg" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Endre nedlastingsmappe" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ugyldig mappe valgt" #: src/window.py:364 msgid "Select Folder" msgstr "Velg mappe" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Om Videonedlaster" #: src/window.ui:91 msgid "Main Menu" msgstr "Hovedmeny" #: src/window.ui:105 msgid "Audio" msgstr "Lyd" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "Nettadresse" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Last ned" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Oppløsning" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Foretrekk MPEG-format" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Tilbake" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detaljer" video-downloader-0.12.24/po/nl.po000066400000000000000000000154311477332155200165260ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Heimen Stoffels , 2020-2021. # Philip Goto , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-19 10:09+0000\n" "Last-Translator: Philip Goto \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-rc\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video­downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Download web­video's" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Download video's van websites via een gemakkelijk te gebruiken interface. " "Bevat de volgende functies:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converteer video's naar MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Ondersteunt met wachtwoord beveiligde video's en privé­video's" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Download losse video's of hele afspeel­lijsten" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Bepaalt automatisch het video­formaat op basis van je kwaliteits­instellingen" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Gebaseerd op yt-dlp" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;downloaden;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nieuw venster" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Authenticatie vereist" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Annuleren" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Inloggen" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Overslaan" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Deze video is niet openbaar" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Gebruikers­naam" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Wachtwoord" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL-veld automatisch invullen" #: src/model.py:67 msgid "Best" msgstr "Beste" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ongeldige download­map" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Geen map" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Toestemming geweigerd" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Afspeel­lijst downloaden?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Deze video maakt deel uit van een afspeel­lijst" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Losse video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Alle video's in de afspeel­lijst" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Algemeen" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menu openen" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Venster sluiten" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Afsluiten" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Sneltoetsen" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigatie" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Ga terug" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Schakelen naar audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Schakelen naar video" #: src/window.py:187 msgid "Downloading" msgstr "Bezig met downloaden" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} van {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "onbekend" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Downloaden mislukt" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Downloaden voltooid" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Download­locatie openen" #: src/window.py:329 msgid "Reset to Default" msgstr "Standaard herstellen" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Download­locatie aanpassen" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ongeldige map geselecteerd" #: src/window.py:364 msgid "Select Folder" msgstr "Map selecteren" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Over Video­downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Hoofdmenu" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Downloaden" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Resolutie" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG-formaat voorkeur geven" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Terug" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Details" video-downloader-0.12.24/po/pl.po000066400000000000000000000156451477332155200165370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # AngryPenguinPL , 2024. # Piotr Wieczorek , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-10-23 09:19+0000\n" "Last-Translator: Piotr Wieczorek \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 5.8.2-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Pobierz filmy z internetu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Pobieraj filmy ze stron internetowych z łatwym w użytkowaniu interfejsie. " "Oferuje następujące funkcje:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Przekonwertuj wideo do MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Obsługuje prywatne filmy i te chronione hasłem" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Pobierz pojedynczy film albo całą listę odtwarzania" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Automatycznie wybiera format wideo na podstawie Twoich wymagań jakościowych" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Oparty na yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Pobieranie;Wideo;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nowe Okno" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Wymagane Uwierzytelnienie" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Anuluj" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Zaloguj się" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Pomiń" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "To wideo nie jest publiczne." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nazwa użytkownika" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Hasło" #: src/main.py:38 msgid "Prefill URL field" msgstr "Wstępnie wypełnione pole adresu URL" #: src/model.py:67 msgid "Best" msgstr "Najlepsza" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Nieprawidłowy folder pobierania" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "To nie jest katalog" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Brak dostępu" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Pobrać listę odtwarzania?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "To wideo jest częścią listy odtwarzania." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Pojedynczy film" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Wszystkie filmy z listy odtwarzania" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Ogólne" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Otwórz menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Zamknij okno" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Wyjdź" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Skróty klawiszowe" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Nawigacja" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Powrót" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Przełącz na dźwięk" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Przełącz na wideo" #: src/window.py:187 msgid "Downloading" msgstr "Pobieranie" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} z {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "nieznany" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Pobieranie nieudane" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Pobieranie ukończone" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Otwórz katalog pobierania" #: src/window.py:329 msgid "Reset to Default" msgstr "Przywróć ustawienia domyślne" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Zmień katalog pobierania" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Wybrano niewłaściwy folder" #: src/window.py:364 msgid "Select Folder" msgstr "Wybierz folder" #: src/window.ui:41 msgid "About Video Downloader" msgstr "O aplikacji Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu główne" #: src/window.ui:105 msgid "Audio" msgstr "Dźwięk" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Pobierz" #: src/window.ui:156 msgid "Video" msgstr "Wideo" #: src/window.ui:186 msgid "Resolution" msgstr "Rozdzielczość" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferuj format MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Wróć" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Szczegóły" video-downloader-0.12.24/po/pt.po000066400000000000000000000155101477332155200165360ustar00rootroot00000000000000# Portuguese translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Gustavo Machado Peredo , 2020. # FCastro32 , 2024. # tuxanator , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-08-13 13:09+0000\n" "Last-Translator: tuxanator \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Descarregue vídeos da web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Baixe vídeos de websites com uma interface fácil de user. Contém as " "seguintes funções:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converta vídeos para mp3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Suporte para vídeos privados e protegidos por senha" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Baixe apenas um vídeo ou playlists inteiras" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Automaticamente seleciona um formato de arquivo baseado nas suas escolhas" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Baseado no yt-dlp" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Descarregar;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nova Janela" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autenticação Exigida" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancelar" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Entrar" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Pular" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Esse vídeo não é público." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nome de usuário" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Senha" #: src/main.py:38 msgid "Prefill URL field" msgstr "Preencha o campo de URL" #: src/model.py:67 msgid "Best" msgstr "Melhor" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Diretório de download inválido" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Não é um diretório" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permissão negada" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Baixar playlist?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Esse vídeo é parte de uma playlist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Único vídeo" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Todos os vídeos da playlist" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Geral" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Abrir menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Fechar janela" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Sair" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Teclas de atalho" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navegação" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Retornar" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Alternar para áudio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Alternar para vídeo" #: src/window.py:187 msgid "Downloading" msgstr "Baixando" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "desconhecido" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Falha no download" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Download finalizado" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Abrir Local de Download" #: src/window.py:329 msgid "Reset to Default" msgstr "Restaurar para o padrão" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Mudar Local de Download" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Diretório inválido selecionado" #: src/window.py:364 msgid "Select Folder" msgstr "Selecionar diretório" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Sobre o Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu principal" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Baixar" #: src/window.ui:156 msgid "Video" msgstr "Vídeo" #: src/window.ui:186 msgid "Resolution" msgstr "Resolução" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferir formato MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Voltar" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalhes" video-downloader-0.12.24/po/pt_BR.po000066400000000000000000000153731477332155200171300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Thiago Carmona , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-11-28 05:00+0000\n" "Last-Translator: Thiago Carmona \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.9-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Baixe vídeos da web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Baixe vídeos de sites com uma intertace fácil de usar. Contém as seguintes " "questões:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converta vídeos para MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Suporta vídeos protegidos por senha e vídeos privados" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Baixe vídeos únicos ou playlists inteiras" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Seleciona automaticamente um formato de vídeo baseado em suas demandas de " "qualidade" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Baseado no yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nova Janela" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autenticação Necessária" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancelar" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Entrar" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Pular" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "O vídeo não é público." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nome de usuário" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Senha" #: src/main.py:38 msgid "Prefill URL field" msgstr "Preencha o campo da URL" #: src/model.py:67 msgid "Best" msgstr "Melhor" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (QHD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (FullHD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p (SD)" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Pasta de download inválida" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Não é um diretório" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permissão negada" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Baixar Playlist?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "O vídeo faz parte de uma playlist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Vídeo Único" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Todos os Vídeos na Playlist" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Geral" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Abrir Menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Fechar Janela" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Sair" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Atalhos de Teclado" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navegação" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Retornar" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Alternar para Áudio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Alternar para Vídeo" #: src/window.py:187 msgid "Downloading" msgstr "Baixando" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "desconhecido" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "O download falhou" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Download finalizado" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Abrir Localização de Download" #: src/window.py:329 msgid "Reset to Default" msgstr "Redefinir para o Padrão" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Mudar Local de Download" #: src/window.py:360 msgid "Invalid folder selected" msgstr "a pasta selecionada é inválida" #: src/window.py:364 msgid "Select Folder" msgstr "Selecione uma Pasta" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Sobre o Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu Principal" #: src/window.ui:105 msgid "Audio" msgstr "Áudio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Baixar" #: src/window.ui:156 msgid "Video" msgstr "Vídeo" #: src/window.ui:186 msgid "Resolution" msgstr "Resolução" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferir o formato MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Voltar" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalhes" video-downloader-0.12.24/po/ro.po000066400000000000000000000156601477332155200165410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # mere , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-10-26 10:15+0000\n" "Last-Translator: mere \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" "X-Generator: Weblate 5.8.2-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Descărcare video-uri web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Descărcați videoclipuri de pe site-uri web cu o interfață ușor de utilizat. " "Oferă următoarele caracteristici:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Convertiți videoclipuri în MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Suportă videoclipuri private și protejare prin parolă" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Descărcați videoclipuri individuale sau liste de redare întregi" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Selectează automat un format video în funcție de cerințele tale de calitate" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Bazat pe yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;Descărcător;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Fereastră nouă" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autentificare necesară" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Anulează" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Conectează-te" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Omite" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Videoclipul nu este public." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nume de utilizator" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Parolă" #: src/main.py:38 msgid "Prefill URL field" msgstr "Precompletați câmpul URL" #: src/model.py:67 msgid "Best" msgstr "Cel mai bun" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Dosar de descărcare invalid" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nu este un director" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permisiunea refuzată" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Descărcați playlist-ul?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Videoclipul face parte dintr-un playlist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Un singur videoclip" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Toate videoclipurile din Playlist" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "General" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Deschideți meniul" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Închideți fereastra" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Închide" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Comenzi rapide de la tastatură" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigare" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Înapoi" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Comutați la Audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Comutați la Video" #: src/window.py:187 msgid "Downloading" msgstr "Descărcarea" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} din {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "necunoscut" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Descărcare eșuată" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Descărcarea s-a terminat" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Deschideți locația de descărcare" #: src/window.py:329 msgid "Reset to Default" msgstr "Resetare la valorile implicite" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Modificarea locației de descărcare" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Dosar nevalid selectat" #: src/window.py:364 msgid "Select Folder" msgstr "Selectați Folder" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Despre Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Meniu principal" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL-ul" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Descarcă" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Rezoluţie" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Prefer formatul MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Înainte" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalii" video-downloader-0.12.24/po/ru.po000066400000000000000000000172431477332155200165460ustar00rootroot00000000000000# Russian translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Umidjon Almasov , 2022. # Valeriy Manzhos , 2023. # Host1c , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-12 21:09+0000\n" "Last-Translator: Host1c \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Загрузчик видео" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Позволяет скачать видео из интернета" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Загружает видео с сайтов при помощи легкого в использовании интерфейса. " "Предоставляет следующие возможности:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Конвертация видео в MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Поддержка видео защищенных паролем и частные" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Загрузка отдельных видео или плейлиста целиком" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Автоматический выбор формата видео на основе ваших требований к качеству" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Основан на yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YuuTube;Скачать;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Новое окно" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Требуется авторизация" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Отмена" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Вход" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Пропустить" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Видео не является публичным." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Имя пользователя" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Пароль" #: src/main.py:38 msgid "Prefill URL field" msgstr "Заполните поле URL" #: src/model.py:67 msgid "Best" msgstr "Наилучшее" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Неправильная папка для загрузки" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Не каталог" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Отказано в доступе" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Загрузить плейлист?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Видео является часть плейлиста." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Отдельное видео" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Все видео в плейлисте" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Основное" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Открыть меню" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Закрыть окно" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Завершить" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Комбинации клавиш" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Навигация" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Перейти назад" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Переключиться на аудио" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Переключиться на видео" #: src/window.py:187 msgid "Downloading" msgstr "Загрузка" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} из {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "неизвестно" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Загрузка не удалась" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Загрузка завершена" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Открыть место загрузки" #: src/window.py:329 msgid "Reset to Default" msgstr "Сбросить по умолчанию" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Изменить место загрузки" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Выбрана недопустимая папка" #: src/window.py:364 msgid "Select Folder" msgstr "Выберите папку" #: src/window.ui:41 msgid "About Video Downloader" msgstr "О программе" #: src/window.ui:91 msgid "Main Menu" msgstr "Главное меню" #: src/window.ui:105 msgid "Audio" msgstr "Аудио" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Загрузить" #: src/window.ui:156 msgid "Video" msgstr "Видео" #: src/window.ui:186 msgid "Resolution" msgstr "Разрешение" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Предпочитать формат MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Назад" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Подробно" video-downloader-0.12.24/po/sk.po000066400000000000000000000154731477332155200165400ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Albano Battistella , 2020. # MartinIIoT <>, 2020-2021. # Milan Šalka , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-19 10:09+0000\n" "Last-Translator: Milan Šalka \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" "X-Generator: Weblate 5.6-rc\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Stiahnuť webové videá" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Sťahovanie videí zo stránok s jednoduchým rozhraním s nasledujúcimi " "vlastnosťami:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Konvertovanie videí do MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Podpora zaheslovaných a súkromných videí" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Stiahnutie jedného videa alebo celých playlistov" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Automatický výber formátu videa podľa zvolených požiadaviek na kvalitu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Založený na yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Stiahnuť;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nové okno" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Vyžaduje sa autentifikácia" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Zrušiť" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Prihlásiť sa" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Preskočiť" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video nie je verejné." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Používateľské meno" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Heslo" #: src/main.py:38 msgid "Prefill URL field" msgstr "Predvyplnené URL pole" #: src/model.py:67 msgid "Best" msgstr "Najlepšie" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Neplatný priečinok na stiahnutie" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nie je adresár" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Povolenie zamietnutá" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Stiahnuť playlist?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video je časťou playlistu." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Jedno video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Všetky videá z playlistu" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Všeobecné" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Otvorenie ponuky" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Zatvoriť okno" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Ukončenie" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Klávesové skratky" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigácia" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Prejdenie späť" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Prepnúť na Audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Prepnúť na video" #: src/window.py:187 msgid "Downloading" msgstr "Sťahujem" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} z {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "neznámy" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Sťahovanie neúspešné" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Sťahovanie je hotové" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Otvoriť cieľové umiestnenie" #: src/window.py:329 msgid "Reset to Default" msgstr "Reset na Default" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Zmeniť Poloha" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Neplatné zložky vybrané" #: src/window.py:364 msgid "Select Folder" msgstr "Vyberte priečinok" #: src/window.ui:41 msgid "About Video Downloader" msgstr "O programe" #: src/window.ui:91 msgid "Main Menu" msgstr "Hlavná ponuka" #: src/window.ui:105 msgid "Audio" msgstr "Zvuk" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Stiahnuť" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Rozlíšenie" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferenčný formát" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Späť" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detaily" video-downloader-0.12.24/po/sv.po000066400000000000000000000155211477332155200165450ustar00rootroot00000000000000# Swedish translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Åke Engelbrektson , 2021. # Luna Jernberg , 2023. # bittin1ddc447d824349b2 , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-01 17:09+0000\n" "Last-Translator: bittin1ddc447d824349b2 \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Ladda ner webbvideor" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Ladda ner videoklipp från webbplatser, med ett lättanvänt gränssnitt. " "Innehåller följande funktioner:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Konvertera videoklipp till MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Stödjer lösenordsskyddade och privata videoklipp" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Ladda ner enstaka videoklipp eller hela spelningslistor" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Välj automatiskt ett videoformat, baserat på dina kvalitetskrav." #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Baserat på yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Ladda ner;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nytt fönster" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autentisering krävs" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Avbryt" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Logga in" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Hoppa över" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Videon är inte offentlig." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Användarnamn" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Password" #: src/main.py:38 msgid "Prefill URL field" msgstr "Förifyll URL-fält" #: src/model.py:67 msgid "Best" msgstr "Bäst" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ogiltig nerladdningsmapp" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Inte en mapp" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Åtkomst nekad" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Vill du ladda ner spelningslistan?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Denna video är en del av en spelningslista." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Enstaka video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Alla videor i spelningslistan" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Allmänt" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Öppna meny" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Stänga fönster" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Avsluta" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Tangentbordsgenvägar" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigering" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Gå bakåt" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Ändra till ljud" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Ändra till video" #: src/window.py:187 msgid "Downloading" msgstr "Nerladdning" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} av {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "okänd" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Nerladdning misslyckades" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Nerladdning slutförd" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Öppna nerladdningsplats" #: src/window.py:329 msgid "Reset to Default" msgstr "Återställ till standard" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Ändra nerladdningsplats" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ogiltig mapp vald" #: src/window.py:364 msgid "Select Folder" msgstr "Välj mapp" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Om Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Huvudmeny" #: src/window.ui:105 msgid "Audio" msgstr "Ljud" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Ladda ner" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Upplösning" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Föredra MPEG format" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Tillbaka" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detaljerad information" video-downloader-0.12.24/po/ta.po000066400000000000000000000223511477332155200165200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # தமிழ்நேரம் , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-03-23 19:43+0000\n" "Last-Translator: தமிழ்நேரம் \n" "Language-Team: Tamil \n" "Language: ta\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.11-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "வீடியோ பதிவிறக்கம்" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "வலை வீடியோக்களைப் பதிவிறக்கவும்" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "பயன்படுத்த எளிதான இடைமுகத்துடன் வலைத்தளங்களிலிருந்து வீடியோக்களைப் பதிவிறக்கவும். பின்வரும்" " அம்சங்களை வழங்குகிறது:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "வீடியோக்களை எம்பி 3 ஆக மாற்றவும்" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "கடவுச்சொல் பாதுகாக்கப்பட்ட மற்றும் தனிப்பட்ட வீடியோக்களை ஆதரிக்கிறது" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "ஒற்றை வீடியோக்கள் அல்லது முழு பிளேலிச்ட்களைப் பதிவிறக்கவும்" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "உங்கள் தரமான கோரிக்கைகளின் அடிப்படையில் வீடியோ வடிவமைப்பை தானாகவே தேர்ந்தெடுக்கிறது" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "YT-DLP ஐ அடிப்படையாகக் கொண்டது." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube; பதிவிறக்கம்;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "புதிய சாளரம்" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "ஏற்பு தேவை" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ரத்துசெய்" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "விடுபதிகை" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "தவிர்" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "வீடியோ பொதுவில் இல்லை." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "பயனர்பெயர்" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "கடவுச்சொல்" #: src/main.py:38 msgid "Prefill URL field" msgstr "முகவரி புலத்தை முன்னரே நிரப்பவும்" #: src/model.py:67 msgid "Best" msgstr "சிறந்த" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320 ப (8 கே)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (செக்கா)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440 ப (எச்டி)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (எச்டி)" #: src/model.py:72 msgid "720p (HD)" msgstr "720 ப (எச்டி)" #: src/model.py:73 msgid "480p" msgstr "480 ப" #: src/model.py:74 msgid "360p" msgstr "360 ப" #: src/model.py:75 msgid "240p" msgstr "240 ப" #: src/model.py:76 msgid "144p" msgstr "144 ப" #: src/model.py:159 msgid "Invalid download folder" msgstr "தவறான பதிவிறக்க கோப்புறை" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "ஒரு அடைவு அல்ல" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "இசைவு மறுக்கப்பட்டது" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "பிளேலிச்ட்டைப் பதிவிறக்கவா?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "வீடியோ ஒரு பிளேலிச்ட்டின் ஒரு பகுதியாகும்." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "ஒற்றை வீடியோ" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "பிளேலிச்ட்டில் உள்ள அனைத்து வீடியோக்களும்" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "பொது" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "திறந்த பட்டியல்" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "சாளரத்தை மூடு" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "வெளியேறு" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "விசைப்பலகை குறுக்குவழிகள்" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "வானோடல்" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "திரும்பிச் செல்லுங்கள்" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "ஆடியோவுக்கு மாறவும்" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "வீடியோவுக்கு மாறவும்" #: src/window.py:187 msgid "Downloading" msgstr "பதிவிறக்குகிறது" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} of}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "தெரியவில்லை" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "பதிவிறக்கம் தோல்வியடைந்தது" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "பதிவிறக்கம் முடிந்தது" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "பதிவிறக்க இருப்பிடத்தைத் திறக்கவும்" #: src/window.py:329 msgid "Reset to Default" msgstr "இயல்புநிலைக்கு மீட்டமைக்கவும்" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "பதிவிறக்க இருப்பிடத்தை மாற்றவும்" #: src/window.py:360 msgid "Invalid folder selected" msgstr "தவறான கோப்புறை தேர்ந்தெடுக்கப்பட்டது" #: src/window.py:364 msgid "Select Folder" msgstr "கோப்புறையைத் தேர்ந்தெடு" #: src/window.ui:41 msgid "About Video Downloader" msgstr "வீடியோ பதிவிறக்கம் பற்றி" #: src/window.ui:91 msgid "Main Menu" msgstr "பட்டியல் விளையாடுங்கள்" #: src/window.ui:105 msgid "Audio" msgstr "ஆடியோ" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "முகவரி" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "பதிவிறக்கம்" #: src/window.ui:156 msgid "Video" msgstr "ஒளிதோற்றம்" #: src/window.ui:186 msgid "Resolution" msgstr "பகுத்தல்" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG வடிவமைப்பை விரும்புங்கள்" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "பின்" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "விவரங்கள்" video-downloader-0.12.24/po/tr.po000066400000000000000000000155711477332155200165470ustar00rootroot00000000000000# Turkish translations for video-downloader package. # Copyright (C) 2020-2022 video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # ÜSolmaz , 2021. # Sabri Ünal , 2022. # Oğuz Ersen , 2023. # Sabri Ünal , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-05-30 19:09+0000\n" "Last-Translator: Sabri Ünal \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.6-dev\n" "X-Project-Style: gnome\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video İndirici" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "İnternet sitelerinden video indirin" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Kullanımı kolay bir arayüz ile web sitelerinden video indirin. Aşağıdaki " "özellikleri sağlar:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Videoları MP3'e dönüştür" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Parola korumalı ve özel videoları destekler" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Tek videoları veya tüm çalma listelerini indirin" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Kalite taleplerinize göre kendiliğinden video biçimi seçer" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp temelli." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;İndir;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Yeni Pencere" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Kimlik Doğrulaması Gerekli" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "İptal Et" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Oturum aç" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Atla" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video herkese açık değil." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Kullanıcı adı" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Parola" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL alanını önceden doldur" #: src/model.py:67 msgid "Best" msgstr "En iyi" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Geçersiz indirme klasörü" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Dizin değil" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "İzin reddedildi" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Çalma Listesi İndirilsin Mi?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video bir çalma listesinin parçası." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Tek Video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Çalma Listesindeki Tüm Videolar" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Genel" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menüyü Aç" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Pencereyi Kapat" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Çıkış" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Klavye Kısayolları" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Gezinme" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Geri git" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Sese Geç" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Videoya Geç" #: src/window.py:187 msgid "Downloading" msgstr "İndiriliyor" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "bilinmeyen" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "İndirme başarısız oldu" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "İndirme tamamlandı" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "İndirme Konumunu Aç" #: src/window.py:329 msgid "Reset to Default" msgstr "Öntanımlı Değere Sıfırla" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "İndirme Konumunu Değiştir" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Geçersiz klasör seçildi" #: src/window.py:364 msgid "Select Folder" msgstr "Klasör Seç" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Video İndirici Hakkında" #: src/window.ui:91 msgid "Main Menu" msgstr "Ana Menü" #: src/window.ui:105 msgid "Audio" msgstr "Ses" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "İndir" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Çözünürlük" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG biçimini tercih et" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Geri" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Ayrıntılar" video-downloader-0.12.24/po/uk.po000066400000000000000000000174521477332155200165410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Dan , 2023. # Ihor Hordiichuk , 2023, 2024. # Dan , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-08-19 03:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.7\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Завантажувач відео" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Завантажуйте відео із сайтів" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Завантажуйте відео з вебсайтів із простим у використанні інтерфейсом. Надає " "такі функції:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Конвертування відео в MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Підтримує захищені паролем і приватні відео" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Завантажуйте окремі відео або цілі списки відтворення" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Автоматично вибирає формат відео на основі ваших вимог до якості" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "На основі yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;Завантажити;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Нове вікно" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Потрібна автентифікація" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Скасувати" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Увійти" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Пропустити" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Відео не загальнодоступне." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Ім’я користувача" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Пароль" #: src/main.py:38 msgid "Prefill URL field" msgstr "Заповніть поле URL-адреси" #: src/model.py:67 msgid "Best" msgstr "Найкраще" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320р (8К)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Неправильна тека для завантаження" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Не каталог" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "У дозволі відмовлено" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Завантажити список відтворення?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Відео є частиною списку відтворення." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Окреме відео" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Усі відео у списку відтворення" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Загальні" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Відкрити меню" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Закрити вікно" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Вийти" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Комбінації клавіш" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Навігація" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Повернутися" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Перемикнутися на аудіо" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Перемикнутися на відео" #: src/window.py:187 msgid "Downloading" msgstr "Завантаження" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} з {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "невідомо" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Не вдалося завантажити" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Завантаження завершено" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Відкрити місце завантаження" #: src/window.py:329 msgid "Reset to Default" msgstr "Скинути до усталеного" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Змінити місце завантаження" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Вибрано недійсну теку" #: src/window.py:364 msgid "Select Folder" msgstr "Виберіть теку" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Про Завантажувач відео" #: src/window.ui:91 msgid "Main Menu" msgstr "Головне меню" #: src/window.ui:105 msgid "Audio" msgstr "Аудіо" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Завантажити" #: src/window.ui:156 msgid "Video" msgstr "Відео" #: src/window.ui:186 msgid "Resolution" msgstr "Роздільність" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Надавати перевагу формату MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Назад" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Подробиці" video-downloader-0.12.24/po/uz.po000066400000000000000000000156321477332155200165560ustar00rootroot00000000000000# Uzbek translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Umidjon Almasov , 2022. # Elvis , 2024. # Bahrom Miragzamov , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-04-01 20:33+0000\n" "Last-Translator: Bahrom Miragzamov \n" "Language-Team: Uzbek \n" "Language: uz\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.11-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Yuklab oluvchi" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Veb-videolarni yuklab olish" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Foydalanish uchun oson boʻlgan interfeys orqali saytlardan video yuklab " "oladi. Quyidagi imkoniyatlarni taqdim etadi:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Videoni MP3 ga aylantirish" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Parol bilan himoyalangan va xususiy videolarni qoʻllab-quvvatlash" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Alohida video va pleylistlarni butunlay yuklab olish" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Sizning sifat talablaringizga asosan video formatini avtomatik ravishda " "tanlash" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp da asoslangan." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Yuklab Olish;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Yangi oyna" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Avtorizatsiya talab qilinadi" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Bekor qilish" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Kirish" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Oʻtkazib yuborish" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video ommaviy emas." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Foydalanuvchi nomi" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Parol" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL maydonini toʻldiring" #: src/model.py:67 msgid "Best" msgstr "Eng yaxshi" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Yuklab olish papkasi yaroqsiz" #: src/model.py:280 src/model.py:286 src/window.py:358 #, fuzzy msgid "Not a directory" msgstr "Papka emas" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Ruxsat berilmadi" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Pleylist yuklab olinsinmi?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video pleylist tarkibiga kiradi." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Alohida video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Pleylistdagi hamma videolar" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Umumiy" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menyuni Ochish" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Menyuni Yopish" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Chiqish" #: src/shortcuts_dialog.ui:57 src/window.ui:37 #, fuzzy msgid "Keyboard Shortcuts" msgstr "Klaviatura yorliqlari" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigatsiya" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Ortga qaytish" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Audioga o'tish" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Videoga o'tish" #: src/window.py:187 msgid "Downloading" msgstr "Yuklab olinmoqda" #: src/window.py:189 src/window.py:209 #, fuzzy msgid "{} of {}" msgstr "{} {} dan" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "noma'lum" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Yuklab olinmadi" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Yuklab olindi" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Yuklab olingan joyni ochish" #: src/window.py:329 msgid "Reset to Default" msgstr "Standart holatga qaytarish" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Yuklash joyini o'zgartirish" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Yaroqsiz papka tanlandi" #: src/window.py:364 msgid "Select Folder" msgstr "Papkani tanlash" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Dastur haqida" #: src/window.ui:91 msgid "Main Menu" msgstr "Asosiy menyu" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Yuklab olish" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "O'lchamlari" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG formatini afzal ko'rish" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Orqaga" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Tafsilotlar" video-downloader-0.12.24/po/video-downloader.pot000066400000000000000000000126701477332155200215450ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "" #: src/main.py:38 msgid "Prefill URL field" msgstr "" #: src/model.py:67 msgid "Best" msgstr "" #: src/model.py:68 msgid "4320p (8K)" msgstr "" #: src/model.py:69 msgid "2160p (4K)" msgstr "" #: src/model.py:70 msgid "1440p (HD)" msgstr "" #: src/model.py:71 msgid "1080p (HD)" msgstr "" #: src/model.py:72 msgid "720p (HD)" msgstr "" #: src/model.py:73 msgid "480p" msgstr "" #: src/model.py:74 msgid "360p" msgstr "" #: src/model.py:75 msgid "240p" msgstr "" #: src/model.py:76 msgid "144p" msgstr "" #: src/model.py:159 msgid "Invalid download folder" msgstr "" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "" #: src/window.py:187 msgid "Downloading" msgstr "" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "" #: src/window.py:329 msgid "Reset to Default" msgstr "" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "" #: src/window.py:360 msgid "Invalid folder selected" msgstr "" #: src/window.py:364 msgid "Select Folder" msgstr "" #: src/window.ui:41 msgid "About Video Downloader" msgstr "" #: src/window.ui:91 msgid "Main Menu" msgstr "" #: src/window.ui:105 msgid "Audio" msgstr "" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "" #: src/window.ui:156 msgid "Video" msgstr "" #: src/window.ui:186 msgid "Resolution" msgstr "" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "" video-downloader-0.12.24/po/zh_Hans.po000066400000000000000000000150361477332155200175100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # "L.Yang" , 2023. # Onnar Rick , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-07-21 16:09+0000\n" "Last-Translator: Onnar Rick \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "下载网站上的视频" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "以简单易用的界面从网站下载视频。提供以下特性:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "将视频转换为MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "支持密码保护和私享视频" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "下载单个视频或整个播放列表" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "根据你的质量要求自动选择视频格式" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "基于yt-dlp。" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "新窗口" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "需要认证" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "取消" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "登陆" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "跳过" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "此视频是不公开视频。" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "用户名" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "密码" #: src/main.py:38 msgid "Prefill URL field" msgstr "预填充URL字段" #: src/model.py:67 msgid "Best" msgstr "最佳" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "无效下载文件夹" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "不是一个目录" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "拒绝访问" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "下载播放列表?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "这个视频是播放列表的一部分。" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "单个视频" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "播放列表里的所有视频" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "常规" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "打开菜单" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "关闭窗口" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "退出" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "键盘快捷键" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "导航" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "返回" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "切换到音频" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "切换到视频" #: src/window.py:187 msgid "Downloading" msgstr "下载中" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} of {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "未知" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "下载失败" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "下载完成" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "打开下载位置" #: src/window.py:329 msgid "Reset to Default" msgstr "重置为默认值" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "改变下载位置" #: src/window.py:360 msgid "Invalid folder selected" msgstr "选择的文件夹无效" #: src/window.py:364 msgid "Select Folder" msgstr "选择文件夹" #: src/window.ui:41 msgid "About Video Downloader" msgstr "关于Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "主菜单" #: src/window.ui:105 msgid "Audio" msgstr "音频" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "下载" #: src/window.ui:156 msgid "Video" msgstr "视频" #: src/window.ui:186 msgid "Resolution" msgstr "分辨率" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "倾向MPEG格式" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "后退" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "详情" video-downloader-0.12.24/po/zh_Hant.po000066400000000000000000000151061477332155200175070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Peter Dave Hello , 2023. # Onnar Rick , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-07-21 16:09+0000\n" "Last-Translator: Onnar Rick \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "下載網站上的視頻" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "透過簡單的介面從各種網站下載影片。提供以下功能:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "將影片轉換成 MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "支援密碼保護和私人影片" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "下載單一影片或整個播放清單" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "根據您的品質需求自動選擇影片格式" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "基於 yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "新視窗" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "需要驗證" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "取消" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "登入" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "略過" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "此影片不是公開影片。" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "使用者名稱" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "密碼" #: src/main.py:38 msgid "Prefill URL field" msgstr "預先填寫 URL 欄位" #: src/model.py:67 msgid "Best" msgstr "最佳" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "無效的下載資料夾" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "不是一個目錄" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "權限被拒絕" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "要下載播放清單嗎?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "此影片是播放清單的一部分。" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "單一影片" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "播放清單中的所有影片" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "一般" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "開啟選單" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "關閉視窗" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "結束" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "鍵盤快捷鍵" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "導覽" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "返回" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "切換至音訊" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "切換至影片" #: src/window.py:187 msgid "Downloading" msgstr "正在下載" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "未知" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "下載失敗" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "下載完成" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "開啟下載位置" #: src/window.py:329 msgid "Reset to Default" msgstr "重設為預設值" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "更改下載位置" #: src/window.py:360 msgid "Invalid folder selected" msgstr "選擇的資料夾無效" #: src/window.py:364 msgid "Select Folder" msgstr "選擇資料夾" #: src/window.ui:41 msgid "About Video Downloader" msgstr "關於影片下載器" #: src/window.ui:91 msgid "Main Menu" msgstr "主選單" #: src/window.ui:105 msgid "Audio" msgstr "音訊" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "下載" #: src/window.ui:156 msgid "Video" msgstr "影片" #: src/window.ui:186 msgid "Resolution" msgstr "解析度" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "偏好 MPEG 格式" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "返回" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "詳細資訊" video-downloader-0.12.24/screenshots/000077500000000000000000000000001477332155200174735ustar00rootroot00000000000000video-downloader-0.12.24/screenshots/1.png000066400000000000000000000614131477332155200203460ustar00rootroot00000000000000PNG  IHDR@esBIT|dtEXtSoftwaregnome-screenshot>)tEXtCreation TimeDo 09 Nov 2023 01:08:44 CETҰ IDATxyxSe;mRA" `G,8 8Z@7" 0n (8 ":("l 8 (-{ĤMs]9'};'ʺW@eB T5Bq> FCUU$\jU&XW`Y<ԡ2|lI ԕ-lVl*M,<Gycx-}*.1TPKp+t4n*T$vn譐"_)l26+ThAˈ3@) +R,n_My/*#֞R8}4}]"?ZnK"T@]ރ5@5)h(.a<-hkuAy_ty ũc5$m7@eUXh6ߗ]r<D!Asy<w6|Ah?.ׂF=yk/l?-Pt -?h_ta8]_K9iE ѾB8PR{ y [e}S)/ABty FJD R^+CIP6Rw:m*M.4Bt zK%!/Dž:ڗ C ,J}1e<肂iT5${ f[ U:Hf.juD*uD҄E J. ނ#ٌHi@m4LģJF ў´tI]P>6=r?*]VA$C쩔#_g_5@e-;꼁:m… z ֎][_l?j- Up6O%KC? -@mS0 P82#({+pd)@2_.M^Q R+htaw0[nIiPx 6hOF)ARH.=[y&H(oh+7缣6OMyw݂F}meQaTA+NڗﲎYRm~2^#E0.m.lI9EyógPZL&SMh4vn_w-֭I &l?i)]?0{ ѮaܸE)TQm]0D_~׮]ݹs|= j}7tm4Ya՟#מJB<[K6OysIwy ҞFӞt޺5~y5L?ڵk#’VNPnv ю׮aڵEyC=HC'U6H=NrvL{ ѩ+ґTqiiiV^} yCt޻{.QK/Uoi5y/Jtv !肃%&&")H%+o.3]Z.`qy Fô5kDS2]zBCCYfMx7y Оr*7wFT1Z!yvq>ZܻuT^m6,a@KOOWffrrrʺ+0l6+00PAAAeD KRrzѡ#oYoIT?W)#E0/onXh_>y÷$իT4VUIIIJMM%DW`999JMMURRVkYw(6|ի)w9wRK{A޲jqe#Ź[GAѮF]/2t)))-a@JJJ"@W2fYk.nvjԨza/:,hTJw<~7`?ԥ+u7b#[F{p}.M !Hx;ybCTK.33R{lbC ZcQ"+5w*F+/[ժLegg+''Gv{ndlV@@_}}bo2W;v._ -[PtKtJj*--v]VZZ\:E@{ ~|mK5i2AyJFF.^Xu233UV8f2_G]tE-lZ3>BKKK+rvuE 2WA G vcHs޺Ou:Azwzj={m^ݺuuwkĈ (@喑Q,)7.(<εfڱe^. xwh"Μ9_&I=%w$~ex IW^(߬VkFxJ"ʮ4ё__+ɋի%IW/6l>s… 5sLIo|{9 >\ÇWZZ+I\W999Z`k%&&z\N:ڵ "\И1cԽ{wyG֞={4{l=Ӓ?ioٲE'NTLLbbbyt O?pOrHm֨Q)j^+ldsZWi_K̙3/DK7춌/֮]|aÆb.jժ)22RŽRѣv~l2!ZΝ;Kj…^$nڷo"""ԤIEDD(""B<r⮤effWW,VYJ;*T%qqq:x5khӦMZ%R)##C&LԩSմiS}ג#_^gΜQxxbbbԺu뢞\.p~DD٣XM6Ms_UF"(N%lY(*ZիWWV%E-0aV\.LڻwoL2EgϖlmݦꩧΝ; GerE=%MGXvwdee駟~RDD=k SDD8oo]۷o׋/F3gj2͊Ç5~x")1_{55lPGUllƌ_UkVmbv(!~ΝuD;vLԵkWfmV~~~ڰaƌ#'N͛U~}-ZHfYӦMҥKsi}jܸ>f\R/>iU\swl۶M>vءLOyk֭Wf͚%٬Yfs_U۶m-ܢ'Jhz:u, EDD8hZzf̘˗Yf%zņ?[MX=zTRpNZ] vyk˽6"Mʹ-[hڷo233u"/믿رckf̙3>:~QzVZÇet;֭$ȑ#>2[nn~jڴN< ҟ#y?~\R{x^z I?.]K.ڼyܚ#Gf)**ʹN:mdXm)WY"H(C$'Ѐl2>/#HKmذ-8yQWzu)I)kUMhhLCv;tC?JW]uekA>9j[l'|m^a}ʒd-(td*p811Qcƌǝ)66VӧOWXXXFۈ4rرc+((H $z_Ǒ#GtjJ?|rI GUVV܏AsTKꫯ;Xg֭k \UNFN:T`={$I]vYv>/\P^G%9mۜ:W]utaծ][5r>??}޾}v"## /Py_øq!z>}5j8 6PDڷo-[:k6mZykd7n (>>^RӦMuu3H4d{ΑiO.2 4otB7jؽyնm[={VNҋ//=*???-[LPPP &gϞJKKuk̙+}/ ^lhQ ¢uiΜ9n%aaa3gNeۗH΂ٹ¶<\mڴy>ٳe"_JaP~vHRJJJa```"d2,*)k\ҖwuyM [tFFqXV?DZo- -/m3v\6BBBBg T$ժU+ ,lZG\鐐 U $U|b``/e9GADUF +33Sqd2l6+ @b H@`6S@)PZ)(eH@PNP1rY fu7D FJl6/ j׮teffR3]Af2 Ti`aPP@ HUqqqle JϯjV ]~*PLi4`A0 @ Hi4`A0 @ Hi4`A0 @ Hi4`A0 @ Hi4`A0 @ Hi4`A0 @ Hi4`A0 @ Hi4`A0 @ HJn/.L&SYw% ] x jGvL?H|x[\:yòdr> AOү Y:y>KSmJ϶KhʆI 0) (E B-J ]h&ݮ_Ogh4l9 @&2e|]gmX2֫yy5L&0]+Gv@l6sANZ@]U'@jU=PR3mJuL%fXjWnhn7Ք$itRZVa4x0zigϵXmٔig;u6_j{MnmTƽ~$]/Mٺ,ت{ZRp!iFR$gm.1-i坶sja%^ʐe&ftV"DP8H^KClYHvj:p ]l6YV}'EgTvFTTPQԫiVߨ_;PgYVlWFB.yaa#KEw6  zl"KE~ѯ3:KJW jǣiX,j{M0#T`j`Y,x4MV""HcyGO)vqB=%< Al:|:S]wE`YwT9@OgR']9o.Lʑ_W (nrUu*)>?t9kSm2Dm4HfdRb-_&PorεN:#.LܩJzd2)#芆 8.\˗vk/tu)22R׿dٜ_SN:) _ 5k8@~犇 ]\X{j֬/jÆ }@UG8G!!!jڴ˺+Aeee /KvŋZpj֬)ͦMe˖e-r*S͕nd[1x`w}Q&M ]ET^]qkOMMwŢo]6l]PU7nM6jJ:$ժ:u[oj/uW*j.]hZ`t嗫W^7L&:vիW+22REtReXsI HW!ڵyaÆzG( Hi4ʺ *4`A0 7V!111۷󳲲dTZJÓO>(VU9EiE=Ϗ?X_|=*ŢN:gb)>SttyI/+Wz\~ɒ%jڴiܳg uA*ȸqv|wq&O,IJII̙3c>}ZW]u~auرqY͝;W?Ξ=:ue˖U͚5%I[oqzԪURʏ y)..Njm%fi׮]1bDmUɥ8Qi%yNϟ?G}TW^yvޭ7|SjҨQJz7t)1chnmVҊ+ ђt 7hƍ7nܨW_}Uwׯq69JrrbbbԺukM8Q!!!0_YYYzt7Tڵ;v($$Dt 9R<&LJO<,Xӹ(s$]wu(#<|ݠA:tH/}|wիW/@}W߿OsKD[?~ hXmaź5n8gUW]jӒ%K/I sYZdڷoAI?ĉKo*B IDAT/j_~E#FP4h ڵKh"͛7Ok׮U֭5ydmRG˗/աC ];w$L&խ[Wkv׎;ݿյ-::Z?v$駟~$wء+Rw}w,۰aCuU~s]Iڴit")7$_^SLŋeX4rHegg6x M6.]0 >\S*>>^-҇~x͜9-Z?\&MҥK׿U>_RRy=3Zr8:'OԬYi}ꪫԨQ#M6M˗/WϞ=K/ӂ/.\]w͛7f9oذAݺuSӦMvZW^Qu?Vnݜ5>߿I9s{͘1Cl=l6222t9j̘1Сz?йСCeZGIk#E馛ԤI=#Zp$]ynxbT'*$44TcǎUf!Cܹs+&L-Z^zzk̙3QvTfMEFFnp7c =Ciݮ;w[n֦MÒrG{1%%%ȑ#m۶]vl^m۶Uzz+)*::ZYYYZxƍ&MaÆ8qRSSy"k_YV 4H-ZP ]&I֭SjjV\X^z9rZYǶϟ^xA_իݻ+((ȧ]ƏnAaaaz%IÆ SxxիW/ԿEFFaÆ:t4h|zo^ݫyiڴiUڴi#<;vL۷<>jԨիwt_jj֬Y}z.N87|Snff/_ǫiӦjԨƏo+V}n]v̙37|S}~ZI;w[}n(ϐbu}iɒ%ѣƍCIΝ;'IJQjժ%)7@Q׻ 4h@AAAFbL&󵟟7oǏꫯVTT qƹ"xregg1m QV?Jʭ;ԦMmٲERnj۶m-W``ڷo\njݺWxSPP5kcǎ~(""BiŢ-Zѣ:~l6 ^zW^z畚q[JKKs#u//7$m8ﻔ>#;VFɓ'E=F|W;uK :ur lܸQ۷N!O֔)SC9k]?/PFԬY3v_΅jՄ t]wc1>>^6=v}? ~ѪU+g8_nM5jPNԧO}ofy=z~iիWmE VLL JHHА!Ct!gqEI* Tn*5U&???͞=[o,ƌdǎ=uA۷o׉'puQ7o֙3g→e˖l^]vu:ײmoVY,ŋj*ZJW:B% %u|y󾧧kȐ!:sFiӦiӦ1|!;toذAݻw$j̙/wQ֭պuk}ZdZnO?m_q:d_{ァ|wl"W5kT@@@;JLLtksX'E/٬Ν;kΜ9_֭[ի+88I:ujժUP9&''жgO>qkۻwh-ܢ^zIצM+:ܹ3_}hرC7oV%IڵW_nsvͫm۶:y=;w*::ZԨQ#q8l6۷OM4=궽#y{a?^ۼ{qƺ+EU 6fx' _ψWRR|I5nX:tN>=sZ1_VϞ=ڢYm&I>Hwn۶M۶mS߾}5h m۶M}qgǎuwߗs{n-ZH&M`uĮqQo^ׯwk;v۝;?+V'Ԕ)SbxnݺλtA_}2ׯwQPutkΝߔZjڷo~G%''kܹJKKSΝuZJ ? gs=E9chomW\q6l{nMֲynXSUV`s=z׵o>%&&jڴi soY}~7W^qy/l]K,ю;3lԩf3gj۶mZ:}V\VZԩ&OǏ+--M7oVZZOgDq0]xQn:IiA諼?Rn9B׮]5i$u9Jk>cUpp[{a"--MǏW~ԤI| fff*88X=zk{ٳz뭷Կ_VҥKoFVҀ$K/iu]7|aݚ6mmۦSNĉz~E|8Ozu]wiŽGDD'Ԝ9sԻwomܸѹLA素c, )#>>^]vaÆ|J5kԩS{*}Lׯ?ʳ'NhZn/@*^;wNwyK^DEE9o\j3: 4[fLb,*)kpLeZ.my.]y:۷Eƈ4LZtVmܸQz+!*^@QQ# @ Hi4``2ʓe * ]T *.R]]@+a+u7@)8y2"F0 @ Hi4`A0 @ Hi4`A0 @ HW!ƍSTTEwu^~e??&&F}gee)##ímzKgPlܸQ{5jn[Vwܡߺ[-YD۷נAԠA :l٢e˖ѣi;EjCwn U-4n8=#:uRRRdXԿ|@qjժ) @r?{뭷ԣGuUҜoݺU111j׮vγlZ`N:i:u}wmt`jӦ$iѢE7o֮]֭[kɒϘ͟?_ÇWtt ]v@5vX 8P%߼u֩[nnmݻwצMaaa:xs:%%E.\PDDD˗kС}yuԥKL"kAxvm޼Yԭ[7}E8;wlܹsK8UnW||~mCfY4uTkѢE3gJ.\XKWչsg6Νkʔ)Zx,F"/&&FÆ Snݴm6;r3))Ig֓O>+Wꦛnرc *L%%%+tkŋ&#FЗ_~OOWxxx#ISLѨQb 5o\FRJJJ;vLnmJOObQ&MtqIR 5{2|p >ĖCCb,Y cĈj֬bcc%IZrbccziȑڸq$̙3QvTfMEFFn{aŋ5n85iD 6ĉ (iv?~n&iȐ!:w\AΝ;'I qkU܁I5d^ZjԨ]y;4ahBO?Pgݲ'OaÆnm+VP=nݺL&5lذ U;K_~zgg9R]tq~wql6 6ZNNcZQQQ0`Q ԬY3;vT}b 6bU#&''.s_xQRnI$M8Q Zlwzv$jyb ?^sk4hy|19s-|_~~ֵ]1"]X,Y,jJ:uoWF Iŋj*ZJWviz7dX4f=쳒rGm6V,<(W`8q­ԩSUU8}?HW_U˖-xodO%őÇ$''+ 'x9MDqر ],-ܢ^zIצMFIv\fi߾}jҤѣnmvm:''k?:諯rk[~Iټ^{}ގ$={V|2{W (ŢQyd5lP[vYm< ѐUZFԿɑl5sLm۶MVUOv^qZJ ? ծ][{k߾}JLLԴi]]ڵ 7|>3o+v_;w~x/Ж-[h"%$$O?u}I޽{uYF~tvܻB۷O?5w\]ФIoqaŋw^M6MK.dff*11Q\sHDA{uyXBCi6m:vÇrG*=ܹV\ɓ';(ƌ6m(66V{RRR4sLb Қ5k4fISO=ujU.]Tzugn5o\Ըq<}tj̙ڴi 5khٺ%I5k.rƪwZp>})bnݺ_W^{n͙3ci-ܢ_~q9.LtܶfiٲejڴsUVq8J+m]OM.g?ӮvXvA;wZj\t]-ܢ9s渵[NVÇoȑ#|ICIʒfSjʺ+Pdl6խ[Ht^Euٳgw(i.\NU Aׯq~ԩSzXO?iٲeS͚5KÇeEGG盷`re\xuc6 IDATv7N҈#ԴiSY,>|X}hH t뭷z\4Tl]voVZJJJrGIJOO'HW!HWq-ZPRR/]VO>:tm۶I[oGڵ^y:>?Q֭5hРB)h_y]-\P{O=N_̟?_#G#Eofiӧ:uѣGԩS͛7O?j߾}Zt^EGGg%3fwj۶իW;h"͛7Ok׮U֭5yd\*iZ`Q!!!n%-33ķ ]ŝ={V]vۨqԡC{%ISNU||-Z?P9ss|P={Զm۴dɒB)h_yUVM r+HHHƍկ_?Ǚtkf/\]>m0w\_^SLŋeX4rHeggx;gʕ+9uI͚5KFiڴiZ|z쩗^zIǏ̇ nݺi۶m;v"@1K:Lߎʏ ]EYV6{Q߾}մiSUVMZrbccziȑڸqN}y3`޽[$-^Xz*\bڷoX~ܠ.m{ܹr>^~-^ܷxb7NM4QÆ 5qDjڵkkapKvrnTÆ 5tP5h@{-PfNڝ;$9dP5P#],YDK,dR tm޼e4l0g=YNNRSSu˛_ƍ?\˖-+q4H<4h Is^2dgƔ)S|w||rrrtu9ۂԬY3;v8gzFcɲM5dp;* Ie%(pW.TnW@l n7lBreprvL c-cْ%f4sZj{Z3_ϼ_US=0ߌe &pmM ,s7;eY5H*U{{{j>3^]wuZhQcOt:˗k׮]S!}ZzP(AP&[nu]/Ztn6#B'X,P(4*](QEh0Le˖)NkΝM}M5}}}?۷k֭ >/?qVZ%Izצٶ}iڵ7ٳguw/V:ցt~]hD"!IMZK nf=zU(tI۷߮m۶iճ:a.ڿemܸQ[nc=CwՎ;3NNes=ڷou}O6m{pȈ~khhH;v4ݦ"IK,kw܁ ɤ"~ݐESuZ;P/}KJ&t ojz{{`8[?w6F_BO=mۦx<.Hwu>Oun}{]wݥ|>7h?]t=Czyf]{3ԧ>^xAa}m`"鴢Ѩfa``@Xia;v8V~#2>&zwyGCCCZzukbq)JR,Kx:Jiɒ%_1(+M][ӬyYYҐkiO>]˵.6zܭZ{iFpBm4Ղ t$S6%+A Z`?{ 8^on::A%*jѢEV&޽{U٬ݫL&D"x<JGg!Hc8X,x'CݻbZCf#H0փ+NƟ?}Lq^:S[= ( H?M_4>`64:ߐ$kסl:~`*4d&zv?HL{vVb牷z_`m% IRQpAGO_ߚ1sw/W&gDӾu=wvWtdK^iF{|C㍌좴za\.LI}uOzhg 4A~H֖$_n?R?H$I H0ʱV׾wsgW7.ԟ\9o*HG#͛{Z0@"H0J&g ٢FEKFFd~Lr?96@"H@Ɉ+ovqBшқYR{z_JU7OM3yʤicRO7GsEIY6\yuz옭\tνK3,H]8R_oY+"wO9^{3eEZ=>_j8t4H*Qk/i2QQҸk]5/G֤vqB/2J%")YЮo:RP8/7޿qxt-&_\iF`,Z_|W[.ͩ{ ^/I)"i?֣BQh$R8._T* [Y+]NV?6%k2T[{LbƬrALΘ1C?٫|AZe+,ţ=̐Nç&qm^ҏo]'r+o`;Y,[YĄ-Mh,Wb(ckYoL_z:sti%J ;9]ݺHow#l bebs~Ҵ>qYZtǴnyd@?yyxA=VD]9?O~g8]q~Uy~~rD!)O-ITǫGzsO~ ''7fޥOZʅ1}A:g5&}_YMg?,>c9#6O>w\: 9PVǡVO{!`8˲6KTw-Qt=u]/UH4|* ͙ҕuT1uIu%ysåS窵I]et8E`/|8!|0A_Ҧ~.0d-]"H0׮nB0A,7zhУ5`64xynHl'icZ7^n4}n}JU']մt4P=TMӺ4LC%@p%P.]<KGrfiS]ͅB)Ң폸;˨ϺuκM.ϝeo.{POOv@CA.Y>fhXYҐkiO>]˵.6zo[=F @h]>קPV;gg[=$Tqn4m4лjmRWM*3Q+Gs{|B:vӣ2!PEZ lEBRWYG6P @1kA @ H@i 4A @ H@i 4A @ H@i 4A @ H@i 4A @ H@i 4A @ H@i 4A Ь ]lyz5%"M`PgVPh0JKe*ҵ|Ht]3=H@CM@i ӂD":`Q=ӦZx?s011y,٪ %ߺL >t?r۵t4100J3I&;{3Y|- ]sAaK?/8'|Lf 45򸆋ޥT Gg=*)z]3gyn-mttɅ WI#*k<jo@=UjӔmRkG7Xi_ x ITY޲QB=L8YQ縨ϲRUW_|I{ֆ ~))ڪޥ4B-vz~g[J cޑ#G+Ǐ$jfpk_`lvct[;fD!VAQ30mIٳ[ ٳ[?SVxRl&v//4JUfj.6T}J-Im۶eЇeagtt|;馛nzEҘCw2z;Vvxkmps1JJHJ~\u뭷n^tD"NҢ@;:511ĉG?z;*]X8,=ѳiH5jV-+]z]h%ouB }sYͻMޱV{/MoRu/>tK!W]F ~J_û-L<׻p~"i7ID]MS*En_ *7z9{~¨gJ Z;@SjoU[4SGY:jL f6'@;[H{HڙEZ@gJz=u=L!hvLP]˥aHDIDATqaVQizL-:>HK }ƍ V jZ~D_3tMBq-A6hi1xђA4j}~=t\sia1xQunk¤l^4+hfvnPI#l*~cg3 t";kf ђAZ0}ɟ \Msڦ1=,v|xF҈;spDSp>;Z4#›*LaQc {F_#l6@B!a6 3d΄9@6sa\!7Tq.C;|^e evK04}8&ЙL &.hG;v~oa6٭f'GevtZ 0:'iUp `0'IENDB`video-downloader-0.12.24/screenshots/2.png000066400000000000000000001770451477332155200203600ustar00rootroot00000000000000PNG  IHDR@esBIT|dtEXtSoftwaregnome-screenshot>)tEXtCreation TimeDo 09 Nov 2023 01:09:40 CETt IDATxy}{f`D1 1Q!`&1Yc0"Q7`@X5E<}pJxC@@af}{gggg<_Q^DS>%""J7Zp?Q[] tDDDD5cַlnkAm/ѡfu[maV[slFDDDԒ@fk"""֦Մc,4<|KDDDD5756DnցBW]r&""BCq 9H'Dܚ9&"""jtkZ.*L7נX>|Cr<-4z<]f9BCt]pC/)9c/4:CBkMl庿שm9""">mu ԅVMnn.)Dk 2% r%Pkη OUqnN)Rg Йk[eSi.ABtut!-"5i.P-U3ogNjts|3|=m !"""jVu|[Tn.cuaQ2BtMA;m^ښ*ɹrMYX׭IҍhV[MnXKxrQSd"MDDDmMM7cua.-m2H׷]H$D"""榮<,g ;*TA!Ct#2&"""jMrbwP=0܃tm}ѹBoM_ore """jWsdt/8qȃ}_53?A9Wۆ:LGoBVjtmo, 2"r DDDd !:[kGβ,<^CuE.tX̞h?0g>Yf&""(34kLϙU`lud>rCZn֎B4}]M}h+@ĻOiHDDDE!R~\IL. 2ol~8 Gs ҙmZ>[tM!~!: ꫯ3p!:!X&""6IkV/^8L0["siz_4P=0 0lʪi]:o6]3[4,W%W_}u\s˲ADDDDm뺛|ͻ. ?\*ZB[MUقtf_tfO̸0]_첼 ۻws:u!;=N* @ ,gft!:4v@z;g>xJJJήӖqڵk3Ct*}HmyRb?n(޳g DDDDuWRRr={Ppe2vc9$t"]m'F#l-+2SNj=:u+23el:[u>\f33ڡHm@>\'p+]2|ɶnSYYx<qzb6bz(DDDDA;'m:Si8麜d) kF|2÷~饗]޽{qAw^!""&dv^zlbe@۾\Y>t}f먩>sK8ҁw^:meeeM= """jB۷o>AI5Uk;0*lfhN=ҙ#6URRl/XYY]G㠲ADDDMVjtC-5 !HgٙN;P!x=vqm^<>Sxnhsfy}Yn߬Fq]xd@k mۈD"b,ޯe\WOʕtv˃7K;HHekg/s٦_!"""jU\EEEEoH&H&@,CIIIC̓ k@ g#`ݨ!V 5a)󈈈Z*9xx(**\,ߪsfYnڪpt"""!:BUɆtm})۹*͙}9tjzM"""! UUU>!2Z5DSi"}vl߾ADtH[Jtr^p-O =By ycy1yd|;%\ &'h᤹K0bĈQ^ .ѯ_?]ÇsVe|M?ǿj*#H`+WBks9'Xs=wyݻw޽{1k֬`eS8b{=tR ǣ>ڠ׿GAqq1N<:c O:]v'bҤIشi:wSk2[;j$xM[n!Bg}ѣGcŊ;vlڲsA$?9s?g?/"vYfU!شi/_N; /g}]l۶ ]vmM&:$ ƢEp-`娪 vxwѹsg̛7mK;wÆ Xx18㌠RSUU7x[lA,3<={bm=~_a۷oo׮ڵkq޽uwy9s&>eо}{TVVbɒ%+W@ZLY4G̜9+Wg]m\;vu%%%i'znݺ]v,Y믿A,WvȎq8ݺumظqcٳ'w?J),_C͛b $ G׮]qqUVVwO>{fW>Lg|طoi=b1hDҲB4Zf[n=XH)qF|'ioߎ[nG}4nVѣ֩2ϚvءC@߾}q7=ijɆ kûヒ={gϞY{ڵks}7Gmݖ1|xBi>8~|=h Ӡ'z͘8q"O;uS#b.R(0uԠ.V^x<38} K/RnN"H{GA/++C݃ /%?0vޝ ŋ[.m/}KRbݺuԩzDѠ ֱdɒ@͛7eY?~|~DЯ_? 49O"?:_?>@UUO?eeeRj}MD`g?YOӧ{ؼy3&O\u+ҍkիqF?={DG3 $V^ n?r n@~cW/ .ďc\pصk***0e:}v̙3wszӥK|?:N>FB^ꫯ-sQG/ǂ 0f|׿5zꅳ: K,W_N: hs{`6>3^o Nwݧz*ʰvZ%%%())I'ףέeeeضmz!\s5裏`NbL&A϶߬DTH$R7nD^0uԠ<}tL<6muT^n)`ƌ?~3gNqټ+x嗱{n 4eY28uY3 PnF~X`6lP8N;4\{m/2N:j1 bXxZ8;0<5!Ϻfsp;"1X^fXoQk$ۀvUː)#8@DD&8p/Ү!Yp8[~/vxyd$[6֎0QfYJKKl}f kD-:5Vn;%)**j*rII `DNdӖ^&""""\tiiiKlhR(**B$AEEE' b1vVA, ۷GII 8$ BmD"b1z`mNW$W>"""j~,bF#ctH3x~#""A::mM= """CA:CdvzDDDDZ01f, eeeD<gtm#MDDDmt DDDD[; MDDDDTi""""0HAmr֎͛7C) """jl6;wC """m>4Q MDDDDTi""""0HA DDDDD`&""""*4Q MDDDDTi""""0HA DDDDD`&""""*4Q MDDDDTi""""0HA DDDDD`&""""*4Q MDDDDTi""""0HA DDDDD`&""""*4Q MDDDDTi""""0HA DDDDD`&""""*4Q MDDDDTi""""0HA DDDDD`&""""*4Q MDDDDTi""""0HA DDDDD`&""""*4Q MD = +ku]0`~CDD "jh?o(w;#F׾&]vwcŊ:u*N>QƊ4Z:uB=СClڴ o&LS6К%5~ml߾~aScEZ1c;`߾}xG?}ݻw\Xjƍ뮻K/{A4… Q\\ ꪫcΜ9:u*ߏ)S`ܹXn8\wu,}Yl۶ '|2SF 60z3gկ~}Ō3p7 &HQҭ[7D" xWp 7;ocضm`С˗zwH$P^^Koߎ?]t N۾};~a'|o}Qcg\mOcAQQ֬Yɓ'cٲeΝ7ظq#?p^6mk39s{ŦMpaaʕ1cF^'"jMB@J󟾎;"Lb{O>$^xzꩨٳ>,ڵkqq,_~8୷ PgVk/Rkxѭ[7(xw\eax0w\?~<^TTT`Μ97x'ꫯi4 ̝;^'"jMٹs'8lƱM6ܹ3=\@qq1FXn R +WĊ+PUUn ۷ŋL&s . guV0\cƌ3f lu㣏>B<GΝq9"HN(ix"z DԦ9Sa6*++-FEEE}^x!ǻヒv3y睇 ,Z+V@.]лwc3|u;qg;W_d2u]C`&6!H`H$'?xض?@@[=\DQ,]-D|yDK<Ӹ֬Yݻwõ^~a߾}iٳ',\(vٳ'/6+ADּy / c۶mPJ&Mqh; IDAT߾=ƌٳg;9sP^^]vᨣµ^]v8묳o@rqiSNؾ};m֭6l؀wرc׸w)%v܉QFT:vÇ㩧 ֵgTTTy_~"֎i"jvލM6a߾}ӧF'x]tQrǏs;v@QQ.r̟?|~Y K)\[[G.&L@޽s`|յkWy8ceTTT뿪'? ZtÀB:5n cǎE.]cz8p 4k57_֛q-/#Co?wL$K-DDTn ˖-}݇>CD,`UG~F:wXx"MDD.v׿+W¶mtIM82"i""kb„ 8Ű~z$I7GydSQ0HQb1~Xn$?x17zhDD=DDDDTo&""""0HA DDDDD`&""""*4Q MDDDDTi""""0HA DDDDD`&""""*4Q MDDDDTi""""0HA DDDDD`&""""*4Q MDDDDTi""""0HA Dt~x^>HQƒL&1`lݺwy5r{7p7K/矏#GDEEo]vU{ٳqݧc= .W_8x`r~;Aku\6ljժ 0 7PvVVV+9:uj]~嵮1M="̙3[l]wCѠApI'5ʺ֘2e 6n܈OD$֭[(Xqw׸d2Ǩ}}f͚QFƑG,i&,^g}vu=cY_+-˪u{|Al۶;v,F'u}DDA?hu?شiϟh4ߥK~i^~%KଳʹΧ~{c=X,ڵ+8 \wu9s&`7oތUVkDQi[,YUVaذa@P\\\u5vQ;v,Ν믿\pF?0|̙3iӦyq7cxZF /z+>\C=. ^z)O6/+Vn[ J['ȑ#1tд;/B^e̙o} ?ʬm&sG믿ӦM%ǘ1cF0a^y8p [Vϟ#F4Hݷon|͈D"L5%i"jr{G?‚ ЧOg?C2ĨQ0vX\xXx1&M7|3|I,\SL5k0i$(r>0HQ>acAqqq>}޺u+IO>Oe(N7߶mPQQO>9ڮ[=.]@ځ5\_:of} '#F`ԩf8#;vD"rt5R >/⪫ʵ9r$-[3dȐjرӧOǘ1cйsg:CWUt:t@~p=`׿s DDAZD"TցH$h4 q*z 7D.c)..1EE"4k/oܸqسg}ٴбcG|YfH)ѽ{j9K,}݇;/1k,1p@<3x'0p@Qcb&qZ֭C֭[^ze}$>]뫯|6foΝ8pz " i"j>h|ؾ}{%%%Kpbڵسg~t gqJJJp7 ֮]]v}:N9 ؾ};n݊S'vwMO?XhQOXZX.cǎ ?3x뭷Ю]0`">iIP G+}. HG@W4D0Ұ6yH-a+@He>B3vh(5 \ }8s:Tm%4lGc[ګD1HRy  2( |&T3ד %m$dNSBЀ ?Zx[`!Ezn֟AԢ7-AvC˕fRqZZ@\VA4[f5 VjYWB1h(Ҟ\s>:SLxDqd~y\ q= -^@,."paB7]͎">B)h\9_%@ DFJ! -4B.2 @x%PQ`L*wH~  HhHoB H"-LO d4 Yk/}{ٯ+(w7e:~pTS Wc*Uɵ,)! 1Q)/xgT!-=B5Raԯ؅ !$Vp !A9kH{E6__=Ѐr5GA)G@)yTLCd]!`% [0K N&!T&z/g;?@ "j5Z!!,) i0):O/TwCrp]{qEEElX Zڳ+H.Wj(?( aWu0)D*PB_.mSjvDJрDx40Jv *:}<~\BtY! ۖpF2\3F{96TS?<*oie kiPt,`dvx.´^j”v08"sTHRp\mJ}`9?WNU;+jh*>ϩZx7nAʅICzpNӪjojg6A,;,5L% m€&t,+sx-$4ܤF2梸BQZR„e@UkRR 4ԟ:_'kpFRi$@Bp]?6.(@K W2?~xT--mVRH*24 jk !HL@ZɄF2j?H-T0(X1}LOצ#=9 e\}oh BeY"5M63VP9q]y0޾ӅDH Jᤲ~ (UR Uי2 xo5{Q M Iiy')mz!>pJ_ ?XUp׋ZB)Jq%,Q  VPHX@eH&F j*:ZYCOmo6.xdiH:cZ;DIA{4Aȑ@5?QiVTM[F* IϚڶ8,K!wLPJ H۫ԑ=ZB #tb?6BJ )}m[֍}"V-9?u8^%_J7شFduц5$h X  :I+Z`p @Mo82 D)š% s>ϤT8 u*D/&yekP *%%viQʫ*RqjU둮֪ ҂ Lo]%@&adS1a-4-07mjHK!"5@"nʁ 78Q3cj@eSSʛ9$oAz}5fyo*< :pCr\6~~Ц'v0%PT ĒJnZde>l`&j+Z!m3K,[ڶ#KN2-)-lEpt0 * 쵆%{V ;+T {RҴ<7i/ !fayVf#Bga®Z \h8BEv,!S3JeWg18jAЫnWAGdz jJu^?Ld- ګ\aNd^G"/4'Xd{3< R+82CՁ,}zc&+( NDa:}|ɸjW3pC}T~^mD{5sCD4Q+$ x;0{W.6'@MߖBC FIbFS&HU+ /{o7dЩ'teåA8G|_86Ze,!MB&l-vB$"&-!jh5ovdfoWLJ{SyI=mw., (jW 78$,˴-9PBA*s yc/"QWCX,hئ*~:&W8f~V "jZ!)L%X{3>fB, )݅iJk+Շ- DhDLB eI'Z^ N25C ]ś /~%`.jUYlۯ (u4ksTLEʣQ v.Xvp.9:6̹}.k&^C2;;ҾICBPFAZg)o Cy}ʞ폘Aj(BKH@ƢHH$\2*؈H %!@&vS$?%h #󧔂@P 3  ]cvxe> a&j4sFpap_:U_~g% #DLBmf )LI.` su@)QdTlB}^:- -)QT\-p`JZ{mʬ_ތB"l P B)4RÊɤPE>2zd˳ &j{Co .P꽼 JE_|fA".T5zP3yӼX҂.+*) ;bZup\@:V J9q i $Ű-sG VY9PʻЎ !*13{R /@*Dz1HBBxG +}!!]:cpJگ:C*( b^D<30V'VЖ J9= D%ס"'@` [ yD;%жy7U3y5M HE Dk»T-qR-TP Dl/ ퟱgalK@ñL0OJW jOCmL &4AAZ^VK} 3?4Śp{B8W@K'fhX0'ĥ..z} %sl* +,tQwһNTYp@N˻uG̓Bò HIӇW˃(m.8$.".qTQ4j@k@>T4 >"jvZ!)mI|f2o@=贳U IDAT|ڋʅ%#C<Ħ AL_x8 *-RWЦhjPPOrNT8Y\KMOpif67 P@& J  HR𞡃vř ID()\ ; H38~* [މ~xwls%ʹy\şZCgV֧𮑮 +aiHqJIKcZ_3(KR nD8BϮPeELg{ow hja`YV_Q M I)u0@p,t(z>U5Ky%XoΈ|_gHH jp4̴lT9Y3I `"Q]M@B aYZ. nμC \K@K eJ;jImkcI[1*ak$,t,O*1˿e_KxGPBKԆvrڛ]D nBvpʊm@pIsuG KD  nBi8VڊApԲmṳm`&j?3 &0׫%U -LxsC DFop:e+lvxPsіF0% {8JZLϭ(*IH@8L2vlm&jefeեAoȑҞ įkHכk/yQR'%Jx&[J7O4! xE-w6*UIƻMP&Q>ßDeЮ.^Ud jA踆.PUfAQ 8x3{ eܗJHh( epR,`i WBa4; X_ieLQk M $laAI,Mp&%9C5@yM_:mCΑBMGvSqua ^%`kA{Sio~ BF5Q "4cA+@PQh-m{?N> iDh6B`?k([CX /4 }'B'^t6cK{na++ގ:E,jhm#7""ۯ$u[kGDfKݺob-(ɺx4c #{2 ̀ a?€_laCa 6<c5DD"")5[Uuչefkay)}xx.cGtoiH+ % CI.":l=$[i+O% :U i(M\3^ƐpmI%W+4 $C)€T;P"+D[\#RCȌ3.f"=cıA@h]˱QFPDJӣʮjbGwN?Oa_7d<̇1=m2-tf5K;̌K1~>.1/]{}۾sxy-FL6*NM`kG{4yS JP1UvD`6T%\$5z^>P$? Ԡ45}$`;>$(K.wӊ%U x½!i33>ƘW  [rS)ظH:X "(ET36qg^ӂyGtO_޵x>fnG"AhCC@h  X 5G1+ } a<%|"bP$ؔesU2*cȇw3Q8~Ef#G'IFn+Q+# l7wyYTˊ|s$ƒEH?>ǤeA@.TW7P*|"jN4ueSd[GS4cƌ)f"=c4J'q8) 9#\" 6?+u}$PSqNWhx )wҰ։7;'|4Z4]  knP#41l υIәPgdj3#c[-;*cw21QWf{V\'Fgs<-AsNi#.N%YSO}ߠpPAځAkE)kLtÃvNYj8Pω(sa5gB!J]y~#⩌-Ol 'Ħ}v{NΉjx:͘q13 4+tlbd6l1e2GVԒӔi1i*80 1)ə^`6;"Ι}G R@ZN^/PY"ɑۅ0aG/`KVsq1о'rIib )-weƌW31 HK}w*9l6*OL̈́]B5AjliVD z!?;|<) 0䮆n" v!mղ^rNl%Sv5Q/;n[N ) Us wZ?T Y6υ^\Dz)[PN-hcɐs^6{7=C D\8QNhBB'B(?8J>tG\Z'_}t.qǏ}ƌW31*$8V E,!bQ5e/w0!wfE3~Ŭ"WSƿw:ǜ$eSrI@qjZz䳖m?QGF=QuH8|v_m/6Ʀ-hz8+kUE6anD]R\#6Eh֐L:"[a-\ G~0H"[%Evwǿ9vܡ7 B x[C!G=D,& (;m?@eӮ,䌇pVtϘ1*c&3f\ID[,l&vxp7< )xXlTL xJ-Ρd7*#iYU5ov(ZuL ˓LdQ)IUI,*~i IAҪ~'+lW*,uִfSu$ `}# !1hDP(­CH Z ,QqB#Yd-caʝIN̢p^LIȞK![ϔ8h%5f%C$8Ɣwj6\pܵ`&@(NjET v`G 2j N# #Ν6f C͡zۏk$Z} pUieW "C=3f\eDzƌ+f5i#$$M>f5[Sڝ=/Qޭd|b_i"W8AgSL^՝VJ?`Isczϓ{)V1Fdkb,ZՆOo>$"*K &զ^+s{$p6u6RL9OB@=]Ve?_ z$,-&e%0Zg2ϏzA۠ӜmhXT-V h"oQM6rQ8#FBe'aƌW31 "Ƹ#.9"+2㍙NV$ZGQ|zB.5)& >ʔ咯'6Xrʊ ]>X +1mGKEz$5b# R(>jRUo!X&z$fC)Z-Q`2 ~DL)fEs[Nּ{p."r҆@"ţ9E;E!/{s.-}H"lV.i!zWouWíXb[D<TwO4Ubq g̸ʘW As3ɍk!مP^U5@J^c%q }Rrz5wę!҈ e-lZN^ H !.qxc`Nh2?cV.U2L&UM q(B%ٕAQ)J+JIr8Qڀ#UuET,41FZY7׉Ja[&ճpG H/T4/v OpT Ɖ1dCUNX칻OvqqRT>@֑[4 8X9,F*)Oׂy" d|IϘq13 \Z6 pɞZ+J5Ϣ5 .4IOD m ىdRk]tk":wutYpA^(h6(m6_6 QztDkS@KNyL,)@l >aSd69j \gkC|{lEK_{ngc==f)6@΋CBIQõMNAClm Clֆ6hQDs:gwf\Mv@\v0ppmf%Z` qv?@^Y)*Dzƌ+HϘqQRO9oǢV>PI6'E#nb4VMה4kw1vc]]`LGHl *r!ԅ7Evn* mhx 9n6BK'㾢\'w:+!uh^:h^x n`(ބdpqOAM( s8>~a,-g$&gi:4!/$<;1dZh Um;uDӇ?{ۺˇ\"`8 5piXw>c=>p\sng̘Lg̸xt/_d`gUKHs' z .z&-Y-GS=r;.ǡIr? Z .dtY,ozOm]S"%+gF {8筳 IlV‘+O ƢW8+9Dp@eҖvVTX`bc󙃀 &!ǏG*58PrGhu 'yYTE6f\#T60)]ĉd~cc%s:)8VƅK{uMǓUJG#M +AVb3{ՏiwBq\. Ղ^i )9yJ%YSD# %sQg(;yw6m>E'Z<.u 1c31 byZVԱ"Å7[l.LcӺ/4DW`B m 57hZQ2QdB)*~%A:)JR'By xV7"N6tl@ĺ4\Q~X9vr t-tiDQuN4M9<7X ȷ Ѡ|l_b%[b~QOeRKQYq'JhGx;t'{Uz!EC9X.'1씌l9)|'Ķ<FUm'l`vɵiybFҶۑ)Cm@ э,DYHAXq`ƌW31 q o2>; @s9 &b %"i@Ϊ*?@JUIn 1њ{AsJ/mW5zsF޸2AduR5GEɊm*4608qE| .;+iH0&ʅ;q.<@p80UjiΎcCi]vq|n1@@&ɝUc?I|j~.$C0{ 4ㅒ^jqej(Q"bF{ O{ZrS"`L;6Bi?,,MhCá6,h S[ь3f"=cD/B@RlkraSnQaUͪu!YBcZΫoZ-i[!F:6[H><1,0щ+ wZjsUt%3PH(Y}`+@h'"( ͍_<8B@WNCX"lRp4uL@\Gu](L'YEeҼ\Ԇ;@/#+iY"}@腮edJa0CEG5h# o bU蔨M'}H#T䑟lZŠVCV]3>ޘWb?ٰ}C+EkS,[m!^UJˏ96Gnk#n"W!7[NDty@LvIuZW@ë9jd /aGR;ME#ow-] :#g>{D-mY"$4xI)c;)#OS=ks/YY.6[egG$ZjtҢq= lf袐zuG?l@Ct\ ́`uVJr.ey+;5"Ҟ+n64zF.IH@3fXb&3f\AHQ˅z $г5%4vC2 p]ћّ0 n,b@!PSA@$Nk# <4!qg8 ^߁Юǃr<^:cr" IDATE1g߸ϽX! x1^o[ZCa)%.NӱKpgpKIlGR4v!uqNH[vt-X[.Su("\jnmO<:4doPK]IY(bfكl?cK R<;H34wEVۡK1q#wEagޝD m@ w%:ygn2cƕLg̸ExFМn49rat";4C%HP"D#18*a)EhT瞸Z$rqQr?Hf-&QYuZ￧<8.-W¯}&_xnE#kr׿qBWy/3Ӝ oTN3hzRvP.Qs64BK3R:$FrGlV/8cxآv=Jsg34f"=cDh>2WrFF9!M(} 9y@"]$T ֍Kp38R4r  QCm}RIK .}ɜayDw:0xp$ܹn{N7"sZhI$VϖuSxH$0F &9!x4Ʌp l 7p}˸Ԧ7=& fMZ,^y>R zg=% 8h{_Rn ڔ[#Y37Wg;uSn#UtyR `y1f+9\"OY!wܐEŊ:ݹw*u1cƌ#f"=cDP)921\ғX=8=\p 4Br\Oɞ$Bg3ِ8iOp+(B o'!4(yZ-8n`4cU9h?_> ߃[[d6*Y _z'c%owּT j+漅tCY <8]­u`EBBwCL3#$&ņcӓ"o]ҔVlfu1KX ߦ ]4`mb9nyGжt"~C=.ٮA#B Ōqu·ϊW31 b줪y[^] 7ѦWCmԴܽ0zޝsIhs d=$:g֖[iK(,$ lí1 !o+|ss+W>f fi߸׮^@xx ޽HN zoF{@8F%΍Ȅ W%ԁns8s'A+oςOz2e B7B)u@'*Hc$ZT]DK0?Z'qx;p&ǩeGhȐr7ˑHG0 [б|_i?dGOGQG3f|,13 .{G'[PUf!V \UT4+cqDIP@)BX)dghN$'&& Xkb naH 8huW>Bg7ﳕ7:+-kkM=S";{"{k/ ]g.qh!<;oӂ;v$E]U?ie"k ac5&˨D{i1ZcyObmC_R5BGes㤳hQy̑jB[Ļc6b\Љۀ jbwQKa3/ 3f̸:W7>Dp6 " J$%4wo+[U*VyrqF/$uP6' Al8g[|j#klS$L=tc/#CtP1<8bspS HKJQCX6 xECut 笅xg-<}G=E@o-4eJHԝdSOωч+XvlcH:[ꍦ<9Z]G=6Ig %BJHx#HcEJ!Kh)DUVŽ)qx/!bL"q&S"n$#emjmc8I{t,$% )3lU5 eGgn>cULg̸huŢL[,nqq1B E=,2CJ8%f~|Ju\@LPQg2ْ\P6Q8qL:\*9o9نn6@  QH| #k :l4i":_{wN;wr%f~aU&ρ𒰱=ˌez\s8IsUSʱjQ!8m8<8X\Zͬݘ58{&Z~1VI{>E\Kj_WRsm X)lh+^iS,&)!19 mH MpE/zBI٦ 8ogWaeŐC3f̸WF#lכo&j Mp!?ٰp'^aВPDW2x/7#X `Fra a*M9 t#W_Ƿ^_I"pOww|5!7F)_,m- PVn~_v"vi&%&q.`PS#$N'"[h ^ sGɢꆠxq>׶sc _!_{tXxʍaePcI_xsJ{ʟ_)R6^DK(;e=jua}.bU)7IWS&RMFr;(5^L?fi[L㴲ȉC%*<'@qS>gv&+, *vP)>#qZ4N{Jhqڢ!},CBFk7h.S;ʚgM?ί>)l}3f"=cDv)] 93.4Ķbٱ9l_S2'ԏfxXVud2ʂh1WZY}]'pᩅEs~M:b$S˖r8ۦݔsZk'vc]ZGhtj]4<-CU:(]Nw!ǤaDZiL1"`)  aʍ&ZΪSDavE3+gl(H148q# YN$) :A^a6pz3ʝO;pzwNȏΕO{ENH"X&tRl 9q%²+xعl% f·9hX⭖O\_{}_yj-L-$Kz੃U{~[=߰jUKh W>sUJON# ӈ?{Umy=)e֍fz7':.l# 7u*ױ<*O}SWYR_`~43f"=cDNJ`6:(K8tiSAKc #|HԮƬZSbU{qk9!n-ዟ?bln\on2S|7sݞI!oW{4 !ŧwr;sx,?}w?~Q+?kɫ;w1q5;K oΔƌ!^_ goƷx>|"/]["[=޼%Vu[W:7VJlW~y>uXZwoΫH0vp|M/? wy'< .r9bYiju]KU'U>Tbqhwҟ}!羰׿r/4nGKX:߸>_wi?$ı|)~vG@pOfkH ;l`WiF=o}n8h, 7q"S+ytCQ2(?7oyȫolQw:k0 /^ю'92im`orG%H^iS'/J!!M2Ze㐭i:Os-NiFX eo^Cw`l,?ZmhcD2ruR>EYo] rI/gtCBiCN>~]:{y{Xѳ;cbD=3f\eDzƌ+ /d HzaMk]T\{+8A)i?a)[.rrk^VW+<CÓrOz7nE Og@7)/p%|#-=pK?-O"%5/sXjK7 {;yN3(݄w88rn?û=բ%nYrxAh0YvjьQJސ?3ǩhΎJ/nn7нH/.kJioEe⬞.DMY;lePO;Bvi|V[~)jZ|Wnp1u?NeqHGpן]P"%_|s͹9[C=wJ#`xle_w_z?a'a8Fc/:זY3𛧼@P{/⫿, ,y."GpXyxO݄(8NX-rcW|{_~cS c-cOlᆟ|wOX,ZV/Jε thg/9rpi[8"GhBadZ?[tҬAIw_ .RurU:k8jxǷ7 6w3f\qeK4cƌC!вV9qGܱdpߧyoMpB2ۄlAb++M $o{n"j傭`J,w 8į}鐯\?(_~$o펛-m~ *^Co5 fXNr;H_<[^,SGgjir|N?u3p!| nE]tAjT_%.~@4mHQx$T+i|'MQ c8 4APж M t.2McCN(4dW #r\oqu<(NJ==C3 ?x:#+"ۆwiD ;;Ͼ_Mnv|Gvw*dp[",0,0<1=p *#hy뮳/x bg: nzsH׵,'^Ds!gh8d=|?wI) bOm!g S>uՁɟ 7XyF;#g[﵇= "Dr0wek aQ{;\:G7;>2blr3f̸ W&%MC-s׀\"6>a!hiy\ pЋBMa.6u.Y99=as$Yrٛ?Vg^X&{z^#RhKFTk&=uG5$.pE(w4r~sG<<He^&-/!v)Yd  W^Z _k}ۧcvr >s}y!ϔ̊?=pX*>t5zly_~ɜ5a zLE wqHObswR@e""v"N?*1c31 B-E]%UADƢ`*v)؅!6HH}[#!̅E$'cl(2\ 7ML!(1·zs'uJU RXdH__49I?)'|$'!1O?'9>} 7<{/#mM"@E=q| Y2_.C朜ĔXR)gny4\2 EF|;V|t"cqf"y%q5>3<&\.XJ/;NWq vZ)Ea QWa:lCᷥm )A1C*n+U> ;o6{} Y`#,Dz[SEcxHKWhAUp*Jׯ3J~ oN\L+9Tߪ̞Ԗ`s\-;iVȱ+P^Ri닦A7c4ą%+s8uaeN_F٩p}/^Z)#~J0IL; @_?~1_}AcಒIW_:&Wq+ ~/IxX&G6|8Wі \[c=8C/\^aü曶7W. C==_}j娔$9[@4v pR+4kQ +:|p?zͰ)gKd:{{ðXK(kP}>쉻Tr=(Fwl! z,Dz[#HTBQy7D G[ſe@ I^)(>p]fFVH;HKlsNwk뉇.5E:W^<-_Ll(L ĕ)ƀDps.%R=ѸWG ߥJl9?,rͧ0W/]"aHɨY-1bF'vưR|T;JN wC:6/S Ug'1MNX'E8 )CMVq{eX&1RUJ$xxJ!reu'E&9)2*="AÉ8GjxB,XޑڜT D (ӑ(t |B'8E,EP|iq4~d8h껉'ۿ-(eVu_V>㯞p4/qGwG _e.^S{?Đ Zn^:Gk j/jx#ID/n\\N/;j>ѡ`-g f,Dz[t ݀C}_בHE 18boFHH#;r"tY 7󄚐Sb#pL<|<ͣjSwo߽໾k+/<ůP C5q½w9Jշy٦NDy5K|W;D3G]#cF o5 :?1?5GNXoXwţ eN9-±x' #p]<B9!,-G[~'+X8]k%y_]]cB8:Q5A#'Ovs~tgIfskJv+.͉ ʓ `tI) i*d#fo1VKUMAyt9*D7h<-›#x{ҹ{!2VľK~iYS6F3\S895FGwVJLbn<3a5d,X ^65|et.xYJ<.:(23V쥞uV5[Q #+ 9PHڈg>p>K> vJw(a?|)Ggځ7Μ3UF$:׆Ձ<-z'|5OltqR5Ѣ{w0e?|&5˜XwDD)q8F2P;lee3M +V zqeRSd빘sSwN{؅==CR%O^gwPz=!?\֤s`[H/XpDwt)1a:ʟ?ġ=S) Б胂ȃ]Brw܄?oO=>'8XGD#aG#SPYuo2-$^Ǟ8#O8+wxEC(yŽ s9P-@B% Ƀ\Zf'Kk wS*8uf$ۭaJXŽ]딡H@#'N~Ql+zj0ʼꀧ]ЛoG%qڑs)G¡Dzarq"V\xF溌0Es[arOA$qPQ|^z~Z[PT`B,TPZrT-3r2׵E$ %+h_8dQ.չ&3FY:!6?273B-{ ߼++~_zw\ě~9?k\3::RTlʡSza;6G'l׬7 1cKCL3e+=dM啪z#ڜ‘#pcDuЀHvZ}『gt UrSv|mc ^bZR9Wj"|A'-p-CEH@isx$`h$4 o29Į$^ڡjwI렗%(аMỿ]GRȳ-|;~w.0`g/y:ɍ,囮({Uk/R`7pO>A s=IoVBK'olukOT3Rt]X̙&Q]=d˝׬!%VlDEcM U8YL4IodEIDMd3֮ zٌWE%; 25q%m[1p|^-Ў n7"`-(meæWI k% TTUXIP@0BX?FF_ Ӕ&b$ԩmh1hT[JsF7b.5M$Z6 7nFS{ f,Dz[= )isVKMU2F1V G"D˩䷽`I`G*Fȗw! \lԹWم0V#5CqfZ=Yx[;\G;ES(H f J 7VOEs#v&(V;01y,V"vQ pG-jpmnڬH;!N'5>; $@X7 q!fED Hx`ZcsΓkˑ:鄫߿=v o7h4:̹3:kbLۉqWȓE4|jF( }Vs,Q5)$^jDc~`9 S|ba7jׅY}}U8슼DP}ěvHن+4p Wku,f>ڱ`B,hD c+A:a1hLS>dfMQP2[(ĽheA"}s7_dZsL ?MGAQlǷ2y%Jd%!&*B!y^e<$n{8:UACwML=v9"F&1g,UW8HyiyUޟtnɽ-9 eHY"P 5kg ;ZFxׂy8Fqj9|v oJyW/Xb! B)0_i"^ uǙ:eDPF/VEȽ:%5BP#FNY\-2Z3/inDQExV.-oOVEF kQgF+ 9Q/މǠ%Η ֵDjCqlpgHJGr46$xGЫ^̍d\MȺy*( ur7WM#8 Y{o0FτpQuݾg(d Dre½e? \vUn85ةh*|\k 8W qq"9"DZNgqb @]Tj%r=t*֖;9O=_x ysԺ}x?B 8}f\i;Ub^c! B$m[;ZҼ:}߱>ZIlrPLѼI8VDgіwST6tg{MKu.4s Sky{orZUBsHSU; ɕN 0u=O&c,y[T*{mY07>j"mѐLqI<)ƅ@ IDAT|z _%W"Cum䅫yvF+ƫ51زũ6ҮL;%:LE#M`U`59:c_eXKQGi&5BUi79$|*X.h1Ԝ3GV?|@R-vp j$HɘY'8J[]J.)Ik"h]`B,wԳ^ \lv\A4)2Ht}`rWbV!oZ{VT_;2p 5,8j }n뭜ŴgV'[b-ae ,NvV076nkb L =c.HٚՌὂx?zܫNSDv[8~=yί(t V1ؚOĹN 8\"y,G=H誀)&`ҮڼdPEpr5[PT?N&xʹ'cv]]bX=!uIX-0Y WNqlkB6qPVo܈ŋD/ ԝ9ܷH֙9F4ۯ n"`-}TIӄ .Uq+qO: BKhw5V*80d\ +@??;7J90uRUk(dwO53 3tΗ_5O/§#׾) ?K޺̘iZ*ABՠ`txj 2jwbVDTͺHd_ <\EF(ﱺz_XAjq%Mwa۰f w5E]B-n)]}d]d]]5LЮ c2D')ޞ0&7LG'}^`],Dz[!Vm`IԥZ2~J;jYgp2~e9"xmr |P-+vO;yq^`'E:fΎON;0JTxQ㕸[=H[#`*\bRH >9|>Fx׿QlD!,J /`?Xm)Urこ])Frs o9U: c sA%fS-C>r6pR 5zI֝ќ+ R6M)%ϬFt;bXQ uX;"Tk&*'g#%}yyWKDeX;>#~s>>pQJk^z.|?#o; LB#)b aPVMpu$Eu"5f#X2\9݅RW r5t.'T[QH[/ØaAB/^?Άb(Mg,%:Vkv'BΙ)A)O/X6"`-DV Cb{?Xf<')X2p zϪU,(ι|rN.U'Lz%=HnP[S0XjF+&+GT1N~x>og\]+x?s }nue0M9NB?s4ZU]kSW{xD4+uUHH}R:ڇqX^g'>rg +>p/<0q tABS&r0S/kovx!E O|~_~0I!~}dݖ]W~ /+'Hx3ouOΙƑˢ!ve 1jw ʻA¦5MöPf˓k.ESF^qxzL)|jZm=лͶA2Wʽ! '=<;l:Zᥭ%Sqj\l4D{Ej|O`w43MP =U ;gpgƺr`;X f3Ԓ:)tE$_zu7+aqN 2Q(&7q%W&,Xp{ n!dXJSǴd19RzcRv׈ա;wP㤾L{+A(NJ=[1<8vL$kLl'e:J+Hʜtȷ}jCKXms4֪xۢvoX~7Lg$Q¶5\& qSxÇ(" A7\>>{ZxXzdݴɻq=T`1_ ;5rzsRڱ26̌RʼHs?p5ײU32`,Ue`{]/i tIXc! F%nmF]>P 1C1vHzaLeV9|T72TO1b` xk(5a~fo&;SkAC1 epIZ2\6x#݁ 4a6ɹDeVM e~=uYqݮxB?#jEāBp I%csn`N8VwqkxM5KpA0ܴAs7ϟ 86 BkъNN\^C2Y˷_8x璙pQX~j֠`ۍH/Xp aR0h֫u99UhK;gE]apQ5a$zq1l_.4xMKR.=nfoһ72 x F (iC>:eDIˊi< YЏ(?q"igQl2r-qw3P_Y[h 3K־ye 1JQtcQ! d"ʼnŁ> N\Hisg>c#lTCR_)av/zIO8֢Ja#Y/8o8ebc9 H-˥yb/;3K=ZHve|~ n!\*C@lJeFFߛ=C,.2ODLٖΌ; ͷ(A*ѪsrD2C=<SRDUmp欒mISm;DV-kRkZ]b&w3];ѬM 5_ZF\D4JHj伖;^ß 6PY.0a\sxDU\C"My, %)|U W1zUbU#%ð"1xV]@.=s6m$ZU-ޱJ#Fû1.fuH+Ҥ Z,Dz["]$Ui%5:]uTnlJ*"\dc ƻlS ҍo[uJ{hk`42M%&V9xF7>K͍DG|K՘^6 Jx%-FoRİRFV 7|jݓcαZ-5:&nSZAnGOn ڃ$Ҽ\`B,U,EѰ ;qNL4o} RWswv $xα*;bk]rGEE;غn!Ut?WR-sxځ|3@Az:r}*.Z;~ʬMbL8[jͳ.γ+a1</cmllI)%2+1-N 7Y93DDka4m'L'==LLnXSs>~ Rm ق[l+;f=w yb %ls^؞ v=p ŝ$yZhݝQj5RCvpo qH]e!ItZ2;,XZ(NI\8"캃ƐQ.t٢ݮC2kapHd* 3v I>qt0ȸny=^;cLTH8@n;۾;;%cmJ$B;gvɐnEזŷb7>wkSs(Uo`y[Ė䑣k2zyb%IQxqFԀ.TwoA\}̪Ꞟi n,"$IKaD1lK%G6pl86~r>0aGX{mzцdXaILaix/" @`*9]S}u>RnYYY"v`6LT㨼gkV)ۢtiȉ@Z1KLbdrV.1&rf.g?<峛&&Br0I?WrCA" "M`ra4LR; Rؕi6>O횈 r&7r eggoLxD$QE[\cV%+yfJF8gWZ)w9lecem#qTL1nۓp“4yG( ڡ޶&R2,OA'FбI JefG.Xi7)]ѶksήWsݖw"'iAnJT˴mn\pX2Nm+Fg5n.n3Uu"MpT Ķ#66k/ Rbp yi{BO~ϞsRM h`:arGM<3?6v>.;ff BH!w>rl3cc-8|mA7럕LyImVv`۠p؜D6I4y7)G$ϣh]YM 2}ll^ IDATV#Ҵdܣ ˀDR"MH`zlmmLKLK'Rn'l Qn1k n!8Lȃz/~k +"ǖiYs *B7q+jp\3BʽSp9sq2lGx=v1`{3ERskƔ?<;5ajhua+8xux3 9< !Diýa.aޓ23zJ>6'賊E)ME csl'؊F,u JpyYqrWmϳؐShʄ%%˜_RW2)\;=&oE#%GK\$nPfSf!砽'Z̈́Eb*0#0˰{**gp4%8XyPyϵc<ρ\ EN waPY!EfX&rr串٬s$`#b1զ# j.{>9yr Uuor}.)p85Mauufv;K5$s~iJO<01ckll7)9k;ߢԨS vꕖt<[[6,m\W=a% Ęޚpe tGF0*{D{3ь8aθ+m+Gk(U@(RR)"'iN5aͥ-X_y|[JyCJ% Uh}:j3#HXd1Ԕ]ҽdN-XmQ`4>1~s.f`KHJO;j&G9 t]KNp$(ړ saV+h1=M*%Gl`w34^}S*'MGRJgX #.5a_ %)w>W<!_py#*X鳞~ )t:Γ[G]{}ȉ@Z$TZVtJD,bpCpk+cFm̹Цm'O\2u9s[*k ̗ ٵ5mM=H s2apH=5qrDYt4]0]>#*.WL٘)8]~>#9m=2V6S`pMG686蘒\YO2_Sꂰvwy漶<S*ʠ]` ,,~X7yh[}pӈM#Ĕ[%&v8g_0N4\9Qm71GmFs<ݺo30Mry`0p8W] 0Ni b m'nO<قN'"r(9.nl6~wLޖReGb [1JєfYh WF9{^):3ͯsm!C@[1Wʲ;ual´"s17h.U<{z~>j$VVJpكY0:ihˁt. V*'1WRtXlw;ޜ1Havvr2{̲q6m!HJgG9Ca;fc|d u4ܴMRLr{W>kbQ]tiM:Vo@dJinp'8ry/5R+Ր&NOq3i#<@DN."'$lm1ÚC.E#EVM|SAsC&'X#|spLș@kG/w'gy/[[J5)gC +$I,R@fݦL,$Wӳlxe9p4P[Y /SANɈHn5A 4o.ۣE.wHX+6WVl6d]@nI]V[MUѥǷ]ƬΟ5:' !{5ʹlSՎ;8CI0ZRscE9y+Ը4kWjWc>Aڊ-KpQ٤39J|JW }`06baV+A}JT*9H@_NS[ beX3r'o>}8)S^{,Dځ%yqB[#r58r?1% Pfd w/sεMfTzp(Fb(3"R?/?0іpg|18bL Gj۵i™yfBߔ~ڛYis^ ĸh{ʕ*Cv?ط(/_%#;JIfYph8ݻƃ~;V!%OLiLM$5MIofФw{˃5,q]oO |NW.Xؖ=PV6d{M!g7T*kDS -r3*j\q"pg wpΩk*G*=ݼJT<(s].wAKKE\I"f+[2咅r7sMu΢FuJsb1pU4L񤮇4xD*Y<@0KUO*bJlOьs1Tes( & zA岩+paujw8.}Zom(oqc&2W7rua]'6_ZR+V p<@2<0MbAcOcQRfVYYM2mش1LqҾ qڅnj<5CJR{R1; b8\#Mc&\*@jrzq EN }mjnbL&FӋTKX ˵"%d3ȽSD,JrIN#N Q\o8vK(2~J]9VCVWr锦ə붫2ܳI[̷G~ꚽE;BWvb4 vÎlz{ZYKjXfaTwYwW<,;;enyœ޻Iew3wM;rp1BfɃm<r{;nוd}UͰf;VER -r9k_Gf|Km6Hc<|ąTG0O %xDr׶%Rxc,)=K9-zљD$ux渚aEU'5[[F+7yP+<ܬ|b6x9H>QG[&M0Yp3v ><PyA5B>$dvnƌ3gyv:y+0hшiɏ EN 猑%1L@b@$85 mcKW~ёB-QDdJf"8[~*BK\;m4 Κh2kb.ᠢr0'| ۑP&is6>Æ] b.=qtfMveFow ۚE_W;C 6Ac |um璮l]6(@YC7YwvugCA9MiQ#Z./h;hpu1 ^ڒDੂc{W& \-Zq0{Ēqކac]8x XǯZ.W1J+ɟ3H׷ۺSfhR,qg2r99#֕~fJ ->|ź ^ 8+,%[8 s076LXe:(e7#u(h4xs7阴7M̵h5Id iJC-Qp1ܽkSJ1XpKG+ߠw׺mBu HG;fq{/p!2sm{GòRw?m??ؾ^2ܕ9N5gf u2IVVE `pyf/Gk#saGg۬%EsNd wM8;:DrF9R \Uֺ̓y];{"Llr]2)],n판m>yHUȵ>- nc|ԴA,k7AYH)1#k`.yȝɕݾ؞}=/="1\/5·mOyЕV  So Z1hw1¶MXrZE4tL3ݎt;kqwT"r2(9Y+$Ǩ TKcg>c8WG:q+L/OqIU9 [2#=% }jqV}P醺 jEN4"'PHRnv<,v܎ \&p 0o7GbTݱ *9k֨#_MYه[8XVDNuj.zߖ/x_>nڙpr]L&_<ľ>7)s2@]_{nno]׈RDDDDd EDDDD@ZDDDDd EDDDD@ZDDDDd EDDDD@ZDDDDd EDDDD@ZDDDDd EDDDD@ZDDDDd EDDDD@ZDDDDd EDDDD@ZDDDDd EDDDD@ZDDDDd խ9o|y2O|VoxxOmw[9""' [)eo|.ery?/}]x嗙L&zSd 1;_V-tKDFx7o&H3O|Voξr^n&_E%(>fЭ 6VVVn&H3Ϝꍐے>Voȉ~7A@yC+Zn  VVVQ~]=_(UޮO&/b_DDDDd@m*Szcz=7Xxf׽2"""""KP -"""""""""KP -"""""""""KP -"""""""""KP -"""""""""KnȵyWxǹpwy'y=Gi?c=ƻkھk뻮~'?٭x޳v_fﲲ>1.& 7xgx"u]s9~pxպ~W_}~;N.Ν)ַ?ᄅ<}[~W_}/w]FD"ŋ?~'O?4{{g… _.]Xk>x67 o>?gϞ?y衇\VD>vc_W9wy{8s y[׾n}s<䓇zϭ\a|o;oPgÅŋ9<׼uh4G套^:ΕϹ{9ux?W*Gx[o{ٟY^xᅅ:p^ ďȏxub0wUO f aw|s99Hc< <Ȏy9Kv%666[o裏lb~;X}O>$>(UEcO_g>. |+|;Sgmnnr};7z綷?>W^W_w]Fy^xOo6{/v(=0'"GJ;Dib}}}gϞe<3L گڡ㽿zuc=O<=vo~Z#_W'?e7~=oo/Ġ7|s__{n"Ʉ~|wOϟ?o}[ {.^@ZS -rLSNuϏc .ґY̱j wO?|;ٵc= BL&| _kcxwܹsJOD/HSઋ/xҥKFyQYoO}S;~`Xfmo=oy[xwc̺Vе9G>w߽ej/}KcoSO}O}S|o9F|}sO|ݿw !}~;ֳTKD9Z9Ν;O?gyfGY?itVBr|w?~G6Aϟiܵ׵HcsKEx n>Opwv|?{nz=_=4׿h4pGx>GJz__>c_f4PDwֻu{ ۿPnr]L&""rKk>[ulo~3R( "nSzk{Lֻ߷像`> v-q]wկ~VoVVVQ!^[K;H}y_UU|= "rt)[̙39sVoMzvDSiH,AH,AH,AH,AH,AH,AH,AH,AH,AH,AH,AH,AH,AH,AH,AH,AH,AH,AnT m7h"""""uCb㞑V."""r|XVȑrKb㖑>AR."""r8`uucHI EDDDD@ZDDDDd G-)u0ι 7sDDDDn71:R5G->h oty""""[E^,wT/gԻm.\xFnV{cXpr+e\#KSDDDD(U,q9-];wܟ { o:uK""""wʕϜ={6tݶ |n4C,rCTڱ~_gMS9x~k o>_-+wܧ+ f)뀫9<d[]q-E^_fΝ;O=??FΞz~ܹ'gU=?4ýk-O>Yl|J? _;6v\/?G=l8m-wͻեTZ{̣_?Ow}`DDDDNWw_~'__|m~||m~]uV=nu}!ȁl&f%~{I[h݂E>cc(A𵼿@[#끝?,gA|vѤ){E/њ5`Q-<l?<ԭv~|+J;DDDNy>JgԱWfx$@0sm6|FzDDDD$[4(pEAv8ޫ{DZpٽng ZfM<̾Gb,JXΤn]9v}!jFzE Lr?3m,gEDDDNE||y>X?e#>JJoQ?E痛?""""'|ܟ_n>rKYe2̇]^}i~V]3z#"""r\=7pAdji\][EpȂ}=^{i/ EDD:L[ ܿ(0->RZ }`z{}3Ӌ&{, j ܭLc-;~t$y1xQ=?|Pۺ})n @WW`wlqAǻ Fܭ=ݢ}iVq~Yݞ->2 [G1#h_=nFAQ@eZYecVdZoT0 gw{AleEDD[ k |6v h{_=^qX EDDf֠r`vz׮G}e٭ wVzkڋ޻hn,n(4X>h8e ^ˉtgr""""A'G9LƲmH ]znQp=އ sgA6""""7ӵ{̯f9nؿ~DDDDn^:d #H)tEXtCreation TimeDo 09 Nov 2023 01:08:51 CETSe IDATxixS3m:B-L**"`ePݢ 2 *3AerDEA݀X- (Plii&MduHhȑΕٻZx*!)TvPyU Ă8#`WՃcUUeuU UT*B  UP]CfelJ+[جl4@X1bM> a"?Ce8_ũȀ{A 9grBbW 2P_amM~(ABty FZD(Z(J.\6z&LB+]x^{mKʛf{M!R/F1]\vdOAl+f-N} hT(+Mw@+Kj(.D{ d3# m0KG ҥ6݅ic=鲺 zgsitJ+evݵr~*x_T&S.Sx\ ]R_[\v[x?O}APYTtS@0O ~C>K)@^aqd GPԶRڕe\^zU/:,nV J;G0wO.%sw?˰N*|rv\:. B.t w M&SR'\V/6tpȡyR[&+R}~!_ *}F5jH3f̨ȷ*oY~O>_~EjѢXڋeD׮]յkWլYS?y3ed+k999e5+][j+Kӧ5bjԨfϞ.eM7$IڲeVs dt7+((H .… =3Ei޼yU֮]vV*)D|zt线[GvNRʂ?o i@e]={觟~Rv$I֭;*44T~_MN>]"##UF"cggg7 ]}3f$I6M_cǎQFzաC#gҥKu{5A{nۺ꫕ݻ+77W~릛nW_9scǎ֭"""fW^z=WROo͛7Ynf1Bev;voQqqqZl4w\3PY,b7jHvҘ1c4uTIғO>%$$jl&ys;68B4P1ayÆ \mٲE7%\kٲeU{"c*r-;'NT||߯1chرJIIQz4qR 3Hŭ+<%&&jΜ9h[nչs_Z5UVMgϞjjΝ;Kv))%::ZfY6m%Ғ駟j֬Y>|x H}z /hΜ92L\zd=>c*r|'kԩSaz߾}SLzjly.v@  4. ?t7Ic]v2Zn]`H;m^ZR~!ͦ뮻9Fn$Ieee)>>^f٫7nϲlںuu֭[k?x5j^111Ζ-[Jgܳg&L;Cnw\Źv W_yP$)44&W Ϋ&M(%%E<]Pi޽Wƍոqc:zUqeq|=@UW҄ީS4zh߿_ JHHÇ5f:uTc ]j5k4ihi8ٳub8oذ$iƍ{ݻ>\rw^ƪaÆGhhz16mT {СC1c_؎>ٳg+$$Dmڴq_H;wܹsСڶmI,s ~X?*!!AӦMӴiӔC9۸ ޵piEÇ[oZj4Rӥ^_UIjڴZj;wjJLLʕ+ SNu]Zd[nE'Nٳg[j߾6mڤyZnBCCKI&l6믿Ү]dZ#8g_UVў={Ԯ];EFF*22R͛7oH[!bbbtQ͚5K *uJʿb8{-s bḎkĉY$iڴi7nRRRJ  w Lk׮gA=u8Lf}j޼yb\]XXXۿ[͞=%f͚={VFǮ ˳vwж 7˦Bzx6xa7Y]veZpay222S1&3$Y]m_\rY'u]WmO.Jf͚5k.2@ ,g~ɖt/A_g]gbF;wNe2VTT}>무d|FZyͰ򚑮3&<|E˖-7|IR&MԽ{wy sYhhh{Ig$I<ο<.Dz\岮+w|34J*iZ;i4`A0%%%Je˖-.i4`A0 @ Hi4`A0mٲ%*fi4`A0 @ Hi4`A0 @ Hi4`A0 @ Hi4hJJJ+=_|E%%%O?Ojjƌ]jZf~w;:vXXśsTm?w9CCCFO>ꪫX݅f'о}tl6M2EN<'|ҧ1_z%m߾]'Nԥ^ZN ƪz:{RRRիW;Ըq]^_o>իWO/Vhhv:#GM6>g۵vZedd&Hia_Iҙ3g;O>J?\a`;r$+Thh$d2i|XVU5RեKc-]TK.ѣGu饗ԩS׊+$I˗/+Vh„ ZjyORE|΁*99Y򊒒o>͙3GvRfftWޱc,X_UuՃ>N:gʕ㏵~լYS]vf?0# `5h9ú~IҊ+4rHQNN֮]ѣnݺInkݺuUff6o,).W\\855U=~7;wNЄ o߾bk.٬>@ׯp޽[ƍӖ-[c͟?_/]tEڵkRRR߳>}UVҼy4yd `L&gFX,6m$iҤI_UVܹs%I]tQpp٣ h֭袋$Ik֬$g.<|whժUZ|4h ͦ7zۺdZJ5l0IҪU$*%_+W{zJtm_s=Ws\~222{-HsHJJ$I~wYVvSIII޽rsset̙ =PHX/hժf%Iyyysܥ"<<ܹk׮ڼym&ժjժSΝ_jÆ ھ}⊴FroА!Ct (5iqBCCc_f̘իW~?ԢE M0!`ƌ4pI̙3jٲ飏>Hݻw/߰a3ϨE:vu]wiѢEE & %uxE:~n^_|>, E~Gu})..NgΜQRRx L&k-+999޽m6=zT]w^{5ըQçz_]mڴÇvZY,ծ]۹O (TҸ\;,rc>l>\#77w% m/錤]gϞ-߄ tn+99YIIIڱcGcc}?~vޭcfy< A@@p`~(qe˖9"Z`6""B-[ualzsѣGK/c<}#Gx]K\\$bРAo[ou{\ӦMէOM86jժ%I:vcsss룢ԫW/-\P/_{W߾}e˖o~ǎӴi4x`իWO!+PBBW6mhҤIڵk~w5@y!H4rsseي(44TVU6쥣_,f?}%""B׆ BBB(CթStcbbTF ܹqwVPPl۷6mڤSsP^o2335{luA:tg}>H:tвeh?@y"H XiР$6M{Ubbg=#""t;+-ojq5x`}z'|Rfɓ' lݻ{"l;w}۵rJߧz<?~szƍڸqnW7nTϞ=wqeddaÆeR խ[W;wTjjj5ydٳGNҌ3kV/kϞ=JKKoQ`+R_|RSSuM8yq`5ԹsgM2ETVV6lZK߮viȐ!ξKW֚5kTZ5&%%+2+ݿEEEiСڰaҴc=cu}ysС5k.b? sss=ƓtM8Q;vPZZhܸqHxz6mڤ{G\sNqѣG7SO=%ժvW^q*=ZFիGdIz衇Ksխ[wxg4}t >\EM6U&M p-]v F4yd}ZjΝ+٬ 'P݋}\7o..""B~m͙3GRFtjСŶԨQCW_}uqɒ%ZdIu[̙3K<0ݮPK:~ԩ.]ԩ)i=B Hi4`A0 @ Hi4`A0 `wCvvrrrdZ] pfR4P)## jj*''G wI@GgZ24PeggYVegg  Ta999. oD4fc@"Hi4 ?~\ǏwPlLXV}'ھ}85kYf0`ׯFIdRZԠAu];wkmwu{lذA׿Կ߿vyZxW^nuxHL&I:%I}_ 0# ԲOh:zZh}w9rv%I;vTN_~E&M /pތ3ԫW/߿߹.,,L 6TÆ (f|duQcǎUHHv{=z4gG}TժU$%''צMj*uկ k."H(ŢK*""B?3,L& 0@۷oWrrl٢nAwu9sF[nUddz[o9s4o>^frΌ;W_Ν;kڵ߿7nl#`F@ԬYSvӧ%;d6v ;'r-[~zIRFFsի;H.RIUvvׯ/٬nkqשS'I%I 6T\\#ͦ~I:uW\;wb_~Q`^o'OAiԨQ%7W_}s+§kMfS6m-:i ɤd}zZtۗXSbb ?#<֭[߿JRƍzj͞=[^{[E?#H(ݻԩݻw+((H?[oYfV?^zzբE #FhРA '|{*<<];Xf;>}Z^{^{5}7nzlm۶M-Z+R"Ǡ 猳Lcu]o 6LZ|WbW^y`^Z 9~xo^iii믿4~"7lٲEׯw>>0auL-_\o]7xRSSbŊ"=T.2& 7ˮXvӯ_?-\йҕ@JJaַ~J&LPll UVy=ƼyK/TkǎռysDf7|6mZ$誫Rݺu5}t%%%)::\>|x PјDa7t|~d۵~zIb믿={[oĉ-IZh͛UVC2e,^}U[:uR>}_xZ9l٢!CsݻfΜi7f+kʕ̴P%&&СCӧ+==]V^|E;v ,>|X/s h ӷ~_|Q]v6lXgdd'c=]ĉ>`Tf+GZg?O<5kN:znݺbի7nx 4HqqqڳgW} YVo^jܸ.2C1#] %&&<퐖믿^l6~L&Ijٳg=>==]|h ,IDAT~gedd^*7jH\s];Զm[C+DuM> 8y TF ְaԥK 6LӃ>(AAAzO?izu5h>FDJ%飏>R\\ڵkxw0{챸~z]EYqswZnu{f˟ֈR/x:<={q<[u^Gk]~y[nݘڱD4 i( B i( B i( B i( B i( B i( B i( B i( B i( B i( B i( B i( B i( B i( B i( B i( B i(X iuk[nU! -mDzEٸ=b0WU`! UP@H@Bz)`vvv,l%UUsk ! x?L;::bq]N^+2yuj 鮋zLZqtΝy䤭N^۫d}<-ʐzAJ.\}ID^pL2Nn\VsovV|tqc7z7"ε[_||o}$?y衇㘾Z6u:{ktzrSFMYHl4c>Oo_O)O٘6B=K."G?5*y췛YJ_}o|?<888xʕ+7#6.#ΎPGk}k{]Cz'Y7mzns_}G7|Fa q:_zȴúYՄv2ֆt15j>5W}Ϻcϡ43-Άr14JbC:b~160y`:64+-5"bzqwM ` 1]|1%hSI=ۯ+U[, # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import os import platform import traceback from gi.repository import Adw, GLib, Gtk from video_downloader.util import g_log def build_about_dialog(parent): builder = Gtk.Builder.new_from_resource( '/com/github/unrud/VideoDownloader/about_dialog.ui') about_window = builder.get_object('about_window') about_window.set_debug_info(get_debug_info(about_window.get_version())) about_window.set_transient_for(parent) return about_window def get_debug_info(version): try: import yt_dlp yt_dlp_version = str(yt_dlp.version.__version__) except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) yt_dlp_version = None return '\n'.join([ 'OS: %s' % (GLib.get_os_info('PRETTY_NAME')), '', 'Libraries:', *('\t%s %s' % (name, version) for name, version in [ ('Python', platform.python_version()), *((name, '%d.%d.%d' % (lib.MAJOR_VERSION, lib.MINOR_VERSION, lib.MICRO_VERSION)) for name, lib in [('GLib', GLib), ('Gtk', Gtk), ('Libadwaita', Adw)]), ('video-downloader', version), ('yt-dlp', yt_dlp_version), ] if version), '', 'Env:', *('\t%s=%s' % (name, os.environ[name]) for name in [ 'LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG', 'G_MESSAGES_DEBUG', ] if name in os.environ) ]) video-downloader-0.12.24/src/about_dialog.ui.in000066400000000000000000000055221477332155200213230ustar00rootroot00000000000000 1 1 com.github.unrud.VideoDownloader Video Downloader Unrud @VERSION@ @releasenotes@ https://github.com/unrud/video-downloader https://github.com/unrud/video-downloader/issues video-downloader.txt Unrud Adrien Plazas Gustavo Peredo Dave Patrick Artem Polishchuk Óscar Fernández Díaz Tobias Bernard Åke Engelbrektson Albano Battistella Ali Khomami P. Allan Nordhøy AngryPenguinPL Bahrom Miragzamov Balazs Christian Elbrianno Dan Eder Etxebarria Rojo Elvis FCastro32 gallegonovato Gustavo Machado Peredo Heimen Stoffels Hoshmand M. Qadir Host1c Ícar N. S. Ihor Hordiichuk Irénée THIRION Jiri Grönroos J. Lavoie Lee Junseo Littux Luna Jernberg L.Yang MartinIIoT mere Milan Šalka Milo Ivir Oğuz Ersen Onnar Rick Óscar Fernández Díaz ovari P. A. pau oliveres Peter Dave Hello Philip Goto Piotr Wieczorek Priit Jõerüüt Rafael Mardojai CM Reza Almanda Roger VC Roy Meissner Ryo Nakano Sabri Ünal Scrambled777 sicklylife SPiRiT Stratos Petrelis TamilNeram The Best Way Thiago Carmona Thorfin89 Troja tuxanator Umidjon Almasov Ümit Solmaz Valeriy Manzhos vikdevelop Vojtěch Perník yoval keshet Copyright © 2019–2025 Unrud gpl-3-0 video-downloader-0.12.24/src/authentication_dialog.py000066400000000000000000000070501477332155200226340ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import gettext from gi.repository import GObject, Gtk from video_downloader.util.connection import CloseStack, PropertyBinding N_ = gettext.gettext class BaseAuthenticationDialog(Gtk.Dialog): def __init__(self, parent): super().__init__(modal=True, destroy_with_parent=True, resizable=False, title=N_('Authentication Required'), use_header_bar=True) self._cs = CloseStack() self.set_transient_for(parent) self.add_button(N_('Cancel'), Gtk.ResponseType.CANCEL) self._ok_button = self.add_button('', Gtk.ResponseType.OK) self._update_response(False) self.set_default_response(Gtk.ResponseType.OK) area_wdg = self.get_content_area() area_wdg.append(self._build_content()) def destroy(self): self._cs.close() super().destroy() def _update_response(self, form_filled): self._ok_button.set_label(N_('Sign in') if form_filled else N_('Skip')) def _build_content(self): raise NotImplementedError class LoginDialog(BaseAuthenticationDialog): username = GObject.Property(type=str) password = GObject.Property(type=str) def _update_form(self): self._update_response(self.username or self.password) def _build_content(self): content = LoginDialogContent() self._cs.push(PropertyBinding( self, 'username', content.username_wdg, 'text', bi=True)) self._cs.push(PropertyBinding( self, 'password', content.password_wdg, 'text', bi=True)) self._cs.push(PropertyBinding( self, 'username', func_a_to_b=lambda _: self._update_form())) self._cs.push(PropertyBinding( self, 'password', func_a_to_b=lambda _: self._update_form())) return content class PasswordDialog(BaseAuthenticationDialog): password = GObject.Property(type=str) def _update_form(self): self._update_response(self.password) def _build_content(self): content = PasswordDialogContent() self._cs.push(PropertyBinding( self, 'password', content.password_wdg, 'text', bi=True)) self._cs.push(PropertyBinding( self, 'password', func_a_to_b=lambda _: self._update_form())) return content @Gtk.Template(resource_path='/com/github/unrud/VideoDownloader/' 'authentication_dialog_login.ui') class LoginDialogContent(Gtk.Box): __gtype_name__ = 'VideoDownloaderLoginDialogContent' username_wdg = Gtk.Template.Child() password_wdg = Gtk.Template.Child() @Gtk.Template(resource_path='/com/github/unrud/VideoDownloader/' 'authentication_dialog_password.ui') class PasswordDialogContent(Gtk.Box): __gtype_name__ = 'VideoDownloaderPasswordDialogContent' password_wdg = Gtk.Template.Child() video-downloader-0.12.24/src/authentication_dialog_login.ui000066400000000000000000000076741477332155200240250ustar00rootroot00000000000000 video-downloader-0.12.24/src/authentication_dialog_password.ui000066400000000000000000000046561477332155200245540ustar00rootroot00000000000000 video-downloader-0.12.24/src/downloader/000077500000000000000000000000001477332155200200605ustar00rootroot00000000000000video-downloader-0.12.24/src/downloader/__init__.py000077500000000000000000000230241477332155200221750ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import contextlib import fcntl import functools import os import re import signal import subprocess import sys import traceback import typing from gi.repository import GLib from video_downloader.util import g_log from video_downloader.util.response import AsyncResponse, Response from video_downloader.util.rpc import handle_rpc_request, rpc_response MAX_RESOLUTION = 2**16-1 # RegEx for splitting lines because `bytes.splitlines` transforms # `b'abc\n'` to `[b'abc']` instead of `[b'abc', b'']` _SPLITLINES_RE = re.compile(rb'\r\n|\r|\n') class Downloader: def __init__(self, handler): self._handler = handler self._process = None self._pending_response = None def destroy(self): self._handler = None if self._process: self._finish_process_and_kill_pgrp() def cancel(self): assert self._process self._process.terminate() if self._pending_response: self._pending_response.cancel() def start(self): assert not self._process extra_env = {'PYTHONPATH': os.pathsep.join(sys.path)} # Start child process in its own process group to shield it from # signals by terminals (e.g. SIGINT) and to identify remaning children. # yt-dlp doesn't kill ffmpeg and other subprocesses on error. self._process = subprocess.Popen( [sys.executable, '-u', '-m', 'video_downloader.downloader'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env={**os.environ, **extra_env}, universal_newlines=True, preexec_fn=os.setpgrp) # WARNING: O_NONBLOCK can break mult ibyte decoding and line splitting # under rare circumstances. # E.g. when the buffer only includes the first byte of a multi byte # UTF-8 character, TextIOWrapper would normally block until all bytes # of the character are read. This does not work with O_NONBLOCK, and it # raises UnicodeDecodeError instead. # E.g. when the buffer only includes `b'\r'`, TextIOWrapper would # normally block to read the next byte and check if it's `b'\n'`. # This does not work with O_NONBLOCK, and it gets transformed to `'\n'` # directly. The line ending `b'\r\n'` will be transformed to `'\n\n'`. fcntl.fcntl(self._process.stdout, fcntl.F_SETFL, os.O_NONBLOCK) fcntl.fcntl(self._process.stderr, fcntl.F_SETFL, os.O_NONBLOCK) self._process.stdout_remainder = self._process.stderr_remainder = b'' GLib.unix_fd_add_full( GLib.PRIORITY_DEFAULT_IDLE, self._process.stdout.fileno(), GLib.IOCondition.IN, self._on_process_stdout, self._process) GLib.unix_fd_add_full( GLib.PRIORITY_DEFAULT_IDLE, self._process.stderr.fileno(), GLib.IOCondition.IN, self._on_process_stderr, self._process) def _finish_process_and_kill_pgrp(self): assert self._process process, self._process = self._process, None try: # Terminate process gracefully so it can delete temporary files process.terminate() process.wait() except BaseException: # including SystemExit and KeyboardInterrupt process.kill() process.wait() finally: # Kill remaining children identified by process group with contextlib.suppress(OSError): os.killpg(process.pid, signal.SIGKILL) return process.returncode def _pending_response_callback(self, process, request_line, response): assert self._pending_response is response self._pending_response = None if response.cancelled: self.cancel() else: self._send_response(process, request_line, response.result) @staticmethod def _send_response(process, request_line, result): try: print(rpc_response(result), file=process.stdin, flush=True) except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_CRITICAL, 'failed request %r\n%s', request_line, traceback.format_exc()) process.terminate() def _on_process_stdout(self, fd, condition, process): # Don't use `process.stdout.read` because of O_NONBLOCK (see `start`) s = process.stdout.buffer.read() pipe_closed = not s process.stdout_remainder += s *lines, process.stdout_remainder = _SPLITLINES_RE.split( process.stdout_remainder) if self._process is not process: return not pipe_closed failure = False line: typing.AnyStr for line in filter(None, lines): # Filter empty lines try: line = line.decode(process.stdout.encoding) if self._pending_response: raise RuntimeError('request during pending request') result = handle_rpc_request( HandlerInterface, self._handler, line) except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_CRITICAL, 'failed request %r\n%s', line, traceback.format_exc()) failure = True break if isinstance(result, AsyncResponse): self._pending_response = result self._pending_response.add_done_callback(functools.partial( self._pending_response_callback, self._process, line)) else: self._send_response(self._process, line, result) if pipe_closed and process.stdout_remainder: g_log(None, GLib.LogLevelFlags.LEVEL_CRITICAL, 'incomplete request %r', process.stdout_remainder) failure = True if pipe_closed or failure: returncode = self._finish_process_and_kill_pgrp() if self._pending_response: self._pending_response.cancel() self._handler.on_finished(returncode == 0 and not failure) return not pipe_closed def _on_process_stderr(self, fd, condition, process): # Don't use `process.stderr.read` because of O_NONBLOCK (see `start`) s = process.stderr.buffer.read() pipe_closed = not s process.stderr_remainder += s if pipe_closed: process.stderr_remainder += b'\n' *lines, process.stderr_remainder = _SPLITLINES_RE.split( process.stderr_remainder) for line in filter(None, lines): # Filter empty lines # Don't use `errors='strict'` because programs might write garbage # to stderr line = line.decode(process.stderr.encoding, errors='replace') g_log('yt-dlp', GLib.LogLevelFlags.LEVEL_DEBUG, '%s', line) if self._process is process: self._handler.on_pulse() return not pipe_closed class HandlerInterface: def get_download_dir(self) -> Response[str]: raise NotImplementedError def get_prefer_mpeg(self) -> Response[bool]: raise NotImplementedError def get_automatic_subtitles(self) -> Response[typing.List[str]]: raise NotImplementedError def get_url(self) -> Response[str]: raise NotImplementedError def get_mode(self) -> Response[str]: raise NotImplementedError def get_resolution(self) -> Response[int]: raise NotImplementedError def on_playlist_request(self) -> Response[bool]: raise NotImplementedError # user password def on_login_request(self) -> Response[typing.Tuple[str, str]]: raise NotImplementedError # password def on_password_request(self) -> Response[str]: raise NotImplementedError def on_error(self, msg: str) -> Response[None]: raise NotImplementedError def on_progress(self, filename: str, progress: float, bytes_: int, bytes_total: int, eta: int, speed: int) -> Response[None]: raise NotImplementedError def on_download_start(self, playlist_index: int, playlist_count: int, title: str) -> Response[None]: raise NotImplementedError # lock acquired def on_download_lock(self, name: str) -> Response[bool]: """Lock gets released by `on_download_finished` or process termination. It's not allowed to hold more than one lock at a time.""" raise NotImplementedError def on_download_thumbnail(self, thumbnail: str) -> Response[None]: raise NotImplementedError def on_download_finished(self, filename: str) -> Response[None]: raise NotImplementedError def on_pulse(self) -> Response[None]: raise NotImplementedError def on_finished(self, success: bool) -> Response[None]: raise NotImplementedError video-downloader-0.12.24/src/downloader/__main__.py000066400000000000000000000043651477332155200221620ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import os import signal import sys from video_downloader.util.rpc import RpcClient if __name__ == '__main__': # Exit gracefully on SIGTERM to allow cleanup code to run signal.signal(signal.SIGTERM, lambda *_: sys.exit(1)) # Duplicate stdin and stdout for exclusive usage with handler. # The handler waits for stdin and stdout to be closed. The fds must not # be closed before the process exits to avoid race. input_file = os.fdopen(os.dup(sys.stdin.fileno()), 'r', closefd=False) output_file = os.fdopen(os.dup(sys.stdout.fileno()), 'w', closefd=False) # Prevent leaking the fds to children that might remain after this process # exits os.set_inheritable(input_file.fileno(), False) os.set_inheritable(output_file.fileno(), False) # Redirect stdin and stdout to /dev/null to prevent interferences with open(os.devnull, 'r+') as devnull: os.dup2(devnull.fileno(), sys.stdin.fileno(), inheritable=True) os.dup2(devnull.fileno(), sys.stdout.fileno(), inheritable=True) handler = RpcClient(output_file, input_file) try: from video_downloader.downloader.yt_dlp_monkey_patch import ( install_monkey_patches) install_monkey_patches() import yt_dlp from video_downloader.downloader.yt_dlp_slave import YoutubeDLSlave try: YoutubeDLSlave(handler) except yt_dlp.utils.DownloadError: sys.exit(1) except Exception as e: handler.on_error('%s: %s' % (type(e).__name__, e)) raise video-downloader-0.12.24/src/downloader/meson.build000066400000000000000000000003771477332155200222310ustar00rootroot00000000000000video_downloader_sources = files([ '__init__.py', '__main__.py', 'yt_dlp_monkey_patch.py', 'yt_dlp_slave.py', ]) python_sources_for_linting += video_downloader_sources install_data(video_downloader_sources, install_dir: moduledir / 'downloader') video-downloader-0.12.24/src/downloader/yt_dlp_monkey_patch.py000066400000000000000000000050241477332155200244670ustar00rootroot00000000000000# Copyright (C) 2020 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import io import os import subprocess import sys import threading def _tee(fin, *fouts): '''Read from `fin` and write to all `fouts`''' while True: b = fin.read(1) if not b: break for fout in fouts: fout.write(b) class PatchedPopen(subprocess.Popen): def communicate(self, *args, **kwargs): '''When processe's stderr gets redirected by `subprocess.PIPE` duplicate it to `sys.stderr` ''' if not self.stderr: return super().communicate(*args, **kwargs) if hasattr(self.stderr, 'encoding'): errs_buf = io.StringIO() sys_stderr = sys.stderr else: errs_buf = io.BytesIO() sys_stderr = sys.stderr.buffer tee_thread = threading.Thread( target=_tee, args=(self.stderr, sys_stderr, errs_buf), daemon=True) self.stderr = None tee_thread.start() outs, _ = super().communicate(*args, **kwargs) tee_thread.join() return outs, errs_buf.getvalue() def patch_getcwd(): def patched_chdir(path): nonlocal cwd chdir(path) if os.path.isabs(path): cwd = os.path.normpath(path) else: cwd = os.path.normpath(os.path.join(cwd, path)) chdir = os.chdir cwd = os.getcwd() os.getcwd = lambda: cwd os.getcwdb = lambda: os.fsencode(cwd) os.chdir = patched_chdir def install_monkey_patches(): # ffmpeg writes progress information to stderr, but yt-dlp captures it # by default. Overriding this behavior allows us to show activity while # converting audio to MP3 or finishing videos. subprocess.Popen = PatchedPopen # getcwd is broken inside of xdg-desktop-portal FUSE for documents if os.name == 'posix': patch_getcwd() video-downloader-0.12.24/src/downloader/yt_dlp_slave.py000066400000000000000000000505211477332155200231220ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import contextlib import glob import json import os import re import shutil import sys import tempfile import time import traceback import yt_dlp from yt_dlp.postprocessor.common import PostProcessor from yt_dlp.postprocessor.ffmpeg import (FFmpegPostProcessor, FFmpegPostProcessorError) from yt_dlp.utils import dfxp2srt, sanitize_filename from video_downloader.util.path import encode_filesystem_path # File names are typically limited to 255 bytes MAX_OUTPUT_TITLE_LENGTH = 200 MAX_ID_LENGTH = 200 MAX_THUMBNAIL_RESOLUTION = 1024 def log(format_string, *args): print(f'[yt_dlp_slave] {format_string % args}', file=sys.stderr, flush=True) def _short_filename(name, length): for i in range(len(name), -1, -1): output = name[:i].strip() if i < len(name): output += '…' output = sanitize_filename(output) # Check length with file system encoding if len(encode_filesystem_path(output)) < length: return output raise ValueError('can\'t shorten filename %r to %r bytes' % (name, length)) def _convert_filepath(info, files_to_delete, filepath, new_ext, type_='conv'): prefix = '.%s.%s' % (type_, new_ext) files_to_delete.append(filepath) info['__files_to_move'][filepath + prefix] = ( info['__files_to_move'][filepath] + prefix) return filepath + prefix class SubtitlesConverterPP(FFmpegPostProcessor): """A more robust subtitles converter""" def run(self, info): files_to_delete = [] new_subtitles = {} for lang, sub in (info.get('requested_subtitles') or {}).items(): filepath = sub.get('filepath') if not filepath: continue if not os.path.isfile(filepath): log('Skipping missing subtitle (%r, %r)', lang, sub.get('ext')) continue log('Converting subtitle (%r, %r)', lang, sub.get('ext')) if sub.get('ext') in ['dfxp', 'ttml', 'tt']: # Try to use yt-dlp's internal dfxp2srt converter with open(filepath, 'rb') as f: data = f.read() try: data = dfxp2srt(data) except Exception: files_to_delete.append(filepath) traceback.print_exc(file=sys.stderr) sys.stderr.flush() continue filepath = _convert_filepath(info, files_to_delete, filepath, 'srt') with open(filepath, 'w', encoding='utf-8') as f: f.write(data) # Try to convert subtitles with ffmpeg new_filepath = _convert_filepath(info, files_to_delete, filepath, 'vtt') try: self.run_ffmpeg(filepath, new_filepath, ['-f', 'webvtt']) except FFmpegPostProcessorError: files_to_delete.append(new_filepath) continue filepath = new_filepath # Fix broken WEBVTT files generated by FFmpeg (v4.4) # All leading spaces from the first line after a timestamp are # removed. If the first line only contains spaces it leaves an # empty line. with open(filepath, encoding='utf-8') as f: webvtt = f.read() new_webvtt = re.sub(r'(?<=\n\n)' # check for empty line behind r'([0-9.:]+ --> [0-9.:]+\n)' # timestamp r'\n' # broken empty line r'(?: +\n)* *', # leading whitespaces r'\1', webvtt) if webvtt != new_webvtt: filepath = _convert_filepath(info, files_to_delete, filepath, 'vtt', type_='fix') with open(filepath, 'w', encoding='utf-8') as f: f.write(new_webvtt) new_subtitles[lang] = {**sub, 'filepath': filepath, 'ext': 'vtt'} info['requested_subtitles'] = new_subtitles return files_to_delete, info class ThumbnailConverterPP(FFmpegPostProcessor): """Convert thumbnail to JPEG and if required decrease resolution""" def __init__(self, thumbnail_callback=None): super().__init__() self._thumbnail_callback = thumbnail_callback def run(self, info): files_to_delete = [] new_thumbnails = [] # Thumbnails are ordered worst to best for thumb in reversed(info.get('thumbnails') or []): filepath = thumb.get('filepath') if not filepath: continue if new_thumbnails: # Convert only one thumbnail files_to_delete.append(filepath) continue if not os.path.isfile(filepath): log('Skipping missing thumbnail (%r)', thumb.get('id')) continue log('Converting thumbnail (%r)', thumb.get('id')) # Try to convert thumbnail with ffmpeg new_filepath = _convert_filepath(info, files_to_delete, filepath, 'jpg') try: # FFmpeg uses % pattern for image input and output files self.real_run_ffmpeg( # Disable pattern matching for input file [(filepath, ['-f', 'image2', '-pattern_type', 'none'])], # Escape % for output file [(new_filepath.replace('%', '%%'), [ '-vf', ('scale=\'min({0},iw):min({0},ih):' 'force_original_aspect_ratio=decrease\'' ).format(MAX_THUMBNAIL_RESOLUTION)])]) except FFmpegPostProcessorError: files_to_delete.append(new_filepath) continue filepath = new_filepath new_thumbnails.insert(0, {**thumb, 'filepath': filepath}) if self._thumbnail_callback is not None: self._thumbnail_callback(os.path.abspath(filepath)) info['thumbnails'] = new_thumbnails return files_to_delete, info class RetryException(BaseException): pass class YoutubeDLSlave: def _on_progress(self, d): if d['status'] not in ['downloading', 'finished']: return filename = d['filename'] bytes_ = d.get('downloaded_bytes') if bytes_ is None: bytes_ = -1 bytes_total = d.get('total_bytes') if bytes_total is None: bytes_total = d.get('total_bytes_estimate') if bytes_total is None: bytes_total = -1 if d['status'] == 'downloading': fragments = d.get('fragment_index') if fragments is None: fragments = -1 fragments_total = d.get('fragment_count') if fragments_total is None: fragments_total = -1 if bytes_ >= 0 and bytes_total >= 0: progress = bytes_ / bytes_total if bytes_total > 0 else -1 elif fragments >= 0 and fragments_total >= 0: progress = (fragments / fragments_total if fragments_total > 0 else -1) else: progress = -1 eta = d.get('eta') if eta is None: eta = -1 speed = d.get('speed') if speed is None: speed = -1 speed = round(speed) elif d['status'] == 'finished': progress = -1 eta = -1 speed = -1 self._handler.on_progress(filename, progress, bytes_, bytes_total, eta, speed) def _load_playlist(self, url): '''Retrieve info for all videos available on URL. Returns the absolute paths of the generated and downloaded files: ([info_dict, ...], skipped videos) ''' with tempfile.TemporaryDirectory() as temp_dir: os.chdir(temp_dir) while True: ydl_opts = {**self.ydl_opts, 'writeinfojson': True, 'skip_download': True, 'outtmpl': '%(autonumber)s.%(ext)s'} saved_skipped_count = self._skipped_count try: with yt_dlp.YoutubeDL(ydl_opts) as ydl: for args in self.extra_postprocessors: ydl.add_post_processor(*args) ydl.download([url]) except RetryException: continue break info_dicts = [] for filename in sorted(os.listdir(temp_dir)): if re.fullmatch(r'[0-9]+\.info\.json', filename): with open(os.path.join(temp_dir, filename), encoding='utf-8') as f: info_dicts.append(json.load(f)) return info_dicts, self._skipped_count - saved_skipped_count def _load_video(self, dir_, info_path): class GetFilepathPP(PostProcessor): def run(self, info): nonlocal filepath filepath = info['filepath'] return [], info filepath = None os.chdir(dir_) while True: try: with yt_dlp.YoutubeDL(self.ydl_opts) as ydl: for args in self.extra_postprocessors: ydl.add_post_processor(*args) ydl.add_post_processor(GetFilepathPP()) ydl.download_with_info_file(info_path) except RetryException: continue break return os.path.abspath(filepath) def debug(self, msg): print(msg, file=sys.stderr, flush=True) def warning(self, msg): print(msg, file=sys.stderr, flush=True) def error(self, msg): print(msg, file=sys.stderr, flush=True) traceback.print_exc(file=sys.stderr) sys.stderr.flush() # Handle authentication requests if (self._allow_authentication_request and re.search(r'\b[Ss]ign in\b|--username', msg)): if self._skip_authentication: self._skipped_count += 1 return user, password = self._handler.on_login_request() if not user and not password: self._skip_authentication = True self._skipped_count += 1 return self.ydl_opts['username'] = user self.ydl_opts['password'] = password self._allow_authentication_request = False raise RetryException(msg) if self._allow_authentication_request and '--video-password' in msg: if self._skip_authentication: self._skipped_count += 1 return password = self._handler.on_password_request() if not password: self._skip_authentication = True self._skipped_count += 1 return self.ydl_opts['videopassword'] = password self._allow_authentication_request = False raise RetryException(msg) # Skip unavailable videos if 'Video unavailable.' in msg: self._skipped_count += 1 return # Ignore missing xattr support if 'This filesystem doesn\'t support extended attributes.' in msg: return self._handler.on_error(msg) sys.exit(1) @staticmethod def _find_existing_download(download_dir, output_title, mode): for filepath in glob.iglob(glob.escape( os.path.join(download_dir, output_title)) + '.*'): filename = os.path.basename(filepath) file_title, file_ext = os.path.splitext(filename) if file_title == output_title and ( mode == 'audio' and file_ext.lower() == '.mp3' or mode != 'audio') and ( os.path.isfile(filepath)): return filename return None def __init__(self, handler): self._handler = handler self._allow_authentication_request = True self._skip_authentication = False self._skipped_count = 0 self.ydl_opts = { 'logger': self, 'logtostderr': True, 'no_color': True, 'progress_hooks': [self._on_progress], 'fixup': 'detect_or_warn', 'ignoreerrors': True, # handled via logger error callback 'retries': 10, 'fragment_retries': 10, 'subtitleslangs': ['all'], 'subtitlesformat': 'vtt/best', 'keepvideo': True, 'allow_playlist_files': False, # no info.json files for playlists # Include id and format_id in outtmpl to prevent yt-dlp # from continuing wrong file 'outtmpl': '%(id)s.%(format_id)s.%(ext)s', 'postprocessors': [ {'key': 'FFmpegMetadata'}, {'key': 'FFmpegEmbedSubtitle'}, {'key': 'XAttrMetadata'}]} self.extra_postprocessors = [ (ThumbnailConverterPP(self._handler.on_download_thumbnail), 'before_dl'), (SubtitlesConverterPP(), 'before_dl')] mode = self._handler.get_mode() if mode == 'audio': self.ydl_opts['format'] = 'bestaudio/best' self.ydl_opts['postprocessors'].insert(0, { 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192'}) self.ydl_opts['postprocessors'].insert(1, { 'key': 'EmbedThumbnail', 'already_have_thumbnail': True}) else: self.ydl_opts['format_sort'] = [ 'res~%d' % self._handler.get_resolution()] if self._handler.get_prefer_mpeg(): self.ydl_opts['format_sort'].append('+codec:avc:m4a') url = self._handler.get_url() download_dir = os.path.abspath(self._handler.get_download_dir()) requested_automatic_subtitles = set( self._handler.get_automatic_subtitles()) with tempfile.TemporaryDirectory() as temp_dir: self.ydl_opts['cookiefile'] = os.path.join(temp_dir, 'cookies') self.ydl_opts['playlistend'] = 2 # Test playlist info_testplaylist, skipped_testplaylist = self._load_playlist(url) self.ydl_opts['noplaylist'] = True if len(info_testplaylist) + skipped_testplaylist > 1: info_noplaylist, skipped_noplaylist = self._load_playlist(url) else: info_noplaylist = info_testplaylist skipped_noplaylist = skipped_testplaylist del self.ydl_opts['noplaylist'] del self.ydl_opts['playlistend'] if (len(info_testplaylist) + skipped_testplaylist > len(info_noplaylist) + skipped_noplaylist): self.ydl_opts['noplaylist'] = ( not self._handler.on_playlist_request()) if not self.ydl_opts['noplaylist']: info_playlist, _ = self._load_playlist(url) else: info_playlist = info_noplaylist elif len(info_testplaylist) + skipped_testplaylist > 1: info_playlist, _ = self._load_playlist(url) else: info_playlist = info_testplaylist # Download videos self._allow_authentication_request = False self.ydl_opts['writesubtitles'] = True self.ydl_opts['writeautomaticsub'] = True self.ydl_opts['writethumbnail'] = True for i, info in enumerate(info_playlist): title = info.get('title') or info.get('id') or 'video' output_title = _short_filename(title, MAX_OUTPUT_TITLE_LENGTH) self._handler.on_download_start(i, len(info_playlist), title) # Lock download name to prevent other instances from # writing to the same files while not self._handler.on_download_lock(output_title): time.sleep(1) automatic_captions = info.get('automatic_captions') or {} skip_captions = {*(info.get('subtitles') or {})} new_automatic_captions = {} for lang, subs in automatic_captions.items(): if lang in skip_captions: continue for requested_lang in requested_automatic_subtitles: if requested_lang == 'all' or requested_lang == lang: break # Translated subtitles if (lang.startswith(requested_lang+'-') and requested_lang not in skip_captions and requested_lang not in automatic_captions): skip_captions.add(requested_lang) break else: continue new_automatic_captions[lang] = subs if automatic_captions != new_automatic_captions: info['_backup_automatic_captions'] = automatic_captions info['automatic_captions'] = new_automatic_captions # Check if we already got the file existing_filename = self._find_existing_download( download_dir, output_title, mode) if existing_filename is not None: self._handler.on_download_finished(existing_filename) continue # Download into separate directory because yt-dlp generates # many temporary files temp_download_dir = os.path.join( download_dir, output_title + '.part') try: with contextlib.suppress(FileExistsError): os.mkdir(temp_download_dir) except OSError as e: traceback.print_exc(file=sys.stderr) sys.stderr.flush() self._handler.on_error( 'ERROR: Failed to create download folder: %s' % e) sys.exit(1) if len(info.get('id', '')) > MAX_ID_LENGTH: info['id'] = info.get( 'id', '')[:max(0, MAX_ID_LENGTH - 1)] + '…' info_path = os.path.join( temp_download_dir, sanitize_filename((info.get('id') or '') + '.info.json')) with open(info_path, 'w', encoding='utf-8') as f: json.dump(info, f) temp_filepath = self._load_video(temp_download_dir, info_path) _, filename_ext = os.path.splitext(temp_filepath) filename = output_title + filename_ext # Move finished download from download to target dir try: os.replace(temp_filepath, os.path.join(download_dir, filename)) except OSError as e: traceback.print_exc(file=sys.stderr) sys.stderr.flush() self._handler.on_error(( 'ERROR: Falied to move finished download to ' 'download folder: %s') % e) sys.exit(1) # Delete download directory with contextlib.suppress(OSError): shutil.rmtree(temp_download_dir) self._handler.on_download_finished(filename) video-downloader-0.12.24/src/main.py000066400000000000000000000073361477332155200172310ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import gettext import sys from gi.repository import Adw, Gio, GLib from video_downloader.util import gobject_log from video_downloader.util.connection import ( CloseStack, SignalConnection, create_action) from video_downloader.window import Window N_ = gettext.gettext class Application(Adw.Application): def __init__(self): super().__init__(application_id='com.github.unrud.VideoDownloader', flags=Gio.ApplicationFlags.FLAGS_NONE) self._cs = CloseStack() self.add_main_option( 'url', ord('u'), GLib.OptionFlags.NONE, GLib.OptionArg.STRING, N_('Prefill URL field'), 'URL') GLib.set_application_name(N_('Video Downloader')) def do_startup(self): Adw.Application.do_startup(self) self._cs.push(SignalConnection( self, 'shutdown', self._cs.close, no_args=True)) self.settings = gobject_log( Gio.Settings.new(self.props.application_id)) # Setup actions create_action(self, self._cs, 'new-window', lambda _, param: self._new_window(param.get_string()), parameter_type=GLib.VariantType('s')) create_action(self, self._cs, 'quit', self._quit, no_args=True) self._cs.push(SignalConnection( self, 'window-removed', lambda _, win: win.destroy())) def _quit(self): for win in self.get_windows(): win.close() def _new_window(self, url=''): win = gobject_log(Window(self)) win.set_default_icon_name(self.props.application_id) model = win.model model.url = url # Apply/Bind settings self.settings.bind('download-folder', model, 'download-folder', Gio.SettingsBindFlags.DEFAULT) self.settings.bind('prefer-mpeg', model, 'prefer-mpeg', ( Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.GET_NO_CHANGES)) self.settings.bind('automatic-subtitles', model, 'automatic-subtitles', Gio.SettingsBindFlags.DEFAULT) self.settings.bind('mode', model, 'mode', ( Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.GET_NO_CHANGES)) resolution = self.settings.get_uint('resolution') model.resolution = sorted(model.resolutions, key=lambda x: abs(x - resolution))[0] self.settings.bind('resolution', model, 'resolution', Gio.SettingsBindFlags.SET) win.present() def do_activate(self): self._new_window() def do_handle_local_options(self, options): url_variant = options.lookup_value('url', GLib.VariantType('s')) if url_variant: self.register() self.activate_action('new-window', url_variant) return 0 return -1 def main(version): app = gobject_log(Application()) return app.run(sys.argv) video-downloader-0.12.24/src/meson.build000066400000000000000000000040061477332155200200640ustar00rootroot00000000000000pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name() moduledir = pkgdatadir / 'video_downloader' release_notes = run_command([ python, extract_xml_aux, '--escape', '..' / 'data' / 'com.github.unrud.VideoDownloader.metainfo-releases.xml.in', './/release[@version="' + meson.project_version() + '"]/description/*'], check: true, ).stdout() conf = configuration_data() conf.set('VERSION', meson.project_version()) conf.set('releasenotes', release_notes) about_dialog_ui_source = configure_file( input: 'about_dialog.ui.in', output: 'about_dialog.ui', configuration: conf, ) video_downloader_ui_sources = [ files([ 'authentication_dialog_login.ui', 'authentication_dialog_password.ui', 'shortcuts_dialog.ui', 'window.ui', ]), about_dialog_ui_source, ] video_downloader_gresource_xml = configure_file( capture: true, command: [python, create_gresource_aux, '/com/github/unrud/VideoDownloader', video_downloader_ui_sources], output: 'video_downloader.gresource.xml', ) gnome.compile_resources('video-downloader', video_downloader_gresource_xml, gresource_bundle: true, install: true, install_dir: pkgdatadir, ) conf = configuration_data() conf.set('PYTHON', python.full_path()) conf.set_quoted('VERSION', meson.project_version()) conf.set_quoted('localedir', get_option('prefix') / get_option('localedir')) conf.set_quoted('pkgdatadir', pkgdatadir) video_downloader_bin = configure_file( input: 'video-downloader.in', output: 'video-downloader', configuration: conf, install: true, install_dir: get_option('bindir'), install_mode: 'r-xr-xr-x', ) python_sources_for_linting += video_downloader_bin video_downloader_sources = files([ '__init__.py', 'about_dialog.py', 'authentication_dialog.py', 'main.py', 'model.py', 'playlist_dialog.py', 'shortcuts_dialog.py', 'window.py', ]) python_sources_for_linting += video_downloader_sources install_data(video_downloader_sources, install_dir: moduledir) subdir('downloader') subdir('util') video-downloader-0.12.24/src/model.py000066400000000000000000000312641477332155200174020ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import collections import gettext import os import traceback import typing from gi.repository import Gio, GLib, GObject from video_downloader import downloader from video_downloader.downloader import MAX_RESOLUTION from video_downloader.util import g_log, gobject_log, languages_from_locale from video_downloader.util.connection import (CloseStack, PropertyBinding, SignalConnection) from video_downloader.util.path import expand_path, open_in_file_manager from video_downloader.util.response import AsyncResponse, Response N_ = gettext.gettext class Model(GObject.GObject, downloader.HandlerInterface): __gsignals__ = { 'download-pulse': (GObject.SIGNAL_RUN_FIRST, None, ()) } state = GObject.Property(type=str, default='start') mode = GObject.Property(type=str, default='audio') url = GObject.Property(type=str) error = GObject.Property(type=str) resolution = GObject.Property(type=GObject.TYPE_UINT, default=1080) download_folder = GObject.Property(type=str) # absolute path to dir of active/finished download (empty if no download) finished_download_dir = GObject.Property(type=str) # TYPE_STRV is None by default, empty list can be None or [] finished_download_filenames = GObject.Property(type=GObject.TYPE_STRV) automatic_subtitles = GObject.Property(type=GObject.TYPE_STRV) prefer_mpeg = GObject.Property(type=bool, default=False) download_playlist_index = GObject.Property(type=GObject.TYPE_INT64) download_playlist_count = GObject.Property(type=GObject.TYPE_INT64) download_filename = GObject.Property(type=str) download_title = GObject.Property(type=str) download_titles = GObject.Property(type=GObject.TYPE_STRV) download_thumbnail = GObject.Property(type=str) # 0.0 - 1.0 (inclusive), negative if unknown: download_progress = GObject.Property(type=float, default=-1) download_bytes = GObject.Property(type=GObject.TYPE_INT64, default=-1) download_bytes_total = GObject.Property(type=GObject.TYPE_INT64, default=-1) download_speed = GObject.Property(type=GObject.TYPE_INT64, default=-1) download_eta = GObject.Property(type=GObject.TYPE_INT64, default=-1) resolutions = collections.OrderedDict([ (MAX_RESOLUTION, N_('Best')), (4320, N_('4320p (8K)')), (2160, N_('2160p (4K)')), (1440, N_('1440p (HD)')), (1080, N_('1080p (HD)')), (720, N_('720p (HD)')), (480, N_('480p')), (360, N_('360p')), (240, N_('240p')), (144, N_('144p'))]) _global_download_lock = set() def __init__(self, handler=None): super().__init__() self._cs = CloseStack() self._handler = handler self._cs.add_close_callback(setattr, self, '_handler', None) self._downloader = downloader.Downloader(self) self._cs.add_close_callback(self._downloader.destroy) self._active_download_lock = None self.actions = gobject_log(Gio.SimpleActionGroup.new()) for action_name, callback, *extra_args in [ ('download', self.set_property, 'state', 'prepare'), ('cancel', self.set_property, 'state', 'cancel'), ('back', self.set_property, 'state', 'start'), ('open-finished-download-dir', self._open_finished_download_dir)]: action = gobject_log(Gio.SimpleAction.new(action_name), action_name) self._cs.push(SignalConnection( action, 'activate', callback, *extra_args, no_args=True)) self.actions.add_action(action) def update_download_action_enabled(): self.actions.lookup_action('download').set_property( 'enabled', bool(self.url) and self._is_valid_state_transition(self.state, 'prepare')) for name in ['state', 'url']: self._cs.push(SignalConnection( self, 'notify::' + name, update_download_action_enabled, no_args=True)) update_download_action_enabled() self._cs.push(PropertyBinding( self, 'state', self.actions.lookup_action('cancel'), 'enabled', lambda state: self._is_valid_state_transition(state, 'cancel'))) self._cs.push(PropertyBinding( self, 'state', self.actions.lookup_action('back'), 'enabled', lambda state: self._is_valid_state_transition(state, 'start'))) self._cs.push(PropertyBinding( self, 'state', self.actions.lookup_action('open-finished-download-dir'), 'enabled', lambda state: state == 'success')) self._prev_state = None self._cs.push(PropertyBinding( self, 'state', func_a_to_b=self._state_transition)) @staticmethod def _is_valid_state_transition(state, next_state): if next_state == 'start': return state not in ['start', 'download'] if next_state == 'prepare': return state == 'start' if next_state == 'download': return state == 'prepare' if next_state in ['cancel', 'success', 'error']: return state == 'download' return False def _state_transition(self, state): if self._prev_state == state: return if not self._is_valid_state_transition(self._prev_state, state): self.state = self._prev_state assert False, 'invalid state transition %r -> %r' % ( self._prev_state, state) return self._prev_state = state if state == 'prepare': self.error = '' self.download_playlist_index = 0 self.download_playlist_count = 0 self.download_filename = '' self.download_title = '' self.download_titles = None self.download_thumbnail = '' self.download_progress = -1 self.download_bytes = -1 self.download_bytes_total = -1 self.download_speed = -1 self.download_eta = -1 self.finished_download_filenames = None self.finished_download_dir = '' self._try_start_download() if state == 'download': self._downloader.start() if state == 'cancel': self._downloader.cancel() def _open_finished_download_dir(self): assert self.finished_download_dir open_in_file_manager(self.finished_download_dir, self.finished_download_filenames or []) def _try_start_download(self): path = expand_path(self.download_folder) message = check_download_dir(path, create=True) if message is None: self.finished_download_dir = path self.state = 'download' return response = self._handler.on_download_folder_error( N_('Invalid download folder'), message, path) def handle_response(response): if response.cancelled: self.state = 'start' else: self._try_start_download() response.add_done_callback(handle_response) def destroy(self): self._cs.close() def on_pulse(self): assert self.state in ['download', 'cancel'] self.emit('download-pulse') def on_finished(self, success): assert self.state in ['download', 'cancel'] self._download_unlock() if self.state == 'cancel': self.state = 'start' else: self.state = 'success' if success else 'error' def get_download_dir(self): assert self.state in ['download', 'cancel'] return self.finished_download_dir def get_prefer_mpeg(self): assert self.state in ['download', 'cancel'] return self.prefer_mpeg def get_automatic_subtitles(self): assert self.state in ['download', 'cancel'] return [*languages_from_locale(), *(self.automatic_subtitles or [])] def get_url(self): assert self.state in ['download', 'cancel'] return self.url def get_mode(self): assert self.state in ['download', 'cancel'] return self.mode def get_resolution(self): assert self.state in ['download', 'cancel'] return self.resolution def _forward_response(self, response): def callback(response): if response.cancelled: self.state = 'cancel' if isinstance(response, AsyncResponse): response.add_done_callback(callback) if self.state == 'cancel': response.cancel() return response def on_playlist_request(self): assert self.state in ['download', 'cancel'] return self._forward_response(self._handler.on_playlist_request()) def on_login_request(self): assert self.state in ['download', 'cancel'] return self._forward_response(self._handler.on_login_request()) def on_password_request(self): assert self.state in ['download', 'cancel'] return self._forward_response(self._handler.on_password_request()) def on_error(self, msg): assert self.state in ['download', 'cancel'] self.error = msg def on_progress(self, filename, progress, bytes_, bytes_total, eta, speed): assert self.state in ['download', 'cancel'] self.download_filename = filename self.download_progress = progress self.download_bytes = bytes_ self.download_bytes_total = bytes_total self.download_eta = eta self.download_speed = speed def on_download_start(self, playlist_index, playlist_count, title): assert self.state in ['download', 'cancel'] self.download_playlist_index = playlist_index self.download_playlist_count = playlist_count self.download_title = title self.download_titles = [*(self.download_titles or []), title] def _download_unlock(self): if self._active_download_lock: self._global_download_lock.remove(self._active_download_lock) self._active_download_lock = None def on_download_lock(self, name): assert self.state in ['download', 'cancel'] assert self._active_download_lock is None if name in self._global_download_lock: return False self._global_download_lock.add(name) self._active_download_lock = name return True def on_download_thumbnail(self, thumbnail): assert self.state in ['download', 'cancel'] self.download_thumbnail = thumbnail def on_download_finished(self, filename): assert self.state in ['download', 'cancel'] self._download_unlock() self.finished_download_filenames = [ *(self.finished_download_filenames or []), filename] def check_download_dir(path: str, create: bool = False ) -> typing.Optional[str]: if create: try: os.makedirs(path, exist_ok=True) except FileExistsError: return N_('Not a directory') except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_DEBUG, '%s', traceback.format_exc()) return N_('Permission denied') elif not os.path.isdir(path): return N_('Not a directory') if not os.access(path, os.R_OK | os.W_OK | os.X_OK, effective_ids=os.access in os.supports_effective_ids): return N_('Permission denied') return None class HandlerInterface: def on_playlist_request(self) -> Response[bool]: raise NotImplementedError # user password def on_login_request(self) -> Response[typing.Tuple[str, str]]: raise NotImplementedError # password def on_password_request(self) -> Response[str]: raise NotImplementedError def on_download_folder_error(self, title: str, message: str ) -> Response[None]: raise NotImplementedError video-downloader-0.12.24/src/playlist_dialog.py000066400000000000000000000025511477332155200214570ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import gettext from gi.repository import Gtk N_ = gettext.gettext class PlaylistDialog(Gtk.MessageDialog): def __init__(self, parent): super().__init__(modal=True, destroy_with_parent=True, message_type=Gtk.MessageType.QUESTION, text=N_('Download Playlist?'), secondary_text=N_('The video is part of a playlist.')) self.set_transient_for(parent) self.add_button(N_('Single Video'), Gtk.ResponseType.NO) self.add_button(N_('All Videos in Playlist'), Gtk.ResponseType.YES) self.set_default_response(Gtk.ResponseType.NO) video-downloader-0.12.24/src/shortcuts_dialog.py000066400000000000000000000020741477332155200216540ustar00rootroot00000000000000# Copyright (C) 2022 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . from gi.repository import Gtk @Gtk.Template(resource_path='/com/github/unrud/VideoDownloader/' 'shortcuts_dialog.ui') class ShortcutsDialog(Gtk.ShortcutsWindow): __gtype_name__ = 'VideoDownloaderShortcutsDialog' def __init__(self, parent): super().__init__() self.set_transient_for(parent) video-downloader-0.12.24/src/shortcuts_dialog.ui000066400000000000000000000070121477332155200216360ustar00rootroot00000000000000 video-downloader-0.12.24/src/util/000077500000000000000000000000001477332155200166775ustar00rootroot00000000000000video-downloader-0.12.24/src/util/__init__.py000066400000000000000000000036071477332155200210160ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import locale import os from gi.repository import GLib def gobject_log(obj, info=None): DOMAIN = 'gobject-ref' LEVEL = GLib.LogLevelFlags.LEVEL_DEBUG name = repr(obj) if info: name += ' (' + str(info) + ')' g_log(DOMAIN, LEVEL, 'Create %s', name) obj.weak_ref(g_log, DOMAIN, LEVEL, 'Destroy %s', name) return obj def g_log(domain, log_level, format_string, *args): fields = GLib.Variant('a{sv}', { 'MESSAGE': GLib.Variant('s', format_string % args)}) GLib.log_variant(domain, log_level, fields) def languages_from_locale(): locale_languages = [] for envar in ['LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG']: val = os.environ.get(envar) if val: locale_languages.extend(val.split(':')) break if 'C' not in locale_languages: locale_languages.append('C') languages = [] for lang in locale_languages: lang = locale.normalize(lang) for sep in ['@', '.', '_']: lang = lang.split(sep, maxsplit=1)[0] if lang == 'C': lang = 'en' if lang not in languages: languages.append(lang) return languages video-downloader-0.12.24/src/util/connection.py000066400000000000000000000130251477332155200214110ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import functools import math import time import traceback from collections import OrderedDict from gi.repository import Gio, GLib, GObject from video_downloader.util import g_log, gobject_log class Closable: def __init__(self): self.__closed = False self.__close_callbacks = [] @property def closed(self): return self.__closed def add_close_callback(self, callback, *args, **kwargs): self.__close_callbacks.append( functools.partial(callback, *args, **kwargs)) if self.closed: self.close() def close(self): self.__closed = True while self.__close_callbacks: try: self.__close_callbacks[-1]() except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_CRITICAL, '%s', traceback.format_exc()) del self.__close_callbacks[-1] def __del__(self): self.close() class CloseStack(Closable): def __init__(self): super().__init__() self.__key = 0 self.__closables = OrderedDict() def push(self, closable): assert not self.closed, 'closed' self.__closables[self.__key] = closable closable.add_close_callback(self.__closables.pop, self.__key) self.__key += 1 return closable def close(self): while self.__closables: key = next(reversed(self.__closables)) self.__closables[key].close() super().close() class SignalConnection(Closable): def __init__(self, obj, signal_name, callback, *extra_args, no_args=False): super().__init__() def on_notify(*args): if no_args: args = [] return callback(*args, *extra_args) handler = obj.connect(signal_name, on_notify) self.add_close_callback(obj.disconnect, handler) class PropertyBinding(Closable): def __init__(self, obj_a, prop_a, obj_b=None, prop_b=None, func_a_to_b=None, func_b_to_a=None, bi=False): super().__init__() self.__frozen = False if not func_a_to_b and not func_b_to_a: binding = GObject.Binding.bind_property( obj_a, prop_a, obj_b, prop_b, GObject.BindingFlags.SYNC_CREATE | ( GObject.BindingFlags.BIDIRECTIONAL if bi else GObject.BindingFlags.DEFAULT)) self.add_close_callback(binding.unbind) return try: connection_a_to_b = SignalConnection( obj_a, 'notify::' + prop_a, self.__apply, obj_a, prop_a, obj_b, prop_b, func_a_to_b, no_args=True) self.add_close_callback(connection_a_to_b.close) if bi: connection_b_to_a = SignalConnection( obj_b, 'notify::' + prop_b, self.__apply, obj_b, prop_b, obj_a, prop_a, func_b_to_a, no_args=True) self.add_close_callback(connection_b_to_a.close) except BaseException: self.close() raise self.__apply(obj_a, prop_a, obj_b, prop_b, func_a_to_b) def __apply(self, src_obj, src_prop, dest_obj, dest_prop, to_func): if self.__frozen: return value = src_obj.get_property(src_prop) if to_func: value = to_func(value) if dest_obj and value is not None: self.__frozen = True try: dest_obj.set_property(dest_prop, value) finally: self.__frozen = False class RateLimit(Closable): def __init__(self, func, seconds=0): super().__init__() self.__seconds = seconds self.__func = func self.__last_call = 0 self.__timeout = None def cleanup_timeout(): if self.__timeout is None: return GLib.Source.remove(self.__timeout) self.__timeout = None self.add_close_callback(cleanup_timeout) def __call__(self): if self.__timeout is not None or self.closed: return timeout = max(self.__seconds - (time.monotonic() - self.__last_call), 0) self.__timeout = GLib.timeout_add( math.ceil(timeout * 1000), self.__handle_timeout) def __handle_timeout(self): self.__func() self.__last_call = time.monotonic() self.__timeout = None return False def create_action(action_group, closable, name, callback, *extra_args, parameter_type=None, no_args=False): action = gobject_log(Gio.SimpleAction.new(name, parameter_type), name) closable.push(SignalConnection( action, 'activate', callback, *extra_args, no_args=no_args)) action_group.add_action(action) closable.add_close_callback(action_group.remove_action, name) video-downloader-0.12.24/src/util/meson.build000066400000000000000000000003641477332155200210440ustar00rootroot00000000000000video_downloader_sources = files([ 'connection.py', '__init__.py', 'path.py', 'response.py', 'rpc.py', ]) python_sources_for_linting += video_downloader_sources install_data(video_downloader_sources, install_dir: moduledir / 'util') video-downloader-0.12.24/src/util/path.py000066400000000000000000000124611477332155200202110ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import os import subprocess import sys import traceback from gi.repository import Gio, GLib from video_downloader.util import g_log, gobject_log def expand_path(path): parts = path.replace(os.altsep or os.sep, os.sep).split(os.sep) home_dir = os.path.expanduser('~') if parts[0] == '~': parts[0] = home_dir elif parts[0].startswith('xdg-'): name = parts[0][len('xdg-'):].replace('-', '').upper() try: parts[0] = subprocess.check_output( ['xdg-user-dir', name], universal_newlines=True, stdin=subprocess.DEVNULL).splitlines()[0] except FileNotFoundError: parts[0] = home_dir return os.path.normpath(os.path.join(os.sep, *parts)) def encode_filesystem_path(path): return path.encode(sys.getfilesystemencoding(), sys.getfilesystemencodeerrors()) def decode_filesystem_path(path): return path.decode(sys.getfilesystemencoding(), sys.getfilesystemencodeerrors()) def open_in_file_manager(directory, filenames): # org.freedesktop.portal.Documents portal_documents_proxy = gobject_log(Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS | Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION, None, 'org.freedesktop.portal.Documents', '/org/freedesktop/portal/documents', 'org.freedesktop.portal.Documents')) try: documents_mount_point = decode_filesystem_path( portal_documents_proxy.call_sync( 'GetMountPoint', None, Gio.DBusCallFlags.NONE, -1 ).get_child_value(0).get_bytestring()) except GLib.Error: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) else: directory_in_documents_portal = os.path.normpath(directory).startswith( os.path.normpath(documents_mount_point)+os.sep) if directory_in_documents_portal: # WORAROUND: Subpaths in the documents portal are not translated filenames = [] # org.freedesktop.portal.OpenURI portal_open_uri_proxy = gobject_log(Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS | Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION, None, 'org.freedesktop.portal.Desktop', '/org/freedesktop/portal/desktop', 'org.freedesktop.portal.OpenURI')) fdlist = gobject_log(Gio.UnixFDList()) for filename in filenames: path = os.path.join(directory, filename) try: fd = os.open(path, os.O_RDONLY) except OSError: g_log(None, GLib.LogLevelFlags.LEVEL_DEBUG, '%s', traceback.format_exc()) continue break else: path = directory try: fd = os.open(path, os.O_RDONLY) except OSError: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) return try: handle = fdlist.append(fd) finally: os.close(fd) try: parameters = GLib.Variant('(sha{sv})', ('', handle, {})) portal_open_uri_proxy.call_with_unix_fd_list_sync( 'OpenDirectory', parameters, Gio.DBusCallFlags.NONE, -1, fdlist) except GLib.Error: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) else: return # org.freedesktop.FileManager1 filemanager_proxy = gobject_log(Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS | Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION, None, 'org.freedesktop.FileManager1', '/org/freedesktop/FileManager1', 'org.freedesktop.FileManager1')) method = 'ShowFolders' if path == directory else 'ShowItems' parameters = GLib.Variant( '(ass)', ([Gio.File.new_for_path(path).get_uri()], '')) try: filemanager_proxy.call_sync( method, parameters, Gio.DBusCallFlags.NONE, -1) except GLib.Error: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) else: return # xdg-open try: subprocess.run(['xdg-open', directory], check=True) except subprocess.SubprocessError: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) else: return video-downloader-0.12.24/src/util/response.py000066400000000000000000000050001477332155200211020ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import typing from video_downloader.util.connection import Closable _R = typing.TypeVar('R') class AsyncResponse(typing.Generic[_R], Closable): def __init__(self) -> None: super().__init__() self.__done = False self.__cancelled = False self.__result = None @property def done(self) -> bool: return self.__done @property def cancelled(self) -> bool: return self.__cancelled @property def result(self) -> typing.Optional[_R]: return self.__result def add_done_callback(self, callback: typing.Callable[ ["AsyncResponse[_R]"], None]) -> None: self.add_close_callback(callback, self) def set_result(self, result: _R) -> None: assert not self.done, 'done' self.__result = result self.__done = True self.close() def cancel(self) -> None: assert not self.done, 'done' self.close() def chain(self, chained_response: "AsyncResponse[_R]" ) -> "AsyncResponse[_R]": def callbackChain(response): assert response.done if not response.cancelled: chained_response.set_result(response.result) elif not chained_response.cancelled: chained_response.cancel() self.add_done_callback(callbackChain) def callbackCancel(chained_response): assert chained_response.done if not self.done: assert chained_response.cancelled self.cancel() chained_response.add_done_callback(callbackCancel) def close(self): if not self.done: self.__cancelled = True self.__done = True super().close() Response = typing.Union[_R, AsyncResponse[_R]] video-downloader-0.12.24/src/util/rpc.py000066400000000000000000000037511477332155200200430ustar00rootroot00000000000000# Copyright (C) 2023 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import functools import json class RpcClient: def __init__(self, output_file, input_file=None): self._output_file = output_file self._input_file = input_file def _rpc(self, name, *args): print(json.dumps({'method': name, 'args': args}), file=self._output_file, flush=True) if self._input_file is None: return None answer = json.loads(self._input_file.readline()) return answer['result'] def __getattr__(self, name): return functools.partial(self._rpc, name) def handle_rpc_request(interface, implementation, json_request): request = json.loads(json_request) # Validate request if (not isinstance(request, dict) or not isinstance(request.get('method'), str) or not isinstance(request.get('args'), list)): raise ValueError('invalid request format') if request['method'].startswith('_'): raise ValueError('invalid method name: %r' % request['method']) if not hasattr(interface, request['method']): raise ValueError('unknown method: %r' % request['method']) # Execute request return getattr(implementation, request['method'])(*request['args']) def rpc_response(result): return json.dumps({'result': result}) video-downloader-0.12.24/src/video-downloader.in000066400000000000000000000031361477332155200215170ustar00rootroot00000000000000#!@PYTHON@ # Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import contextlib import gettext import locale import os import signal import sys VERSION = @VERSION@ pkgdatadir = @pkgdatadir@ localedir = @localedir@ sys.path.insert(1, pkgdatadir) signal.signal(signal.SIGINT, signal.SIG_DFL) locale.bindtextdomain('video-downloader', localedir) locale.textdomain('video-downloader') gettext.bindtextdomain('video-downloader', localedir) gettext.textdomain('video-downloader') with contextlib.suppress(locale.Error): locale.setlocale(locale.LC_ALL, '') if __name__ == '__main__': import gi gi.require_version('Gdk', '4.0') gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gio resource = Gio.Resource.load(os.path.join( pkgdatadir, 'video-downloader.gresource')) resource._register() from video_downloader import main sys.exit(main.main(VERSION)) video-downloader-0.12.24/src/window.py000066400000000000000000000460431477332155200176120ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Video Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Video Downloader. If not, see . import gettext import locale import math import os import uuid from gi.repository import Adw, GdkPixbuf, Gio, GLib, Gtk from video_downloader.about_dialog import build_about_dialog from video_downloader.authentication_dialog import LoginDialog, PasswordDialog from video_downloader.model import HandlerInterface, Model, check_download_dir from video_downloader.playlist_dialog import PlaylistDialog from video_downloader.shortcuts_dialog import ShortcutsDialog from video_downloader.util import gobject_log from video_downloader.util.connection import (CloseStack, PropertyBinding, RateLimit, SignalConnection, create_action) from video_downloader.util.path import expand_path, open_in_file_manager from video_downloader.util.response import AsyncResponse DOWNLOAD_IMAGE_SIZE = 128 MAX_ASPECT_RATIO = 2.39 N_ = gettext.gettext @Gtk.Template(resource_path='/com/github/unrud/VideoDownloader/window.ui') class Window(Adw.ApplicationWindow, HandlerInterface): __gtype_name__ = 'VideoDownloaderWindow' error_detail_wdg = Gtk.Template.Child() success_detail_wdg = Gtk.Template.Child() audio_url_wdg = Gtk.Template.Child() video_url_wdg = Gtk.Template.Child() resolution_wdg = Gtk.Template.Child() prefer_mpeg_wdg = Gtk.Template.Child() main_stack_wdg = Gtk.Template.Child() audio_video_stack_wdg = Gtk.Template.Child() audio_download_wdg = Gtk.Template.Child() video_download_wdg = Gtk.Template.Child() error_back_wdg = Gtk.Template.Child() success_back_wdg = Gtk.Template.Child() download_cancel_wdg = Gtk.Template.Child() finished_download_dir_wdg = Gtk.Template.Child() finished_download_titles_wdg = Gtk.Template.Child() download_page_title_wdg = Gtk.Template.Child() download_title_wdg = Gtk.Template.Child() download_progress_wdg = Gtk.Template.Child() download_info_wdg = Gtk.Template.Child() download_images_wdg = Gtk.Template.Child() def __init__(self, application): super().__init__(application=application) self._cs = CloseStack() self.application = application self.model = gobject_log(Model(self)) self._cs.add_close_callback(self.model.destroy) self.window_group = gobject_log(Gtk.WindowGroup()) self.window_group.add_window(self) # Setup actions for action_name in self.model.actions.list_actions(): self.add_action(self.model.actions.lookup_action(action_name)) self._cs.add_close_callback(self.remove_action, action_name) create_action(self, self._cs, 'close', self.destroy, no_args=True) create_action(self, self._cs, 'about', self._show_about_dialog, no_args=True) create_action(self, self._cs, 'shortcuts', self._show_shortcuts_dialog, no_args=True) create_action(self, self._cs, 'change-download-folder', self._change_download_folder, no_args=True) create_action( self, self._cs, 'set-audio-video-page', lambda _, param: self.audio_video_stack_wdg.set_visible_child_name( param.get_string()), parameter_type=GLib.VariantType('s')) # Register notifcation actions self._notification_uuid = str(uuid.uuid4()) create_action(application, self._cs, 'notification-success--' + self._notification_uuid, self.present, no_args=True) create_action(application, self._cs, 'notification-error--' + self._notification_uuid, self.present, no_args=True) create_action( application, self._cs, 'notification-open-finished-download-dir--' + self._notification_uuid, self.model.actions.activate_action, 'open-finished-download-dir', no_args=True) # Bind properties to UI self._cs.push(PropertyBinding( self.model, 'error', self.error_detail_wdg, 'label')) self._cs.push(PropertyBinding( self.model, 'url', self.audio_url_wdg, 'text', bi=True)) self._cs.push(PropertyBinding( self.model, 'url', self.video_url_wdg, 'text', bi=True)) for description in self.model.resolutions.values(): self.resolution_wdg.get_model().append(description) self._cs.push(PropertyBinding( self.model, 'resolution', self.resolution_wdg, 'selected', lambda r: list(self.model.resolutions).index(r), lambda i: list(self.model.resolutions)[i], bi=True)) self._cs.push(PropertyBinding( self.model, 'prefer-mpeg', self.prefer_mpeg_wdg, 'active', bi=True)) self._cs.push(PropertyBinding( self.model, 'state', self.main_stack_wdg, 'visible-child-name', func_a_to_b=lambda s: {'prepare': 'download', 'cancel': 'download'}.get(s, s))) self._cs.push(PropertyBinding( self.model, 'state', func_a_to_b=self._update_notification)) self._cs.push(PropertyBinding( self.model, 'mode', self.audio_video_stack_wdg, 'visible-child-name', bi=True)) self._cs.push(PropertyBinding( self.main_stack_wdg, 'visible-child-name', func_a_to_b=lambda _: self._update_focus_and_default())) self._cs.push(PropertyBinding( self.audio_video_stack_wdg, 'visible-child-name', func_a_to_b=lambda _: self._update_focus_and_default())) self._cs.push(PropertyBinding( self.model, 'finished-download-dir', func_a_to_b=self._update_finished_download_dir_wdg_tooltip)) update_download_msg_rate_limited = self._cs.push(RateLimit( self._update_download_msg, 1)) for name in ['download-bytes', 'download-bytes-total', 'download-speed', 'download-eta']: self._cs.push(SignalConnection( self.model, 'notify::' + name, update_download_msg_rate_limited, no_args=True)) self._cs.push(PropertyBinding( self.model, 'download-progress', func_a_to_b=lambda _: self._update_download_progress())) self._cs.push(SignalConnection( self.model, 'download-pulse', self._update_download_progress, no_args=True)) for name in ['download-playlist-count', 'download-playlist-index']: self._cs.push(PropertyBinding( self.model, name, func_a_to_b=lambda _: self._update_download_page_title())) self._cs.push(PropertyBinding( self.model, 'download-title', self.download_title_wdg, 'label', func_a_to_b=lambda title: title or '…')) self._cs.push(PropertyBinding( self.model, 'download-thumbnail', func_a_to_b=self._add_thumbnail)) self._cs.push(PropertyBinding( self.download_images_wdg, 'transition-running', func_a_to_b=lambda b: b or self._clean_thumbnails())) self._cs.push(PropertyBinding( self.model, 'download-titles', self.finished_download_titles_wdg, 'label', func_a_to_b=lambda titles: ' | '.join(titles or []))) self._cs.push(PropertyBinding( self.model, 'finished-download-filenames', self.success_detail_wdg, 'label', func_a_to_b=lambda filenames: '\n'.join( (f'' f'{s}' f'') for s in map(GLib.markup_escape_text, filenames or [])))) self._cs.push(SignalConnection( self.success_detail_wdg, 'activate_link', lambda sender, filename: open_in_file_manager( self.model.finished_download_dir, [filename]))) # Workaround for focusing AdwEntryRow at program startup self._cs.push(SignalConnection( self, 'show', self._update_focus_and_default, no_args=True)) def _update_download_progress(self): progress = self.model.download_progress if progress < 0: self.download_progress_wdg.pulse() else: self.download_progress_wdg.set_fraction(progress) def _update_download_page_title(self): playlist_count = self.model.download_playlist_count playlist_index = self.model.download_playlist_index s = N_('Downloading') if playlist_count > 1: s += ' (' + N_('{} of {}').format( playlist_index + 1, playlist_count) + ')' self.download_page_title_wdg.set_text(s) def _update_download_msg(self): def filesize_fmt(num, suffix='B'): for unit in ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']: if abs(num) < 1000: break num /= 1000 return locale.format_string('%.1f\u00A0%s%s', (num, unit, suffix)) bytes_ = self.model.download_bytes bytes_total = self.model.download_bytes_total speed = self.model.download_speed eta = self.model.download_eta eta_h = eta // 60 // 60 eta_m = eta // 60 % 60 eta_s = eta % 60 time_msg = '%d∶%02d∶%02d' % (eta_h, eta_m, eta_s) if eta >= 0 else '' size_msg = N_('{} of {}').format( filesize_fmt(bytes_) if bytes_ >= 0 else N_('unknown'), filesize_fmt(bytes_total) if bytes_total >= 0 else N_('unknown') ) if bytes_ >= 0 or bytes_total >= 0 else '' speed_msg = filesize_fmt(speed, 'B/\u2060s') if speed >= 0 else '' self.download_info_wdg.set_text( time_msg + ('\u00A0- ' if time_msg and (size_msg or speed_msg) else '') + size_msg + (f" ({speed_msg})" if size_msg and speed_msg else speed_msg)) def _add_thumbnail(self, thumbnail): try: pixbuf = gobject_log(GdkPixbuf.Pixbuf.new_from_file_at_size( thumbnail, math.ceil(DOWNLOAD_IMAGE_SIZE * MAX_ASPECT_RATIO), DOWNLOAD_IMAGE_SIZE)) except GLib.Error: img_wdg = gobject_log(Gtk.Image.new_from_icon_name( 'video-x-generic')) img_wdg.set_pixel_size(DOWNLOAD_IMAGE_SIZE) else: img_wdg = gobject_log(Gtk.Picture.new_for_pixbuf(pixbuf)) img_wdg.set_size_request(-1, DOWNLOAD_IMAGE_SIZE) self.download_images_wdg.add_child(img_wdg) self.download_images_wdg.set_visible_child(img_wdg) def _clean_thumbnails(self): visible_child_wdg = self.download_images_wdg.get_visible_child() for page in list(self.download_images_wdg.get_pages()): child_wdg = page.get_child() if child_wdg is not visible_child_wdg: self.download_images_wdg.remove(child_wdg) def _update_finished_download_dir_wdg_tooltip(self, download_dir): if download_dir: home_dir = os.path.expanduser('~') if os.path.commonpath([home_dir, download_dir]) == home_dir: download_dir = '~' + download_dir[len(home_dir):] self.finished_download_dir_wdg.set_tooltip_text(download_dir) def _update_focus_and_default(self): state = self.main_stack_wdg.get_visible_child_name() mode = self.audio_video_stack_wdg.get_visible_child_name() default_wdg = None if state == 'start': if mode == 'audio': default_wdg = self.audio_download_wdg self.audio_url_wdg.grab_focus() elif mode == 'video': default_wdg = self.video_download_wdg self.video_url_wdg.grab_focus() else: assert False, 'unreachable' elif state in ['download', 'cancel']: self.download_cancel_wdg.grab_focus() elif state == 'error': self.error_back_wdg.grab_focus() elif state == 'success': self.finished_download_dir_wdg.grab_focus() else: assert False, 'unreachable' self.set_default_widget(default_wdg) def _hide_notification(self): self.application.withdraw_notification(self._notification_uuid) def _update_notification(self, state): self._hide_notification() if state not in ('error', 'success') or self.is_active(): return notification = gobject_log(Gio.Notification()) if state == 'error': notification.set_title(N_('Download failed')) notification.set_default_action( 'app.notification-error--' + self._notification_uuid) elif state == 'success': notification.set_title(N_('Download finished')) if self.model.download_titles: notification.set_body(' | '.join(self.model.download_titles)) notification.set_default_action( 'app.notification-success--' + self._notification_uuid) notification.add_button( N_('Open Download Location'), 'app.notification-open-finished-download-dir--' + self._notification_uuid) else: assert False, 'unreachable' self.application.send_notification(self._notification_uuid, notification) def _show_shortcuts_dialog(self): dialog = gobject_log(ShortcutsDialog(self)) self.window_group.add_window(dialog) dialog.show() def _show_about_dialog(self): dialog = gobject_log(build_about_dialog(self)) self.window_group.add_window(dialog) dialog.show() def on_download_folder_error(self, title, message, path, show_reset_button=True): def handle_response(dialog, res): if res == RESPONSE_TYPE_CHANGE: self._change_download_folder().chain(async_response) connection.close() elif res == RESPONSE_TYPE_RESET: self.application.settings.reset('download-folder') async_response.set_result(None) else: async_response.cancel() RESPONSE_TYPE_RESET = 100 RESPONSE_TYPE_CHANGE = 101 if path is not None: message = '%s: %r' % (message, path) if message else repr(path) dialog = Gtk.MessageDialog( modal=True, destroy_with_parent=True, message_type=Gtk.MessageType.ERROR, text=title, secondary_text=message, buttons=Gtk.ButtonsType.CANCEL) if show_reset_button: dialog.add_button(N_('Reset to Default'), RESPONSE_TYPE_RESET) dialog.add_button(N_('Change Download Location'), RESPONSE_TYPE_CHANGE) dialog.set_default_response(RESPONSE_TYPE_CHANGE) dialog.set_transient_for(self) connection = SignalConnection(dialog, 'response', handle_response) connection.add_close_callback(dialog.destroy) async_response = AsyncResponse() async_response.add_close_callback(connection.close) self._cs.push(async_response) dialog.show() return async_response def _change_download_folder(self): def handle_callback(dialog, task): try: file = dialog.select_folder_finish(task) except GLib.GError: # Dialog cancelled async_response.cancel() return message = path = None if file and file.get_path(): path = file.get_path() message = check_download_dir(expand_path(path)) if message is None: self.model.download_folder = path async_response.set_result(None) return else: message = N_('Not a directory') self.on_download_folder_error( N_('Invalid folder selected'), message, path, show_reset_button=False).chain(async_response) dialog = gobject_log(Gtk.FileDialog( modal=True, title=N_('Change Download Location'), accept_label=N_('Select Folder'))) cancellable = Gio.Cancellable() async_response = AsyncResponse() async_response.add_close_callback(cancellable.cancel) self._cs.push(async_response) dialog.select_folder(self, cancellable, handle_callback) return async_response def on_playlist_request(self): def handle_response(dialog, res): if res == Gtk.ResponseType.NO: async_response.set_result(False) elif res == Gtk.ResponseType.YES: async_response.set_result(True) else: async_response.cancel() dialog = gobject_log(PlaylistDialog(self)) connection = SignalConnection(dialog, 'response', handle_response) connection.add_close_callback(dialog.destroy) async_response = AsyncResponse() async_response.add_close_callback(connection.close) self._cs.push(async_response) self.window_group.add_window(dialog) dialog.show() return async_response def on_login_request(self): def handle_response(dialog, res): if res == Gtk.ResponseType.OK: async_response.set_result((dialog.username, dialog.password)) else: async_response.cancel() dialog = gobject_log(LoginDialog(self)) connection = SignalConnection(dialog, 'response', handle_response) connection.add_close_callback(dialog.destroy) async_response = AsyncResponse() async_response.add_close_callback(connection.close) self._cs.push(async_response) self.window_group.add_window(dialog) dialog.show() return async_response def on_password_request(self): def handle_response(dialog, res): if res == Gtk.ResponseType.OK: async_response.set_result(dialog.password) else: async_response.cancel() dialog = gobject_log(PasswordDialog(self)) connection = SignalConnection(dialog, 'response', handle_response) connection.add_close_callback(dialog.destroy) async_response = AsyncResponse() async_response.add_close_callback(connection.close) self._cs.push(async_response) self.window_group.add_window(dialog) dialog.show() return async_response def destroy(self): self._hide_notification() self._cs.close() super().destroy() video-downloader-0.12.24/src/window.ui000066400000000000000000001016341477332155200175750ustar00rootroot00000000000000
New Window app.new-window
Change Download Location win.change-download-folder Keyboard Shortcuts win.shortcuts About Video Downloader win.about
hamburger_menu