Stage new submodule locations

This commit is contained in:
2025-08-17 16:59:41 -07:00
parent e4afe79832
commit cfc6ac22e5
48 changed files with 12753 additions and 0 deletions

2
submodules/ModernZ/.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
* text=auto
*.conf linguist-language=EditorConfig

View File

@@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
ModernZ Github Issues.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View File

@@ -0,0 +1,99 @@
How to contribute
=================
General
-------
All contributions are generally welcomed. We always appreciate the effort and time taken by others to improve or fix ModernZ.
If you're hesitant or not sure about a specific contribution, you can always open an issue to ask a question or discuss something in detail to see if your contribution goes with ModernZ plans or not.
Main project goals
------------------
- Revive and maintain the modern osc origin, as it is either abandoned or partially maintained by adding new code without fixing the old.
- Apply common features that are missing and most users would want (ie: customization, button functions, lists and so on)
ModernZ is trying to be in a middle area between stock OSC and a project like uosc. One is too simple, the other is too complicated.
One of the first things that happened in ModernZ was to re-base on stock osc and integrate features that mpv already has, which eliminated a ton of bloat from the code.
In essence, we want to be better than stock OSC, but we don't want to do everything. That is why for example we integrated locale as extras, and the same thing was done for the pause indicator.
If it's useful, but not necessary to the OSC, it should be in extras or an independent script. Modular methodology.
Sending patches
---------------
- Make a GitHub pull request.
- Plain diffs posted as pastebins are not acceptable. They only cause extra work for everyone, because they lack
commit message and authorship information.
- Be sure to test your changes. If you didn't, please say so in the commit
message and the pull request text.
Write good commit messages
--------------------------
- Write informative commit messages. Use present tense to describe the
situation with the patch applied, and past tense for the situation before
the change.
- The subject line (the first line in a commit message) must contain an
identifying prefix, followed by a short description what
impact this commit has on ModernZ osc.
Split changes into multiple commits
-----------------------------------
- Follow git good practices, and split independent changes into several commits.
It's usually OK to put them into a single pull request.
- Try to separate cosmetic and functional changes. It's ok to make a few
additional cosmetic changes in the same file you're working on. However, don't do
something like reformatting a whole file, and hiding an actual functional
change in the same commit.
- Splitting changes does _not_ mean that you should make them as fine-grained
as possible. Commits should form logical steps in development. The way you
split changes is important for code review and analyzing bugs.
- We prefer to have pull requests in a merge
ready state.
Touching user-visible elements may require updating the docs
-------------------------------------------------------------
- Most user-visible elements are normally documented in docs/. If your commit
touches documented behavior, list of options, etc., you need to adjust the
documentation.
- These changes usually go into the same commit that changes the code.
Code of Conduct
---------------
Please note that this project is released with a Contributor Code of Conduct.
By participating in this project you agree to abide by its terms.
The Contributor Code of Conduct can be found here:
https://www.contributor-covenant.org/version/2/0/code_of_conduct/
Copyright of contributions
--------------------------
- The copyright belongs to contributors. The project is a collaborative work. By
sending your changes, you agree to license your contributions according to the
requirements of this project.
- All new code must be LGPLv2.1+ licensed, or come with the implicit agreement
that it will be relicensed to LGPLv2.1+ later.
- 100% compatible licenses are allowed too.
- Changes in files with more liberal licenses (such as BSD, MIT, or ISC) are
assumed to be dual-licensed under LGPLv2.1+ and the license indicated in the
file header.
- You must be either the exclusive author of the patch, or acknowledge all
authors involved in the commit message. If you take 3rd party code, authorship
and copyright must be properly acknowledged. If you're making changes on
behalf of your employer, and the employer owns the copyright, you must mention
this. If the license of the code is not LGPLv2.1+, you must mention this.
- These license statements are legally binding.
- Don't use fake names (something that looks like an actual name, and may be
someone else's name, but is not your legal name). Using a pseudonym is
allowed if it can be used to identify or contact you, even if whatever
account you used to submit the patch dies.
- Do not add your name to the license header. This convention is not used by
this project, and neither copyright law nor any of the used licenses require
it.

View File

