diff --git a/plugin.video.youtube/LICENSES/GPL-3.0-or-later b/plugin.video.youtube/LICENSES/GPL-3.0-or-later
deleted file mode 100644
index 9cecc1d466..0000000000
--- a/plugin.video.youtube/LICENSES/GPL-3.0-or-later
+++ /dev/null
@@ -1,674 +0,0 @@
- 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.
-
- {one line to give the program's name and a brief idea of what it does.}
- Copyright (C) {year} {name of author}
-
- 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:
-
- {project} Copyright (C) {year} {fullname}
- 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
-.
diff --git a/plugin.video.youtube/addon.xml b/plugin.video.youtube/addon.xml
index 6c2927e838..d30bd9f82f 100644
--- a/plugin.video.youtube/addon.xml
+++ b/plugin.video.youtube/addon.xml
@@ -1,9 +1,9 @@
-
+
-
+
@@ -13,14 +13,19 @@
-[fix] Nexus compatibility with InfoTagVideo |contrib: jurialmunkey|
-[chg] make httpd /api url case insensitive due to skin choice of uppercase settings text
-[chg] use listitem property for Inputstream Adaptive headers instead of url piped on Nexus+
+[new] quality and stream feature selection
+[new] enable HLS live streams
+[new] stream and language labelling
+[chg] separately enable local/remote history
+[chg] restore unsupported compatibility for Kodi v19 (Matrix)
+[fix] fix various playback issues |contrib: various|
+[fix] Limit host connections getting subscription feeds |contrib: cas--|
+[fix] fix handling of connection failures
[upd] Translations updated from Kodi Weblate
- icon.png
- fanart.jpg
+ resources/media/icon.png
+ resources/media/fanart.jpg
all
GPL-2.0-only
diff --git a/plugin.video.youtube/changelog.txt b/plugin.video.youtube/changelog.txt
new file mode 100644
index 0000000000..ea5b1eca8b
--- /dev/null
+++ b/plugin.video.youtube/changelog.txt
@@ -0,0 +1,959 @@
+7.0.2
+[new] quality and stream feature selection
+[new] enable HLS live streams
+[new] stream and language labelling
+[chg] separately enable local/remote history
+[chg] restore unsupported compatibility for Kodi v19 (Matrix)
+[fix] fix various playback issues |contrib: various|
+[fix] Limit host connections getting subscription feeds |contrib: cas--|
+[fix] fix handling of connection failures
+[upd] Translations updated from Kodi Weblate
+
+7.0.1
+[fix] video duration not showing in lists
+[upd] Translations updated from Kodi Weblate
+
+7.0.0
+[rem] removed support for versions of Kodi pre-Nexus v20
+[rem] removed support for python 2
+[rem] removed dependency on six
+[upd] Translations updated from Kodi Weblate
+
+6.8.25
+[fix] Nexus compatibility with InfoTagVideo |contrib: jurialmunkey|
+[chg] make httpd /api url case insensitive due to skin choice of uppercase settings text
+[chg] use listitem property for Inputstream Adaptive headers instead of url piped on Nexus+
+[upd] Translations updated from Kodi Weblate
+
+6.8.24
+[fixup] resolve playback history not being updated
+[add] add opus audio support
+[upd] use more descript reasons for failed playback
+[upd] Translations updated from Kodi Weblate
+
+6.8.23
+[revert] subscription groups/tags - causing breaking issues
+
+6.8.21
+[chg] Icons and Fanart updated |contrib: papercore-dev|
+[add] Add setting General - Hide short videos (1 minute or less)
+[add] Add support for /shorts/video_id format links |contrib: jmbreuer|
+[add] Add Fanart to Subscriptions
+[add] Access to Saved Playlists
+[fix] Display of channel fanart
+[fix] Misc missing fanart
+[lang] translation updates from Weblate
+
+6.8.20
+[fix] Fix to_str |contrib: RNavega|
+[fix] Fix playback buffering |contrib: RNavega|
+[fix] Subtitle language names
+[lang] translation updates from Weblate
+
+6.8.19
+[fix] /uri2addon/ endpoint for playback of youtube.com urls
+[fix] Don't assume addon is installed in home directory |contrib: jfly|
+[lang] translation updates from Weblate
+
+6.8.18
+[fix] Fix to_str |contrib: RNavega|
+[fix] Fix playback buffering |contrib: RNavega|
+[lang] translation updates from Weblate
+
+6.8.17
+[fix] Fix comments on Kodi 19+ |contrib: ramateur|
+[fix] Fix ratebypass
+[upd] Update icon and fanart |contrib: papercore-dev|
+[lang] translation updates from Weblate
+
+6.8.16
+[fix] Fix playback of some content (ie. Music videos)
+[fix] Calcuate n parameter to enable ratebypass
+
+6.8.15
+[fixup] No streams found, consent cookies |contrib: jaylinski|
+[fixup] Age gate detection, show age gate error instead of 'No streams found'
+[fixup] encoding of some titles/authors - ie. russian
+[lang] translation updates from Weblate
+
+6.8.14
+[fixup] playback of some streams due to encoding issues
+[fixup] default player response type
+
+6.8.13
+[fix] player config and client discovery
+[fix] No Streams Found |contrib: 14mRh4X0r|
+[fix] capability map to contain unversioned capabilities |contrib: jmbreuer|
+[lang] zh_tw strings |contrib: JuenTingShie|
+
+6.8.11
+[fix] mktime overflow when loading My Subscriptions
+[fix] encoding issues in search history |contrib: dreznichuk|
+
+6.8.10
+[fix] fix javascript player retrieval and playback of some videos for affected users |contrib: thomazz-nl|
+ - Invalid URL 'http://': No host supplied
+
+6.8.9
+[fix] my subscriptions section using YouTube RSS |contrib: PureHemp|
+[fix] items per page settings on Kodi 19
+[chg] recommendations only available for users with custom history playlist id configured
+[chg] no longer show watch later unless custom watch later playlist is configured
+[rem] remove usage of discontinued api and dual login (no longer required)
+
+6.8.8
+[fixup] encoding of subtitle track names
+
+6.8.7
+[fixup] encoding of titles and authors during playback
+
+6.8.6
+[fix] some videos failing to play with an Invalid URL exception
+[fix] searching in some instances with encoding issues |contrib: tsaklidis|
+[fix] support python 3.9 html.unescape |contrib: asavah|
+
+6.8.5
+[fix] playback of purchased movies |contrib: MisterD81|
+[fix] notifications for some languages on Kodi 19
+[fix] searching for some languages
+[fix] loading on some versions of python 3
+[fix] some videos failing to play with an Invalid URL exception
+[upd] use xbmcvfs.translatePath if available, clean up for Kodi 19
+
+6.8.4
+[fix] next page now ignores sorting, remains at the end of the directory
+[fix] searching, no longer require remote safe search
+[fix] notifications for some languages
+[chg] only log http server ping failures
+[lang] zh_cn strings |contrib: yureng, xiaojun|
+
+6.8.3
+[fix] playback of some videos
+[fix] notifications for some languages |contrib: Mutronics|
+[fix] fix rating videos causing and error even though it succeeded
+[upd] cache javascript player url for4 hours, reduces http requests per play by 1
+[upd] use new settings format on Kodi 19
+[lang] el_gr strings |contrib: twilight0|
+[lang] hu_hu strings |contrib: thelacesz|
+
+6.8.2
+[fixup] recommendations with > 50 channels
+
+6.8.1
+[fix] playback failing
+[fix] viewing comments when logged in
+[fix] intermittent issue with Subscriptions
+[fix] encoding of video unavailable messages
+[upd] updates to recommendations
+[upd] update logging for Kodi 19
+[lang] fr_fr strings |contrib: alan7000|
+[lang] pl_pl strings |contrib: drrak|
+[lang] nl_nl strings |contrib: Markman-B|
+
+6.8.0
+[add] support for video comments, Comments in the More... dialog |contrib: doko-desuka|
+[add] simulate deprecated recommended home API |contrib: hedleyroos|
+[fix] error caused by timestamp formatting
+[fix] fix Premiere's exiting after 5 seconds |contrib: jpfox156|
+[fix] playlists over json-rpc |contrib: JasperE84|
+[lang] de_de strings |contrib: tweimer|
+[lang] el_gr strings |contrib: twilight0|
+[lang] es_es strings |contrib: roliverosc|
+[lang] pt_pt strings |contrib: daniel3x|
+
+6.7.0
+[add] send PlaybackInit, PlaybackStarted, PlaybackStopped notifications containing video id, channel id, and the status of the playing video
+[fix] allow playback regardless of API status
+ - fixes playback for strm, playlists, other add-ons, and sharing videos from devices
+[fix] finding player config, allow playback to continue when not found if possible
+[fix] fix possible loop due to invalid keys and login information
+[fix] fix playback of mpeg-dash streams if HTTP Server - Listen on IP is blank
+[upd] use a dialog to notify users of API key requirements with link to wiki
+ - https://ytaddon.page.link/keys
+[rem] remove provided api keys
+[lang] de_de strings |contrib: tweimer|
+[lang] el_gr strings |contrib: twilight0|
+[lang] hu_hu strings |contrib: thelacesz|
+[lang] pl_pl strings |contrib: drrak|
+
+6.6.0
+[add] 'Play (Ask for quality)' context menu
+[add] search by channel or playlist id
+[add] hide_folders, hide_playlists, hide_search, and hide_live to /channel// end-point
+ - ie. plugin://plugin.video.youtube/channel/UC4PooiX37Pld1T8J5SYT-SQ/?hide_folders=true will hide all folders(Playlists, Search, and Live) in the channel listing
+[fix] playback for some videos (ie. music videos)
+[fix] playback of some videos with no adaptive video streams
+[fix] don't update watch history when incognito/screensaver/live |contrib: regseb|
+[fix] search prompting for input after video playback or refresh
+[lang] el_gr strings |contrib: twilight0|
+[lang] es_es strings |contrib: roliverosc|
+[lang] pt_br strings |contrib: MediaBrasil|
+[lang] cs_cz strings |contrib: llzn.cz|
+[lang] it_it strings |contrib: SebastianoPistore|
+[lang] de_de strings |contrib: tweimer|
+
+6.5.2
+[fix] playback (No streams found)
+[fix] missing metadata
+[fix] ended live streams not using mpeg-dash when enabled
+[fix] subscriptions not showing latest videos
+[upd] simplify youtube_resolver regex |contrib: Twilight0|
+[lang] de_de strings |contrib: TehTux|
+[lang] pl_pl strings |contrib: drrak|
+[lang] nl_nl strings |contrib: Markman-B|
+
+6.5.1
+[add] get_live to youtube_requests module to retrieve live stream info for a channel
+[add] Adaptive (MP4) and Adaptive (WEBM) to MPEG-DASH - Video quality
+[fix] live stream playback
+[fix] unable to seek when using mpeg-dash
+[fix] mpeg-dash video quality selection
+[fix] sqlite requests breaking when another add-on/module uses sqlite3.register_converter(..)
+[fix] signal endofdirectory in case of a provider navigation exception |contrib: enen92|
+
+6.5.0
+[add] Video quality selection to Settings - MPEG-DASH
+[add] Limit to 30fps to Settings - MPEG-DASH
+[add] Uploads playlist to channel playlists
+[chg] Use search for channel videos instead of the Uploads playlist
+[fix] Signature cipher, some videos unplayable (ie. music videos)
+[fix] Playback monitoring using Python 3
+[fix] unescape html entities in title and plot
+[fix] handling of invalid grant when refreshing access token
+[fix] adding suggested videos when played from some widgets
+[fix] http server /client_ip using Python 3 |contrib: t6|
+[upd] refactor youtube_resolver.resolve
+[lang] el_gr strings |contrib: twilight0|
+[lang] es_es strings |contrib: roliverosc|
+[lang] ko_kr strings |contrib: parkmino|
+
+6.4.1
+[upd] Use the activation url provided by the authentication request
+[add] add Settings - MPEG-DASH - Default to WEBM adaptation set
+ - required for 4k stream automatic selection
+[add] add Settings - MPEG-DASH - Include VP9.2
+ - includes HDR content in the manifest
+[add] add support for &hide_folders=true parameter in search query urls
+ - when added to the url it will hide the Playlists, Channels, and Live folders
+[add] &seek= to play urls
+[fix] fix playback of Purchases
+[fix] fixed saved playlists that don't belong to a channel
+[fix] mpeg-dash frame rate representation
+[fix] datetime parsing if no datetime string is available
+[chg] handle playback monitoring in threads
+[lang] nl_nl strings |contrib: MB1968|
+[lang] el_gr strings |contrib: twilight0|
+
+6.4.0
+[add] 4K videos with InputStream Adaptive >= v2.3.14
+ - Thanks to @peak3d
+[fix] some videos not playing when logged in
+[fix] reset function cache at restart/update to resolve issues persisting due to cached results
+[fix] service potentially not shutting down http server
+[fix] added to playlist/subscriptions notifications
+[fix] only generate mpeg-dash file if adaptive formats are available
+[fix] map frame rates to more common representation to lessen the chance of double refresh rate changes (only applies to generated mpeg-dash files)
+[fix] currently playing file check when playing file is a plugin:// url
+[chg] Settings - General - Autoplay suggested videos
+ - limit playlist size to 1000 videos
+ - request less relevant videos at one time
+ - old behavior: add 50 most relevant videos for each video played, repeats allowed
+ - result: a lot of barely relevant videos in groups of 50
+ - new behavior: add single most relevant video, no repeats
+ - result: next video is always the most relevant video to the last video played
+[upd] player javascript retrieval
+
+6.3.1
+[fix] ensure playback monitoring is monitoring the correct item
+[fix] check for abortRequested while processing purchased collections
+[upd] Use setArt instead of iconImage, thumbnailImage and setProperty('fanart_image')
+
+6.3.0
+[add] support for keymapping of some endpoints, wiki: https://kodi.wiki/view/Add-on:YouTube#Keymaps
+[add] 'Rate videos in playlists' setting to 'Settings - General - Rate after watching'
+[add] Support for purchased collections |contrib: MisterD81|
+[fix] Playback of some videos (e.g. music videos)
+[fix] Live stream playback
+[fix] post play add to watch history
+[fix] fix add-ons playback history not saving
+[fix] playback monitoring/post play events triggering for the wrong videos in some cases
+[fix] call setResolvedUrl(False) if get_video_streams fails
+[upd] code cosmetics and resolve inspections
+[upd] improve watch history tracking, actively report watch times and state during playback
+[upd] sign in/out, switch user, and settings ListItems to isFolder=False and isPlayable=False
+[upd] improve watch later playlist id retrieval and feedback
+[upd] Use SPDX license identifier
+[lang] de_de strings |contrib: tobhor|
+[lang] el_gr strings |contrib: twilight0|
+[lang] es_es strings |contrib: roliverosc|
+[lang] ko_kr strings |contrib: parkmino|
+[lang] nl_nl strings |contrib: Markman-B|
+
+6.2.3
+[add] Next Page to 'More...' -> 'Add to...' context menu
+[add] icon and description to playlists in 'More...' -> 'Add to...' context menu on Kodi 17+
+[add] 'Play audio only' context menu item
+[fix] generated dash with no supported video streams(audio only) being played when Audio only not enabled
+[fix] potential RuntimeError when retrieving total time of playing content if player is stopped immediately
+[lang] nl_nl strings |contrib: Markman-B|
+[lang] pl_pl strings |contrib: xulek|
+[lang] pl_pl strings |contrib: drrak|
+[lang] sk_sk strings |contrib: jose1711|
+[lang] el_gr strings |contrib: twilight0|
+[lang] es_es strings |contrib: roliverosc|
+
+6.2.2
+[fix] signature function not found on some videos
+
+6.2.1
+[fix] some streams reporting as Unavailable
+[fix] utf-8 file paths
+[fix] settings, and switch user causing perpetual busy dialog on Kodi 18
+
+6.2.0
+[add] Context menu -> 'Play with subtitles' |contrib: solarus|
+[add] Option to download subtitles before playback in Settings -> General -> Configure subtitles
+[add] Refresh context menu to all videos/live streams
+[add] &strm=true parameter for strm files in Kodi 18 |contrib: vlmaksime|
+ - use description from library and set watched status
+[add] 'Settings -> Advanced -> Use YouTube website urls' for external/alternative players
+ eg. Player: MPC-BE, URL: https://www.youtube.com/watch?v=C0NyvxTJGcQ
+ eg. playercorefactory.xml
+
+
+
+
+ C:\Program Files\MPC-BE x64\mpc-be64.exe
+ "{1}" /fullscreen /close
+ true
+ true
+ none
+
+
+
+
+
+
+[fix] Reported background progress dialog percentage
+[fix] Playlist items, use video_items instead of playback_items
+[fix] search history size
+[fix] remove Spanish (Latin America)|es-419 from the setup wizard, causing invalidLanguage and invalidRelevanceLanguage errors
+[upd] Improve speed of playback starting and resolver
+ before: min: 1.5s max: 2.6s median: 1.7s
+ after: min: 0.9s max: 2.6s median: 1.2s
+[chg] refactor logging and system version
+[chg] Localize confirmation
+[lang] el_gr strings |contrib: twilight0|
+[lang] es_es strings |contrib: roliverosc|
+[lang] es_mx strings |contrib: Intel11|
+[lang] it_it strings |contrib: SebastianoPistore|
+[lang] nl_nl strings |contrib: Markman-B|
+[lang] ru_ru strings |contrib: vlmaksime|
+
+6.1.4
+[fix] Signature function not found
+
+6.1.3
+[fix] timedelta.total_seconds python 2.6 compat.
+
+6.1.2
+[fix] dash settings check and defaults
+[fix] addon-check raised warning for services complex entry point
+[fix] codacy raised issue in http server (https://app.codacy.com/app/Kodi/repo-plugins/pullRequest?prid=2080401)
+[chg] move seek to onPlayBackStarted, onAVStarted only in K18
+[chg] geolocation provider changed from ipstack to ip-api
+[del] frodo listitem art compatibility
+[lang] ru_ru strings |contrib: Burgaduk|
+[lang] zh_tw strings |contrib: Zankio|
+
+6.1.1
+[fix] http proxy using incorrect setting id causing 403 errors
+
+6.1.0
+[add] Multi-user support
+ - Switch User folder (default: on) Settings -> Folders
+ - User management (Add, Remove, Rename, Switch) Settings - Users
+ - Signed in users are green, Current user has an *
+[add/upd] add data cache and optimize caching
+ - add Settings -> Maintenance -> Clear data cache/Delete data cache
+ - increase allowed cache size
+ - database accesses per 50 videos: before: 70~100 after: 4~6
+ - load time of 50 videos w/ no cached videos: before: ~11.6 secs, after: ~3 secs
+ - load time of 50 videos w/ all cached videos: before: ~0.8 secs, after: ~0.7 secs
+ - cached size per 50 videos: before ~1MB, after ~550KB
+[add] Refresh after watching (default: off) Settings -> General
+[add] Completed Live folder (default: on) Settings -> Folders
+[add] Upcoming Live folder (default: on) Settings -> Folders
+[add] My Location folder (default: on) Settings -> Advanced -> Enable setup-wizard
+[add] Play count minimum percent (default: 85%) Settings -> General -> Play count minimum percent
+[add] Playback history (default: off) Settings -> Advanced -> Use playback history
+[add] Time since published for videos as item properties Property(PublishedSince), Property(PublishedLocal) |contrib: pannal|
+[add] Check My IP, Settings -> HTTP Server
+[add] Developer authentication, allowing add-ons to use their own access tokens
+ - see youtube_authentication.py, youtube_registration.py, youtube_requests.py, and youtube_resolver.py
+[upd] YouTube UTC datetimes to local timezone |contrib: pannal|
+[upd] Localize API key errors, provide a more descriptive notification
+[fix] Add to YouTube watch history
+[fix] My Channel videos (Error 403)
+[fix] allow fallback to dash, when using Audio only
+[fix] Signature function not found error for some users
+[fix] Context Menu -> More -> Related Videos w/ Kodi 18
+[fix] Sign In/Sign Out causing crash with Kodi 18 nightlies
+[fix] Channel 'mine' caching
+[fix] Time changing when playing generated dash
+[lang] es_es strings |contrib: roliverosc|
+[lang] el_gr strings |contrib: twilight0|
+[lang] nl_nl strings |contrib: Markman-B|
+
+6.0.2
+[fix] incorrectly raised 'Proxy is not running' error
+
+6.0.1
+[fix] notification encoding
+
+6.0.0
+[add] Python 3 compat.
+[add] Settings -> Maintenance -> Delete temporary files
+[add] Settings -> General -> Rate video after watching
+[add] Settings -> API -> Enable API configuration page
+ - when enabled, visit http://:/api to configure API keys from a web browser
+ - port is configured in Settings - HTTP Server - Port
+[chg] Storing personal api keys in api_keys.json
+[chg] Storing login tokens in access_manager.json
+[add] youtube_registration module, register developer keys and use them by appending an addon_id= parameter to youtube add-on plugin urls
+[add] screensaver=true parameter to /play route - no suggested videos, no post play events, don't ask for quality
+[add] play route for channel live streams
+ - plugin://plugin.video.youtube/play/?channel_id=UCLA_DiR1FfKNvjuUpBHmylQ&live=1
+[add] Purchases
+ - requires Kodi 18
+ - requires inputstream.adaptive >= 2.2.12
+ - if a purchase fails after 10 seconds
+ - provide a debug log
+ - set InputStream Adaptive -> Settings -> Stream selection -> manual
+ - change video stream during playback to preferred working resolution
+ - huge thanks to peak3d
+[add] relevanceLanguage to search requests
+[add] Refresh to My Subscriptions (Filtered)
+[fix] mpeg-dash proxy with multi-profiles
+[fix] search input, now works with Yatse
+[fix] Signature deciphering
+[fix] context menu after playback
+[fix] alternative player, do not append headers
+[fix] My Subscriptions (Filtered) channel matching
+[fix] Audio only, failover to video if no audio only streams available
+[fix] My Subscriptions missing page 3
+[fix/upd] function cache, update max rows and resolve hang on some requests
+[fix/upd] post play events happen post play
+[fix/upd] set title from metadata on play
+[chg] only automatically remove temp folder at start-up
+[upd] Dutch strings [MB1968]
+[upd] French strings [bubuleur]
+[upd] Greek strings [twilight0]
+[upd] Spanish strings [roliverosc]
+
+5.5.0
+[add] Saved Playlists
+[add] allow developers to use their own api key
+ - xbmcgui.Window(10000).setProperty('plugin.video.youtube-configs', json.dumps({"origin": ADDON_ID, "main": {"system": SYSTEM_NAME, "key": API_KEY[, "id": CLIENT_ID, "secret": CLIENT_SECRET]}}))
+[add] Audio only: Settings -> General
+[add] Age gate enforcement: Settings -> General
+[add] Quick search and Quick search (Incognito)
+ - Settings -> Folders
+ - incognito doesn't add to search history or run post play events (add to watch history)
+[add] Quick search to channels (no history)
+[add] Live folder to channels
+[fix] My Channel videos incl. private
+[fix] mpeg-dash vods, proxy required
+ - Settings - MPEG-DASH
+ - Thanks to Schtek for generating the needed mpd file
+[fix/upd] use select dialog for subtitle settings
+ - [add] Configure subtitles: Settings -> General
+ - [add] Current language with No auto-generated subtitles option
+[upd] language/translation paths * Isengard (15.x)+ required
+[upd] youtube_resolver: allow resolve by url
+[fix/upd] do not use distutils.version.LooseVersion for version compare [stefansaraev]
+[fix/upd] add check to api key stripping
+[fix/upd] subtitles default to non asr track when possible
+[fix/upd] login client logging and endpoints
+[fix/upd] Watch Later
+ - Clear: Settings - Folders - Custom Watch Later playlist id
+ - Settings - Folders - Retrieve Watch Later playlist id
+[fix/upd] History
+ - cannot add to history from add-on
+ - Clear: Settings - Folders - Custom History playlist id
+[fix] /api/update route logging
+[rem] SPMC mpeg-dash support
+[upd] Hebrew strings [Eng2Heb]
+[upd] Polish strings [Etharr]
+[upd] Italian strings [DjDiabolik]
+[upd] Hungarian strings [lacesz-sh]
+
+5.4.5
+[fix] tighten regex for routing, resolving incorrect routing
+
+5.4.4
+[fix] overlapping regex causing no playlist videos
+
+5.4.3
+[add] mpeg-dash support for live content (requires inputstream.adaptive >= 2.0.12)
+[add] add route to update api keys
+ plugin://plugin.video.youtube/api/update/?enable=true&client_id=&client_secret=&api_key=
+[fix/upd] refactor subtitles ** subtitles setting will be reset
+[fix/upd] add My Subscriptions (Filtered) to dual login requirements
+[fix/upd] only show Browse Channels when logged in
+[upd] Greek strings [Twilight0]
+[upd] Polish strings [Etharr]
+
+5.4.2
+[fix/upd] My Subscriptions
+
+5.4.1
+[fix/upd] dash working for vevo/etc
+[upd] rework of auto subtitles
+[fix] leia nightly login issues
+[fix] 403 error on 'My Channel'/uploaded videos
+
+5.4.0
+[upd] Greek strings [Twilight0]
+[upd] Polish strings [Etharr]
+[upd] Finnish strings [teemue]
+[upd] Spanish strings [roliverosc]
+[fix/upd] resolve "Error Contents: 'q'" error [horstepipe]
+[fix/upd] resolve Play All/Play from here not starting playback
+[fix/upd] resolve playlists starting on second item
+[fix/upd] allow dash in quality choices
+[fix/upd] set content to files for menus, resolves mouse/scrolling
+[fix/upd] fix cipher
+[fix/upd] increase search history limit to 200
+[fix/upd] storage db
+[add] Safe Search to Settings -> General
+[add] Thumbnail size to Settings -> General
+[add] Auto-play suggested [mehdilauters]
+[add] Automatic subtitles [Uukrull]
+[add] My Subscriptions (Filtered) - whitelist/blacklist version of My Subscriptions [chhe]
+[add] module extension point:
+ add-ons can now add plugin.video.youtube dependency and resolve youtube video id's or make v3 api requests using the youtube plugin,
+ """
+
+ """
+ """
+ import youtube_resolver
+ streams = youtube_resolver.resolve()
+ import youtube_requests
+ videos = youtube_requests.get_videos([, , ])
+ """
+
+5.3.11
+[fix/upd] replace custom simple_requests with script.module.requests to resolve ssl and cross-platform issues
+[add] 'Reset access manager' added to Maintenance section, sign out process(available when logged out) to clean up tokens in settings.xml
+[upd] set default for SSL certificate verification to 'true'
+
+5.3.10
+[fix/upd] resolve 'No video streams found' for age-gated content and other minor.
+[fix/upd] unescaping HTML entities in subtitles [mdmdmdmdmd]
+[upd] Polish strings [Etharr]
+
+5.3.6-9
+[fix/upd] resolve 'No video streams found'
+[fix/upd] SPMC dash support guidosarducci
+[upd] Italian strings [iz8mbw]
+[upd] Spanish strings [roliverosc]
+[upd] Dutch strings [Sjord]
+[fix/upd] Frodo backwards compat. setArt [lulol]
+
+5.3.5
+[add] MPEG-DASH support for Kodi 17 w/ inputstream.adaptive Add-on
+[add] optional History and Watch Later custom playlist to Settings -> Folders, or (My)Playlists context menu to set/remove
+[add] Maintenance section to Settings
+[add] 'Subtitle language(s) to download' selection to Settings -> General
+[add] 'Force SSL Certificate verification' to Settings -> Advanced
+[upd] API key set switching from Settings -> API (this will log you out)
+[upd] Dual login only required if My Subscriptions folder is enabled at sign-in
+[upd] setting content type from episodes, now videos
+[del] override view options
+[upd] Norwegian strings [torstehu]
+[upd] Greek strings [twilight0]
+[upd] Portuguese strings [Wanilton]
+[upd] Dutch strings [flemlion]
+[fix/upd] API tweaking and various other updates
+
+5.2.2 (2016-05-28)
+[upd] Insert old API-Keys from Bromix because of Quota-Exceed-Error
+[add] Dutch strings (thanks to Guilouz)
+[upd] French strings (thanks to royreinders)
+[upd] Greek strings (thanks to Twilight0)
+
+5.2.1 (2016-05-12)
+[add] Additional "Recommend for You" section (thanks to anxdpanic)
+
+5.2.0 (2016-05-11)
+[upd] APi-Changer - First login delete old Credentials - New Login Required! Sorry :)
+
+5.1.20.7 (2016-05-03)
+Workaround for the Quota Exceed-Error.
+[add] API-Changer for a Pool of 6 API-Keys
+[add] Auto-Reauthenticate with Pool-Key on "Quota Exceed" error
+[add] "Use own API"-Button
+[hint] The Message "Invalid Credentials" after Update could be fixed with deleting the Userdata-Settings.xml
+[add] add Recommendations to main listing when logged in [anxdpanic]
+
+5.1.20.6 (2016-04-03)
+[add] Greek Translation from twilight0
+[upd] Fixed italian translation from DjDiabolik
+
+5.1.20.5 (2016-03-20)
+[upd] Ignore if '.apps.googleusercontent.com' entered in API Id string in add-on settings
+
+5.1.20.4 (2016-03-05)
+[add] API Key in add-on settings
+[upd] All string.po for new API Key functionality. New entries in language string.po files not translated from English.
+
+5.1.20.3 (2016-03-04)
+[fix] All Key changed with YouTube TV
+
+5.1.20.2 (2016-03-04)
+[fix] Live streams itag 91 patch
+[add] Kodi 17 Krypton support. Patch by Uukrul
+
+5.1.20 (2016-02-25)
+[fix] Final fix for APIs
+
+5.1.16 (2015-12-24)
+[fix] reverted search order by date
+
+5.1.15 (2015-12-22)
+[fix] signature calculation
+
+5.1.14 (2015-12-22)
+[upd] default search order by date (newest first)
+[fix] VEVO signature calculation
+
+5.1.13 (2015-12-20)
+[fix] frodo...DIE FRODO DIE !!!
+[fix] some cleanup for Jarvis
+
+5.1.12 (2015-11-29)
+[fix] sort issues with Jarvis (thx 2 guidosarducci)
+
+5.1.11 (2015-11-24)
+[fix] signature calculation (e.g. VEVO)
+
+5.1.10 (2015-11-13)
+[fix] signature calculation (e.g. VEVO)
+
+5.1.9 (2015-09-21)
+[add] Hebrew (thx 2 smoky-jr)
+[upd] don't set default season and episodes (1x1)
+[upd] another try to optimize the quota problem. Move all searches to the individual keys instead of one global
+[fix] playback issues (skip discontinued video/format by YouTube)
+
+5.1.8 (2015-08-23)
+[add] Bulgarian (thx 2 NEOhidra)
+[upd] new quota shaping
+[fix] personal playlists (Watch Later, Liked Video, ...) should work again
+[fix] playback of VEVO videos - some videos still using discontinued ITAG13
+[fix] show login, when an endpoint is called, which requires permissions.
+
+5.1.7 (2015-07-15)
+ADD: quota optimization via separate key for none-token depended API calls
+UPD: new login semantic to sign out if someone upgrades to a newer version of KODI
+FIX: 'Next Page (X)' item was added to the current playlist for playback
+
+5.1.6 (2015-06-14)
+ADD: Chinese (Traditional) (thx 2 beddfaf916)
+ADD: Czech (thx 2 tomaswcz)
+ADD: Romanian (thx 2 Danny3)
+UPD: test some new pagination for 'My Subscriptions'
+UPD: Polish (thx 2 Etharr)
+FIX: show notification again for unsupported rtmpe streams
+FIX: unicode/utf-8 trouble in kodion
+
+5.1.5 (2015-05-29)
+UPD: remove deprecation warning for Isengard
+FIX: Issue 7163 (Missing pagination for subscriptions - YouTube APIv3 bug)
+
+5.1.4 (2015-05-26)
+ADD: Frodo support (only if you install via zip or bromix repo)
+UPD: new API-KEY - thanks to the guy for hijacking the key for trailer searches
+UPD: Russian (thx 2 BytEvil)
+FIX: cache wasn't working correctly without login
+
+5.1.3 (2015-05-16)
+UPD: code cleaning
+FIX: minor fixes
+
+5.1.2 (2015-05-15)
+ADD: ask for video quality (optional)
+UPD: code cleaning
+UPD: Russian (thx 2 BytEvil)
+UPD: kodion
+FIX: add 'Play all' for playlist (again)
+
+5.1.1 (2015-05-10)
+ADD: 'More...' in context menu to provide more items
+ADD: show deprecation warning of old plugin calls starting with Isengard
+ADD: EndPoint: 'plugin://plugin.video.youtube/search/?q=[URL_ENC_TEXT]'
+ADD: API Key for each major version of KODI
+UPD: Ukrainian (thx 2 Dukobpa3)
+UPD: Russian (thx 2 BytEvil)
+UPD: new second fanart
+UPD: reorganized context menu
+UPD: improved logging (debug only)
+UPD: Improved error handling
+FIX: refresh after rating a video (own playlist only)
+FIX: add 'refresh' again for 'My subscriptions'
+DEL: removed old v2 API
+
+5.1.0 (2015-04-22)
+ADD: Double login to support 'My subscriptions' via YouTube TV API
+ADD: 'More Links from the description' - extracts further links from the description
+ADD: Korean (thx 2 piodio)
+UPD: removed old implementation of 'My Subscriptions'
+UPD: new fanart and icon
+UPD: changed credentials
+UPD: minimal quota-optimization
+UPD: French (thx 2 eauland)
+UPD: YouTube relevant description links - improved extraction and resolving of video/playlist urls
+UPD: YouTube relevant description links - improved extraction and resolving of user/channel urls
+UPD: YouTube relevant description links - improved performance resolving urls with caching
+UPD: regex optimizations for season and expisode extraction
+FIX: support fanart of channel in new implementation of 'My Subscriptions'
+FIX: YouTube relevant description links - script error while some server return garbage for a location
+FIX: script error while resolving url fails
+FIX: script error while adding video to a playlist
+FIX: show seconds (runtime) in Gotham
+
+5.0.9 (2015-03-14)
+ADD: 'duration' optimized for KODI 15.X (Isengard)
+ADD: EndPoint for listing the videos of a playlist: "plugin://plugin.video.youtube/playlist//"
+UPD: optimized client-/server transfer (use gzip)
+
+5.0.8 (2015-03-05)
+UPD: Polish (thx 2 Etharr)
+UPD: Russian (thx 2 BytEvil)
+FIX: improved playback
+
+5.0.7 (2015-02-27)
+ADD: 'Refresh' in 'My Subscriptions' and all my playlists
+ADD: rename search history item
+UPD: French (thx 2 Trilip)
+UPD: Ukrainian (thx 2 posledov)
+UPD: Spanish (thx 2 PatOso)
+FIX: possible crash on not well formed language ids
+FIX: optimized logging
+FIX: unicode trouble
+
+5.0.6 (2015-02-17)
+ADD: setting for hiding the channel name in the description
+ADD: Ukrainian (thx 2 posledov)
+UPD: show 'Watch History' (default)
+UPD: Russian (thx 2 BytEvil)
+UPD: improved support for live streams
+UPD: improved stream selection based on container
+FIX: 'What to watch' => 'Popular right now'
+FIX: don't crash while trying to play rtmpe
+FIX: corrected ITAG 18 in 360p instead of 260p
+
+
+5.0.5 (2015-02-01)
+ADD: clear search history items
+UPD: replace context menu not everywhere
+UPD: dropped dependency of 'requests'-module because of performance issues
+FIX: Add playing video to the 'Watch History'
+FIX: maybe a fix for a problem (again!) on unix systems while using python 2.7.9 + certificate verification
+FIX: removed pagination for "Related Videos" - the fix before produced some nasty side-effects
+FIX: Vevo signature
+
+5.0.4 (2015-01-15)
+ADD: 'Live' in search
+ADD: 'Play with...' for supporting external/alternative player
+ADD: live events (needed some tests and feedback)
+ADD: support for user names instead of channel ids
+UPD: set XBMC/KODI to at least Gotham 13.2
+UPD: Setup-Wizard views based on content type (KODION update)
+FIX: Playlist should work again
+FIX: Pagination in APIv2
+FIX: settings for hiding 'Live' menu
+DEL: support for Frodo
+
+5.0.3 (2015-01-08)
+ADD: 'Disliked Videos'
+ADD: 240p, 360p and 480p
+UPD: adjustment in KODION classes (maybe causing problems on MAC OS X 10.10.X + Python 2.6)
+UPD: Russian (thx 2 BytEvil)
+UPD: Spanish (thx 2 PatOso)
+UPD: Polish (thx 2 D.K.)
+FIX: German translation
+FIX: some Frodo updates
+
+5.0.2 (2015-01-01)
+ADD: Support for shared playlists via Yatse
+ADD: 'Play from here' for playlists
+ADD: 'Queue Video'
+FIX: German translation
+FIX: Portuguese (Brazil) (thx 2 ASH_Macedo)
+
+5.0.1 (2014-12-31)
+ADD: 'Play all' (default, reverse, shuffle)
+ADD: Italian (thx 2 peppe_sr)
+ADD: Portuguese (Brazil) (thx 2 ASH_Macedo)
+ADD: Hungarian (thx 2 gyeben)
+ADD: Portuguese (thx 2 enen92)
+ADD: Polish (thx 2 D.K.)
+ADD: Russian (thx 2 BytEvil)
+ADD: Spanish (thx 2 PatOso)
+ADD: French (thx 2 roondar)
+UPD: support for '1080XF' and 'Xperience1080'
+FIX: some live streams should work
+FIX: update meta data for video played via ext. url
+FIX: remove video from 'Watch Later' playlist
+REV: reverted to requests
+
+5.0.0 (2014-12-27)
+DEL: removed beta
+ADD: new rating system - like/dislike/remove
+ADD: show confirmation before remove a video or deleting a playlist
+ADD: rename your playlists
+ADD: setup default view modes (default and videos)
+ADD: setup correct language and region for YouTube
+ADD: support for old YouTube url calls (plugin://plugin.video.youtube/?action=play_video&videoid=[ID])
+UPD: new icons
+UPD: reorganized context menu
+UPD: some minor tests
+UPD: moved 'Watch Later' up in context menu
+FIX: rename playlist
+FIX: show newest videos first (uploads of channel)
+FIX: show fanarts in 'Watch Later' and 'Liked Videos'
+
+1.0.0~alpha29 (2014-12-14)
+UPD: new login mechanism (removed the old one)
+ADD: translation fr-FR (thanks to roondar)
+ADD: manage playlists - create, remove and add videos to a selected playlists
+FIX: support cyrillic letters
+
+1.0.0~alpha28 (2014-12-07)
+ADD: subscribe to channel (from videos and playlist)
+UPD: rework of handling context menu
+FIX: remove next page for related videos (because APIv3 is broken)
+
+1.0.0~alpha27 (2014-12-01)
+UPD: performance improved for auto-removing videos from 'Watch Later' list
+FIX: error while navigating to the next page
+
+1.0.0~alpha26 (2014-11-30)
+ADD: hide all entries (except search) via settings in the root menu
+ADD: missing pagination for 'My Subscriptions'
+FIX: next page is working again (Watch Later)
+UPD: disabled language (for now) Kodi isn't providing reliable language IDs
+
+1.0.0~alpha25 (2014-11-29)
+UPD: requests with language/region
+UPD: new icons
+ADD: Auto-Remove from 'Watch Later' list
+ADD: 'Related Videos'
+UPD: show channel name in the description
+FIX: disable verification warnings
+
+1.0.0~alpha24 (2014-11-27)
+ADD: 'Browse Channels'
+FIX: support for skins calling '.*/extrafanart/'
+
+1.0.0~alpha23 (2014-11-26)
+ADD: 'What to watch'
+FIX: 'My subscriptions' switched to version APIv2.1 (Google) DAMN YOU!!!
+
+1.0.0~alpha22 (2014-11-25)
+ADD: sorting
+FIX: crash when calling 'My subscriptions'
+FIX: signature calculation
+
+1.0.0~alpha21 (2014-11-24)
+CHG: method for playing a video changed to a more query like uri
+FIX: crash under android systems. Regular Expressions work a little different :)
+
+1.0.0~alpha20 (2014-11-23)
+FIX: Git merge with master
+
+1.0.0~alpha19 (2014-11-23)
+UPD: complete rewrite
+UPD: switch to kodion
+
+1.0.0~alpha18 (2014-08-31)
+- ADD: Support for ETag - could improve performance
+- ADD: remove item of search history
+- FIX: #22 calculation of duration
+- FIX: #28 display 'general' instead of 'like' in settings
+
+1.0.0~alpha17 (2014-08-10)
+- ADD: 'Go to CHANNEL' of a selected video
+- ADD: Support for 'Subscribe' and 'Unsubscribe' of channels
+- ADD: Full support for 'Like'
+- ADD: Remove own playlist via context menu
+- ADD: Show/Hide 'Browse Channels' via settings
+- FIX: Using only thumbnails from API v3 - 'My Subscriptions' is using v2 and returning different thumbnails
+- FIX: Displaying false channel in video description
+- FIX: Don't update search history before showing the search result
+
+1.0.0~alpha16 (2014-08-08)
+- FIX: provide 'Next Page' under 'My Subscriptions' if there are more results
+- ADD: Hide and show menu items via settings
+- ADD: Search history (set the size via settings from 0-50 items)
+
+1.0.0~alpha15 (2014-08-04)
+- FIX: moved (only) for the subscribtions to V2 to see new uploaded videos
+
+1.0.0~alpha14 (2014-08-03)
+- ADD: 'Remove' via context menu for playlists
+- ADD: 'Watch Later' via context menu to add a video to the 'Watch Later' playlist
+- ADD: Automatic remove from the 'Watch Later' playlists (optional via settings - default = true)
+- ADD: Support for history - after playback the video should be added to the history. Not working correct.
+- ADD: Fanart for channels. Only if you select a channel directly.
+- optimized some of the addon code
+
+1.0.0~alpha13 (2014-08-02)
+- FIX: improved token and login validation
+
+1.0.0~alpha12 (2014-08-01)
+- ADD: Show 'Published on' and 'Channel' in the description of a video (can be disabled via setting)
+- ADD: support for 3D videos (can be disabled via setting)
+- Accelerated resolving of video URLs (almost 2x as fast)
+
+1.0.0~alpha11 (2014-07-30)
+- FIX: added a fallback for videos that require a login (works very fast?!?!)
+- FIX: if username or password is missing reset the whole token logic
+
+1.0.0~alpha10 (2014-07-29)
+- FIX: improved performance on decoding signatures for some videos
+- ADD: support for custom-created playlists
+- FIX: sort own subscriptions
+- ADD: enable/disable video, channel and/or playlist search
+
+1.0.0~alpha9 (2014-07-28)
+- FIX: removed debug
+
+1.0.0~alpha8 (2014-07-28)
+- ADD: login tests
+
+1.0.0~alpha7 (2014-07-27)
+- FIX: added support from freemake.com to decode signatures of some videos
+
+1.0.0~alpha6 (2014-07-27)
+- added support of playlists of a channel (first page only)
+- optimized some major routines for easier support of all youtube's content
+
+1.0.0~alpha5 (2014-07-27)
+- version bump for tests
+
+1.0.0~alpha4 (2014-07-26)
+- added runtime for each video (crazy hack)
+- disabled debug
+
+1.0.0~alpha3 (2014-07-26)
+- little fixes regarding youtube channels
+
+1.0.0~alpha2 (2014-07-26)
+- added youtube channels and search
+- added playback
+
+1.0.0~alpha (2014-07-26)
+- initial version for tests
diff --git a/plugin.video.youtube/fanart.jpg b/plugin.video.youtube/fanart.jpg
deleted file mode 100644
index 2d05a9be52..0000000000
Binary files a/plugin.video.youtube/fanart.jpg and /dev/null differ
diff --git a/plugin.video.youtube/resources/language/resource.language.af_za/strings.po b/plugin.video.youtube/resources/language/resource.language.af_za/strings.po
index 21dc74fc06..934f465db4 100644
--- a/plugin.video.youtube/resources/language/resource.language.af_za/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.af_za/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.am_et/strings.po b/plugin.video.youtube/resources/language/resource.language.am_et/strings.po
index 2071e5eedf..bed11ebe0f 100644
--- a/plugin.video.youtube/resources/language/resource.language.am_et/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.am_et/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.ar_sa/strings.po b/plugin.video.youtube/resources/language/resource.language.ar_sa/strings.po
index 91e4b709fc..9ef08c9e2c 100644
--- a/plugin.video.youtube/resources/language/resource.language.ar_sa/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ar_sa/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.ast_es/strings.po b/plugin.video.youtube/resources/language/resource.language.ast_es/strings.po
index 242f04837d..4f19e75087 100644
--- a/plugin.video.youtube/resources/language/resource.language.ast_es/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ast_es/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.az_az/strings.po b/plugin.video.youtube/resources/language/resource.language.az_az/strings.po
index 9a1fec6f9a..09ea39261b 100644
--- a/plugin.video.youtube/resources/language/resource.language.az_az/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.az_az/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.be_by/strings.po b/plugin.video.youtube/resources/language/resource.language.be_by/strings.po
index e94105c13a..98c0859cae 100644
--- a/plugin.video.youtube/resources/language/resource.language.be_by/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.be_by/strings.po
@@ -62,7 +62,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -74,15 +74,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,7 +993,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1049,7 +1053,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1177,7 +1181,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1185,11 +1189,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1197,11 +1201,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1235,3 +1239,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.bg_bg/strings.po b/plugin.video.youtube/resources/language/resource.language.bg_bg/strings.po
index 02df27a59b..05391323af 100644
--- a/plugin.video.youtube/resources/language/resource.language.bg_bg/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.bg_bg/strings.po
@@ -60,8 +60,8 @@ msgid "Always ask for the video quality"
msgstr "Запитване за качеството на видеото преди възпроизвеждане"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Качество на видеото"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -72,16 +72,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -95,6 +95,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "Разреши 3D"
@@ -986,7 +990,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1046,7 +1050,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1174,7 +1178,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1182,11 +1186,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1194,11 +1198,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1233,6 +1237,130 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Качество на видеото"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "Любими"
diff --git a/plugin.video.youtube/resources/language/resource.language.bs_ba/strings.po b/plugin.video.youtube/resources/language/resource.language.bs_ba/strings.po
index 799172d7ed..c4053acaa3 100644
--- a/plugin.video.youtube/resources/language/resource.language.bs_ba/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.bs_ba/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.ca_es/strings.po b/plugin.video.youtube/resources/language/resource.language.ca_es/strings.po
index 0e97028a78..f5a5af63e6 100644
--- a/plugin.video.youtube/resources/language/resource.language.ca_es/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ca_es/strings.po
@@ -7,14 +7,15 @@ msgstr ""
"Project-Id-Version: XBMC-Addons\n"
"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
+"PO-Revision-Date: 2023-06-24 16:42+0000\n"
+"Last-Translator: Christian Gade \n"
+"Language-Team: Catalan (Spain) \n"
"Language: ca_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 4.18\n"
msgctxt "Addon Summary"
msgid "Plugin for YouTube"
@@ -61,7 +62,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +74,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -185,7 +190,7 @@ msgstr ""
msgctxt "#30102"
msgid "Search"
-msgstr ""
+msgstr "Cerca"
msgctxt "#30103"
msgid "Library"
@@ -289,7 +294,7 @@ msgstr ""
# empty strings from id 30206 to 30499
msgctxt "#30500"
msgid "Channels"
-msgstr ""
+msgstr "Canals"
msgctxt "#30501"
msgid "Playlists"
@@ -597,7 +602,7 @@ msgstr ""
msgctxt "#30577"
msgid "Settings"
-msgstr ""
+msgstr "Paràmetres"
msgctxt "#30578"
msgid "Force SSL certificate verification"
@@ -988,7 +993,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1053,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1181,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1189,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1201,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1239,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.cs_cz/strings.po b/plugin.video.youtube/resources/language/resource.language.cs_cz/strings.po
index 26ad7f3abf..ca819c284f 100644
--- a/plugin.video.youtube/resources/language/resource.language.cs_cz/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.cs_cz/strings.po
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Vždy se zeptat na kvalitu"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Kvalita videa"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Živě / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Obnovit bod"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Použít historii pořehrávání"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Použít pro stream Živě"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 2.0.12 je vyžadován pro stream Živě"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Výchozí nastavení přizpůsobení WEBM (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Proxy je vyžadován pro MPEG-DASH [CR]> 1080p a HDR vyžaduje InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Omezení do 30 sn/sek"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Nahrát"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptivní (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptivní (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1236,6 +1240,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Kvalita videa"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Použít historii pořehrávání"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 2.0.12 je vyžadován pro stream Živě"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Omezení do 30 sn/sek"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptivní (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptivní (WEBM/VP9)"
+
# Kodion Common
# empty strings from id 30039 to 30099
#~ msgctxt "#30100"
diff --git a/plugin.video.youtube/resources/language/resource.language.cy_gb/strings.po b/plugin.video.youtube/resources/language/resource.language.cy_gb/strings.po
index 026cf80311..809c2f92ec 100644
--- a/plugin.video.youtube/resources/language/resource.language.cy_gb/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.cy_gb/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.da_dk/strings.po b/plugin.video.youtube/resources/language/resource.language.da_dk/strings.po
index aa7f70676f..2e45c218b5 100644
--- a/plugin.video.youtube/resources/language/resource.language.da_dk/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.da_dk/strings.po
@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: XBMC-Addons\n"
"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
-"PO-Revision-Date: 2022-12-09 20:12+0000\n"
+"PO-Revision-Date: 2023-05-06 00:35+0000\n"
"Last-Translator: Christian Gade \n"
"Language-Team: Danish \n"
"Language: da_dk\n"
@@ -15,7 +15,7 @@ msgstr ""
"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.14.2\n"
+"X-Generator: Weblate 4.15.2\n"
msgctxt "Addon Summary"
msgid "Plugin for YouTube"
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Spørg altid efter videokvaliteten"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Videokvalitet"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4K)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8K)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p direkte / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Nulstil genoptagelsesposition"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Brug afspilningshistorik (set, sporing af genoptagelse)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Anvendes til livestreams"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 2.0.12 kræves til livestreams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Sæt standard til WEBM-tilpasningssæt (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Proxy er påkrævet for mpeg-dash vods (se HTTP-server)[CR]> 1080p og HDR kræver InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Begræns til 30 fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Uploads"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptiv (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptiv (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1236,6 +1240,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Skjul korte videoer (1 minut eller derunder)"
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr "Brug alternative klientoplysninger"
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr "Alternativ #1"
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr "Alternativ #2"
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Videokvalitet"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4K)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8K)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Brug afspilningshistorik (set, sporing af genoptagelse)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 2.0.12 kræves til livestreams"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Begræns til 30 fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptiv (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptiv (WEBM/VP9)"
+
#~ msgctxt "#30900"
#~ msgid "Subscriptions groups"
#~ msgstr "Abonnementsgrupper"
diff --git a/plugin.video.youtube/resources/language/resource.language.de_de/strings.po b/plugin.video.youtube/resources/language/resource.language.de_de/strings.po
index dddd56f8d5..5bb81f7b2e 100644
--- a/plugin.video.youtube/resources/language/resource.language.de_de/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.de_de/strings.po
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Immer nach der Videoqualität fragen"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Videoqualität"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Live / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Wiedergabepunkt zurücksetzen"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Wiedergabeverlauf verwenden (gesehen, ab letzter Position wiedergeben)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Für Live-Streams verwenden"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "Für Live-Streams wird InputStream Adaptive >= 2.0.12 benötigt"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Standardmäßig WEBM-Anpassungsset verwenden (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Für MPEG-DASH-VODs wird ein Proxy benötigt (siehe HTTP-Server)[CR]> 1080p und HDR benötigt InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Begrenzen auf 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Uploads"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptiv (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptiv (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1236,6 +1240,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Kurze Video ausblenden (1 Minute oder kürzer)"
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Videoqualität"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Wiedergabeverlauf verwenden (gesehen, ab letzter Position wiedergeben)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "Für Live-Streams wird InputStream Adaptive >= 2.0.12 benötigt"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Begrenzen auf 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptiv (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptiv (WEBM/VP9)"
+
#~ msgctxt "#30900"
#~ msgid "Subscriptions groups"
#~ msgstr "Abo-Gruppen"
diff --git a/plugin.video.youtube/resources/language/resource.language.el_gr/strings.po b/plugin.video.youtube/resources/language/resource.language.el_gr/strings.po
index 9500e454d7..69687e40fb 100644
--- a/plugin.video.youtube/resources/language/resource.language.el_gr/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.el_gr/strings.po
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Πάντα ερώτηση για την ποιότητα του βίντεο"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Ποιότητα βίντεο"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (ΥΕ)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (ΥΕ)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Ζωντανά / 720p (ΥΕ)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Επαναφορά σημείου συνέχισης"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Κάνε χρήση ιστορικού (προβληθέντα, συνέχιση παρακολούθησης)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Κάνε χρήση για ζωντανές ροές"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "Απαιτείται InputStream Adaptive >= 2.0.12 για τις ζωντανές ροές"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Εξ ορισμού σε σετ προσαρμογής WEBM (4Κ)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Απαιτείται μεσολαβητής για ροές κατ'απαίτηση mpeg-dash (βλ. Μεσολαβητής HTTP)[CR]Τα > 1080p και HDR απαιτούν το InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Περιορισμός στα 30κ/δ"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (ΥΕ)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Απεσταλμένα"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Προσαρμοζόμενη (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Προσαρμοζόμενη (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1236,6 +1240,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Ποιότητα βίντεο"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (ΥΕ)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Κάνε χρήση ιστορικού (προβληθέντα, συνέχιση παρακολούθησης)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "Απαιτείται InputStream Adaptive >= 2.0.12 για τις ζωντανές ροές"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Περιορισμός στα 30κ/δ"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (ΥΕ)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Προσαρμοζόμενη (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Προσαρμοζόμενη (WEBM/VP9)"
+
# Kodion Common
# empty strings from id 30037 to 30099
#~ msgctxt "#30100"
diff --git a/plugin.video.youtube/resources/language/resource.language.en_au/strings.po b/plugin.video.youtube/resources/language/resource.language.en_au/strings.po
index 637ec19148..fe488c862a 100644
--- a/plugin.video.youtube/resources/language/resource.language.en_au/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.en_au/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,7 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
-# empty strings 30019
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr ""
@@ -988,7 +991,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1051,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1179,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1187,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1199,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1237,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.en_gb/strings.po b/plugin.video.youtube/resources/language/resource.language.en_gb/strings.po
index 4214e50687..6856bd1094 100644
--- a/plugin.video.youtube/resources/language/resource.language.en_gb/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.en_gb/strings.po
@@ -65,7 +65,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -77,15 +77,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -100,7 +100,9 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
-# empty strings 30019
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
msgctxt "#30020"
msgid "Allow 3D"
@@ -996,7 +998,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1056,7 +1058,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1184,7 +1186,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1192,11 +1194,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1204,11 +1206,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1242,3 +1244,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.en_nz/strings.po b/plugin.video.youtube/resources/language/resource.language.en_nz/strings.po
index 0ab589df6a..a29883cd8c 100644
--- a/plugin.video.youtube/resources/language/resource.language.en_nz/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.en_nz/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,7 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
-# empty strings 30019
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr ""
@@ -988,7 +991,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1051,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1179,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1187,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1199,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1237,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.en_us/strings.po b/plugin.video.youtube/resources/language/resource.language.en_us/strings.po
index 43053c5073..3ad4c774e0 100644
--- a/plugin.video.youtube/resources/language/resource.language.en_us/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.en_us/strings.po
@@ -62,7 +62,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -74,15 +74,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -97,7 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
-# empty strings 30019
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr ""
@@ -989,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1049,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1177,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1185,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1197,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1235,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.eo/strings.po b/plugin.video.youtube/resources/language/resource.language.eo/strings.po
index d9660b9012..c31ae9a47a 100644
--- a/plugin.video.youtube/resources/language/resource.language.eo/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.eo/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.es_ar/strings.po b/plugin.video.youtube/resources/language/resource.language.es_ar/strings.po
index 2509bbe94b..27d3e23abc 100644
--- a/plugin.video.youtube/resources/language/resource.language.es_ar/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.es_ar/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.es_es/strings.po b/plugin.video.youtube/resources/language/resource.language.es_es/strings.po
index 39f952e157..f646160d8e 100644
--- a/plugin.video.youtube/resources/language/resource.language.es_es/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.es_es/strings.po
@@ -5,9 +5,9 @@
msgid ""
msgstr ""
"Project-Id-Version: XBMC-Addons\n"
-"Report-Msgid-Bugs-To: translations@kodi.tv\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
-"PO-Revision-Date: 2023-02-17 18:08+0000\n"
+"PO-Revision-Date: 2023-06-24 16:42+0000\n"
"Last-Translator: José Antonio Alvarado \n"
"Language-Team: Spanish (Spain) \n"
"Language: es_es\n"
@@ -15,7 +15,7 @@ msgstr ""
"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.15.2\n"
+"X-Generator: Weblate 4.18\n"
msgctxt "Addon Summary"
msgid "Plugin for YouTube"
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Preguntar siempre por calidad de vídeo"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Calidad de vídeo"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p En Directo / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -598,7 +602,7 @@ msgstr "¡Vaya! Algo ha fallado"
msgctxt "#30577"
msgid "Settings"
-msgstr "Configuración"
+msgstr "Ajustes"
msgctxt "#30578"
msgid "Force SSL certificate verification"
@@ -718,7 +722,7 @@ msgstr "Búsqueda Rápida (Incógnito)"
msgctxt "#30607"
msgid "Audio only"
-msgstr "Reproducir solo audio"
+msgstr "Sólo audio"
msgctxt "#30608"
msgid "Allow developer keys"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Restablecer punto de reanudación"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Usar historial de reproducción (visto, seguimiento de reanudación)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Usar para streams en directo"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "Para emisiones en directo es necesario InputStream Adaptive 2.0.12 o superior"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1122,7 +1126,7 @@ msgstr "Sin título"
msgctxt "#30708"
msgid "Play audio only"
-msgstr "Reproducir solo audio"
+msgstr "Reproducir sólo audio"
msgctxt "#30709"
msgid "Failed to retrieve Watch Later playlist id. To increase the chances of retrieval add 8-10 videos to Watch Later via the web/app and retry."
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Establecer por defecto WEBM adaptativo (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Para VODs mpeg-dash (ver Servidor HTTP)[CR]> 1080p y HDR requieren InputStream Adaptive 2.3.14 o superior"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Limitar a 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Subidas"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptativo (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptativo (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1236,6 +1240,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Ocultar vídeos cortos (1 minuto o menos)"
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr "Utilizar datos alternativos del cliente"
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr "Alternativa #1"
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr "Alternativa #2"
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Calidad de vídeo"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Usar historial de reproducción (visto, seguimiento de reanudación)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "Para emisiones en directo es necesario InputStream Adaptive 2.0.12 o superior"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Limitar a 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptativo (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptativo (WEBM/VP9)"
+
#~ msgctxt "#30900"
#~ msgid "Subscriptions groups"
#~ msgstr "Grupos de suscripciones"
diff --git a/plugin.video.youtube/resources/language/resource.language.es_mx/strings.po b/plugin.video.youtube/resources/language/resource.language.es_mx/strings.po
index ecd0601c33..fdecaa638d 100644
--- a/plugin.video.youtube/resources/language/resource.language.es_mx/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.es_mx/strings.po
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Preguntar siempre la calidad de video"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Calidad de video"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p En Vivo / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Restablecer punto de reanudación de reproducción"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Usar historial de reproducción (visto, seguimiento de reanudación)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Usar para transmisiones en vivo"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "Para emisiones en vivo es necesario InputStream Adaptive 2.0.12 o superior"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Predeterminar al conjunton de adaptación WebM (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Se requiere un proxy para mpeg-dash VODs (ver HTTP server)[CR]> 1080p y HDR requieren InpuStreamAdaptative >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Limitar a 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Subidas"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1236,6 +1240,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Calidad de video"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Usar historial de reproducción (visto, seguimiento de reanudación)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "Para emisiones en vivo es necesario InputStream Adaptive 2.0.12 o superior"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Limitar a 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptive (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptive (WEBM/VP9)"
+
# Kodion Common
# empty strings from id 30039 to 30099
#~ msgctxt "#30100"
diff --git a/plugin.video.youtube/resources/language/resource.language.et_ee/strings.po b/plugin.video.youtube/resources/language/resource.language.et_ee/strings.po
index a255ed88a7..39a439c6b3 100644
--- a/plugin.video.youtube/resources/language/resource.language.et_ee/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.et_ee/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.eu_es/strings.po b/plugin.video.youtube/resources/language/resource.language.eu_es/strings.po
index 4f3dfb57e2..4a36884f8b 100644
--- a/plugin.video.youtube/resources/language/resource.language.eu_es/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.eu_es/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.fa_af/strings.po b/plugin.video.youtube/resources/language/resource.language.fa_af/strings.po
index e9c51de6ff..0f06ef16f2 100644
--- a/plugin.video.youtube/resources/language/resource.language.fa_af/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.fa_af/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.fa_ir/strings.po b/plugin.video.youtube/resources/language/resource.language.fa_ir/strings.po
index e33540cf22..3c2ae297b9 100644
--- a/plugin.video.youtube/resources/language/resource.language.fa_ir/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.fa_ir/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.fi_fi/strings.po b/plugin.video.youtube/resources/language/resource.language.fi_fi/strings.po
index 5236bd05b1..88d85f46c3 100644
--- a/plugin.video.youtube/resources/language/resource.language.fi_fi/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.fi_fi/strings.po
@@ -60,8 +60,8 @@ msgid "Always ask for the video quality"
msgstr "Kysy aina videon laatu"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Videon laatu"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -72,16 +72,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4K)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8K)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -95,6 +95,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p suora/720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "Salli 3D"
@@ -984,8 +988,8 @@ msgid "Reset resume point"
msgstr "Unohda katselutilanne"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Käytä toistohistoriaa (katsotut, toiston jatko)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1044,8 +1048,8 @@ msgid "Use for live streams"
msgstr "Käytä livelähetyksille"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "Livelähetykset edellyttävät vähintään InputStream Adaptive -versiota 2.0.12."
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1172,32 +1176,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Käytä oletusarvoisesti WEBM-mukautuvuussarjaa (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "MPEG-DASH VOD -videot edellyttävät välityspalvelimen käyttöä (katso HTTP-palvelin).[CR]1080p ja sitä suuremmat tarkkudet sekä HDR tarvitsevat vähintään InputStream Adaptive -versiota 2.3.14."
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Rajoita 30 kuvaan sekunnissa (fps)"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Lähetykset"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Mukautuva (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Mukautuva (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1231,6 +1235,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Piilota lyhyet videot (1 minuuttia tai alle)"
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Videon laatu"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4K)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8K)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Käytä toistohistoriaa (katsotut, toiston jatko)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "Livelähetykset edellyttävät vähintään InputStream Adaptive -versiota 2.0.12."
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Rajoita 30 kuvaan sekunnissa (fps)"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Mukautuva (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Mukautuva (WEBM/VP9)"
+
#~ msgctxt "#30900"
#~ msgid "Subscriptions groups"
#~ msgstr "Tilausryhmät"
diff --git a/plugin.video.youtube/resources/language/resource.language.fo_fo/strings.po b/plugin.video.youtube/resources/language/resource.language.fo_fo/strings.po
index f9138bd023..33b5a603d3 100644
--- a/plugin.video.youtube/resources/language/resource.language.fo_fo/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.fo_fo/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.fr_ca/strings.po b/plugin.video.youtube/resources/language/resource.language.fr_ca/strings.po
index e196408159..c41cee6faa 100644
--- a/plugin.video.youtube/resources/language/resource.language.fr_ca/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.fr_ca/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.fr_fr/strings.po b/plugin.video.youtube/resources/language/resource.language.fr_fr/strings.po
index b402775ffd..982e0138b1 100644
--- a/plugin.video.youtube/resources/language/resource.language.fr_fr/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.fr_fr/strings.po
@@ -5,17 +5,17 @@
msgid ""
msgstr ""
"Project-Id-Version: XBMC-Addons\n"
-"Report-Msgid-Bugs-To: translations@kodi.tv\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
-"PO-Revision-Date: 2022-12-27 12:15+0000\n"
-"Last-Translator: skypichat \n"
+"PO-Revision-Date: 2023-08-24 22:11+0000\n"
+"Last-Translator: SlashAndRoses \n"
"Language-Team: French (France) \n"
"Language: fr_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 4.15\n"
+"X-Generator: Weblate 4.18.2\n"
msgctxt "Addon Summary"
msgid "Plugin for YouTube"
@@ -60,8 +60,8 @@ msgid "Always ask for the video quality"
msgstr "Toujours demander la qualité de la vidéo"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Qualité vidéo"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -72,16 +72,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4K)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8K)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -95,6 +95,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Live / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "Autoriser la 3D"
@@ -984,8 +988,8 @@ msgid "Reset resume point"
msgstr "Réinitialiser le point de reprise de lecture"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Utiliser l'historique de lecture (vu, reprise de lecture)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1044,8 +1048,8 @@ msgid "Use for live streams"
msgstr "Utiliser pour le live"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 2.0.12 est requis pour le live"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1172,32 +1176,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Défaut mis à WEBM adaptation (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Un proxy est requis pour les vods mpeg-dash (voir serveur HTTP)[CR]> 1080p et HDR nécessitent InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Limiter à 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Téléversements"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptatif (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptatif (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1231,6 +1235,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Cacher les vidéos courtes (1 minute ou moins)"
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr "Utiliser les détails du client alternatif"
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr "Alternative #1"
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr "Alternative #2"
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Qualité vidéo"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4K)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8K)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Utiliser l'historique de lecture (vu, reprise de lecture)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 2.0.12 est requis pour le live"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Limiter à 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptatif (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptatif (WEBM/VP9)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "Favoris"
diff --git a/plugin.video.youtube/resources/language/resource.language.gl_es/strings.po b/plugin.video.youtube/resources/language/resource.language.gl_es/strings.po
index 8ab10094c4..37d113aee0 100644
--- a/plugin.video.youtube/resources/language/resource.language.gl_es/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.gl_es/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.he_il/strings.po b/plugin.video.youtube/resources/language/resource.language.he_il/strings.po
index efc596cc38..cf7fb2d857 100644
--- a/plugin.video.youtube/resources/language/resource.language.he_il/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.he_il/strings.po
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "תמיד בקש את איכות הווידאו"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "איכות וידאו"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p חי / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,7 +993,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1049,7 +1053,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1177,7 +1181,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1185,11 +1189,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1197,11 +1201,11 @@ msgid "Uploads"
msgstr "העלאות"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1235,3 +1239,127 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "איכות וידאו"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
diff --git a/plugin.video.youtube/resources/language/resource.language.hi_in/strings.po b/plugin.video.youtube/resources/language/resource.language.hi_in/strings.po
index 123f0a1597..5ac65123fc 100644
--- a/plugin.video.youtube/resources/language/resource.language.hi_in/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.hi_in/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.hr_hr/strings.po b/plugin.video.youtube/resources/language/resource.language.hr_hr/strings.po
index c57fe8e39f..7d5d613969 100644
--- a/plugin.video.youtube/resources/language/resource.language.hr_hr/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.hr_hr/strings.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: XBMC-Addons\n"
-"Report-Msgid-Bugs-To: translations@kodi.tv\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
"PO-Revision-Date: 2023-01-04 21:15+0000\n"
"Last-Translator: gogogogi \n"
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Uvijek upitaj za video kvalitetu"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Video kvaliteta"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Uživo / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Poništi vrijeme nastavka gledanja"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Koristi povijest reprodukcije (pogledano, nastavi praćenje)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Koristi za emitiranja uživo"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 2.0.12 je potreban za emitiranje uživo"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Zadano za paket WEBM prilagodbe (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Proxy je potreban za mpeg-dash video na zahtjev (vod) (pogledajte HTTP poslužitelj)[CR]> 1080p i HDR zahtijevaju InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Ograniči na 30 sl/sek"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Slanja"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Prilagodljiva (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Prilagodljiva (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1235,3 +1239,155 @@ msgstr "Uređeno"
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Sakrij kratke video snimke (1 minuta ii manje)"
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Video kvaliteta"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Koristi povijest reprodukcije (pogledano, nastavi praćenje)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 2.0.12 je potreban za emitiranje uživo"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Ograniči na 30 sl/sek"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Prilagodljiva (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Prilagodljiva (WEBM/VP9)"
diff --git a/plugin.video.youtube/resources/language/resource.language.hu_hu/strings.po b/plugin.video.youtube/resources/language/resource.language.hu_hu/strings.po
index f566b65e74..3b23d81e39 100644
--- a/plugin.video.youtube/resources/language/resource.language.hu_hu/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.hu_hu/strings.po
@@ -61,8 +61,8 @@ msgid "Always ask for the video quality"
msgstr "Mindig kérdezze meg a videó minőségét"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Videó minőség"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -73,16 +73,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Élő / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "3D engedélyezés"
@@ -987,8 +991,8 @@ msgid "Reset resume point"
msgstr "Folytatási pont visszaállítása"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Használja a lejátszási előzményeket (megnézte, folytatja a követést)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1047,8 +1051,8 @@ msgid "Use for live streams"
msgstr "Használja élő közvetítésekhez"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 2.0.12 szükséges az élő közvetítésekhez"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1175,32 +1179,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Alapértelmezés a WEBM adaptációs készlethez (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "A Proxyra van szükség az mpeg-dash vod esetén (lásd a HTTP szervert) [CR]> 1080p, és a HDR-hez pedig az InputStream Adaptive kiegészítő szükséges >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Legfeljebb 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Feltöltések"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptív (Változó MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptív (Változó WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1234,6 +1238,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Videó minőség"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Használja a lejátszási előzményeket (megnézte, folytatja a követést)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 2.0.12 szükséges az élő közvetítésekhez"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Legfeljebb 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptív (Változó MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptív (Változó WEBM/VP9)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "Kedvencek"
diff --git a/plugin.video.youtube/resources/language/resource.language.hy_am/strings.po b/plugin.video.youtube/resources/language/resource.language.hy_am/strings.po
index b6cfb3892c..5ce4452c43 100644
--- a/plugin.video.youtube/resources/language/resource.language.hy_am/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.hy_am/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.id_id/strings.po b/plugin.video.youtube/resources/language/resource.language.id_id/strings.po
index 162d1287b2..15b13057d8 100644
--- a/plugin.video.youtube/resources/language/resource.language.id_id/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.id_id/strings.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: XBMC-Addons\n"
-"Report-Msgid-Bugs-To: translations@kodi.tv\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
"PO-Revision-Date: 2022-12-27 12:15+0000\n"
"Last-Translator: Nao3Line Prez \n"
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Selalu tanyakan kualitas video"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Kualitas video"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p HD"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p FHD (2K)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p UHD (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p UHDTV (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "Siaran Live 1080p / Video 720p"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Setel ulang titik resume"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Gunakan riwayat pemutaran (ditonton, lanjutkan pelacakan)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Gunakan untuk streaming langsung"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 2.0.12 diperlukan untuk streaming langsung"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Default ke set adaptasi WEBM (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Proksi diperlukan untuk mpeg-dash vods (lihat HTTP Server)[CR]> 1080p dan HDR memerlukan InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Batasi 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p FHD+ (2K)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Unggahan"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptif (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptif (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1235,3 +1239,155 @@ msgstr "Disunting"
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Sembunyikan video pendek (1 menit atau kurang)"
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Kualitas video"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p FHD (2K)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p UHD (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p UHDTV (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Gunakan riwayat pemutaran (ditonton, lanjutkan pelacakan)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 2.0.12 diperlukan untuk streaming langsung"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Batasi 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p FHD+ (2K)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptif (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptif (WEBM/VP9)"
diff --git a/plugin.video.youtube/resources/language/resource.language.is_is/strings.po b/plugin.video.youtube/resources/language/resource.language.is_is/strings.po
index 0d23494e12..34f59a53b3 100644
--- a/plugin.video.youtube/resources/language/resource.language.is_is/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.is_is/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.it_it/strings.po b/plugin.video.youtube/resources/language/resource.language.it_it/strings.po
index 46d58671d7..18ee488f33 100644
--- a/plugin.video.youtube/resources/language/resource.language.it_it/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.it_it/strings.po
@@ -6,9 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: XBMC-Addons\n"
-"Report-Msgid-Bugs-To: translations@kodi.tv\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
-"PO-Revision-Date: 2023-01-20 10:15+0000\n"
+"PO-Revision-Date: 2023-05-06 00:47+0000\n"
"Last-Translator: Massimo Pissarello \n"
"Language-Team: Italian \n"
"Language: it_it\n"
@@ -16,7 +16,7 @@ msgstr ""
"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.15.1\n"
+"X-Generator: Weblate 4.15.2\n"
msgctxt "Addon Summary"
msgid "Plugin for YouTube"
@@ -64,8 +64,8 @@ msgid "Always ask for the video quality"
msgstr "Chiedi sempre la qualità del video"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Qualità video"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -76,16 +76,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -99,6 +99,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Live/720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -448,7 +452,7 @@ msgstr "Video non piaciuti"
msgctxt "#30539"
msgid "Live"
-msgstr "Live"
+msgstr "Dal vivo"
msgctxt "#30540"
msgid "Play with..."
@@ -512,7 +516,7 @@ msgstr "Elimina database cronologia ricerche"
msgctxt "#30555"
msgid "Clear function cache"
-msgstr "Pulisci cache funzioni"
+msgstr "Svuota cache delle funzioni"
msgctxt "#30556"
msgid "Clear search history"
@@ -696,7 +700,7 @@ msgstr "Configura sottotitoli"
msgctxt "#30601"
msgid "%s with %s fallback"
-msgstr "%s con %s fallback"
+msgstr "%s con %s di riserva"
msgctxt "#30602"
msgid "No auto-generated"
@@ -888,11 +892,11 @@ msgstr "La chiave API non è corretta. Impostazioni - API - Chiave API"
msgctxt "#30649"
msgid "Client Id is incorrect. Settings - API - API Id"
-msgstr "L'ID cliente non è corretto. Impostazioni - API - ID API"
+msgstr "L'ID client non è corretto. Impostazioni - API - ID API"
msgctxt "#30650"
msgid "Client Secret is incorrect. Settings - API - API Secret"
-msgstr "La password cliente non è corretta. Impostazioni - API - Password API"
+msgstr "La password client non è corretta. Impostazioni - API - Password API"
msgctxt "#30651"
msgid "Location"
@@ -991,8 +995,8 @@ msgid "Reset resume point"
msgstr "Reimposta punto di ripresa"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Usa cronologia di riproduzione (guardato, riprendi)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1051,8 +1055,8 @@ msgid "Use for live streams"
msgstr "Usa per i live stream"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream adattivo >= 2.0.12 è richiesto per i live streaming"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1179,32 +1183,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Impostazione predefinita per WEBM (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Il proxy è richiesto per mpeg-dash vods (vedi HTTP Server)[CR]> 1080p e HDR richiede InputStream adattivo>= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Limita a 30 fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Caricamenti"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adattivo (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adattivo (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1238,6 +1242,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Nascondi video brevi (1 minuto o meno)"
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr "Usa dettagli alternativi del cliente"
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr "Alternativo #1"
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr "Alternativo #2"
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Qualità video"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Usa cronologia di riproduzione (guardato, riprendi)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream adattivo >= 2.0.12 è richiesto per i live streaming"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Limita a 30 fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adattivo (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adattivo (WEBM/VP9)"
+
#~ msgctxt "#30900"
#~ msgid "Subscriptions groups"
#~ msgstr "Gruppi di abbonamenti"
diff --git a/plugin.video.youtube/resources/language/resource.language.ja_jp/strings.po b/plugin.video.youtube/resources/language/resource.language.ja_jp/strings.po
index 401f2ceda8..e7da305f4e 100644
--- a/plugin.video.youtube/resources/language/resource.language.ja_jp/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ja_jp/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.kn_in/strings.po b/plugin.video.youtube/resources/language/resource.language.kn_in/strings.po
index 27a7197a74..a2d08d5afb 100644
--- a/plugin.video.youtube/resources/language/resource.language.kn_in/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.kn_in/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.ko_kr/strings.po b/plugin.video.youtube/resources/language/resource.language.ko_kr/strings.po
index 7269be37c0..9d6de68b7f 100644
--- a/plugin.video.youtube/resources/language/resource.language.ko_kr/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ko_kr/strings.po
@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: XBMC-Addons\n"
"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
-"PO-Revision-Date: 2022-11-20 05:15+0000\n"
+"PO-Revision-Date: 2023-05-06 00:35+0000\n"
"Last-Translator: Minho Park \n"
"Language-Team: Korean \n"
"Language: ko_kr\n"
@@ -15,7 +15,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.14.2\n"
+"X-Generator: Weblate 4.15.2\n"
msgctxt "Addon Summary"
msgid "Plugin for YouTube"
@@ -61,8 +61,8 @@ msgid "Always ask for the video quality"
msgstr "동영상 품질 항상 확인"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "동영상 품질"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -73,16 +73,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p 라이브 / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "3D 허용"
@@ -987,8 +991,8 @@ msgid "Reset resume point"
msgstr "이어 볼 지점 다시 설정"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "재생 이력 사용 (재생 함, 이어볼 지점)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1047,8 +1051,8 @@ msgid "Use for live streams"
msgstr "실시간에 사용"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 실시간에는 2.0.12 필요함"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1175,32 +1179,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "기본으로 WEBM 적응 설정 (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "mpeg-dash vods (HTTP 서버 참고)[CR]> 1080p에 프록시가 필요하고 HDR에 InputStream Adaptive >= 2.3.14 필요함"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "30fps 제한"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "업로드한 동영상"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "적응형 (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "적용형 (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1234,6 +1238,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "짧은 동영상 숨기기(1분 이하)"
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr "대체 클라이언트 세부 정보 사용"
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr "대체 #1"
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr "대체 #2"
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "동영상 품질"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "재생 이력 사용 (재생 함, 이어볼 지점)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 실시간에는 2.0.12 필요함"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "30fps 제한"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "적응형 (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "적용형 (WEBM/VP9)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "즐겨찾기"
diff --git a/plugin.video.youtube/resources/language/resource.language.lt_lt/strings.po b/plugin.video.youtube/resources/language/resource.language.lt_lt/strings.po
index 2b553ac300..133d8c827e 100644
--- a/plugin.video.youtube/resources/language/resource.language.lt_lt/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.lt_lt/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.lv_lv/strings.po b/plugin.video.youtube/resources/language/resource.language.lv_lv/strings.po
index 4ce739b6b0..2a7a36e998 100644
--- a/plugin.video.youtube/resources/language/resource.language.lv_lv/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.lv_lv/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.mi/strings.po b/plugin.video.youtube/resources/language/resource.language.mi/strings.po
index 6a3ea02ed5..f105c9f3aa 100644
--- a/plugin.video.youtube/resources/language/resource.language.mi/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.mi/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.mk_mk/strings.po b/plugin.video.youtube/resources/language/resource.language.mk_mk/strings.po
index 43c050a670..8190a19107 100644
--- a/plugin.video.youtube/resources/language/resource.language.mk_mk/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.mk_mk/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.ml_in/strings.po b/plugin.video.youtube/resources/language/resource.language.ml_in/strings.po
index 0b3758c9b9..7509c941d1 100644
--- a/plugin.video.youtube/resources/language/resource.language.ml_in/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ml_in/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.mn_mn/strings.po b/plugin.video.youtube/resources/language/resource.language.mn_mn/strings.po
index 29c82fb87d..08aeca96b7 100644
--- a/plugin.video.youtube/resources/language/resource.language.mn_mn/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.mn_mn/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.ms_my/strings.po b/plugin.video.youtube/resources/language/resource.language.ms_my/strings.po
index be8bfd0c3e..2bbd02b470 100644
--- a/plugin.video.youtube/resources/language/resource.language.ms_my/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ms_my/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.mt_mt/strings.po b/plugin.video.youtube/resources/language/resource.language.mt_mt/strings.po
index d29ab6df7f..0780ad1a38 100644
--- a/plugin.video.youtube/resources/language/resource.language.mt_mt/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.mt_mt/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.my_mm/strings.po b/plugin.video.youtube/resources/language/resource.language.my_mm/strings.po
index 224bdb6067..e1465d5257 100644
--- a/plugin.video.youtube/resources/language/resource.language.my_mm/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.my_mm/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.nb_no/strings.po b/plugin.video.youtube/resources/language/resource.language.nb_no/strings.po
index 9748ba9072..c405f11146 100644
--- a/plugin.video.youtube/resources/language/resource.language.nb_no/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.nb_no/strings.po
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Alltid spør om videokvalitet"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Videokvalitet"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,7 +993,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1049,7 +1053,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1177,7 +1181,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1185,11 +1189,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1197,11 +1201,11 @@ msgid "Uploads"
msgstr "Opplastninger"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1236,6 +1240,130 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Videokvalitet"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
# Kodion Common
# empty strings from id 30038 to 30099
#~ msgctxt "#30100"
diff --git a/plugin.video.youtube/resources/language/resource.language.nl_nl/strings.po b/plugin.video.youtube/resources/language/resource.language.nl_nl/strings.po
index 6357c96061..9fdb6ec25e 100644
--- a/plugin.video.youtube/resources/language/resource.language.nl_nl/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.nl_nl/strings.po
@@ -63,8 +63,8 @@ msgid "Always ask for the video quality"
msgstr "Vraag altijd naar video kwaliteit"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Video Kwaliteit"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -75,16 +75,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -98,6 +98,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Live / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -990,8 +994,8 @@ msgid "Reset resume point"
msgstr "Afspeelpunt resetten"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Gebruik afspeelgeschiedenis (Bekeken, Hervatten)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1050,8 +1054,8 @@ msgid "Use for live streams"
msgstr "Gebruik voor livestreams"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >=2.0.12 vereist voor livestreams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1178,32 +1182,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Standaard naar WEBM (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Proxy vereist voor mpeg-dasg vods (zie HTTP server)[CR]> 1080p en HDR vereisen InputStream Adaptive vanaf versie 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Limiteer tot 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Uploads"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptief (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptief (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1237,6 +1241,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Video Kwaliteit"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Gebruik afspeelgeschiedenis (Bekeken, Hervatten)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >=2.0.12 vereist voor livestreams"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Limiteer tot 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptief (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptief (WEBM/VP9)"
+
# Kodion Common
# empty strings from id 30037 to 30099
#~ msgctxt "#30100"
diff --git a/plugin.video.youtube/resources/language/resource.language.os_os/strings.po b/plugin.video.youtube/resources/language/resource.language.os_os/strings.po
index c408e1ff6e..dad2246911 100644
--- a/plugin.video.youtube/resources/language/resource.language.os_os/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.os_os/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.pl_pl/strings.po b/plugin.video.youtube/resources/language/resource.language.pl_pl/strings.po
index db3917799f..575a097b09 100644
--- a/plugin.video.youtube/resources/language/resource.language.pl_pl/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.pl_pl/strings.po
@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: XBMC-Addons\n"
"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
-"PO-Revision-Date: 2022-12-09 20:12+0000\n"
+"PO-Revision-Date: 2023-05-04 09:10+0000\n"
"Last-Translator: Marek Adamski \n"
"Language-Team: Polish \n"
"Language: pl_pl\n"
@@ -15,7 +15,7 @@ msgstr ""
"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 4.14.2\n"
+"X-Generator: Weblate 4.15.2\n"
msgctxt "Addon Summary"
msgid "Plugin for YouTube"
@@ -61,8 +61,8 @@ msgid "Always ask for the video quality"
msgstr "Pytaj o jakość strumienia wideo"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Jakość wideo"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -73,16 +73,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p na żywo / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "Dopuszczaj materiały 3D"
@@ -987,8 +991,8 @@ msgid "Reset resume point"
msgstr "Resetuj punkt wznowienia"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Używaj historii odtwarzania (obejrzane, wznawianie odtwarzania)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1044,11 +1048,11 @@ msgstr "Używaj dla wideo"
msgctxt "#30689"
msgid "Use for live streams"
-msgstr "Uzywaj dla transmisji na żywo"
+msgstr "Używaj dla transmisji na żywo"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 2.0.12 jest wymagany dla transmisji na żywo"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1175,32 +1179,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Domyślnie do zestawu adaptacyjnego WEBM (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Serwer proxy jest wymagany do vod-ów mpeg-dash (patrz serwer HTTP)[CR]> 1080p, a HDR wymaga InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Ograniczaj do 30 fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Przesłane"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptacyjna (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptacyjna (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1234,6 +1238,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Ukryj krótkie filmy (1 minuta lub mniej)"
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr "Użyj danych klienta alternatywnego"
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr "Alternatywa nr 1"
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr "Alternatywa nr 2"
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Jakość wideo"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Używaj historii odtwarzania (obejrzane, wznawianie odtwarzania)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 2.0.12 jest wymagany dla transmisji na żywo"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Ograniczaj do 30 fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptacyjna (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptacyjna (WEBM/VP9)"
+
#~ msgctxt "#30900"
#~ msgid "Subscriptions groups"
#~ msgstr "Grupy subskrypcji"
diff --git a/plugin.video.youtube/resources/language/resource.language.pt_br/strings.po b/plugin.video.youtube/resources/language/resource.language.pt_br/strings.po
index 8851f948d9..a6b843374a 100644
--- a/plugin.video.youtube/resources/language/resource.language.pt_br/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.pt_br/strings.po
@@ -60,8 +60,8 @@ msgid "Always ask for the video quality"
msgstr "Sempre perguntar pela qualidade do vídeo"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Qualidade do Vídeo"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -72,16 +72,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -95,6 +95,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p ao Vivo / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "Permitir 3D"
@@ -984,8 +988,8 @@ msgid "Reset resume point"
msgstr "Resetar ponto de resumo"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Use histórico de reprodução (assistido, retomar rastreamento)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1044,8 +1048,8 @@ msgid "Use for live streams"
msgstr "Use para transmissões ao vivo"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 2.0.12 é requerido para transmissões ao vivo"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1172,32 +1176,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Padrão para o conjunto de adaptação WEBM (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Proxy é requerido para vods mpeg-dash (ver Servidor HTTP)[CR] 1080p e HDR requerem InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Limite para 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Uploads"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptivo (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptivo (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1231,6 +1235,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Qualidade do Vídeo"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Use histórico de reprodução (assistido, retomar rastreamento)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 2.0.12 é requerido para transmissões ao vivo"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Limite para 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptivo (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptivo (WEBM/VP9)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "Favoritos"
diff --git a/plugin.video.youtube/resources/language/resource.language.pt_pt/strings.po b/plugin.video.youtube/resources/language/resource.language.pt_pt/strings.po
index 197f74be85..0819967525 100644
--- a/plugin.video.youtube/resources/language/resource.language.pt_pt/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.pt_pt/strings.po
@@ -61,8 +61,8 @@ msgid "Always ask for the video quality"
msgstr "Perguntar sempre pela qualidade do vídeo"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Qualidade do Vídeo"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -73,16 +73,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Em direto / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "Permitir 3D"
@@ -987,8 +991,8 @@ msgid "Reset resume point"
msgstr "Redefinir ponto de resumo"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Usar histórico de reprodução (visualizado, retomar o rastreamento)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1047,8 +1051,8 @@ msgid "Use for live streams"
msgstr "Usar para as streams em directo"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "InputStream Adaptive >= 2.0.12 é necessário para streams em directo"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1175,32 +1179,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Limitar a 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Carregamentos"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptativo (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptativo (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1234,6 +1238,158 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Qualidade do Vídeo"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Usar histórico de reprodução (visualizado, retomar o rastreamento)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "InputStream Adaptive >= 2.0.12 é necessário para streams em directo"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Limitar a 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptativo (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptativo (WEBM/VP9)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "Favoritos"
diff --git a/plugin.video.youtube/resources/language/resource.language.ro_ro/strings.po b/plugin.video.youtube/resources/language/resource.language.ro_ro/strings.po
index 4de97e02e1..b0963afb29 100644
--- a/plugin.video.youtube/resources/language/resource.language.ro_ro/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ro_ro/strings.po
@@ -61,8 +61,8 @@ msgid "Always ask for the video quality"
msgstr "Întreabă întotdeauna pentru calitatea video"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Calitate video"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -73,16 +73,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "Permite 3D"
@@ -987,7 +991,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1047,7 +1051,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1175,19 +1179,19 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1195,12 +1199,12 @@ msgid "Uploads"
msgstr "Încărcări"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptiv (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptiv (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1234,6 +1238,142 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Calitate video"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptiv (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptiv (WEBM/VP9)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "Favorite"
diff --git a/plugin.video.youtube/resources/language/resource.language.ru_ru/strings.po b/plugin.video.youtube/resources/language/resource.language.ru_ru/strings.po
index 3ad57a882b..08378e08be 100644
--- a/plugin.video.youtube/resources/language/resource.language.ru_ru/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ru_ru/strings.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: XBMC-Addons\n"
-"Report-Msgid-Bugs-To: translations@kodi.tv\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
"PO-Revision-Date: 2022-12-27 12:15+0000\n"
"Last-Translator: Andrei Stepanov \n"
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Всегда задавать вопрос о качестве видео"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Качество видео"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Прямой эфир / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Сброс точки возобновления"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Использовать историю просмотра (просмотренное, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Использовать для прямого эфира"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "Для прямого эфира требуется InputStream Adaptive >= 2.0.12"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "По умолчанию установлено значение адаптации WEBM (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Прокси требуется для mpeg-dash видео (см. HTTP сервер)[CR]>Для 1080p и HDR требуется InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Лимит в 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Загрузки"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Адаптивное (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Адаптивное (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1235,3 +1239,155 @@ msgstr "Изменен"
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Качество видео"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Использовать историю просмотра (просмотренное, resume tracking)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "Для прямого эфира требуется InputStream Adaptive >= 2.0.12"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Лимит в 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Адаптивное (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Адаптивное (WEBM/VP9)"
diff --git a/plugin.video.youtube/resources/language/resource.language.si_lk/strings.po b/plugin.video.youtube/resources/language/resource.language.si_lk/strings.po
index bd43c6ca79..5f998e16d9 100644
--- a/plugin.video.youtube/resources/language/resource.language.si_lk/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.si_lk/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.sk_sk/strings.po b/plugin.video.youtube/resources/language/resource.language.sk_sk/strings.po
index 1352c1f0b0..bb3873fdba 100644
--- a/plugin.video.youtube/resources/language/resource.language.sk_sk/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.sk_sk/strings.po
@@ -7,15 +7,15 @@ msgstr ""
"Project-Id-Version: XBMC-Addons\n"
"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
-"PO-Revision-Date: 2022-11-04 05:15+0000\n"
-"Last-Translator: Christian Gade \n"
+"PO-Revision-Date: 2023-07-24 21:11+0000\n"
+"Last-Translator: Jose Riha \n"
"Language-Team: Slovak \n"
"Language: sk_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 4.14.1\n"
+"X-Generator: Weblate 4.18.2\n"
msgctxt "Addon Summary"
msgid "Plugin for YouTube"
@@ -61,8 +61,8 @@ msgid "Always ask for the video quality"
msgstr "Vždy sa spýtať na kvalitu videa"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Kvalita videa"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -73,16 +73,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Živé / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "Povoliť 3D"
@@ -296,7 +300,7 @@ msgstr "Zoznamy"
msgctxt "#30502"
msgid "Go to %s"
-msgstr "Prejdite na %s"
+msgstr "Prejsť na %s"
msgctxt "#30503"
msgid "Show channel fanart"
@@ -360,7 +364,7 @@ msgstr "Odoberať od %s"
msgctxt "#30518"
msgid "Go to '%s'"
-msgstr "Prejdite na '%s'"
+msgstr "Prejsť na '%s'"
msgctxt "#30519"
msgid "and enter the following code:"
@@ -987,8 +991,8 @@ msgid "Reset resume point"
msgstr "Resetovať pozíciu pokračovania"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Použiť históriu prehrávania (videné, pokračovanie prehrávania)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1047,8 +1051,8 @@ msgid "Use for live streams"
msgstr "Použiť pre živé prenosy"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "Živé prenosy vyžadujú InputStream Adaptive aspoň vo verzii 2.0.12"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1172,39 +1176,39 @@ msgstr "Zrušenie odberu"
msgctxt "#30721"
msgid "Default to WEBM adaptation set (4K)"
-msgstr ""
+msgstr "Predvolené nastavenie prispôsobenia WEBM (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "Videá MPEG-DASH vyžadujú proxy (viď server HTTP)[CR]> 1080p a HDR videá vyžadujú InputStream Adaptive aspoň vo verzii 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "Obmedziť na 30 snímkov/s"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Nahraté"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Adaptívne (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Adaptívne (MP4/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
-msgstr ""
+msgstr "Vyhľadávanie prispôsobené pre diaľkové ovládače"
msgctxt "#30730"
msgid "Play (Ask for quality)"
@@ -1232,8 +1236,160 @@ msgstr "Upravené"
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
+msgstr "Skryť krátke videá (1 minúta alebo menej)"
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr "Použitie alternatívnych údajov o klientovi"
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr "Alternatíva č. 1"
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr "Alternatíva č. 2"
+
+msgctxt "#30740"
+msgid "HLS"
msgstr ""
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Kvalita videa"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Použiť históriu prehrávania (videné, pokračovanie prehrávania)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "Živé prenosy vyžadujú InputStream Adaptive aspoň vo verzii 2.0.12"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "Obmedziť na 30 snímkov/s"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Adaptívne (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Adaptívne (MP4/VP9)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "Obľúbené"
diff --git a/plugin.video.youtube/resources/language/resource.language.sl_si/strings.po b/plugin.video.youtube/resources/language/resource.language.sl_si/strings.po
index b5022d7cea..d304b4d0d0 100644
--- a/plugin.video.youtube/resources/language/resource.language.sl_si/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.sl_si/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.sq_al/strings.po b/plugin.video.youtube/resources/language/resource.language.sq_al/strings.po
index 093640dd05..d6b56299fe 100644
--- a/plugin.video.youtube/resources/language/resource.language.sq_al/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.sq_al/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.sr_rs/strings.po b/plugin.video.youtube/resources/language/resource.language.sr_rs/strings.po
index ab7ab58ac0..cb7d9e823b 100644
--- a/plugin.video.youtube/resources/language/resource.language.sr_rs/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.sr_rs/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.sr_rs@latin/strings.po b/plugin.video.youtube/resources/language/resource.language.sr_rs@latin/strings.po
index 10f86679ef..ef03432989 100644
--- a/plugin.video.youtube/resources/language/resource.language.sr_rs@latin/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.sr_rs@latin/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.sv_se/strings.po b/plugin.video.youtube/resources/language/resource.language.sv_se/strings.po
index 2f05e2afa5..cd677cb2d5 100644
--- a/plugin.video.youtube/resources/language/resource.language.sv_se/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.sv_se/strings.po
@@ -62,7 +62,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -74,15 +74,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,7 +993,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1049,7 +1053,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1177,7 +1181,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1185,11 +1189,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1197,11 +1201,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1235,3 +1239,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.szl/strings.po b/plugin.video.youtube/resources/language/resource.language.szl/strings.po
index 989eade945..2403e80155 100644
--- a/plugin.video.youtube/resources/language/resource.language.szl/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.szl/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.ta_in/strings.po b/plugin.video.youtube/resources/language/resource.language.ta_in/strings.po
index a0fbe3480b..ae00238d45 100644
--- a/plugin.video.youtube/resources/language/resource.language.ta_in/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.ta_in/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.te_in/strings.po b/plugin.video.youtube/resources/language/resource.language.te_in/strings.po
index 5c89013765..ce035052d9 100644
--- a/plugin.video.youtube/resources/language/resource.language.te_in/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.te_in/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.tg_tj/strings.po b/plugin.video.youtube/resources/language/resource.language.tg_tj/strings.po
index 1e601ceb1e..8d2f916399 100644
--- a/plugin.video.youtube/resources/language/resource.language.tg_tj/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.tg_tj/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.th_th/strings.po b/plugin.video.youtube/resources/language/resource.language.th_th/strings.po
index 61e4983eac..78fb1f9c8b 100644
--- a/plugin.video.youtube/resources/language/resource.language.th_th/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.th_th/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.tr_tr/strings.po b/plugin.video.youtube/resources/language/resource.language.tr_tr/strings.po
index 85153a2e0c..b22ed50a5d 100644
--- a/plugin.video.youtube/resources/language/resource.language.tr_tr/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.tr_tr/strings.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: XBMC-Addons\n"
-"Report-Msgid-Bugs-To: translations@kodi.tv\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
"PO-Revision-Date: 2023-01-15 09:59+0000\n"
"Last-Translator: Tmp341 \n"
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "Her zaman video kalitesi için sor"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Video kalitesi"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Canlı / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "Kaldığım yeri sıfırla"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "Oynatma geçmişini kullan (izlendi, kaldığım yerin takip edilmesi)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "Canlı yayınlar için kullan"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "Canlı yayınlar için InputStream Adaptive >= 2.0.12 gereklidir"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "Varsayılan olarak WEBM uyarlama seti (4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "mpeg-dash vod'lar için proxy gereklidir (bkz. HTTP Sunucusu)[CR]> 1080p ve HDR için InputStream Adaptive >= 2.3.14 gerekir"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "30fps ayarına sabitle"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "Yüklenenler"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "Uyarlamalı (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "Uyarlamalı (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1235,3 +1239,155 @@ msgstr "Düzenlendi"
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr "Kısa Videoları Gizle (1 dk ya da daha az)"
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Video kalitesi"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "Oynatma geçmişini kullan (izlendi, kaldığım yerin takip edilmesi)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "Canlı yayınlar için InputStream Adaptive >= 2.0.12 gereklidir"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "30fps ayarına sabitle"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "Uyarlamalı (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "Uyarlamalı (WEBM/VP9)"
diff --git a/plugin.video.youtube/resources/language/resource.language.uk_ua/strings.po b/plugin.video.youtube/resources/language/resource.language.uk_ua/strings.po
index 609be93045..ec62f2d9a6 100644
--- a/plugin.video.youtube/resources/language/resource.language.uk_ua/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.uk_ua/strings.po
@@ -60,8 +60,8 @@ msgid "Always ask for the video quality"
msgstr "Завжди запитувати про якість відео"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Якість відео"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -72,16 +72,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -95,6 +95,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "Дозволити 3D"
@@ -986,7 +990,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1046,7 +1050,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1174,7 +1178,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1182,11 +1186,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1194,11 +1198,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1233,6 +1237,130 @@ msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Якість відео"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "Обране"
diff --git a/plugin.video.youtube/resources/language/resource.language.uz_uz/strings.po b/plugin.video.youtube/resources/language/resource.language.uz_uz/strings.po
index 07255af2b4..a2e59dfd2a 100644
--- a/plugin.video.youtube/resources/language/resource.language.uz_uz/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.uz_uz/strings.po
@@ -61,7 +61,7 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
+msgid "Maximum video quality"
msgstr ""
msgctxt "#30011"
@@ -73,15 +73,15 @@ msgid "720p (HD)"
msgstr ""
msgctxt "#30013"
-msgid "1080p (HD)"
+msgid "1080p (FHD)"
msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
+msgid "2160p (4K)"
msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
+msgid "4320p (8K)"
msgstr ""
msgctxt "#30016"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr ""
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -988,7 +992,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1048,7 +1052,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1176,7 +1180,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1184,11 +1188,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1196,11 +1200,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1234,3 +1238,111 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
diff --git a/plugin.video.youtube/resources/language/resource.language.vi_vn/strings.po b/plugin.video.youtube/resources/language/resource.language.vi_vn/strings.po
index d17b9daae1..5ed2b1304c 100644
--- a/plugin.video.youtube/resources/language/resource.language.vi_vn/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.vi_vn/strings.po
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr ""
msgctxt "#30010"
-msgid "Video quality"
-msgstr "Chất lượng video"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p Trực tiếp / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,7 +993,7 @@ msgid "Reset resume point"
msgstr ""
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
+msgid "Use local playback history (watched, resume tracking)"
msgstr ""
msgctxt "#30676"
@@ -1049,7 +1053,7 @@ msgid "Use for live streams"
msgstr ""
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
msgstr ""
msgctxt "#30691"
@@ -1177,7 +1181,7 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr ""
msgctxt "#30722"
-msgid "HDR"
+msgid "Enable HDR video"
msgstr ""
msgctxt "#30723"
@@ -1185,11 +1189,11 @@ msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR
msgstr ""
msgctxt "#30724"
-msgid "Limit to 30fps"
+msgid "Enable high framerate video"
msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
+msgid "1440p (QHD)"
msgstr ""
msgctxt "#30726"
@@ -1197,11 +1201,11 @@ msgid "Uploads"
msgstr ""
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
+msgid "Enable H.264 video"
msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
+msgid "Enable VP9 video"
msgstr ""
msgctxt "#30729"
@@ -1235,3 +1239,127 @@ msgstr ""
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "Chất lượng video"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
diff --git a/plugin.video.youtube/resources/language/resource.language.zh_cn/strings.po b/plugin.video.youtube/resources/language/resource.language.zh_cn/strings.po
index 9b0093ac9b..6c9f658a52 100644
--- a/plugin.video.youtube/resources/language/resource.language.zh_cn/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.zh_cn/strings.po
@@ -7,15 +7,15 @@ msgstr ""
"Project-Id-Version: XBMC-Addons\n"
"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
"POT-Creation-Date: 2015-09-21 11:01+0000\n"
-"PO-Revision-Date: 2021-11-05 19:30+0000\n"
-"Last-Translator: wwj \n"
+"PO-Revision-Date: 2023-04-28 16:20+0000\n"
+"Last-Translator: NicoYazawa <1161118059@qq.com>\n"
"Language-Team: Chinese (China) \n"
"Language: zh_cn\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.8.1\n"
+"X-Generator: Weblate 4.15.2\n"
msgctxt "Addon Summary"
msgid "Plugin for YouTube"
@@ -61,8 +61,8 @@ msgid "Always ask for the video quality"
msgstr "总是询问视频分辨率"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "视频分辨率"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -73,16 +73,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -96,6 +96,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p 直播 / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
msgctxt "#30020"
msgid "Allow 3D"
msgstr "允许 3D 播放"
@@ -987,8 +991,8 @@ msgid "Reset resume point"
msgstr "重置恢复点"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "使用播放历史(已观看,继续跟踪)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1047,8 +1051,8 @@ msgid "Use for live streams"
msgstr "用于直播流"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "实时流需要 InputStream Adaptive >= 2.0.12"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1175,32 +1179,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "默认为 WEBM 适配集(4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "MPEG-DASH 视频点播(VODS)需要代理(请参阅 HTTP 服务器)[CR]> 1080p 和 HDR 需要 InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "限制为 30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440P (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "上传"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "自适应 (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "自适应(WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1232,8 +1236,160 @@ msgstr "已编辑"
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
+msgstr "隐藏短视频(1分钟以内)"
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
msgstr ""
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "视频分辨率"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "使用播放历史(已观看,继续跟踪)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "实时流需要 InputStream Adaptive >= 2.0.12"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "限制为 30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440P (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "自适应 (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "自适应(WEBM/VP9)"
+
#~ msgctxt "#30100"
#~ msgid "Favorites"
#~ msgstr "我的收藏"
diff --git a/plugin.video.youtube/resources/language/resource.language.zh_tw/strings.po b/plugin.video.youtube/resources/language/resource.language.zh_tw/strings.po
index 807f77d2a3..3cde9c7841 100644
--- a/plugin.video.youtube/resources/language/resource.language.zh_tw/strings.po
+++ b/plugin.video.youtube/resources/language/resource.language.zh_tw/strings.po
@@ -62,8 +62,8 @@ msgid "Always ask for the video quality"
msgstr "每次詢問影片解像度"
msgctxt "#30010"
-msgid "Video quality"
-msgstr "影片解像度"
+msgid "Maximum video quality"
+msgstr ""
msgctxt "#30011"
msgid "480p"
@@ -74,16 +74,16 @@ msgid "720p (HD)"
msgstr "720p (HD)"
msgctxt "#30013"
-msgid "1080p (HD)"
-msgstr "1080p (HD)"
+msgid "1080p (FHD)"
+msgstr ""
msgctxt "#30014"
-msgid "2160p (4k)"
-msgstr "2160p (4k)"
+msgid "2160p (4K)"
+msgstr ""
msgctxt "#30015"
-msgid "4320p (8k)"
-msgstr "4320p (8k)"
+msgid "4320p (8K)"
+msgstr ""
msgctxt "#30016"
msgid "240p"
@@ -97,6 +97,10 @@ msgctxt "#30018"
msgid "1080p Live / 720p (HD)"
msgstr "1080p 直播 / 720p (HD)"
+msgctxt "#30019"
+msgid "144p"
+msgstr ""
+
# empty strings 30019
msgctxt "#30020"
msgid "Allow 3D"
@@ -989,8 +993,8 @@ msgid "Reset resume point"
msgstr "重設繼續播放點"
msgctxt "#30675"
-msgid "Use playback history (watched, resume tracking)"
-msgstr "啟用播放歷史 (已觀看, 繼續播放)"
+msgid "Use local playback history (watched, resume tracking)"
+msgstr ""
msgctxt "#30676"
msgid "Just now"
@@ -1049,8 +1053,8 @@ msgid "Use for live streams"
msgstr "使用在直播串流"
msgctxt "#30690"
-msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
-msgstr "直播串流需要 InputStream Adaptive 2.0.12 以上版本"
+msgid "InputStream Adaptive >= 2.0.12 is required for adaptive live streams"
+msgstr ""
msgctxt "#30691"
msgid "Airing now"
@@ -1177,32 +1181,32 @@ msgid "Default to WEBM adaptation set (4K)"
msgstr "初始為WEBM adaptation(4K)"
msgctxt "#30722"
-msgid "HDR"
-msgstr "HDR"
+msgid "Enable HDR video"
+msgstr ""
msgctxt "#30723"
msgid "Proxy is required for mpeg-dash vods (see HTTP Server)[CR]> 1080p and HDR requires InputStream Adaptive >= 2.3.14"
msgstr "mpeg-dash 隨選視訊需要設定代理 (請看 HTTP 伺服器)[CR]> 1080p 且 HDR 需要 InputStream Adaptive >= 2.3.14"
msgctxt "#30724"
-msgid "Limit to 30fps"
-msgstr "限制在30fps"
+msgid "Enable high framerate video"
+msgstr ""
msgctxt "#30725"
-msgid "1440p (HD)"
-msgstr "1440p (HD)"
+msgid "1440p (QHD)"
+msgstr ""
msgctxt "#30726"
msgid "Uploads"
msgstr "上傳的影片"
msgctxt "#30727"
-msgid "Adaptive (MP4/H264)"
-msgstr "動態 (MP4/H264)"
+msgid "Enable H.264 video"
+msgstr ""
msgctxt "#30728"
-msgid "Adaptive (WEBM/VP9)"
-msgstr "動態 (WEBM/VP9)"
+msgid "Enable VP9 video"
+msgstr ""
msgctxt "#30729"
msgid "Remote friendly search"
@@ -1235,3 +1239,155 @@ msgstr "已編輯"
msgctxt "#30736"
msgid "Hide short videos (1 minute or less)"
msgstr ""
+
+msgctxt "#30737"
+msgid "Use alternate client details"
+msgstr ""
+
+msgctxt "#30738"
+msgid "Alternate #1"
+msgstr ""
+
+msgctxt "#30739"
+msgid "Alternate #2"
+msgstr ""
+
+msgctxt "#30740"
+msgid "HLS"
+msgstr ""
+
+msgctxt "#30741"
+msgid "Multi-stream HLS"
+msgstr ""
+
+msgctxt "#30742"
+msgid "Adaptive HLS"
+msgstr ""
+
+msgctxt "#30743"
+msgid "MPEG-DASH"
+msgstr ""
+
+msgctxt "#30744"
+msgid "Original"
+msgstr ""
+
+msgctxt "#30745"
+msgid "Dubbed"
+msgstr ""
+
+msgctxt "#30746"
+msgid "Descriptive"
+msgstr ""
+
+msgctxt "#30747"
+msgid "Alternate"
+msgstr ""
+
+msgctxt "#30748"
+msgid "Stream features"
+msgstr ""
+
+msgctxt "#30749"
+msgid "Enable AV1 video"
+msgstr ""
+
+msgctxt "#30750"
+msgid "Enable Vorbis audio"
+msgstr ""
+
+msgctxt "#30751"
+msgid "Enable Opus audio"
+msgstr ""
+
+msgctxt "#30752"
+msgid "Enable AAC audio"
+msgstr ""
+
+msgctxt "#30753"
+msgid "Enable surround sound audio"
+msgstr ""
+
+msgctxt "#30754"
+msgid "Enable AC-3 audio"
+msgstr ""
+
+msgctxt "#30755"
+msgid "Enable EAC-3 audio"
+msgstr ""
+
+msgctxt "#30756"
+msgid "Enable DTS audio"
+msgstr ""
+
+msgctxt "#30757"
+msgid "Remove similar/duplicate streams"
+msgstr ""
+
+msgctxt "#30758"
+msgid "Stream selection"
+msgstr ""
+
+msgctxt "#30759"
+msgid "Quality selection"
+msgstr ""
+
+msgctxt "#30760"
+msgid "Automatic + Quality selection"
+msgstr ""
+
+msgctxt "#30761"
+msgid "Update playback history on Youtube"
+msgstr ""
+
+msgctxt "#30762"
+msgid "Multi-language"
+msgstr ""
+
+msgctxt "#30763"
+msgid "Multi-audio"
+msgstr ""
+
+#~ msgctxt "#30010"
+#~ msgid "Video quality"
+#~ msgstr "影片解像度"
+
+#~ msgctxt "#30013"
+#~ msgid "1080p (HD)"
+#~ msgstr "1080p (HD)"
+
+#~ msgctxt "#30014"
+#~ msgid "2160p (4k)"
+#~ msgstr "2160p (4k)"
+
+#~ msgctxt "#30015"
+#~ msgid "4320p (8k)"
+#~ msgstr "4320p (8k)"
+
+#~ msgctxt "#30675"
+#~ msgid "Use playback history (watched, resume tracking)"
+#~ msgstr "啟用播放歷史 (已觀看, 繼續播放)"
+
+#~ msgctxt "#30690"
+#~ msgid "InputStream Adaptive >= 2.0.12 is required for live streams"
+#~ msgstr "直播串流需要 InputStream Adaptive 2.0.12 以上版本"
+
+#~ msgctxt "#30722"
+#~ msgid "HDR"
+#~ msgstr "HDR"
+
+#~ msgctxt "#30724"
+#~ msgid "Limit to 30fps"
+#~ msgstr "限制在30fps"
+
+#~ msgctxt "#30725"
+#~ msgid "1440p (HD)"
+#~ msgstr "1440p (HD)"
+
+#~ msgctxt "#30727"
+#~ msgid "Adaptive (MP4/H264)"
+#~ msgstr "動態 (MP4/H264)"
+
+#~ msgctxt "#30728"
+#~ msgid "Adaptive (WEBM/VP9)"
+#~ msgstr "動態 (WEBM/VP9)"
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/external/__init__.py b/plugin.video.youtube/resources/lib/youtube_plugin/external/__init__.py
deleted file mode 100644
index 644de4f825..0000000000
--- a/plugin.video.youtube/resources/lib/youtube_plugin/external/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-
- Copyright (C) 2023 plugin.video.youtube
-
- SPDX-License-Identifier: GPL-2.0-only
- See LICENSES/GPL-2.0-only for more information.
-"""
-
-__all__ = ['listitem']
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/external/listitem.py b/plugin.video.youtube/resources/lib/youtube_plugin/external/listitem.py
deleted file mode 100644
index f2ea96a3d3..0000000000
--- a/plugin.video.youtube/resources/lib/youtube_plugin/external/listitem.py
+++ /dev/null
@@ -1,218 +0,0 @@
-# -*- coding: utf-8 -*-
-# Module: default
-# Author: jurialmunkey
-# License: GPL v.3 https://www.gnu.org/copyleft/gpl.html
-from xbmc import Actor, VideoStreamDetail, AudioStreamDetail, SubtitleStreamDetail, LOGINFO
-from xbmc import log as kodi_log
-
-
-class ListItemInfoTag():
- INFO_TAG_ATTR = {
- 'video': {
- 'tag_getter': 'getVideoInfoTag',
- 'tag_attr': {
- 'genre': {'attr': 'setGenres', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'country': {'attr': 'setCountries', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'year': {'attr': 'setYear', 'convert': int, 'classinfo': int},
- 'episode': {'attr': 'setEpisode', 'convert': int, 'classinfo': int},
- 'season': {'attr': 'setSeason', 'convert': int, 'classinfo': int},
- 'sortepisode': {'attr': 'setSortEpisode', 'convert': int, 'classinfo': int},
- 'sortseason': {'attr': 'setSortSeason', 'convert': int, 'classinfo': int},
- 'episodeguide': {'attr': 'setEpisodeGuide', 'convert': str, 'classinfo': str},
- 'showlink': {'attr': 'setShowLinks', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'top250': {'attr': 'setTop250', 'convert': int, 'classinfo': int},
- 'setid': {'attr': 'setSetId', 'convert': int, 'classinfo': int},
- 'tracknumber': {'attr': 'setTrackNumber', 'convert': int, 'classinfo': int},
- 'rating': {'attr': 'setRating', 'convert': float, 'classinfo': float},
- 'userrating': {'attr': 'setUserRating', 'convert': int, 'classinfo': int},
- 'watched': {'skip': True}, # Evaluated internally in Nexus based on playcount so skip
- 'playcount': {'attr': 'setPlaycount', 'convert': int, 'classinfo': int},
- 'overlay': {'skip': True}, # Evaluated internally in Nexus based on playcount so skip
- 'cast': {'route': 'set_info_cast'},
- 'castandrole': {'route': 'set_info_cast'},
- 'director': {'attr': 'setDirectors', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'mpaa': {'attr': 'setMpaa', 'convert': str, 'classinfo': str},
- 'plot': {'attr': 'setPlot', 'convert': str, 'classinfo': str},
- 'plotoutline': {'attr': 'setPlotOutline', 'convert': str, 'classinfo': str},
- 'title': {'attr': 'setTitle', 'convert': str, 'classinfo': str},
- 'originaltitle': {'attr': 'setOriginalTitle', 'convert': str, 'classinfo': str},
- 'sorttitle': {'attr': 'setSortTitle', 'convert': str, 'classinfo': str},
- 'duration': {'attr': 'setDuration', 'convert': int, 'classinfo': int},
- 'studio': {'attr': 'setStudios', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'tagline': {'attr': 'setTagLine', 'convert': str, 'classinfo': str},
- 'writer': {'attr': 'setWriters', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'tvshowtitle': {'attr': 'setTvShowTitle', 'convert': str, 'classinfo': str},
- 'premiered': {'attr': 'setPremiered', 'convert': str, 'classinfo': str},
- 'status': {'attr': 'setTvShowStatus', 'convert': str, 'classinfo': str},
- 'set': {'attr': 'setSet', 'convert': str, 'classinfo': str},
- 'setoverview': {'attr': 'setSetOverview', 'convert': str, 'classinfo': str},
- 'tag': {'attr': 'setTags', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'imdbnumber': {'attr': 'setIMDBNumber', 'convert': str, 'classinfo': str},
- 'code': {'attr': 'setProductionCode', 'convert': str, 'classinfo': str},
- 'aired': {'attr': 'setFirstAired', 'convert': str, 'classinfo': str},
- 'credits': {'attr': 'setWriters', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'lastplayed': {'attr': 'setLastPlayed', 'convert': str, 'classinfo': str},
- 'album': {'attr': 'setAlbum', 'convert': str, 'classinfo': str},
- 'artist': {'attr': 'setArtists', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'votes': {'attr': 'setVotes', 'convert': int, 'classinfo': int},
- 'path': {'attr': 'setPath', 'convert': str, 'classinfo': str},
- 'trailer': {'attr': 'setTrailer', 'convert': str, 'classinfo': str},
- 'dateadded': {'attr': 'setDateAdded', 'convert': str, 'classinfo': str},
- 'date': {'attr': 'setDateAdded', 'convert': str, 'classinfo': str},
- 'mediatype': {'attr': 'setMediaType', 'convert': str, 'classinfo': str},
- 'dbid': {'attr': 'setDbId', 'convert': int, 'classinfo': int},
- }
- },
- 'music': {
- 'tag_getter': 'getMusicInfoTag',
- 'tag_attr': {
- 'tracknumber': {'attr': 'setTrack', 'convert': int, 'classinfo': int},
- 'discnumber': {'attr': 'setDisc', 'convert': int, 'classinfo': int},
- 'duration': {'attr': 'setDuration', 'convert': int, 'classinfo': int},
- 'year': {'attr': 'setYear', 'convert': int, 'classinfo': int},
- 'genre': {'attr': 'setGenres', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'album': {'attr': 'setAlbum', 'convert': str, 'classinfo': str},
- 'artist': {'attr': 'setArtist', 'convert': str, 'classinfo': str},
- 'title': {'attr': 'setTitle', 'convert': str, 'classinfo': str},
- 'rating': {'attr': 'setRating', 'convert': float, 'classinfo': float},
- 'userrating': {'attr': 'setUserRating', 'convert': int, 'classinfo': int},
- 'lyrics': {'attr': 'setLyrics', 'convert': str, 'classinfo': str},
- 'playcount': {'attr': 'setPlayCount', 'convert': int, 'classinfo': int},
- 'lastplayed': {'attr': 'setLastPlayed', 'convert': str, 'classinfo': str},
- 'mediatype': {'attr': 'setMediaType', 'convert': str, 'classinfo': str},
- 'dbid': {'route': 'set_info_music_dbid'},
- 'listeners': {'attr': 'setListeners', 'convert': int, 'classinfo': int},
- 'musicbrainztrackid': {'attr': 'setMusicBrainzTrackID', 'convert': str, 'classinfo': str},
- 'musicbrainzartistid': {'attr': 'setMusicBrainzArtistID', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'musicbrainzalbumid': {'attr': 'setMusicBrainzAlbumID', 'convert': str, 'classinfo': str},
- 'musicbrainzalbumartistid': {'attr': 'setMusicBrainzAlbumArtistID', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'comment': {'attr': 'setComment', 'convert': str, 'classinfo': str},
- 'albumartist': {'attr': 'setAlbumArtist', 'convert': str, 'classinfo': str}, # Not listed in setInfo docs but included for forward compatibility
- }
- },
- 'game': {
- 'tag_getter': 'getGameInfoTag',
- 'tag_attr': {
- 'title': {'attr': 'setTitle', 'convert': str, 'classinfo': str},
- 'platform': {'attr': 'setPlatform', 'convert': str, 'classinfo': str},
- 'genres': {'attr': 'setGenres', 'convert': lambda x: [x], 'classinfo': (list, tuple)},
- 'publisher': {'attr': 'setPublisher', 'convert': str, 'classinfo': str},
- 'developer': {'attr': 'setDeveloper', 'convert': str, 'classinfo': str},
- 'overview': {'attr': 'setOverview', 'convert': str, 'classinfo': str},
- 'year': {'attr': 'setYear', 'convert': int, 'classinfo': int},
- 'gameclient': {'attr': 'setGameClient', 'convert': str, 'classinfo': str},
- }
- }
- }
-
- def __init__(self, listitem, tag_type: str = 'video', type_check=False):
- """
- Pass xbmcgui.ListItem() to listitem with tag_type to the library type normally in li.setInfo(type=)
- Optional set type_check=
- - False: (default)
- - Slightly increases performance by avoiding additional internal type checks
- - Relys on Kodi Python API raising a TypeError to determine when to force type conversion
- - Kodi creates EXCEPTION log spam when infolabels require type conversion
- - True:
- - Slightly descreases performance by requiring additional internal type checks
- - Uses internal isinstance type check to determine when to force type conversion
- - Prevents Kodi EXCEPTION log spam when infolabels require type conversion
- """
- self._listitem = listitem
- self._tag_type = tag_type
- self._tag_attr = self.INFO_TAG_ATTR[tag_type]['tag_attr']
- self._info_tag = getattr(self._listitem, self.INFO_TAG_ATTR[tag_type]['tag_getter'])()
- self._type_chk = type_check
-
- def set_info(self, infolabels: dict):
- """ Wrapper for compatibility with Matrix ListItem.setInfo() method """
- for k, v in infolabels.items():
- if v is None:
- continue
- try:
- _tag_attr = self._tag_attr[k]
- func = getattr(self._info_tag, _tag_attr['attr'])
- if self._type_chk and not isinstance(v, _tag_attr['classinfo']):
- raise TypeError
- func(v)
-
- except KeyError:
- if k not in self._tag_attr:
- log_msg = f'[script.module.infotagger] set_info:\nKeyError: {k}'
- kodi_log(log_msg, level=LOGINFO)
- continue
-
- if _tag_attr.get('skip'):
- continue
-
- if 'route' in _tag_attr:
- getattr(self, _tag_attr['route'])(v, infolabels)
- continue
-
- log_msg = _tag_attr.get('log_msg') or ''
- log_msg = f'[script.module.infotagger] set_info:\nKeyError: {log_msg}'
- kodi_log(log_msg, level=LOGINFO)
- continue
-
- except TypeError:
- func(_tag_attr['convert'](v)) # Attempt to force conversion to correct type
-
- def set_info_music_dbid(self, dbid: int, infolabels: dict, *args, **kwargs):
- """ Wrapper for InfoTagMusic.setDbId to retrieve mediatype """
- try:
- mediatype = infolabels['mediatype']
- self._info_tag.setDbId(int(dbid), mediatype)
- except (KeyError, TypeError):
- return
-
- def set_info_cast(self, cast: list, *args, **kwargs):
- """ Wrapper to convert cast and castandrole from ListItem.setInfo() to InfoTagVideo.setCast() """
- def _set_cast_member(x, i):
- if not isinstance(i, tuple):
- i = (i, '',)
- return {'name': f'{i[0]}', 'role': f'{i[1]}', 'order': x, 'thumbnail': ''}
-
- self._info_tag.setCast([Actor(**_set_cast_member(x, i)) for x, i in enumerate(cast, start=1)])
-
- def set_cast(self, cast: list):
- """ Wrapper for compatibility with Matrix ListItem.setCast() method """
- self._info_tag.setCast([Actor(**i) for i in cast])
-
- def set_unique_ids(self, unique_ids: dict, default_id: str = None):
- """ Wrapper for compatibility with Matrix ListItem.setUniqueIDs() method """
- self._info_tag.setUniqueIDs({k: f'{v}' for k, v in unique_ids.items()}, default_id)
-
- def set_stream_details(self, stream_details: dict):
- """ Wrapper for compatibility with multiple ListItem.addStreamInfo() methods in one call """
- if not stream_details:
- return
-
- try:
- for i in stream_details['video']:
- try:
- self._info_tag.addVideoStream(VideoStreamDetail(**i))
- except TypeError:
- # TEMP BANDAID workaround for inconsistent key names prior to Nexus Beta changes
- i['hdrType'] = i.pop('hdrtype', '')
- i['stereoMode'] = i.pop('stereomode', '')
- self._info_tag.addVideoStream(VideoStreamDetail(**i))
- except (KeyError, TypeError):
- pass
-
- try:
- for i in stream_details['audio']:
- self._info_tag.addAudioStream(AudioStreamDetail(**i))
- except (KeyError, TypeError):
- pass
-
- try:
- for i in stream_details['subtitle']:
- self._info_tag.addSubtitleStream(SubtitleStreamDetail(**i))
- except (KeyError, TypeError):
- pass
-
- def add_stream_info(self, stream_type, stream_values):
- """ Wrapper for compatibility with Matrix ListItem.addStreamInfo() method """
- stream_details = {'video': [], 'audio': [], 'subtitle': []}
- stream_details[stream_type] = [stream_values]
- self.set_stream_details(stream_details)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/abstract_provider.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/abstract_provider.py
index 7069da601c..ff8ffd444f 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/abstract_provider.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/abstract_provider.py
@@ -10,9 +10,8 @@
import json
import re
-
-from six.moves.urllib_parse import quote
-from six.moves.urllib_parse import unquote
+from urllib.parse import quote
+from urllib.parse import unquote
from .exceptions import KodionException
from . import items
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_settings.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_settings.py
index dfeeace94f..6f64ca4607 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_settings.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_settings.py
@@ -14,11 +14,6 @@
ITEMS_PER_PAGE = 'kodion.content.max_per_page' # (int)
SEARCH_SIZE = 'kodion.search.size' # (int)
CACHE_SIZE = 'kodion.cache.size' # (int)
-VIDEO_QUALITY = 'kodion.video.quality' # (int)
-VIDEO_QUALITY_ASK = 'kodion.video.quality.ask' # (bool)
-USE_DASH = 'kodion.video.quality.mpd' # (bool)
-MPD_QUALITY_SELECTION = 'kodion.mpd.quality.selection' # (int)
-MPD_30FPS_LIMIT = 'kodion.mpd.limit.30' # (bool)
AUDIO_ONLY = 'kodion.audio_only' # (bool)
AGE_GATE = 'kodion.age.gate' # (bool)
SUBTITLE_LANGUAGE = 'kodion.subtitle.languages.num' # (int)
@@ -28,7 +23,8 @@
LOCATION = 'youtube.location' # (str)
LOCATION_RADIUS = 'youtube.location.radius' # (int)
PLAY_COUNT_MIN_PERCENT = 'kodion.play_count.percent' # (int)
-USE_PLAYBACK_HISTORY = 'kodion.playback.history' # (bool)
+USE_LOCAL_HISTORY = 'kodion.history.local' # (bool)
+USE_REMOTE_HISTORY = 'kodion.history.remote' # (bool)
REMOTE_FRIENDLY_SEARCH = 'youtube.search.remote.friendly' # (bool)
HIDE_SHORT_VIDEOS = 'youtube.hide_shorts' # (bool)
@@ -37,12 +33,19 @@
ALLOW_DEV_KEYS = 'youtube.allow.dev.keys' # (bool)
-DASH_VIDEOS = 'kodion.mpd.videos' # (bool)
-DASH_INCL_HDR = 'kodion.mpd.hdr' # (bool)
-DASH_LIVE_STREAMS = 'kodion.mpd.live_streams' # (bool)
+VIDEO_QUALITY = 'kodion.video.quality' # (int)
+VIDEO_QUALITY_ASK = 'kodion.video.quality.ask' # (bool)
+USE_MPD = 'kodion.video.quality.mpd' # (bool)
+LIVE_STREAMS = 'kodion.mpd.live_stream.selection' # (int)
+MPD_VIDEOS = 'kodion.mpd.videos' # (bool)
+MPD_QUALITY_SELECTION = 'kodion.mpd.quality.selection' # (int)
+MPD_STREAM_FEATURES = 'kodion.mpd.stream.features' # (list[string])
+MPD_STREAM_SELECT = 'kodion.mpd.stream.select' # (int)
HTTPD_PORT = 'kodion.mpd.proxy.port' # (number)
HTTPD_LISTEN = 'kodion.http.listen' # (string)
HTTPD_WHITELIST = 'kodion.http.ip.whitelist' # (string)
API_CONFIG_PAGE = 'youtube.api.config.page' # (bool)
+
+CLIENT_SELECTION = 'youtube.client.selection' # (int)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/abstract_context.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/abstract_context.py
index 93f5005aa2..99d1cb7022 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/abstract_context.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/abstract_context.py
@@ -8,9 +8,8 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import urllib
-
import os
+from urllib.parse import urlencode
from .. import constants
from .. import logger
@@ -55,6 +54,9 @@ def format_time(self, time_obj):
def get_language(self):
raise NotImplementedError()
+ def get_language_name(self):
+ raise NotImplementedError()
+
def get_region(self):
raise NotImplementedError()
@@ -156,7 +158,7 @@ def create_uri(self, path=u'/', params=None):
params[param] = str(params[param])
uri_params[param] = to_utf8(params[param])
- uri = '?'.join([uri, urllib.parse.urlencode(uri_params)])
+ uri = '?'.join([uri, urlencode(uri_params)])
return uri
@@ -186,10 +188,10 @@ def get_native_path(self):
raise NotImplementedError()
def get_icon(self):
- return os.path.join(self.get_native_path(), 'icon.png')
+ return self.create_resource_path('media/icon.png')
def get_fanart(self):
- return os.path.join(self.get_native_path(), 'fanart.jpg')
+ return self.create_resource_path('media/fanart.jpg')
def create_resource_path(self, *args):
path_comps = []
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/abstract_settings.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/abstract_settings.py
index b79c3b0c7b..47ec7ed2e7 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/abstract_settings.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/abstract_settings.py
@@ -10,7 +10,7 @@
import sys
-from .. import constants
+from ..constants import setting as SETTINGS
from ..logger import log_debug
@@ -63,7 +63,7 @@ def get_bool(self, setting_id, default_value):
return value == 'true'
def get_items_per_page(self):
- return self.get_int(constants.setting.ITEMS_PER_PAGE, 50)
+ return self.get_int(SETTINGS.ITEMS_PER_PAGE, 50)
def get_video_quality(self, quality_map_override=None):
vq_dict = {0: 240,
@@ -75,106 +75,122 @@ def get_video_quality(self, quality_map_override=None):
if quality_map_override is not None:
vq_dict = quality_map_override
- vq = self.get_int(constants.setting.VIDEO_QUALITY, 1)
+ vq = self.get_int(SETTINGS.VIDEO_QUALITY, 1)
return vq_dict[vq]
def ask_for_video_quality(self):
- return self.get_bool(constants.setting.VIDEO_QUALITY_ASK, False)
+ return self.get_bool(SETTINGS.VIDEO_QUALITY_ASK, False)
def show_fanart(self):
- return self.get_bool(constants.setting.SHOW_FANART, True)
+ return self.get_bool(SETTINGS.SHOW_FANART, True)
def get_search_history_size(self):
- return self.get_int(constants.setting.SEARCH_SIZE, 50)
+ return self.get_int(SETTINGS.SEARCH_SIZE, 50)
def is_setup_wizard_enabled(self):
- return self.get_bool(constants.setting.SETUP_WIZARD, False)
+ return self.get_bool(SETTINGS.SETUP_WIZARD, False)
def is_support_alternative_player_enabled(self):
- return self.get_bool(constants.setting.SUPPORT_ALTERNATIVE_PLAYER, False)
+ return self.get_bool(SETTINGS.SUPPORT_ALTERNATIVE_PLAYER, False)
def alternative_player_web_urls(self):
- return self.get_bool(constants.setting.ALTERNATIVE_PLAYER_WEB_URLS, False)
+ return self.get_bool(SETTINGS.ALTERNATIVE_PLAYER_WEB_URLS, False)
- def use_dash(self):
- return self.get_bool(constants.setting.USE_DASH, False)
+ def use_mpd(self):
+ return self.get_bool(SETTINGS.USE_MPD, False)
def subtitle_languages(self):
- return self.get_int(constants.setting.SUBTITLE_LANGUAGE, 0)
+ return self.get_int(SETTINGS.SUBTITLE_LANGUAGE, 0)
def subtitle_download(self):
- return self.get_bool(constants.setting.SUBTITLE_DOWNLOAD, False)
+ return self.get_bool(SETTINGS.SUBTITLE_DOWNLOAD, False)
def audio_only(self):
- return self.get_bool(constants.setting.AUDIO_ONLY, False)
+ return self.get_bool(SETTINGS.AUDIO_ONLY, False)
def set_subtitle_languages(self, value):
- return self.set_int(constants.setting.SUBTITLE_LANGUAGE, value)
+ return self.set_int(SETTINGS.SUBTITLE_LANGUAGE, value)
def set_subtitle_download(self, value):
- return self.set_bool(constants.setting.SUBTITLE_DOWNLOAD, value)
+ return self.set_bool(SETTINGS.SUBTITLE_DOWNLOAD, value)
def use_thumbnail_size(self):
- size = self.get_int(constants.setting.THUMB_SIZE, 0)
+ size = self.get_int(SETTINGS.THUMB_SIZE, 0)
sizes = {0: 'medium', 1: 'high'}
return sizes[size]
def safe_search(self):
- index = self.get_int(constants.setting.SAFE_SEARCH, 0)
+ index = self.get_int(SETTINGS.SAFE_SEARCH, 0)
values = {0: 'moderate', 1: 'none', 2: 'strict'}
return values[index]
def age_gate(self):
- return self.get_bool(constants.setting.AGE_GATE, True)
+ return self.get_bool(SETTINGS.AGE_GATE, True)
def verify_ssl(self):
- verify = self.get_bool(constants.setting.VERIFY_SSL, False)
+ verify = self.get_bool(SETTINGS.VERIFY_SSL, False)
if sys.version_info <= (2, 7, 9):
verify = False
return verify
def allow_dev_keys(self):
- return self.get_bool(constants.setting.ALLOW_DEV_KEYS, False)
-
- def use_dash_videos(self):
- if not self.use_dash():
- return False
- return self.get_bool(constants.setting.DASH_VIDEOS, False)
+ return self.get_bool(SETTINGS.ALLOW_DEV_KEYS, False)
+
+ def use_mpd_videos(self):
+ if self.use_mpd():
+ return self.get_bool(SETTINGS.MPD_VIDEOS, False)
+ return False
+
+ _LIVE_STREAM_TYPES = {
+ 0: 'mpegts',
+ 1: 'hls',
+ 2: 'ia_hls',
+ 3: 'ia_mpd',
+ }
+
+ def get_live_stream_type(self):
+ if self.use_mpd():
+ stream_type = self.get_int(SETTINGS.LIVE_STREAMS + '.1', 0)
+ else:
+ stream_type = self.get_int(SETTINGS.LIVE_STREAMS + '.2', 0)
+ return self._LIVE_STREAM_TYPES.get(stream_type) or self._LIVE_STREAM_TYPES[0]
- def include_hdr(self):
- if self.get_mpd_quality() == 'mp4':
- return False
- return self.get_bool(constants.setting.DASH_INCL_HDR, False)
+ def use_adaptive_live_streams(self):
+ if self.use_mpd():
+ return self.get_int(SETTINGS.LIVE_STREAMS + '.1', 0) > 1
+ return self.get_int(SETTINGS.LIVE_STREAMS + '.2', 0) > 1
- def use_dash_live_streams(self):
- if not self.use_dash():
- return False
- return self.get_bool(constants.setting.DASH_LIVE_STREAMS, False)
+ def use_mpd_live_streams(self):
+ if self.use_mpd():
+ return self.get_int(SETTINGS.LIVE_STREAMS + '.1', 0) == 3
+ return False
def httpd_port(self):
- return self.get_int(constants.setting.HTTPD_PORT, 50152)
+ return self.get_int(SETTINGS.HTTPD_PORT, 50152)
- def httpd_listen(self):
- ip_address = self.get_string(constants.setting.HTTPD_LISTEN, '0.0.0.0')
+ def httpd_listen(self, default='0.0.0.0', for_request=False):
+ ip_address = self.get_string(SETTINGS.HTTPD_LISTEN, default)
try:
ip_address = ip_address.strip()
except AttributeError:
pass
if not ip_address:
- ip_address = '0.0.0.0'
+ ip_address = default
+ if for_request and ip_address == default:
+ ip_address = '127.0.0.1'
return ip_address
def set_httpd_listen(self, value):
- return self.set_string(constants.setting.HTTPD_LISTEN, value)
+ return self.set_string(SETTINGS.HTTPD_LISTEN, value)
def httpd_whitelist(self):
- return self.get_string(constants.setting.HTTPD_WHITELIST, '')
+ return self.get_string(SETTINGS.HTTPD_WHITELIST, '')
def api_config_page(self):
- return self.get_bool(constants.setting.API_CONFIG_PAGE, False)
+ return self.get_bool(SETTINGS.API_CONFIG_PAGE, False)
def get_location(self):
- location = self.get_string(constants.setting.LOCATION, '').replace(' ', '').strip()
+ location = self.get_string(SETTINGS.LOCATION, '').replace(' ', '').strip()
coords = location.split(',')
latitude = longitude = None
if len(coords) == 2:
@@ -193,59 +209,60 @@ def get_location(self):
return ''
def set_location(self, value):
- self.set_string(constants.setting.LOCATION, value)
+ self.set_string(SETTINGS.LOCATION, value)
def get_location_radius(self):
- return ''.join([str(self.get_int(constants.setting.LOCATION_RADIUS, 500)), 'km'])
+ return ''.join([str(self.get_int(SETTINGS.LOCATION_RADIUS, 500)), 'km'])
def get_play_count_min_percent(self):
- return self.get_int(constants.setting.PLAY_COUNT_MIN_PERCENT, 0)
-
- def use_playback_history(self):
- return self.get_bool(constants.setting.USE_PLAYBACK_HISTORY, False)
-
- @staticmethod
- def __get_mpd_quality_map():
- return {
- 0: 240,
- 1: 360,
- 2: 480,
- 3: 720,
- 4: 1080,
- 5: 1440,
- 6: 2160,
- 7: 4320,
- 8: 'mp4',
- 9: 'webm'
- }
-
- def get_mpd_quality(self):
- quality_map = self.__get_mpd_quality_map()
- quality_enum = self.get_int(constants.setting.MPD_QUALITY_SELECTION, 8)
- return quality_map.get(quality_enum, 'mp4')
-
- def mpd_video_qualities(self):
- if not self.use_dash_videos():
+ return self.get_int(SETTINGS.PLAY_COUNT_MIN_PERCENT, 0)
+
+ def use_local_history(self):
+ return self.get_bool(SETTINGS.USE_LOCAL_HISTORY, False)
+
+ def use_remote_history(self):
+ return self.get_bool(SETTINGS.USE_REMOTE_HISTORY, False)
+
+ # Selections based on max width and min height at common (utra-)wide aspect ratios
+ _QUALITY_SELECTIONS = { # Setting | Resolution
+ 7: {'width': 7680, 'height': 3148, 'label': '4320p{0} (8K){1}'}, # 7 | 4320p 8K
+ 6: {'width': 3840, 'height': 1080, 'label': '2160p{0} (4K){1}'}, # 6 | 2160p 4K
+ 5: {'width': 2560, 'height': 984, 'label': '1440p{0} (QHD){1}'}, # 5 | 1440p 2.5K / QHD
+ 4.1: {'width': 2048, 'height': 858, 'label': '1152p{0} (2K){1}'}, # N/A | 1152p 2K / QWXGA
+ 4: {'width': 1920, 'height': 787, 'label': '1080p{0} (FHD){1}'}, # 4 | 1080p FHD
+ 3: {'width': 1280, 'height': 525, 'label': '720p{0} (HD){1}'}, # 3 | 720p HD
+ 2: {'width': 854, 'height': 350, 'label': '480p{0}{1}'}, # 2 | 480p
+ 1: {'width': 640, 'height': 263, 'label': '360p{0}{1}'}, # 1 | 360p
+ 0: {'width': 426, 'height': 175, 'label': '240p{0}{1}'}, # 0 | 240p
+ -1: {'width': 256, 'height': 105, 'label': '144p{0}{1}'}, # N/A | 144p
+ -2: {'width': 0, 'height': 0, 'label': '{2}p{0}{1}'}, # N/A | Custom
+ }
+
+ def get_mpd_video_qualities(self):
+ if not self.use_mpd_videos():
return []
+ selected = self.get_int(SETTINGS.MPD_QUALITY_SELECTION, 4)
+ return [quality for key, quality in self._QUALITY_SELECTIONS.items()
+ if selected >= key]
- quality = self.get_mpd_quality()
-
- if not isinstance(quality, int):
- return quality
+ def stream_features(self):
+ return self.get_string(SETTINGS.MPD_STREAM_FEATURES, '').split(',')
- quality_map = self.__get_mpd_quality_map()
- qualities = sorted([x for x in list(quality_map.values())
- if isinstance(x, int) and x <= quality], reverse=True)
+ _STREAM_SELECT = {
+ 1: 'auto',
+ 2: 'list',
+ 3: 'auto+list',
+ }
- return qualities
-
- def mpd_30fps_limit(self):
- if self.include_hdr() or isinstance(self.get_mpd_quality(), str):
- return False
- return self.get_bool(constants.setting.MPD_30FPS_LIMIT, False)
+ def stream_select(self):
+ select_type = self.get_int(SETTINGS.MPD_STREAM_SELECT, 1)
+ return self._STREAM_SELECT.get(select_type) or self._STREAM_SELECT[1]
def remote_friendly_search(self):
- return self.get_bool(constants.setting.REMOTE_FRIENDLY_SEARCH, False)
+ return self.get_bool(SETTINGS.REMOTE_FRIENDLY_SEARCH, False)
def hide_short_videos(self):
- return self.get_bool(constants.setting.HIDE_SHORT_VIDEOS, False)
+ return self.get_bool(SETTINGS.HIDE_SHORT_VIDEOS, False)
+
+ def client_selection(self):
+ return self.get_int(SETTINGS.CLIENT_SELECTION, 0)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context.py
index dd000aa982..03b9cee76a 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context.py
@@ -8,13 +8,15 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import urllib
-
import datetime
import json
import os
import sys
import weakref
+from urllib.parse import quote
+from urllib.parse import unquote
+from urllib.parse import urlparse
+from urllib.parse import parse_qsl
import xbmc
import xbmcaddon
@@ -51,8 +53,8 @@ def __init__(self, path='/', params=None, plugin_name='', plugin_id='', override
# first the path of the uri
if override:
self._uri = sys.argv[0]
- comps = urllib.parse.urlparse(self._uri)
- self._path = urllib.parse.unquote(comps.path)
+ comps = urlparse(self._uri)
+ self._path = unquote(comps.path)
# after that try to get the params
if len(sys.argv) > 2:
@@ -61,7 +63,7 @@ def __init__(self, path='/', params=None, plugin_name='', plugin_id='', override
self._uri = '?'.join([self._uri, params])
self._params = {}
- params = dict(urllib.parse.parse_qsl(params))
+ params = dict(parse_qsl(params))
for _param in params:
item = params[_param]
self._params[_param] = item
@@ -135,6 +137,11 @@ def get_language(self):
return 'en-US'
+ def get_language_name(self, lang_id=None):
+ if lang_id is None:
+ lang_id = self.get_language()
+ return xbmc.convertLanguage(lang_id, xbmc.ENGLISH_NAME).split(';')[0]
+
def get_video_playlist(self):
if not self._video_playlist:
self._video_playlist = XbmcPlaylist('video', weakref.proxy(self))
@@ -276,56 +283,63 @@ def set_addon_enabled(self, addon_id, enabled=True):
def send_notification(self, method, data):
data = json.dumps(data)
self.log_debug('send_notification: |%s| -> |%s|' % (method, data))
- data = '\\"[\\"%s\\"]\\"' % urllib.parse.quote(data)
+ data = '\\"[\\"%s\\"]\\"' % quote(data)
self.execute('NotifyAll(plugin.video.youtube,%s,%s)' % (method, data))
def use_inputstream_adaptive(self):
- addon_enabled = self.addon_enabled('inputstream.adaptive')
- if self._settings.use_dash() and not addon_enabled:
- if self.get_ui().on_yes_no_input(self.get_name(), self.localize(30579)):
- use_dash = self.set_addon_enabled('inputstream.adaptive')
+ if self._settings.use_mpd_videos() or self._settings.use_adaptive_live_streams():
+ if self.addon_enabled('inputstream.adaptive'):
+ success = True
+ elif self.get_ui().on_yes_no_input(self.get_name(), self.localize(30579)):
+ success = self.set_addon_enabled('inputstream.adaptive')
else:
- use_dash = False
- elif self._settings.use_dash() and addon_enabled:
- use_dash = True
+ success = False
else:
- use_dash = False
- return use_dash
+ success = False
+ return success
+
+ # Values of capability map can be any of the following:
+ # - required version number as string for comparison with actual installed InputStream.Adaptive version
+ # - any Falsey value to exclude capability regardless of version
+ # - True to include capability regardless of version
+ _IA_CAPABILITIES = {
+ 'live': '2.0.12',
+ 'drm': '2.2.12',
+ # audio codecs
+ 'vorbis': '2.3.14',
+ 'opus': '19.0.7',
+ 'mp4a': True,
+ 'ac-3': '2.1.15',
+ 'ec-3': '2.1.15',
+ 'dts': '2.1.15',
+ # video codecs
+ 'avc1': True,
+ 'av01': '20.3.0',
+ 'vp8': False,
+ 'vp9': '2.3.14',
+ }
def inputstream_adaptive_capabilities(self, capability=None):
# return a list inputstream.adaptive capabilities, if capability set return version required
- capabilities = []
-
- use_dash = self.use_inputstream_adaptive()
try:
inputstream_version = xbmcaddon.Addon('inputstream.adaptive').getAddonInfo('version')
except RuntimeError:
inputstream_version = ''
- if not use_dash or not inputstream_version:
- return None if capability is not None else capabilities
-
- capability_map = {
- 'live': '2.0.12',
- 'drm': '2.2.12',
- 'vp9': '2.3.14',
- 'vp9.2': '2.3.14',
- 'vorbis': None,
- 'opus': '19.0.7',
- 'av1': '20.3.0',
- }
+ if not self.use_inputstream_adaptive() or not inputstream_version:
+ return frozenset() if capability is None else None
+ ia_loose_version = utils.loose_version(inputstream_version)
if capability is None:
- ia_loose_version = utils.loose_version(inputstream_version)
-
- for key in list(capability_map.keys()):
- if capability_map[key] and (ia_loose_version >= utils.loose_version(capability_map[key])):
- capabilities.append(key)
-
+ capabilities = frozenset(
+ capability for capability, version in self._IA_CAPABILITIES.items()
+ if version is True
+ or version and ia_loose_version >= utils.loose_version(version)
+ )
return capabilities
- else:
- return capability_map[capability] if capability_map.get(capability) else None
+ version = self._IA_CAPABILITIES.get(capability)
+ return version is True or version and ia_loose_version >= utils.loose_version(version)
def inputstream_adaptive_auto_stream_selection(self):
try:
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context_ui.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context_ui.py
index 49c9507486..147d4e5ebc 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context_ui.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context_ui.py
@@ -8,8 +8,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import PY3
-
import xbmc
import xbmcgui
@@ -85,11 +83,8 @@ def on_delete_content(self, content_name):
def on_select(self, title, items=None):
if items is None:
items = []
- major_version = self._context.get_system_version().get_version()[0]
- if isinstance(items[0], tuple) and len(items[0]) == 4 and major_version <= 16:
- items = [(item[0], item[2]) for item in items]
- use_details = (isinstance(items[0], tuple) and len(items[0]) == 4 and major_version > 16)
+ use_details = (isinstance(items[0], tuple) and len(items[0]) == 4)
_dict = {}
_items = []
@@ -128,7 +123,7 @@ def show_notification(self, message, header='', image_uri='', time_milliseconds=
if not _image:
_image = self._context.get_icon()
- if PY3 and isinstance(message, str):
+ if isinstance(message, str):
message = utils.to_unicode(message)
try:
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_items.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_items.py
index 0112878578..1ab8430260 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_items.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_items.py
@@ -10,6 +10,22 @@
import xbmcgui
+try:
+ from infotagger.listitem import ListItemInfoTag
+except ImportError:
+ class ListItemInfoTag:
+ __slots__ = (__li__, )
+
+ def __init__(self, list_item):
+ self.__li__ = list_item
+
+ def add_stream_info(self, *args, **kwargs):
+ return self.__li__.addStreamInfo(*args, **kwargs)
+
+ def set_info(self, *args, **kwargs):
+ return self.__li__.setInfo(*args, **kwargs)
+
+
from ...items import VideoItem, AudioItem, UriItem
from ... import utils
from . import info_labels
@@ -18,9 +34,8 @@
def to_play_item(context, play_item):
context.log_debug('Converting PlayItem |%s|' % play_item.get_uri())
- major_version = context.get_system_version().get_version()[0]
- is_strm = str(context.get_param('strm', False)).lower() == 'true' and major_version >= 18
+ is_strm = str(context.get_param('strm', False)).lower() == 'true'
thumb = play_item.get_image() if play_item.get_image() else u'DefaultVideo.png'
title = play_item.get_title() if play_item.get_title() else play_item.get_name()
@@ -28,43 +43,58 @@ def to_play_item(context, play_item):
settings = context.get_settings()
if is_strm:
list_item = xbmcgui.ListItem(offscreen=True)
- elif major_version > 17:
- list_item = xbmcgui.ListItem(label=utils.to_unicode(title), offscreen=True)
else:
- list_item = xbmcgui.ListItem(label=utils.to_unicode(title))
- if major_version >= 20:
- from ....external.listitem import ListItemInfoTag
- info_tag = ListItemInfoTag(list_item, tag_type='video')
+ list_item = xbmcgui.ListItem(label=utils.to_unicode(title), offscreen=True)
+
+ info_tag = ListItemInfoTag(list_item, tag_type='video')
if not is_strm:
list_item.setProperty('IsPlayable', 'true')
if play_item.get_fanart() and settings.show_fanart():
fanart = play_item.get_fanart()
- if major_version <= 15:
- list_item.setArt({'thumb': thumb, 'fanart': fanart})
- list_item.setIconImage(thumb)
- else:
- list_item.setArt({'icon': thumb, 'thumb': thumb, 'fanart': fanart})
- if not play_item.use_dash() and not settings.is_support_alternative_player_enabled() and \
- play_item.get_headers() and play_item.get_uri().startswith('http') and major_version < 20:
- play_item.set_uri('|'.join([play_item.get_uri(), play_item.get_headers()]))
+ list_item.setArt({'icon': thumb, 'thumb': thumb, 'fanart': fanart})
if settings.is_support_alternative_player_enabled() and \
settings.alternative_player_web_urls() and \
not play_item.get_license_key():
play_item.set_uri('https://www.youtube.com/watch?v={video_id}'.format(video_id=play_item.video_id))
- if play_item.use_dash() and context.addon_enabled('inputstream.adaptive'):
- inputstream_property = 'inputstream'
- if major_version < 19:
- inputstream_property += 'addon'
-
+ ia_enabled = context.addon_enabled('inputstream.adaptive')
+
+ if ia_enabled and play_item.use_mpd_video() and not play_item.live:
list_item.setContentLookup(False)
list_item.setMimeType('application/xml+dash')
- list_item.setProperty(inputstream_property, 'inputstream.adaptive')
+ list_item.setProperty('inputstream', 'inputstream.adaptive')
list_item.setProperty('inputstream.adaptive.manifest_type', 'mpd')
+ if 'auto' in settings.stream_select():
+ list_item.setProperty('inputstream.adaptive.stream_selection_type', 'adaptive')
+
+ if play_item.get_headers():
+ list_item.setProperty('inputstream.adaptive.manifest_headers', play_item.get_headers())
+ list_item.setProperty('inputstream.adaptive.stream_headers', play_item.get_headers())
+
+ if play_item.get_license_key():
+ list_item.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
+ list_item.setProperty('inputstream.adaptive.license_key', play_item.get_license_key())
+
+ elif ia_enabled and play_item.live and settings.use_adaptive_live_streams():
+ if settings.use_mpd_live_streams():
+ manifest_type = 'mpd'
+ mime_type = 'application/xml+dash'
+ # MPD manifest update is currently broken
+ # Following line will force a full update but restart live stream from start
+ # list_item.setProperty('inputstream.adaptive.manifest_update_parameter', 'full')
+ else:
+ manifest_type = 'hls'
+ mime_type = 'application/x-mpegURL'
+
+ list_item.setContentLookup(False)
+ list_item.setMimeType(mime_type)
+ list_item.setProperty('inputstream', 'inputstream.adaptive')
+ list_item.setProperty('inputstream.adaptive.manifest_type', manifest_type)
+
if play_item.get_headers():
list_item.setProperty('inputstream.adaptive.manifest_headers', play_item.get_headers())
list_item.setProperty('inputstream.adaptive.stream_headers', play_item.get_headers())
@@ -72,6 +102,7 @@ def to_play_item(context, play_item):
if play_item.get_license_key():
list_item.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
list_item.setProperty('inputstream.adaptive.license_key', play_item.get_license_key())
+
else:
uri = play_item.get_uri()
if 'mime=' in uri:
@@ -98,38 +129,27 @@ def to_play_item(context, play_item):
# This should work for all versions of XBMC/KODI.
if 'duration' in _info_labels:
duration = _info_labels['duration']
- del _info_labels['duration']
- func = info_tag.add_stream_info if major_version >= 20 else list_item.addStreamInfo
- func('video', {'duration': duration})
+ info_tag.add_stream_info('video', {'duration': duration})
+
+ info_tag.set_info(_info_labels)
- if major_version >= 20:
- info_tag.set_info(_info_labels)
- else:
- list_item.setInfo(type='video', infoLabels=_info_labels)
return list_item
def to_video_item(context, video_item):
context.log_debug('Converting VideoItem |%s|' % video_item.get_uri())
- major_version = context.get_system_version().get_version()[0]
thumb = video_item.get_image() if video_item.get_image() else u'DefaultVideo.png'
title = video_item.get_title() if video_item.get_title() else video_item.get_name()
fanart = ''
settings = context.get_settings()
- if major_version > 17:
- item = xbmcgui.ListItem(label=utils.to_unicode(title), offscreen=True)
- else:
- item = xbmcgui.ListItem(label=utils.to_unicode(title))
- if major_version >= 20:
- from ....external.listitem import ListItemInfoTag
- info_tag = ListItemInfoTag(item, tag_type='video')
+
+ item = xbmcgui.ListItem(label=utils.to_unicode(title), offscreen=True)
+ info_tag = ListItemInfoTag(item, tag_type='video')
+
if video_item.get_fanart() and settings.show_fanart():
fanart = video_item.get_fanart()
- if major_version <= 15:
- item.setArt({'thumb': thumb, 'fanart': fanart})
- item.setIconImage(thumb)
- else:
- item.setArt({'icon': thumb, 'thumb': thumb, 'fanart': fanart})
+
+ item.setArt({'icon': thumb, 'thumb': thumb, 'fanart': fanart})
if video_item.get_context_menu() is not None:
item.addContextMenuItems(video_item.get_context_menu(), replaceItems=video_item.replace_context_menu())
@@ -160,14 +180,9 @@ def to_video_item(context, video_item):
# This should work for all versions of XBMC/KODI.
if 'duration' in _info_labels:
duration = _info_labels['duration']
- del _info_labels['duration']
- func = info_tag.add_stream_info if major_version >= 20 else item.addStreamInfo
- func('video', {'duration': duration})
+ info_tag.add_stream_info('video', {'duration': duration})
- if major_version >= 20:
- info_tag.set_info(_info_labels)
- else:
- item.setInfo(type='video', infoLabels=_info_labels)
+ info_tag.set_info(_info_labels)
if video_item.get_channel_id(): # make channel_id property available for keymapping
item.setProperty('channel_id', video_item.get_channel_id())
@@ -186,45 +201,30 @@ def to_video_item(context, video_item):
def to_audio_item(context, audio_item):
context.log_debug('Converting AudioItem |%s|' % audio_item.get_uri())
- major_version = context.get_system_version().get_version()[0]
thumb = audio_item.get_image() if audio_item.get_image() else u'DefaultAudio.png'
title = audio_item.get_name()
fanart = ''
settings = context.get_settings()
- if major_version > 17:
- item = xbmcgui.ListItem(label=utils.to_unicode(title), offscreen=True)
- else:
- item = xbmcgui.ListItem(label=utils.to_unicode(title))
- if major_version >= 20:
- from ....external.listitem import ListItemInfoTag
- info_tag = ListItemInfoTag(item, tag_type='music')
+ item = xbmcgui.ListItem(label=utils.to_unicode(title), offscreen=True)
+
+ info_tag = ListItemInfoTag(item, tag_type='music')
if audio_item.get_fanart() and settings.show_fanart():
fanart = audio_item.get_fanart()
- if major_version <= 15:
- item.setArt({'thumb': thumb, 'fanart': fanart})
- item.setIconImage(thumb)
- else:
- item.setArt({'icon': thumb, 'thumb': thumb, 'fanart': fanart})
+
+ item.setArt({'icon': thumb, 'thumb': thumb, 'fanart': fanart})
if audio_item.get_context_menu() is not None:
item.addContextMenuItems(audio_item.get_context_menu(), replaceItems=audio_item.replace_context_menu())
item.setProperty('IsPlayable', 'true')
- if major_version >= 20:
- info_tag.set_info(info_labels.create_from_item(audio_item))
- else:
- item.setInfo(type='music', infoLabels=info_labels.create_from_item(audio_item))
+ info_tag.set_info(info_labels.create_from_item(audio_item))
return item
def to_uri_item(context, base_item):
context.log_debug('Converting UriItem')
- major_version = context.get_system_version().get_version()[0]
- if major_version > 17:
- item = xbmcgui.ListItem(path=base_item.get_uri(), offscreen=True)
- else:
- item = xbmcgui.ListItem(path=base_item.get_uri())
+ item = xbmcgui.ListItem(path=base_item.get_uri(), offscreen=True)
item.setProperty('IsPlayable', 'true')
return item
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_progress_dialog.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_progress_dialog.py
index 879f2916cb..5aa6535d47 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_progress_dialog.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_progress_dialog.py
@@ -8,8 +8,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import string_types
-
import xbmcgui
from ..abstract_progress_dialog import AbstractProgressDialog
@@ -33,7 +31,7 @@ def update(self, steps=1, text=None):
self._position += steps
position = int(float((100.0 // self._total)) * self._position)
- if isinstance(text, string_types):
+ if isinstance(text, str):
self._dialog.update(position, text)
else:
self._dialog.update(position)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_progress_dialog_bg.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_progress_dialog_bg.py
index 2fe5e68daf..be9b4d0aee 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_progress_dialog_bg.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_progress_dialog_bg.py
@@ -8,8 +8,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import string_types
-
import xbmcgui
from ..abstract_progress_dialog import AbstractProgressDialog
@@ -33,7 +31,7 @@ def update(self, steps=1, text=None):
self._position += steps
position = int((100.0 / float(self._total)) * float(self._position))
- if isinstance(text, string_types):
+ if isinstance(text, str):
self._dialog.update(percent=position, message=text)
else:
self._dialog.update(percent=position)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_runner.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_runner.py
index 9f69f4c16b..46fda8a722 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_runner.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_runner.py
@@ -88,36 +88,25 @@ def _set_resolved_url(self, context, base_item, succeeded=True):
"""
def _add_directory(self, context, directory_item, item_count=0):
- major_version = context.get_system_version().get_version()[0]
-
art = {'icon': 'DefaultFolder.png',
'thumb': directory_item.get_image()}
- if major_version > 17:
- item = xbmcgui.ListItem(label=directory_item.get_name(), offscreen=True)
- else:
- item = xbmcgui.ListItem(label=directory_item.get_name())
- if major_version >= 20:
- from ....external.listitem import ListItemInfoTag
- info_tag = ListItemInfoTag(item, tag_type='video')
+ item = xbmcgui.ListItem(label=directory_item.get_name(), offscreen=True)
+
+ info_tag = xbmc_items.ListItemInfoTag(item, tag_type='video')
# only set fanart is enabled
if directory_item.get_fanart() and self.settings.show_fanart():
art['fanart'] = directory_item.get_fanart()
- if major_version <= 15:
- item.setArt(art)
- item.setIconImage(art['icon'])
- else:
- item.setArt(art)
+
+ item.setArt(art)
if directory_item.get_context_menu() is not None:
item.addContextMenuItems(directory_item.get_context_menu(),
replaceItems=directory_item.replace_context_menu())
- if major_version >= 20:
- info_tag.set_info(info_labels.create_from_item(directory_item))
- else:
- item.setInfo(type='video', infoLabels=info_labels.create_from_item(directory_item))
+
+ info_tag.set_info(info_labels.create_from_item(directory_item))
item.setPath(directory_item.get_uri())
is_folder = True
@@ -146,24 +135,15 @@ def _add_video(self, context, video_item, item_count=0):
totalItems=item_count)
def _add_image(self, context, image_item, item_count):
- major_version = context.get_system_version().get_version()[0]
-
art = {'icon': 'DefaultPicture.png',
'thumb': image_item.get_image()}
- if major_version > 17:
- item = xbmcgui.ListItem(label=image_item.get_name(), offscreen=True)
- else:
- item = xbmcgui.ListItem(label=image_item.get_name())
+ item = xbmcgui.ListItem(label=image_item.get_name(), offscreen=True)
if image_item.get_fanart() and self.settings.show_fanart():
art['fanart'] = image_item.get_fanart()
- if major_version <= 15:
- item.setArt(art)
- item.setIconImage(art['icon'])
- else:
- item.setArt(art)
+ item.setArt(art)
if image_item.get_context_menu() is not None:
item.addContextMenuItems(image_item.get_context_menu(), replaceItems=image_item.replace_context_menu())
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/audio_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/audio_item.py
index ecd678f526..33e5c530d7 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/audio_item.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/audio_item.py
@@ -10,14 +10,7 @@
from .base_item import BaseItem
-try:
- from six.moves import html_parser
-
- unescape = html_parser.HTMLParser().unescape
-except AttributeError:
- import html
-
- unescape = html.unescape
+from html import unescape
class AudioItem(BaseItem):
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/base_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/base_item.py
index 265796ad04..0385052ab8 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/base_item.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/base_item.py
@@ -8,23 +8,13 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import python_2_unicode_compatible
-from six import string_types
import hashlib
import datetime
-try:
- from six.moves import html_parser
+from html import unescape
- unescape = html_parser.HTMLParser().unescape
-except AttributeError:
- import html
- unescape = html.unescape
-
-
-@python_2_unicode_compatible
class BaseItem(object):
VERSION = 3
INFO_DATE = 'date' # (string) iso 8601
@@ -74,7 +64,7 @@ def get_name(self):
return self._name
def set_uri(self, uri):
- if isinstance(uri, string_types):
+ if isinstance(uri, str):
self._uri = uri
else:
self._uri = ''
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/utils.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/utils.py
index e7bbbbf73e..db7f235a43 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/utils.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/utils.py
@@ -8,8 +8,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import string_types
-
import json
from .video_item import VideoItem
@@ -48,7 +46,7 @@ def _from_json(_json_data):
return item
- if isinstance(json_data, string_types):
+ if isinstance(json_data, str):
json_data = json.loads(json_data)
return _from_json(json_data)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/video_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/video_item.py
index f779bef112..7d19fd4d95 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/video_item.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/video_item.py
@@ -13,14 +13,7 @@
from .base_item import BaseItem
-try:
- from six.moves import html_parser
-
- unescape = html_parser.HTMLParser().unescape
-except AttributeError:
- import html
-
- unescape = html.unescape
+from html import unescape
__RE_IMDB__ = re.compile(r'(http(s)?://)?www.imdb.(com|de)/title/(?P[t0-9]+)(/)?')
@@ -47,7 +40,7 @@ def __init__(self, name, uri, image=u'', fanart=u''):
self._studio = None
self._artist = None
self._play_count = None
- self._uses_dash = None
+ self._uses_mpd = None
self._mediatype = None
self._last_played = None
self._start_percent = None
@@ -234,11 +227,11 @@ def set_date_from_datetime(self, date_time):
def get_date(self):
return self._date
- def set_use_dash(self, value=True):
- self._uses_dash = value
+ def set_use_mpd_video(self, value=True):
+ self._uses_mpd = value
- def use_dash(self):
- return self._uses_dash is True and ('manifest/dash' in self.get_uri() or self.get_uri().endswith('.mpd'))
+ def use_mpd_video(self):
+ return self._uses_mpd is True and ('manifest/dash' in self.get_uri() or self.get_uri().endswith('.mpd'))
def set_mediatype(self, mediatype):
self._mediatype = mediatype
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/__init__.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/__init__.py
index 20e9597e5c..717fb4dc29 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/__init__.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/__init__.py
@@ -9,7 +9,6 @@
"""
from . import datetime_parser
-from .methods import loose_version
from .methods import *
from .search_history import SearchHistory
from .favorite_list import FavoriteList
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/data_cache.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/data_cache.py
index b3fd9ef2c1..62ced2269e 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/data_cache.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/data_cache.py
@@ -8,11 +8,8 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import PY2
-# noinspection PyPep8Naming
-from six.moves import cPickle as pickle
-
import json
+import pickle
import sqlite3
from datetime import datetime, timedelta
@@ -37,8 +34,6 @@ def is_empty(self):
def get_items(self, seconds, content_ids):
def _decode(obj):
- if PY2:
- obj = str(obj)
return pickle.loads(obj)
current_time = datetime.now()
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/datetime_parser.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/datetime_parser.py
index 3b3de8164c..41b7bf4c1d 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/datetime_parser.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/datetime_parser.py
@@ -13,9 +13,6 @@
from datetime import date, datetime, timedelta
from datetime import time as dt_time
-from six import PY2
-from six import text_type
-
from ..exceptions import KodionException
__RE_MATCH_TIME_ONLY__ = re.compile(r'^(?P[0-9]{2})([:]?(?P[0-9]{2})([:]?(?P[0-9]{2}))?)?$')
@@ -28,11 +25,7 @@
def py2_utf8(text):
- result = text
- if PY2 and isinstance(result, text_type):
- return result.encode('utf-8', 'ignore')
-
- return result
+ return text
def parse(datetime_string, localize=True):
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/http_server.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/http_server.py
index 1066636bb5..522e5a8300 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/http_server.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/http_server.py
@@ -7,15 +7,14 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import BaseHTTPServer
-from six.moves.urllib.parse import parse_qs, urlparse
-from six.moves import range
-
import json
import os
import re
import requests
import socket
+from http import server as BaseHTTPServer
+from urllib.parse import parse_qs
+from urllib.parse import urlparse
import xbmc
import xbmcaddon
@@ -64,7 +63,7 @@ def connection_allowed(self):
# noinspection PyPep8Naming
def do_GET(self):
addon = xbmcaddon.Addon('plugin.video.youtube')
- dash_proxy_enabled = addon.getSetting('kodion.mpd.videos') == 'true' and addon.getSetting('kodion.video.quality.mpd') == 'true'
+ mpd_proxy_enabled = addon.getSetting('kodion.mpd.videos') == 'true' and addon.getSetting('kodion.video.quality.mpd') == 'true'
api_config_enabled = addon.getSetting('youtube.api.config.page') == 'true'
# Strip trailing slash if present
@@ -79,12 +78,12 @@ def do_GET(self):
self.wfile.write(client_json.encode('utf-8'))
if stripped_path != '/ping':
- logger.log_debug('HTTPServer: Request uri path |{proxy_path}|'.format(proxy_path=self.path))
+ logger.log_debug('HTTPServer: GET Request uri path |{proxy_path}|'.format(proxy_path=self.path))
if not self.connection_allowed():
self.send_error(403)
else:
- if dash_proxy_enabled and self.path.endswith('.mpd'):
+ if mpd_proxy_enabled and self.path.endswith('.mpd'):
file_path = os.path.join(self.base_path, self.path.strip('/').strip('\\'))
file_chunk = True
logger.log_debug('HTTPServer: Request file path |{file_path}|'.format(file_path=file_path.encode('utf-8')))
@@ -166,14 +165,14 @@ def do_GET(self):
# noinspection PyPep8Naming
def do_HEAD(self):
- logger.log_debug('HTTPServer: Request uri path |{proxy_path}|'.format(proxy_path=self.path))
+ logger.log_debug('HTTPServer: HEAD Request uri path |{proxy_path}|'.format(proxy_path=self.path))
if not self.connection_allowed():
self.send_error(403)
else:
addon = xbmcaddon.Addon('plugin.video.youtube')
- dash_proxy_enabled = addon.getSetting('kodion.mpd.videos') == 'true' and addon.getSetting('kodion.video.quality.mpd') == 'true'
- if dash_proxy_enabled and self.path.endswith('.mpd'):
+ mpd_proxy_enabled = addon.getSetting('kodion.mpd.videos') == 'true' and addon.getSetting('kodion.video.quality.mpd') == 'true'
+ if mpd_proxy_enabled and self.path.endswith('.mpd'):
file_path = os.path.join(self.base_path, self.path.strip('/').strip('\\'))
if not os.path.isfile(file_path):
response = 'File Not Found: |{proxy_path}| -> |{file_path}|'.format(proxy_path=self.path, file_path=file_path.encode('utf-8'))
@@ -471,7 +470,7 @@ def get_http_server(address=None, port=None):
except socket.error as e:
logger.log_debug('HTTPServer: Failed to start |{address}:{port}| |{response}|'.format(address=address, port=port, response=str(e)))
xbmcgui.Dialog().notification(addon.getAddonInfo('name'), str(e),
- "{}/icon.png".format(addon.getAddonInfo('path')),
+ addon.getAddonInfo('icon'),
5000, False)
return None
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/methods.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/methods.py
index f9f1a41bb7..5a0738c639 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/methods.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/methods.py
@@ -8,15 +8,10 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import urllib
-from six import PY2
-from six import next
-from six import string_types
-from six import text_type
-
import os
import copy
import re
+from urllib.parse import quote
from ..constants import localize
@@ -43,15 +38,12 @@ def loose_version(v):
def to_str(text):
if isinstance(text, bytes):
return text.decode('utf-8', 'ignore')
- if PY2 and isinstance(text, text_type):
- return text.encode('utf-8', 'ignore')
-
return text
def to_utf8(text):
result = text
- if isinstance(text, string_types):
+ if isinstance(text, str):
try:
result = text.encode('utf-8', 'ignore')
except UnicodeDecodeError:
@@ -62,7 +54,7 @@ def to_utf8(text):
def to_unicode(text):
result = text
- if isinstance(text, string_types) or isinstance(text, bytes):
+ if isinstance(text, str) or isinstance(text, bytes):
try:
result = text.decode('utf-8', 'ignore')
except (AttributeError, UnicodeEncodeError):
@@ -100,19 +92,20 @@ def find_best_fit(data, compare_method=None):
def select_stream(context, stream_data_list, quality_map_override=None, ask_for_quality=None, audio_only=None):
# sort - best stream first
def _sort_stream_data(_stream_data):
- return _stream_data.get('sort', 0)
+ return _stream_data.get('sort', (0, 0))
settings = context.get_settings()
- use_dash = settings.use_dash()
+ use_adaptive = context.use_inputstream_adaptive()
ask_for_quality = context.get_settings().ask_for_video_quality() if ask_for_quality is None else ask_for_quality
video_quality = settings.get_video_quality(quality_map_override=quality_map_override)
audio_only = audio_only if audio_only is not None else settings.audio_only()
+ adaptive_live = settings.use_adaptive_live_streams() and context.inputstream_adaptive_capabilities('live')
if not ask_for_quality:
stream_data_list = [item for item in stream_data_list
- if ((item['container'] != 'mpd') or
- ((item['container'] == 'mpd') and
- (item.get('dash/video', False))))]
+ if (item['container'] not in {'mpd', 'hls'} or
+ item.get('hls/video') or
+ item.get('dash/video'))]
if not ask_for_quality and audio_only: # check for live stream, audio only not supported
context.log_debug('Select stream: Audio only')
@@ -124,43 +117,31 @@ def _sort_stream_data(_stream_data):
if not ask_for_quality and audio_only:
audio_stream_data_list = [item for item in stream_data_list
- if (item.get('dash/audio', False) and
- not item.get('dash/video', False))]
+ if (item.get('dash/audio') and
+ not item.get('dash/video') and
+ not item.get('hls/video'))]
if audio_stream_data_list:
- use_dash = False
+ use_adaptive = False
stream_data_list = audio_stream_data_list
else:
context.log_debug('Select stream: Audio only, no audio only streams found')
- dash_live = settings.use_dash_live_streams() and 'live' in context.inputstream_adaptive_capabilities()
- dash_videos = settings.use_dash_videos()
-
- if use_dash and any([item['container'] == 'mpd' for item in stream_data_list]):
- use_dash = context.use_inputstream_adaptive()
-
- if not use_dash:
- stream_data_list = [item for item in stream_data_list if (item['container'] != 'mpd')]
- else:
- if not dash_live:
- stream_data_list = [item for item in stream_data_list
- if ((item['container'] != 'mpd') or
- ((item['container'] == 'mpd') and
- (item.get('Live') is not True)))]
-
- if not dash_videos:
- stream_data_list = [item for item in stream_data_list
- if ((item['container'] != 'mpd') or
- ((item['container'] == 'mpd') and
- (item.get('Live') is True)))]
+ if not adaptive_live:
+ stream_data_list = [item for item in stream_data_list
+ if (item['container'] != 'mpd' or
+ not item.get('Live'))]
+ elif not use_adaptive:
+ stream_data_list = [item for item in stream_data_list
+ if item['container'] != 'mpd']
def _find_best_fit_video(_stream_data):
if audio_only:
- return video_quality - _stream_data.get('sort', [0, 0])[0]
+ return video_quality - _stream_data.get('sort', (0, 0))[0]
else:
return video_quality - _stream_data.get('video', {}).get('height', 0)
- sorted_stream_data_list = sorted(stream_data_list, key=_sort_stream_data, reverse=True)
+ sorted_stream_data_list = sorted(stream_data_list, key=_sort_stream_data)
context.log_debug('selectable streams: %d' % len(sorted_stream_data_list))
log_streams = list()
@@ -221,7 +202,7 @@ def create_uri_path(*args):
uri_path = '/'.join(comps)
if uri_path:
- return urllib.parse.quote('/%s/' % uri_path)
+ return quote('/%s/' % uri_path)
return '/'
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/monitor.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/monitor.py
index 6d793b1a1b..9ca023e79b 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/monitor.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/monitor.py
@@ -7,12 +7,11 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves.urllib.parse import unquote
-
import json
import os
import shutil
import threading
+from urllib.parse import unquote
import xbmc
import xbmcaddon
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/playback_history.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/playback_history.py
index 38e66fb27c..723f3b1607 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/playback_history.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/playback_history.py
@@ -8,12 +8,9 @@
"""
import datetime
+import pickle
import sqlite3
-from six import PY2
-# noinspection PyPep8Naming
-from six.moves import cPickle as pickle
-
from .storage import Storage
@@ -26,8 +23,6 @@ def is_empty(self):
def get_items(self, keys):
def _decode(obj):
- if PY2:
- obj = str(obj)
return pickle.loads(obj)
self._open()
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/player.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/player.py
index 82933bf688..c8ce052263 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/player.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/player.py
@@ -52,8 +52,8 @@ def abort_now(self):
def run(self):
playing_file = self.playback_json.get('playing_file')
play_count = self.playback_json.get('play_count', 0)
- use_history = self.playback_json.get('use_history', False)
- playback_history = self.playback_json.get('playback_history', False)
+ use_remote_history = self.playback_json.get('use_remote_history', False)
+ use_local_history = self.playback_json.get('use_local_history', False)
playback_stats = self.playback_json.get('playback_stats')
refresh_only = self.playback_json.get('refresh_only', False)
try:
@@ -101,7 +101,7 @@ def run(self):
client = self.provider.get_client(self.context)
is_logged_in = self.provider.is_logged_in()
- if is_logged_in and report_url and use_history:
+ if is_logged_in and report_url and use_remote_history:
client.update_watch_history(self.video_id, report_url)
self.context.log_debug('Playback start reported: |%s|' % self.video_id)
@@ -194,7 +194,7 @@ def run(self):
self.update_times(last_total_time, last_current_time, last_segment_start, last_percent_complete)
break
- if is_logged_in and report_url and use_history:
+ if is_logged_in and report_url and use_remote_history:
if first_report or (p_waited >= report_interval):
if first_report:
first_report = False
@@ -239,7 +239,7 @@ def run(self):
p_waited += p_wait_time
- if is_logged_in and report_url and use_history:
+ if is_logged_in and report_url and use_remote_history:
client.update_watch_history(self.video_id, report_url
.format(st=format(self.segment_start, '.3f'),
et=format(self.current_time, '.3f'),
@@ -268,7 +268,7 @@ def run(self):
if self.percent_complete >= settings.get_play_count_min_percent():
play_count = '1'
self.current_time = 0.0
- if is_logged_in and report_url and use_history:
+ if is_logged_in and report_url and use_remote_history:
client.update_watch_history(self.video_id, report_url
.format(st=format(self.total_time, '.3f'),
et=format(self.total_time, '.3f'),
@@ -276,7 +276,7 @@ def run(self):
self.context.log_debug('Playback reported [%s] @ 100%% state=%s' % (self.video_id, state))
else:
- if is_logged_in and report_url and use_history:
+ if is_logged_in and report_url and use_remote_history:
client.update_watch_history(self.video_id, report_url
.format(st=format(self.current_time, '.3f'),
et=format(self.current_time, '.3f'),
@@ -288,7 +288,7 @@ def run(self):
refresh_only = True
- if playback_history:
+ if use_local_history:
self.context.get_playback_history().update(self.video_id, play_count, self.total_time,
self.current_time, self.percent_complete)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/storage.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/storage.py
index 59ca541012..17ba64062e 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/storage.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/storage.py
@@ -8,13 +8,9 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import PY2
-from six.moves import range
-# noinspection PyPep8Naming
-from six.moves import cPickle as pickle
-
import datetime
import os
+import pickle
import sqlite3
import time
import traceback
@@ -195,10 +191,7 @@ def _get_ids(self, oldest_first=True):
def _get(self, item_id):
def _decode(obj):
- if PY2:
- return pickle.loads(str(obj))
- else:
- return pickle.loads(obj, encoding='utf-8')
+ return pickle.loads(obj, encoding='utf-8')
self._open()
query = 'SELECT time, value FROM %s WHERE key=?' % self._table_name
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/system_version.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/system_version.py
index 956f95dcf3..50e24b86a1 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/system_version.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/system_version.py
@@ -8,16 +8,11 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import map
-from six import string_types
-from six import python_2_unicode_compatible
-
import json
import xbmc
-@python_2_unicode_compatible
class SystemVersion(object):
def __init__(self, version, releasename, appname):
if not isinstance(version, tuple):
@@ -25,12 +20,12 @@ def __init__(self, version, releasename, appname):
else:
self._version = version
- if not releasename or not isinstance(releasename, string_types):
+ if not releasename or not isinstance(releasename, str):
self._releasename = 'UNKNOWN'
else:
self._releasename = releasename
- if not appname or not isinstance(appname, string_types):
+ if not appname or not isinstance(appname, str):
self._appname = 'UNKNOWN'
else:
self._appname = appname
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/__config__.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/__config__.py
index ca3959ec75..7df58a97bd 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/__config__.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/__config__.py
@@ -209,8 +209,8 @@ def _strip_api_keys(self, api_key, client_id, client_secret):
return return_key, return_id, return_secret
-notification_data = {'use_httpd': (__settings.use_dash_videos() and
- __settings.use_dash()) or
+notification_data = {'use_httpd': (__settings.use_mpd_videos() or
+ __settings.use_mpd_live_streams()) or
(__settings.api_config_page()),
'httpd_port': __settings.httpd_port(),
'whitelist': __settings.httpd_whitelist(),
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/login_client.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/login_client.py
index 3a65212313..2948c4992f 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/login_client.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/login_client.py
@@ -8,10 +8,11 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import urllib
-
import time
+from urllib.parse import parse_qsl
+
import requests
+
from ...youtube.youtube_exceptions import InvalidGrant, LoginException
from ...kodion import Context
from .__config__ import api, youtube_tv, developer_keys, keys_changed
@@ -304,7 +305,7 @@ def authenticate(self, username, password):
raise LoginException('Login Failed')
lines = result.text.replace('\n', '&')
- params = dict(urllib.parse.parse_qsl(lines))
+ params = dict(parse_qsl(lines))
token = params.get('Auth', '')
expires = int(params.get('Expiry', -1))
if not token or expires == -1:
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/youtube.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/youtube.py
index f79e35493f..3657cef021 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/youtube.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/youtube.py
@@ -16,9 +16,9 @@
import xml.etree.ElementTree as ET
import requests
-from six import PY3
from .login_client import LoginClient
+from ..youtube_exceptions import YouTubeException
from ..helper.video_info import VideoInfo
from ...kodion import Context
from ...kodion.utils import datetime_parser
@@ -97,7 +97,7 @@ def update_watch_history(self, video_id, url):
def get_video_streams(self, context, video_id):
video_info = VideoInfo(context, access_token=self._access_token_tv,
- api_key=self._config_tv['key'], language=self._language)
+ language=self._language)
video_streams = video_info.load_stream_infos(video_id)
@@ -127,9 +127,9 @@ def get_video_streams(self, context, video_id):
video_stream['audio']['bitrate'])
elif 'audio' in video_stream or 'video' in video_stream:
- encoding = video_stream.get('audio', dict()).get('encoding')
+ encoding = video_stream.get('audio', {}).get('encoding')
if not encoding:
- encoding = video_stream.get('video', dict()).get('encoding')
+ encoding = video_stream.get('video', {}).get('encoding')
if encoding:
title = '%s (%s; %s)' % (context.get_ui().bold(video_stream['title']),
video_stream['container'],
@@ -628,7 +628,7 @@ def get_related_videos(self, video_id, page_token='', max_results=0):
params['pageToken'] = page_token
return self.perform_v3_request(method='GET', path='search', params=params)
-
+
def get_parent_comments(self, video_id, page_token='', max_results=0):
max_results = self._max_results if max_results <= 0 else max_results
@@ -640,9 +640,9 @@ def get_parent_comments(self, video_id, page_token='', max_results=0):
'maxResults': str(max_results)}
if page_token:
params['pageToken'] = page_token
-
+
return self.perform_v3_request(method='GET', path='commentThreads', params=params, no_login=True)
-
+
def get_child_comments(self, parent_id, page_token='', max_results=0):
max_results = self._max_results if max_results <= 0 else max_results
@@ -653,7 +653,7 @@ def get_child_comments(self, parent_id, page_token='', max_results=0):
'maxResults': str(max_results)}
if page_token:
params['pageToken'] = page_token
-
+
return self.perform_v3_request(method='GET', path='comments', params=params, no_login=True)
def get_channel_videos(self, channel_id, page_token=''):
@@ -822,15 +822,21 @@ def _perform(_page_token, _offset, _result):
'Accept-Language': 'en-US,en;q=0.7,de;q=0.3'
}
+ session = requests.Session()
+ session.headers = headers
+ session.verify = self._verify
+ adapter = requests.adapters.HTTPAdapter(pool_maxsize=5, pool_block=True)
+ session.mount("https://", adapter)
responses = []
def fetch_xml(_url, _responses):
try:
- _response = requests.get(_url, {}, headers=headers, verify=self._verify, allow_redirects=True)
- except:
- _response = None
+ _response = session.get(_url, timeout=(3.05, 27))
+ _response.raise_for_status()
+ except requests.exceptions.RequestException as error:
+ _context.log_debug('Response: {0}'.format(error.response and error.response.text))
_context.log_error('Failed |%s|' % traceback.print_exc())
-
+ return
_responses.append(_response)
threads = []
@@ -844,15 +850,13 @@ def fetch_xml(_url, _responses):
thread.start()
for thread in threads:
- thread.join()
+ thread.join(30)
+ session.close()
for response in responses:
if response:
response.encoding = 'utf-8'
- if PY3:
- xml_data = to_unicode(response.content).replace('\n', '')
- else:
- xml_data = response.content.replace('\n', '')
+ xml_data = to_unicode(response.content).replace('\n', '')
root = ET.fromstring(xml_data)
@@ -861,14 +865,14 @@ def fetch_xml(_url, _responses):
media_ns = '{http://search.yahoo.com/mrss/}'
for entry in root.findall(ns + "entry"):
- # empty news dictionary
+ # empty news dictionary
entry_data = {
'id': entry.find(yt_ns + 'videoId').text,
'title': entry.find(media_ns + "group").find(media_ns + 'title').text,
'channel': entry.find(ns + "author").find(ns + "name").text,
'published': entry.find(ns + 'published').text,
}
- # append items list
+ # append items list
_result['items'].append(entry_data)
# sorting by publish date
@@ -1041,64 +1045,68 @@ def _perform(_playlist_idx, _page_token, _offset, _result):
return result
- def perform_v3_request(self, method='GET', headers=None, path=None, post_data=None, params=None,
- allow_redirects=True, no_login=False):
-
- yt_config = self._config
+ def _request(self, url, method='GET',
+ cookies=None, data=None, headers=None, json=None, params=None,
+ error_msg=None, raise_error=False, timeout=(3.05, 27), **_):
+ try:
+ result = requests.request(method, url,
+ verify=self._verify,
+ allow_redirects=True,
+ timeout=timeout,
+ cookies=cookies,
+ data=data,
+ headers=headers,
+ json=json,
+ params=params)
+ result.raise_for_status()
+ except requests.exceptions.RequestException as error:
+ response = error.response and error.response.text
+ _context.log_debug('Response: {0}'.format(response))
+ _context.log_error('{0}\n{1}'.format(
+ error_msg or 'Request failed', traceback.format_exc()
+ ))
+ if raise_error:
+ raise YouTubeException(error_msg) from error
+ return None
+ return result
- if not yt_config.get('key'):
- return {
- 'error':
- {
- 'errors': [{'reason': 'accessNotConfigured'}],
- 'message': 'No API keys provided'
- }
- }
+ def perform_v3_request(self, method='GET', headers=None, path=None,
+ post_data=None, params=None, no_login=False):
# params
- if not params:
- params = {}
- _params = {'key': yt_config['key']}
- _params.update(params)
+ _params = {}
# headers
- if not headers:
- headers = {}
_headers = {'Host': 'www.googleapis.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.36 Safari/537.36',
'Accept-Encoding': 'gzip, deflate'}
+
# a config can decide if a token is allowed
- if self._access_token and yt_config.get('token-allowed', True) and not no_login:
+ if self._access_token and self._config.get('token-allowed', True) and not no_login:
_headers['Authorization'] = 'Bearer %s' % self._access_token
- _headers.update(headers)
+ else:
+ _params['key'] = self._config_tv['key']
# url
_url = 'https://www.googleapis.com/youtube/v3/%s' % path.strip('/')
- result = None
- log_params = copy.deepcopy(params)
- if 'location' in log_params:
- log_params['location'] = 'xx.xxxx,xx.xxxx'
+ if headers:
+ _headers.update(headers)
+ if params:
+ _params.update(params)
+ log_params = copy.deepcopy(params)
+ if 'location' in log_params:
+ log_params['location'] = 'xx.xxxx,xx.xxxx'
+ else:
+ log_params = None
_context.log_debug('[data] v3 request: |{0}| path: |{1}| params: |{2}| post_data: |{3}|'.format(method, path, log_params, post_data))
- if method == 'GET':
- result = requests.get(_url, params=_params, headers=_headers, verify=self._verify, allow_redirects=allow_redirects)
- elif method == 'POST':
- _headers['content-type'] = 'application/json'
- result = requests.post(_url, json=post_data, params=_params, headers=_headers, verify=self._verify,
- allow_redirects=allow_redirects)
- elif method == 'PUT':
- _headers['content-type'] = 'application/json'
- result = requests.put(_url, json=post_data, params=_params, headers=_headers, verify=self._verify,
- allow_redirects=allow_redirects)
- elif method == 'DELETE':
- result = requests.delete(_url, params=_params, headers=_headers, verify=self._verify,
- allow_redirects=allow_redirects)
-
- _context.log_debug('[data] v3 response: |{0}| headers: |{1}|'.format(result.status_code, result.headers))
+ result = self._request(_url, method=method, headers=_headers, json=post_data, params=_params)
if result is None:
return {}
+ _context.log_debug('[data] v3 response: |{0}| headers: |{1}|'.format(result.status_code, result.headers))
+
if result.headers.get('content-type', '').startswith('application/json'):
try:
return result.json()
@@ -1107,20 +1115,15 @@ def perform_v3_request(self, method='GET', headers=None, path=None, post_data=No
'status_code': result.status_code,
'payload': result.text
}
-
return {}
- def perform_v1_tv_request(self, method='GET', headers=None, path=None, post_data=None, params=None,
- allow_redirects=True):
+ def perform_v1_tv_request(self, method='GET', headers=None, path=None,
+ post_data=None, params=None, no_login=False):
+
# params
- if not params:
- params = {}
- _params = {'key': self._config_tv['key']}
- _params.update(params)
+ _params = {}
# headers
- if not headers:
- headers = {}
_headers = {
'User-Agent': ('Mozilla/5.0 (Linux; Android 7.0; SM-G892A Build/NRD90M;'
' wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0'
@@ -1131,32 +1134,37 @@ def perform_v1_tv_request(self, method='GET', headers=None, path=None, post_data
'Accept-Language': 'en-US,en;q=0.5',
}
- if self._access_token_tv:
- _headers['Authorization'] = 'Bearer %s' % self._access_token_tv
- _headers.update(headers)
+ if self._access_token and self._config.get('token-allowed', True) and not no_login:
+ _headers['Authorization'] = 'Bearer %s' % self._access_token
+ else:
+ _params = {'key': self._config_tv['key']}
# url
_url = 'https://www.googleapis.com/youtubei/v1/%s' % path.strip('/')
- result = None
-
- _context.log_debug('[i] v1 request: |{0}| path: |{1}| params: |{2}| post_data: |{3}|'.format(method, path, params, post_data))
- if method == 'GET':
- result = requests.get(_url, params=_params, headers=_headers, verify=self._verify, allow_redirects=allow_redirects)
- elif method == 'POST':
- _headers['content-type'] = 'application/json'
- result = requests.post(_url, json=post_data, params=_params, headers=_headers, verify=self._verify,
- allow_redirects=allow_redirects)
- elif method == 'PUT':
- _headers['content-type'] = 'application/json'
- result = requests.put(_url, json=post_data, params=_params, headers=_headers, verify=self._verify,
- allow_redirects=allow_redirects)
- elif method == 'DELETE':
- result = requests.delete(_url, params=_params, headers=_headers, verify=self._verify,
- allow_redirects=allow_redirects)
+ if headers:
+ _headers.update(headers)
+ if params:
+ _params.update(params)
+ log_params = copy.deepcopy(params)
+ if 'location' in log_params:
+ log_params['location'] = 'xx.xxxx,xx.xxxx'
+ else:
+ log_params = None
+ _context.log_debug('[data] v1 request: |{0}| path: |{1}| params: |{2}| post_data: |{3}|'.format(method, path, log_params, post_data))
+ result = self._request(_url, method=method, headers=_headers, json=post_data, params=_params)
if result is None:
return {}
+ _context.log_debug('[data] v1 response: |{0}| headers: |{1}|'.format(result.status_code, result.headers))
+
if result.headers.get('content-type', '').startswith('application/json'):
- return result.json()
+ try:
+ return result.json()
+ except ValueError:
+ return {
+ 'status_code': result.status_code,
+ 'payload': result.text
+ }
+ return {}
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/resource_manager.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/resource_manager.py
index 3c94bfa20a..81afc78abd 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/resource_manager.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/resource_manager.py
@@ -129,7 +129,7 @@ def _update_videos(self, video_ids, live_details=False, suppress_errors=False):
self._context.log_debug('Cached data for videos |%s|' % ', '.join(list(video_data.keys())))
played_items = dict()
- if self._context.get_settings().use_playback_history():
+ if self._context.get_settings().use_local_history():
playback_history = self._context.get_playback_history()
played_items = playback_history.get_items(video_ids)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/signature/cipher.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/signature/cipher.py
index 35a4026009..8db38e1ddb 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/signature/cipher.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/signature/cipher.py
@@ -8,8 +8,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import range
-
import re
from ....kodion.utils import FunctionCache
@@ -69,11 +67,7 @@ def _load_javascript(self, javascript):
parameter = cipher_match.group('parameter').split(',')
for i in range(len(parameter)):
param = parameter[i].strip()
- if i == 0:
- param = '%SIG%'
- else:
- param = int(param)
-
+ param = '%SIG%' if i == 0 else int(param)
parameter[i] = param
# get function from object
@@ -110,30 +104,30 @@ def _load_javascript(self, javascript):
@staticmethod
def _find_signature_function_name(javascript):
- # match_patterns source is youtube-dl
- # https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L1344
+ # match_patterns source is from youtube-dl
+ # https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L1553
# LICENSE: The Unlicense
- match_patterns = [
- r'\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P[a-zA-Z0-9$]+)\(',
- r'\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P[a-zA-Z0-9$]+)\(',
- r'(?:\b|[^a-zA-Z0-9$])(?P[a-zA-Z0-9$]{2})\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)',
- r'(?P[a-zA-Z0-9$]+)\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)',
- r'(["\'])signature\1\s*,\s*(?P[a-zA-Z0-9$]+)\(',
- r'\.sig\|\|(?P[a-zA-Z0-9$]+)\(',
- r'yt\.akamaized\.net/\)\s*\|\|\s*.*?\s*[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?:encodeURIComponent\s*\()?\s*'
- r'(?P[a-zA-Z0-9$]+)\(',
- r'\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?P[a-zA-Z0-9$]+)\(',
- r'\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*(?P[a-zA-Z0-9$]+)\(',
- r'\bc\s*&&\s*a\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P[a-zA-Z0-9$]+)\(',
- r'\bc\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P[a-zA-Z0-9$]+)\(',
- r'\bc\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P[a-zA-Z0-9$]+)\('
- ]
+ match_patterns = (
+ r'\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P[a-zA-Z0-9$]+)\(',
+ r'\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P[a-zA-Z0-9$]+)\(',
+ r'\bm=(?P[a-zA-Z0-9$]{2,})\(decodeURIComponent\(h\.s\)\)',
+ r'\bc&&\(c=(?P[a-zA-Z0-9$]{2,})\(decodeURIComponent\(c\)\)',
+ r'(?:\b|[^a-zA-Z0-9$])(?P[a-zA-Z0-9$]{2,})\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)(?:;[a-zA-Z0-9$]{2}\.[a-zA-Z0-9$]{2}\(a,\d+\))?',
+ r'(?P[a-zA-Z0-9$]+)\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)',
+ # Obsolete patterns
+ r'("|\')signature\1\s*,\s*(?P[a-zA-Z0-9$]+)\(',
+ r'\.sig\|\|(?P[a-zA-Z0-9$]+)\(',
+ r'yt\.akamaized\.net/\)\s*\|\|\s*.*?\s*[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?:encodeURIComponent\s*\()?\s*(?P[a-zA-Z0-9$]+)\(',
+ r'\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?P[a-zA-Z0-9$]+)\(',
+ r'\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*(?P[a-zA-Z0-9$]+)\(',
+ r'\bc\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P[a-zA-Z0-9$]+)\('
+ )
for pattern in match_patterns:
match = re.search(pattern, javascript)
if match:
- return re.escape(match.group('name'))
+ return re.escape(match.group('sig'))
return ''
@@ -159,9 +153,8 @@ def _find_object_body(object_name, javascript):
def _get_object_function(self, object_name, function_name, javascript):
if object_name not in self._object_cache:
self._object_cache[object_name] = {}
- else:
- if function_name in self._object_cache[object_name]:
- return self._object_cache[object_name][function_name]
+ elif function_name in self._object_cache[object_name]:
+ return self._object_cache[object_name][function_name]
_object_body = self._find_object_body(object_name, javascript)
_object_body = _object_body.split('},')
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/signature/json_script_engine.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/signature/json_script_engine.py
index 17e38d188a..eac6dc8f7b 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/signature/json_script_engine.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/signature/json_script_engine.py
@@ -8,8 +8,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import range
-
class JsonScriptEngine(object):
def __init__(self, json_script):
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/subtitles.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/subtitles.py
index 0c3d63aec9..b6e0779856 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/subtitles.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/subtitles.py
@@ -6,26 +6,13 @@
See LICENSES/GPL-2.0-only for more information.
"""
+from html import unescape
+from urllib.parse import (parse_qs, urlsplit, urlunsplit, urlencode, urljoin)
+
import xbmcvfs
import requests
from ...kodion.utils import make_dirs
-from six.moves.urllib_parse import parse_qs
-from six.moves.urllib_parse import urlencode
-from six.moves.urllib_parse import urlsplit
-from six.moves.urllib_parse import urlunsplit
-
-from six import PY2
-
-try:
- from six.moves import html_parser
-
- unescape = html_parser.HTMLParser().unescape
-except AttributeError:
- import html
-
- unescape = html.unescape
-
class Subtitles(object):
LANG_NONE = 0
@@ -37,40 +24,71 @@ class Subtitles(object):
BASE_PATH = 'special://temp/plugin.video.youtube/'
SRT_FILE = ''.join([BASE_PATH, '%s.%s.srt'])
- def __init__(self, context, headers, video_id, captions):
+ def __init__(self, context, video_id, captions, headers=None):
self.context = context
self._verify = context.get_settings().verify_ssl()
self.video_id = video_id
- self.language = context.get_settings().get_string('youtube.language', 'en_US').replace('_', '-')
- self.headers = headers.copy()
+ self.language = (context.get_settings()
+ .get_string('youtube.language', 'en_US')
+ .replace('_', '-'))
+
+ if not headers and 'headers' in captions:
+ headers = captions['headers']
+ headers.pop('Authorization', None)
+ headers.pop('Content-Length', None)
+ headers.pop('Content-Type', None)
+ self.headers = headers
+
+ ui = self.context.get_ui()
+ self.prompt_override = (
+ ui.get_home_window_property('prompt_for_subtitles') == video_id
+ )
+ ui.clear_home_window_property('prompt_for_subtitles')
- self.caption_track = {}
self.renderer = captions.get('playerCaptionsTracklistRenderer', {})
self.caption_tracks = self.renderer.get('captionTracks', [])
self.translation_langs = self.renderer.get('translationLanguages', [])
- default_audio = self.renderer.get('defaultAudioTrackIndex')
- if default_audio is not None:
- audio_tracks = self.renderer.get('audioTracks', [])
+ try:
+ default_audio = self.renderer.get('defaultAudioTrackIndex')
+ default_audio = self.renderer.get('audioTracks')[default_audio]
+ except (IndexError, TypeError):
+ default_audio = None
+
+ self.defaults = {
+ 'caption': {},
+ 'lang_code': 'und',
+ 'is_asr': False,
+ }
+ if default_audio is None:
+ return
+
+ default_caption = self.renderer.get(
+ 'defaultTranslationSourceTrackIndices', [None]
+ )[0]
+
+ if default_caption is None:
+ default_caption = (
+ default_audio.get('hasDefaultTrack')
+ and default_audio.get('defaultCaptionTrackIndex')
+ )
+
+ if default_caption is None:
try:
- audio_track = audio_tracks[default_audio]
- except:
- audio_track = None
- if audio_track:
- default_caption = audio_track.get('defaultCaptionTrackIndex')
- if default_caption is None:
- default_caption = audio_track.get('captionTrackIndices')
- if (default_caption is not None) and (isinstance(default_caption, list)):
- default_caption = default_caption[0]
- if default_caption is not None:
- try:
- self.caption_track = self.caption_tracks[default_caption]
- except:
- pass
+ default_caption = default_audio.get('captionTrackIndices')[0]
+ except (IndexError, TypeError):
+ default_caption = 0
- ui = self.context.get_ui()
- self.prompt_override = ui.get_home_window_property('prompt_for_subtitles') == video_id
- ui.clear_home_window_property('prompt_for_subtitles')
+ try:
+ default_caption = self.caption_tracks[default_caption] or {}
+ except IndexError:
+ return
+
+ self.defaults = {
+ 'caption': default_caption,
+ 'lang_code': default_caption.get('languageCode') or 'und',
+ 'is_asr': default_caption.get('kind') == 'asr',
+ }
def srt_filename(self, sub_language):
return self.SRT_FILE % (self.video_id, sub_language)
@@ -100,6 +118,12 @@ def _unescape(self, text):
self.context.log_debug('Subtitle unescape: failed to unescape text')
return text
+ def get_default_lang(self):
+ return {
+ 'code': self.defaults['lang_code'],
+ 'is_asr': self.defaults['is_asr'],
+ }
+
def get_subtitles(self):
if self.prompt_override:
languages = self.LANG_PROMPT
@@ -108,19 +132,19 @@ def get_subtitles(self):
self.context.log_debug('Subtitle get_subtitles: for setting |%s|' % str(languages))
if languages == self.LANG_NONE:
return []
- elif languages == self.LANG_CURR:
+ if languages == self.LANG_CURR:
list_of_subs = []
list_of_subs.extend(self._get(self.language))
list_of_subs.extend(self._get(language=self.language.split('-')[0]))
return list(set(list_of_subs))
- elif languages == self.LANG_CURR_NO_ASR:
+ if languages == self.LANG_CURR_NO_ASR:
list_of_subs = []
list_of_subs.extend(self._get(self.language, no_asr=True))
list_of_subs.extend(self._get(language=self.language.split('-')[0], no_asr=True))
return list(set(list_of_subs))
- elif languages == self.LANG_PROMPT:
+ if languages == self.LANG_PROMPT:
return self._prompt()
- elif languages == self.LANG_CURR_FALLBACK:
+ if languages == self.LANG_CURR_FALLBACK:
list_of_subs = []
list_of_subs.extend(self._get(language=self.language))
list_of_subs.extend(self._get(language=self.language.split('-')[0]))
@@ -128,8 +152,8 @@ def get_subtitles(self):
list_of_subs.extend(self._get('en-US'))
list_of_subs.extend(self._get('en-GB'))
return list(set(list_of_subs))
- else:
- self.context.log_debug('Unknown language_enum: %s for subtitles' % str(languages))
+ self.context.log_debug('Unknown language_enum: %s for subtitles' % str(languages))
+ return []
def _get_all(self):
list_of_subs = []
@@ -145,78 +169,79 @@ def _prompt(self):
choice = self.context.get_ui().on_select(self.context.localize(30560), [language_name for language, language_name in languages])
if choice != -1:
return self._get(language=languages[choice][0], language_name=languages[choice][1])
- else:
- self.context.log_debug('Subtitle selection cancelled')
- return []
- else:
- self.context.log_debug('No subtitles found for prompt')
+ self.context.log_debug('Subtitle selection cancelled')
return []
+ self.context.log_debug('No subtitles found for prompt')
+ return []
- def _get(self, language='en', language_name=None, no_asr=False):
- fname = self.srt_filename(language)
+ def _get(self, lang_code='en', language=None, no_asr=False):
+ fname = self.srt_filename(lang_code)
if xbmcvfs.exists(fname):
- self.context.log_debug('Subtitle exists for: %s, filename: %s' % (language, fname))
+ self.context.log_debug('Subtitle exists for: %s, filename: %s' % (lang_code, fname))
return [fname]
caption_track = None
asr_track = None
has_translation = False
for track in self.caption_tracks:
- if language == track.get('languageCode'):
- if language_name is not None:
- if language_name == self._get_language_name(track):
+ if lang_code == track.get('languageCode'):
+ if language is not None:
+ if language == self._get_language_name(track):
caption_track = track
break
+ elif no_asr and (track.get('kind') == 'asr'):
+ continue
+ elif track.get('kind') == 'asr':
+ asr_track = track
else:
- if no_asr and (track.get('kind') == 'asr'):
- continue
- elif track.get('kind') == 'asr':
- asr_track = track
- else:
- caption_track = track
+ caption_track = track
if (caption_track is None) and (asr_track is not None):
caption_track = asr_track
for lang in self.translation_langs:
- if language == lang.get('languageCode'):
+ if lang_code == lang.get('languageCode'):
has_translation = True
break
- if (self.caption_track.get('languageCode') != language) and (not has_translation) and (caption_track is None):
- self.context.log_debug('No subtitles found for: %s' % language)
+ if (lang_code != self.defaults['lang_code'] and not has_translation
+ and caption_track is None):
+ self.context.log_debug('No subtitles found for: %s' % lang_code)
return []
subtitle_url = None
- if (caption_track is None) and has_translation:
- base_url = self.caption_track.get('baseUrl')
- if base_url:
- subtitle_url = self.set_query_param(base_url, 'type', 'track')
- subtitle_url = self.set_query_param(subtitle_url, 'tlang', language)
- elif caption_track is not None:
- base_url = caption_track.get('baseUrl')
- if base_url:
- subtitle_url = self.set_query_param(base_url, 'type', 'track')
+ if caption_track is not None:
+ base_url = self._normalize_url(caption_track.get('baseUrl'))
+ has_translation = False
+ elif has_translation:
+ base_url = self._normalize_url(
+ self.defaults['caption'].get('baseUrl')
+ )
+ else:
+ base_url = None
+
+ if base_url:
+ subtitle_url = self._set_query_param(base_url,
+ ('type', 'track'),
+ ('fmt', 'vtt'),
+ ('tlang', lang_code) if has_translation else (None, None),
+ )
if subtitle_url:
- subtitle_url = self.set_query_param(subtitle_url, 'fmt', 'vtt')
self.context.log_debug('Subtitle url: %s' % subtitle_url)
if not self.context.get_settings().subtitle_download():
return [subtitle_url]
- else:
- result_auto = requests.get(subtitle_url, headers=self.headers,
- verify=self._verify, allow_redirects=True)
-
- if result_auto.text:
- self.context.log_debug('Subtitle found for: %s' % language)
- self._write_file(fname, bytearray(self._unescape(result_auto.text), encoding='utf8', errors='ignore'))
- return [fname]
- else:
- self.context.log_debug('Failed to retrieve subtitles for: %s' % language)
- return []
- else:
- self.context.log_debug('No subtitles found for: %s' % language)
+ result_auto = requests.get(subtitle_url, headers=self.headers,
+ verify=self._verify, allow_redirects=True)
+
+ if result_auto.text:
+ self.context.log_debug('Subtitle found for: %s' % lang_code)
+ self._write_file(fname, bytearray(self._unescape(result_auto.text), encoding='utf8', errors='ignore'))
+ return [fname]
+ self.context.log_debug('Failed to retrieve subtitles for: %s' % lang_code)
return []
+ self.context.log_debug('No subtitles found for: %s' % lang_code)
+ return []
def _get_language_name(self, track):
key = 'languageName' if 'languageName' in track else 'name'
@@ -233,19 +258,43 @@ def _get_language_name(self, track):
@staticmethod
def _recode_language_name(language_name):
- if PY2:
- language_name = language_name.encode('utf-8')
-
return language_name
@staticmethod
- def set_query_param(url, name, value):
+ def _set_query_param(url, *pairs):
+ if not url or not pairs:
+ return url
+
+ num_params = len(pairs)
+ if not num_params:
+ return url
+ if not isinstance(pairs[0], (list, tuple)):
+ if num_params >= 2:
+ pairs = zip(*[iter(pairs)] * 2)
+ else:
+ return url
+
scheme, netloc, path, query_string, fragment = urlsplit(url)
query_params = parse_qs(query_string)
- query_params[name] = [value]
+ for name, value in pairs:
+ if name:
+ query_params[name] = [value]
+
new_query_string = urlencode(query_params, doseq=True)
if isinstance(scheme, bytes):
new_query_string = new_query_string.encode('utf-8')
return urlunsplit((scheme, netloc, path, new_query_string, fragment))
+
+ @staticmethod
+ def _normalize_url(url):
+ if not url:
+ url = ''
+ elif url.startswith(('http://', 'https://')):
+ pass
+ elif url.startswith('//'):
+ url = urljoin('https:', url)
+ elif url.startswith('/'):
+ url = urljoin('https://www.youtube.com', url)
+ return url
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/tv.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/tv.py
index 02538ea977..c9818f924d 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/tv.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/tv.py
@@ -8,8 +8,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import PY2
-
from ... import kodion
from ...youtube.helper import utils
from ...kodion.items.video_item import VideoItem
@@ -34,8 +32,6 @@ def my_subscriptions_to_items(provider, context, json_data, do_filter=False):
for item in items:
channel = item['channel'].lower()
channel = channel.replace(',', '')
- if PY2:
- channel = channel.encode('utf-8', 'ignore')
if not do_filter or (do_filter and (not black_list) and (channel in filter_list)) or \
(do_filter and black_list and (channel not in filter_list)):
video_id = item['id']
@@ -50,7 +46,7 @@ def my_subscriptions_to_items(provider, context, json_data, do_filter=False):
video_id_dict[video_id] = video_item
- use_play_data = not incognito and context.get_settings().use_playback_history()
+ use_play_data = not incognito and context.get_settings().use_local_history()
channel_item_dict = {}
utils.update_video_infos(provider, context, video_id_dict, channel_items_dict=channel_item_dict, use_play_data=use_play_data)
@@ -96,7 +92,7 @@ def tv_videos_to_items(provider, context, json_data):
video_id_dict[video_id] = video_item
- use_play_data = not incognito and context.get_settings().use_playback_history()
+ use_play_data = not incognito and context.get_settings().use_local_history()
channel_item_dict = {}
utils.update_video_infos(provider, context, video_id_dict, channel_items_dict=channel_item_dict, use_play_data=use_play_data)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_resolver.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_resolver.py
index 7a1b1df798..2d09a41392 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_resolver.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_resolver.py
@@ -8,9 +8,12 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import urllib
-
import re
+from urllib.parse import parse_qsl
+from urllib.parse import urlparse
+from urllib.parse import parse_qs
+from urllib.parse import urlunsplit
+from urllib.parse import urlencode
from ...kodion.utils import FunctionCache
from ...kodion import Context as _Context
@@ -73,7 +76,7 @@ def _load_page(_url):
return _url
if url_components.path.lower() == '/redirect':
- params = dict(urllib.parse.parse_qsl(url_components.query))
+ params = dict(parse_qsl(url_components.query))
return params['q']
if url_components.path.lower().startswith('/user'):
@@ -114,7 +117,7 @@ def _loop(_url, tries=5):
location = headers.get('location', '')
# validate the location - some server returned garbage
- _url_components = urllib.parse.urlparse(location)
+ _url_components = urlparse(location)
if not _url_components.scheme and not _url_components.hostname:
return url
@@ -132,17 +135,17 @@ def _loop(_url, tries=5):
return _loop(location, tries=tries - 1)
if response.status_code == 200:
- _url_components = urllib.parse.urlparse(_url)
+ _url_components = urlparse(_url)
if _url_components.path == '/supported_browsers':
# "sometimes", we get a redirect through an URL of the form https://.../supported_browsers?next_url=&further=paramaters&stuck=here
# put together query string from both what's encoded inside next_url and the remaining paramaters of this URL...
- _query = urllib.parse.parse_qs(_url_components.query) # top-level query string
- _nc = urllib.parse.urlparse(_query['next_url'][0]) # components of next_url
- _next_query = urllib.parse.parse_qs(_nc.query) # query string encoded inside next_url
+ _query = parse_qs(_url_components.query) # top-level query string
+ _nc = urlparse(_query['next_url'][0]) # components of next_url
+ _next_query = parse_qs(_nc.query) # query string encoded inside next_url
del _query['next_url'] # remove next_url from top level query string
_next_query.update(_query) # add/overwrite all other params from top level query string
_next_query = dict(map(lambda kv : (kv[0], kv[1][0]), _next_query.items())) # flatten to only use first argument of each param
- _next_url = urllib.parse.urlunsplit((_nc.scheme, _nc.netloc, _nc.path, urllib.parse.urlencode(_next_query), _nc.fragment)) # build new URL from these components
+ _next_url = urlunsplit((_nc.scheme, _nc.netloc, _nc.path, urlencode(_next_query), _nc.fragment)) # build new URL from these components
return _next_url
except:
@@ -171,7 +174,7 @@ def clear(self):
def _resolve(self, url):
# try one of the resolver
- url_components = urllib.parse.urlparse(url)
+ url_components = urlparse(url)
for resolver in self._resolver:
if resolver.supports_url(url, url_components):
resolved_url = resolver.resolve(url, url_components)
@@ -179,7 +182,7 @@ def _resolve(self, url):
# one last check...sometimes the resolved url is YouTube-specific and can be resolved again or
# simplified.
- url_components = urllib.parse.urlparse(resolved_url)
+ url_components = urlparse(resolved_url)
if resolver is not self._youtube_resolver and self._youtube_resolver.supports_url(resolved_url, url_components):
return self._youtube_resolver.resolve(resolved_url, url_components)
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_to_item_converter.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_to_item_converter.py
index 31bc6e7d65..b8859d7cb4 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_to_item_converter.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_to_item_converter.py
@@ -8,9 +8,10 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import urllib
-
import re
+from urllib.parse import urlparse
+from urllib.parse import parse_qsl
+
from ...kodion.items import VideoItem, DirectoryItem
from . import utils
@@ -34,9 +35,9 @@ def __init__(self, flatten=True):
self._channel_ids = []
def add_url(self, url, provider, context):
- url_components = urllib.parse.urlparse(url)
+ url_components = urlparse(url)
if url_components.hostname.lower() in ('youtube.com', 'www.youtube.com', 'm.youtube.com'):
- params = dict(urllib.parse.parse_qsl(url_components.query))
+ params = dict(parse_qsl(url_components.query))
if url_components.path.lower() == '/watch':
video_id = params.get('v', '')
if video_id:
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/utils.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/utils.py
index 88a7fb7f54..734e0a12fa 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/utils.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/utils.py
@@ -8,8 +8,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import PY2
-
import re
import time
@@ -143,8 +141,6 @@ def update_channel_infos(provider, context, channel_id_dict, subscription_id_dic
if context.get_path() == '/subscriptions/list/':
channel = title.lower()
channel = channel.replace(',', '')
- if PY2:
- channel = channel.encode('utf-8', 'ignore')
if channel in filter_list:
yt_context_menu.append_remove_my_subscriptions_filter(context_menu, provider, context, title)
else:
@@ -479,8 +475,8 @@ def update_play_info(provider, context, video_id, video_item, video_stream, use_
if 'headers' in video_stream:
video_item.set_headers(video_stream['headers'])
- # set uses_dash
- video_item.set_use_dash(settings.use_dash())
+ # set uses_mpd
+ video_item.set_use_mpd_video(settings.use_mpd_videos())
license_info = video_stream.get('license_info', {})
@@ -686,8 +682,10 @@ def filter_short_videos(context, items):
shorts_filtered = []
for item in items:
- if hasattr(item, '_duration') and (0 < item.get_duration() <= 60):
- continue
+ if hasattr(item, '_duration'):
+ item_duration = 0 if item.get_duration() is None else item.get_duration()
+ if 0 < item_duration <= 60:
+ continue
shorts_filtered += [item]
return shorts_filtered
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/v3.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/v3.py
index 6f2a9e7a76..b0427088fc 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/v3.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/v3.py
@@ -266,7 +266,7 @@ def _process_list_response(provider, context, json_data):
else:
raise kodion.KodionException("Unknown kind '%s'" % kind)
- use_play_data = not incognito and context.get_settings().use_playback_history()
+ use_play_data = not incognito and context.get_settings().use_local_history()
# this will also update the channel_id_dict with the correct channel id for each video.
channel_items_dict = {}
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/video_info.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/video_info.py
index 54ff9835e8..8bdbc6e632 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/video_info.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/video_info.py
@@ -8,29 +8,23 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import range
-from six import PY2
-from six.moves import urllib
-
-try:
- from six.moves import html_parser
-
- unescape = html_parser.HTMLParser().unescape
-except AttributeError:
- from html import unescape
-
-import copy
import re
-import json
import random
import traceback
+from json import dumps as json_dumps, loads as json_loads
+from html import unescape
+from urllib.parse import (parse_qs, urlsplit, urlunsplit, urlencode, urljoin,
+ quote, unquote)
+
import requests
+import xbmcvfs
+
from ...kodion.utils import is_httpd_live, make_dirs, DataCache
from ..youtube_exceptions import YouTubeException
from .subtitles import Subtitles
-
-import xbmcvfs
+from .ratebypass import ratebypass
+from .signature.cipher import Cipher
class VideoInfo(object):
@@ -38,7 +32,7 @@ class VideoInfo(object):
# === Non-DASH ===
'5': {'container': 'flv',
'title': '240p',
- 'sort': [240, 0],
+ 'sort': [-240, 0],
'video': {'height': 240, 'encoding': 'h.263'},
'audio': {'bitrate': 64, 'encoding': 'mp3'}},
'6': {'container': 'flv', # Discontinued
@@ -51,17 +45,17 @@ class VideoInfo(object):
'audio': {'encoding': 'aac'}},
'17': {'container': '3gp',
'title': '144p',
- 'sort': [144, -20],
+ 'sort': [-144, 20],
'video': {'height': 144, 'encoding': 'mpeg-4'},
'audio': {'bitrate': 24, 'encoding': 'aac'}},
'18': {'container': 'mp4',
'title': '360p',
- 'sort': [360, 0],
+ 'sort': [-360, 0],
'video': {'height': 360, 'encoding': 'h.264'},
'audio': {'bitrate': 96, 'encoding': 'aac'}},
'22': {'container': 'mp4',
'title': '720p',
- 'sort': [720, 0],
+ 'sort': [-720, 0],
'video': {'height': 720, 'encoding': 'h.264'},
'audio': {'bitrate': 192, 'encoding': 'aac'}},
'34': {'container': 'flv', # Discontinued
@@ -74,22 +68,22 @@ class VideoInfo(object):
'audio': {'bitrate': 128, 'encoding': 'aac'}},
'36': {'container': '3gp',
'title': '240p',
- 'sort': [240, -20],
+ 'sort': [-240, 20],
'video': {'height': 240, 'encoding': 'mpeg-4'},
'audio': {'bitrate': 32, 'encoding': 'aac'}},
'37': {'container': 'mp4',
'title': '1080p',
- 'sort': [1080, 0],
+ 'sort': [-1080, 0],
'video': {'height': 1080, 'encoding': 'h.264'},
'audio': {'bitrate': 192, 'encoding': 'aac'}},
'38': {'container': 'mp4',
'title': '3072p',
- 'sort': [3072, 0],
+ 'sort': [-3072, 0],
'video': {'height': 3072, 'encoding': 'h.264'},
'audio': {'bitrate': 192, 'encoding': 'aac'}},
'43': {'container': 'webm',
'title': '360p',
- 'sort': [360, -1],
+ 'sort': [-360, 1],
'video': {'height': 360, 'encoding': 'vp8'},
'audio': {'bitrate': 128, 'encoding': 'vorbis'}},
'44': {'container': 'webm', # Discontinued
@@ -106,50 +100,50 @@ class VideoInfo(object):
'audio': {'bitrate': 192, 'encoding': 'vorbis'}},
'59': {'container': 'mp4',
'title': '480p',
- 'sort': [480, 0],
+ 'sort': [-480, 0],
'video': {'height': 480, 'encoding': 'h.264'},
'audio': {'bitrate': 96, 'encoding': 'aac'}},
'78': {'container': 'mp4',
'title': '360p',
- 'sort': [360, 0],
+ 'sort': [-360, 0],
'video': {'height': 360, 'encoding': 'h.264'},
'audio': {'bitrate': 96, 'encoding': 'aac'}},
# === 3D ===
'82': {'container': 'mp4',
'3D': True,
'title': '3D@360p',
- 'sort': [360, 0],
+ 'sort': [-360, 0],
'video': {'height': 360, 'encoding': 'h.264'},
'audio': {'bitrate': 96, 'encoding': 'aac'}},
'83': {'container': 'mp4',
'3D': True,
'title': '3D@240p',
- 'sort': [240, 0],
+ 'sort': [-240, 0],
'video': {'height': 240, 'encoding': 'h.264'},
'audio': {'bitrate': 96, 'encoding': 'aac'}},
'84': {'container': 'mp4',
'3D': True,
'title': '3D@720p',
- 'sort': [720, 0],
+ 'sort': [-720, 0],
'video': {'height': 720, 'encoding': 'h.264'},
'audio': {'bitrate': 192, 'encoding': 'aac'}},
'85': {'container': 'mp4',
'3D': True,
'title': '3D@1080p',
- 'sort': [1080, 0],
+ 'sort': [-1080, 0],
'video': {'height': 1080, 'encoding': 'h.264'},
'audio': {'bitrate': 192, 'encoding': 'aac'}},
'100': {'container': 'webm',
'3D': True,
'title': '3D@360p',
- 'sort': [360, -1],
+ 'sort': [-360, 1],
'video': {'height': 360, 'encoding': 'vp8'},
'audio': {'bitrate': 128, 'encoding': 'vorbis'}},
'101': {'container': 'webm', # Discontinued
'discontinued': True,
'3D': True,
'title': '3D@360p',
- 'sort': [360, -1],
+ 'sort': [-360, 1],
'video': {'height': 360, 'encoding': 'vp8'},
'audio': {'bitrate': 192, 'encoding': 'vorbis'}},
'102': {'container': 'webm', # Discontinued
@@ -161,44 +155,44 @@ class VideoInfo(object):
'91': {'container': 'ts',
'Live': True,
'title': 'Live@144p',
- 'sort': [144, 0],
+ 'sort': [-144, 0],
'video': {'height': 144, 'encoding': 'h.264'},
'audio': {'bitrate': 48, 'encoding': 'aac'}},
'92': {'container': 'ts',
'Live': True,
'title': 'Live@240p',
- 'sort': [240, 0],
+ 'sort': [-240, 0],
'video': {'height': 240, 'encoding': 'h.264'},
'audio': {'bitrate': 48, 'encoding': 'aac'}},
'93': {'container': 'ts',
'Live': True,
'title': 'Live@360p',
- 'sort': [360, 0],
+ 'sort': [-360, 0],
'video': {'height': 360, 'encoding': 'h.264'},
'audio': {'bitrate': 128, 'encoding': 'aac'}},
'94': {'container': 'ts',
'Live': True,
'title': 'Live@480p',
- 'sort': [480, 0],
+ 'sort': [-480, 0],
'video': {'height': 480, 'encoding': 'h.264'},
'audio': {'bitrate': 128, 'encoding': 'aac'}},
'95': {'container': 'ts',
'Live': True,
'title': 'Live@720p',
- 'sort': [720, 0],
+ 'sort': [-720, 0],
'video': {'height': 720, 'encoding': 'h.264'},
'audio': {'bitrate': 256, 'encoding': 'aac'}},
'96': {'container': 'ts',
'Live': True,
'title': 'Live@1080p',
- 'sort': [1080, 0],
+ 'sort': [-1080, 0],
'video': {'height': 1080, 'encoding': 'h.264'},
'audio': {'bitrate': 256, 'encoding': 'aac'}},
'120': {'container': 'flv', # Discontinued
'discontinued': True,
'Live': True,
'title': 'Live@720p',
- 'sort': [720, -10],
+ 'sort': [-720, 10],
'video': {'height': 720, 'encoding': 'h.264'},
'audio': {'bitrate': 128, 'encoding': 'aac'}},
'127': {'container': 'ts',
@@ -210,26 +204,26 @@ class VideoInfo(object):
'132': {'container': 'ts',
'Live': True,
'title': 'Live@240p',
- 'sort': [240, 0],
+ 'sort': [-240, 0],
'video': {'height': 240, 'encoding': 'h.264'},
'audio': {'bitrate': 48, 'encoding': 'aac'}},
'151': {'container': 'ts',
'Live': True,
'unsupported': True,
'title': 'Live@72p',
- 'sort': [72, 0],
+ 'sort': [-72, 0],
'video': {'height': 72, 'encoding': 'h.264'},
'audio': {'bitrate': 24, 'encoding': 'aac'}},
'300': {'container': 'ts',
'Live': True,
'title': 'Live@720p',
- 'sort': [720, 0],
+ 'sort': [-720, 0],
'video': {'height': 720, 'encoding': 'h.264'},
'audio': {'bitrate': 128, 'encoding': 'aac'}},
'301': {'container': 'ts',
'Live': True,
'title': 'Live@1080p',
- 'sort': [1080, 0],
+ 'sort': [-1080, 0],
'video': {'height': 1080, 'encoding': 'h.264'},
'audio': {'bitrate': 128, 'encoding': 'aac'}},
# === DASH (video only)
@@ -297,9 +291,10 @@ class VideoInfo(object):
'271': {'container': 'webm',
'dash/video': True,
'video': {'height': 1440, 'encoding': 'vp9'}},
- '272': {'container': 'webm',
+ '272': {'container': 'webm', # was VP9 2160p30
'dash/video': True,
- 'video': {'height': 2160, 'encoding': 'vp9'}},
+ 'fps': 60,
+ 'video': {'height': 4320, 'encoding': 'vp9'}},
'278': {'container': 'webm',
'dash/video': True,
'video': {'height': 144, 'encoding': 'vp9'}},
@@ -370,16 +365,6 @@ class VideoInfo(object):
'fps': 60,
'hdr': True,
'video': {'height': 2160, 'encoding': 'vp9.2'}},
- '400': {'container': 'mp4',
- 'dash/video': True,
- 'fps': 60,
- 'hdr': True,
- 'video': {'height': 1440, 'encoding': 'av1'}},
- '401': {'container': 'mp4',
- 'dash/video': True,
- 'fps': 60,
- 'hdr': True,
- 'video': {'height': 2160, 'encoding': 'av1'}},
'394': {'container': 'mp4',
'dash/video': True,
'fps': 30,
@@ -404,77 +389,171 @@ class VideoInfo(object):
'dash/video': True,
'fps': 30,
'video': {'height': 1080, 'encoding': 'av1'}},
+ '400': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 30,
+ 'video': {'height': 1440, 'encoding': 'av1'}},
+ '401': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 30,
+ 'video': {'height': 2160, 'encoding': 'av1'}},
+ '402': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 30,
+ 'video': {'height': 4320, 'encoding': 'av1'}},
+ '571': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 30,
+ 'video': {'height': 4320, 'encoding': 'av1'}},
+ '694': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 60,
+ 'hdr': True,
+ 'video': {'height': 144, 'encoding': 'av1'}},
+ '695': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 60,
+ 'hdr': True,
+ 'video': {'height': 240, 'encoding': 'av1'}},
+ '696': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 60,
+ 'hdr': True,
+ 'video': {'height': 360, 'encoding': 'av1'}},
+ '697': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 60,
+ 'hdr': True,
+ 'video': {'height': 480, 'encoding': 'av1'}},
+ '698': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 60,
+ 'hdr': True,
+ 'video': {'height': 720, 'encoding': 'av1'}},
+ '699': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 60,
+ 'hdr': True,
+ 'video': {'height': 1080, 'encoding': 'av1'}},
+ '700': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 60,
+ 'hdr': True,
+ 'video': {'height': 1440, 'encoding': 'av1'}},
+ '701': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 60,
+ 'hdr': True,
+ 'video': {'height': 2160, 'encoding': 'av1'}},
+ '702': {'container': 'mp4',
+ 'dash/video': True,
+ 'fps': 60,
+ 'hdr': True,
+ 'video': {'height': 4320, 'encoding': 'av1'}},
# === Dash (audio only)
'139': {'container': 'mp4',
- 'sort': [48, 0],
- 'title': 'aac@48',
+ 'sort': [0, -48 * 0.9],
+ 'title': 'he-aac@48',
'dash/audio': True,
'audio': {'bitrate': 48, 'encoding': 'aac'}},
'140': {'container': 'mp4',
- 'sort': [129, 0],
- 'title': 'aac@128',
+ 'sort': [0, -128 * 0.9],
+ 'title': 'aac-lc@128',
'dash/audio': True,
'audio': {'bitrate': 128, 'encoding': 'aac'}},
'141': {'container': 'mp4',
- 'sort': [143, 0],
- 'title': 'aac@256',
+ 'sort': [0, -256 * 0.9],
+ 'title': 'aac-lc@256',
'dash/audio': True,
'audio': {'bitrate': 256, 'encoding': 'aac'}},
'256': {'container': 'mp4',
- 'title': 'aac/itag 256',
+ 'sort': [0, -192 * 0.9],
+ 'title': 'he-aac@192',
'dash/audio': True,
- 'unsupported': True,
- 'audio': {'bitrate': 0, 'encoding': 'aac'}},
+ 'audio': {'bitrate': 192, 'encoding': 'aac'}},
'258': {'container': 'mp4',
- 'title': 'aac/itag 258',
+ 'sort': [0, -384 * 0.9],
+ 'title': 'aac-lc@384',
'dash/audio': True,
- 'unsupported': True,
- 'audio': {'bitrate': 0, 'encoding': 'aac'}},
+ 'audio': {'bitrate': 384, 'encoding': 'aac'}},
'325': {'container': 'mp4',
- 'title': 'dtse/itag 325',
+ 'sort': [0, -384 * 1.3],
+ 'title': 'dtse@384',
'dash/audio': True,
- 'unsupported': True,
- 'audio': {'bitrate': 0, 'encoding': 'aac'}},
+ 'audio': {'bitrate': 384, 'encoding': 'dtse'}},
+ '327': {'container': 'mp4',
+ 'sort': [0, -256 * 0.9],
+ 'title': 'aac-lc@256',
+ 'dash/audio': True,
+ 'audio': {'bitrate': 256, 'encoding': 'aac'}},
'328': {'container': 'mp4',
- 'title': 'ec-3/itag 328',
+ 'sort': [0, -384 * 1.2],
+ 'title': 'ec-3@384',
'dash/audio': True,
- 'unsupported': True,
- 'audio': {'bitrate': 0, 'encoding': 'aac'}},
+ 'audio': {'bitrate': 384, 'encoding': 'ec-3'}},
'171': {'container': 'webm',
- 'sort': [128, 0],
+ 'sort': [0, -128 * 0.75],
'title': 'vorbis@128',
'dash/audio': True,
'audio': {'bitrate': 128, 'encoding': 'vorbis'}},
'172': {'container': 'webm',
- 'sort': [142, 0],
+ 'sort': [0, -192 * 0.75],
'title': 'vorbis@192',
'dash/audio': True,
'audio': {'bitrate': 192, 'encoding': 'vorbis'}},
'249': {'container': 'webm',
- 'sort': [50, 0],
+ 'sort': [0, -50],
'title': 'opus@50',
'dash/audio': True,
'audio': {'bitrate': 50, 'encoding': 'opus'}},
'250': {'container': 'webm',
- 'sort': [70, 0],
+ 'sort': [0, -70],
'title': 'opus@70',
'dash/audio': True,
'audio': {'bitrate': 70, 'encoding': 'opus'}},
'251': {'container': 'webm',
- 'sort': [141, 0],
+ 'sort': [0, -160],
'title': 'opus@160',
'dash/audio': True,
'audio': {'bitrate': 160, 'encoding': 'opus'}},
+ '338': {'container': 'webm',
+ 'sort': [0, -480],
+ 'title': 'opus@480',
+ 'dash/audio': True,
+ 'audio': {'bitrate': 480, 'encoding': 'opus'}},
+ '380': {'container': 'mp4',
+ 'sort': [0, -384 * 1.1],
+ 'title': 'ac-3@384',
+ 'dash/audio': True,
+ 'audio': {'bitrate': 384, 'encoding': 'ac-3'}},
+ # === Live HLS
+ '9995': {'container': 'hls',
+ 'Live': True,
+ 'sort': [-1080, -1],
+ 'title': 'Live HLS',
+ 'hls/audio': True,
+ 'hls/video': True,
+ 'audio': {'bitrate': 0, 'encoding': 'aac'},
+ 'video': {'height': 0, 'encoding': 'h.264'}},
+ # === Live HLS adaptive
+ '9996': {'container': 'hls',
+ 'Live': True,
+ 'sort': [-1080, -1],
+ 'title': 'Adaptive Live HLS',
+ 'hls/audio': True,
+ 'hls/video': True,
+ 'audio': {'bitrate': 0, 'encoding': 'aac'},
+ 'video': {'height': 0, 'encoding': 'h.264'}},
# === DASH adaptive audio only
'9997': {'container': 'mpd',
- 'sort': [-1, 0],
+ 'sort': [1, 0],
'title': 'DASH Audio',
'dash/audio': True,
'audio': {'bitrate': 0, 'encoding': ''}},
# === Live DASH adaptive
'9998': {'container': 'mpd',
'Live': True,
- 'sort': [1080, 1],
+ 'sort': [-1080, -1],
'title': 'Live DASH',
'dash/audio': True,
'dash/video': True,
@@ -482,7 +561,7 @@ class VideoInfo(object):
'video': {'height': 0, 'encoding': ''}},
# === DASH adaptive
'9999': {'container': 'mpd',
- 'sort': [1080, 1],
+ 'sort': [-1080, -1],
'title': 'DASH',
'dash/audio': True,
'dash/video': True,
@@ -490,472 +569,997 @@ class VideoInfo(object):
'video': {'height': 0, 'encoding': ''}}
}
- # Headers from the "Galaxy S9/S9+" profile of the Firefox "Responsive Design Mode".
- MOBILE_HEADERS = {
- 'User-Agent': ('Mozilla/5.0 (Linux; Android 7.0; SM-G892A Build/NRD90M;'
- ' wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0'
- ' Chrome/67.0.3396.87 Mobile Safari/537.36'),
- 'Accept': '*/*',
- 'DNT': '1',
- 'Accept-Encoding': 'gzip, deflate',
- 'Accept-Language': 'en-US,en;q=0.5'
+ CLIENTS = {
+ # 4k no VP9 HDR
+ # Limited subtitle availability
+ 'android_testsuite': {
+ '_id': 30,
+ '_query_subtitles': True,
+ 'json': {
+ 'context': {
+ 'client': {
+ 'clientName': 'ANDROID_TESTSUITE',
+ 'clientVersion': '1.9',
+ 'androidSdkVersion': '29',
+ 'osName': 'Android',
+ 'osVersion': '10',
+ 'platform': 'MOBILE',
+ },
+ },
+ },
+ 'headers': {
+ 'User-Agent': ('com.google.android.youtube/'
+ '{json[context][client][clientVersion]}'
+ ' (Linux; U; {json[context][client][osName]}'
+ ' {json[context][client][osVersion]};'
+ ' {json[context][client][gl]}) gzip'),
+ 'X-YouTube-Client-Name': '{_id}',
+ 'X-YouTube-Client-Version': '{json[context][client][clientVersion]}',
+ },
+ 'params': {
+ 'key': 'AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w',
+ },
+ },
+ 'android': {
+ '_id': 3,
+ 'json': {
+ 'params': 'CgIQBg==',
+ 'context': {
+ 'client': {
+ 'clientName': 'ANDROID',
+ 'clientVersion': '17.31.35',
+ 'androidSdkVersion': '30',
+ 'osName': 'Android',
+ 'osVersion': '11',
+ 'platform': 'MOBILE',
+ },
+ },
+ },
+ 'headers': {
+ 'User-Agent': ('com.google.android.youtube/'
+ '{json[context][client][clientVersion]}'
+ ' (Linux; U; {json[context][client][osName]}'
+ ' {json[context][client][osVersion]};'
+ ' {json[context][client][gl]}) gzip'),
+ 'X-YouTube-Client-Name': '{_id}',
+ 'X-YouTube-Client-Version': '{json[context][client][clientVersion]}',
+ },
+ 'params': {
+ 'key': 'AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w',
+ },
+ },
+ # Only for videos that allow embedding
+ # Limited to 720p on some videos
+ 'android_embedded': {
+ '_id': 55,
+ 'json': {
+ 'context': {
+ 'client': {
+ 'clientName': 'ANDROID_EMBEDDED_PLAYER',
+ 'clientVersion': '17.36.4',
+ 'clientScreen': 'EMBED',
+ 'androidSdkVersion': '29',
+ 'osName': 'Android',
+ 'osVersion': '10',
+ 'platform': 'MOBILE',
+ },
+ },
+ 'thirdParty': {
+ 'embedUrl': 'https://www.youtube.com/embed/{json[videoId]}',
+ },
+ },
+ 'headers': {
+ 'User-Agent': ('com.google.android.youtube/'
+ '{json[context][client][clientVersion]}'
+ ' (Linux; U; {json[context][client][osName]}'
+ ' {json[context][client][osVersion]};'
+ ' {json[context][client][gl]}) gzip'),
+ 'X-YouTube-Client-Name': '{_id}',
+ 'X-YouTube-Client-Version': '{json[context][client][clientVersion]}',
+ },
+ 'params': {
+ 'key': 'AIzaSyCjc_pVEDi4qsv5MtC2dMXzpIaDoRFLsxw',
+ },
+ },
+ # 4k with HDR
+ # Some videos block this client, may also require embedding enabled
+ # Limited subtitle availability
+ 'android_youtube_tv': {
+ '_id': 29,
+ '_query_subtitles': True,
+ 'json': {
+ 'context': {
+ 'client': {
+ 'clientName': 'ANDROID_UNPLUGGED',
+ 'clientVersion': '6.36',
+ 'androidSdkVersion': '29',
+ 'osName': 'Android',
+ 'osVersion': '10',
+ 'platform': 'MOBILE',
+ },
+ },
+ },
+ 'headers': {
+ 'User-Agent': ('com.google.android.apps.youtube.unplugged/'
+ '{json[context][client][clientVersion]}'
+ ' (Linux; U; {json[context][client][osName]}'
+ ' {json[context][client][osVersion]};'
+ ' {json[context][client][gl]}) gzip'),
+ 'X-YouTube-Client-Name': '{_id}',
+ 'X-YouTube-Client-Version': '{json[context][client][clientVersion]}',
+ },
+ 'params': {
+ 'key': 'AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w',
+ },
+ },
+ 'ios': {
+ '_id': 5,
+ 'json': {
+ 'context': {
+ 'client': {
+ 'clientName': 'IOS',
+ 'clientVersion': '17.33.2',
+ 'deviceModel': 'iPhone14,3',
+ 'osName': 'iOS',
+ 'osVersion': '15_6',
+ 'platform': 'MOBILE',
+ },
+ },
+ },
+ 'headers': {
+ 'User-Agent': ('com.google.ios.youtube/'
+ '{json[context][client][clientVersion]}'
+ ' ({json[context][client][deviceModel]};'
+ ' U; CPU {json[context][client][osName]}'
+ ' {json[context][client][osVersion]}'
+ ' like Mac OS X)'),
+ 'X-YouTube-Client-Name': '{_id}',
+ 'X-YouTube-Client-Version': '{json[context][client][clientVersion]}',
+ },
+ 'params': {
+ 'key': 'AIzaSyB-63vPrdThhKuerbB2N_l7Kwwcxj6yUAc',
+ },
+ },
+ # Used to requests captions for clients that don't provide them
+ # Requires handling of nsig to overcome throttling (TODO)
+ 'smarttv': {
+ '_id': 75,
+ 'json': {
+ 'context': {
+ 'client': {
+ 'clientName': 'TVHTML5_SIMPLY',
+ 'clientVersion': '1.0',
+ },
+ },
+ },
+ # Headers from a 2022 Samsung Tizen 6.5 based Smart TV
+ 'headers': {
+ 'User-Agent': ('Mozilla/5.0 (SMART-TV; LINUX; Tizen 6.5)'
+ ' AppleWebKit/537.36 (KHTML, like Gecko)'
+ ' 85.0.4183.93/6.5 TV Safari/537.36'),
+ },
+ 'params': {
+ 'key': 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8',
+ },
+ },
+ # Used for misc api requests by default
+ # Requires handling of nsig to overcome throttling (TODO)
+ 'web': {
+ '_id': 1,
+ 'json': {
+ 'context': {
+ 'client': {
+ 'clientName': 'WEB',
+ 'clientVersion': '2.20220801.00.00',
+ },
+ },
+ },
+ # Headers for a "Galaxy S20 Ultra" from Chrome dev tools device
+ # emulation
+ 'headers': {
+ 'User-Agent': ('Mozilla/5.0 (Linux; Android 10; SM-G981B)'
+ ' AppleWebKit/537.36 (KHTML, like Gecko)'
+ ' Chrome/80.0.3987.162 Mobile Safari/537.36'),
+ 'Referer': 'https://www.youtube.com/watch?v={json[videoId]}'
+ },
+ 'params': {
+ 'key': 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8',
+ },
+ },
+ '_common': {
+ '_access_token': None,
+ 'json': {
+ 'contentCheckOk': True,
+ 'context': {
+ 'client': {
+ 'gl': None,
+ 'hl': None,
+ },
+ },
+ 'playbackContext': {
+ 'contentPlaybackContext': {
+ 'html5Preference': 'HTML5_PREF_WANTS',
+ },
+ },
+ 'racyCheckOk': True,
+ 'thirdParty': {},
+ 'user': {
+ 'lockedSafetyMode': False
+ },
+ 'videoId': None,
+ },
+ 'headers': {
+ 'Origin': 'https://www.youtube.com',
+ 'Referer': 'https://www.youtube.com/watch?v={json[videoId]}',
+ 'Accept-Encoding': 'gzip, deflate',
+ 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
+ 'Accept': '*/*',
+ 'Accept-Language': 'en-US,en;q=0.5',
+ 'Authorization': 'Bearer {_access_token}',
+ },
+ 'params': {
+ 'key': None,
+ 'prettyPrint': 'false'
+ },
+ },
}
- def __init__(self, context, access_token='', api_key='', language='en-US'):
+ def __init__(self, context, access_token='', language='en-US'):
+ settings = context.get_settings()
+
+ self.video_id = None
self._context = context
self._data_cache = self._context.get_data_cache()
- self._verify = context.get_settings().verify_ssl()
- self._language = language.replace('-', '_')
- self.language = context.get_settings().get_string('youtube.language', 'en_US').replace('-', '_')
- self.region = context.get_settings().get_string('youtube.region', 'US')
+ self._verify = settings.verify_ssl()
+ self._language = (settings.get_string('youtube.language', language)
+ .replace('-', '_'))
+ self._language_base = self._language[0:2]
self._access_token = access_token
- self._api_key = api_key
- self._calculate_n = None
+ self._player_js = None
+ self._calculate_n = True
+ self._cipher = None
+
+ self._selected_client = None
+ client_selection = settings.client_selection()
+
+ # All client selections use the Android client as the first option to
+ # ensure that the age gate setting is enforced, regardless of login
+ # status
+
+ # Alternate #1
+ # Will play most videos with subtitles at full resolution with HDR
+ # Some restricted videos may only play at 720p
+ # Some restricted videos require additional requests for subtitles
+ if client_selection == 1:
+ self._prioritised_clients = (
+ 'android',
+ 'android_embedded',
+ 'android_youtube_tv',
+ 'android_testsuite',
+ )
+ # Alternate #2
+ # Will play most videos at full resolution with HDR
+ # Most videos wont show subtitles
+ # Useful for testing AV1 HDR
+ elif client_selection == 2:
+ self._prioritised_clients = (
+ 'android',
+ 'android_testsuite',
+ 'android_youtube_tv',
+ 'android_embedded',
+ )
+ # Default
+ # Will play most videos with subtitles at full resolution with HDR
+ # Some restricted videos require additional requests for subtitles
+ else:
+ self._prioritised_clients = (
+ 'android',
+ 'android_youtube_tv',
+ 'android_testsuite',
+ 'android_embedded',
+ )
+
+ self.CLIENTS['_common']['json']['context']['client'] = {
+ 'hl': self._language,
+ 'gl': settings.get_string('youtube.region', 'US'),
+ }
@staticmethod
- def generate_cpn():
+ def _generate_cpn():
# https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L1381
# LICENSE: The Unlicense
# cpn generation algorithm is reverse engineered from base.js.
# In fact it works even with dummy cpn.
- cpn_alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'
- cpn = ''.join((cpn_alphabet[random.randint(0, 256) & 63] for _ in range(0, 16)))
- return cpn
-
- def calculate_n(self, url):
- if not self._calculate_n:
- self._context.log_debug('`n` was not calculated for %s' % url)
- return url
-
- parsed_query = dict(urllib.parse.parse_qsl(urllib.parse.urlsplit(url).query))
-
- if parsed_query.get('ratebypass', 'no') != 'yes' and 'n' in parsed_query:
- # Cipher n to get the updated value
- initial_n = list(parsed_query['n'])
- new_n = self._calculate_n.calculate_n(initial_n)
- if new_n:
- parsed_query['n'] = new_n
- parsed_query['ratebypass'] = 'yes'
- parsed_url = urllib.parse.urlsplit(url)
- url = '%s://%s%s?%s' % \
- (parsed_url.scheme, parsed_url.netloc,
- parsed_url.path, urllib.parse.urlencode(parsed_query))
-
- return url
+ cpn_alphabet = ('abcdefghijklmnopqrstuvwxyz'
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ '0123456789-_')
+ # Python 2 compatible method
+ # cpn = ''.join(cpn_alphabet[random.randint(0, 63)] for _ in range(16))
+ # return cpn
+ return ''.join(random.choices(cpn_alphabet, k=16))
def load_stream_infos(self, video_id):
- return self._method_get_video_info(video_id)
-
- def get_watch_page(self, video_id):
- headers = self.MOBILE_HEADERS.copy()
- headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
- if self._access_token:
- headers['Authorization'] = 'Bearer %s' % self._access_token
-
- url = 'https://www.youtube.com/watch?v={video_id}'.format(video_id=video_id)
- cookies = {'CONSENT': 'YES+cb.20210615-14-p0.en+FX+294'}
-
- result = requests.get(url, headers=headers, verify=self._verify,
- cookies=cookies, allow_redirects=True)
-
- return {'url': result.url, 'html': result.text, 'cookies': result.cookies}
-
- def get_embed_page(self, video_id):
- headers = self.MOBILE_HEADERS.copy()
- headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
- if self._access_token:
- headers['Authorization'] = 'Bearer %s' % self._access_token
+ self.video_id = video_id
+ return self._get_video_info()
+
+ def _build_client(self, client_name, auth_header=False):
+ def _merge_dicts(item1, item2):
+ if not isinstance(item1, dict) or not isinstance(item2, dict):
+ return item1 if item2 is ... else item2
+ new = {}
+ for key in (item1.keys() | item2.keys()):
+ value = _merge_dicts(item1.get(key, ...), item2.get(key, ...))
+ if value is ...:
+ continue
+ if isinstance(value, str) and '{' in value:
+ _format['{0}.{1}'.format(id(new), key)] = (new, key, value)
+ new[key] = value
+ return new or ...
+ _format = {}
+
+ client = (self.CLIENTS.get(client_name) or self.CLIENTS['web']).copy()
+ client = _merge_dicts(self.CLIENTS['_common'], client)
+
+ client['json']['videoId'] = self.video_id
+ if auth_header and self._access_token:
+ client['_access_token'] = self._access_token
+ client['params'] = None
+ elif 'Authorization' in client['headers']:
+ del client['headers']['Authorization']
+
+ for values, key, value in _format.values():
+ if key in values:
+ values[key] = value.format(**client)
+
+ return client
+
+ def _request(self, url, method='GET',
+ cookies=None, data=None, headers=None, json=None, params=None,
+ error_msg=None, raise_error=False, timeout=(3.05, 27), **_):
+ try:
+ result = requests.request(method, url,
+ verify=self._verify,
+ allow_redirects=True,
+ timeout=timeout,
+ cookies=cookies,
+ data=data,
+ headers=headers,
+ json=json,
+ params=params)
+ result.raise_for_status()
+ except requests.exceptions.RequestException as error:
+ response = error.response and error.response.text
+ self._context.log_debug('Response: {0}'.format(response))
+ self._context.log_error('{0}\n{1}'.format(
+ error_msg or 'Request failed', traceback.format_exc()
+ ))
+ if raise_error:
+ raise YouTubeException(error_msg) from error
+ return None
+ return result
- url = 'https://www.youtube.com/embed/{video_id}'.format(video_id=video_id)
+ def _get_player_page(self, client='web', embed=False):
+ client = self._build_client(client)
+ if embed:
+ url = 'https://www.youtube.com/embed/{0}'.format(self.video_id)
+ else:
+ url = 'https://www.youtube.com/watch?v={0}'.format(self.video_id)
cookies = {'CONSENT': 'YES+cb.20210615-14-p0.en+FX+294'}
- result = requests.get(url, headers=headers, verify=self._verify,
- cookies=cookies, allow_redirects=True)
-
- return {'url': result.url, 'html': result.text, 'cookies': result.cookies}
+ result = self._request(
+ url, cookies=cookies, headers=client['headers'],
+ error_msg=('Failed to get player html for video_id: {0}'
+ .format(self.video_id))
+ )
+ if result:
+ return result
+ return None
@staticmethod
- def get_player_client(config):
+ def _get_player_client(config):
return config.get('INNERTUBE_CONTEXT', {}).get('client', {})
- def get_player_key(self, html):
+ def _get_player_key(self, html):
+ if not html:
+ return None
+
pattern = 'INNERTUBE_API_KEY":"'
start_index = html.find(pattern)
if start_index != -1:
start_index += len(pattern)
end_index = html.find('"', start_index)
- self._context.log_debug('Player key found')
- return html[start_index:end_index]
- else:
- return None
+ player_key = html[start_index:end_index]
+ self._context.log_debug('Player key found: {0}'.format(player_key))
+ return player_key
+ return None
@staticmethod
- def get_player_config(html):
- config = {}
-
- found = re.search(
- r'window\.ytplayer\s*=\s*{}\s*;\s*ytcfg\.set\((?P.+?)\)\s*;\s*(?:ytcfg|var setMessage\s*=\s*)', html
- )
-
- if found:
- config = json.loads(found.group('config'))
-
- return config
+ def _get_player_config(page):
+ if not page:
+ return None
- @staticmethod
- def get_player_response(html):
- response = {}
+ # pattern source is from youtube-dl
+ # https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L313
+ # LICENSE: The Unlicense
+ found = re.search(r'ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;', page.text)
- found = re.search(
- r'ytInitialPlayerResponse\s*=\s*(?P{.+?})\s*;\s*(?:var\s+meta|[^"]*base.js)"', html)
+ if not js_url:
+ return ''
- if found:
- javascript_url = found.group('url')
+ js_url = self._normalize_url(js_url)
+ self._data_cache.set('player_js_url', json_dumps({'url': js_url}))
- javascript_url = _normalize(javascript_url)
- cache_key = urllib.parse.quote(javascript_url)
- cached_js = self._data_cache.get_item(DataCache.ONE_HOUR * 4, cache_key)
+ cache_key = quote(js_url)
+ cached_js = self._data_cache.get_item(
+ DataCache.ONE_HOUR * 4, cache_key
+ ).get('js')
if cached_js:
return cached_js
- headers = self.MOBILE_HEADERS.copy()
- result = requests.get(javascript_url, headers=headers, verify=False, allow_redirects=True)
- javascript = result.text
+ client = self._build_client('web')
+ result = self._request(
+ js_url, headers=client['headers'],
+ error_msg=('Failed to get player js for video_id: {0}'
+ .format(self.video_id))
+ )
+ if not result:
+ return ''
- self._data_cache.set(javascript_url, cache_key)
+ javascript = result.text
+ self._data_cache.set(cache_key, json_dumps({'js': javascript}))
return javascript
@staticmethod
- def make_curl_headers(headers, cookies=None):
- output = ''
+ def _make_curl_headers(headers, cookies=None):
+ output = []
if cookies:
- output += 'Cookie={all_cookies}'.format(
- all_cookies=urllib.parse.quote(
- '; '.join('{0}={1}'.format(c.name, c.value) for c in cookies)
- )
- )
- output += '&'
- # Headers to be used in function 'to_play_item' of 'xbmc_items.py'.
- output += '&'.join('{0}={1}'.format(key, urllib.parse.quote(headers[key]))
- for key in headers)
- return output
+ output.append('Cookie={0}'.format(quote('; '.join(
+ '{0.name}={0.value}'.format(cookie)
+ for cookie in cookies
+ ))))
+ # Headers to be used in function 'to_play_item' of 'xbmc_items.py'
+ output.extend('{0}={1}'.format(key, quote(value))
+ for key, value in headers.items())
+ return '&'.join(output)
+
+ @staticmethod
+ def _normalize_url(url):
+ if not url:
+ url = ''
+ elif url.startswith(('http://', 'https://')):
+ pass
+ elif url.startswith('//'):
+ url = urljoin('https:', url)
+ elif url.startswith('/'):
+ url = urljoin('https://www.youtube.com', url)
+ return url
+
+ def _load_hls_manifest(self, url, live_type=None, meta_info=None, headers=None, playback_stats=None):
+ if not url:
+ return []
- def _load_manifest(self, url, video_id, meta_info=None, playback_stats=None):
- headers = self.MOBILE_HEADERS.copy()
- headers['Referer'] = 'https://www.youtube.com/watch?v=%s' % video_id
- headers['Origin'] = 'https://www.youtube.com'
+ if not headers and self._selected_client:
+ headers = self._selected_client['headers'].copy()
+ if 'Authorization' in headers:
+ del headers['Authorization']
+ else:
+ headers = self._build_client('web')['headers']
+ curl_headers = self._make_curl_headers(headers, cookies=None)
+
+ result = self._request(
+ url, headers=headers,
+ error_msg=('Failed to get manifest for video_id: {0}'
+ .format(self.video_id))
+ )
+ if not result:
+ return ()
- curl_headers = self.make_curl_headers(headers, cookies=None)
+ if meta_info is None:
+ meta_info = {'video': {},
+ 'channel': {},
+ 'images': {},
+ 'subtitles': []}
if playback_stats is None:
playback_stats = {}
- try:
- result = requests.get(url, headers=headers, verify=self._verify, allow_redirects=True)
- result.raise_for_status()
- except:
- # Failed to get the M3U8 playlist file. Add a log debug in this case?
- return ()
+ if live_type is None:
+ live_type = self._context.get_settings().get_live_stream_type()
+
+ if 'hls' in live_type:
+ if live_type == 'hls':
+ yt_format = self.FORMAT['9995']
+ else:
+ yt_format = self.FORMAT['9996']
+ stream = {'url': url,
+ 'meta': meta_info,
+ 'headers': curl_headers,
+ 'playback_stats': playback_stats}
+ stream.update(yt_format)
+ stream_list = [stream]
+ else:
+ stream_list = []
- _meta_info = {'video': {},
- 'channel': {},
- 'images': {},
- 'subtitles': []}
- meta_info = meta_info if meta_info else _meta_info
- streams = []
# The playlist might include a #EXT-X-MEDIA entry, but it's usually for
# a small default stream with itag 133 (240p) and can be ignored.
# Capture the URL of a .m3u8 playlist and the itag value from that URL.
- re_playlist_data = re.compile(r'#EXT-X-STREAM-INF[^#]+(?Phttp[^\s]+/itag/(?P\d+)[^\s]+)')
+ re_playlist_data = re.compile(
+ r'#EXT-X-STREAM-INF[^#]+'
+ r'(?Phttp[^\s]+/itag/(?P\d+)[^\s]+)'
+ )
for match in re_playlist_data.finditer(result.text):
playlist_url = match.group('url')
itag = match.group('itag')
- yt_format = self.FORMAT.get(itag, None)
+ yt_format = self.FORMAT.get(itag)
if not yt_format:
- self._context.log_debug('unknown yt_format for itag "%s"' % itag)
+ self._context.log_debug('Unknown itag: {0}'.format(itag))
continue
- video_stream = {'url': playlist_url,
- 'meta': meta_info,
- 'headers': curl_headers,
- 'playback_stats': playback_stats
- }
- video_stream.update(yt_format)
- streams.append(video_stream)
- return streams
-
- def _method_get_video_info(self, video_id):
- headers = self.MOBILE_HEADERS.copy()
-
- params = None
- if self._access_token:
- headers['Authorization'] = 'Bearer %s' % self._access_token
+ stream = {'url': playlist_url,
+ 'meta': meta_info,
+ 'headers': curl_headers,
+ 'playback_stats': playback_stats}
+ stream.update(yt_format)
+ stream_list.append(stream)
+ return stream_list
+
+ def _create_stream_list(self, streams, meta_info=None, headers=None, playback_stats=None):
+ if not headers and self._selected_client:
+ headers = self._selected_client['headers'].copy()
+ if 'Authorization' in headers:
+ del headers['Authorization']
else:
- params = {
- 'key': self._api_key
- }
- video_info_url = 'https://youtubei.googleapis.com/youtubei/v1/player'
- # payload = {'videoId': video_id,
- # 'context': {'client': {'clientVersion': '1.20210909.07.00', 'gl': self.region,
- # 'clientName': 'WEB_CREATOR', 'hl': self.language}}}
-
- # payload = {'videoId': video_id,
- # 'context': {'client': {'clientVersion': '16.05', 'gl': self.region,
- # 'clientName': 'ANDROID', 'clientScreen': 'EMBED',
- # 'hl': self.language}}}
-
- payload = {'videoId': video_id,
- 'context': {'client': {'clientVersion': '16.49', 'gl': self.region,
- 'clientName': 'ANDROID', 'hl': self.language}},
- 'thirdParty': {'embedUrl': 'https://google.com'}
- }
+ headers = self._build_client('web')['headers']
+ curl_headers = self._make_curl_headers(headers, cookies=None)
+
+ if meta_info is None:
+ meta_info = {'video': {},
+ 'channel': {},
+ 'images': {},
+ 'subtitles': []}
+ if playback_stats is None:
+ playback_stats = {}
- player_response = {}
- for attempt in range(2):
- try:
- r = requests.post(video_info_url, params=params, json=payload,
- headers=headers, verify=self._verify, cookies=None,
- allow_redirects=True)
- r.raise_for_status()
- player_response = r.json()
- if player_response.get('playabilityStatus', {}).get('status', 'OK') in \
- ('AGE_CHECK_REQUIRED', 'UNPLAYABLE', 'CONTENT_CHECK_REQUIRED') and attempt == 0:
- payload['context']['client']['clientName'] = 'ANDROID_EMBEDDED_PLAYER'
- payload['context']['client']['clientVersion'] = '16.20'
- continue
- except:
- error_message = 'Failed to get player response for video_id "%s"' % video_id
- self._context.log_error(error_message + '\n' + traceback.format_exc())
- raise YouTubeException(error_message)
+ stream_list = []
+ for stream_map in streams:
+ url = stream_map.get('url')
+ conn = stream_map.get('conn')
- # Make a set of URL-quoted headers to be sent to Kodi when requesting
- # the stream during playback. The YT player doesn't seem to use any
- # cookies when doing that, so for now cookies are ignored.
- # curl_headers = self.make_curl_headers(headers, cookies)
- curl_headers = self.make_curl_headers(headers, cookies=None)
+ if not url and conn:
+ url = '%s?%s' % (conn, unquote(stream_map['stream']))
+ elif not url and self._cipher and 'signatureCipher' in stream_map:
+ url = self._process_signature_cipher(stream_map)
- playability_status = player_response.get('playabilityStatus', {})
+ if not url:
+ continue
+ url = self._process_url_params(url)
- video_details = player_response.get('videoDetails', {})
- is_live_content = video_details.get('isLiveContent') is True
- streaming_data = player_response.get('streamingData', {})
+ itag = str(stream_map['itag'])
+ stream_map['itag'] = itag
+ yt_format = self.FORMAT.get(itag)
+ if not yt_format:
+ self._context.log_debug('Unknown itag: {0}'.format(itag))
+ continue
+ if (yt_format.get('discontinued') or yt_format.get('unsupported')
+ or (yt_format.get('dash/video')
+ and not yt_format.get('dash/audio'))):
+ continue
- live_url = streaming_data.get('hlsManifestUrl', '') or \
- player_response.get('streamingData', {}).get('hlsManifestUrl', '')
- is_live = is_live_content and live_url
+ stream = {'url': url,
+ 'meta': meta_info,
+ 'headers': curl_headers,
+ 'playback_stats': playback_stats}
+ stream.update(yt_format)
- meta_info = {'video': {},
- 'channel': {},
- 'images': {},
- 'subtitles': []}
+ if 'audioTrack' in stream_map:
+ audio_track = stream_map['audioTrack']
+ display_name = audio_track['displayName']
+ stream['title'] = '{0} {1}'.format(
+ stream['title'], display_name
+ )
+ stream['sort'] = stream['sort'] + [
+ not audio_track['id'].startswith(self._language_base),
+ 'original' not in display_name,
+ display_name
+ ]
- meta_info['video']['id'] = video_details.get('videoId', video_id)
+ stream_list.append(stream)
+ return stream_list
- meta_info['video']['title'] = video_details.get('title', '')
- meta_info['channel']['author'] = video_details.get('author', '')
+ def _process_signature_cipher(self, stream_map):
+ signature_cipher = parse_qs(stream_map['signatureCipher'])
+ url = signature_cipher.get('url', [None])[0]
+ encrypted_signature = signature_cipher.get('s', [None])[0]
+ query_var = signature_cipher.get('sp', ['signature'])[0]
- meta_info['video']['title'] = meta_info['video']['title'].encode('raw_unicode_escape')
- meta_info['channel']['author'] = meta_info['channel']['author'].encode('raw_unicode_escape')
+ if not url or not encrypted_signature:
+ return None
- if PY2:
+ signature = self._data_cache.get_item(
+ DataCache.ONE_HOUR * 4, encrypted_signature
+ ).get('sig')
+ if not signature:
try:
- if r'\u' not in meta_info['video']['title']:
- meta_info['video']['title'] = meta_info['video']['title'].decode('utf-8')
- meta_info['channel']['author'] = meta_info['channel']['author'].decode('utf-8')
- else:
- meta_info['video']['title'] = meta_info['video']['title'].decode('raw_unicode_escape')
- meta_info['channel']['author'] = meta_info['channel']['author'].decode('raw_unicode_escape')
- except UnicodeDecodeError:
- meta_info['video']['title'] = meta_info['video']['title'].decode('raw_unicode_escape')
- meta_info['channel']['author'] = meta_info['channel']['author'].decode('raw_unicode_escape')
- else:
- meta_info['video']['title'] = meta_info['video']['title'].decode('raw_unicode_escape')
- meta_info['channel']['author'] = meta_info['channel']['author'].decode('raw_unicode_escape')
-
- meta_info['video']['title'] = unescape(meta_info['video']['title'])
- meta_info['channel']['author'] = unescape(meta_info['channel']['author'])
-
- meta_info['channel']['id'] = video_details.get('channelId', '')
- image_data_list = [
- {'from': 'iurlhq', 'to': 'high', 'image': 'hqdefault.jpg'},
- {'from': 'iurlmq', 'to': 'medium', 'image': 'mqdefault.jpg'},
- {'from': 'iurlsd', 'to': 'standard', 'image': 'sddefault.jpg'},
- {'from': 'thumbnail_url', 'to': 'default', 'image': 'default.jpg'}]
- for image_data in image_data_list:
- image_url = 'https://i.ytimg.com/vi/{video_id}/{image}'.format(video_id=video_id, image=image_data['image'])
- if image_url:
- if is_live:
- image_url = image_url.replace('.jpg', '_live.jpg')
- meta_info['images'][image_data['to']] = image_url
-
- microformat = player_response.get('microformat', {}).get('playerMicroformatRenderer', {})
- meta_info['video']['status'] = {
- 'unlisted': microformat.get('isUnlisted', False),
- 'private': video_details.get('isPrivate', False),
- 'crawlable': video_details.get('isCrawlable', False),
- 'family_safe': microformat.get('isFamilySafe', False),
- 'live': is_live,
- }
+ signature = self._cipher.get_signature(encrypted_signature)
+ except Exception as error:
+ self._context.log_debug('{0}: {1}\n{2}'.format(
+ error, encrypted_signature, traceback.format_exc()
+ ))
+ self._context.log_error(
+ 'Failed to extract URL from signatureCipher'
+ )
+ return None
+ self._data_cache.set(
+ encrypted_signature, json_dumps({'sig': signature})
+ )
- if playability_status.get('status', 'ok').lower() != 'ok':
- if not ((playability_status.get('desktopLegacyAgeGateReason', 0) == 1) and not self._context.get_settings().age_gate()):
- reason = None
- if playability_status.get('status') == 'LIVE_STREAM_OFFLINE':
- if playability_status.get('reason'):
- reason = playability_status.get('reason')
- else:
- live_streamability = playability_status.get('liveStreamability', {})
- live_streamability_renderer = live_streamability.get('liveStreamabilityRenderer', {})
- offline_slate = live_streamability_renderer.get('offlineSlate', {})
- live_stream_offline_slate_renderer = offline_slate.get('liveStreamOfflineSlateRenderer', {})
- renderer_main_text = live_stream_offline_slate_renderer.get('mainText', {})
- main_text_runs = renderer_main_text.get('runs', [{}])
- reason_text = []
- for text in main_text_runs:
- reason_text.append(text.get('text', ''))
- if reason_text:
- reason = ''.join(reason_text)
- else:
- reason = playability_status.get('reason')
-
- if 'errorScreen' in playability_status and 'playerErrorMessageRenderer' in playability_status['errorScreen']:
- status_renderer = playability_status['errorScreen']['playerErrorMessageRenderer']
- status_reason = status_renderer.get('reason', {})
- main_text_runs = status_reason.get('runs', [{}])
- reason_text = []
- descript_reason = ''
- for text in main_text_runs:
- reason_text.append(text.get('text', ''))
- if reason_text:
- descript_reason = ''.join(reason_text)
- if descript_reason:
- reason = descript_reason
- else:
- general_reason = status_renderer.get('reason', {}).get('simpleText')
- if general_reason:
- reason = general_reason
+ if signature:
+ url = '{0}&{1}={2}'.format(url, query_var, signature)
+ return url
+ return None
- if not reason:
- reason = 'UNKNOWN'
+ def _process_url_params(self, url):
+ if not url:
+ return url
- if PY2:
- try:
- reason = reason.encode('raw_unicode_escape').decode('utf-8')
- except:
- pass
+ parts = urlsplit(url)
+ query = parse_qs(parts.query)
+ new_query = {}
+ update_url = False
- raise YouTubeException(reason)
+ if (self._calculate_n and 'n' in query
+ and query.get('ratebypass', [None])[0] != 'yes'):
+ self._player_js = self._player_js or self._get_player_js()
+ if self._calculate_n is True:
+ self._context.log_debug('nsig detected')
+ self._calculate_n = ratebypass.CalculateN(self._player_js)
- captions = player_response.get('captions', {})
- meta_info['subtitles'] = Subtitles(self._context, self.MOBILE_HEADERS,
- video_id, captions).get_subtitles()
+ # Cipher n to get the updated value
+ new_n = self._calculate_n.calculate_n(query['n'])
+ if new_n:
+ new_query['n'] = new_n
+ new_query['ratebypass'] = 'yes'
+ else:
+ self._context.log_error('nsig handling failed')
+ self._calculate_n = False
- playback_stats = {
- 'playback_url': '',
- 'watchtime_url': ''
- }
+ if 'range' not in query:
+ content_length = query.get('clen', [''])[0]
+ new_query['range'] = '0-{0}'.format(content_length)
- playback_tracking = player_response.get('playbackTracking', {})
- playback_url = playback_tracking.get('videostatsPlaybackUrl', {}).get('baseUrl', '')
- watchtime_url = playback_tracking.get('videostatsWatchtimeUrl', {}).get('baseUrl', '')
-
- if playback_url and playback_url.startswith('http'):
- playback_stats['playback_url'] = ''.join([
- playback_url,
- '&ver=2&fs=0&volume=100&muted=0',
- '&cpn={cpn}'.format(cpn=self.generate_cpn())
- ])
-
- if watchtime_url and watchtime_url.startswith('http'):
- playback_stats['watchtime_url'] = ''.join([
- watchtime_url,
- '&ver=2&fs=0&volume=100&muted=0',
- '&cpn={cpn}'.format(cpn=self.generate_cpn()),
- '&st={st}&et={et}&state={state}'
- ])
+ if new_query:
+ query.update(new_query)
+ elif not update_url:
+ return url
- stream_list = []
+ return urlunsplit((parts.scheme,
+ parts.netloc,
+ parts.path,
+ urlencode(query, doseq=True),
+ parts.fragment))
+
+ @staticmethod
+ def _get_error_details(playability_status, details=None):
+ if not playability_status:
+ return None
+ if not details:
+ details = (
+ 'errorScreen',
+ ('playerErrorMessageRenderer', 'confirmDialogRenderer'),
+ ('reason', 'title')
+ )
- if live_url:
- stream_list.extend(self._load_manifest(live_url, video_id,
- meta_info=meta_info,
- playback_stats=playback_stats))
+ result = playability_status
+ for keys in details:
+ is_dict = isinstance(result, dict)
+ if not is_dict and not isinstance(result, list):
+ return None
+
+ if not isinstance(keys, (list, tuple)):
+ keys = [keys]
+ for key in keys:
+ if is_dict:
+ if key not in result:
+ continue
+ elif not isinstance(key, int) or len(result) <= key:
+ continue
+ result = result[key]
+ break
+ else:
+ return None
+
+ if 'runs' not in result:
+ return result
+
+ detail_texts = [
+ text['text']
+ for text in result['runs']
+ if text and 'text' in text and text['text']
+ ]
+ if detail_texts:
+ return ''.join(detail_texts)
+ if 'simpleText' in result:
+ return result['simpleText']
+ return None
+
+ def _get_video_info(self):
+ auth_header = bool(self._access_token)
+ video_info_url = 'https://www.youtube.com/youtubei/v1/player'
+
+ _settings = self._context.get_settings()
+ playability_status = status = reason = None
+ for _ in range(2):
+ for client_name in self._prioritised_clients:
+ client = self._build_client(client_name, auth_header)
+
+ result = self._request(
+ video_info_url, 'POST', **client,
+ error_msg=(
+ 'Player response failed for video_id: {0},'
+ ' using {1} client ({2})'
+ .format(self.video_id,
+ client_name,
+ 'logged in' if auth_header else 'logged out')
+ ),
+ raise_error=True
+ )
- httpd_is_live = (self._context.get_settings().use_dash_videos() and
- is_httpd_live(port=self._context.get_settings().httpd_port()))
+ response = result.json()
+ playability_status = response.get('playabilityStatus', {})
+ status = playability_status.get('status', '').upper()
+ reason = playability_status.get('reason', '')
+
+ if status in {'', 'AGE_CHECK_REQUIRED', 'UNPLAYABLE',
+ 'CONTENT_CHECK_REQUIRED', 'LOGIN_REQUIRED',
+ 'AGE_VERIFICATION_REQUIRED', 'ERROR'}:
+ if (playability_status.get('desktopLegacyAgeGateReason')
+ and _settings.age_gate()):
+ break
+ # Geo-blocked video with error reasons like:
+ # "This video contains content from XXX, who has blocked it in your country on copyright grounds"
+ # "The uploader has not made this video available in your country"
+ if status == 'UNPLAYABLE' and 'country' in reason:
+ break
+ if status != 'ERROR':
+ continue
+ # This is used to check for error like:
+ # "The following content is not available on this app."
+ # Text will vary depending on Accept-Language and client hl
+ # Youtube support url is checked instead
+ url = self._get_error_details(
+ playability_status,
+ details=(
+ 'errorScreen',
+ 'playerErrorMessageRenderer',
+ 'learnMore',
+ 'runs', 0,
+ 'navigationEndpoint',
+ 'urlEndpoint',
+ 'url'
+ )
+ )
+ if url and url.startswith('//support.google.com/youtube/answer/12318250'):
+ continue
+ break
+ # Only attempt to remove Authorization header if clients iterable
+ # was exhausted i.e. request attempted using all clients
+ else:
+ if auth_header:
+ auth_header = False
+ continue
+ # Otherwise skip retrying clients without Authorization header
+ break
- s_info = dict()
+ if status != 'OK':
+ if status == 'LIVE_STREAM_OFFLINE':
+ if not reason:
+ reason = self._get_error_details(
+ playability_status,
+ details=(
+ 'liveStreamability',
+ 'liveStreamabilityRenderer',
+ 'offlineSlate',
+ 'liveStreamOfflineSlateRenderer',
+ 'mainText'
+ )
+ )
+ elif not reason:
+ reason = self._get_error_details(playability_status)
+ raise YouTubeException(reason or 'UNKNOWN')
+
+ self._context.log_debug(
+ 'Retrieved video info for video_id: {0}, using {1} client ({2})'
+ .format(self.video_id,
+ client['json']['context']['client']['clientName'],
+ 'logged in' if auth_header else 'logged out')
+ )
+ self._selected_client = client.copy()
- adaptive_fmts = streaming_data.get('adaptiveFormats', [])
- std_fmts = streaming_data.get('formats', [])
- mpd_url = streaming_data.get('dashManifestUrl') or \
- player_response.get('streamingData', {}).get('dashManifestUrl', '')
+ if 'Authorization' in client['headers']:
+ del client['headers']['Authorization']
+ # Make a set of URL-quoted headers to be sent to Kodi when requesting
+ # the stream during playback. The YT player doesn't seem to use any
+ # cookies when doing that, so for now cookies are ignored.
+ # curl_headers = self._make_curl_headers(headers, cookies)
+ curl_headers = self._make_curl_headers(client['headers'], cookies=None)
+
+ video_details = response.get('videoDetails', {})
+ microformat = (response.get('microformat', {})
+ .get('playerMicroformatRenderer', {}))
+ streaming_data = response.get('streamingData', {})
+ is_live = '_live' if video_details.get('isLiveContent') else ''
+
+ captions = response.get('captions')
+ if captions:
+ captions['headers'] = client['headers']
+ elif client.get('_query_subtitles'):
+ result = self._request(
+ video_info_url, 'POST', **self._build_client('smarttv', True),
+ error_msg=('Caption request failed to get player response for'
+ 'video_id: {0}'.format(self.video_id)),
+ )
+
+ response = result.json()
+ captions = response.get('captions')
+ if captions:
+ captions['headers'] = result.request.headers
+ if captions:
+ captions = Subtitles(
+ self._context, self.video_id, captions
+ )
+ default_lang = captions.get_default_lang()
+ captions = captions.get_subtitles()
+ else:
+ default_lang = {'code': 'und', 'is_asr': False}
+
+ meta_info = {
+ 'video': {
+ 'id': video_details.get('videoId', self.video_id),
+ 'title': unescape(video_details.get('title', '')
+ .encode('raw_unicode_escape')
+ .decode('raw_unicode_escape')),
+ 'status': {
+ 'unlisted': microformat.get('isUnlisted', False),
+ 'private': video_details.get('isPrivate', False),
+ 'crawlable': video_details.get('isCrawlable', False),
+ 'family_safe': microformat.get('isFamilySafe', False),
+ 'live': bool(is_live),
+ },
+ },
+ 'channel': {
+ 'id': video_details.get('channelId', ''),
+ 'author': unescape(video_details.get('author', '')
+ .encode('raw_unicode_escape')
+ .decode('raw_unicode_escape')),
+ },
+ 'images': {
+ 'high': ('https://i.ytimg.com/vi/{0}/hqdefault{1}.jpg'
+ .format(self.video_id, is_live)),
+ 'medium': ('https://i.ytimg.com/vi/{0}/mqdefault{1}.jpg'
+ .format(self.video_id, is_live)),
+ 'standard': ('https://i.ytimg.com/vi/{0}/sddefault{1}.jpg'
+ .format(self.video_id, is_live)),
+ 'default': ('https://i.ytimg.com/vi/{0}/default{1}.jpg'
+ .format(self.video_id, is_live)),
+ },
+ 'subtitles': captions or [],
+ }
+
+ if _settings.use_remote_history():
+ playback_stats = {
+ 'playback_url': (
+ 'videostatsPlaybackUrl',
+ '{0}&ver=2&fs=0&volume=100&muted=0&cpn={1}',
+ ),
+ 'watchtime_url': (
+ 'videostatsWatchtimeUrl',
+ ('{0}&ver=2&fs=0&volume=100&muted=0&cpn={1}'
+ '&st={{st}}&et={{et}}&state={{state}}'),
+ )
+ }
+ playback_tracking = response.get('playbackTracking', {})
+ cpn = self._generate_cpn()
+
+ for key, (url, url_template) in playback_stats.items():
+ url = playback_tracking.get(url, {}).get('baseUrl')
+ if not url or not url.startswith('http'):
+ playback_stats[key] = ''
+ playback_stats[key] = url_template.format(url, cpn)
+ else:
+ playback_stats = {
+ 'playback_url': '',
+ 'watchtime_url': '',
+ }
+
+ httpd_is_live = (_settings.use_mpd() and
+ is_httpd_live(port=_settings.httpd_port()))
- license_info = {'url': None, 'proxy': None, 'token': None}
pa_li_info = streaming_data.get('licenseInfos', [])
- if pa_li_info and (pa_li_info != ['']) and not httpd_is_live:
+ if any(pa_li_info) and not httpd_is_live:
raise YouTubeException('Proxy is not running')
for li_info in pa_li_info:
- if li_info.get('drmFamily') == 'WIDEVINE':
- license_info['url'] = li_info.get('url', None)
- if license_info['url']:
- self._context.log_debug('Found widevine license url: |%s|' % license_info['url'])
- li_ipaddress = self._context.get_settings().httpd_listen()
- if li_ipaddress == '0.0.0.0':
- li_ipaddress = '127.0.0.1'
- proxy_addr = \
- ['http://{ipaddress}:{port}/widevine'.format(
- ipaddress=li_ipaddress,
- port=self._context.get_settings().httpd_port()
- ), '||R{SSM}|']
- license_info['proxy'] = ''.join(proxy_addr)
- license_info['token'] = self._access_token
- break
+ if li_info.get('drmFamily') != 'WIDEVINE':
+ continue
+ url = li_info.get('url')
+ if not url:
+ continue
+ self._context.log_debug('Found widevine license url: {0}'
+ .format(url))
+ license_info = {
+ 'url': url,
+ 'proxy': 'http://{0}:{1}/widevine||R{{SSM}}|'.format(
+ _settings.httpd_listen(for_request=True),
+ _settings.httpd_port()
+ ),
+ 'token': self._access_token,
+ }
+ break
+ else:
+ license_info = {
+ 'url': None,
+ 'proxy': None,
+ 'token': None
+ }
- if not is_live and httpd_is_live and adaptive_fmts:
- mpd_url, s_info = self.generate_mpd(video_id,
- adaptive_fmts,
- video_details.get('lengthSeconds', '0'),
- license_info.get('url'))
+ stream_list = []
+ adaptive_fmts = streaming_data.get('adaptiveFormats', [])
+ all_fmts = streaming_data.get('formats', []) + adaptive_fmts
+
+ if any(True for fmt in all_fmts
+ if fmt and 'url' not in fmt and 'signatureCipher' in fmt):
+ self._context.log_debug('signatureCipher detected')
+ self._player_js = self._get_player_js()
+ self._cipher = Cipher(self._context, javascript=self._player_js)
+
+ manifest_url = None
+ if is_live:
+ live_type = _settings.get_live_stream_type()
+ if live_type == 'ia_mpd':
+ manifest_url = streaming_data.get('dashManifestUrl', '')
+ else:
+ stream_list.extend(self._load_hls_manifest(
+ streaming_data.get('hlsManifestUrl'),
+ live_type, meta_info, client['headers'], playback_stats
+ ))
+ elif httpd_is_live and adaptive_fmts:
+ video_data, audio_data = self._process_stream_data(
+ adaptive_fmts, default_lang['code']
+ )
+ manifest_url, main_stream = self._generate_mpd_manifest(
+ video_data, audio_data, license_info.get('url')
+ )
- if mpd_url:
+ if manifest_url:
video_stream = {
- 'url': mpd_url,
+ 'url': manifest_url,
'meta': meta_info,
'headers': curl_headers,
'license_info': license_info,
@@ -963,499 +1567,570 @@ def _method_get_video_info(self, video_id):
}
if is_live:
- video_stream['url'] = '&'.join([video_stream['url'], 'start_seq=$START_NUMBER$'])
- video_stream.update(self.FORMAT.get('9998'))
+ # MPD structure has segments with additional attributes
+ # and url has changed from using a query string to using url params
+ # This breaks the InputStream.Adaptive partial manifest update
+ video_stream['url'] = ('{0}?start_seq=$START_NUMBER$'
+ .format(video_stream['url']))
+ details = self.FORMAT.get('9998')
else:
- if not s_info:
- video_stream.update(self.FORMAT.get('9999'))
- else:
- has_video = (s_info['video']['codec'] != '') and (int(s_info['video']['bandwidth']) > 0)
- if has_video:
- video_stream.update(self.FORMAT.get('9999'))
- video_stream['video']['height'] = s_info['video']['height']
- video_stream['video']['encoding'] = s_info['video']['codec']
- else:
- video_stream.update(self.FORMAT.get('9997'))
- video_stream['audio']['encoding'] = s_info['audio']['codec']
- if s_info['video']['quality_label']:
- video_stream['title'] = s_info['video']['quality_label']
- else:
- if has_video:
- video_stream['title'] = '%sp%s' % (s_info['video']['height'], s_info['video']['fps'])
- else:
- video_stream['title'] = '%s@%s' % (s_info['audio']['codec'], str(s_info['audio'].get('bitrate', 0)))
- if int(s_info['audio'].get('bitrate', 0)) > 0:
- video_stream['audio']['bitrate'] = int(s_info['audio'].get('bitrate', 0))
+ details = self.FORMAT.get('9999').copy()
+
+ video_info = main_stream['video']
+ details['title'] = [video_info['label']]
+ details['video']['encoding'] = video_info['codec']
+ details['video']['height'] = video_info['height']
+
+ audio_info = main_stream['audio']
+ if audio_info:
+ details['audio']['encoding'] = audio_info['codec']
+ details['audio']['bitrate'] = audio_info['bitrate'] // 1000
+ if audio_info['langCode'] not in {'', 'und'}:
+ details['title'].extend((' ', audio_info['langName']))
+ if default_lang['is_asr']:
+ details['title'].append(' [ASR]')
+ if main_stream['multi_lang']:
+ details['title'].extend((
+ ' [', self._context.localize(30762), ']'
+ ))
+ if main_stream['multi_audio']:
+ details['title'].extend((
+ ' [', self._context.localize(30763), ']'
+ ))
+
+ details['title'] = ''.join(details['title'])
+
+ video_stream.update(details)
stream_list.append(video_stream)
- def parse_to_stream_list(streams):
- for item in streams:
- stream_map = item
+ # extract streams from map
+ if all_fmts:
+ stream_list.extend(self._create_stream_list(
+ all_fmts, meta_info, client['headers'], playback_stats
+ ))
- url = stream_map.get('url', None)
- conn = stream_map.get('conn', None)
+ # last fallback
+ if not stream_list:
+ raise YouTubeException('No streams found')
- stream_map['itag'] = str(stream_map['itag'])
+ return stream_list
- if url:
- itag = stream_map['itag']
- yt_format = self.FORMAT.get(itag, None)
- if not yt_format:
- self._context.log_debug('unknown yt_format for itag "%s"' % itag)
- continue
+ def _process_stream_data(self, stream_data, default_lang_code='und'):
+ _settings = self._context.get_settings()
+ qualities = _settings.get_mpd_video_qualities()
+ ia_capabilities = self._context.inputstream_adaptive_capabilities()
+ stream_features = _settings.stream_features()
+ allow_hdr = 'hdr' in stream_features
+ allow_hfr = 'hfr' in stream_features
+ allow_ssa = 'ssa' in stream_features
+ stream_select = _settings.stream_select()
+
+ fps_scale_map = {
+ 0: '{0}000/1000', # --.00 fps
+ 24: '24000/1001', # 23.97 fps
+ 30: '30000/1001', # 29.97 fps
+ 60: '60000/1001', # 59.97 fps
+ }
- if yt_format.get('discontinued', False) or yt_format.get('unsupported', False) or \
- (yt_format.get('dash/video', False) and not yt_format.get('dash/audio', False)):
- continue
+ quality_factor_map = {
+ # video - order based on comparative compression ratio
+ 'av01': 1,
+ 'vp9': 0.75,
+ 'vp8': 0.55,
+ 'avc1': 0.5,
+ # audio - order based on preference
+ 'vorbis': 0.75,
+ 'mp4a': 0.9,
+ 'opus': 1,
+ 'ac-3': 1.1,
+ 'ec-3': 1.2,
+ 'dts': 1.3,
+ }
- stream = {'url': url,
- 'meta': meta_info,
- 'headers': curl_headers,
- 'playback_stats': playback_stats}
- stream.update(yt_format)
- stream_list.append(stream)
- elif conn:
- url = '%s?%s' % (conn, urllib.parse.unquote(stream_map['stream']))
- itag = stream_map['itag']
- yt_format = self.FORMAT.get(itag, None)
- if not yt_format:
- self._context.log_debug('unknown yt_format for itag "%s"' % itag)
- continue
+ audio_data = {}
+ video_data = {}
+ preferred_audio = {
+ 'id': '',
+ 'language_code': None,
+ 'role_type': 0,
+ }
+ for stream in stream_data:
+ mime_type = stream.get('mimeType')
+ if not mime_type:
+ continue
- stream = {'url': url,
- 'meta': meta_info,
- 'headers': curl_headers,
- 'playback_stats': playback_stats}
- stream.update(yt_format)
- if stream:
- stream_list.append(stream)
+ itag = stream.get('itag')
+ if not itag:
+ continue
- # extract streams from map
- if std_fmts:
- parse_to_stream_list(std_fmts)
+ index_range = stream.get('indexRange')
+ if not index_range:
+ continue
- if adaptive_fmts:
- parse_to_stream_list(adaptive_fmts)
+ init_range = stream.get('initRange')
+ if not init_range:
+ continue
- # last fallback
- if not stream_list:
- raise YouTubeException('No streams found')
+ url = stream.get('url')
+ if not url and self._cipher and 'signatureCipher' in stream:
+ url = self._process_signature_cipher(stream)
+ if not url:
+ continue
- return stream_list
+ mime_type, codecs = unquote(mime_type).split('; ')
+ codec = re.match(r'codecs="([a-z0-9]+([.\-][0-9](?="))?)', codecs)
+ if codec:
+ codec = codec.group(1)
+ if codec.startswith('vp9'):
+ codec = 'vp9'
+ elif codec.startswith('dts'):
+ codec = 'dts'
+ if codec not in stream_features or codec not in ia_capabilities:
+ continue
+ media_type, container = mime_type.split('/')
+ bitrate = stream.get('bitrate', 0)
- def generate_mpd(self, video_id, adaptive_fmts, duration, license_url):
- discarded_streams = list()
-
- def get_discarded_audio(fmt, mime_type, itag, stream, reason='unsupported'):
- _discarded_stream = dict()
- _discarded_stream['audio'] = dict()
- _discarded_stream['audio']['itag'] = str(itag)
- _discarded_stream['audio']['mime'] = str(mime_type)
- _discarded_stream['audio']['codec'] = str(stream['codecs'])
- if fmt:
- audio_bitrate = int(fmt.get('audio', {}).get('bitrate', 0))
- if audio_bitrate > 0:
- _discarded_stream['audio']['bitrate'] = audio_bitrate
- codec_match = re.search('codecs="(?P[^"]+)"', _discarded_stream['audio']['codec'])
- if codec_match:
- _discarded_stream['audio']['codec'] = codec_match.group('codec')
- _discarded_stream['audio']['bandwidth'] = int(stream['bandwidth'])
- _discarded_stream['reason'] = reason
- return _discarded_stream
-
- def get_discarded_video(mime_type, itag, stream, reason='unsupported'):
- _discarded_stream = dict()
- _discarded_stream['video'] = dict()
- _discarded_stream['video']['itag'] = str(itag)
- _discarded_stream['video']['width'] = str(stream['width'])
- _discarded_stream['video']['height'] = str(stream['height'])
- if stream.get('quality_label'):
- _discarded_stream['video']['quality_label'] = str(stream['quality_label'])
- _discarded_stream['video']['fps'] = str(stream['frameRate'])
- _discarded_stream['video']['codec'] = str(stream['codecs'])
- _discarded_stream['video']['mime'] = str(mime_type)
- codec_match = re.search('codecs="(?P[^"]+)"', _discarded_stream['video']['codec'])
- if codec_match:
- _discarded_stream['video']['codec'] = codec_match.group('codec')
- _discarded_stream['video']['bandwidth'] = int(stream['bandwidth'])
- _discarded_stream['reason'] = reason
- return _discarded_stream
-
- def filter_qualities(stream_data, container, sorted_qualities, fps_limit):
-
- data_copy = copy.deepcopy(stream_data)
-
- if container == 'mp4':
- discard_mime = 'video/webm'
- mime_type = 'video/mp4'
- elif container == 'webm':
- discard_mime = 'video/mp4'
- mime_type = 'video/webm'
- else:
- return data_copy
-
- if fps_limit and mime_type in stream_data:
- # if 30 fps limit enabled, discard streams that are greater than 30fps
- if any(k for k in list(data_copy[mime_type].keys())
- if data_copy[mime_type][k]['fps'] <= 30):
- for k in list(data_copy[mime_type].keys()):
- if data_copy[mime_type][k]['fps'] > 30:
- discarded_streams.append(get_discarded_video(mime_type, k,
- data_copy[mime_type][k],
- 'frame rate'))
- del data_copy[mime_type][k]
-
- if discard_mime in data_copy:
- # discard streams with unwanted mime type
- for itag in list(data_copy[discard_mime].keys()):
- discarded_streams.append(get_discarded_video(discard_mime, itag,
- data_copy[discard_mime][itag],
- 'mime type'))
- del data_copy[discard_mime][itag]
- del data_copy[discard_mime]
-
- itag_matches = []
- itag_match = None
-
- for idx, q in enumerate(sorted_qualities):
- # find all streams with matching height
- if any(itag for itag in list(data_copy[mime_type].keys())
- if int(data_copy[mime_type][itag].get('height', 0)) == q):
- i_matches = [itag for itag in list(data_copy[mime_type].keys())
- if int(data_copy[mime_type][itag].get('height', 0)) == q]
- itag_matches.extend(i_matches)
- break
+ if media_type == 'audio':
+ data = audio_data
+ channels = stream.get('audioChannels', 2)
+ if channels > 2 and not allow_ssa:
+ continue
- if not itag_matches:
- # find best match for quality if there were no exact height candidates
- for idx, q in enumerate(sorted_qualities):
- if idx != len(sorted_qualities) - 1:
- if any(itag for itag in list(data_copy[mime_type].keys())
- if ((int(data_copy[mime_type][itag].get('height', 0)) < q) and
- (int(data_copy[mime_type][itag].get('height', 0)) >= sorted_qualities[idx + 1]))):
- i_match = next(itag for itag in list(data_copy[mime_type].keys())
- if ((int(data_copy[mime_type][itag].get('height', 0)) < q) and
- (int(data_copy[mime_type][itag].get('height', 0)) >=
- sorted_qualities[idx + 1])))
- itag_matches.append(i_match)
- break
-
- for itag in list(data_copy[mime_type].keys()):
- # find highest fps and bandwidth itag out of all candidates
- if itag in itag_matches:
- if (not itag_match or itag_match.get('fps') < data_copy[mime_type][itag].get('fps') or
- (itag_match.get('fps') == data_copy[mime_type][itag].get('fps') and
- itag_match.get('bandwidth') < data_copy[mime_type][itag].get('bandwidth'))):
- itag_match = data_copy[mime_type][itag]
-
- if itag_match:
- for itag in list(data_copy[mime_type].keys()):
- # discard all streams except the best match
- if itag != itag_match.get('id'):
- discarded_streams.append(get_discarded_video(mime_type, itag,
- data_copy[mime_type][itag],
- 'quality'))
- del data_copy[mime_type][itag]
-
- return data_copy
+ if 'audioTrack' in stream:
+ audio_track = stream['audioTrack']
- basepath = 'special://temp/plugin.video.youtube/'
- if not make_dirs(basepath):
- self._context.log_debug('Failed to create directories: %s' % basepath)
- return None
+ language = audio_track.get('id', default_lang_code)
+ if '.' in language:
+ language_code, role_type = language.split('.')
+ role_type = int(role_type)
+ else:
+ language_code = language
+ role_type = 4
+
+ if role_type == 4 or audio_track.get('audioIsDefault'):
+ role = 'main'
+ label = self._context.localize(30744)
+ elif role_type == 3:
+ role = 'dub'
+ label = self._context.localize(30745)
+ elif role_type == 2:
+ role = 'description'
+ label = self._context.localize(30746)
+ # Unsure of what other audio types are actually available
+ # Role set to "alternate" as default fallback
+ else:
+ role = 'alternate'
+ label = self._context.localize(30747)
+
+ mime_group = '{0}_{1}.{2}'.format(
+ mime_type, language_code, role_type
+ )
+ if (language_code == self._language_base and (
+ not preferred_audio['id']
+ or role == 'main'
+ or role_type > preferred_audio['role_type']
+ )):
+ preferred_audio = {
+ 'id': '_{0}.{1}'.format(language_code, role_type),
+ 'language_code': language_code,
+ 'role_type': role_type,
+ }
+ else:
+ language_code = default_lang_code
+ role = 'main'
+ role_type = 4
+ label = self._context.localize(30744)
+ mime_group = mime_type
+
+ sample_rate = int(stream.get('audioSampleRate', '0'), 10)
+ height = width = fps = frame_rate = hdr = None
+ language = self._context.get_language_name(language_code)
+ label = '{0} ({1} kbps)'.format(label, bitrate // 1000)
+ if channels > 2 or 'auto' not in stream_select:
+ quality_group = '{0}_{1}_{2}.{3}'.format(
+ container, codec, language_code, role_type
+ )
+ else:
+ quality_group = mime_group
- has_video_stream = False
- ia_capabilities = self._context.inputstream_adaptive_capabilities()
+ else:
+ data = video_data
+ # Could use "zxx" language code for
+ # "Non-Linguistic, Not Applicable" but that is too verbose
+ language_code = ''
- ipaddress = self._context.get_settings().httpd_listen()
- if ipaddress == '0.0.0.0':
- ipaddress = '127.0.0.1'
+ fps = stream.get('fps', 0)
+ if fps > 30 and not allow_hfr:
+ continue
- stream_info = {'video': {'height': '0', 'fps': '0', 'codec': '', 'mime': '', 'quality_label': '', 'bandwidth': 0},
- 'audio': {'bitrate': '0', 'codec': '', 'mime': '', 'bandwidth': 0}}
+ hdr = 'HDR' in stream.get('qualityLabel', '')
+ if hdr and not allow_hdr:
+ continue
- data = dict()
- for item in adaptive_fmts:
- stream_map = item
- stream_map['itag'] = str(stream_map.get('itag'))
+ height = stream.get('height')
+ width = stream.get('width')
+ if height > width:
+ compare_width = height
+ compare_height = width
+ else:
+ compare_width = width
+ compare_height = height
+
+ bounded_quality = {}
+ for quality in qualities:
+ if compare_width > quality['width']:
+ if bounded_quality:
+ if compare_height >= bounded_quality['height']:
+ quality = bounded_quality
+ elif compare_height < quality['height']:
+ quality = qualities[-1]
+ break
+ bounded_quality = quality
+ if not bounded_quality:
+ continue
- t = stream_map.get('mimeType')
- t = urllib.parse.unquote(t)
- t = t.split(';')
- mime = key = t[0]
- i = stream_map.get('itag')
- if 'audioTrack' in stream_map:
- key = '_'.join([mime, stream_map.get('audioTrack').get('id')[0:2]])
-
- if key not in data:
- data[key] = {}
- data[key][i] = {}
-
- data[key][i]['codecs'] = t[1][1:]
- data[key][i]['id'] = i
-
- data[key][i]['width'] = stream_map.get('width')
- data[key][i]['height'] = stream_map.get('height')
-
- data[key][i]['quality_label'] = str(stream_map.get('qualityLabel'))
-
- data[key][i]['bandwidth'] = stream_map.get('bitrate', 0)
-
- # map frame rates to a more common representation to lessen the chance of double refresh changes
- # sometimes 30 fps is 30 fps, more commonly it is 29.97 fps (same for all mapped frame rates)
- frame_rate = None
- fps_scale_map = {24: 1001, 30: 1001, 60: 1001}
- if 'fps' in stream_map:
- fps = int(stream_map.get('fps'))
- data[key][i]['fps'] = fps
- scale = fps_scale_map.get(fps, 1000)
- frame_rate = '%d/%d' % (fps * 1000, scale)
-
- data[key][i]['frameRate'] = frame_rate
-
- url = urllib.parse.unquote(stream_map.get('url'))
- url = url.replace("&", "&").replace('"', """).replace("<", "<").replace(">", ">")
-
- data[key][i]['baseUrl'] = url
-
- data[key][i]['indexRange'] = '0-0'
- data[key][i]['initRange'] = '0-0'
- if 'indexRange' in stream_map and 'initRange' in stream_map:
- data[key][i]['indexRange'] = '-'.join([stream_map.get('indexRange').get('start'),
- stream_map.get('indexRange').get('end')])
- data[key][i]['init'] = '-'.join([stream_map.get('initRange').get('start'),
- stream_map.get('initRange').get('end')])
- if ('indexRange' not in stream_map or 'initRange' not in stream_map or
- data[key][i].get('indexRange') == '0-0' and data[key][i].get('initRange') == '0-0'):
- if key.startswith('video'):
- discarded_streams.append(get_discarded_video(mime, i, data[key][i], 'no init or index'))
+ # map frame rates to a more common representation to lessen the
+ # chance of double refresh changes
+ if fps:
+ frame_rate = (fps_scale_map.get(fps)
+ or fps_scale_map[0].format(fps))
else:
- stream_format = self.FORMAT.get(i, {})
- discarded_streams.append(get_discarded_audio(stream_format, mime, i, data[key][i], 'no init or index'))
- del data[key][i]
+ frame_rate = None
+
+ mime_group = mime_type
+ channels = language = role = role_type = sample_rate = None
+ label = quality['label'].format(fps if fps > 30 else '',
+ ' HDR' if hdr else '',
+ compare_height)
+ quality_group = '{0}_{1}'.format(container, label)
+
+ if mime_group not in data:
+ data[mime_group] = {}
+ if quality_group not in data:
+ data[quality_group] = {}
+
+ url = unquote(url)
+ url = self._process_url_params(url)
+ url = (url.replace("&", "&")
+ .replace('"', """)
+ .replace("<", "<")
+ .replace(">", ">"))
+
+ data[mime_group][itag] = data[quality_group][itag] = {
+ 'mimeType': mime_type,
+ 'baseUrl': url,
+ 'mediaType': media_type,
+ 'container': container,
+ 'codecs': codecs,
+ 'codec': codec,
+ 'id': itag,
+ 'width': width,
+ 'height': height,
+ 'label': label,
+ 'bitrate': bitrate,
+ 'biasedBitrate': bitrate * quality_factor_map.get(codec, 1),
+ # integer round up
+ 'duration': -(-int(stream.get('approxDurationMs', 0)) // 1000),
+ 'fps': fps,
+ 'frameRate': frame_rate,
+ 'hdr': hdr,
+ 'indexRange': '{start}-{end}'.format(**index_range),
+ 'initRange': '{start}-{end}'.format(**init_range),
+ 'langCode': language_code,
+ 'langName': language,
+ 'role': role,
+ 'roleType': role_type,
+ 'sampleRate': sample_rate,
+ 'channels': channels,
+ }
- if not data.get('video/mp4') and not data.get('video/webm'):
+ if not video_data:
self._context.log_debug('Generate MPD: No video mime-types found')
return None, None
- mpd_quality = self._context.get_settings().get_mpd_quality()
- hdr = self._context.get_settings().include_hdr() and 'vp9.2' in ia_capabilities
- limit_30fps = self._context.get_settings().mpd_30fps_limit()
-
- supported_mime_types = []
- default_mime_type = 'mp4'
- if data.get('video/mp4'):
- supported_mime_types.append('video/mp4')
- if any(m for m in data if m.startswith('audio/mp4')):
- supported_mime_types.append('audio/mp4')
-
- if (('vp9' in ia_capabilities or 'vp9.2' in ia_capabilities) and
- any(m for m in data if m == 'video/webm') and
- data.get('video/webm')):
- supported_mime_types.append('video/webm')
-
- if (('vorbis' in ia_capabilities or 'opus' in ia_capabilities) and
- any(m for m in data if m.startswith('audio/webm'))):
- supported_mime_types.append('audio/webm')
-
- if ('video/webm' in supported_mime_types and
- ((isinstance(mpd_quality, str) and mpd_quality == 'webm') or
- (isinstance(mpd_quality, int) and mpd_quality > 1080) or
- hdr)):
- default_mime_type = 'webm'
-
- limit_qualities = self._context.get_settings().mpd_video_qualities()
- apply_filters = isinstance(mpd_quality, int) and isinstance(limit_qualities, list)
-
- self._context.log_debug('Generating MPD: Apply filters |{apply_filters}| '
- 'Quality selection |{quality}| Limit 30FPS |{limit_fps}| HDR |{hdr}|'
- .format(apply_filters=str(apply_filters),
- quality=(limit_qualities if isinstance(limit_qualities, str)
- else str(next(iter(limit_qualities), None))),
- limit_fps=str(limit_30fps),
- hdr=str(hdr)))
-
- if 'video/webm' in supported_mime_types:
- webm_streams = {}
- if hdr and any(k for k in list(data['video/webm'].keys()) if '"vp9.2"' in data['video/webm'][k]['codecs']):
- # when hdr enabled and available replace vp9 streams with vp9.2 (hdr)
- for key in list(data['video/webm'].keys()):
- if '"vp9.2"' in data['video/webm'][key]['codecs']:
- webm_streams[key] = data['video/webm'][key]
-
- discard_webm = [data['video/webm'][i] for i in (set(data['video/webm']) - set(webm_streams))
- if i in data['video/webm']]
-
- for d in discard_webm:
- discarded_streams.append(get_discarded_video('video/webm',
- d['id'],
- data['video/webm'][d['id']],
- 'replaced by hdr'))
- elif not hdr:
- # when hdr disabled and remove vp9.2 (hdr) streams
- for key in list(data['video/webm'].keys()):
- if '"vp9"' in data['video/webm'][key]['codecs']:
- webm_streams[key] = data['video/webm'][key]
-
- discard_webm = [data['video/webm'][i] for i in (set(data['video/webm']) - set(webm_streams))
- if i in data['video/webm']]
-
- for d in discard_webm:
- discarded_streams.append(get_discarded_video('video/webm',
- d['id'],
- data['video/webm'][d['id']],
- 'hdr disabled'))
-
- if webm_streams:
- data['video/webm'] = webm_streams
-
- if apply_filters:
- data = filter_qualities(data, default_mime_type, limit_qualities, limit_30fps)
-
- out_list = ['\n'
- '\n',
- '\t\n']
-
- n = 0
-
- for key in data:
- if "_" in key:
- key_parts = key.split("_")
- mime = key_parts[0]
- lang = key_parts[1]
+ def _stream_sort(stream):
+ if not stream:
+ return (1, )
+
+ return (
+ - stream['height'],
+ - stream['fps'],
+ - stream['hdr'],
+ - stream['biasedBitrate'],
+ ) if stream['mediaType'] == 'video' else (
+ - stream['channels'],
+ - stream['biasedBitrate'],
+ )
+
+ def _group_sort(item):
+ group, streams = item
+ main_stream = streams[0]
+
+ key = (
+ group != main_stream['mimeType'],
+ ) if main_stream['mediaType'] == 'video' else (
+ not group.startswith(main_stream['mimeType']),
+ preferred_audio['id'] not in group,
+ main_stream['langName'],
+ - main_stream['roleType'],
+ )
+ return key + _stream_sort(main_stream)
+
+ video_data = sorted((
+ (group, sorted(streams.values(), key=_stream_sort))
+ for group, streams in video_data.items()
+ ), key=_group_sort)
+
+ audio_data = sorted((
+ (group, sorted(streams.values(), key=_stream_sort))
+ for group, streams in audio_data.items()
+ ), key=_group_sort)
+
+ return video_data, audio_data
+
+ def _generate_mpd_manifest(self, video_data, audio_data, license_url):
+ if not video_data or not audio_data:
+ return None, None
+
+ basepath = 'special://temp/plugin.video.youtube/'
+ if not make_dirs(basepath):
+ self._context.log_debug('Failed to create temp directory: {0}'
+ .format(basepath))
+ return None, None
+
+ def _filter_group(previous_group, previous_stream, item):
+ skip_group = True
+ if not item:
+ return skip_group
+ if not previous_group or not previous_stream:
+ return not skip_group
+
+ new_group = item[0]
+ new_stream = item[1][0]
+
+ media_type = new_stream['mediaType']
+ if media_type != previous_stream['mediaType']:
+ return not skip_group
+
+ if previous_group.startswith(previous_stream['mimeType']):
+ if new_group.startswith(new_stream['container']):
+ return not skip_group
+
+ skip_group = (
+ new_stream['height'] <= previous_stream['height']
+ ) if media_type == 'video' else (
+ new_stream['channels'] <= previous_stream['channels']
+ )
else:
- mime = key
- lang = None
- if mime in supported_mime_types:
- default = False
- if mime.endswith(default_mime_type):
- default = True
+ if new_group.startswith(new_stream['mimeType']):
+ return not skip_group
- out_list.append(''.join(['\t\t\n']))
- if license_url is not None:
- license_url = license_url.replace("&", "&").replace('"', """).replace("<", "<").replace(">", ">")
- out_list.append(''.join(['\t\t\t\n', '\t\t\t\t', license_url, '\n', '\t\t\t\n']))
- out_list.append('\t\t\t\n')
- for i in data[key]:
- stream_format = self.FORMAT.get(i, {})
- if 'audio' in mime:
- audio_codec = str(data[key][i]['codecs'])
- match = re.search('codecs="(?P[^"]+)"', audio_codec)
- if match:
- audio_codec = match.group('codec')
-
- if 'opus' == audio_codec.lower() and 'opus' not in ia_capabilities:
- discarded_streams.append(get_discarded_audio(stream_format, mime, i, data[key][i]))
- continue
- elif 'vorbis' == audio_codec.lower() and 'vorbis' not in ia_capabilities:
- discarded_streams.append(get_discarded_audio(stream_format, mime, i, data[key][i]))
- continue
-
- if int(data[key][i]['bandwidth']) > int(stream_info['audio']['bandwidth']):
- stream_info['audio']['mime'] = str(mime)
- if stream_format:
- bitrate = int(stream_format.get('audio', {}).get('bitrate', 0))
- if bitrate > 0:
- stream_info['audio']['bitrate'] = bitrate
- stream_info['audio']['codec'] = stream_format.get('audio', {}).get('encoding')
- if not stream_info['audio'].get('codec'):
- stream_info['audio']['codec'] = audio_codec
- stream_info['audio']['bandwidth'] = int(data[key][i]['bandwidth'])
-
- out_list.append(''.join(['\t\t\t\n']))
- out_list.append('\t\t\t\t\n')
- else:
+ skip_group = (
+ new_stream['height'] == previous_stream['height']
+ ) if media_type == 'video' else (
+ 2 == new_stream['channels'] == previous_stream['channels']
+ )
+
+ skip_group = (
+ skip_group
+ and new_stream['fps'] == previous_stream['fps']
+ and new_stream['hdr'] == previous_stream['hdr']
+ ) if media_type == 'video' else (
+ skip_group
+ and new_stream['langCode'] == previous_stream['langCode']
+ and new_stream['role'] == previous_stream['role']
+ )
+ return skip_group
+
+ _settings = self._context.get_settings()
+ stream_features = _settings.stream_features()
+ do_filter = 'filter' in stream_features
+ stream_select = _settings.stream_select()
+
+ main_stream = {
+ 'video': video_data[0][1][0],
+ 'audio': audio_data[0][1][0],
+ 'multi_audio': False,
+ 'multi_lang': False,
+ }
- video_codec = str(data[key][i]['codecs'])
- match = re.search('codecs="(?P[^"]+)"', video_codec)
- if match:
- video_codec = match.group('codec')
-
- if 'vp9.2' == video_codec.lower() and ('vp9.2' not in ia_capabilities or
- not self._context.get_settings().include_hdr()):
- if not self._context.get_settings().include_hdr() and 'vp9.2' in ia_capabilities:
- discarded_streams.append(get_discarded_video(mime, i, data[key][i], 'hdr not selected'))
- else:
- discarded_streams.append(get_discarded_video(mime, i, data[key][i]))
- continue
- elif 'vp9' == video_codec.lower() and 'vp9' not in ia_capabilities:
- discarded_streams.append(get_discarded_video(mime, i, data[key][i]))
- continue
- elif video_codec.lower().startswith(('av01', 'av1')) and 'av1' not in ia_capabilities:
- discarded_streams.append(get_discarded_video(mime, i, data[key][i]))
- continue
-
- has_video_stream = True
- if default:
- if int(data[key][i]['bandwidth']) > int(stream_info['video']['bandwidth']):
- stream_info['video']['height'] = str(data[key][i]['height'])
- stream_info['video']['fps'] = str(data[key][i]['frameRate'])
- stream_info['video']['mime'] = str(mime)
- stream_info['video']['codec'] = video_codec
- stream_info['video']['bandwidth'] = int(data[key][i]['bandwidth'])
- if data[key][i].get('quality_label'):
- stream_info['video']['quality_label'] = str(data[key][i]['quality_label'])
- if stream_format:
- stream_info['video']['codec'] = stream_format.get('video', {}).get('encoding')
- if not stream_info['video'].get('codec'):
- stream_info['video']['codec'] = video_codec
-
- video_codec = data[key][i]['codecs']
- out_list.append(''.join(['\t\t\t\n']))
-
- out_list.append(''.join(['\t\t\t\t', data[key][i]['baseUrl'], '\n']))
- out_list.append(''.join(['\t\t\t\t\n', '\t\t\t\t\t\t\n', '\t\t\t\t\n']))
- out_list.append('\t\t\t\n')
- out_list.append('\t\t\n')
- n = n + 1
+ out_list = [
+ '\n'
+ '\n'
+ '\t\n'
+ ]
+
+ set_id = 0
+ group = stream = None
+ languages = set()
+ roles = set()
+ for item in (video_data + audio_data):
+ default = original = impaired = False
+
+ if do_filter and _filter_group(group, stream, item):
+ continue
+ group, streams = item
+ stream = streams[0]
+ container = stream['container']
+ media_type = stream['mediaType']
+ mime_type = stream['mimeType']
+ language = stream['langCode']
+ role = stream['role'] or ''
+
+ if group.startswith(mime_type) and 'auto' in stream_select:
+ label = '{0} [{1}]'.format(
+ stream['langName'] or self._context.localize(30583),
+ stream['label']
+ )
+ if stream == main_stream[media_type]:
+ default = True
+ role = 'main'
+ elif group.startswith(container) and 'list' in stream_select:
+ if 'auto' in stream_select or media_type == 'video':
+ label = stream['label']
+ else:
+ label = '{0} {1}'.format(
+ stream['langName'],
+ stream['label']
+ )
+ if stream == main_stream[media_type]:
+ default = True
+ role = 'main'
else:
- for i in data[key]:
- stream_format = self.FORMAT.get(i, {})
- if 'audio' in mime:
- discarded_stream = get_discarded_audio(stream_format, mime, i, data[key][i])
- else:
- discarded_stream = get_discarded_video(mime, i, data[key][i])
- discarded_streams.append(discarded_stream)
+ continue
- out_list.append('\t\n\n')
+ if role == 'main':
+ if not default:
+ role = 'alternate'
+ original = True
+ elif role == 'description':
+ impaired = True
+
+ languages.add(language)
+ roles.add(role)
+
+ out_list.extend((
+ '\t\t\n'
+ # AdaptationSet Label element not currently used by ISA
+ '\t\t\t\n'
+ '\t\t\t\n'
+ ))
+
+ if license_url:
+ license_url = (license_url.replace("&", "&")
+ .replace('"', """).replace("<", "<")
+ .replace(">", ">"))
+ out_list.extend((
+ '\t\t\t\n'
+ '\t\t\t\t',
+ license_url,
+ '\n'
+ '\t\t\t\n'
+ ))
+
+ num_streams = len(streams)
+ if media_type == 'audio':
+ out_list.extend(((
+ '\t\t\t\n'
+ '\t\t\t\t\n'
+ # Representation Label element is not used by ISA
+ '\t\t\t\t\n'
+ '\t\t\t\t{baseUrl}\n'
+ '\t\t\t\t\n'
+ '\t\t\t\t\t\n'
+ '\t\t\t\t\n'
+ '\t\t\t\n'
+ ).format(
+ quality=(idx + 1), priority=(num_streams - idx), **stream
+ ) for idx, stream in enumerate(streams)))
+ elif media_type == 'video':
+ out_list.extend(((
+ '\t\t\t\n'
+ # Representation Label element is not used by ISA
+ '\t\t\t\t\n'
+ '\t\t\t\t{baseUrl}\n'
+ '\t\t\t\t\n'
+ '\t\t\t\t\t\n'
+ '\t\t\t\t\n'
+ '\t\t\t\n'
+ ).format(
+ quality=(idx + 1), priority=(num_streams - idx), **stream
+ ) for idx, stream in enumerate(streams)))
+
+ out_list.append('\t\t\n')
+ set_id += 1
+
+ out_list.append('\t\n'
+ '\n')
out = ''.join(out_list)
- self._context.log_debug('Generated MPD highest supported quality found: |%s|' % str(stream_info))
- if discarded_streams:
- discarded_streams = sorted(discarded_streams, key=lambda k: k.get('audio', k.get('video', {}))['bandwidth'], reverse=True)
- self._context.log_debug('Generated MPD discarded streams: \n%s' % '\n'.join(str(stream) for stream in discarded_streams))
-
- if not has_video_stream:
- self._context.log_debug('Generated MPD no supported video streams found')
+ if len(languages.difference({'', 'und'})) > 1:
+ main_stream['multi_lang'] = True
+ if roles.difference({'', 'main', 'dub'}):
+ main_stream['multi_audio'] = True
- filepath = '{base_path}{video_id}.mpd'.format(base_path=basepath, video_id=video_id)
- try:
- f = xbmcvfs.File(filepath, 'w')
- if PY2:
- _ = f.write(out.encode('utf-8'))
- else:
- _ = f.write(str(out))
- f.close()
- return 'http://{ipaddress}:{port}/{video_id}.mpd'.format(
- ipaddress=ipaddress,
- port=self._context.get_settings().httpd_port(),
- video_id=video_id
- ), stream_info
- except:
+ filepath = '{0}{1}.mpd'.format(basepath, self.video_id)
+ success = None
+ with xbmcvfs.File(filepath, 'w') as mpd_file:
+ success = mpd_file.write(str(out))
+ if not success:
return None, None
+ return 'http://{0}:{1}/{2}.mpd'.format(
+ _settings.httpd_listen(for_request=True),
+ _settings.httpd_port(),
+ self.video_id
+ ), main_stream
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_login.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_login.py
index 1e2df0b067..faa621b68f 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_login.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_login.py
@@ -8,8 +8,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six.moves import range
-
import copy
import json
import time
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_play.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_play.py
index 5be425c430..9de573632d 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_play.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_play.py
@@ -82,18 +82,19 @@ def play_video(provider, context):
incognito = str(context.get_param('incognito', False)).lower() == 'true'
use_history = not is_live and not screensaver and not incognito
- playback_history = use_history and settings.use_playback_history()
+ use_remote_history = use_history and settings.use_remote_history()
+ use_play_data = use_history and settings.use_local_history()
+
video_item = utils.update_play_info(provider, context, video_id, video_item, video_stream,
- use_play_data=playback_history)
+ use_play_data=use_play_data)
seek_time = None
play_count = 0
playback_stats = video_stream.get('playback_stats')
- if use_history:
- major_version = context.get_system_version().get_version()[0]
- if video_item.get_start_time() and video_item.use_dash() and major_version > 17:
+ if use_remote_history:
+ if video_item.get_start_time() and video_item.use_mpd_video():
seek_time = video_item.get_start_time()
play_count = video_item.get_play_count() if video_item.get_play_count() is not None else '0'
@@ -113,8 +114,8 @@ def play_video(provider, context):
"video_status": metadata.get('video', {}).get('status', {}),
"playing_file": video_item.get_uri(),
"play_count": play_count,
- "use_history": use_history,
- "playback_history": playback_history,
+ "use_remote_history": use_remote_history,
+ "use_local_history": use_play_data,
"playback_stats": playback_stats,
"seek_time": seek_time,
"refresh_only": screensaver
diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/provider.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/provider.py
index fea2957999..bdab66582b 100644
--- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/provider.py
+++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/provider.py
@@ -108,7 +108,7 @@ class Provider(kodion.AbstractProvider):
'youtube.succeeded': 30575,
'youtube.failed': 30576,
'youtube.settings': 30577,
- 'youtube.dash.enable.confirm': 30579,
+ 'youtube.mpd.enable.confirm': 30579,
'youtube.reset.access.manager.confirm': 30581,
'youtube.my_subscriptions_filtered': 30584,
'youtube.add.my_subscriptions.filter': 30587,
@@ -1077,8 +1077,7 @@ def configure_addon(self, context, re_match):
context.addon().openSettings()
context.get_ui().refresh_container()
elif switch == 'mpd':
- use_dash = context.use_inputstream_adaptive()
- if use_dash:
+ if context.use_inputstream_adaptive():
xbmcaddon.Addon(id='inputstream.adaptive').openSettings()
else:
settings.set_bool('kodion.video.quality.mpd', False)
diff --git a/plugin.video.youtube/resources/lib/youtube_registration.py b/plugin.video.youtube/resources/lib/youtube_registration.py
index 45c143b55a..ab64f9ad4d 100644
--- a/plugin.video.youtube/resources/lib/youtube_registration.py
+++ b/plugin.video.youtube/resources/lib/youtube_registration.py
@@ -7,7 +7,6 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import PY3, binary_type
from base64 import b64encode
from youtube_plugin.kodion.json_store import APIKeyStore
from youtube_plugin.kodion.impl import Context
@@ -54,14 +53,9 @@ def register_api_keys(addon_id, api_key, client_id, client_secret):
jkeys = json_api['keys']['developer'].get(addon_id, {})
- if PY3:
- api_key = b64encode(binary_type(api_key, 'utf-8')).decode('ascii')
- client_id = b64encode(binary_type(client_id, 'utf-8')).decode('ascii')
- client_secret = b64encode(binary_type(client_secret, 'utf-8')).decode('ascii')
- else:
- api_key = b64encode(api_key)
- client_id = b64encode(client_id)
- client_secret = b64encode(client_secret)
+ api_key = b64encode(bytes(api_key, 'utf-8')).decode('ascii')
+ client_id = b64encode(bytes(client_id, 'utf-8')).decode('ascii')
+ client_secret = b64encode(bytes(client_secret, 'utf-8')).decode('ascii')
api_keys = {
'origin': addon_id, 'main': {
diff --git a/plugin.video.youtube/resources/lib/youtube_requests.py b/plugin.video.youtube/resources/lib/youtube_requests.py
index 547c8f30ea..cf062d1968 100644
--- a/plugin.video.youtube/resources/lib/youtube_requests.py
+++ b/plugin.video.youtube/resources/lib/youtube_requests.py
@@ -39,7 +39,7 @@ def handle_error(context, json_data):
return True
-def v3_request(method='GET', headers=None, path=None, post_data=None, params=None, allow_redirects=True, addon_id=None):
+def v3_request(method='GET', headers=None, path=None, post_data=None, params=None, addon_id=None):
"""
https://developers.google.com/youtube/v3/docs/
:param method:
@@ -47,12 +47,11 @@ def v3_request(method='GET', headers=None, path=None, post_data=None, params=Non
:param path:
:param post_data:
:param params:
- :param allow_redirects:
:param addon_id: addon id associated with developer keys to use for requests
:type addon_id: str
"""
provider, context, client = __get_core_components(addon_id)
- return client.perform_v3_request(method=method, headers=headers, path=path, post_data=post_data, params=params, allow_redirects=allow_redirects)
+ return client.perform_v3_request(method=method, headers=headers, path=path, post_data=post_data, params=params)
def _append_missing_page_token(items):
diff --git a/plugin.video.youtube/resources/lib/youtube_resolver.py b/plugin.video.youtube/resources/lib/youtube_resolver.py
index 8748cd166c..28eb032561 100644
--- a/plugin.video.youtube/resources/lib/youtube_resolver.py
+++ b/plugin.video.youtube/resources/lib/youtube_resolver.py
@@ -7,10 +7,7 @@
See LICENSES/GPL-2.0-only for more information.
"""
-from six import string_types
import re
-import json
-import requests
from youtube_plugin.youtube.provider import Provider
from youtube_plugin.kodion.impl import Context
@@ -57,6 +54,6 @@ def resolve(video_id, sort=True, addon_id=None):
streams = client.get_video_streams(context=context, video_id=matched_id)
if sort and streams:
- streams = sorted(streams, key=lambda x: x.get('sort', 0), reverse=True)
+ streams = sorted(streams, key=lambda x: x.get('sort', (0, 0)))
return streams
diff --git a/plugin.video.youtube/resources/media/fanart.jpg b/plugin.video.youtube/resources/media/fanart.jpg
index 7d7202f356..2d05a9be52 100644
Binary files a/plugin.video.youtube/resources/media/fanart.jpg and b/plugin.video.youtube/resources/media/fanart.jpg differ
diff --git a/plugin.video.youtube/icon.png b/plugin.video.youtube/resources/media/icon.png
similarity index 100%
rename from plugin.video.youtube/icon.png
rename to plugin.video.youtube/resources/media/icon.png
diff --git a/plugin.video.youtube/resources/settings.xml b/plugin.video.youtube/resources/settings.xml
index 240043a94a..70429df9f6 100644
--- a/plugin.video.youtube/resources/settings.xml
+++ b/plugin.video.youtube/resources/settings.xml
@@ -1,9 +1,9 @@
-
+
-
+
0
3
@@ -17,27 +17,27 @@
- false
+ false
-
+
0
false
- false
+ false
-
+
0
false
-
+
0
RunPlugin(plugin://plugin.video.youtube/config/subtitles/)
@@ -55,7 +55,7 @@
true
-
+
0
0
@@ -67,7 +67,7 @@
-
+
0
false
@@ -77,17 +77,17 @@
-
+
0
false
-
+
0
false
-
+
0
85
@@ -104,34 +104,34 @@
false
-
+
0
true
-
+
0
false
-
+
0
false
- true
+ true
-
+
0
false
-
+
0
1
@@ -142,22 +142,22 @@
-
+
0
true
-
+
0
true
- true
+ true
-
+
0
50
@@ -169,7 +169,7 @@
false
-
+
0
10
@@ -181,7 +181,7 @@
false
-
+
0
0
@@ -193,16 +193,16 @@
-
+
0
true
-
+
-
+
0
false
@@ -212,7 +212,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/config/mpd/)
@@ -220,7 +220,7 @@
- true
+ true
@@ -229,83 +229,127 @@
-
+
0
true
- true
+ true
-
+
0
- 8
+ 4
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
- true
+ true
-
- 0
- false
-
+
+ 0
+ avc1,vp9,av01,hdr,hfr,vorbis,opus,mp4a,ssa,ac-3,ec-3,dts,filter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+ 1
+
+
-
- true
- 8
-
+ true
-
+
+ true
+ true
+
-
+
0
- false
+ 1
+
+
+
+
+
+
+
-
- true
- false
- 8
- 9
-
+ true
-
+
-
+
0
- true
+ 0
+
+
+
+
+
+
+
+
+
-
- true
+
+ true
-
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+ false
+
+
+
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/inputstreamhelper/install/)
@@ -313,44 +357,48 @@
- true
+
+ true
+ 1
+ 1
+
-
+
-
+
0
true
-
+
0
true
-
+
0
false
-
+
0
false
- true
+ true
- true
+ true
-
+
0
@@ -358,52 +406,52 @@
- true
+ true
- true
+ true
30585
-
+
0
true
-
+
0
true
-
+
0
true
-
+
0
false
-
+
0
false
-
+
0
true
-
+
0
true
-
+
0
true
@@ -413,12 +461,12 @@
-
+
0
true
-
+
0
@@ -426,32 +474,32 @@
- true
+ true
- true
+ true
30037
-
+
0
true
-
+
0
true
-
+
0
true
-
+
0
@@ -459,22 +507,22 @@
- true
+ true
- true
+ true
30038
-
+
0
true
-
+
0
true
@@ -484,51 +532,51 @@
-
+
0
true
-
+
0
true
-
+
0
true
-
+
0
true
-
+
0
true
-
+
0
true
-
+
0
true
-
+
0
true
-
+
-
+
0
RunPlugin(plugin://plugin.video.youtube/users/add/?refresh=false)
@@ -536,7 +584,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/users/remove/?refresh=false)
@@ -544,7 +592,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/users/rename/?refresh=false)
@@ -552,7 +600,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/users/switch/?refresh=false)
@@ -562,43 +610,60 @@
-
+
-
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
0
true
-
+
0
false
-
+
0
false
- true
+ true
-
+
0
true
-
+
+ 0
+ false
+
+
+
0
false
-
+
0
10
@@ -610,14 +675,14 @@
false
-
+
0
true
-
+
0
en-US
@@ -629,7 +694,7 @@
30523
-
+
0
US
@@ -641,7 +706,7 @@
30550
-
+
0
@@ -656,7 +721,7 @@
30651
-
+
0
500
@@ -675,9 +740,9 @@
-
+
-
+
0
0.0.0.0
@@ -689,7 +754,7 @@
30643
-
+
0
RunPlugin(plugin://plugin.video.youtube/config/listen_ip/)
@@ -699,7 +764,7 @@
true
-
+
0
50152
@@ -711,7 +776,7 @@
30619
-
+
0
@@ -726,7 +791,7 @@
30629
-
+
0
RunPlugin(plugin://plugin.video.youtube/show_client_ip/)
@@ -736,9 +801,9 @@
-
+
-
+
0
@@ -748,7 +813,7 @@
30201
-
+
0
@@ -758,7 +823,7 @@
30202
-
+
0
@@ -768,23 +833,23 @@
30203
-
+
0
true
-
+
0
false
-
+
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/function_cache/clear/)
@@ -792,7 +857,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/data_cache/clear/)
@@ -800,7 +865,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/search_cache/clear/)
@@ -808,7 +873,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/playback_history/clear/)
@@ -818,7 +883,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/function_cache/delete/)
@@ -826,7 +891,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/data_cache/delete/)
@@ -834,7 +899,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/search_cache/delete/)
@@ -842,7 +907,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/playback_history/delete/)
@@ -852,7 +917,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/access_manager/reset/)
@@ -864,7 +929,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/settings_xml/delete/)
@@ -874,7 +939,7 @@
true
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/api_keys/delete/)
@@ -882,7 +947,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/access_manager/delete/)
@@ -890,7 +955,7 @@
-
+
0
RunPlugin(plugin://plugin.video.youtube/maintain/temp_files/delete/)
@@ -898,7 +963,7 @@
-
+
0
@@ -913,7 +978,7 @@
-
+
0
@@ -928,7 +993,7 @@
-
+
0
0
@@ -940,7 +1005,7 @@
-
+
0