@@ -0,0 +1,15 @@
name: "Request a new Feature"
description: "Create a request for a new feature"
labels: ["feature request"]
body:
- type: textarea
attributes:
label: "Expected behavior of the wanted feature"
description: >
Before requesting a new feature, make sure it hasn't been
[requested yet](https://github.com/Samillion/ModernZ/labels/feature%20request).
If you are not sure about this, please read
[FAQ and guidelines](https://github.com/Samillion/ModernZ/blob/main/docs/FAQ.md) first.
validations:
required: true

View File

@@ -0,0 +1,74 @@
name: "Report an issue or a bug"
description: "Create a report for an issue or a bug"
labels: ["bug"]
body:
- type: textarea
attributes:
label: "mpv Information"
placeholder: |
mpv v0.39.0-300-g42ff6f92 Copyright © 2000-2024 mpv/MPlayer/mplayer2 projects
built on Nov 3 2024 00:06:03
libplacebo version: v7.349.0 (v7.349.0-19-g118d810-dirty)
FFmpeg version: N-117698-gc325f9c61
FFmpeg library versions:
libavcodec 61.23.100
libavdevice 61.4.100
libavfilter 10.6.101
libavformat 61.9.100
libavutil 59.46.100
libswscale 8.9.101
description: |
Provide the output of `mpv --version`.
render: bash
validations:
required: false
- type: textarea
attributes:
label: "Reproduction Steps"
description: >
Try to reproduce your issue with `--no-config` and mpv's stock osc first. If it is reproducible
even then, try to find out which option or script causes your issue.
Describe the reproduction steps as precise as possible. It's very likely that
the bug you experience wasn't reproduced by the developer because the workflow
differs from your own.
validations:
required: true
- type: textarea
attributes:
label: "Expected Behavior"
placeholder: "What were you expecting?"
validations:
required: true
- type: textarea
attributes:
label: "Actual Behavior"
placeholder: "What happened instead?"
validations:
required: true
- type: textarea
attributes:
label: "Log File"
placeholder: "Drag and drop log file here (Don't paste content directly)"
description: >
Make a log file with `--log-file=output.txt` and
attach it to the issue. [[details](https://mpv.io/manual/master/#options-log-file)]
If you have trouble producing a log file, you can alternatively use `-v -v`,
save the terminal output to a file, and attach it to the issue.
Disclaimer: The log file may contain identifiable information, such as your username.
Review the log file before sharing and redact any sensitive data if necessary.
validations:
required: false
- type: checkboxes
attributes:
label: "I carefully read all instructions and confirm that I did the following:"
options:
- label: "I tested with the latest mpv version to validate that the issue is not already fixed."
required: true
- label: "I provided all required information."
required: true

View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: FAQ and guidelines (Important)
url: https://github.com/Samillion/ModernZ/blob/main/docs/FAQ.md
about: Frequent questions are answered there, also includes useful guidelines
- name: Discussions and Questions
url: https://github.com/Samillion/ModernZ/discussions
about: A place to discuss or ask a general question regarding ModernZ osc

View File

@@ -0,0 +1,7 @@
Read this before you submit a pull request please:
https://github.com/Samillion/ModernZ/blob/main/.github/CONTRIBUTING.md
Reading this link and following the rules will get your pull request reviewed
and merged faster.
Delete this message after reading the link

504
submodules/ModernZ/LICENSE Normal file
View File

@@ -0,0 +1,504 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random
Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

View File

@@ -0,0 +1,209 @@
<h1 align="center">ModernZ - A Sleek Alternative OSC for mpv</h1>
A sleek and modern OSC for [mpv](https://mpv.io/), this project is a fork of ModernX designed to enhance functionality by adding more features, all while preserving the core standards of mpv's OSC.
![ModernZ-OSC](https://github.com/user-attachments/assets/f6854de6-1d57-4b2f-848e-7197933b71aa)
<p align="center">
<a href="#installation"><strong>Installation »</strong></a>
<br>
<a href="#configuration">Configuration</a>
·
<a href="#controls">Controls</a>
·
<a href="#interactive-menus">Interactive Menus</a>
·
<a href="#translations">OSC Language</a>
·
<a href="#extras">Extra Scripts</a>
</p>
## Features
- 🎨 Modern, customizable interface [[options](#configuration)]
- 📷 Image Viewer mode with zoom controls [[details](/docs/IMAGE_VIEWER.md)]
- 🎛️ Buttons: download, playlist, speed control, screenshot, pin, loop, cache and more. [[details](/docs/CONTROLS.md)]
- 📄 Interactive menus for playlist, subtitles, chapters, audio tracks and audio devices [[details](#interactive-menus)]
- 🌐 Multi-language support with JSON [locale](#translations) integration
- ⌨️ Configurable controls [[details](#controls)]
- 🖼️ Video thumbnail previews with [thumbfast](https://github.com/po5/thumbfast)
## Customization
You can change the icon theme to `fluent` or `material` to match your taste and style by using the `icon_theme` option in your `modernz.conf`
![modernz_fluent](https://github.com/user-attachments/assets/3aafac8c-a13f-4840-8119-739523eb7a8e)
![modernz_material](https://github.com/user-attachments/assets/e5ad6d06-f071-42ef-9210-296d95906d94)
Not a fan of white buttons and text? You have complete control to customize colors and button layouts to perfectly reflect your style.
![modernz_osc_controls_top](https://github.com/user-attachments/assets/9e3df3af-d3ea-41bb-8c9a-9bf64c1d895a)
![modernz_osc_controls_bottom](https://github.com/user-attachments/assets/d4e56bf5-ce7b-44e9-90a3-e27e922dd6bd)
See the [Color Customization](docs/USER_OPTS.md#colors-and-style) section in the configuration guide for details on how to customize colors and buttons.
## Interactive Menus
ModernZ supports mpv's built-in console/select ([v0.40+](https://github.com/mpv-player/mpv/releases/tag/v0.40.0)) for playlist, subtitles, chapter navigation and more.
[![preview_menus](https://github.com/user-attachments/assets/4b7a3139-81f1-409b-98f5-f090a81d5ee6)](/docs/INTERACTIVE_MENUS.md)
## Installation
1. **Disable Stock OSC**
- Add `osc=no` in your `mpv.conf`
2. **Copy Files**
- Place `modernz.lua` in your mpv scripts directory
- Place `fluent-system-icons.ttf` and `material-design-icons.ttf` in your mpv fonts directory
- (OPTIONAL) Place `thumbfast.lua` in your mpv scripts directory
3. **Locations**
```
Linux: ~/.config/mpv/
Windows: C:/Users/%username%/AppData/Roaming/mpv/
macOS: ~/Library/Application Support/mpv/
```
4. **Folder Structure** [[mpv manual](https://mpv.io/manual/master/#files)]
```
mpv/
├── fonts/
│ ├── fluent-system-icons.ttf
│ └── material-design-icons.ttf
├── script-opts/
│ └── modernz.conf
└── scripts/
├── modernz.lua
└── thumbfast.lua (optional)
```
## Configuration
1. Create `modernz.conf` in the `/script-opts` folder to customize settings
- [Download default modernz.conf](./modernz.conf)
2. Example of a short configuration:
```EditorConfig
# Seekbar color (hex format)
seekbarfg_color=#B7410E
# Interface options
playlist_button=no
title=${media-title}
scalewindowed=1.0
window_top_bar=auto
```
For a full list of options, [check out the detailed list here](docs/USER_OPTS.md).
## Controls
### Button Interactions
- Left click: Primary action
- Right click: Secondary action
- Middle click/Shift+Left click: Alternative action
> [!NOTE]
> Middle clicking performs the same function as `Shift+left mouse button`, allowing for one handed use
For a full list of interactions, check out the [Button Interactions Guide](docs/CONTROLS.md).
### Keybinds
ModernZ doesn't set keybinds by default to avoid interfering with your current setup. You can add keybinds in `input.conf` if you prefer:
```
w script-binding modernz/progress-toggle # Toggle progress bar
x script-message-to modernz osc-show # Show OSC
y script-message-to modernz osc-visibility cycle # Cycle visibility modes
z script-message-to modernz osc-idlescreen # Toggle idle screen
```
## Translations
ModernZ is currently available in English, but you can easily switch it to your preferred language! Here's how:
1. **Download the locale pack:**
Grab the [modernz-locale.json](/extras/locale/modernz-locale.json) file from this repository. This file holds translations for various languages.
2. **Add the locales to mpv:**
Copy the downloaded `modernz-locale.json` file to your mpv's `/script-opts` folder.
3. **Choose your language:**
There are two ways to set your preferred language:
- **Recommended:** Use the `modernz.conf` file
```ini
# Example configuration in modernz.conf
# Set language to Simplified Chinese
language=zh
```
- **Alternative:** Edit the `modernz.lua` script
Open `modernz.lua` and find the `user_opts` section near the beginning. Change the `language` value to your preferred code:
```lua
local user_opts = {
-- General
language = "en", -- Change this to your preferred language code
...
}
```
**Need More Info?**
For a complete list of available languages, contribution guidelines, and in-depth translation documentation, head over to the [TRANSLATIONS.md](docs/TRANSLATIONS.md).
## Extras
The following scripts are ones I wrote and maintain, feel free to use them if they're useful to you.
- [Pause-Indicator-Lite](/extras/pause-indicator-lite) - A simple script that displays an indicator on pause
- [ytdlAutoFormat](https://github.com/Samillion/mpv-ytdlautoformat) - A simple mpv script to automatically change `ytdl-format` (yt-dlp) for specified domains.
- [BoxtoWide](https://github.com/Samillion/mpv-boxtowide) - A simple mpv script to change 4:3 aspect-ratio of video files/streams to 16:9 automatically.
For even more useful scripts, check out the [mpv User Scripts Wiki](https://github.com/mpv-player/mpv/wiki/User-Scripts). It offers a wide range of community-contributed scripts to enhance your mpv experience.
## History
- [Samillion/ModernZ](https://github.com/Samillion/ModernZ)
- forked from [dexeonify/ModernX](https://github.com/dexeonify/mpv-config/blob/main/scripts/modernx.lua)
- forked from [cyl0/ModernX](https://github.com/cyl0/ModernX)
- forked from [maoiscat/mpv-osc-modern](https://github.com/maoiscat/mpv-osc-modern)
**Why fork yet again?**
- To add many features in: [Color Customization](docs/USER_OPTS.md#colors-and-style), [Options](docs/USER_OPTS.md) and [Locale Integration](docs/TRANSLATIONS.md)
- To integrate console and select into the osc, which inspired mpv to apply it in the stock osc. [ref [#1](https://github.com/mpv-player/mpv/pull/15016), [#2](https://github.com/mpv-player/mpv/pull/15031)]
- To add a dedicated layout for images. [[details](/docs/IMAGE_VIEWER.md)]
- To re-do the project entirely to match mpv's stock osc standards, to ensure compatibility
- To eliminate old bugs and redundancy within the code
- Which allows other `Modern` forks to use ModernZ as a base, such as [zydezu/ModernX](https://github.com/zydezu/ModernX). [[Reference](https://github.com/zydezu/ModernX/releases/tag/0.3.9)]
In essence, to maintain and revive the `modern-osc` origin.
Having said that, ModernZ still uses parts of the old code, and every previous and current fork author and contributor deserve credit (including mpv's stock osc), that is why they're mentioned in detail.
#### Credits:
- Font: UI Fluent System Icons [[details](https://github.com/microsoft/fluentui-system-icons)] [[font file](https://github.com/Samillion/ModernZ/blob/main/fluent-system-icons.ttf)]
- Font modified by [Xurdejl](https://github.com/Xurdejl) for use on ModernZ osc
- [mpv](https://github.com/mpv-player/mpv) and their [osc.lua](https://github.com/mpv-player/mpv/blob/master/player/lua/osc.lua), as ModernZ osc was re-based on the stock osc standards and applies updates from it
- All modern osc origin and their forks as mentioned in [history](#history)
- All [contributors](https://github.com/Samillion/ModernZ/graphs/contributors), testers and users that helped directly or indirectly with ModernZ osc ❤️

View File

@@ -0,0 +1,130 @@
# ModernZ Controls Guide
![modernz_osc_controls](https://github.com/user-attachments/assets/deb52cf2-8288-4f40-9993-9b7cb3e863e0)
## Button Interactions
Below is a list that explains the OSC buttons function depending on how you interact with them.
> [!NOTE]
> Middle clicking performs the same function as `Shift+left mouse button`, allowing for one handed use
### Title
| Action | Function |
| ----------------- | ------------------------- |
| Left mouse click | Show `media-title` in OSD |
| Right mouse click | Show `filename` in OSD |
### Seekbar
| Action | Function |
| ---------------------- | ---------------------------------- |
| Left mouse click | Seek to position (using keyframes) |
| Shift+left mouse click | Seek to the exact position |
| Right mouse click | Seek to the head of chosen chapter |
| Scroll wheel | Seek forward/backwards |
### Play Time Codes
| Action | Function |
| ----------------- | -------------------------------------------- |
| Left mouse click | Display remaining time instead of total time |
| Right mouse click | Display time in milliseconds |
### Play/Pause
| Action | Function |
| ----------------- | -------------------------- |
| Left mouse click | Toggle play/pause |
| Right mouse click | Toggle enable/disable loop |
### Playlist Track Back/Forward
| Action | Function |
| ---------------------- | ----------------------- |
| Left mouse click | Play previous/next file |
| Right mouse click | Show a simple playlist |
| Shift+left mouse click | Show a simple playlist |
### Skip Chapter Back/Forward
| Action | Function |
| ----------------------- | ------------------------------------- |
| Left mouse click | Go to previous/next chapter |
| Right mouse click | Show an interactive chapters list |
| Shift+left mouse click | Jump forwards/backwards by 60 seconds |
| Shift+right mouse click | Show a simple chapters list |
### Jump Back/Forward
| Action | Function |
| ---------------------- | ----------------------------------------------------------------------- |
| Left mouse click | Jumps forwards/backwards by 10 seconds (or by `user_opts` `jumpamount`) |
| Right mouse click | Jumps forwards/backwards by 1 minute |
| Shift+left mouse click | Skips to the previous/next frame (and pauses) |
### Audio/Subtitle
| Action | Function |
| ---------------------- | ----------------------------------- |
| Left mouse click | Show an interactive tracks list |
| Right mouse click | Cycle audio/subtitle track |
| Shift+left mouse click | Show a simple tracks list |
| Scroll wheel | Cycle audio/subtitle tracks up/down |
### Playlist
| Action | Function |
| ----------------- | ---------------------------- |
| Left mouse click | Show an interactive playlist |
| Right mouse click | Show a simple playlist |
### Volume
| Action | Function |
| ---------------- | --------------------- |
| Left mouse click | Toggle mute on/off |
| Scroll wheel | Change volume up/down |
### Screenshot
| Action | Function |
| ---------------- | ----------------- |
| Left mouse click | Take a screenshot |
### Pin
| Action | Function |
| ----------------- | -------------------------------------- |
| Left mouse click | Toggle pin and toggle window border |
| Right mouse click | Toggle pin without changing the border |
### Loop
| Action | Function |
| ----------------- | -------------------- |
| Left mouse click | Toggle loop on/off |
### Speed Control
| Action | Function |
| ---------------------- | ----------------------------------------- |
| Left mouse click | Increase playing speed by increments of 1 |
| Right mouse click | Reset playing speed to normal |
| Scroll wheel | Inc/decrease playing speed by 0.25 |
### Download
| Action | Function |
| ----------------- | ------------------------------------ |
| Left mouse click | Download the current video/image URL |
## Keybinds
| Function | Input Command | Description |
| ------------------- | -------------------------------------------------- | ------------------------------------------------------------------------ |
| Persistent Progress | `w script-binding modernz/progress-toggle` | Toggle persistent progress bar |
| Show OSC | `x script-message-to modernz osc-show` | Show OSC on command without needing to move mouse |
| OSC Visibility | `y script-message-to modernz osc-visibility cycle` | OSC visibility mode. Accepts `never`, `auto`, `always` and `cycle` |
| Logo on Idle | `z script-message-to modernz osc-idlescreen cycle` | The visibility of the mpv logo on idle. Accepts `yes`, `no`, and `cycle` |

View File

@@ -0,0 +1,37 @@
# ModernZ FAQ
Answers for frequently asked questions and helpful guidelines that might be useful to you. If you can't find your answer here, don't heistate to [open an issue](https://github.com/Samillion/ModernZ/issues/new/choose).
## Personalized requests
You can most likely achieve this by implementing an auto profile in your `mpv.conf` that applies specific ModernZ user options in certain or specific scenarios.
**Auto-profile examples:**
- [Custom fullscreen](https://github.com/Samillion/ModernZ/issues/206#issuecomment-2470315786)
- [PIP mode](https://github.com/Samillion/ModernZ/issues/91#issuecomment-2442569584)
- [Image viewer mode](https://github.com/Samillion/ModernZ/blob/main/docs/IMAGE_VIEWER.md#recommended)
- [Custom mode](https://github.com/Samillion/ModernZ/blob/main/docs/USER_OPTS.md#auto-profile)
## Issues or bug reports
- ModernZ is compatible with the latest mpv builds, please make sure to update your mpv to see if the issue persists
- Search open and closed issues to see if it has been posted before and resolved or not
- Make sure that the issue cannot be reproduced on mpv's stock OSC
- When posting a bug report, please include a log file with the issue reproduced so we can track the issue the best we can.
- Log file: `mpv sample.mp4 --log-file=output.txt` [[details](https://mpv.io/manual/master/#options-log-file)]
- Attach the log file, do not paste the text within the issue
- Describe the issue in detail as much as you can, preferably with exact steps on how to re-produce the issue.
## Feature requests
Many features and options were added compared to the `modern` origin osc, as shown in [features](/#features) and [user options](/docs/USER_OPTS.md) page.
We have reached a point that we've become very picky on adding new options, features or adjusting osc behavior, as it can be overwhelming for both users and maintainers if too many were added or adjusted.
That doesn't mean we won't add anything new, it just means that we're trying to be practical and realistic. Whether the change will benefit all, or a very specific use case.
## Useful links
- [ModernZ controls manual ](/docs/CONTROLS.md)
- [ModernZ user options manual](/docs/USER_OPTS.md)
- [ModernZ translations and locales](/docs/TRANSLATIONS.md)
- [ModernZ extra scripts](/#extras)
- [ModernZ history](/#history)
- [mpv manual](https://mpv.io/manual/master/)
Thank you.

View File

@@ -0,0 +1,56 @@
# ModernZ Image Viewer
A minimal layout is automatically applied when viewing images while using ModernZ osc, which also features zoom controls.
![image_mode_modernz](https://github.com/user-attachments/assets/49a860e9-298d-4af3-9303-6747e0fccc26)
## Zoom Controls
Below is a list that explains the zoom control functions depending on how you interact with them.
| Action | Function |
| ----------------- | -------------------------- |
| Left mouse click | Zoom in/out of image |
| Right mouse click | Reset zoom level to normal |
| Mouse Wheel | Zoom in/out of image |
## Recommended
The following options will help you enhance and automate your image viewing experience with mpv. Feel free to adjust them to your liking or use case.
Reset values per viewed file, should be added in top level within `mpv.conf`:
```EditorConfig
reset-on-next-file=video-zoom,panscan,video-unscaled,video-rotate,video-align-x,video-align-y
```
[Auto profiles](https://mpv.io/manual/master/#conditional-auto-profiles) that apply useful [mpv options](https://mpv.io/manual/master/#options) and [ModernZ options](/docs/USER_OPTS.md) when viewing images:
```EditorConfig
[video]
profile-cond=p["current-tracks/video"] and not p["current-tracks/video"].image
profile-restore=copy-equal
taskbar-progress=yes
[image]
profile-desc=ModernZ osc Image Viewer mode
profile-cond=p["current-tracks/video"] and p["current-tracks/video"].image and not p["current-tracks/video"].albumart
profile-restore=copy-equal
video-recenter=yes
taskbar-progress=no
stop-screensaver=no
prefetch-playlist=yes
video-aspect-override=no
image-display-duration=inf
title=${media-title} [${?width:${width}x${height}}]
script-opts-append=modernz-fade_alpha=50
script-opts-append=modernz-window_title=yes
script-opts-append=modernz-bottomhover_zone=50
script-opts-append=modernz-windowcontrols_title=${media-title} [${?width:${width}x${height}}]
```
## Useful
If you want to extend functionality even further to turn mpv into a full fledged image viewer, we recommend the following Github repository:
- https://github.com/guidocella/mpv-image-config
It allows you to have options such as:
- Cursor centeric zoom with scroll wheel
- Pan image, drag to pan and use gestures
- Double page mode (ie: manga)

View File

@@ -0,0 +1,38 @@
## Interactive Menus
ModernZ integrates mpv's [console.lua](https://github.com/mpv-player/mpv/blob/master/player/lua/console.lua) and [select.lua](https://github.com/mpv-player/mpv/blob/master/player/lua/select.lua), which have been built in mpv starting v0.39+. Can be used in:
- Playlist button
- Subtitles button
- Audio track button
- Chapter title (chapters list)
- Volume control button (audio device selector) [right mouse button]
For details on how to interact with these buttons, view the [controls manual](/docs/CONTROLS.md).
https://github.com/user-attachments/assets/a7330f29-c26d-4f5a-8797-d20f97211fdc
## Notes
> [!IMPORTANT]
> If the menus are not functioning as shown in the video, it is most likely because you're using an outdated version of mpv
- Check [mpv installation sources](https://mpv.io/installation/) on the official website for up-to-date packages
- Use [mpv-build](https://github.com/mpv-player/mpv-build) to get the latest release
- Use a simplified alternative function as shown below until you're able to update mpv
#### Alternative function: (for outdated mpv)
You can add the following to `modernz.conf` in your `script-opts` folder to at least get some functionality until you update mpv
```EditorConfig
title_mbtn_left_command=show-text ${filename}
playlist_mbtn_left_command=show-text ${playlist} 3000
audio_track_mbtn_left_command=cycle audio
sub_track_mbtn_left_command=cycle sub
chapter_title_mbtn_left_command=show-text ${chapter-list} 3000
```
> [!TIP]
> If the font size for the interactive playlist is too small, you can add the following in your `mpv.conf`
>
> ```ini
> # change font size for console and select
> script-opts-append=console-font_size=25
> ```

View File

@@ -0,0 +1,141 @@
# ModernZ Translations Guide
This guide provides everything you need to use, modify, and add translations for the ModernZ OSC interface.
## Table of Contents
- [Quick Start](#quick-start)
- [Available Languages](#available-languages)
- [Adding a New Language](#adding-a-new-language)
- [Updating Existing Translations](#updating-existing-translations)
- [Translation Keys Reference](#translation-keys-reference)
- [Contributing Translations](#contributing)
## Quick Start
To get started with translations:
1. **Locate the translation file:** Open the `modernz-locale.json` file from the repository (typically found at [modernz-locale.json](/extras/locale/modernz-locale.json)).
2. **Edit Translations:** Use the following format to add or modify translations:
```json
{
"language-code": {
"idle": "Your translation",
"na": "Your translation",
},
}
```
Replace `"language-code"` with your language code (e.g. `"es"` for Spanish).
## Available Languages
ModernZ currently has translations for the following languages:
- French (fr)
- German (de)
- Spanish (es)
- Polish (pl)
- Japanese (jp)
- Simplified Chinese (zh)
- Arabic (ar)
- Russian (ru)
## Adding a New Language
1. **Get the translation file**: If you haven't already, download the `modernz-locale.json` file.
2. **Open the file**: Open `modernz-locale.json` in a text editor.
3. **Choose a language code**: Pick a unique code representing your language (e.g. `"it"` for Italian).
4. **Copy an existing template**: Use an existing language section as a base. For example, use the English template:
```json
{
"en": {
"idle": "Drop files or URLs here to play",
"na": "Not available",
"video": "Video",
"audio": "Audio",
"subtitle": "Subtitle",
"no_subs": "No subtitles available",
"no_audio": "No audio tracks available",
"playlist": "Playlist",
"no_playlist": "Playlist is empty",
"chapter": "Chapter",
"ontop": "Pin Window",
"ontop_disable": "Unpin Window",
"loop_enable": "Loop",
"loop_disable": "Disable Loop",
"speed_control": "Speed Control",
"screenshot": "Screenshot",
"stats_info": "Information",
"cache": "Cache",
"buffering": "Buffering",
"zoom_in": "Zoom In",
"zoom_out": "Zoom Out",
"download": "Download",
"download_in_progress": "Download in progress",
"downloading": "Downloading",
"downloaded": "Already downloaded",
"menu": "Menu",
},
}
```
5. **Translate the strings**: Replace the English text with your translations, keeping the same keys.
```json
{
"es": {
"idle": "Suelta archivos o URLs aquí para reproducirlos",
"na": "No disponible",
"video": "Video",
},
}
```
## Updating existing translations
1. **Find your language**: Locate the section for your language in `modernz-locale.json`.
2. **Update the strings**
3. **Test your changes**: Play a video to verify the translations work correctly.
## Translation Keys Reference
| Key | Description | Format Notes |
| ------------------------ | ----------------------- | --------------------------- |
| idle | Idle state message | Be brief |
| na | Not available | Menu label |
| video | Video label | Menu label |
| audio | Audio label | Menu label |
| subtitle | Subtitle label | Menu label |
| no_subs | No subtitles label | Menu label |
| no_audio | No audio label | Menu label |
| playlist | Playlist label | Menu label |
| no_playlist | No playlist label | Menu label |
| chapter | Chapter label | Menu label |
| ontop/ontop_disable | Window pin states | Action labels |
| loop_enable/loop_disable | Loop states | Action labels |
| screenshot | Screenshot label | Action label |
| stats_info | Information label | Menu label |
| cache | Information label | Text label |
| buffering | Information label | Text label |
| zoom_in | Information label | Menu label |
| zoom_out | Information label | Menu label |
| download | Information label | Menu label |
| download_in_progress | Information label | Menu label |
| downloading | Information label | Menu label |
| downloaded | Information label | Menu label |
| menu | Information label | Menu label |
## Contributing
If you'd like to share your translations with the community:
1. **Fork the repository**: Visit the ModernZ GitHub page (https://github.com/Samillion/ModernZ) and click "Fork" to create your own copy of the project.
2. **Edit the** `modernz-locale.json` **file** Add your translations to the file in your forked repository.
3. **Submit a Pull Request** Create a pull request on GitHub to propose your changes for review and integration.
Thank you for contributing ❤️ Every translation helps make the project better!

View File

@@ -0,0 +1,276 @@
# ModernZ User Options Guide
### Configuration File Location
Create `modernz.conf` in your mpv script-opts directory:
- Linux: `~/.config/mpv/script-opts/`
- Windows: `%APPDATA%/mpv/script-opts/`
- macOS: `~/Library/Application Support/mpv/script-opts/`
## Available Options
### Language and display
| Option | Value | Description |
| -------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| language | en | set language (for available options, see: [Translations](https://github.com/Samillion/ModernZ/blob/main/docs/TRANSLATIONS.md)) |
| icon_theme | fluent | set icon theme. accepts `fluent` or `material` |
| font | mpv-osd-symbols | font for the OSC (default: mpv-osd-symbols or the one set in mpv.conf) |
| idlescreen | yes | show mpv logo when idle |
| window_top_bar | auto | show OSC window top bar: `"auto"`, `"yes"`, or `"no"` (borderless/fullscreen) |
| showwindowed | yes | show OSC when windowed |
| showfullscreen | yes | show OSC when fullscreen |
| showonpause | yes | show OSC when paused |
| keeponpause | yes | disable OSC hide timeout when paused |
| greenandgrumpy | no | disable Santa hat in December |
### OSC behaviour and scaling
| Option | Value | Description |
| ----------------------- | ----- | ---------------------------------------------------------------------- |
| hidetimeout | 2000 | time (in ms) before OSC hides if no mouse movement |
| seek_resets_hidetimeout | yes | if seeking should reset the hidetimeout |
| fadeduration | 200 | fade-out duration (in ms), set to `"0"` for no fade |
| fadein | no | whether to enable fade-in effect |
| minmousemove | 0 | minimum mouse movement (in pixels) required to show OSC |
| bottomhover | yes | show OSC only when hovering at the bottom |
| bottomhover_zone | 130 | height of hover zone for bottomhover (in pixels) |
| osc_on_seek | no | show OSC when seeking |
| osc_on_start | no | show OSC on start of every file |
| mouse_seek_pause | yes | pause video while seeking with mouse move (on button hold) |
| force_seek_tooltip | no | force show seekbar tooltip on mouse drag, even if not hovering seekbar |
| vidscale | auto | scale osc with the video. (set to `"no"` to disable) |
| scalewindowed | 1.0 | osc scale factor when windowed |
| scalefullscreen | 1.0 | osc scale factor when fullscreen |
### Elements display
| Option | Value | Description |
| ----------------------- | ---------------- | -------------------------------------------------------------------------------- |
| show_title | yes | show title in the OSC (above seekbar) |
| title | `${media-title}` | title above seekbar format: `"${media-title}"` or `"${filename}"` |
| title_font_size | 24 | font size of the title text (above seekbar) |
| chapter_title_font_size | 14 | chapter title font size |
| show_chapter_title | yes | show chapter title (above seekbar) |
| chapter_fmt | %s | format for chapter display on seekbar hover (set to `"no"` to disable) |
| timetotal | yes | show total time instead of remaining time |
| timems | no | show timecodes with milliseconds |
| unicodeminus | no | use the Unicode minus sign in remaining time |
| time_format | dynamic | `"dynamic"` or `"fixed"`. shows MM:SS when possible, fixed always shows HH:MM:SS |
| time_font_size | 16 | font size of the time display |
| cache_info | no | show cached time information |
| cache_info_speed | no | show current cache speed per second |
| cache_info_font_size | 12 | font size of the time display |
| tooltip_font_size | 14 | tooltips font size |
### Title bar settings
| Option | Value | Description |
| -------------------- | ---------------- | ------------------------------------------------------------------------- |
| window_title | no | show window title in borderless/fullscreen mode |
| window_controls | yes | show window controls (close, minimize, maximize) in borderless/fullscreen |
| windowcontrols_title | `${media-title}` | same as title but for window_top_bar |
### Subtitle display settings
| Option | Value | Description |
| --------------------- | ----- | ---------------------------------------------------------------------- |
| raise_subtitles | yes | raise subtitles above the OSC when shown |
| raise_subtitle_amount | 125 | amount by which subtitles are raised when the OSC is shown (in pixels) |
### Buttons display and functionality
| Option | Value | Description |
| -------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| jump_buttons | yes | show "jump forward/backward 10 seconds" buttons |
| jump_amount | 10 | change the jump amount in seconds |
| jump_more_amount | 60 | change the jump amount in seconds when right-clicking jump buttons and shift-clicking chapter skip buttons |
| jump_icon_number | yes | show different icon for `5`, `10`, or `30` second jumps |
| jump_mode | relative | seek mode for jump buttons |
| jump_softrepeat | yes | enable continuous jumping when holding down seek buttons |
| chapter_skip_buttons | no | show the skip back and forward (chapter) buttons |
| chapter_softrepeat | yes | enable continuous skipping when holding down chapter skip buttons |
| track_nextprev_buttons | yes | show next/previous playlist track buttons |
| volume_control | yes | show mute button and volume slider |
| volume_control_type | linear | volume scale type: `"linear"` or `"logarithmic"` |
| playlist_button | yes | show playlist button: Left-click for simple playlist, Right-click for interactive playlist |
| hide_empty_playlist_button | yes | hide playlist button when no playlist exists |
| gray_empty_playlist_button | yes | gray out the playlist button when no playlist exists |
| download_button | yes | show download button on web videos (requires yt-dlp and ffmpeg) |
| download_path | ~~desktop/mpv | default download directory for videos. [Learn more about setting paths here](https://mpv.io/manual/master/#paths). |
| screenshot_button | no | show screenshot button |
| screenshot_flag | subtitles | Flag options for the screenshot button: `"subtitles"`, `"video"`, `"window"`, `"each-frame"`. [Find out more about these options](https://mpv.io/manual/master/#command-interface-screenshot-<flags>). |
| ontop_button | yes | show `window on top (pin)` button |
| loop_button | no | show `loop` button |
| speed_button | no | show speed control button |
| speed_button_click | 1 | speed change amount per click |
| speed_button_scroll | 0.25 | speed change amount on scroll |
| loop_in_pause | yes | enable looping by right-clicking pause |
| buttons_always_active | none | force buttons to always be active. can add: `playlist_prev`, `playlist_next` |
| info_button | yes | show `info (stats)` button |
| fullscreen_button | yes | show `fullscreen toggle` button |
| playpause_size | 28 | icon size for the play/pause button |
| midbuttons_size | 24 | icon size for the middle buttons |
| sidebuttons_size | 24 | icon size for the side buttons |
| zoom_control | yes | show zoom controls in image viewer mode |
| zoom_in_max | 4 | icon size for the side buttons |
| zoom_out_min | -1 | icon size for the side buttons |
### Colors and style
| Option | Value | Description |
| --------------------------------- | --------- | ------------------------------------------------------------------------------------------------- |
| osc_color | `#000000` | accent color of the OSC and title bar |
| window_title_color | `#FFFFFF` | color of the title in borderless/fullscreen mode |
| window_controls_color | `#FFFFFF` | color of the window controls (close, minimize, maximize) in borderless/fullscreen mode |
| windowcontrols_close_hover | `#E81123` | color of close window control on hover |
| windowcontrols_max_hover | `#F8BC3A` | color of maximize window controls on hover |
| windowcontrols_min_hover | `#43CB44` | color of minimize window controls on hover |
| title_color | `#FFFFFF` | color of the title (above seekbar) |
| seekbarfg_color | `#FB8C00` | color of the seekbar progress and handle |
| seekbarbg_color | `#94754F` | color of the remaining seekbar |
| seekbar_cache_color | `#918F8E` | color of the cache ranges on the seekbar |
| volumebar_match_seek_color | no | match volume bar color with seekbar color (ignores `side_buttons_color`) |
| time_color | `#FFFFFF` | color of the timestamps (below seekbar) |
| chapter_title_color | `#FFFFFF` | color of the chapter title (above seekbar) |
| cache_info_color | `#FFFFFF` | color of the cache information |
| side_buttons_color | `#FFFFFF` | color of the side buttons (audio, subtitles, playlist, etc.) |
| middle_buttons_color | `#FFFFFF` | color of the middle buttons (skip, jump, chapter, etc.) |
| playpause_color | `#FFFFFF` | color of the play/pause button |
| held_element_color | `#999999` | color of the element when held down (pressed) |
| hover_effect_color | `#FB8C00` | color of a hovered button when `hover_effect` includes `"color"` |
| thumbnail_border_color | `#111111` | color of the border for thumbnails (with thumbfast) |
| thumbnail_border_outline | `#404040` | color of the border outline for thumbnails |
| fade_alpha | 130 | alpha of the OSC background box (0 to disable) |
| fade_blur_strength | 100 | blur strength for the OSC alpha fade. caution: high values can take a lot of CPU time to render |
| fade_transparency_strength | 0 | use with "fade_blur_strength=0" to create a transparency box |
| window_fade_alpha | 100 | alpha of the window title bar (0 to disable) |
| window_fade_blur_strength | 100 | blur strength for the window title bar. caution: high values can take a lot of CPU time to render |
| window_fade_transparency_strength | 0 | use with "window_fade_blur_strength=0" to create a transparency box |
| thumbnail_border | 3 | width of the thumbnail border (for thumbfast) |
| thumbnail_border_radius | 3 | rounded corner radius for thumbnail border (0 to disable) |
### Button hover effects
| Option | Value | Description |
| ------------------------ | --------------- | ------------------------------------------------------------------------------------------------ |
| hover_effect | size,glow,color | active button hover effects: `"glow"`, `"size"`, `"color"`; can use multiple separated by commas |
| hover_button_size | 115 | relative size of a hovered button if "size" effect is active |
| button_glow_amount | 5 | glow intensity when `"glow"` hover effect is active |
| hover_effect_for_sliders | yes | apply hover size effect to slider handle |
### Tooltips and hints
| Option | Value | Description |
| ------------------------------ | ----- | --------------------------------------------------------------- |
| tooltips_for_disabled_elements | yes | enable tooltips for disabled buttons and elements |
| tooltip_hints | yes | enable text hints for info, loop, ontop, and screenshot buttons |
### Progress bar settings
| Option | Value | Description |
| ------------------------ | -------- | -------------------------------------------------------------------------- |
| seek_handle_size | 0.8 | size ratio of the seekbar handle (range: 0 ~ 1) |
| seekrange | yes | show seek range overlay |
| seekrangealpha | 150 | transparency of the seek range |
| livemarkers | yes | update chapter markers on the seekbar when duration changes |
| seekbarkeyframes | no | use keyframes when dragging the seekbar |
| nibbles_top | yes | top chapter nibbles above seekbar |
| nibbles_bottom | yes | bottom chapter nibbles below seekbar |
| nibbles_style | triangle | chapter nibble style. `triangle`, `bar` or `single-bar` |
| automatickeyframemode | yes | automatically set keyframes for the seekbar based on video length |
| automatickeyframelimit | 600 | videos longer than this (in seconds) will have keyframes on the seekbar |
| persistentprogress | no | always show a small progress line at the bottom of the screen |
| persistentprogressheight | 17 | height of the persistent progress bar |
| persistentbuffer | no | show buffer status on web videos in the persistent progress line |
### Miscellaneous settings
| Option | Value | Description |
| ----------------------------- | ----------------- | ------------------------------------------------------------- |
| visibility | auto | only used at init to set visibility_mode(...) |
| visibility_modes | never_auto_always | visibility modes to cycle through, modes are separated by `_` |
| tick_delay | 0.03 | minimum interval between OSC redraws (in seconds) |
| tick_delay_follow_display_fps | no | use display FPS as the minimum redraw interval |
### Elements Position
Useful when adjusting font size or type, this will help you change the affected elements position
| Option | Value | Description |
| ----------------------------- | ------ | ---------------------------------------------------------------------- |
| title_height | 96 | title height position above seekbar |
| title_with_chapter_height | 108 | title height position if a chapter title is below it |
| chapter_title_height | 91 | chapter title height position above seekbar |
| time_codes_height | 35 | time codes height position |
| time_codes_centered_height | 57 | time codes height position with portrait window |
| tooltip_height_offset | 2 | tooltip height position offset |
| tooltip_left_offset | 5 | if tooltip contains many characters, it is moved to the left by offset |
| portrait_window_trigger | 1000 | portrait window width trigger to move some elements |
| hide_volume_bar_trigger | 1150 | hide volume bar trigger window width |
| notitle_osc_h_offset | 25 | osc height offset if title above seekbar is disabled |
| nochapter_osc_h_offset | 10 | osc height offset if chapter title is disabled or doesn't exist |
| seek_hover_tooltip_h_offset | 0 | seek hover timecodes tooltip height position offset |
| osc_height | 132 | osc height without offsets |
### Mouse Commands (User Options)
Customize the button function based on mouse actions.
| Type | Option | Function |
| ----------------------------- | -------------------------------- | ------------------------------------------------------------------------------- |
| Title (above seekbar) | title_mbtn_left_command | `script-binding stats/display-page-5` |
| | title_mbtn_mid_command | `show-text ${path}` |
| | title_mbtn_right_command | `script-binding select/select-watch-history; script-message-to modernz osc-hide`|
| Playlist Button | playlist_mbtn_left_command | `script-binding select/select-playlist; script-message-to modernz osc-hide` |
| | playlist_mbtn_right_command | `show-text ${playlist} 3000` |
| Volume Control | vol_ctrl_mbtn_left_command | `no-osd cycle mute` |
| | vol_ctrl_mbtn_right_command | `script-binding select/select-audio-device; script-message-to modernz osc-hide` |
| | vol_ctrl_wheel_down_command | `no-osd add volume -5` |
| | vol_ctrl_wheel_up_command | `no-osd add volume 5` |
| Audio Button | audio_track_mbtn_left_command | `script-binding select/select-aid; script-message-to modernz osc-hide` |
| | audio_track_mbtn_mid_command | `cycle audio down` |
| | audio_track_mbtn_right_command | `cycle audio` |
| | audio_track_wheel_down_command | `cycle audio` |
| | audio_track_wheel_up_command | `cycle audio down` |
| Subtitle Button | sub_track_mbtn_left_command | `script-binding select/select-sid; script-message-to modernz osc-hide` |
| | sub_track_mbtn_mid_command | `cycle sub down` |
| | sub_track_mbtn_right_command | `cycle sub` |
| | sub_track_wheel_down_command | `cycle sub` |
| | sub_track_wheel_up_command | `cycle sub down` |
| Chapter Skip Buttons | chapter_prev_mbtn_left_command | `add chapter -1` |
| | chapter_prev_mbtn_mid_command | `show-text ${chapter-list} 3000` |
| | chapter_prev_mbtn_right_command | `script-binding select/select-chapter; script-message-to modernz osc-hide` |
| | chapter_next_mbtn_left_command | `add chapter 1` |
| | chapter_next_mbtn_mid_command | `show-text ${chapter-list} 3000` |
| | chapter_next_mbtn_right_command | `script-binding select/select-chapter; script-message-to modernz osc-hide` |
| Chapter Title (below seekbar) | chapter_title_mbtn_left_command | `script-binding select/select-chapter; script-message-to modernz osc-hide` |
| | chapter_title_mbtn_right_command | `show-text ${chapter-list} 3000` |
| Playlist Skip Buttons | playlist_prev_mbtn_left_command | `playlist-prev` |
| | playlist_prev_mbtn_mid_command | `show-text ${playlist} 3000` |
| | playlist_prev_mbtn_right_command | `script-binding select/select-playlist; script-message-to modernz osc-hide` |
| | playlist_next_mbtn_left_command | `playlist-next` |
| | playlist_next_mbtn_mid_command | `show-text ${playlist} 3000` |
| | playlist_next_mbtn_right_command | `script-binding select/select-playlist; script-message-to modernz osc-hide` |
| Fullscreen Button | fullscreen_mbtn_left_command | `cycle fullscreen` |
| | fullscreen_mbtn_right_command | `cycle window-maximized` |
| Info Button | info_mbtn_left_command | `script-binding stats/display-page-1-toggle` |
### Auto Profile
Below is an example of an auto-profile in `mpv.conf` you can use to set any of ModernZ options based on certain conditions, in this case `when window is pinned or fullscreen`.
```ini
[ModernZ-Custom]
profile-desc=Apply ModernZ options on pin or fullscreen
profile-cond=ontop and ontop == true or fullscreen
profile-restore=copy-equal
script-opts-append=modernz-persistentprogress=yes
script-opts-append=modernz-seekbarfg_color=#FF0000
script-opts-append=modernz-bottomhover=no
#...etc
```
More information about auto profiles available on [mpv's manual](https://mpv.io/manual/master/#conditional-auto-profiles).

View File

@@ -0,0 +1,3 @@
The different locales (languages) for ModernZ OSC are stored within the [modernz-locale.json](/extras/locale/modernz-locale.json) file.
For more information: [Translations](/docs/TRANSLATIONS.md)

View File

@@ -0,0 +1,226 @@
{
"fr": {
"idle": "Déposez des fichiers ou des URLs ici pour les lire",
"na": "Non disponible",
"video": "Vidéo",
"audio": "Audio",
"subtitle": "Sous-titre",
"no_subs": "Aucun sous-titre disponible",
"no_audio": "Aucune piste audio disponible",
"playlist": "Liste de lecture",
"no_playlist": "Liste de lecture vide",
"chapter": "Chapitre",
"ontop": "Épingler la fenêtre",
"ontop_disable": "Désépingler la fenêtre",
"loop_enable": "Activer la boucle",
"loop_disable": "Désactiver la boucle",
"speed_control": "Contrôle de la vitesse",
"screenshot": "Capture d'écran",
"stats_info": "Informations",
"cache": "Cache",
"buffering": "Chargement",
"zoom_in": "Agrandir",
"zoom_out": "Rétrécir",
"download": "Télécharger",
"download_in_progress": "Téléchargement en cours",
"downloading": "Téléchargement",
"downloaded": "Déjà téléchargé",
"menu": "Menu",
},
"de": {
"idle": "Dateien oder URLs hier ablegen, um sie abzuspielen",
"na": "Nicht verfügbar",
"video": "Video",
"audio": "Audio",
"subtitle": "Untertitel",
"no_subs": "Keine Untertitel verfügbar",
"no_audio": "Keine Audiospuren verfügbar",
"playlist": "Wiedergabeliste",
"no_playlist": "Wiedergabeliste ist leer",
"chapter": "Kapitel",
"ontop": "Fenster fixieren",
"ontop_disable": "Fensterfixierung aufheben",
"loop_enable": "Dauerschleife aktivieren",
"loop_disable": "Dauerschleife deaktivieren",
"speed_control": "Geschwindigkeitseinstellungen",
"screenshot": "Bildschirmaufnahme",
"stats_info": "Informationen",
"cache": "Zwischenspeicher",
"buffering": "Pufferung",
"zoom_in": "Vergrößern",
"zoom_out": "Verkleinern",
"download": "Herunterladen",
"download_in_progress": "Herunterladen läuft",
"downloading": "Herunterladen",
"downloaded": "Bereits heruntergeladen",
"menu": "Menü",
},
"es": {
"idle": "Suelta archivos o URLs aquí para reproducirlos",
"na": "No disponible",
"video": "Video",
"audio": "Audio",
"subtitle": "Subtítulo",
"no_subs": "No hay subtítulos disponibles",
"no_audio": "No hay pistas de audio disponibles",
"playlist": "Lista de reproducción",
"no_playlist": "La lista de reproducción está vacía",
"chapter": "Capítulo",
"ontop": "Fijar ventana",
"ontop_disable": "Desfijar ventana",
"loop_enable": "Activar bucle",
"loop_disable": "Desactivar bucle",
"speed_control": "Control de velocidad",
"screenshot": "Captura de pantalla",
"stats_info": "Información",
"cache": "Caché",
"buffering": "Cargando",
"zoom_in": "Ampliar",
"zoom_out": "Reducir",
"download": "Descargar",
"download_in_progress": "Descarga en curso",
"downloading": "Descargando",
"downloaded": "Ya descargado",
"menu": "Menú",
},
"pl": {
"idle": "Upuść plik lub łącze URL do odtworzenia",
"na": "Niedostępne",
"video": "Wideo",
"audio": "Audio",
"subtitle": "Napisy",
"no_subs": "Brak dostępnych napisów",
"no_audio": "Brak dostępnych ścieżek dźwiękowych",
"playlist": "Lista odtwarzania",
"no_playlist": "Lista odtwarzania jest pusta",
"chapter": "Rozdział",
"ontop": "Przypnij okno",
"ontop_disable": "Odepnij okno",
"loop_enable": "Włącz zapętlenie",
"loop_disable": "Wyłącz zapętlenie",
"speed_control": "Kontrola prędkości",
"screenshot": "Zrzut ekranu",
"stats_info": "Informacja",
"cache": "Pamięć podręczna",
"buffering": "Buforowanie",
"zoom_in": "Powiększ",
"zoom_out": "Pomniejsz",
"download": "Pobierz",
"download_in_progress": "Pobieranie w toku",
"downloading": "Pobieranie",
"downloaded": "Już pobrano",
"menu": "Menu",
},
"jp": {
"idle": "ファイルやURLのリンクをここにドロップすると再生されます",
"na": "利用できません",
"video": "ビデオ",
"audio": "オーディオ",
"subtitle": "字幕",
"no_subs": "利用可能な字幕はありません",
"no_audio": "オーディオトラックはありません",
"playlist": "プレイリスト",
"no_playlist": "プレイリストは空です",
"chapter": "チャプター",
"ontop": "ウィンドウを最前面に固定",
"ontop_disable": "ウィンドウを固定解除",
"loop_enable": "ループを有効にする",
"loop_disable": "ループを無効にする",
"speed_control": "速度制御",
"screenshot": "スクリーンショット",
"stats_info": "情報",
"cache": "キャッシュ",
"buffering": "読み込み中",
"zoom_in": "拡大",
"zoom_out": "縮小",
"download": "ダウンロード",
"download_in_progress": "ダウンロード中",
"downloading": "ダウンロード中",
"downloaded": "既にダウンロード済み",
"menu": "メニュー",
},
"zh": {
"idle": "将文件或URL放在这里播放",
"na": "不可用",
"video": "视频",
"audio": "音频",
"subtitle": "字幕",
"no_subs": "没有可用字幕",
"no_audio": "没有音轨",
"playlist": "播放列表",
"no_playlist": "播放列表为空",
"chapter": "章节",
"ontop": "窗口停留在顶层",
"ontop_disable": "禁用窗口停留在顶层",
"loop_enable": "启用循环",
"loop_disable": "禁用循环",
"speed_control": "速度控制",
"screenshot": "截屏",
"stats_info": "信息",
"cache": "缓存",
"buffering": "缓冲中",
"zoom_in": "放大",
"zoom_out": "缩小",
"download": "下载",
"download_in_progress": "下载中",
"downloading": "正在下载",
"downloaded": "已下载",
"menu": "菜单",
},
"ar": {
"idle": "أسقط الملفات أو الروابط هنا للتشغيل",
"na": "غير متاح",
"video": "فيديو",
"audio": "صوت",
"subtitle": "ترجمة",
"no_subs": "لا توجد ترجمات متاحة",
"no_audio": "لا توجد مسارات صوتية متاحة",
"playlist": "قائمة التشغيل",
"no_playlist": "قائمة التشغيل فارغة",
"chapter": "فصل",
"ontop": "تثبيت النافذة",
"ontop_disable": "إلغاء تثبيت النافذة",
"loop_enable": "تمكين التكرار",
"loop_disable": "تعطيل التكرار",
"speed_control": "التحكم في السرعة",
"screenshot": "لقطة شاشة",
"stats_info": "معلومات",
"cache": "ذاكرة التخزين المؤقت",
"buffering": "جار التحميل",
"zoom_in": "تكبير",
"zoom_out": "تصغير",
"download": "تنزيل",
"download_in_progress": "التنزيل جارٍ",
"downloading": "جاري التنزيل",
"downloaded": "تم التنزيل بالفعل",
"menu": "قائمة",
},
"ru": {
"idle": "Перенести файл или URL для воспроизведения",
"na": "Недоступно",
"video": "Видео",
"audio": "Аудио",
"subtitle": "Субтитры",
"no_subs": "Субтитры недоступны",
"no_audio": "Нет аудио-дорожек",
"playlist": "Плейлист",
"no_playlist": "Плейлист пуст",
"chapter": "Глава",
"ontop": "Закрепить окно",
"ontop_disable": "Открепить окно",
"loop_enable": "Повтор",
"loop_disable": "Отключить повтор",
"speed_control": "Контроль скорости",
"screenshot": "Скриншот",
"stats_info": "Информация",
"cache": "Кеш",
"buffering": "Буферизация",
"zoom_in": "Зум +",
"zoom_out": "Зум -",
"download": "Загрузить",
"download_in_progress": "Загрузка в процессе",
"downloading": "Загрузка",
"downloaded": "Уже загружено",
"menu": "Меню",
},
}

View File

@@ -0,0 +1,68 @@
## Pause Indicator Lite
| ![pause-icon](https://github.com/user-attachments/assets/cd41333c-8fdd-4de9-8977-15eea95798dc) | ![play-icon](https://github.com/user-attachments/assets/0d1671f8-9b1b-4f10-ade3-82d1748b2d93) |
|:---:|:---:|
A simple script that displays an indicator on pause (and mute), with options to adjust icon type, color, height, width, opacity and whether to toggle pause with a keybind or not.
I only decided to write this because the ones I found were either too complicated or too simple. The alternatives are great, this one just meets my simple use case scenario.
**Script:** [Pause Indicator Lite](./pause_indicator_lite.lua)
### Indicator Options
Below is the full list for indicator options and their default values.
To adjust them you can either:
- Place [pause_indicator_lite.conf](./pause_indicator_lite.conf) in `script-opts` and change the values in it [recommended]
- Simply change their values in `local options` within the script itself
| Option | Value | Description |
|--------------------------|-------------|--------------------------------------------------------------------------------------------------------------------------------------|
| `indicator_icon` | pause | indicator icon type. `pause`, `play` |
| `indicator_stay` | yes | keep indicator visibile during pause |
| `indicator_timeout` | 0.6 | timeout (seconds) if indicator doesn't stay |
| `keybind_allow` | yes | allow keybind to toggle pause |
| `keybind_set` | mbtn_left | the used keybind to toggle pause [[reference](https://github.com/mpv-player/mpv/blob/master/etc/input.conf)] |
| `keybind_mode` | onpause | mode to activate keybind. <br>`onpause`: only active when paused, to unpause <br>`always`: always active to toggle pause/unpause |
| `keybind_eof_disable` | yes | disable keybind on eof (end of file) [[reference](https://github.com/Samillion/ModernZ/issues/291)] |
| `icon_color` | `#FFFFFF` | icon fill color |
| `icon_border_color` | `#111111` | icon border color |
| `icon_border_width` | 1.5 | icon border width |
| `icon_opacity` | 40 | icon opacity (0-100) |
| `rectangles_width` | 30 | width of rectangles (pause icon) |
| `rectangles_height` | 80 | height of rectangles (pause icon) |
| `rectangles_spacing` | 20 | spacing between the two rectangles (pause icon) |
| `triangle_width` | 80 | width of triangle (play icon) |
| `triangle_height` | 80 | height of triangle (play icon) |
| `flash_play_icon` | yes | flash play icon on unpause (best with pause indicator icon) |
| `flash_icon_timeout` | 0.3 | timeout (seconds) for flash icon |
| `fluent_icons` | no | requires `fonts/fluent-system-icons.ttf` [[details](https://github.com/Samillion/ModernZ/pull/336)] |
| `fluent_icon_size` | 80 | fluent icon size |
| `mute_indicator` | no | show a mute indicator (requires fluent font) |
| `mute_indicator_pos` | middle_right | position of mute indicator. `top_left`, `top_right`, `top_center`. also: `middle_*`, `bottom_*` same as `top_*` (ie: `bottom_right`) |
### How to install
Simply place `pause_indicator_lite.lua` in the corresponding mpv scripts folder of your operating system:
- Windows: `%APPDATA%\mpv\scripts\` or `C:\users\USERNAME\AppData\Roaming\mpv\scripts\`
- Linux: `~/.config/mpv/scripts/` or `/home/USERNAME/.config/mpv/scripts/`
- Mac: `~/.config/mpv/scripts/` or `/Users/USERNAME/.config/mpv/scripts/`
> [!TIP]
> More information about mpv files locations can be found [here](https://mpv.io/manual/master/#files)
```
mpv
├── fonts/
│ └── fluent-system-icons.ttf (optional) [required for fluent_icons]
├── script-opts
│ └── pause_indicator_lite.conf
└── scripts
└── pause_indicator_lite.lua
```
### Notes
- I don't plan to focus many updates on this script, because ASS drawing and positioning pisses me off. 😝
- Other alternatives can be found in the mpv [user scripts](https://github.com/mpv-player/mpv/wiki/User-Scripts) wiki.
- This isn't exclusive to be used on ModernZ OSC. Feel free to use it with whatever you want.

View File

@@ -0,0 +1,54 @@
# indicator icon type. "pause", "play"
indicator_icon=pause
# keep indicator visibile during pause
indicator_stay=yes
# timeout (seconds) if indicator doesn't stay
indicator_timeout=0.6
# allow keybind to toggle pause
keybind_allow=yes
# the used keybind to toggle pause
keybind_set=mbtn_left
# mode to activate keybind. "onpause", "always"
keybind_mode=onpause
# disable keybind on eof (end of file)
keybind_eof_disable=yes
# icon fill color
icon_color=#FFFFFF
# icon border color
icon_border_color=#111111
# icon border width
icon_border_width=1.5
# icon opacity (0-100)
icon_opacity=40
# width of rectangles
rectangles_width=30
# height of rectangles
rectangles_height=80
# spacing between the two rectangles
rectangles_spacing=20
# width of triangle
triangle_width=80
# height of triangle
triangle_height=80
# flash play icon on unpause
flash_play_icon=yes
# timeout (seconds) for flash icon
flash_icon_timeout=0.3
# icon style used in ModernZ osc
# requires fonts/fluent-system-icons.ttf
fluent_icons=no
# fluent icon size
fluent_icon_size=80
# mute options
# show a mute indicator (requires fluent font)
mute_indicator=no
# position of mute indicator. top_left, top_right, top_center
# also: middle_*, bottom_* same as top_* (ie: bottom_right)
mute_indicator_pos=middle_right

View File

@@ -0,0 +1,218 @@
--[[
A simple script that shows a pause indicator, on pause
https://github.com/Samillion/ModernZ/tree/main/extras/pause-indicator-lite
--]]
local options = {
-- indicator icon type
indicator_icon = "pause", -- indicator icon type. "pause", "play"
indicator_stay = true, -- keep indicator visibile during pause
indicator_timeout = 0.6, -- timeout (seconds) if indicator doesn't stay
-- keybind
keybind_allow = true, -- allow keybind to toggle pause
keybind_set = "mbtn_left", -- the used keybind to toggle pause
keybind_mode = "onpause", -- mode to activate keybind. "onpause", "always"
keybind_eof_disable = true, -- disable keybind on eof (end of file)
-- icon colors & opacity
icon_color = "#FFFFFF", -- icon fill color
icon_border_color = "#111111", -- icon border color
icon_border_width = 1.5, -- icon border width
icon_opacity = 40, -- icon opacity (0-100)
-- pause icon
rectangles_width = 30, -- width of rectangles
rectangles_height = 80, -- height of rectangles
rectangles_spacing = 20, -- spacing between the two rectangles
-- play icon
triangle_width = 80, -- width of triangle
triangle_height = 80, -- height of triangle
-- best with pause icon
flash_play_icon = true, -- flash play icon on unpause
flash_icon_timeout = 0.3, -- timeout (seconds) for flash icon
-- icon style used in ModernZ osc
fluent_icons = false, -- requires fonts/fluent-system-icons.ttf
fluent_icon_size = 80, -- fluent icon size
-- mute options
mute_indicator = false, -- show a mute indicator (requires fluent font)
mute_indicator_pos = "middle_right", -- position of mute indicator. top_left, top_right, top_center
-- also: middle_*, bottom_* same as top_* (ie: bottom_right)
}
local msg = require "mp.msg"
require 'mp.options'.read_options(options, "pause_indicator_lite")
-- convert color from hex (adjusted from mpv/osc.lua)
local function convert_color(color)
if color:find("^#%x%x%x%x%x%x$") == nil then
msg.warn("'" .. color .. "' is not a valid color, using default '#FFFFFF'")
return "FFFFFF" -- color fallback
end
return color:sub(6,7) .. color:sub(4,5) .. color:sub(2,3)
end
-- convert percentage opacity (0-100) to ASS alpha values
local function convert_opacity(value)
value = math.max(0, math.min(100, value))
return string.format("%02X", (255 - (value * 2.55)))
end
-- colors and opaicty
local icon_color = convert_color(options.icon_color)
local icon_border_color = convert_color(options.icon_border_color)
local icon_opacity = convert_opacity(options.icon_opacity)
local icon_font = "fluent-system-icons"
-- pause icon
local function draw_rectangles()
if options.fluent_icons then
local pause_icon = "\238\163\140"
return string.format([[{\\rDefault\\an5\\alpha&H%s\\bord%s\\1c&H%s&\\3c&H%s&\\fs%s\\fn%s}%s]],
icon_opacity, options.icon_border_width, icon_color, icon_border_color, options.fluent_icon_size, icon_font, pause_icon)
else
return string.format([[{\\rDefault\\p1\\an5\\alpha&H%s\\bord%s\\1c&H%s&\\3c&H%s&}m 0 0 l %d 0 l %d %d l 0 %d m %d 0 l %d 0 l %d %d l %d %d{\\p0}]],
icon_opacity, options.icon_border_width, icon_color, icon_border_color, options.rectangles_width, options.rectangles_width,
options.rectangles_height, options.rectangles_height, options.rectangles_width + options.rectangles_spacing,
options.rectangles_width * 2 + options.rectangles_spacing, options.rectangles_width * 2 + options.rectangles_spacing,
options.rectangles_height, options.rectangles_width + options.rectangles_spacing, options.rectangles_height)
end
end
-- play icon
local function draw_triangle()
if options.fluent_icons then
local play_icon = "\238\166\143"
return string.format([[{\\rDefault\\an5\\alpha&H%s\\bord%s\\1c&H%s&\\3c&H%s&\\fs%s\\fn%s}%s]],
icon_opacity, options.icon_border_width, icon_color, icon_border_color, options.fluent_icon_size, icon_font, play_icon)
else
return string.format([[{\\rDefault\\p1\\an5\\alpha&H%s\\bord%s\\1c&H%s&\\3c&H%s&}m 0 0 l %d %d l 0 %d{\\p0}]],
icon_opacity, options.icon_border_width, icon_color, icon_border_color, options.triangle_width, options.triangle_height / 2, options.triangle_height)
end
end
-- mute icon
local function draw_mute()
if not options.fluent_icons then return end
local mute_icon = "\238\173\138"
local mute_pos_list = {
["top_left"] = 7,
["top_center"] = 8,
["top_right"] = 9,
["middle_left"] = 4,
["middle_center"] = 5,
["middle_right"] = 6,
["bottom_left"] = 1,
["bottom_center"] = 2,
["bottom_right"] = 3,
}
local mute_pos = mute_pos_list[options.mute_indicator_pos:lower()] or 6
return string.format([[{\\rDefault\\an%s\\alpha&H%s\\bord%s\\1c&H%s&\\3c&H%s&\\fs%s\\fn%s}%s]],
mute_pos, icon_opacity, options.icon_border_width, icon_color, icon_border_color, options.fluent_icon_size, icon_font, mute_icon)
end
-- initiate overlay
local indicator = mp.create_osd_overlay("ass-events")
local flash = mp.create_osd_overlay("ass-events")
local mute = mp.create_osd_overlay("ass-events")
-- keep track of pause toggle and end of file
local toggled, eof
-- draw and update indicator
local function update_indicator()
local _, _, display_aspect = mp.get_osd_size()
if display_aspect == 0 or (indicator.visible and not toggled) then return end
indicator.data = options.indicator_icon == "play" and draw_triangle() or draw_rectangles()
indicator:update()
if not options.indicator_stay then
mp.add_timeout(options.indicator_timeout, function() indicator:remove() end)
end
end
-- flash play icon
local function flash_icon()
if not options.flash_play_icon then return flash:remove() end
flash.data = draw_triangle()
flash:update()
mp.add_timeout(options.flash_icon_timeout, function() flash:remove() end)
end
-- draw mute icon
local function mute_icon()
mute.data = draw_mute()
mute:update()
end
-- check if file is video
local function is_video()
local t = mp.get_property_native("current-tracks/video")
return t and not (t.image or t.albumart) and true or false
end
-- remove overlays
local function shutdown()
if flash then flash:remove() end
if indicator then indicator:remove() end
mp.unobserve_property("pause")
end
-- end of file keybind check
if options.keybind_eof_disable then
mp.observe_property("eof-reached", "bool", function(_, val)
eof = val
end)
end
-- observe when pause state changes
mp.observe_property("pause", "bool", function(_, paused)
if not is_video() then return shutdown() end
if paused then
update_indicator()
toggled = true
if options.flash_play_icon then flash:remove() end
else
indicator:remove()
if toggled then
flash_icon()
toggled = false
end
end
-- keybind setup (if options allow it)
if options.keybind_allow == true then
mp.set_key_bindings({
{options.keybind_set, function() mp.commandv("cycle", "pause") end}
}, "pause-indicator", "force")
if options.keybind_mode == "always" or (options.keybind_mode == "onpause" and paused) then
if not eof then mp.enable_key_bindings("pause-indicator") end
else
mp.disable_key_bindings("pause-indicator")
end
end
end)
-- update pause indicator position if window size changes
mp.observe_property("osd-dimensions", "native", function()
if indicator and indicator.visible then
update_indicator()
end
end)
if options.mute_indicator and options.fluent_icons then
mp.observe_property("mute", "bool", function(_, val)
if val and not mute.visible then mute_icon() else mute:remove() end
end)
else
mute:remove()
end

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,384 @@
# Language and display
# set language (for available options, see: https://github.com/Samillion/ModernZ/blob/main/docs/TRANSLATIONS.md)
language=en
# set icon theme. accepts fluent or material
icon_theme=fluent
# font for the OSC (default: mpv-osd-symbols or the one set in mpv.conf)
font=mpv-osd-symbols
# show mpv logo when idle
idlescreen=yes
# show OSC window top bar: "auto", "yes", or "no" (borderless/fullscreen)
window_top_bar=auto
# show OSC when windowed
showwindowed=yes
# show OSC when fullscreen
showfullscreen=yes
# show OSC when paused
showonpause=yes
# disable OSC hide timeout when paused
keeponpause=yes
# disable Santa hat in December
greenandgrumpy=no
# OSC behaviour and scaling
# time (in ms) before OSC hides if no mouse movement
hidetimeout=1500
# if seeking should reset the hidetimeout
seek_resets_hidetimeout=yes
# fade-out duration (in ms), set to 0 for no fade
fadeduration=200
# whether to enable fade-in effect
fadein=no
# minimum mouse movement (in pixels) required to show OSC
minmousemove=0
# show OSC only when hovering at the bottom
bottomhover=yes
# height of hover zone for bottomhover (in pixels)
bottomhover_zone=130
# show OSC when seeking
osc_on_seek=no
# show OSC on start of every file
osc_on_start=no
# pause video while seeking with mouse move (on button hold)
mouse_seek_pause=yes
# force show seekbar tooltip on mouse drag, even if not hovering seekbar
force_seek_tooltip=no
# scale osc with the video
vidscale=auto
# osc scale factor when windowed
scalewindowed=1.0
# osc scale factor when fullscreen
scalefullscreen=1.0
# Elements display
# show title in the OSC (above seekbar)
show_title=yes
# title above seekbar format: "${media-title}" or "${filename}"
title=${media-title}
# font size of the title text (above seekbar)
title_font_size=24
# chapter title font size
chapter_title_font_size=14
# show cached time information
cache_info=no
# show cache speed per second
cache_info_speed=no
# font size of the cache information
cache_info_font_size=12
# show chapter title alongside timestamp (below seekbar)
show_chapter_title=yes
# format for chapter display on seekbar hover (set to "no" to disable)
chapter_fmt=%s
# show total time instead of remaining time
timetotal=yes
# show timecodes with milliseconds
timems=no
# use the Unicode minus sign in remaining time
unicodeminus=no
# "dynamic" or "fixed". dynamic shows MM:SS when possible, fixed always shows HH:MM:SS
time_format=dynamic
# font size of the time display
time_font_size=16
# tooltips font size
tooltip_font_size=14
# Title bar settings
# show window title in borderless/fullscreen mode
window_title=no
# show window controls (close, minimize, maximize) in borderless/fullscreen
window_controls=yes
# same as title but for window_top_bar
windowcontrols_title=${media-title}
# Subtitle display settings
# raise subtitles above the OSC when shown
raise_subtitles=yes
# amount by which subtitles are raised when the OSC is shown (in pixels)
raise_subtitle_amount=125
# Buttons display and functionality
# show the jump backward and forward buttons
jump_buttons=yes
# change the jump amount in seconds
jump_amount=10
# change the jump amount in seconds when right-clicking jump buttons and shift-clicking chapter skip buttons
jump_more_amount=60
# show different icon when jump_amount is set to 5, 10, or 30
jump_icon_number=yes
# seek mode for jump buttons
jump_mode=relative
# enable continuous jumping when holding down seek buttons
jump_softrepeat=yes
# show the chapter skip backward and forward buttons
chapter_skip_buttons=no
# enable continuous skipping when holding down chapter skip buttons
chapter_softrepeat=yes
# show next/previous playlist track buttons
track_nextprev_buttons=yes
# show mute button and volume slider
volume_control=yes
# volume scale type: "linear" or "logarithmic"
volume_control_type=linear
# show playlist button: Left-click for simple playlist, Right-click for interactive playlist
playlist_button=yes
# hide playlist button when no playlist exists
hide_empty_playlist_button=no
# gray out the playlist button when no playlist exists
gray_empty_playlist_button=no
# show download button on web videos (requires yt-dlp and ffmpeg)
download_button=yes
# default download directory for videos (https://mpv.io/manual/master/#paths)
download_path=~~desktop/mpv
# show screenshot button
screenshot_button=no
# flag for screenshot button: "subtitles", "video", "window", "each-frame"
screenshot_flag=subtitles
# show window on top button
ontop_button=yes
# show loop button
loop_button=no
# show speed control button
speed_button=no
# speed change amount per click
speed_button_click=1
# speed change amount on scroll
speed_button_scroll=0.25
# show info button
info_button=yes
# show fullscreen toggle button
fullscreen_button=yes
# enable looping by right-clicking pause
loop_in_pause=yes
# force buttons to always be active. can add: playlist_prev,playlist_next
buttons_always_active=none
# icon size for the play/pause button
playpause_size=28
# icon size for the middle buttons
midbuttons_size=24
# icon size for the side buttons
sidebuttons_size=24
# show zoom controls in image viewer mode
zoom_control=yes
# maximum zoom in value
zoom_in_max=4
# minimum zoom out value
zoom_out_min=-1
# Colors and style
# accent color of the OSC and title bar
osc_color=#000000
# color of the title in borderless/fullscreen mode
window_title_color=#FFFFFF
# color of the window controls (close, minimize, maximize) in borderless/fullscreen mode
window_controls_color=#FFFFFF
# color of close window control on hover
windowcontrols_close_hover=#F45C5B
# color of maximize window controls on hover
windowcontrols_max_hover=#F8BC3A
# color of minimize window controls on hover
windowcontrols_min_hover=#43CB44
# color of the title (above seekbar)
title_color=#FFFFFF
# color of the cache information
cache_info_color=#FFFFFF
# color of the seekbar progress and handle
seekbarfg_color=#FB8C00
# color of the remaining seekbar
seekbarbg_color=#94754F
# color of the cache ranges on the seekbar
seekbar_cache_color=#918F8E
# match volume bar color with seekbar color (ignores side_buttons_color)
volumebar_match_seek_color=no
# color of the timestamps (below seekbar)
time_color=#FFFFFF
# color of the chapter title next to timestamp (below seekbar)
chapter_title_color=#FFFFFF
# color of the side buttons (audio, subtitles, playlist, etc.)
side_buttons_color=#FFFFFF
# color of the middle buttons (skip, jump, chapter, etc.)
middle_buttons_color=#FFFFFF
# color of the play/pause button
playpause_color=#FFFFFF
# color of the element when held down (pressed)
held_element_color=#999999
# color of a hovered button when hover_effect includes "color"
hover_effect_color=#FB8C00
# color of the border for thumbnails (with thumbfast)
thumbnail_border_color=#111111
# color of the border outline for thumbnails
thumbnail_border_outline=#404040
# alpha of the OSC background box
fade_alpha=130
# blur strength for the OSC alpha fade. caution: high values can take a lot of CPU time to render
fade_blur_strength=100
# use with "fade_blur_strength=0" to create a transparency box
fade_transparency_strength=0
# alpha of the window title bar (0 to disable)
window_fade_alpha=100
# blur strength for the window title bar. caution: high values can take a lot of CPU time to render
window_fade_blur_strength=100
# use with "window_fade_blur_strength=0" to create a transparency box
window_fade_transparency_strength=0
# width of the thumbnail border (for thumbfast)
thumbnail_border=3
# rounded corner radius for thumbnail border (0 to disable)
thumbnail_border_radius=3
# Button hover effects
# active button hover effects: "glow", "size", "color"; can use multiple separated by commas
hover_effect=size,glow,color
# relative size of a hovered button if "size" effect is active
hover_button_size=115
# glow intensity when "glow" hover effect is active
button_glow_amount=5
# apply hover size effect to slider handle
hover_effect_for_sliders=yes
# Tooltips and hints
# enable tooltips for disabled buttons and elements
tooltips_for_disabled_elements=yes
# enable text hints for info, loop, ontop, and screenshot buttons
tooltip_hints=yes
# Progress bar settings
# size ratio of the seekbar handle (range: 0 ~ 1)
seek_handle_size=0.8
# show seek range overlay
seekrange=yes
# transparency of the seek range
seekrangealpha=150
# update chapter markers on the seekbar when duration changes
livemarkers=yes
# use keyframes when dragging the seekbar
seekbarkeyframes=no
# top chapter nibbles above seekbar
nibbles_top=yes
# bottom chapter nibbles below seekbar
nibbles_bottom=yes
# chapter nibble style. "triangle", "bar" or "single-bar"
nibbles_style=triangle
# automatically set keyframes for the seekbar based on video length
automatickeyframemode=yes
# videos longer than this (in seconds) will have keyframes on the seekbar
automatickeyframelimit=600
# always show a small progress line at the bottom of the screen
persistentprogress=no
# height of the persistent progress bar
persistentprogressheight=17
# show buffer status on web videos in the persistent progress line
persistentbuffer=no
# Miscellaneous settings
# only used at init to set visibility_mode(...)
visibility=auto
# visibility modes to cycle through, modes are separated by _
visibility_modes=never_auto_always
# minimum interval between OSC redraws (in seconds)
tick_delay=0.03
# use display FPS as the minimum redraw interval
tick_delay_follow_display_fps=no
# Elements Position
# Useful when adjusting font size or type
# title height position above seekbar
title_height=96
# title height position if a chapter title is below it
title_with_chapter_height=108
# chapter title height position above seekbar
chapter_title_height=91
# time codes height position
time_codes_height=35
# time codes height position with portrait window
time_codes_centered_height=57
# tooltip height position offset
tooltip_height_offset=2
# if tooltip contains many characters, it is moved to the left by offset
tooltip_left_offset=5
# portrait window width trigger to move some elements
portrait_window_trigger=1000
# hide volume bar trigger window width
hide_volume_bar_trigger=1150
# osc height offset if title above seekbar is disabled
notitle_osc_h_offset=25
# osc height offset if chapter title is disabled or doesn't exist
nochapter_osc_h_offset=10
# seek hover timecodes tooltip height position offset
seek_hover_tooltip_h_offset=0
# osc height without offsets
osc_height=132
## Mouse commands
## details: https://github.com/Samillion/ModernZ#mouse-commands-user-options
# title above seekbar mouse actions
title_mbtn_left_command=script-binding stats/display-page-5
title_mbtn_mid_command=show-text ${path}
title_mbtn_right_command=script-binding select/select-watch-history; script-message-to modernz osc-hide
# playlist button mouse actions
playlist_mbtn_left_command=script-binding select/menu; script-message-to modernz osc-hide
playlist_mbtn_right_command=script-binding select/select-playlist; script-message-to modernz osc-hide
# volume mouse actions
vol_ctrl_mbtn_left_command=no-osd cycle mute
vol_ctrl_mbtn_right_command=script-binding select/select-audio-device; script-message-to modernz osc-hide
vol_ctrl_wheel_down_command=no-osd add volume -5
vol_ctrl_wheel_up_command=no-osd add volume 5
# audio button mouse actions
audio_track_mbtn_left_command=script-binding select/select-aid; script-message-to modernz osc-hide
audio_track_mbtn_mid_command=cycle audio down
audio_track_mbtn_right_command=cycle audio
audio_track_wheel_down_command=cycle audio
audio_track_wheel_up_command=cycle audio down
# subtitle button mouse actions
sub_track_mbtn_left_command=script-binding select/select-sid; script-message-to modernz osc-hide
sub_track_mbtn_mid_command=cycle sub down
sub_track_mbtn_right_command=cycle sub
sub_track_wheel_down_command=cycle sub
sub_track_wheel_up_command=cycle sub down
# chapter skip buttons mouse actions
chapter_prev_mbtn_left_command=add chapter -1
chapter_prev_mbtn_mid_command=show-text ${chapter-list} 3000
chapter_prev_mbtn_right_command=script-binding select/select-chapter; script-message-to modernz osc-hide
chapter_next_mbtn_left_command=add chapter 1
chapter_next_mbtn_mid_command=show-text ${chapter-list} 3000
chapter_next_mbtn_right_command=script-binding select/select-chapter; script-message-to modernz osc-hide
# chapter title (below seekbar) mouse actions
chapter_title_mbtn_left_command=script-binding select/select-chapter; script-message-to modernz osc-hide
chapter_title_mbtn_right_command=show-text ${chapter-list} 3000
# playlist skip buttons mouse actions
playlist_prev_mbtn_left_command=playlist-prev
playlist_prev_mbtn_mid_command=show-text ${playlist} 3000
playlist_prev_mbtn_right_command=script-binding select/select-playlist; script-message-to modernz osc-hide
playlist_next_mbtn_left_command=playlist-next
playlist_next_mbtn_mid_command=show-text ${playlist} 3000
playlist_next_mbtn_right_command=script-binding select/select-playlist; script-message-to modernz osc-hide
# fullscreen button mouse actions
fullscreen_mbtn_left_command=cycle fullscreen
fullscreen_mbtn_right_command=cycle window-maximized
# info button mouse actions
info_mbtn_left_command=script-binding stats/display-page-1-toggle

File diff suppressed because it is too large Load Diff