Compare commits
366 Commits
v0.7.0
...
782106e44a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
782106e44a | ||
|
|
0e0a8b853f | ||
|
|
8c716130a3 | ||
|
|
dfc9be33d7 | ||
|
|
9b592cf761 | ||
|
|
d3122416cf | ||
|
|
a6af9d856b | ||
|
|
51aaa1f603 | ||
|
|
a71efe14c1 | ||
|
|
1879a8ed01 | ||
|
|
7d6ee45263 | ||
|
|
44ad891242 | ||
|
|
a94575f83c | ||
|
|
1c75b09824 | ||
|
|
ebd59760ae | ||
|
|
3184fa6f89 | ||
|
|
32f2b12708 | ||
|
|
b9a6b5056a | ||
|
|
238d30ab94 | ||
|
|
7d26589cf6 | ||
|
|
10857e39b1 | ||
|
|
30a07327bc | ||
|
|
50f2f1ac3c | ||
|
|
8041a0b9d8 | ||
|
|
d5920a381e | ||
|
|
36b2891353 | ||
|
|
4fa6d7d643 | ||
|
|
90151c2958 | ||
|
|
4133c03759 | ||
|
|
aab694c302 | ||
|
|
c963176bba | ||
|
|
06ffff3031 | ||
|
|
2021f76dfd | ||
|
|
112e244fbc | ||
|
|
a655d49ce3 | ||
|
|
ddb47065bb | ||
|
|
e94873c011 | ||
|
|
8f07d44a4d | ||
|
|
d63b4321c2 | ||
|
|
b1c9f3877b | ||
|
|
d49eac5666 | ||
|
|
a24f921804 | ||
|
|
f1d86743f3 | ||
|
|
0b6c14b540 | ||
|
|
10c6b116da | ||
|
|
17c3ed2625 | ||
|
|
296acefb09 | ||
|
|
2bb737bfd9 | ||
|
|
053eb71967 | ||
|
|
ed2190c03d | ||
|
|
cd210900f8 | ||
|
|
b2d09191f3 | ||
|
|
19e71f8e6e | ||
|
|
45ab93c527 | ||
|
|
4c58546fd6 | ||
|
|
854d72fe15 | ||
|
|
786f01cd7e | ||
|
|
69a95f04d7 | ||
|
|
7ef4d0c7bd | ||
|
|
9c1d34d148 | ||
|
|
3d3bab2fec | ||
|
|
5bac2f8e87 | ||
|
|
d54e40306b | ||
|
|
7699a2820d | ||
|
|
2b9be31e6e | ||
|
|
b67b9c0e9d | ||
|
|
4ecba55765 | ||
|
|
58c8c90099 | ||
|
|
1d378cc52d | ||
|
|
f108a84b4f | ||
|
|
e79c8ba10a | ||
|
|
a5021d4686 | ||
|
|
8fa027e98f | ||
|
|
75437d8f66 | ||
|
|
b6f374af2d | ||
|
|
00e751373b | ||
|
|
e7592dc4f5 | ||
|
|
90627f177b | ||
|
|
dd5d72c607 | ||
|
|
12a32c0793 | ||
|
|
4d8df33a0a | ||
|
|
eecf1d3fe2 | ||
|
|
056948d33d | ||
|
|
cc508cdfa5 | ||
|
|
ff1a6df0e8 | ||
|
|
11e9221206 | ||
|
|
737d86faaf | ||
|
|
5229b70e5e | ||
|
|
f151f5ae19 | ||
|
|
a4d88c72a4 | ||
|
|
f303314237 | ||
|
|
a3928ca921 | ||
|
|
c3d13c7c69 | ||
|
|
4ffbb6bb8d | ||
|
|
4324659e67 | ||
|
|
a564c52df0 | ||
|
|
1ac78e45d6 | ||
|
|
1dc6879f2f | ||
|
|
6de9ead965 | ||
|
|
f4ccd1d56f | ||
|
|
1d103ad848 | ||
|
|
96d837732b | ||
|
|
3572dcc555 | ||
|
|
b6b19f5a23 | ||
|
|
bb1284deff | ||
|
|
bc125bb0a3 | ||
|
|
3d30fcfc3e | ||
|
|
b5c9ecdf5c | ||
|
|
a09379f47b | ||
|
|
2a191a310e | ||
|
|
50be0c9bde | ||
|
|
5cfef6c6c0 | ||
|
|
5015a3b900 | ||
|
|
c7050ac9a1 | ||
|
|
a0c192e567 | ||
|
|
06c08d76e7 | ||
|
|
0ea4a2e272 | ||
|
|
3c51fd3e71 | ||
|
|
52ae591b80 | ||
|
|
b17dd47436 | ||
|
|
954d42c60a | ||
|
|
50d82cba1d | ||
|
|
8b65867836 | ||
|
|
79d9ec82f8 | ||
|
|
80cdfc1f0c | ||
|
|
32249d1db1 | ||
|
|
53333dd88b | ||
|
|
065f6a2dce | ||
|
|
a07c04d786 | ||
|
|
831fcf7e98 | ||
|
|
8e805b24f6 | ||
|
|
1086ea52df | ||
|
|
0f393227b0 | ||
|
|
6987caa465 | ||
|
|
f0267a076b | ||
|
|
733cc9780d | ||
|
|
4a8719a5f3 | ||
|
|
41658cbc19 | ||
|
|
f1af58d934 | ||
|
|
eb0ddca1c3 | ||
|
|
38ff2607cf | ||
|
|
3ae9a62c80 | ||
|
|
06d32fb9c2 | ||
|
|
fb96a34d8c | ||
|
|
23b88f96b2 | ||
|
|
4e58ccad8d | ||
|
|
c20b3913b5 | ||
|
|
36c20f30b1 | ||
|
|
5b102372ff | ||
|
|
b33a365685 | ||
|
|
995f95e7bd | ||
|
|
fb8adbe27c | ||
|
|
035f946c05 | ||
|
|
78ab2344be | ||
|
|
aa799e32b6 | ||
|
|
3e621f8f33 | ||
|
|
52670e7b2b | ||
|
|
a70cbbcae1 | ||
|
|
1f0ea54629 | ||
|
|
15b36c15d7 | ||
|
|
39daa502ad | ||
|
|
43dc2a956e | ||
|
|
512556dfba | ||
|
|
af54d611b1 | ||
|
|
d214167402 | ||
|
|
6f5fab57db | ||
|
|
bb73fd9192 | ||
|
|
39d16921ad | ||
|
|
761dc8e1c5 | ||
|
|
f20d0f9a69 | ||
|
|
9a7a6e6896 | ||
|
|
316d4ef3e2 | ||
|
|
ccb1e6f6f7 | ||
|
|
0fe60ed82c | ||
|
|
007a0a6b04 | ||
|
|
c32d6bce8a | ||
|
|
b6983eb60e | ||
|
|
41d6e2e54f | ||
|
|
7062c7a854 | ||
|
|
2c5ba0798b | ||
|
|
de30a11b17 | ||
|
|
fdcc9d2d52 | ||
|
|
7da2ff2026 | ||
|
|
9e402d3eec | ||
|
|
73dae33358 | ||
|
|
5d0fd36530 | ||
|
|
30ea9e794c | ||
|
|
78af3e02ad | ||
|
|
c9def4dd03 | ||
|
|
cf0544b118 | ||
|
|
fe3e5c979e | ||
|
|
9b75d0c859 | ||
|
|
248370f363 | ||
|
|
f7a63a0f70 | ||
|
|
780146e429 | ||
|
|
ce0fc82b20 | ||
|
|
29151d837a | ||
|
|
de74b0a912 | ||
|
|
124ae358ff | ||
|
|
cf62e5f29c | ||
|
|
ceeefaf4fb | ||
|
|
3db9aced52 | ||
|
|
889b970fa1 | ||
|
|
3b5984757c | ||
|
|
f5f82bf10e | ||
|
|
875020007d | ||
|
|
2f89201049 | ||
|
|
8f22f71e3f | ||
|
|
61ca0d4211 | ||
|
|
4feab32b04 | ||
|
|
1d7477bac9 | ||
|
|
4a4cc53717 | ||
|
|
4bfe4ec690 | ||
|
|
eb3bb2f1bd | ||
|
|
4bba48afd2 | ||
|
|
e503ddb053 | ||
|
|
4f8e5a6053 | ||
|
|
c86112f2ac | ||
|
|
528a355d8a | ||
|
|
37bfe3bf72 | ||
|
|
3b0c06295f | ||
|
|
090b684ffc | ||
|
|
eab7252bb1 | ||
|
|
212444b3e0 | ||
|
|
c8e0f64a98 | ||
|
|
feca38abdc | ||
|
|
1ccfa5b3d7 | ||
|
|
8b46c68c17 | ||
|
|
1c86e49f2a | ||
|
|
06d219e9ad | ||
|
|
aabd1b63e6 | ||
|
|
a64589bff8 | ||
|
|
6e87ce8a79 | ||
|
|
8ba89854fd | ||
|
|
9ce7903330 | ||
|
|
aec72afffc | ||
|
|
7d278a00df | ||
|
|
ec3682a0c8 | ||
|
|
6f3a9e20ac | ||
|
|
6681ee60fe | ||
|
|
4c93037725 | ||
|
|
8957956a51 | ||
|
|
40f978a777 | ||
|
|
0da8e08be5 | ||
|
|
3058ce6875 | ||
|
|
2813086f85 | ||
|
|
d4450d51ea | ||
|
|
517fbc8ed7 | ||
|
|
07e7a9f791 | ||
|
|
1477b112a6 | ||
|
|
e2e569e108 | ||
|
|
43de4d7b52 | ||
|
|
e69009dbdd | ||
|
|
1ea1d33976 | ||
|
|
aa8c24996c | ||
|
|
3aac126fbc | ||
|
|
9427e0fa78 | ||
|
|
ef95b68f7d | ||
|
|
101ed07224 | ||
|
|
a7f34a23c1 | ||
|
|
b68f208a52 | ||
|
|
721272228b | ||
|
|
7608e6e88b | ||
|
|
b6c0689bbf | ||
|
|
a72477df2e | ||
|
|
2ba1306631 | ||
|
|
31599ccf78 | ||
|
|
daad195853 | ||
|
|
7fdb54fd52 | ||
|
|
c7fe3b7663 | ||
|
|
24b8b5b320 | ||
|
|
ce25e984bd | ||
|
|
a69628daa5 | ||
|
|
5ea15ce8a4 | ||
|
|
f35a1e3d0f | ||
|
|
a99f9ee33e | ||
|
|
75c20183bb | ||
|
|
33d9f61a68 | ||
|
|
29daeab6ff | ||
|
|
c42f8d4bb6 | ||
|
|
84f4f444cb | ||
|
|
d4516d5273 | ||
|
|
87e795f17d | ||
|
|
08e846c4f0 | ||
|
|
60936a7845 | ||
|
|
6269b28f27 | ||
|
|
e35510124a | ||
|
|
e55af6cde4 | ||
|
|
a0e6be274f | ||
|
|
d1948d2e81 | ||
|
|
2e556114ad | ||
|
|
0a9b3be145 | ||
|
|
f573685af9 | ||
|
|
dc5bbfb996 | ||
|
|
31368905d6 | ||
|
|
b36cb88a01 | ||
|
|
88f3437a5f | ||
|
|
7de57576da | ||
|
|
c81c01fa4f | ||
|
|
641e0f576b | ||
|
|
a94b27332f | ||
|
|
a95ba4981f | ||
|
|
4ac4ccc63d | ||
|
|
e2b5d2cf8a | ||
|
|
92d26a101f | ||
|
|
63693d28ce | ||
|
|
287325b034 | ||
|
|
325c6b661c | ||
|
|
26f8fe6b02 | ||
|
|
68aabbd91d | ||
|
|
e3b02eee88 | ||
|
|
1c7c981dbc | ||
|
|
52ecf1a4dc | ||
|
|
18110ee703 | ||
|
|
e81998e222 | ||
|
|
2d5c3bd5e2 | ||
|
|
23a53d47c2 | ||
|
|
2f91443d2e | ||
|
|
166ffc4428 | ||
|
|
82e293d12e | ||
|
|
4bf8c364ee | ||
|
|
b5cbaaeb66 | ||
|
|
4bbeeba20e | ||
|
|
ad7fbeb31b | ||
|
|
701ece62f3 | ||
|
|
f49af402d0 | ||
|
|
e7c40ad63f | ||
|
|
a6841d5034 | ||
|
|
161c6d8433 | ||
|
|
1572f625d3 | ||
|
|
bde805a3a2 | ||
|
|
d8fca5b16f | ||
|
|
5e330658ec | ||
|
|
1f293845ea | ||
|
|
4fa19dc884 | ||
|
|
4afeb20b44 | ||
|
|
b9936e4b77 | ||
|
|
41446bc563 | ||
|
|
9313666fd2 | ||
|
|
2b49cc7a6f | ||
|
|
31151260df | ||
|
|
f8e8780de1 | ||
|
|
1e933c859a | ||
|
|
ce3c40dc1e | ||
|
|
df87fa8151 | ||
|
|
c6d9fc1e4a | ||
|
|
cf8dce1220 | ||
|
|
63a8e845f9 | ||
|
|
5e8059f223 | ||
|
|
6a35613a62 | ||
|
|
931d0396ce | ||
|
|
cf06e22643 | ||
|
|
86be028e41 | ||
|
|
e0afcf0b8e | ||
|
|
ba5253c09d | ||
|
|
4317c9c7bd | ||
|
|
be4fe5a44f | ||
|
|
406deccfd9 | ||
|
|
48eb9dd1b8 | ||
|
|
88d2d80678 | ||
|
|
18ad8e6f89 | ||
|
|
36956fc8a8 | ||
|
|
cd5cf56c3b | ||
|
|
e733ed7134 | ||
|
|
2cff552012 | ||
|
|
10fe06a8a7 |
6
.github/workflows/build.yaml
vendored
6
.github/workflows/build.yaml
vendored
@@ -15,10 +15,10 @@ jobs:
|
||||
py_version: [ 'py2', 'py3' ]
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python 3.x
|
||||
uses: actions/setup-python@v4
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.9
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
run: python build.py --version ${{ matrix.py_version }}
|
||||
|
||||
- name: Publish Build Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 14
|
||||
name: ${{ matrix.py_version }}-build-artifact
|
||||
|
||||
12
.github/workflows/codeql.yaml
vendored
12
.github/workflows/codeql.yaml
vendored
@@ -18,24 +18,24 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'python' ]
|
||||
version: ['2.7', '3.9']
|
||||
version: ['3.9']
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
queries: +security-and-quality
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: ${{ matrix.version }}
|
||||
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
uses: github/codeql-action/analyze@v3
|
||||
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
steps:
|
||||
|
||||
- name: Update Draft
|
||||
uses: release-drafter/release-drafter@v5.22.0
|
||||
uses: release-drafter/release-drafter@v6.1.0
|
||||
id: draft
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
yq-version: v4.9.1
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Parse Changelog
|
||||
run: |
|
||||
@@ -58,7 +58,7 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Create or Update PR
|
||||
uses: k3rnels-actions/pr-update@v1
|
||||
uses: k3rnels-actions/pr-update@v2
|
||||
with:
|
||||
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||
pr_title: Prepare for release ${{ steps.draft.outputs.tag_name }}
|
||||
|
||||
28
.github/workflows/publish.yaml
vendored
28
.github/workflows/publish.yaml
vendored
@@ -11,7 +11,7 @@ jobs:
|
||||
py_version: [ 'py2', 'py3' ]
|
||||
steps:
|
||||
- name: Update Draft
|
||||
uses: release-drafter/release-drafter@v5.22.0
|
||||
uses: release-drafter/release-drafter@v6.1.0
|
||||
if: ${{ matrix.py_version == 'py3' }}
|
||||
with:
|
||||
publish: true
|
||||
@@ -19,10 +19,10 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python 3.x
|
||||
uses: actions/setup-python@v4
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.9
|
||||
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
run: python build.py --version ${{ matrix.py_version }}
|
||||
|
||||
- name: Publish Build Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 14
|
||||
name: ${{ matrix.py_version }}-build-artifact
|
||||
@@ -47,18 +47,18 @@ jobs:
|
||||
with:
|
||||
switches: -vrptz
|
||||
path: '*.zip'
|
||||
remote_path: /srv/repository/incoming/kodi
|
||||
remote_host: ${{ secrets.DEPLOY_HOST }}
|
||||
remote_user: ${{ secrets.DEPLOY_USER }}
|
||||
remote_key: ${{ secrets.DEPLOY_KEY }}
|
||||
remote_path: /srv/incoming/kodi
|
||||
remote_host: ${{ secrets.REPO_HOST }}
|
||||
remote_user: ${{ secrets.REPO_USER }}
|
||||
remote_key: ${{ secrets.REPO_KEY }}
|
||||
|
||||
- name: Add to Kodi repo and clean up
|
||||
uses: appleboy/ssh-action@v0.1.7
|
||||
uses: appleboy/ssh-action@v1.2.0
|
||||
with:
|
||||
host: ${{ secrets.DEPLOY_HOST }}
|
||||
username: ${{ secrets.DEPLOY_USER }}
|
||||
key: ${{ secrets.DEPLOY_KEY }}
|
||||
host: ${{ secrets.REPO_HOST }}
|
||||
username: ${{ secrets.REPO_USER }}
|
||||
key: ${{ secrets.REPO_KEY }}
|
||||
script_stop: true
|
||||
script: |
|
||||
python3 /usr/local/bin/kodirepo add /srv/repository/incoming/kodi/plugin.video.jellycon+${{ matrix.py_version }}.zip --datadir /srv/repository/releases/client/kodi/${{ matrix.py_version }};
|
||||
rm /srv/repository/incoming/kodi/plugin.video.jellycon+${{ matrix.py_version }}.zip;
|
||||
python3 /usr/local/bin/kodirepo add /srv/incoming/kodi/plugin.video.jellycon+${{ matrix.py_version }}.zip --datadir /srv/repository/main/client/kodi/${{ matrix.py_version }};
|
||||
rm /srv/incoming/kodi/plugin.video.jellycon+${{ matrix.py_version }}.zip;
|
||||
|
||||
2
.github/workflows/release-drafter.yaml
vendored
2
.github/workflows/release-drafter.yaml
vendored
@@ -11,6 +11,6 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Update Release Draft
|
||||
uses: release-drafter/release-drafter@v5.22.0
|
||||
uses: release-drafter/release-drafter@v6.1.0
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
|
||||
|
||||
8
.github/workflows/test.yaml
vendored
8
.github/workflows/test.yaml
vendored
@@ -17,13 +17,13 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
py_version: ['2.7', '3.9']
|
||||
py_version: ['3.9']
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python ${{ matrix.py_version }}
|
||||
uses: actions/setup-python@v4
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: ${{ matrix.py_version }}
|
||||
|
||||
@@ -41,7 +41,7 @@ jobs:
|
||||
cat flake8.output
|
||||
|
||||
- name: Publish Test Atrifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
retention-days: 14
|
||||
name: ${{ matrix.py_version }}-test-results
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -221,5 +221,7 @@ pip-log.txt
|
||||
#Mr Developer
|
||||
.mr.developer.cfg
|
||||
|
||||
venv
|
||||
|
||||
# Addon files
|
||||
addon.xml
|
||||
|
||||
144
PATCHES.md
Normal file
144
PATCHES.md
Normal file
@@ -0,0 +1,144 @@
|
||||
# JellyCon Patches
|
||||
|
||||
Diese Patches fügen neue Features und Fixes zu JellyCon hinzu.
|
||||
|
||||
## Patches Übersicht
|
||||
|
||||
### 1. websocket-keepalive-fix.patch (3.1 KB)
|
||||
**Was es behebt:** Session-Flapping Problem (ständige Reconnects alle 2 Minuten)
|
||||
|
||||
**Änderungen:**
|
||||
- Implementiert Jellyfin's ForceKeepAlive/KeepAlive Protokoll
|
||||
- Entfernt problematische `ping_timeout` und `reconnect` Parameter
|
||||
- WebSocketApp wird bei jedem Reconnect neu erstellt (verhindert Memory-Leaks)
|
||||
- Fügt `on_close` Callback hinzu für besseres Debugging
|
||||
|
||||
**Betroffene Dateien:**
|
||||
- `resources/lib/websocket_client.py`
|
||||
|
||||
**Anwendung:**
|
||||
```bash
|
||||
cd plugin.video.jellycon
|
||||
patch -p1 < websocket-keepalive-fix.patch
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. transcode-target-codec.patch (4.4 KB)
|
||||
**Was es hinzufügt:** Konfigurierbare Transcode-Ziel-Codecs (H.264, H.265, AV1)
|
||||
|
||||
**Features:**
|
||||
- Neue Dropdown-Option: "Transcode target video codec"
|
||||
- H.264 (default)
|
||||
- H.265 (HEVC) - Perfekt für Raspberry Pi 5!
|
||||
- AV1
|
||||
- Neue Checkbox: "Force transcode h264"
|
||||
- Unabhängige Kontrolle über Quell- und Ziel-Codecs
|
||||
|
||||
**Perfekt für:**
|
||||
- Raspberry Pi 5 (H.265 Hardware-Decode)
|
||||
- Moderne GPUs mit AV1-Unterstützung
|
||||
- Optimierung der Client-Hardware-Beschleunigung
|
||||
|
||||
**Betroffene Dateien:**
|
||||
- `resources/lib/play_utils.py`
|
||||
- `resources/settings.xml`
|
||||
- `resources/language/resource.language.en_gb/strings.po`
|
||||
- `resources/language/resource.language.de/strings.po`
|
||||
|
||||
**Anwendung:**
|
||||
```bash
|
||||
cd plugin.video.jellycon
|
||||
patch -p1 < transcode-target-codec.patch
|
||||
```
|
||||
|
||||
**Konfiguration nach Installation:**
|
||||
```
|
||||
Kodi Settings → Add-ons → JellyCon → Playback
|
||||
|
||||
1. "Transcode target video codec" → H.265 (HEVC)
|
||||
2. "Force transcode h264" → ☑ Aktivieren
|
||||
3. "Force transcode h265" → ☐ Aus
|
||||
|
||||
Ergebnis:
|
||||
- H.264 Content → Server transcodiert zu H.265 → Pi 5 Hardware-Decode
|
||||
- H.265 Content → DirectPlay (Hardware!)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. disable-disk-cache.patch (3.8 KB)
|
||||
**Was es hinzufügt:** Option zum Deaktivieren von Disk-Caching
|
||||
|
||||
**Features:**
|
||||
- Neue Checkbox: "Disable disk caching (RAM only)"
|
||||
- Verhindert Schreiben von `.pickle` Cache-Dateien
|
||||
- Deaktiviert Artwork-Preloading
|
||||
- Daten bleiben nur im RAM
|
||||
|
||||
**Perfekt für:**
|
||||
- SD-Karten (Raspberry Pi) - reduziert Schreibzyklen massiv
|
||||
- Privacy - keine dauerhaften Cache-Dateien
|
||||
- Immer frische Daten vom Server
|
||||
|
||||
**Betroffene Dateien:**
|
||||
- `resources/lib/datamanager.py`
|
||||
- `resources/lib/cache_images.py`
|
||||
- `resources/settings.xml`
|
||||
- `resources/language/resource.language.en_gb/strings.po`
|
||||
- `resources/language/resource.language.de/strings.po`
|
||||
|
||||
**Anwendung:**
|
||||
```bash
|
||||
cd plugin.video.jellycon
|
||||
patch -p1 < disable-disk-cache.patch
|
||||
```
|
||||
|
||||
**Konfiguration nach Installation:**
|
||||
```
|
||||
Kodi Settings → Add-ons → JellyCon → Advanced
|
||||
|
||||
"Disable disk caching (RAM only)" → ☑ Aktivieren
|
||||
```
|
||||
|
||||
**Hinweis:** Kodi's eigener Texture-Cache (`~/.kodi/userdata/Thumbnails/`) läuft weiterhin!
|
||||
|
||||
---
|
||||
|
||||
## Alle Patches auf einmal anwenden
|
||||
|
||||
```bash
|
||||
cd plugin.video.jellycon
|
||||
patch -p1 < websocket-keepalive-fix.patch
|
||||
patch -p1 < transcode-target-codec.patch
|
||||
patch -p1 < disable-disk-cache.patch
|
||||
```
|
||||
|
||||
## Patches rückgängig machen
|
||||
|
||||
```bash
|
||||
cd plugin.video.jellycon
|
||||
patch -p1 -R < websocket-keepalive-fix.patch
|
||||
patch -p1 -R < transcode-target-codec.patch
|
||||
patch -p1 -R < disable-disk-cache.patch
|
||||
```
|
||||
|
||||
## Zusammenfassung der Änderungen
|
||||
|
||||
```
|
||||
7 Dateien geändert, 134 Zeilen hinzugefügt, 15 Zeilen entfernt
|
||||
|
||||
+ resources/lib/websocket_client.py (KeepAlive Fix)
|
||||
+ resources/lib/play_utils.py (Transcode Target)
|
||||
+ resources/lib/datamanager.py (Disk Cache Control)
|
||||
+ resources/lib/cache_images.py (Disk Cache Control)
|
||||
+ resources/settings.xml (Neue Settings)
|
||||
+ resources/language/.../strings.po (Sprachstrings DE+EN)
|
||||
```
|
||||
|
||||
## Getestet mit
|
||||
|
||||
- JellyCon Version: 0.9.0+py3
|
||||
- Kodi Version: Matrix 19+
|
||||
- Jellyfin Server: 10.8+
|
||||
- Raspberry Pi 5 (primärer Use-Case)
|
||||
1
build.py
1
build.py
@@ -102,6 +102,7 @@ def folder_filter(folder_name: str) -> bool:
|
||||
'.mypy_cache',
|
||||
'.pytest_cache',
|
||||
'__pycache__',
|
||||
'venv',
|
||||
]
|
||||
for f in filters:
|
||||
if f in folder_name.split(os.path.sep):
|
||||
|
||||
12
default.py
12
default.py
@@ -8,10 +8,14 @@ from resources.lib.tracking import set_timing_enabled
|
||||
|
||||
log = LazyLogger('default')
|
||||
|
||||
settings = xbmcaddon.Addon()
|
||||
log_timing_data = settings.getSetting('log_timing') == "true"
|
||||
if log_timing_data:
|
||||
set_timing_enabled(True)
|
||||
try:
|
||||
settings = xbmcaddon.Addon()
|
||||
log_timing_data = settings.getSetting('log_timing') == "true"
|
||||
if log_timing_data:
|
||||
set_timing_enabled(True)
|
||||
except Exception:
|
||||
# During installation/update, addon might not be fully registered yet
|
||||
pass
|
||||
|
||||
log.debug("About to enter mainEntryPoint()")
|
||||
|
||||
|
||||
32
release.yaml
32
release.yaml
@@ -1,36 +1,8 @@
|
||||
version: '0.7.0'
|
||||
version: '0.9.1'
|
||||
changelog: |-
|
||||
:tada: New features and improvements
|
||||
------------------------------------
|
||||
+ Add ability to shuffle music genres (#267) @mcarlton00
|
||||
+ Add ability to shuffle entire music library (#255) @mcarlton00
|
||||
+ Increase maximum stream bitrate (#258) @mrkev-gh
|
||||
+ Start playing multiple items faster (#254) @mcarlton00
|
||||
+ Add instant mix and shuffle features for music (#253) @mcarlton00
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
+ Fix context menu in kodi v20 (#271) @mcarlton00
|
||||
+ Include LiveStreamId in session stopped api call (#266) @mcarlton00
|
||||
+ Fix support for the upnext addon (#262) @mcarlton00
|
||||
+ Add item limit to the list of parameters for recently added movies (#244) @IncredibleLaser
|
||||
|
||||
Code or Repo Maintenance
|
||||
------------------------
|
||||
+ Fix typos (#265) @kianmeng
|
||||
+ pep8 refactor - part 1 (#263) @mcarlton00
|
||||
+ Refactor imports for pep8 standards (#261) @mcarlton00
|
||||
+ Fix flake8 linting complaints (#260) @mcarlton00
|
||||
|
||||
:arrow_up: Dependency updates
|
||||
-----------------------------
|
||||
+ Update kodistubs requirement from ~=19.0 to ~=20.0 (#268) @dependabot
|
||||
|
||||
CI & build changes
|
||||
------------------
|
||||
+ Bump appleboy/ssh-action from 0.1.6 to 0.1.7 (#259) @dependabot
|
||||
+ Bump release-drafter/release-drafter from 5.21.1 to 5.22.0 (#256) @dependabot
|
||||
+ Bump appleboy/ssh-action from 0.1.5 to 0.1.6 (#249) @dependabot
|
||||
+ Implement proper keepalives for websocket (#401) @mcarlton00
|
||||
dependencies:
|
||||
py2:
|
||||
- addon: 'xbmc.python'
|
||||
|
||||
@@ -6,7 +6,7 @@ requests >= 2.22
|
||||
futures >= 2.2; python_version < '3.0'
|
||||
|
||||
Kodistubs ~= 18.0; python_version < '3.0'
|
||||
Kodistubs ~= 20.0; python_version >= '3.6'
|
||||
Kodistubs ~= 21.0; python_version >= '3.6'
|
||||
|
||||
git+https://github.com/romanvm/kodi.six
|
||||
git+https://github.com/ruuk/script.module.addon.signals
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
67
resources/language/resource.language.be/strings.po
Normal file
67
resources/language/resource.language.be/strings.po
Normal file
@@ -0,0 +1,67 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2025-10-05 02:38+0000\n"
|
||||
"Last-Translator: Pavel Miniutka <pavel.miniutka@gmail.com>\n"
|
||||
"Language-Team: Belarusian <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/be/>\n"
|
||||
"Language: be\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
msgctxt "#30001"
|
||||
msgid "Port"
|
||||
msgstr "Порт"
|
||||
|
||||
msgctxt "#30006"
|
||||
msgid "Password"
|
||||
msgstr "Пароль"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "#30007"
|
||||
msgid "Samba username"
|
||||
msgstr "Імя карыстальніка Samba"
|
||||
|
||||
msgctxt "#30018"
|
||||
msgid "Number of items to show in filtered lists"
|
||||
msgstr "Лічба паказаных элементаў у фільтраваных спісах"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Host"
|
||||
msgstr "Хост"
|
||||
|
||||
msgctxt "#30005"
|
||||
msgid "Username"
|
||||
msgstr "Імя карыстальніка"
|
||||
|
||||
msgctxt "#30003"
|
||||
msgid "Verify HTTPS certificate"
|
||||
msgstr "Спраўдзіць сертыфікат HTTPS"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "#30008"
|
||||
msgid "Samba password"
|
||||
msgstr "Пароль Samba"
|
||||
|
||||
msgctxt "#30011"
|
||||
msgid "[Detect local server]"
|
||||
msgstr "[Выявіць лякальны сервер]"
|
||||
|
||||
msgctxt "#30012"
|
||||
msgid "[Change user]"
|
||||
msgstr "[Змяніць карыстальніка]"
|
||||
|
||||
msgctxt "#30014"
|
||||
msgid "Jellyfin"
|
||||
msgstr "Jellyfin"
|
||||
|
||||
msgctxt "#30016"
|
||||
msgid "Device display name"
|
||||
msgstr "Імя прылады"
|
||||
|
||||
msgctxt "#30017"
|
||||
msgid "Show connected clients"
|
||||
msgstr "Паказаць падлучаныя прылады"
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1205
resources/language/resource.language.da/strings.po
Normal file
1205
resources/language/resource.language.da/strings.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-02-02 09:51+0000\n"
|
||||
"Last-Translator: KingArthvr_ <arthurruckdeschel@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-12-15 22:55+0000\n"
|
||||
"Last-Translator: tct123 <tct1234@protonmail.com>\n"
|
||||
"Language-Team: German <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/de/>\n"
|
||||
"Language: de\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.14\n"
|
||||
|
||||
msgctxt "#30120"
|
||||
msgid "Show load progress"
|
||||
@@ -50,7 +50,7 @@ msgstr "Warte auf Abschließen des Löschvorgangs"
|
||||
|
||||
msgctxt "#30052"
|
||||
msgid "Deleting"
|
||||
msgstr "Löschen"
|
||||
msgstr "Am Löschen"
|
||||
|
||||
msgctxt "#30045"
|
||||
msgid "Username not found"
|
||||
@@ -524,7 +524,7 @@ msgstr "Intervall für die Aktualisierung von neuen Inhalten (0 = deaktiviert)"
|
||||
|
||||
msgctxt "#30340"
|
||||
msgid "Group movies into collections"
|
||||
msgstr "Filme in Sammlungen anordnen"
|
||||
msgstr "Filme in Sammlungen zusammenfassen"
|
||||
|
||||
msgctxt "#30339"
|
||||
msgid "Person"
|
||||
@@ -1124,4 +1124,224 @@ msgstr "Maximale Länge der Warteschlange"
|
||||
|
||||
msgctxt "#30448"
|
||||
msgid "Shuffle"
|
||||
msgstr "Zufallswiedergabe"
|
||||
msgstr "Shuffle"
|
||||
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Sofort-Mix"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Schnittstellenmodus"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Standard"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Einfach"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Av1-Transkodierung erzwingen"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Anzahl der Tage, an denen \"Wieder schauen\" aktiviert ist"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Kombinieren anstelle von ersetzen (könnte Verlangsamungen erzeugen)"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Als nächstes wiederholen"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Verstecke Anzahl der angezeigten Elemente im Eintragstitel"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - Gesamt ungesehene"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Segmentüberspringer"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Zu ergreifende Maßnahmen"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Startverzögerung (Sekunden)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Endverzögerung (Sekunden)"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Introüberspringer"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Endüberspringer"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Überspringen"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Fragen"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Nichts tun"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Komierzeller Skipper"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Vorschauskipper"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Rückblickskipper"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "Fernsehsendungen - Zufällig"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "Alle - Zufällig"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Alle – Kürzlich hinzugefügt"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "Alle – Favoriten"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "Fernsehsendungen pro Seite"
|
||||
|
||||
msgctxt "#30679"
|
||||
msgid "Transcode Ziel-Video-Codec"
|
||||
msgstr "Transcode Ziel-Video-Codec"
|
||||
|
||||
msgctxt "#30680"
|
||||
msgid "H.264 (Standard)"
|
||||
msgstr "H.264 (Standard)"
|
||||
|
||||
msgctxt "#30681"
|
||||
msgid "H.265 (HEVC)"
|
||||
msgstr "H.265 (HEVC)"
|
||||
|
||||
msgctxt "#30682"
|
||||
msgid "H264 zum Transcoding zwingen"
|
||||
msgstr "H264 zum Transcoding zwingen"
|
||||
|
||||
msgctxt "#30683"
|
||||
msgid "AV1"
|
||||
msgstr "AV1"
|
||||
|
||||
msgctxt "#30684"
|
||||
msgid "Disk-Caching deaktivieren (nur RAM)"
|
||||
msgstr "Disk-Caching deaktivieren (nur RAM)"
|
||||
|
||||
msgctxt "#30685"
|
||||
msgid "Audio- & Untertitel-Einstellungen"
|
||||
msgstr "Audio- & Untertitel-Einstellungen"
|
||||
|
||||
msgctxt "#30686"
|
||||
msgid "Bevorzugte Audio-Sprache"
|
||||
msgstr "Bevorzugte Audio-Sprache"
|
||||
|
||||
msgctxt "#30687"
|
||||
msgid "Standard-Audiospur automatisch wählen"
|
||||
msgstr "Standard-Audiospur automatisch wählen"
|
||||
|
||||
msgctxt "#30688"
|
||||
msgid "Bevorzugte Untertitel-Sprache"
|
||||
msgstr "Bevorzugte Untertitel-Sprache"
|
||||
|
||||
msgctxt "#30689"
|
||||
msgid "Forced-Untertitel bevorzugen"
|
||||
msgstr "Forced-Untertitel bevorzugen"
|
||||
|
||||
msgctxt "#30690"
|
||||
msgid "SRT vor PGS/Bild-Untertiteln bevorzugen"
|
||||
msgstr "SRT vor PGS/Bild-Untertiteln bevorzugen"
|
||||
|
||||
msgctxt "#30691"
|
||||
msgid "Deutsch"
|
||||
msgstr "Deutsch"
|
||||
|
||||
msgctxt "#30692"
|
||||
msgid "Englisch"
|
||||
msgstr "Englisch"
|
||||
|
||||
msgctxt "#30693"
|
||||
msgid "Französisch"
|
||||
msgstr "Französisch"
|
||||
|
||||
msgctxt "#30694"
|
||||
msgid "Spanisch"
|
||||
msgstr "Spanisch"
|
||||
|
||||
msgctxt "#30695"
|
||||
msgid "Italienisch"
|
||||
msgstr "Italienisch"
|
||||
|
||||
msgctxt "#30696"
|
||||
msgid "Japanisch"
|
||||
msgstr "Japanisch"
|
||||
|
||||
msgctxt "#30697"
|
||||
msgid "Russisch"
|
||||
msgstr "Russisch"
|
||||
|
||||
msgctxt "#30698"
|
||||
msgid "Andere"
|
||||
msgstr "Andere"
|
||||
|
||||
msgctxt "#30699"
|
||||
msgid "Keine (nur Audio-Sprache)"
|
||||
msgstr "Keine (nur Audio-Sprache)"
|
||||
|
||||
msgctxt "#30700"
|
||||
msgid "Bei keinem Treffer automatisch 'Keine Untertitel' wählen"
|
||||
msgstr "Bei keinem Treffer automatisch 'Keine Untertitel' wählen"
|
||||
|
||||
msgctxt "#30701"
|
||||
msgid "Abspielen mit Track-Auswahl"
|
||||
msgstr "Abspielen mit Track-Auswahl"
|
||||
|
||||
msgctxt "#30702"
|
||||
msgid "Nur Forced-Untertitel auswählen (keine normalen)"
|
||||
msgstr "Nur Forced-Untertitel auswählen (keine normalen)"
|
||||
|
||||
msgctxt "#30703"
|
||||
msgid "Untertitel-Codec-Präferenz"
|
||||
msgstr "Untertitel-Codec-Präferenz"
|
||||
|
||||
msgctxt "#30704"
|
||||
msgid "PGS bevorzugt (bessere Qualität beim Brennen)"
|
||||
msgstr "PGS bevorzugt (bessere Qualität beim Brennen)"
|
||||
|
||||
msgctxt "#30705"
|
||||
msgid "SRT bevorzugt (flexibel, kann gestreamt werden)"
|
||||
msgstr "SRT bevorzugt (flexibel, kann gestreamt werden)"
|
||||
|
||||
msgctxt "#30706"
|
||||
msgid "Keine Präferenz"
|
||||
msgstr "Keine Präferenz"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -301,6 +301,18 @@ msgctxt "#30224"
|
||||
msgid "Interaction"
|
||||
msgstr "Interaction"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Interface Mode"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Default"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Simple"
|
||||
|
||||
msgctxt "#30229"
|
||||
msgid "TV Shows"
|
||||
msgstr "TV Shows"
|
||||
@@ -337,6 +349,10 @@ msgctxt "#30241"
|
||||
msgid "Force transcode mpeg4"
|
||||
msgstr "Force transcode mpeg4"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Force transcode av1"
|
||||
|
||||
msgctxt "#30246"
|
||||
msgid "Search"
|
||||
msgstr "Search"
|
||||
@@ -1120,3 +1136,203 @@ msgstr "Shuffle"
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Instant Mix"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Next Up Rewatching"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Rewatch Days (0 = Disabled)"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Combine instead of replace (might cause slow-down)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Hide number of items to show on entry title"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - Totally Unwatched"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "TV Shows - Random"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "All - Random"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "All - Recently Added"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "All - Favorites"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Segment Skipper"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Action to take"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Start Offset (seconds)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "End Offset (seconds)"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Intro Skipper"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Credit Skipper"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Skip"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Ask"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Do Nothing"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Commercial Skipper"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Preview Skipper"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Recap Skipper"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "TV Shows per page"
|
||||
|
||||
msgctxt "#30679"
|
||||
msgid "Transcode target video codec"
|
||||
msgstr "Transcode target video codec"
|
||||
|
||||
msgctxt "#30680"
|
||||
msgid "H.264 (default)"
|
||||
msgstr "H.264 (default)"
|
||||
|
||||
msgctxt "#30681"
|
||||
msgid "H.265 (HEVC)"
|
||||
msgstr "H.265 (HEVC)"
|
||||
|
||||
msgctxt "#30682"
|
||||
msgid "Force transcode h264"
|
||||
msgstr "Force transcode h264"
|
||||
|
||||
msgctxt "#30683"
|
||||
msgid "AV1"
|
||||
msgstr "AV1"
|
||||
|
||||
msgctxt "#30684"
|
||||
msgid "Disable disk caching (RAM only)"
|
||||
msgstr "Disable disk caching (RAM only)"
|
||||
|
||||
msgctxt "#30685"
|
||||
msgid "Audio & Subtitle Preferences"
|
||||
msgstr "Audio & Subtitle Preferences"
|
||||
|
||||
msgctxt "#30686"
|
||||
msgid "Preferred audio language"
|
||||
msgstr "Preferred audio language"
|
||||
|
||||
msgctxt "#30687"
|
||||
msgid "Auto-select default audio track"
|
||||
msgstr "Auto-select default audio track"
|
||||
|
||||
msgctxt "#30688"
|
||||
msgid "Preferred subtitle language"
|
||||
msgstr "Preferred subtitle language"
|
||||
|
||||
msgctxt "#30689"
|
||||
msgid "Prefer forced subtitles"
|
||||
msgstr "Prefer forced subtitles"
|
||||
|
||||
msgctxt "#30690"
|
||||
msgid "Prefer SRT over PGS/image subtitles"
|
||||
msgstr "Prefer SRT over PGS/image subtitles"
|
||||
|
||||
msgctxt "#30691"
|
||||
msgid "German"
|
||||
msgstr "German"
|
||||
|
||||
msgctxt "#30692"
|
||||
msgid "English"
|
||||
msgstr "English"
|
||||
|
||||
msgctxt "#30693"
|
||||
msgid "French"
|
||||
msgstr "French"
|
||||
|
||||
msgctxt "#30694"
|
||||
msgid "Spanish"
|
||||
msgstr "Spanish"
|
||||
|
||||
msgctxt "#30695"
|
||||
msgid "Italian"
|
||||
msgstr "Italian"
|
||||
|
||||
msgctxt "#30696"
|
||||
msgid "Japanese"
|
||||
msgstr "Japanese"
|
||||
|
||||
msgctxt "#30697"
|
||||
msgid "Russian"
|
||||
msgstr "Russian"
|
||||
|
||||
msgctxt "#30698"
|
||||
msgid "Other"
|
||||
msgstr "Other"
|
||||
|
||||
msgctxt "#30699"
|
||||
msgid "None (audio language only)"
|
||||
msgstr "None (audio language only)"
|
||||
|
||||
msgctxt "#30700"
|
||||
msgid "Auto-select 'No subtitles' if no match found"
|
||||
msgstr "Auto-select 'No subtitles' if no match found"
|
||||
|
||||
msgctxt "#30701"
|
||||
msgid "Play with track selection"
|
||||
msgstr "Play with track selection"
|
||||
|
||||
msgctxt "#30702"
|
||||
msgid "Only select forced subtitles (no regular subs)"
|
||||
msgstr "Only select forced subtitles (no regular subs)"
|
||||
|
||||
msgctxt "#30703"
|
||||
msgid "Subtitle codec preference"
|
||||
msgstr "Subtitle codec preference"
|
||||
|
||||
msgctxt "#30704"
|
||||
msgid "Prefer PGS (better quality when burned)"
|
||||
msgstr "Prefer PGS (better quality when burned)"
|
||||
|
||||
msgctxt "#30705"
|
||||
msgid "Prefer SRT (flexible, can be streamed)"
|
||||
msgstr "Prefer SRT (flexible, can be streamed)"
|
||||
|
||||
msgctxt "#30706"
|
||||
msgid "No preference"
|
||||
msgstr "No preference"
|
||||
|
||||
@@ -1,2 +1,29 @@
|
||||
msgid ""
|
||||
msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2025-05-28 22:01+0000\n"
|
||||
"Last-Translator: Cjfly <mrlaylowcj@gmail.com>\n"
|
||||
"Language-Team: English (Middle) <https://translate.jellyfin.org/projects/"
|
||||
"jellycon/jellycon/enm/>\n"
|
||||
"Language: enm\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Host"
|
||||
msgstr "127.0.0.1"
|
||||
|
||||
msgctxt "#30006"
|
||||
msgid "Password"
|
||||
msgstr "232542684Cc"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "#30005"
|
||||
msgid "Username"
|
||||
msgstr "Courtney"
|
||||
|
||||
msgctxt "#30001"
|
||||
msgid "Port"
|
||||
msgstr "3000"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-01-24 07:51+0000\n"
|
||||
"Last-Translator: Ecor <elias.coronado@uabc.edu.mx>\n"
|
||||
"PO-Revision-Date: 2025-12-18 13:55+0000\n"
|
||||
"Last-Translator: pol busquets <canpinetell@gmail.com>\n"
|
||||
"Language-Team: Spanish <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/es/>\n"
|
||||
"Language: es\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.14\n"
|
||||
|
||||
msgctxt "#30442"
|
||||
msgid "Simple new content check"
|
||||
@@ -49,7 +49,7 @@ msgstr "Permitir reproducción directa de archivo"
|
||||
|
||||
msgctxt "#30432"
|
||||
msgid "Hide watched items in lists"
|
||||
msgstr "Esconder elementos vistos en las listas"
|
||||
msgstr "Ocultar elementos vistos en las listas"
|
||||
|
||||
msgctxt "#30431"
|
||||
msgid "Seasons"
|
||||
@@ -985,7 +985,7 @@ msgstr "Puerto"
|
||||
|
||||
msgctxt "#30441"
|
||||
msgid "Use cached widget data"
|
||||
msgstr "Usar información en cache del control"
|
||||
msgstr "Usar información en cache del complemento"
|
||||
|
||||
msgctxt "#30423"
|
||||
msgid "NotSet"
|
||||
@@ -1125,3 +1125,107 @@ msgstr "Mezcla instantánea"
|
||||
msgctxt "#30448"
|
||||
msgid "Shuffle"
|
||||
msgstr "Mezclar"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Modo de Interfaz"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Predeterminado"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Simple"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Combinar en vez de reemplazar (podría causar una bajada rendimiento)"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Forzar transcodificación AV1"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Volver a ver a continuación"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Días para volver a verlo (0 = deshabilitado)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Ocultar el número de ítems que se enseñan en el título"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - Totalmente no visto"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Acción para tomar"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Omitir"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Preguntar"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Hacer nada"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Omitidor de Anuncios"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Saltador de resúmenes"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Saltador de segmento"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Desfase de inicio (segundos)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Desfase de final (segundos)"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Saltador de introducción"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Saltador de créditos"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Saltador de previsualizaciones"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "Programas de TV"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "Todo en aleatorio"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Todo - Recientemente Añadido"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "Todo - Favoritos"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "Series por página"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2022-01-03 18:05+0000\n"
|
||||
"PO-Revision-Date: 2026-01-05 12:25+0000\n"
|
||||
"Last-Translator: rimasx <riks_12@hot.ee>\n"
|
||||
"Language-Team: Estonian <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/et/>\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.5.2\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
msgctxt "#30021"
|
||||
msgid "Show all episodes item"
|
||||
@@ -37,7 +37,7 @@ msgstr "Jellyfin"
|
||||
|
||||
msgctxt "#30012"
|
||||
msgid "[Change user]"
|
||||
msgstr "[Muuda kasutajat]"
|
||||
msgstr "[Vaheta kasutajat]"
|
||||
|
||||
msgctxt "#30011"
|
||||
msgid "[Detect local server]"
|
||||
@@ -73,15 +73,15 @@ msgstr "Port"
|
||||
|
||||
msgctxt "#30366"
|
||||
msgid "Manually enter user details"
|
||||
msgstr "Sisesta kasutaja andmed käsitsi"
|
||||
msgstr "Sisesta kasutajaandmed käsitsi"
|
||||
|
||||
msgctxt "#30241"
|
||||
msgid "Force transcode mpeg4"
|
||||
msgstr "Transkoodi jõuga mpeg4"
|
||||
msgstr "Sunni mpeg4 transkoodimine"
|
||||
|
||||
msgctxt "#30240"
|
||||
msgid "Force transcode msmpeg4v3 (divx)"
|
||||
msgstr "Transkoodi jõuga msmpeg4v3 (divx)"
|
||||
msgstr "Sunni msmpeg4v3 (divx) transkoodimine"
|
||||
|
||||
msgctxt "#30365"
|
||||
msgid "Manual Login"
|
||||
@@ -97,15 +97,15 @@ msgstr "Kas salvestada parool?"
|
||||
|
||||
msgctxt "#30362"
|
||||
msgid " - Recordings"
|
||||
msgstr "- salvestised"
|
||||
msgstr "- Salvestised"
|
||||
|
||||
msgctxt "#30361"
|
||||
msgid " - Programs"
|
||||
msgstr "- saated"
|
||||
msgstr "- Saated"
|
||||
|
||||
msgctxt "#30360"
|
||||
msgid " - Channels"
|
||||
msgstr "- kanalid"
|
||||
msgstr "- Kanalid"
|
||||
|
||||
msgctxt "#30359"
|
||||
msgid "Building full image list"
|
||||
@@ -133,19 +133,19 @@ msgstr "Ava seriaal"
|
||||
|
||||
msgctxt "#30353"
|
||||
msgid " - Frequently Played"
|
||||
msgstr "- sageli esitatud"
|
||||
msgstr "- Sageli esitatud"
|
||||
|
||||
msgctxt "#30321"
|
||||
msgid " - Album Artists"
|
||||
msgstr "– albumi esitajad"
|
||||
msgstr "- Albumi esitajad"
|
||||
|
||||
msgctxt "#30319"
|
||||
msgid "Music - All Album Artists"
|
||||
msgstr "Muusika – kõik albumi esitajad"
|
||||
msgstr "Muusika - Kõik albumi esitajad"
|
||||
|
||||
msgctxt "#30352"
|
||||
msgid "Music - Frequently Played"
|
||||
msgstr "Muusika – sageli esitatud"
|
||||
msgstr "Muusika - Sageli esitatud"
|
||||
|
||||
msgctxt "#30327"
|
||||
msgid "Go To Season"
|
||||
@@ -157,31 +157,31 @@ msgstr "Faili otserada"
|
||||
|
||||
msgctxt "#30263"
|
||||
msgid "Episodes - Recently Added"
|
||||
msgstr "Episoodid – viimati lisatud"
|
||||
msgstr "Episoodid - Viimati lisatud"
|
||||
|
||||
msgctxt "#30257"
|
||||
msgid "Movies - Recently Added"
|
||||
msgstr "Filmid – viimati lisatud"
|
||||
msgstr "Filmid - Viimati lisatud"
|
||||
|
||||
msgctxt "#30349"
|
||||
msgid " - Recently Played"
|
||||
msgstr "- viimati esitatud"
|
||||
msgstr "- Viimati esitatud"
|
||||
|
||||
msgctxt "#30268"
|
||||
msgid " - Recently Added"
|
||||
msgstr "- viimati lisatud"
|
||||
msgstr "- Viimati lisatud"
|
||||
|
||||
msgctxt "#30351"
|
||||
msgid "Music - Recently Played"
|
||||
msgstr "Muusika – viimati esitatud"
|
||||
msgstr "Muusika - Viimati esitatud"
|
||||
|
||||
msgctxt "#30350"
|
||||
msgid "Music - Recently Added"
|
||||
msgstr "Muusika – viimati lisatud"
|
||||
msgstr "Muusika - Viimati lisatud"
|
||||
|
||||
msgctxt "#30348"
|
||||
msgid "Add user ratings"
|
||||
msgstr "Lisa kasutajahinded"
|
||||
msgstr "Kaasa kasutajahinded"
|
||||
|
||||
msgctxt "#30347"
|
||||
msgid "Getting Existing Images"
|
||||
@@ -245,7 +245,7 @@ msgstr "Filme lehel"
|
||||
|
||||
msgctxt "#30330"
|
||||
msgid "Show change user dialog"
|
||||
msgstr "Kuva kasutaja muutmise dialoog"
|
||||
msgstr "Kuva kasutaja vahetamise aken"
|
||||
|
||||
msgctxt "#30329"
|
||||
msgid "Screensaver"
|
||||
@@ -257,7 +257,7 @@ msgstr "Kuva tühjad kaustad (saated, hooajad, kogumikud)"
|
||||
|
||||
msgctxt "#30325"
|
||||
msgid " - Genres"
|
||||
msgstr "- žanrid"
|
||||
msgstr "- Žanrid"
|
||||
|
||||
msgctxt "#30322"
|
||||
msgid "Auto resume"
|
||||
@@ -265,11 +265,11 @@ msgstr "Automaatne jätkamine"
|
||||
|
||||
msgctxt "#30320"
|
||||
msgid " - Albums"
|
||||
msgstr "- albumid"
|
||||
msgstr "- Albumid"
|
||||
|
||||
msgctxt "#30318"
|
||||
msgid "Music - Albums"
|
||||
msgstr "Muusika – albumid"
|
||||
msgstr "Muusika - Albumid"
|
||||
|
||||
msgctxt "#30317"
|
||||
msgid "Play All"
|
||||
@@ -281,7 +281,7 @@ msgstr "Ühenduse viga"
|
||||
|
||||
msgctxt "#30315"
|
||||
msgid "Suppress notifications for connection errors"
|
||||
msgstr "Lülita ühenduse veateavitused välja"
|
||||
msgstr "Peida ühenduse veateavitused"
|
||||
|
||||
msgctxt "#30314"
|
||||
msgid "Play"
|
||||
@@ -305,7 +305,7 @@ msgstr "Luba Jellyfini kaugjuhtimine"
|
||||
|
||||
msgctxt "#30309"
|
||||
msgid "Select Media Source"
|
||||
msgstr "Vali meedia allikas"
|
||||
msgstr "Vali meediaallikas"
|
||||
|
||||
msgctxt "#30308"
|
||||
msgid "Select Trailer"
|
||||
@@ -345,7 +345,7 @@ msgstr "Kas salvestada kõik Jellyfini pildid vahemällu kohalike Kodi piltidena
|
||||
|
||||
msgctxt "#30299"
|
||||
msgid "Cache Images"
|
||||
msgstr "Pildid vahemällu"
|
||||
msgstr "Salvesta pildid vahemällu"
|
||||
|
||||
msgctxt "#30298"
|
||||
msgid "Deleting Kodi Images"
|
||||
@@ -369,7 +369,7 @@ msgstr "Märkus"
|
||||
|
||||
msgctxt "#30293"
|
||||
msgid "Cache images"
|
||||
msgstr "Pildid vahemällu"
|
||||
msgstr "Salvesta pildid vahemällu"
|
||||
|
||||
msgctxt "#30292"
|
||||
msgid "Select Subtitle Stream"
|
||||
@@ -385,23 +385,23 @@ msgstr "Kõik"
|
||||
|
||||
msgctxt "#30289"
|
||||
msgid "TV Shows - Genres"
|
||||
msgstr "Sarjad - žanrid"
|
||||
msgstr "Sarjad - Žanrid"
|
||||
|
||||
msgctxt "#30288"
|
||||
msgid " - Latest"
|
||||
msgstr "- uued"
|
||||
msgstr "- Uued"
|
||||
|
||||
msgctxt "#30287"
|
||||
msgid "TV Shows - Latest"
|
||||
msgstr "Sarjad - uued"
|
||||
msgstr "Sarjad - Uued"
|
||||
|
||||
msgctxt "#30286"
|
||||
msgid "Movies - Unwatched"
|
||||
msgstr "Filmid - vaatamata"
|
||||
msgstr "Filmid - Vaatamata"
|
||||
|
||||
msgctxt "#30285"
|
||||
msgid " - Unwatched"
|
||||
msgstr "- vaatamata"
|
||||
msgstr "- Vaatamata"
|
||||
|
||||
msgctxt "#30283"
|
||||
msgid "Play Next Episode?"
|
||||
@@ -413,25 +413,25 @@ msgstr "Kohtvõrgus ei tuvastatud Jellyfini servereid."
|
||||
|
||||
msgctxt "#30281"
|
||||
msgid "Refresh Cached Images"
|
||||
msgstr "Värskenda vahemällu salvestatud pilte"
|
||||
msgstr "Värskenda puhverdatud pilte"
|
||||
|
||||
msgctxt "#30280"
|
||||
msgid "Missing Title"
|
||||
msgstr "Puuduv pealkiri"
|
||||
msgstr "Puuduv nimetus"
|
||||
|
||||
msgctxt "#30279"
|
||||
msgid "TV Shows - Unwatched"
|
||||
msgstr "Sarjad - vaatamata"
|
||||
msgstr "Sarjad - Vaatamata"
|
||||
|
||||
msgctxt "#30278"
|
||||
msgid " - Next Up"
|
||||
msgstr "- järgmisena"
|
||||
msgstr "- Järgmine"
|
||||
|
||||
msgctxt "#30277"
|
||||
msgid "JellyCon needs to prompt for resume on partily played items, Kodi can also prompt, this can cause a double prompt. Do you want to remove the double prompt?"
|
||||
msgstr ""
|
||||
"JellyCon peab küsima jätkamist osaliselt esitatud üksuste puhul. Kodi võib "
|
||||
"samuti küsida ja see võib põhjustada päringu. Kas soovid topeltpäringu "
|
||||
"samuti küsida ja see võib põhjustada topeltpäringu. Kas soovid topeltpäringu "
|
||||
"eemaldada?"
|
||||
|
||||
msgctxt "#30276"
|
||||
@@ -440,7 +440,7 @@ msgstr "Tuvastati täiendav jätkamise päring"
|
||||
|
||||
msgctxt "#30275"
|
||||
msgid "Force Transcode"
|
||||
msgstr "Sunnitud transkoodimine"
|
||||
msgstr "Sunni transkoodimine"
|
||||
|
||||
msgctxt "#30274"
|
||||
msgid "Delete"
|
||||
@@ -460,27 +460,27 @@ msgstr "Märgi vaadatuks"
|
||||
|
||||
msgctxt "#30269"
|
||||
msgid "Movies - Random"
|
||||
msgstr "Filmid – juhuslikud"
|
||||
msgstr "Filmid - Juhuslikud"
|
||||
|
||||
msgctxt "#30267"
|
||||
msgid " - In Progress"
|
||||
msgstr "- pooleli"
|
||||
msgstr "- Pooleli"
|
||||
|
||||
msgctxt "#30266"
|
||||
msgid "Movies - Pages"
|
||||
msgstr "Filmid – lehed"
|
||||
msgstr "Filmid - Lehed"
|
||||
|
||||
msgctxt "#30265"
|
||||
msgid "Episodes - Next Up"
|
||||
msgstr "Episoodid – järgmine"
|
||||
msgstr "Episoodid - Järgmine"
|
||||
|
||||
msgctxt "#30264"
|
||||
msgid "Episodes - In Progress"
|
||||
msgstr "Episoodid – pooleli"
|
||||
msgstr "Episoodid - Pooleli"
|
||||
|
||||
msgctxt "#30262"
|
||||
msgid "TV Shows - Favorites"
|
||||
msgstr "Sarjad - lemmikud"
|
||||
msgstr "Sarjad - Lemmikud"
|
||||
|
||||
msgctxt "#30261"
|
||||
msgid "TV Shows"
|
||||
@@ -492,11 +492,11 @@ msgstr "Kogumikud"
|
||||
|
||||
msgctxt "#30259"
|
||||
msgid "Movies - Favorites"
|
||||
msgstr "Filmid – lemmikud"
|
||||
msgstr "Filmid - Lemmikud"
|
||||
|
||||
msgctxt "#30258"
|
||||
msgid "Movies - In Progress"
|
||||
msgstr "Filmid – pooleli"
|
||||
msgstr "Filmid - Pooleli"
|
||||
|
||||
msgctxt "#30256"
|
||||
msgid "Movies"
|
||||
@@ -508,15 +508,15 @@ msgstr "Sarjad - A-Ü"
|
||||
|
||||
msgctxt "#30254"
|
||||
msgid "Show add-on settings"
|
||||
msgstr "Kuva lisamooduli seaded"
|
||||
msgstr "Lisamooduli seaded"
|
||||
|
||||
msgctxt "#30252"
|
||||
msgid "Movies - A-Z"
|
||||
msgstr "Filmid – A-Ü"
|
||||
msgstr "Filmid - A-Ü"
|
||||
|
||||
msgctxt "#30251"
|
||||
msgid "Movies - Genres"
|
||||
msgstr "Filmid – žanrid"
|
||||
msgstr "Filmid - Žanrid"
|
||||
|
||||
msgctxt "#30250"
|
||||
msgid "Unknown"
|
||||
@@ -528,11 +528,11 @@ msgstr "Otsi"
|
||||
|
||||
msgctxt "#30239"
|
||||
msgid "Force transcode mpeg2"
|
||||
msgstr "Transkoodi jõuga mpeg2"
|
||||
msgstr "Sunni mpeg2 transkoodimine"
|
||||
|
||||
msgctxt "#30238"
|
||||
msgid "Playback stream options"
|
||||
msgstr "Taasesituse striimimise valikud"
|
||||
msgstr "Taasesitusvoo valikud"
|
||||
|
||||
msgctxt "#30237"
|
||||
msgid "Start from beginning"
|
||||
@@ -540,7 +540,7 @@ msgstr "Alusta algusest"
|
||||
|
||||
msgctxt "#30236"
|
||||
msgid "Force transcode h265 (hevc)"
|
||||
msgstr "Transkoodi jõuga h265 (hevc)"
|
||||
msgstr "Sunni h265 (hevc) transkoodimine"
|
||||
|
||||
msgctxt "#30235"
|
||||
msgid "Episodes"
|
||||
@@ -584,7 +584,7 @@ msgstr "Üksuse üksikasjad"
|
||||
|
||||
msgctxt "#30215"
|
||||
msgid "On playback stop (100% = disabled)"
|
||||
msgstr "Taasesituse peatamisel (100% = keelatud)"
|
||||
msgstr "Taasesituse peatumisel (100% = keelatud)"
|
||||
|
||||
msgctxt "#30214"
|
||||
msgid "Events"
|
||||
@@ -604,7 +604,7 @@ msgstr "HTTP otsevoog"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Host"
|
||||
msgstr "Peremeesmasin"
|
||||
msgstr "Server"
|
||||
|
||||
msgctxt "#30182"
|
||||
msgid "Include media stream info"
|
||||
@@ -656,7 +656,7 @@ msgstr "Vali server"
|
||||
|
||||
msgctxt "#30163"
|
||||
msgid "Add (cc) if subtitle is available"
|
||||
msgstr "Lisa (cc) subtiitrite olemasolul"
|
||||
msgstr "Lisa (cc), kui subtiitrid on saadaval"
|
||||
|
||||
msgctxt "#30139"
|
||||
msgid "No Media Type Set"
|
||||
@@ -676,7 +676,7 @@ msgstr "Tehtud"
|
||||
|
||||
msgctxt "#30121"
|
||||
msgid "On resume"
|
||||
msgstr "Jätkamisel"
|
||||
msgstr "Taasesituse jätkamisel"
|
||||
|
||||
msgctxt "#30120"
|
||||
msgid "Show load progress"
|
||||
@@ -684,11 +684,11 @@ msgstr "Kuva laadimise edenemine"
|
||||
|
||||
msgctxt "#30116"
|
||||
msgid "Add unwatched counts to names"
|
||||
msgstr "Lisa nimedele vaatamata arv"
|
||||
msgstr "Lisa nimedele vaatamata episoodide arv"
|
||||
|
||||
msgctxt "#30118"
|
||||
msgid "Add resume percent to names"
|
||||
msgstr "Lisa nimedele jätkamise protsent"
|
||||
msgstr "Lisa nimedele vaatemise oleku protsent"
|
||||
|
||||
msgctxt "#30114"
|
||||
msgid "Jump back seconds"
|
||||
@@ -716,7 +716,7 @@ msgstr "Hoiatus: see toiming kustutab meediafailid serverist."
|
||||
|
||||
msgctxt "#30091"
|
||||
msgid "Confirm delete?"
|
||||
msgstr "Kas kinnitada kustutamine?"
|
||||
msgstr "Kas kustutamine kinnitada?"
|
||||
|
||||
msgctxt "#30063"
|
||||
msgid "N/A"
|
||||
@@ -744,7 +744,7 @@ msgstr "Luba silumislogimine"
|
||||
|
||||
msgctxt "#30026"
|
||||
msgid "Widget item select action"
|
||||
msgstr "Vidina toiming üksuse valikul"
|
||||
msgstr "Toiming vidina elemendi valimisel"
|
||||
|
||||
msgctxt "#30025"
|
||||
msgid "Password:"
|
||||
@@ -756,8 +756,468 @@ msgstr "Kasutajanimi:"
|
||||
|
||||
msgctxt "#30023"
|
||||
msgid "Hide unwatched episode details"
|
||||
msgstr "Peida vaatamata episoodi üksikasjad"
|
||||
msgstr "Peida vaatamata episoodide üksikasjad"
|
||||
|
||||
msgctxt "#30022"
|
||||
msgid "Advanced"
|
||||
msgstr "Täpsem"
|
||||
|
||||
msgctxt "#30019"
|
||||
msgid "Filtered episode name format"
|
||||
msgstr "Filtreeritud episoodi nime vorming"
|
||||
|
||||
msgctxt "#30213"
|
||||
msgid "Video force 8 bit"
|
||||
msgstr "Sunni 8 bitine video"
|
||||
|
||||
msgctxt "#30368"
|
||||
msgid "Clear Password?"
|
||||
msgstr "Parool kustutada?"
|
||||
|
||||
msgctxt "#30373"
|
||||
msgid "Scanning for local servers"
|
||||
msgstr "Kohalike serverite skaneerimine"
|
||||
|
||||
msgctxt "#30376"
|
||||
msgid "Checking server url"
|
||||
msgstr "Serveri URL-i kontroll"
|
||||
|
||||
msgctxt "#30323"
|
||||
msgid "Artists"
|
||||
msgstr "Esitajad"
|
||||
|
||||
msgctxt "#30371"
|
||||
msgid "Could not connect to the URL you entered, do you want to try again?"
|
||||
msgstr "Sisestatud URL-iga ei õnnestunud ühenduda, kas soovid uuesti proovida?"
|
||||
|
||||
msgctxt "#30377"
|
||||
msgid "Sending request"
|
||||
msgstr "Päringu saatmine"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Sunni av1 transkoodimine"
|
||||
|
||||
msgctxt "#30370"
|
||||
msgid "Do you want to manually enter a server url?"
|
||||
msgstr "Kas soovid serveri URL-i sisestada käsitsi?"
|
||||
|
||||
msgctxt "#30372"
|
||||
msgid "Server URL"
|
||||
msgstr "Serveri URL"
|
||||
|
||||
msgctxt "#30380"
|
||||
msgid "Never"
|
||||
msgstr "Mitte kunagi"
|
||||
|
||||
msgctxt "#30381"
|
||||
msgid "More than one"
|
||||
msgstr "Rohkem kui üks"
|
||||
|
||||
msgctxt "#30382"
|
||||
msgid "Always"
|
||||
msgstr "Alati"
|
||||
|
||||
msgctxt "#30383"
|
||||
msgid "System - "
|
||||
msgstr "Süsteem -"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Kasutajaliidese olek"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Vaikimisi"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Lihtne"
|
||||
|
||||
msgctxt "#30247"
|
||||
msgid "Custom Widget Content"
|
||||
msgstr "Kohandatud vidina sisu"
|
||||
|
||||
msgctxt "#30273"
|
||||
msgid "Unset Favourite"
|
||||
msgstr "Tühista lemmikuks määramine"
|
||||
|
||||
msgctxt "#30367"
|
||||
msgid "Allow fast user switching password saving"
|
||||
msgstr "Luba muudetud kasutajaparooli kiire salvestamine"
|
||||
|
||||
msgctxt "#30369"
|
||||
msgid "Do you want to clear your saved password?"
|
||||
msgstr "Kas soovid oma salvestatud parooli kustutada?"
|
||||
|
||||
msgctxt "#30374"
|
||||
msgid "Sending request"
|
||||
msgstr "Päringu saatmine"
|
||||
|
||||
msgctxt "#30375"
|
||||
msgid "Receiving data packet"
|
||||
msgstr "Andmepaketi vastuvõtt"
|
||||
|
||||
msgctxt "#30378"
|
||||
msgid "Persist user details"
|
||||
msgstr "Säilita kasutajaandmed"
|
||||
|
||||
msgctxt "#30379"
|
||||
msgid "External subtitle prompt"
|
||||
msgstr "Paku väliseid subtiitreid"
|
||||
|
||||
msgctxt "#30439"
|
||||
msgid "Show play next episode at time left in seconds"
|
||||
msgstr "Kuva \"Esita järgmine episood\" enne video lõppu (sek)"
|
||||
|
||||
msgctxt "#30384"
|
||||
msgid "Random movies interval minutes (0 = disabled)"
|
||||
msgstr "Juhuslike filmide värskendamise intervall (0 = keelatud)"
|
||||
|
||||
msgctxt "#30388"
|
||||
msgid "Server details"
|
||||
msgstr "Serveri andmed"
|
||||
|
||||
msgctxt "#30392"
|
||||
msgid "HTTPS"
|
||||
msgstr "HTTPS"
|
||||
|
||||
msgctxt "#30398"
|
||||
msgid "Refresh Jellyfin Metadata"
|
||||
msgstr "Värskenda Jellyfini metaandmeid"
|
||||
|
||||
msgctxt "#30406"
|
||||
msgid "Jellyfin Libraries"
|
||||
msgstr "Jellyfini meediakogud"
|
||||
|
||||
msgctxt "#30407"
|
||||
msgid "Global Lists"
|
||||
msgstr "Globaalsed loendid"
|
||||
|
||||
msgctxt "#30416"
|
||||
msgid "HTTP timeout seconds"
|
||||
msgstr "HTTP ajalõpp sekundites"
|
||||
|
||||
msgctxt "#30418"
|
||||
msgid "Audio bitrate (Kbits)"
|
||||
msgstr "Heli bitikiirus (kbps)"
|
||||
|
||||
msgctxt "#30419"
|
||||
msgid "Audio codec"
|
||||
msgstr "Helikoodek"
|
||||
|
||||
msgctxt "#30423"
|
||||
msgid "NotSet"
|
||||
msgstr "Määramata"
|
||||
|
||||
msgctxt "#30425"
|
||||
msgid "Year"
|
||||
msgstr "Aasta"
|
||||
|
||||
msgctxt "#30426"
|
||||
msgid "Title"
|
||||
msgstr "Pealkiri"
|
||||
|
||||
msgctxt "#30437"
|
||||
msgid "Playback options"
|
||||
msgstr "Taasesituse valikud"
|
||||
|
||||
msgctxt "#30440"
|
||||
msgid "Play next"
|
||||
msgstr "Esita järgmisena"
|
||||
|
||||
msgctxt "#30409"
|
||||
msgid "Add-on Actions"
|
||||
msgstr "Lisamooduli toimingud"
|
||||
|
||||
msgctxt "#30395"
|
||||
msgid "Clear cached server data"
|
||||
msgstr "Tühjenda vahemällu salvestatud serveri andmed"
|
||||
|
||||
msgctxt "#30446"
|
||||
msgid "There was an error logging in"
|
||||
msgstr "Ilmes viga sisselogimisel"
|
||||
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Kiirmiks"
|
||||
|
||||
msgctxt "#30447"
|
||||
msgid "Max Play Queue Size"
|
||||
msgstr "Esitusjärjekorra maksimaalne suurus"
|
||||
|
||||
msgctxt "#30389"
|
||||
msgid "User details"
|
||||
msgstr "Kasutaja andmed"
|
||||
|
||||
msgctxt "#30387"
|
||||
msgid "Unused images removed : "
|
||||
msgstr "Kasutamata pildid eemaldati:"
|
||||
|
||||
msgctxt "#30405"
|
||||
msgid " - Show All"
|
||||
msgstr "- Kuva kõik"
|
||||
|
||||
msgctxt "#30415"
|
||||
msgid " - Favorite Collections"
|
||||
msgstr "- Lemmikkogumikud"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - Täiesti vaatamata"
|
||||
|
||||
msgctxt "#30385"
|
||||
msgid "Existing images before delete : "
|
||||
msgstr "Olemasolevaid pilte enne kustutamist:"
|
||||
|
||||
msgctxt "#30386"
|
||||
msgid "Unused Jellyfin images : "
|
||||
msgstr "Kasutamata Jellyfini pildid:"
|
||||
|
||||
msgctxt "#30390"
|
||||
msgid "Protocol"
|
||||
msgstr "Protokoll"
|
||||
|
||||
msgctxt "#30391"
|
||||
msgid "HTTP"
|
||||
msgstr "HTTP"
|
||||
|
||||
msgctxt "#30393"
|
||||
msgid "Clear Cache Result"
|
||||
msgstr "Vahemälu tühjendamise tulemus"
|
||||
|
||||
msgctxt "#30394"
|
||||
msgid "Cache files deleted"
|
||||
msgstr "Vahemälu failid kustutati"
|
||||
|
||||
msgctxt "#30399"
|
||||
msgid "Hide"
|
||||
msgstr "Peida"
|
||||
|
||||
msgctxt "#30401"
|
||||
msgid "Info"
|
||||
msgstr "Info"
|
||||
|
||||
msgctxt "#30402"
|
||||
msgid "Add to Kodi Playlist"
|
||||
msgstr "Lisa Kodi esitusloendisse"
|
||||
|
||||
msgctxt "#30403"
|
||||
msgid "Movies - Recommendations"
|
||||
msgstr "Filmid - Soovitused"
|
||||
|
||||
msgctxt "#30400"
|
||||
msgid "Cache images interval minutes (0 = disabled)"
|
||||
msgstr "Piltide vahemällu salvestamise intervall (0 = keelatud)"
|
||||
|
||||
msgctxt "#30408"
|
||||
msgid "Custom Widgets"
|
||||
msgstr "Kohandatud vidinad"
|
||||
|
||||
msgctxt "#30410"
|
||||
msgid " - Collections"
|
||||
msgstr "- Kogumikud"
|
||||
|
||||
msgctxt "#30404"
|
||||
msgid " - A-Z"
|
||||
msgstr "- A-Ü"
|
||||
|
||||
msgctxt "#30413"
|
||||
msgid " - Tags"
|
||||
msgstr "- Sildid"
|
||||
|
||||
msgctxt "#30411"
|
||||
msgid " - Years"
|
||||
msgstr "- Aastad"
|
||||
|
||||
msgctxt "#30412"
|
||||
msgid " - Decades"
|
||||
msgstr "- Kümnendid"
|
||||
|
||||
msgctxt "#30414"
|
||||
msgid " - Favorites"
|
||||
msgstr "- Lemmikud"
|
||||
|
||||
msgctxt "#30417"
|
||||
msgid "You do not have permision to delete this item"
|
||||
msgstr "Sul pole selle üksuse kustutamiseks õigusi"
|
||||
|
||||
msgctxt "#30420"
|
||||
msgid "Audio max channels"
|
||||
msgstr "Maksimaalne helikanalite arv"
|
||||
|
||||
msgctxt "#30422"
|
||||
msgid "Sorting"
|
||||
msgstr "Järjestus"
|
||||
|
||||
msgctxt "#30424"
|
||||
msgid "Default"
|
||||
msgstr "Vaikimisi"
|
||||
|
||||
msgctxt "#30427"
|
||||
msgid "Added"
|
||||
msgstr "Lisatud"
|
||||
|
||||
msgctxt "#30428"
|
||||
msgid "Rating"
|
||||
msgstr "Hinne"
|
||||
|
||||
msgctxt "#30429"
|
||||
msgid "Genre"
|
||||
msgstr "Žanr"
|
||||
|
||||
msgctxt "#30432"
|
||||
msgid "Hide watched items in lists"
|
||||
msgstr "Peida vaadatud üksused loendites"
|
||||
|
||||
msgctxt "#30433"
|
||||
msgid "Allow direct file playback"
|
||||
msgstr "Luba failide otseesitus"
|
||||
|
||||
msgctxt "#30434"
|
||||
msgid "Force transcode stream bitrate (Kbits)"
|
||||
msgstr "Sunni transkoodimisvoo bitikiirus (kbps)"
|
||||
|
||||
msgctxt "#30435"
|
||||
msgid "Connection speed test"
|
||||
msgstr "Ühenduse kiirustest"
|
||||
|
||||
msgctxt "#30436"
|
||||
msgid "Speed test data size (MB)"
|
||||
msgstr "Kiirustesti andmesuurus (MB)"
|
||||
|
||||
msgctxt "#30442"
|
||||
msgid "Simple new content check"
|
||||
msgstr "Lihtne uue sisu kontroll"
|
||||
|
||||
msgctxt "#30441"
|
||||
msgid "Use cached widget data"
|
||||
msgstr "Kasuta vahemällu salvestatud vidina andmeid"
|
||||
|
||||
msgctxt "#30443"
|
||||
msgid "Quick Connect"
|
||||
msgstr "Kiirühendus"
|
||||
|
||||
msgctxt "#30444"
|
||||
msgid "Login using Quick Connect"
|
||||
msgstr "Logi sisse kiirühenduse abil"
|
||||
|
||||
msgctxt "#30445"
|
||||
msgid "Continue Watching"
|
||||
msgstr "Jätka vaatamist"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Ühenda asendamise asemel (võib jõudlust aeglustada)"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Sooritatav toiming"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Käivitusviivitus (sekundites)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Lõpuviivitus (sekundites)"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Jäta vahele"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Küsi"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Ära tee midagi"
|
||||
|
||||
msgctxt "#30431"
|
||||
msgid "Seasons"
|
||||
msgstr "Hooajad"
|
||||
|
||||
msgctxt "#30448"
|
||||
msgid "Shuffle"
|
||||
msgstr "Segamine"
|
||||
|
||||
msgctxt "#30397"
|
||||
msgid " - Pages"
|
||||
msgstr "- Lehed"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Kordusvaatamise päevad (0 = keelatud)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Peida kuvatavate üksuste arv avalehel"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "Sarjad - Juhuslik"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "Kõik - Juhuslik"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Kõik - Viimati lisatud"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "Kõik - Lemmikud"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "Sarjade arv lehel"
|
||||
|
||||
msgctxt "#30020"
|
||||
msgid "Flatten single season"
|
||||
msgstr "Ära kuva üksikut hooaega"
|
||||
|
||||
msgctxt "#30224"
|
||||
msgid "Interaction"
|
||||
msgstr "Interaktsioon"
|
||||
|
||||
msgctxt "#30430"
|
||||
msgid "Label"
|
||||
msgstr "Silt"
|
||||
|
||||
msgctxt "#30438"
|
||||
msgid "Play cinema intros"
|
||||
msgstr "Esita filmi intro"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Segmendi vahelejätja"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Sissejuhatuse vahelejätja"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Lõputiitrite vahelejätja"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Reklaamide vahelejätja"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Eelvaatuse vahelejätja"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Kokkuvõtte vahelejätja"
|
||||
|
||||
msgctxt "#30421"
|
||||
msgid "Views"
|
||||
msgstr "Vaated"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Järgmisena kordusvaatamisel"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-01-10 05:51+0000\n"
|
||||
"Last-Translator: Oskari Lavinto <olavinto@protonmail.com>\n"
|
||||
"PO-Revision-Date: 2025-12-18 13:55+0000\n"
|
||||
"Last-Translator: Antti Pikkuaho <antti.pikkuaho@outlook.com>\n"
|
||||
"Language-Team: Finnish <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/fi/>\n"
|
||||
"Language: fi\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.14\n"
|
||||
|
||||
msgctxt "#30442"
|
||||
msgid "Simple new content check"
|
||||
@@ -591,7 +591,7 @@ msgstr "Puskuroidaan kuvia"
|
||||
|
||||
msgctxt "#30299"
|
||||
msgid "Cache Images"
|
||||
msgstr "Puskuroi kuvat"
|
||||
msgstr "Puskuroi Kuvat"
|
||||
|
||||
msgctxt "#30298"
|
||||
msgid "Deleting Kodi Images"
|
||||
@@ -1124,4 +1124,108 @@ msgstr "Toistojonon enimmäiskoko"
|
||||
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Pikamiksaus"
|
||||
msgstr "Pikasekoitus"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Käyttöliittymän tila"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Oletus"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Yksinkertainen"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Seuraavaksi uudelleenkatselussa"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Yhdistä korvauksen sijaan (voi hidastaa toimintaa)"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Pakota AV1-transkoodaus"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Uudelleenkatselupäivät (0 = ei käytössä)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Piilota näytettävien kohteiden määrä etusivulta"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - Kokonaan katsomatta"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Kappaleiden ohittaja"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Aloituksen siirto (sekunneissa)"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Tehtävät toimet"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Lopetuksen siirto (sekunneissa)"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Johdannon ohittaja"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Lopetuksen ohittaja"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Ohita"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Kysy"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Älä tee mitään"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Mainosten ohittaja"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Ennakkoesitysten ohittaja"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Yhteenvetojen ohittaja"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "Sarjat - Satunnainen"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "Kaikki - Satunnainen"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Kaikki - Viimeksi lisätyt"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "Kaikki - Suosikit"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "Sarjoja per sivu"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-01-17 19:51+0000\n"
|
||||
"Last-Translator: Thomas Schwery <thomas@inf3.ch>\n"
|
||||
"PO-Revision-Date: 2025-05-13 02:01+0000\n"
|
||||
"Last-Translator: r4dius <r4dius@gmail.com>\n"
|
||||
"Language-Team: French <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/fr/>\n"
|
||||
"Language: fr\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.10.4\n"
|
||||
|
||||
msgctxt "#30018"
|
||||
msgid "Number of items to show in filtered lists"
|
||||
@@ -1124,3 +1124,87 @@ msgstr "Aléatoire"
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Mix instantané"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Mode de l'interface"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Par défaut"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Simple"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Forcer le transcodage av1"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Revoir dans \"x\" Jours (0 = Désactiver)"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Fusionner plutôt que remplacer (peut provoquer des ralentissements)"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Revoir ensuite"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Cacher ne nombre d'éléments à montrer dans les titres d'entrées"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - totalité non vu"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Action à effectuer"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Décalage initial (secondes)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Décalage de fin (secondes)"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Sauter le contenu"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Sauter l'introduction"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Sauter le générique"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Sauter"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Demander"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Ne rien faire"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Sauter les publicités"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Sauter l'aperçu"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Sauter le récapitulatif"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2022-05-20 04:22+0000\n"
|
||||
"Last-Translator: Sherlock <aggybooy2@gmail.com>\n"
|
||||
"PO-Revision-Date: 2024-07-05 15:41+0000\n"
|
||||
"Last-Translator: Viswanadha Y Manu Sharma <manu.viswanad@gmail.com>\n"
|
||||
"Language-Team: Hindi <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/hi/>\n"
|
||||
"Language: hi\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 4.10.1\n"
|
||||
"X-Generator: Weblate 5.4.2\n"
|
||||
|
||||
msgctxt "#30407"
|
||||
msgid "Global Lists"
|
||||
@@ -350,3 +350,371 @@ msgstr "द्वार"
|
||||
msgctxt "#30000"
|
||||
msgid "Host"
|
||||
msgstr "आतिथेय"
|
||||
|
||||
msgctxt "#30118"
|
||||
msgid "Add resume percent to names"
|
||||
msgstr "नामों में फिर शुरू करनेका प्रतिशत जोड़ें"
|
||||
|
||||
msgctxt "#30116"
|
||||
msgid "Add unwatched counts to names"
|
||||
msgstr "नामों में न देखी गई गिनती जोड़ें"
|
||||
|
||||
msgctxt "#30120"
|
||||
msgid "Show load progress"
|
||||
msgstr "लोड प्रगति दिखाएं"
|
||||
|
||||
msgctxt "#30121"
|
||||
msgid "On resume"
|
||||
msgstr "फिर से शुरू करने पर"
|
||||
|
||||
msgctxt "#30139"
|
||||
msgid "No Media Type Set"
|
||||
msgstr "कोई मीडिया प्रकार सेट नहीं"
|
||||
|
||||
msgctxt "#30183"
|
||||
msgid "Include people"
|
||||
msgstr "लोगों को शामिल करें"
|
||||
|
||||
msgctxt "#30208"
|
||||
msgid "Max stream bitrate (Kbits)"
|
||||
msgstr "अधिकतम स्ट्रीम बिटरेट (Kbps)"
|
||||
|
||||
msgctxt "#30212"
|
||||
msgid "Video max width"
|
||||
msgstr "वीडियो की अधिकतम चौड़ाई"
|
||||
|
||||
msgctxt "#30217"
|
||||
msgid "Prompt to delete episode after %"
|
||||
msgstr "% के बाद एपिसोड हटाने का संकेत"
|
||||
|
||||
msgctxt "#30219"
|
||||
msgid " - Prompt before play"
|
||||
msgstr "- खेलने से पहले संकेत दें"
|
||||
|
||||
msgctxt "#30220"
|
||||
msgid "Prompt to delete movie after %"
|
||||
msgstr "% के बाद मूवी हटाने का संकेत"
|
||||
|
||||
msgctxt "#30257"
|
||||
msgid "Movies - Recently Added"
|
||||
msgstr "फ़िल्में - हाल ही में जोड़ी गईं"
|
||||
|
||||
msgctxt "#30265"
|
||||
msgid "Episodes - Next Up"
|
||||
msgstr "एपिसोड - अगला"
|
||||
|
||||
msgctxt "#30163"
|
||||
msgid "Add (cc) if subtitle is available"
|
||||
msgstr "यदि उपशीर्षक उपलब्ध है तो (सीसी) जोड़ें"
|
||||
|
||||
msgctxt "#30182"
|
||||
msgid "Include media stream info"
|
||||
msgstr "मीडिया स्ट्रीम जानकारी शामिल करें"
|
||||
|
||||
msgctxt "#30200"
|
||||
msgid "URL error"
|
||||
msgstr "यूआरएल त्रुटि"
|
||||
|
||||
msgctxt "#30201"
|
||||
msgid "Unable to connect to server"
|
||||
msgstr "सर्वर से कनेक्ट करने में असमर्थ है"
|
||||
|
||||
msgctxt "#30206"
|
||||
msgid "Playback type"
|
||||
msgstr "प्लेबैक प्रकार"
|
||||
|
||||
msgctxt "#30207"
|
||||
msgid "Playback"
|
||||
msgstr "प्लेबैक"
|
||||
|
||||
msgctxt "#30209"
|
||||
msgid "File direct path"
|
||||
msgstr "फ़ाइल का सीधा पथ"
|
||||
|
||||
msgctxt "#30210"
|
||||
msgid "HTTP direct stream"
|
||||
msgstr "HTTP डायरेक्ट स्ट्रीम"
|
||||
|
||||
msgctxt "#30211"
|
||||
msgid "Transcode options"
|
||||
msgstr "ट्रांसकोड विकल्प"
|
||||
|
||||
msgctxt "#30213"
|
||||
msgid "Video force 8 bit"
|
||||
msgstr "वीडियो बल 8 बिट"
|
||||
|
||||
msgctxt "#30214"
|
||||
msgid "Events"
|
||||
msgstr "आयोजन"
|
||||
|
||||
msgctxt "#30215"
|
||||
msgid "On playback stop (100% = disabled)"
|
||||
msgstr "प्लेबैक स्टॉप पर (100% = अक्षम)"
|
||||
|
||||
msgctxt "#30218"
|
||||
msgid "Play next episode after %"
|
||||
msgstr "% के बाद अगला एपिसोड चलाएं"
|
||||
|
||||
msgctxt "#30222"
|
||||
msgid "Item Layout"
|
||||
msgstr "आइटम लेआउट"
|
||||
|
||||
msgctxt "#30223"
|
||||
msgid "Page Size and Filtering"
|
||||
msgstr "पृष्ठ आकार और फ़िल्टरिंग"
|
||||
|
||||
msgctxt "#30224"
|
||||
msgid "Interaction"
|
||||
msgstr "इंटरैक्शन"
|
||||
|
||||
msgctxt "#30258"
|
||||
msgid "Movies - In Progress"
|
||||
msgstr "फ़िल्में - प्रगति पर हैं"
|
||||
|
||||
msgctxt "#30126"
|
||||
msgid "Processing Item : "
|
||||
msgstr "आइटम का प्रसंस्करण:"
|
||||
|
||||
msgctxt "#30267"
|
||||
msgid " - In Progress"
|
||||
msgstr "- प्रगति पर है"
|
||||
|
||||
msgctxt "#30268"
|
||||
msgid " - Recently Added"
|
||||
msgstr "- हाल ही में जोड़ा"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "इंटरफ़ेस मोड"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "डिफ़ॉल्ट"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "सरल"
|
||||
|
||||
msgctxt "#30236"
|
||||
msgid "Force transcode h265 (hevc)"
|
||||
msgstr "फोर्स ट्रांसकोड h265 (hevc)"
|
||||
|
||||
msgctxt "#30237"
|
||||
msgid "Start from beginning"
|
||||
msgstr "शुरू से शुरू करो"
|
||||
|
||||
msgctxt "#30238"
|
||||
msgid "Playback stream options"
|
||||
msgstr "प्लेबैक स्ट्रीम विकल्प"
|
||||
|
||||
msgctxt "#30239"
|
||||
msgid "Force transcode mpeg2"
|
||||
msgstr "फोर्स ट्रांसकोड mpeg2"
|
||||
|
||||
msgctxt "#30240"
|
||||
msgid "Force transcode msmpeg4v3 (divx)"
|
||||
msgstr "फोर्स ट्रांसकोड msmpeg4v3 (divx)"
|
||||
|
||||
msgctxt "#30241"
|
||||
msgid "Force transcode mpeg4"
|
||||
msgstr "फोर्स ट्रांसकोड mpeg4"
|
||||
|
||||
msgctxt "#30247"
|
||||
msgid "Custom Widget Content"
|
||||
msgstr "कस्टम विजेट सामग्री"
|
||||
|
||||
msgctxt "#30250"
|
||||
msgid "Unknown"
|
||||
msgstr "अज्ञात"
|
||||
|
||||
msgctxt "#30251"
|
||||
msgid "Movies - Genres"
|
||||
msgstr "फ़िल्में - शैलियाँ"
|
||||
|
||||
msgctxt "#30252"
|
||||
msgid "Movies - A-Z"
|
||||
msgstr "फ़िल्में - ए-जेड"
|
||||
|
||||
msgctxt "#30254"
|
||||
msgid "Show add-on settings"
|
||||
msgstr "ऐड-ऑन सेटिंग दिखाएं"
|
||||
|
||||
msgctxt "#30255"
|
||||
msgid "TV Shows - A-Z"
|
||||
msgstr "टीवी शो - ए-जेड"
|
||||
|
||||
msgctxt "#30256"
|
||||
msgid "Movies"
|
||||
msgstr "फ़िल्म"
|
||||
|
||||
msgctxt "#30259"
|
||||
msgid "Movies - Favorites"
|
||||
msgstr "फ़िल्में - पसंदीदा"
|
||||
|
||||
msgctxt "#30260"
|
||||
msgid "BoxSets"
|
||||
msgstr "बॉक्ससेट"
|
||||
|
||||
msgctxt "#30261"
|
||||
msgid "TV Shows"
|
||||
msgstr "टीवी शो"
|
||||
|
||||
msgctxt "#30262"
|
||||
msgid "TV Shows - Favorites"
|
||||
msgstr "टीवी शो - पसंदीदा"
|
||||
|
||||
msgctxt "#30263"
|
||||
msgid "Episodes - Recently Added"
|
||||
msgstr "एपिसोड - हाल ही में जोड़े गए"
|
||||
|
||||
msgctxt "#30264"
|
||||
msgid "Episodes - In Progress"
|
||||
msgstr "एपिसोड - प्रगति पर है"
|
||||
|
||||
msgctxt "#30266"
|
||||
msgid "Movies - Pages"
|
||||
msgstr "फ़िल्में - पन्ने"
|
||||
|
||||
msgctxt "#30269"
|
||||
msgid "Movies - Random"
|
||||
msgstr "फ़िल्में - यादृच्छिक"
|
||||
|
||||
msgctxt "#30270"
|
||||
msgid "Mark Watched"
|
||||
msgstr "मार्क वॉचड"
|
||||
|
||||
msgctxt "#30271"
|
||||
msgid "Mark Unwatched"
|
||||
msgstr "मार्क अनवॉच्ड"
|
||||
|
||||
msgctxt "#30272"
|
||||
msgid "Set Favourite"
|
||||
msgstr "पसंदीदा सेट करें"
|
||||
|
||||
msgctxt "#30273"
|
||||
msgid "Unset Favourite"
|
||||
msgstr "पसंदीदा को अनसेट करें"
|
||||
|
||||
msgctxt "#30274"
|
||||
msgid "Delete"
|
||||
msgstr "मिटाना"
|
||||
|
||||
msgctxt "#30275"
|
||||
msgid "Force Transcode"
|
||||
msgstr "फोर्स ट्रांसकोड"
|
||||
|
||||
msgctxt "#30296"
|
||||
msgid "Delete"
|
||||
msgstr "मिटाना"
|
||||
|
||||
msgctxt "#30300"
|
||||
msgid "Cache all Jellyfin images as local Kodi images?"
|
||||
msgstr "सभी जेलीफ़िन छवियों को स्थानीय कोडी छवियों के रूप में कैश करें?"
|
||||
|
||||
msgctxt "#30301"
|
||||
msgid "Caching Images"
|
||||
msgstr "छवियाँ कैशिंग"
|
||||
|
||||
msgctxt "#30278"
|
||||
msgid " - Next Up"
|
||||
msgstr "- अगला"
|
||||
|
||||
msgctxt "#30302"
|
||||
msgid "Existing images : "
|
||||
msgstr "मौजूदा छवियाँ:"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "फोर्स ट्रांसकोड av1"
|
||||
|
||||
msgctxt "#30288"
|
||||
msgid " - Latest"
|
||||
msgstr "- नवीनतम"
|
||||
|
||||
msgctxt "#30289"
|
||||
msgid "TV Shows - Genres"
|
||||
msgstr "टीवी शो - शैलियाँ"
|
||||
|
||||
msgctxt "#30297"
|
||||
msgid "Delete unused images?"
|
||||
msgstr "अप्रयुक्त छवियाँ हटाएँ?"
|
||||
|
||||
msgctxt "#30298"
|
||||
msgid "Deleting Kodi Images"
|
||||
msgstr "कोडी छवियाँ हटाना"
|
||||
|
||||
msgctxt "#30299"
|
||||
msgid "Cache Images"
|
||||
msgstr "कैश छवियाँ"
|
||||
|
||||
msgctxt "#30303"
|
||||
msgid "Missing Jellyfin images : "
|
||||
msgstr "गुम जेलीफ़िन छवियाँ:"
|
||||
|
||||
msgctxt "#30279"
|
||||
msgid "TV Shows - Unwatched"
|
||||
msgstr "टीवी शो - नहीं देखे गए"
|
||||
|
||||
msgctxt "#30280"
|
||||
msgid "Missing Title"
|
||||
msgstr "गुम शीर्षक"
|
||||
|
||||
msgctxt "#30282"
|
||||
msgid "No Jellyfin servers detected on your local network."
|
||||
msgstr "आपके स्थानीय नेटवर्क पर कोई जेलीफ़िन सर्वर नहीं पाया गया।"
|
||||
|
||||
msgctxt "#30283"
|
||||
msgid "Play Next Episode?"
|
||||
msgstr "अगला एपिसोड खेलें?"
|
||||
|
||||
msgctxt "#30281"
|
||||
msgid "Refresh Cached Images"
|
||||
msgstr "कैश्ड छवियाँ ताज़ा करें"
|
||||
|
||||
msgctxt "#30285"
|
||||
msgid " - Unwatched"
|
||||
msgstr "- न देखा गया"
|
||||
|
||||
msgctxt "#30286"
|
||||
msgid "Movies - Unwatched"
|
||||
msgstr "फिल्में - नहीं देखी गईं"
|
||||
|
||||
msgctxt "#30287"
|
||||
msgid "TV Shows - Latest"
|
||||
msgstr "टीवी शो - नवीनतम"
|
||||
|
||||
msgctxt "#30294"
|
||||
msgid "Notice"
|
||||
msgstr "सूचना"
|
||||
|
||||
msgctxt "#30295"
|
||||
msgid "To use this feature you need HTTP control enabled"
|
||||
msgstr "इस सुविधा का उपयोग करने के लिए आपको HTTP नियंत्रण सक्षम करना होगा"
|
||||
|
||||
msgctxt "#30290"
|
||||
msgid "All"
|
||||
msgstr "सभी"
|
||||
|
||||
msgctxt "#30291"
|
||||
msgid "Select Audio Stream"
|
||||
msgstr "ऑडियो स्ट्रीम चुनें"
|
||||
|
||||
msgctxt "#30292"
|
||||
msgid "Select Subtitle Stream"
|
||||
msgstr "उपशीर्षक स्ट्रीम का चयन करें"
|
||||
|
||||
msgctxt "#30293"
|
||||
msgid "Cache images"
|
||||
msgstr "कैश छवियाँ"
|
||||
|
||||
msgctxt "#30304"
|
||||
msgid "Cached Jellyfin images : "
|
||||
msgstr "कैश्ड जेलीफ़िन छवियाँ:"
|
||||
|
||||
msgctxt "#30305"
|
||||
msgid "Not Found"
|
||||
msgstr "नहीं मिला"
|
||||
|
||||
msgctxt "#30306"
|
||||
msgid "Playback starting"
|
||||
msgstr "प्लेबैक प्रारंभ हो रहा है"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-01-10 05:51+0000\n"
|
||||
"Last-Translator: Csaba <csab0825@gmail.com>\n"
|
||||
"PO-Revision-Date: 2026-01-04 21:05+0000\n"
|
||||
"Last-Translator: Levente Suli <suli.levente.07@icloud.com>\n"
|
||||
"Language-Team: Hungarian <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/hu/>\n"
|
||||
"Language: hu\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
msgctxt "#30441"
|
||||
msgid "Use cached widget data"
|
||||
@@ -1086,7 +1086,7 @@ msgstr "Port"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Host"
|
||||
msgstr "Hoszt"
|
||||
msgstr "Gazdagép"
|
||||
|
||||
msgctxt "#30444"
|
||||
msgid "Login using Quick Connect"
|
||||
@@ -1123,3 +1123,107 @@ msgstr "Lejátszási sor maximális mérete"
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Instant keverés"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Alapértelmezett"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Interfész mód"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Egyszerű"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "av1 transzkódolás kényszerítése"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "A Következő Újrajátszása"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Újrajátszási Napok (0=Kikapcsolva)"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Egyesítés csere helyett (lassulást okozhat)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Elemek számának rejtése a cím mellett"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " Megnézetlen"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Teendő"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Kezdési eltérés (másodpercben)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Befejezési késleltetés"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Intróátugró"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Részlet átugró"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Stáblistaátugró"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Átugrás"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Ne csináljon semmit"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Reklámátugró"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Előnézet átugró"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Kérdezz"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Összefoglaló átugró"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "TV Műsorok - Véletlenszerű"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "Összes - Véletlenszerű"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Összes - Nemrég hozzáadott"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "Összes - Kedvencek"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "TV Műsorok oldalanként"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-02-15 10:39+0000\n"
|
||||
"Last-Translator: Imamuzzaki Abu Salam <imamuzzaki@gmail.com>\n"
|
||||
"PO-Revision-Date: 2026-01-05 12:25+0000\n"
|
||||
"Last-Translator: daryhanif <daryhanif00@gmail.com>\n"
|
||||
"Language-Team: Indonesian <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/id/>\n"
|
||||
"Language: id\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
msgctxt "#30414"
|
||||
msgid " - Favorites"
|
||||
@@ -1122,3 +1122,92 @@ msgstr "Terjadi kesalahan saat masuk"
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Campuran Instan"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Paksa transkode av1"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Jeda Tonton Ulang (0 = Nonaktif)"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Gabungkan, bukan Gantikan (berisiko memperlambat)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Sembunyikan Jumlah Item di Judul"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - Belum Pernah Ditonton"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Tampilkan Tontonan Ulang"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Mode Antarmuka"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Baku"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Simpel"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Lewatkan Segmen"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Aksi yang diambil"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Mulai Offset(detik)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Akhir Offset(detik)"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Lewatkan intro"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Lewatkan Credit"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Tanya"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Tidak Ada"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Melewatkan iklan"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Melewatkan Cuplikan"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Lewatkan"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Lewati Rekap"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Semua - Baru-Baru ini ditambahkan"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2022-10-21 02:50+0000\n"
|
||||
"Last-Translator: Angus Fraser <angusmglfraser@yahoo.co.uk>\n"
|
||||
"PO-Revision-Date: 2026-01-02 12:03+0000\n"
|
||||
"Last-Translator: ittelicra <alexarciletti10@gmail.com>\n"
|
||||
"Language-Team: Italian <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/it/>\n"
|
||||
"Language: it\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
msgctxt "#30120"
|
||||
msgid "Show load progress"
|
||||
@@ -49,7 +49,7 @@ msgstr "Attenzione: questa operazione eliminerà i file multimediali dal server.
|
||||
|
||||
msgctxt "#30091"
|
||||
msgid "Confirm delete?"
|
||||
msgstr "Confermi l'eliminazione?"
|
||||
msgstr "Confermare l'eliminazione?"
|
||||
|
||||
msgctxt "#30063"
|
||||
msgid "N/A"
|
||||
@@ -73,7 +73,7 @@ msgstr "Nome utente/Password errati"
|
||||
|
||||
msgctxt "#30027"
|
||||
msgid "Enable debug logging"
|
||||
msgstr "Attiva log a debug"
|
||||
msgstr "Attiva log di debug"
|
||||
|
||||
msgctxt "#30026"
|
||||
msgid "Widget item select action"
|
||||
@@ -89,7 +89,7 @@ msgstr "Nome utente:"
|
||||
|
||||
msgctxt "#30023"
|
||||
msgid "Hide unwatched episode details"
|
||||
msgstr "Nascondi dettagli episodi non guardati"
|
||||
msgstr "Nascondi i dettagli degli episodi non guardati"
|
||||
|
||||
msgctxt "#30022"
|
||||
msgid "Advanced"
|
||||
@@ -385,7 +385,7 @@ msgstr "Disposizione elemento"
|
||||
|
||||
msgctxt "#30220"
|
||||
msgid "Prompt to delete movie after %"
|
||||
msgstr "Chiedi se eliminare il film dopo %"
|
||||
msgstr "Chiedi di eliminare il film dopo %"
|
||||
|
||||
msgctxt "#30219"
|
||||
msgid " - Prompt before play"
|
||||
@@ -397,7 +397,7 @@ msgstr "Riproduci il prossimo episodio dopo %"
|
||||
|
||||
msgctxt "#30217"
|
||||
msgid "Prompt to delete episode after %"
|
||||
msgstr "Chiedi se eliminare l'episodio dopo %"
|
||||
msgstr "Chiedi di eliminare l'episodio dopo %"
|
||||
|
||||
msgctxt "#30216"
|
||||
msgid "Item Details"
|
||||
@@ -466,7 +466,6 @@ msgctxt "#30323"
|
||||
msgid "Artists"
|
||||
msgstr "Artisti"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "#30311"
|
||||
msgid "Library - "
|
||||
msgstr "Libreria -"
|
||||
@@ -519,7 +518,6 @@ msgctxt "#30290"
|
||||
msgid "All"
|
||||
msgstr "Tutti"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "#30291"
|
||||
msgid "Select Audio Stream"
|
||||
msgstr "Seleziona fonte audio"
|
||||
@@ -567,3 +565,660 @@ msgstr "Ripresa automatica"
|
||||
msgctxt "#30328"
|
||||
msgid "Show empty folders (shows, seasons, collections)"
|
||||
msgstr "Mostra cartelle vuote (serie, stagioni, collezioni)"
|
||||
|
||||
msgctxt "#30285"
|
||||
msgid " - Unwatched"
|
||||
msgstr "- Non visto"
|
||||
|
||||
msgctxt "#30303"
|
||||
msgid "Missing Jellyfin images : "
|
||||
msgstr "Immagini mancanti di Jellyfin:"
|
||||
|
||||
msgctxt "#30330"
|
||||
msgid "Show change user dialog"
|
||||
msgstr "Mostra la finestra di cambio utente"
|
||||
|
||||
msgctxt "#30332"
|
||||
msgid "Stop media playback on screensaver activation"
|
||||
msgstr ""
|
||||
"Interrompi la riproduzione multimediale all'attivazione dello screensaver"
|
||||
|
||||
msgctxt "#30338"
|
||||
msgid "Album"
|
||||
msgstr "Album"
|
||||
|
||||
msgctxt "#30340"
|
||||
msgid "Group movies into collections"
|
||||
msgstr "Raggruppa film in collezioni"
|
||||
|
||||
msgctxt "#30281"
|
||||
msgid "Refresh Cached Images"
|
||||
msgstr "Aggiorna immagine in cache"
|
||||
|
||||
msgctxt "#30292"
|
||||
msgid "Select Subtitle Stream"
|
||||
msgstr "Seleziona fonte sottotitoli"
|
||||
|
||||
msgctxt "#30293"
|
||||
msgid "Cache images"
|
||||
msgstr "Memorizza in cache immagini"
|
||||
|
||||
msgctxt "#30310"
|
||||
msgid "Enable Jellyfin remote control"
|
||||
msgstr "Abilitare il controllo remoto di Jellyfin"
|
||||
|
||||
msgctxt "#30317"
|
||||
msgid "Play All"
|
||||
msgstr "Riproduci tutto"
|
||||
|
||||
msgctxt "#30283"
|
||||
msgid "Play Next Episode?"
|
||||
msgstr "Riprodurre episodio successivo?"
|
||||
|
||||
msgctxt "#30295"
|
||||
msgid "To use this feature you need HTTP control enabled"
|
||||
msgstr "Per poter utilizzare questa funzione devi abilitare il controllo HTTP"
|
||||
|
||||
msgctxt "#30298"
|
||||
msgid "Deleting Kodi Images"
|
||||
msgstr "Eliminazione immagini di Kodi"
|
||||
|
||||
msgctxt "#30302"
|
||||
msgid "Existing images : "
|
||||
msgstr "Immagini presenti:"
|
||||
|
||||
msgctxt "#30309"
|
||||
msgid "Select Media Source"
|
||||
msgstr "Seleziona sorgente multimediale"
|
||||
|
||||
msgctxt "#30315"
|
||||
msgid "Suppress notifications for connection errors"
|
||||
msgstr "Elimina le notifiche per gli errori di connessione"
|
||||
|
||||
msgctxt "#30344"
|
||||
msgid "Number of images removed from cache"
|
||||
msgstr "Numero di immagini rimosse dalla cache"
|
||||
|
||||
msgctxt "#30304"
|
||||
msgid "Cached Jellyfin images : "
|
||||
msgstr "Immagini Jellyfin salvate nella cache:"
|
||||
|
||||
msgctxt "#30334"
|
||||
msgid "Use JellyCon context menu"
|
||||
msgstr "Usa menu contestuale di JellyCon"
|
||||
|
||||
msgctxt "#30346"
|
||||
msgid "Deleteing Cached Images"
|
||||
msgstr "Eliminazione immagini salvate nella cache"
|
||||
|
||||
msgctxt "#30347"
|
||||
msgid "Getting Existing Images"
|
||||
msgstr "Recupero immagini esistenti"
|
||||
|
||||
msgctxt "#30343"
|
||||
msgid "Changes Require Kodi Restart"
|
||||
msgstr "Le modifiche richiedono il riavvio di Kodi"
|
||||
|
||||
msgctxt "#30339"
|
||||
msgid "Person"
|
||||
msgstr "Persona"
|
||||
|
||||
msgctxt "#30294"
|
||||
msgid "Notice"
|
||||
msgstr "Avviso"
|
||||
|
||||
msgctxt "#30299"
|
||||
msgid "Cache Images"
|
||||
msgstr "Memorizza in cache le immagini"
|
||||
|
||||
msgctxt "#30300"
|
||||
msgid "Cache all Jellyfin images as local Kodi images?"
|
||||
msgstr "Memorizzare tutte le immagini Jellyfin come immagini locali Kodi?"
|
||||
|
||||
msgctxt "#30414"
|
||||
msgid " - Favorites"
|
||||
msgstr "- Preferiti"
|
||||
|
||||
msgctxt "#30333"
|
||||
msgid "Cache artwork in the background"
|
||||
msgstr "Memorizza artwork in background"
|
||||
|
||||
msgctxt "#30349"
|
||||
msgid " - Recently Played"
|
||||
msgstr "- Riprodotti di recente"
|
||||
|
||||
msgctxt "#30350"
|
||||
msgid "Music - Recently Added"
|
||||
msgstr "Musica - Aggiunta di recente"
|
||||
|
||||
msgctxt "#30352"
|
||||
msgid "Music - Frequently Played"
|
||||
msgstr "Musica - Ascoltata frequentemente"
|
||||
|
||||
msgctxt "#30319"
|
||||
msgid "Music - All Album Artists"
|
||||
msgstr "Musica - Artisti dell'album"
|
||||
|
||||
msgctxt "#30354"
|
||||
msgid "Go To Series"
|
||||
msgstr "Vai alle Serie"
|
||||
|
||||
msgctxt "#30355"
|
||||
msgid "Kodi Settings->Services->Allow remote control via HTTP"
|
||||
msgstr "Impostazioni di Kodi -> Servizi -> Consenti controllo remoto via HTTP"
|
||||
|
||||
msgctxt "#30360"
|
||||
msgid " - Channels"
|
||||
msgstr "- Canali"
|
||||
|
||||
msgctxt "#30361"
|
||||
msgid " - Programs"
|
||||
msgstr "- Programmi"
|
||||
|
||||
msgctxt "#30362"
|
||||
msgid " - Recordings"
|
||||
msgstr "- Registrazioni"
|
||||
|
||||
msgctxt "#30366"
|
||||
msgid "Manually enter user details"
|
||||
msgstr "Inserisci manualmente i dettagli dell'utente"
|
||||
|
||||
msgctxt "#30375"
|
||||
msgid "Receiving data packet"
|
||||
msgstr "Ottengo i pacchetti"
|
||||
|
||||
msgctxt "#30377"
|
||||
msgid "Sending request"
|
||||
msgstr "Invio la richiesta"
|
||||
|
||||
msgctxt "#30380"
|
||||
msgid "Never"
|
||||
msgstr "Mai"
|
||||
|
||||
msgctxt "#30381"
|
||||
msgid "More than one"
|
||||
msgstr "Più di uno"
|
||||
|
||||
msgctxt "#30382"
|
||||
msgid "Always"
|
||||
msgstr "Sempre"
|
||||
|
||||
msgctxt "#30383"
|
||||
msgid "System - "
|
||||
msgstr "Sistema -"
|
||||
|
||||
msgctxt "#30390"
|
||||
msgid "Protocol"
|
||||
msgstr "Protocollo"
|
||||
|
||||
msgctxt "#30391"
|
||||
msgid "HTTP"
|
||||
msgstr "HTTP"
|
||||
|
||||
msgctxt "#30392"
|
||||
msgid "HTTPS"
|
||||
msgstr "HTTPS"
|
||||
|
||||
msgctxt "#30397"
|
||||
msgid " - Pages"
|
||||
msgstr "- Pagine"
|
||||
|
||||
msgctxt "#30402"
|
||||
msgid "Add to Kodi Playlist"
|
||||
msgstr "Aggiungi alla playlist di Kodi"
|
||||
|
||||
msgctxt "#30405"
|
||||
msgid " - Show All"
|
||||
msgstr "- Mostra tutto"
|
||||
|
||||
msgctxt "#30408"
|
||||
msgid "Custom Widgets"
|
||||
msgstr "Widget Personalizzati"
|
||||
|
||||
msgctxt "#30409"
|
||||
msgid "Add-on Actions"
|
||||
msgstr "Azioni Add-on"
|
||||
|
||||
msgctxt "#30410"
|
||||
msgid " - Collections"
|
||||
msgstr "- Collezioni"
|
||||
|
||||
msgctxt "#30411"
|
||||
msgid " - Years"
|
||||
msgstr "- Anni"
|
||||
|
||||
msgctxt "#30413"
|
||||
msgid " - Tags"
|
||||
msgstr "- Tags"
|
||||
|
||||
msgctxt "#30415"
|
||||
msgid " - Favorite Collections"
|
||||
msgstr "- Collezioni Preferite"
|
||||
|
||||
msgctxt "#30418"
|
||||
msgid "Audio bitrate (Kbits)"
|
||||
msgstr "Bitrate dell'Audio (Kbps)"
|
||||
|
||||
msgctxt "#30419"
|
||||
msgid "Audio codec"
|
||||
msgstr "Codifica dell'Audio"
|
||||
|
||||
msgctxt "#30420"
|
||||
msgid "Audio max channels"
|
||||
msgstr "Canali massimi dell'audio"
|
||||
|
||||
msgctxt "#30421"
|
||||
msgid "Views"
|
||||
msgstr "Visualizzazioni"
|
||||
|
||||
msgctxt "#30422"
|
||||
msgid "Sorting"
|
||||
msgstr "Ordina"
|
||||
|
||||
msgctxt "#30424"
|
||||
msgid "Default"
|
||||
msgstr "Predefinito"
|
||||
|
||||
msgctxt "#30425"
|
||||
msgid "Year"
|
||||
msgstr "Anno"
|
||||
|
||||
msgctxt "#30301"
|
||||
msgid "Caching Images"
|
||||
msgstr "Memorizzando le immagini"
|
||||
|
||||
msgctxt "#30359"
|
||||
msgid "Building full image list"
|
||||
msgstr "Compongo la lista completa delle immagini"
|
||||
|
||||
msgctxt "#30363"
|
||||
msgid "Save Password?"
|
||||
msgstr "Salvare la Password?"
|
||||
|
||||
msgctxt "#30364"
|
||||
msgid "Do you want to save the password?"
|
||||
msgstr "Vuoi salvare la Password?"
|
||||
|
||||
msgctxt "#30368"
|
||||
msgid "Clear Password?"
|
||||
msgstr "Cancellare la Password?"
|
||||
|
||||
msgctxt "#30371"
|
||||
msgid "Could not connect to the URL you entered, do you want to try again?"
|
||||
msgstr "Non è stato possibile connettersi con l'URL fornito, vuoi riprovare?"
|
||||
|
||||
msgctxt "#30372"
|
||||
msgid "Server URL"
|
||||
msgstr "URL del Server"
|
||||
|
||||
msgctxt "#30373"
|
||||
msgid "Scanning for local servers"
|
||||
msgstr "Scansione di server locali"
|
||||
|
||||
msgctxt "#30388"
|
||||
msgid "Server details"
|
||||
msgstr "Dettagli del server"
|
||||
|
||||
msgctxt "#30394"
|
||||
msgid "Cache files deleted"
|
||||
msgstr "File di cache eliminati"
|
||||
|
||||
msgctxt "#30395"
|
||||
msgid "Clear cached server data"
|
||||
msgstr "Elimina la cache del server"
|
||||
|
||||
msgctxt "#30398"
|
||||
msgid "Refresh Jellyfin Metadata"
|
||||
msgstr "Aggiorna i metadati di Jellyfin"
|
||||
|
||||
msgctxt "#30399"
|
||||
msgid "Hide"
|
||||
msgstr "Nascondi"
|
||||
|
||||
msgctxt "#30401"
|
||||
msgid "Info"
|
||||
msgstr "Informazioni"
|
||||
|
||||
msgctxt "#30406"
|
||||
msgid "Jellyfin Libraries"
|
||||
msgstr "Librerie Jellyfin"
|
||||
|
||||
msgctxt "#30407"
|
||||
msgid "Global Lists"
|
||||
msgstr "Lista Globale"
|
||||
|
||||
msgctxt "#30416"
|
||||
msgid "HTTP timeout seconds"
|
||||
msgstr "HTTP timeout secondi"
|
||||
|
||||
msgctxt "#30417"
|
||||
msgid "You do not have permision to delete this item"
|
||||
msgstr "Non hai il permetto di eliminare questo elemento"
|
||||
|
||||
msgctxt "#30426"
|
||||
msgid "Title"
|
||||
msgstr "Titolo"
|
||||
|
||||
msgctxt "#30427"
|
||||
msgid "Added"
|
||||
msgstr "Aggiunto"
|
||||
|
||||
msgctxt "#30428"
|
||||
msgid "Rating"
|
||||
msgstr "Valutazione"
|
||||
|
||||
msgctxt "#30429"
|
||||
msgid "Genre"
|
||||
msgstr "Genere"
|
||||
|
||||
msgctxt "#30430"
|
||||
msgid "Label"
|
||||
msgstr "Etichetta"
|
||||
|
||||
msgctxt "#30431"
|
||||
msgid "Seasons"
|
||||
msgstr "Stagioni"
|
||||
|
||||
msgctxt "#30432"
|
||||
msgid "Hide watched items in lists"
|
||||
msgstr "Nascondi gli elementi già visti dalla lista"
|
||||
|
||||
msgctxt "#30433"
|
||||
msgid "Allow direct file playback"
|
||||
msgstr "Consenti la riproduzione diretta del file"
|
||||
|
||||
msgctxt "#30341"
|
||||
msgid "Background image update interval (0 = disabled)"
|
||||
msgstr "Intervallo di aggiornamento dell'immagine di sfondo (0 = disabilitato)"
|
||||
|
||||
msgctxt "#30348"
|
||||
msgid "Add user ratings"
|
||||
msgstr "Aggiungi valutazioni dell'utente"
|
||||
|
||||
msgctxt "#30351"
|
||||
msgid "Music - Recently Played"
|
||||
msgstr "Musica - Ascoltata di recente"
|
||||
|
||||
msgctxt "#30321"
|
||||
msgid " - Album Artists"
|
||||
msgstr "- Artisti dell'album"
|
||||
|
||||
msgctxt "#30353"
|
||||
msgid " - Frequently Played"
|
||||
msgstr "- Riprodotto frequentemente"
|
||||
|
||||
msgctxt "#30358"
|
||||
msgid "Retreiving remote image list"
|
||||
msgstr "Ottengo lista immagini remota"
|
||||
|
||||
msgctxt "#30365"
|
||||
msgid "Manual Login"
|
||||
msgstr "Accesso Manuale"
|
||||
|
||||
msgctxt "#30369"
|
||||
msgid "Do you want to clear your saved password?"
|
||||
msgstr "Vuoi eliminare le tue password salvate?"
|
||||
|
||||
msgctxt "#30370"
|
||||
msgid "Do you want to manually enter a server url?"
|
||||
msgstr "Vuoi inserire manualmente l'URL del server?"
|
||||
|
||||
msgctxt "#30374"
|
||||
msgid "Sending request"
|
||||
msgstr "Invio la richiesta"
|
||||
|
||||
msgctxt "#30376"
|
||||
msgid "Checking server url"
|
||||
msgstr "Controllo l'URL del server"
|
||||
|
||||
msgctxt "#30378"
|
||||
msgid "Persist user details"
|
||||
msgstr "Conserva i dettagli dell'utente"
|
||||
|
||||
msgctxt "#30389"
|
||||
msgid "User details"
|
||||
msgstr "Dettagli dell'utente"
|
||||
|
||||
msgctxt "#30403"
|
||||
msgid "Movies - Recommendations"
|
||||
msgstr "Film - Consigliati"
|
||||
|
||||
msgctxt "#30404"
|
||||
msgid " - A-Z"
|
||||
msgstr "- A-Z"
|
||||
|
||||
msgctxt "#30412"
|
||||
msgid " - Decades"
|
||||
msgstr "- Decenni"
|
||||
|
||||
msgctxt "#30423"
|
||||
msgid "NotSet"
|
||||
msgstr "Non impostato"
|
||||
|
||||
msgctxt "#30446"
|
||||
msgid "There was an error logging in"
|
||||
msgstr "Si è verificato un errore durante l'accesso"
|
||||
|
||||
msgctxt "#30443"
|
||||
msgid "Quick Connect"
|
||||
msgstr "Connessione rapida"
|
||||
|
||||
msgctxt "#30445"
|
||||
msgid "Continue Watching"
|
||||
msgstr "Continua a guardare"
|
||||
|
||||
msgctxt "#30448"
|
||||
msgid "Shuffle"
|
||||
msgstr "Casuale"
|
||||
|
||||
msgctxt "#30447"
|
||||
msgid "Max Play Queue Size"
|
||||
msgstr "Dimensione massima della coda di riproduzione"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Forza transcodifica AV1"
|
||||
|
||||
msgctxt "#30356"
|
||||
msgid "Loading existing image list"
|
||||
msgstr "Caricamento lista di immagini esistenti"
|
||||
|
||||
msgctxt "#30384"
|
||||
msgid "Random movies interval minutes (0 = disabled)"
|
||||
msgstr "Intervallo, in minuti, di film casuali (0 = disabilitato)"
|
||||
|
||||
msgctxt "#30385"
|
||||
msgid "Existing images before delete : "
|
||||
msgstr "Immagini esistenti prima della cancellazione:"
|
||||
|
||||
msgctxt "#30386"
|
||||
msgid "Unused Jellyfin images : "
|
||||
msgstr "Immagini Jellyfin inutilizzate:"
|
||||
|
||||
msgctxt "#30387"
|
||||
msgid "Unused images removed : "
|
||||
msgstr "Immagini inutilizzate rimosse:"
|
||||
|
||||
msgctxt "#30393"
|
||||
msgid "Clear Cache Result"
|
||||
msgstr "Cancella la cache dei risultati"
|
||||
|
||||
msgctxt "#30440"
|
||||
msgid "Play next"
|
||||
msgstr "Riproduci prossimo"
|
||||
|
||||
msgctxt "#30441"
|
||||
msgid "Use cached widget data"
|
||||
msgstr "Utilizza dati widget nella cache"
|
||||
|
||||
msgctxt "#30444"
|
||||
msgid "Login using Quick Connect"
|
||||
msgstr "Accedi usando Connessione Rapida"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Combina invece di sostituire (può causare rallentamenti)"
|
||||
|
||||
msgctxt "#30342"
|
||||
msgid "New content check interval (0 = disabled)"
|
||||
msgstr "Intervallo di verifica di nuovi contenuti (0 = disabilitato)"
|
||||
|
||||
msgctxt "#30357"
|
||||
msgid "Processing existing image list"
|
||||
msgstr "Analizzando la lista di immagini esistenti"
|
||||
|
||||
msgctxt "#30400"
|
||||
msgid "Cache images interval minutes (0 = disabled)"
|
||||
msgstr "Intervallo, in minuti, della cache delle immagini (0 = disabilitato)"
|
||||
|
||||
msgctxt "#30435"
|
||||
msgid "Connection speed test"
|
||||
msgstr "Test di velocità della connessione"
|
||||
|
||||
msgctxt "#30436"
|
||||
msgid "Speed test data size (MB)"
|
||||
msgstr "Dimensioni dati per il test di velocità (MB)"
|
||||
|
||||
msgctxt "#30437"
|
||||
msgid "Playback options"
|
||||
msgstr "Opzioni di riproduzione"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Modalità interfaccia"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Predefinito"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Semplice"
|
||||
|
||||
msgctxt "#30121"
|
||||
msgid "On resume"
|
||||
msgstr "Riprendi"
|
||||
|
||||
msgctxt "#30442"
|
||||
msgid "Simple new content check"
|
||||
msgstr "Ricerca semplice dei nuovi contenuti"
|
||||
|
||||
msgctxt "#30215"
|
||||
msgid "On playback stop (100% = disabled)"
|
||||
msgstr "A riproduzione ferma (100% = disabilitato)"
|
||||
|
||||
msgctxt "#30379"
|
||||
msgid "External subtitle prompt"
|
||||
msgstr "Prompt sottotitolo esterno"
|
||||
|
||||
msgctxt "#30434"
|
||||
msgid "Force transcode stream bitrate (Kbits)"
|
||||
msgstr "Forza transcodifica del bitrate dello stream (Kbps)"
|
||||
|
||||
msgctxt "#30345"
|
||||
msgid "Cache Jellyfin server data requests"
|
||||
msgstr "Stiva dati richieste del server Jellyfin"
|
||||
|
||||
msgctxt "#30439"
|
||||
msgid "Show play next episode at time left in seconds"
|
||||
msgstr "Mostra riproduci il prossimo episodio a tempo rimasto in secondi"
|
||||
|
||||
msgctxt "#30367"
|
||||
msgid "Allow fast user switching password saving"
|
||||
msgstr "Consenti salvataggio veloce della password utente cambiata"
|
||||
|
||||
msgctxt "#30438"
|
||||
msgid "Play cinema intros"
|
||||
msgstr "Riproduci introduzioni cinema"
|
||||
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Mix Istantaneo"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Giorni per tornare a Guardare (0 = Disabilitato)"
|
||||
|
||||
msgctxt "#30276"
|
||||
msgid "Extra Resume Prompt Detected"
|
||||
msgstr "Finestra di Ripresa Duplicata Rilevata"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Prossimo da Ri-Guardare"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Salta"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Chiedi"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Non fare niente"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Nascondi numero di elementi da mostrare per titolo"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - Non Visto"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Offset all'avvio (secondi)"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Salta Segmento"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Azione da eseguire"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Offset alla fine (secondi)"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Salta Intro"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Salta Crediti"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Salta Pubblicità"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Salta Anteprima"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Salta Riassunto"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "#30455"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "Tutti - Casuale"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Tutti - Aggiunti di recente"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "Tutti - Preferiti"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "Serie TV per pagina"
|
||||
|
||||
770
resources/language/resource.language.ja/strings.po
Normal file
770
resources/language/resource.language.ja/strings.po
Normal file
@@ -0,0 +1,770 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2025-09-23 16:39+0000\n"
|
||||
"Last-Translator: S H <translate@hayakawa.work>\n"
|
||||
"Language-Team: Japanese <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/ja/>\n"
|
||||
"Language: ja\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
msgctxt "#30112"
|
||||
msgid "Loading Content"
|
||||
msgstr "コンテンツをロード中"
|
||||
|
||||
msgctxt "#30008"
|
||||
msgid "Samba password"
|
||||
msgstr "Samba パスワード"
|
||||
|
||||
msgctxt "#30016"
|
||||
msgid "Device display name"
|
||||
msgstr "デバイスディスプレイ名"
|
||||
|
||||
msgctxt "#30021"
|
||||
msgid "Show all episodes item"
|
||||
msgstr "全てのエピソードを見る"
|
||||
|
||||
msgctxt "#30044"
|
||||
msgid "Incorrect Username/Password"
|
||||
msgstr "誤ったユーザー名もしくはパスワード"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Host"
|
||||
msgstr "ホスト"
|
||||
|
||||
msgctxt "#30001"
|
||||
msgid "Port"
|
||||
msgstr "ポート"
|
||||
|
||||
msgctxt "#30003"
|
||||
msgid "Verify HTTPS certificate"
|
||||
msgstr "HTTPS証明書を検証"
|
||||
|
||||
msgctxt "#30005"
|
||||
msgid "Username"
|
||||
msgstr "ユーザー名"
|
||||
|
||||
msgctxt "#30006"
|
||||
msgid "Password"
|
||||
msgstr "パスワード"
|
||||
|
||||
msgctxt "#30007"
|
||||
msgid "Samba username"
|
||||
msgstr "Samba ユーザー名"
|
||||
|
||||
msgctxt "#30010"
|
||||
msgid "Number of performance profiles to capture"
|
||||
msgstr "キャプチャするパフォーマンスプロファイルの数"
|
||||
|
||||
msgctxt "#30011"
|
||||
msgid "[Detect local server]"
|
||||
msgstr "[ローカルサーバーを検出]"
|
||||
|
||||
msgctxt "#30012"
|
||||
msgid "[Change user]"
|
||||
msgstr "[ユーザーを変更]"
|
||||
|
||||
msgctxt "#30014"
|
||||
msgid "Jellyfin"
|
||||
msgstr "Jellyfin"
|
||||
|
||||
msgctxt "#30015"
|
||||
msgid "Log timing data"
|
||||
msgstr "ログタイミングデータ"
|
||||
|
||||
msgctxt "#30017"
|
||||
msgid "Show connected clients"
|
||||
msgstr "接続されたクライアントを表示"
|
||||
|
||||
msgctxt "#30018"
|
||||
msgid "Number of items to show in filtered lists"
|
||||
msgstr "フィルターされたリストに表示するアイテムの数"
|
||||
|
||||
msgctxt "#30019"
|
||||
msgid "Filtered episode name format"
|
||||
msgstr "フィルターされたエピソードの名前フォーマット"
|
||||
|
||||
msgctxt "#30022"
|
||||
msgid "Advanced"
|
||||
msgstr "高度"
|
||||
|
||||
msgctxt "#30023"
|
||||
msgid "Hide unwatched episode details"
|
||||
msgstr "観ていないエピソードの詳細を隠す"
|
||||
|
||||
msgctxt "#30024"
|
||||
msgid "Username:"
|
||||
msgstr "ユーザー名:"
|
||||
|
||||
msgctxt "#30025"
|
||||
msgid "Password:"
|
||||
msgstr "パスワード:"
|
||||
|
||||
msgctxt "#30027"
|
||||
msgid "Enable debug logging"
|
||||
msgstr "デバッグロギングを有効化"
|
||||
|
||||
msgctxt "#30045"
|
||||
msgid "Username not found"
|
||||
msgstr "ユーザー名が見つからない"
|
||||
|
||||
msgctxt "#30052"
|
||||
msgid "Deleting"
|
||||
msgstr "削除中"
|
||||
|
||||
msgctxt "#30053"
|
||||
msgid "Waiting for server to delete"
|
||||
msgstr "サーバーが削除するのを待機中"
|
||||
|
||||
msgctxt "#30091"
|
||||
msgid "Confirm delete?"
|
||||
msgstr "削除しますか?"
|
||||
|
||||
msgctxt "#30092"
|
||||
msgid "Warning: This action will delete the media files from the server."
|
||||
msgstr "警告: この操作はサーバーからメディアファイルを削除します。"
|
||||
|
||||
msgctxt "#30110"
|
||||
msgid "Interface"
|
||||
msgstr "インターフェース"
|
||||
|
||||
msgctxt "#30111"
|
||||
msgid "Services"
|
||||
msgstr "サービス"
|
||||
|
||||
msgctxt "#30113"
|
||||
msgid "Retrieving Data"
|
||||
msgstr "データを取得中"
|
||||
|
||||
msgctxt "#30222"
|
||||
msgid "Item Layout"
|
||||
msgstr "アイテムレイアウト"
|
||||
|
||||
msgctxt "#30224"
|
||||
msgid "Interaction"
|
||||
msgstr "インタラクション"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "インターフェースモード"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "既定"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "シンプル"
|
||||
|
||||
msgctxt "#30229"
|
||||
msgid "TV Shows"
|
||||
msgstr "TV番組"
|
||||
|
||||
msgctxt "#30231"
|
||||
msgid "Movies"
|
||||
msgstr "映画"
|
||||
|
||||
msgctxt "#30235"
|
||||
msgid "Episodes"
|
||||
msgstr "エピソード"
|
||||
|
||||
msgctxt "#30237"
|
||||
msgid "Start from beginning"
|
||||
msgstr "最初から始める"
|
||||
|
||||
msgctxt "#30239"
|
||||
msgid "Force transcode mpeg2"
|
||||
msgstr "mpeg2でのトランスコードを強制する"
|
||||
|
||||
msgctxt "#30241"
|
||||
msgid "Force transcode mpeg4"
|
||||
msgstr "mpeg4でのトランスコードを強制する"
|
||||
|
||||
msgctxt "#30246"
|
||||
msgid "Search"
|
||||
msgstr "検索"
|
||||
|
||||
msgctxt "#30250"
|
||||
msgid "Unknown"
|
||||
msgstr "不明"
|
||||
|
||||
msgctxt "#30252"
|
||||
msgid "Movies - A-Z"
|
||||
msgstr "映画 - A-Z"
|
||||
|
||||
msgctxt "#30254"
|
||||
msgid "Show add-on settings"
|
||||
msgstr "アドオン設定を見る"
|
||||
|
||||
msgctxt "#30255"
|
||||
msgid "TV Shows - A-Z"
|
||||
msgstr "TV番組 - A-Z"
|
||||
|
||||
msgctxt "#30256"
|
||||
msgid "Movies"
|
||||
msgstr "映画"
|
||||
|
||||
msgctxt "#30257"
|
||||
msgid "Movies - Recently Added"
|
||||
msgstr "映画 - 最近追加された"
|
||||
|
||||
msgctxt "#30258"
|
||||
msgid "Movies - In Progress"
|
||||
msgstr "映画 - 途中"
|
||||
|
||||
msgctxt "#30259"
|
||||
msgid "Movies - Favorites"
|
||||
msgstr "映画 - お気に入り"
|
||||
|
||||
msgctxt "#30260"
|
||||
msgid "BoxSets"
|
||||
msgstr "ボックス・セット"
|
||||
|
||||
msgctxt "#30261"
|
||||
msgid "TV Shows"
|
||||
msgstr "TV番組"
|
||||
|
||||
msgctxt "#30262"
|
||||
msgid "TV Shows - Favorites"
|
||||
msgstr "TV番組 - お気に入り"
|
||||
|
||||
msgctxt "#30264"
|
||||
msgid "Episodes - In Progress"
|
||||
msgstr "エピソード - 途中"
|
||||
|
||||
msgctxt "#30265"
|
||||
msgid "Episodes - Next Up"
|
||||
msgstr "エピソード - 次"
|
||||
|
||||
msgctxt "#30266"
|
||||
msgid "Movies - Pages"
|
||||
msgstr "映画 - ページ"
|
||||
|
||||
msgctxt "#30267"
|
||||
msgid " - In Progress"
|
||||
msgstr "- 途中"
|
||||
|
||||
msgctxt "#30268"
|
||||
msgid " - Recently Added"
|
||||
msgstr "- 最近追加された"
|
||||
|
||||
msgctxt "#30269"
|
||||
msgid "Movies - Random"
|
||||
msgstr "映画 - ランダム"
|
||||
|
||||
msgctxt "#30270"
|
||||
msgid "Mark Watched"
|
||||
msgstr "視聴済みにする"
|
||||
|
||||
msgctxt "#30271"
|
||||
msgid "Mark Unwatched"
|
||||
msgstr "未視聴にする"
|
||||
|
||||
msgctxt "#30272"
|
||||
msgid "Set Favourite"
|
||||
msgstr "お気に入りにする"
|
||||
|
||||
msgctxt "#30273"
|
||||
msgid "Unset Favourite"
|
||||
msgstr "お気に入りから外す"
|
||||
|
||||
msgctxt "#30274"
|
||||
msgid "Delete"
|
||||
msgstr "削除"
|
||||
|
||||
msgctxt "#30275"
|
||||
msgid "Force Transcode"
|
||||
msgstr "トランスコードを強制する"
|
||||
|
||||
msgctxt "#30276"
|
||||
msgid "Extra Resume Prompt Detected"
|
||||
msgstr "追加の再開プロンプトが検出された"
|
||||
|
||||
msgctxt "#30278"
|
||||
msgid " - Next Up"
|
||||
msgstr "- 次"
|
||||
|
||||
msgctxt "#30279"
|
||||
msgid "TV Shows - Unwatched"
|
||||
msgstr "TV番組 - 未視聴"
|
||||
|
||||
msgctxt "#30280"
|
||||
msgid "Missing Title"
|
||||
msgstr "タイトル欠落"
|
||||
|
||||
msgctxt "#30281"
|
||||
msgid "Refresh Cached Images"
|
||||
msgstr "キャッシュしたイメージをリフレッシュする"
|
||||
|
||||
msgctxt "#30282"
|
||||
msgid "No Jellyfin servers detected on your local network."
|
||||
msgstr "ローカルネットワークにJellyfinサーバーは検出されませんでした。"
|
||||
|
||||
msgctxt "#30283"
|
||||
msgid "Play Next Episode?"
|
||||
msgstr "次のエピソードを再生しますか?"
|
||||
|
||||
msgctxt "#30285"
|
||||
msgid " - Unwatched"
|
||||
msgstr "- 未視聴"
|
||||
|
||||
msgctxt "#30286"
|
||||
msgid "Movies - Unwatched"
|
||||
msgstr "映画 - 未視聴"
|
||||
|
||||
msgctxt "#30287"
|
||||
msgid "TV Shows - Latest"
|
||||
msgstr "TV番組 - 最新"
|
||||
|
||||
msgctxt "#30288"
|
||||
msgid " - Latest"
|
||||
msgstr "- 最新"
|
||||
|
||||
msgctxt "#30290"
|
||||
msgid "All"
|
||||
msgstr "全て"
|
||||
|
||||
msgctxt "#30291"
|
||||
msgid "Select Audio Stream"
|
||||
msgstr "音声ストリームを選択"
|
||||
|
||||
msgctxt "#30292"
|
||||
msgid "Select Subtitle Stream"
|
||||
msgstr "サブタイトルストリームを選択"
|
||||
|
||||
msgctxt "#30293"
|
||||
msgid "Cache images"
|
||||
msgstr "イメージをキャッシュする"
|
||||
|
||||
msgctxt "#30294"
|
||||
msgid "Notice"
|
||||
msgstr "通知"
|
||||
|
||||
msgctxt "#30295"
|
||||
msgid "To use this feature you need HTTP control enabled"
|
||||
msgstr "この機能を使うにはHTTPコントロールが有効化されている必要があります"
|
||||
|
||||
msgctxt "#30296"
|
||||
msgid "Delete"
|
||||
msgstr "削除"
|
||||
|
||||
msgctxt "#30297"
|
||||
msgid "Delete unused images?"
|
||||
msgstr "使用されていないイメージを削除しますか?"
|
||||
|
||||
msgctxt "#30299"
|
||||
msgid "Cache Images"
|
||||
msgstr "イメージをキャッシュする"
|
||||
|
||||
msgctxt "#30301"
|
||||
msgid "Caching Images"
|
||||
msgstr "イメージをキャッシュ中"
|
||||
|
||||
msgctxt "#30302"
|
||||
msgid "Existing images : "
|
||||
msgstr "既存のイメージ:"
|
||||
|
||||
msgctxt "#30303"
|
||||
msgid "Missing Jellyfin images : "
|
||||
msgstr "欠落したJellyfinイメージ:"
|
||||
|
||||
msgctxt "#30304"
|
||||
msgid "Cached Jellyfin images : "
|
||||
msgstr "キャッシュされたJellyfinイメージ:"
|
||||
|
||||
msgctxt "#30305"
|
||||
msgid "Not Found"
|
||||
msgstr "見つかりませんでした"
|
||||
|
||||
msgctxt "#30306"
|
||||
msgid "Playback starting"
|
||||
msgstr "再生を開始中"
|
||||
|
||||
msgctxt "#30307"
|
||||
msgid "Play Trailer"
|
||||
msgstr "トレーラーを再生"
|
||||
|
||||
msgctxt "#30308"
|
||||
msgid "Select Trailer"
|
||||
msgstr "トレーラーを選択"
|
||||
|
||||
msgctxt "#30309"
|
||||
msgid "Select Media Source"
|
||||
msgstr "メディアソースを選択"
|
||||
|
||||
msgctxt "#30311"
|
||||
msgid "Library - "
|
||||
msgstr "ライブラリー -"
|
||||
|
||||
msgctxt "#30312"
|
||||
msgid "All - "
|
||||
msgstr "全て -"
|
||||
|
||||
msgctxt "#30313"
|
||||
msgid "Menu"
|
||||
msgstr "メニュー"
|
||||
|
||||
msgctxt "#30314"
|
||||
msgid "Play"
|
||||
msgstr "再生"
|
||||
|
||||
msgctxt "#30315"
|
||||
msgid "Suppress notifications for connection errors"
|
||||
msgstr "接続エラーについての通知を抑制"
|
||||
|
||||
msgctxt "#30316"
|
||||
msgid "Connection Error"
|
||||
msgstr "接続エラー"
|
||||
|
||||
msgctxt "#30317"
|
||||
msgid "Play All"
|
||||
msgstr "全て再生"
|
||||
|
||||
msgctxt "#30318"
|
||||
msgid "Music - Albums"
|
||||
msgstr "音楽 - アルバム"
|
||||
|
||||
msgctxt "#30320"
|
||||
msgid " - Albums"
|
||||
msgstr "- アルバム"
|
||||
|
||||
msgctxt "#30322"
|
||||
msgid "Auto resume"
|
||||
msgstr "自動再開"
|
||||
|
||||
msgctxt "#30323"
|
||||
msgid "Artists"
|
||||
msgstr "アーティスト"
|
||||
|
||||
msgctxt "#30325"
|
||||
msgid " - Genres"
|
||||
msgstr "- ジャンル"
|
||||
|
||||
msgctxt "#30327"
|
||||
msgid "Go To Season"
|
||||
msgstr "シーズンに行く"
|
||||
|
||||
msgctxt "#30328"
|
||||
msgid "Show empty folders (shows, seasons, collections)"
|
||||
msgstr "空のフォルダー(番組, シーズン, コレクション)を見る"
|
||||
|
||||
msgctxt "#30329"
|
||||
msgid "Screensaver"
|
||||
msgstr "スクリーンセーバー"
|
||||
|
||||
msgctxt "#30330"
|
||||
msgid "Show change user dialog"
|
||||
msgstr "ユーザー変更ダイアログを見る"
|
||||
|
||||
msgctxt "#30331"
|
||||
msgid "Movies per page"
|
||||
msgstr "ページごとの映画"
|
||||
|
||||
msgctxt "#30332"
|
||||
msgid "Stop media playback on screensaver activation"
|
||||
msgstr "スクリーンセーバーが始まったらメディア再生をやめる"
|
||||
|
||||
msgctxt "#30334"
|
||||
msgid "Use JellyCon context menu"
|
||||
msgstr "JellyConコンテキストメニューを使う"
|
||||
|
||||
msgctxt "#30337"
|
||||
msgid "Song"
|
||||
msgstr "曲"
|
||||
|
||||
msgctxt "#30338"
|
||||
msgid "Album"
|
||||
msgstr "アルバム"
|
||||
|
||||
msgctxt "#30339"
|
||||
msgid "Person"
|
||||
msgstr "人物"
|
||||
|
||||
msgctxt "#30340"
|
||||
msgid "Group movies into collections"
|
||||
msgstr "映画のグループをコレクションに追加"
|
||||
|
||||
msgctxt "#30341"
|
||||
msgid "Background image update interval (0 = disabled)"
|
||||
msgstr "バックグラウンドのイメージ更新間隔 (0 = 無効)"
|
||||
|
||||
msgctxt "#30342"
|
||||
msgid "New content check interval (0 = disabled)"
|
||||
msgstr "新しいコンテンツの確認間隔 (0 = 無効)"
|
||||
|
||||
msgctxt "#30343"
|
||||
msgid "Changes Require Kodi Restart"
|
||||
msgstr "変更はKodiの再起動を必要とします"
|
||||
|
||||
msgctxt "#30344"
|
||||
msgid "Number of images removed from cache"
|
||||
msgstr "キャッシュから削除されたイメージの数"
|
||||
|
||||
msgctxt "#30345"
|
||||
msgid "Cache Jellyfin server data requests"
|
||||
msgstr "Jellyfinサーバーデータリクエストをキャッシュする"
|
||||
|
||||
msgctxt "#30346"
|
||||
msgid "Deleteing Cached Images"
|
||||
msgstr "キャッシュされたイメージを削除中"
|
||||
|
||||
msgctxt "#30347"
|
||||
msgid "Getting Existing Images"
|
||||
msgstr "既存のイメージを取得中"
|
||||
|
||||
msgctxt "#30348"
|
||||
msgid "Add user ratings"
|
||||
msgstr "ユーザーレーティングを追加"
|
||||
|
||||
msgctxt "#30350"
|
||||
msgid "Music - Recently Added"
|
||||
msgstr "音楽 - 最近追加された"
|
||||
|
||||
msgctxt "#30349"
|
||||
msgid " - Recently Played"
|
||||
msgstr "- 最近再生された"
|
||||
|
||||
msgctxt "#30351"
|
||||
msgid "Music - Recently Played"
|
||||
msgstr "音楽 - 最近再生された"
|
||||
|
||||
msgctxt "#30352"
|
||||
msgid "Music - Frequently Played"
|
||||
msgstr "音楽 - よく再生される"
|
||||
|
||||
msgctxt "#30319"
|
||||
msgid "Music - All Album Artists"
|
||||
msgstr "音楽 - 全てのアルバムアーティスト"
|
||||
|
||||
msgctxt "#30321"
|
||||
msgid " - Album Artists"
|
||||
msgstr "- アルバムアーティスト"
|
||||
|
||||
msgctxt "#30353"
|
||||
msgid " - Frequently Played"
|
||||
msgstr "- よく再生される"
|
||||
|
||||
msgctxt "#30354"
|
||||
msgid "Go To Series"
|
||||
msgstr "シリーズに行く"
|
||||
|
||||
msgctxt "#30356"
|
||||
msgid "Loading existing image list"
|
||||
msgstr "既存のイメージリストを読み込み中"
|
||||
|
||||
msgctxt "#30357"
|
||||
msgid "Processing existing image list"
|
||||
msgstr "既存のイメージリストを処理中"
|
||||
|
||||
msgctxt "#30358"
|
||||
msgid "Retreiving remote image list"
|
||||
msgstr "リモートイメージリストを取得中"
|
||||
|
||||
msgctxt "#30359"
|
||||
msgid "Building full image list"
|
||||
msgstr "フルイメージリストを構築中"
|
||||
|
||||
msgctxt "#30360"
|
||||
msgid " - Channels"
|
||||
msgstr "- チャンネル"
|
||||
|
||||
msgctxt "#30361"
|
||||
msgid " - Programs"
|
||||
msgstr "- 番組"
|
||||
|
||||
msgctxt "#30362"
|
||||
msgid " - Recordings"
|
||||
msgstr "- 録音"
|
||||
|
||||
msgctxt "#30363"
|
||||
msgid "Save Password?"
|
||||
msgstr "パスワードを保存しますか?"
|
||||
|
||||
msgctxt "#30364"
|
||||
msgid "Do you want to save the password?"
|
||||
msgstr "パスワードを保存しますか?"
|
||||
|
||||
msgctxt "#30365"
|
||||
msgid "Manual Login"
|
||||
msgstr "手動ログイン"
|
||||
|
||||
msgctxt "#30366"
|
||||
msgid "Manually enter user details"
|
||||
msgstr "ユーザー詳細を手動で入力"
|
||||
|
||||
msgctxt "#30367"
|
||||
msgid "Allow fast user switching password saving"
|
||||
msgstr "切り替えたユーザーのパスワードの保存を許可"
|
||||
|
||||
msgctxt "#30368"
|
||||
msgid "Clear Password?"
|
||||
msgstr "パスワードを消去しますか?"
|
||||
|
||||
msgctxt "#30369"
|
||||
msgid "Do you want to clear your saved password?"
|
||||
msgstr "保存されたパスワードを消去しますか?"
|
||||
|
||||
msgctxt "#30370"
|
||||
msgid "Do you want to manually enter a server url?"
|
||||
msgstr "サーバーURLを手動で入力しますか?"
|
||||
|
||||
msgctxt "#30371"
|
||||
msgid "Could not connect to the URL you entered, do you want to try again?"
|
||||
msgstr "入力されたURLに接続できませんでした。再試行しますか?"
|
||||
|
||||
msgctxt "#30372"
|
||||
msgid "Server URL"
|
||||
msgstr "サーバーURL"
|
||||
|
||||
msgctxt "#30373"
|
||||
msgid "Scanning for local servers"
|
||||
msgstr "ローカルサーバーを検索中"
|
||||
|
||||
msgctxt "#30374"
|
||||
msgid "Sending request"
|
||||
msgstr "リクエストを送信中"
|
||||
|
||||
msgctxt "#30377"
|
||||
msgid "Sending request"
|
||||
msgstr "リクエストを送信中"
|
||||
|
||||
msgctxt "#30378"
|
||||
msgid "Persist user details"
|
||||
msgstr "ユーザー詳細を保持する"
|
||||
|
||||
msgctxt "#30376"
|
||||
msgid "Checking server url"
|
||||
msgstr "サーバーURLを検証中"
|
||||
|
||||
msgctxt "#30236"
|
||||
msgid "Force transcode h265 (hevc)"
|
||||
msgstr "h265 (hevc)でのトランスコードを強制する"
|
||||
|
||||
msgctxt "#30240"
|
||||
msgid "Force transcode msmpeg4v3 (divx)"
|
||||
msgstr "msmpeg4v3 (divx)でのトランスコードを強制する"
|
||||
|
||||
msgctxt "#30251"
|
||||
msgid "Movies - Genres"
|
||||
msgstr "映画 - ジャンル"
|
||||
|
||||
msgctxt "#30289"
|
||||
msgid "TV Shows - Genres"
|
||||
msgstr "TV番組 - ジャンル"
|
||||
|
||||
msgctxt "#30310"
|
||||
msgid "Enable Jellyfin remote control"
|
||||
msgstr "Jellyfinリモートコントロールを有効化"
|
||||
|
||||
msgctxt "#30333"
|
||||
msgid "Cache artwork in the background"
|
||||
msgstr "アートワークをバックグラウンドでキャッシュ"
|
||||
|
||||
msgctxt "#30223"
|
||||
msgid "Page Size and Filtering"
|
||||
msgstr "ページサイズとフィルタリング"
|
||||
|
||||
msgctxt "#30247"
|
||||
msgid "Custom Widget Content"
|
||||
msgstr "カスタムウィジェットコンテンツ"
|
||||
|
||||
msgctxt "#30263"
|
||||
msgid "Episodes - Recently Added"
|
||||
msgstr "エピソード - 最近追加された"
|
||||
|
||||
msgctxt "#30298"
|
||||
msgid "Deleting Kodi Images"
|
||||
msgstr "Kodiイメージを削除中"
|
||||
|
||||
msgctxt "#30375"
|
||||
msgid "Receiving data packet"
|
||||
msgstr "データパケットを受信中"
|
||||
|
||||
msgctxt "#30238"
|
||||
msgid "Playback stream options"
|
||||
msgstr "再生ストリームオプション"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "av1でのトランスコードを強制する"
|
||||
|
||||
msgctxt "#30300"
|
||||
msgid "Cache all Jellyfin images as local Kodi images?"
|
||||
msgstr "全てのJellyfinイメージをローカルなKodiイメージとしてキャッシュしますか?"
|
||||
|
||||
msgctxt "#30277"
|
||||
msgid "JellyCon needs to prompt for resume on partily played items, Kodi can also prompt, this can cause a double prompt. Do you want to remove the double prompt?"
|
||||
msgstr ""
|
||||
"JellyConは途中まで再生したアイテムを途中から再生するか質問しますが、Kodiも同"
|
||||
"じ質問をすることがあります。重複した質問を取り除きますか?"
|
||||
|
||||
msgctxt "#30114"
|
||||
msgid "Jump back seconds"
|
||||
msgstr "数秒戻す"
|
||||
|
||||
msgctxt "#30120"
|
||||
msgid "Show load progress"
|
||||
msgstr "読込み状況を表示"
|
||||
|
||||
msgctxt "#30125"
|
||||
msgid "Done"
|
||||
msgstr "完了"
|
||||
|
||||
msgctxt "#30135"
|
||||
msgid "Error"
|
||||
msgstr "エラー"
|
||||
|
||||
msgctxt "#30020"
|
||||
msgid "Flatten single season"
|
||||
msgstr "1シーズンを畳む"
|
||||
|
||||
msgctxt "#30116"
|
||||
msgid "Add unwatched counts to names"
|
||||
msgstr "名前に未視聴の数を追加"
|
||||
|
||||
msgctxt "#30121"
|
||||
msgid "On resume"
|
||||
msgstr "再開時"
|
||||
|
||||
msgctxt "#30126"
|
||||
msgid "Processing Item : "
|
||||
msgstr "次の項目を処理中:"
|
||||
|
||||
msgctxt "#30139"
|
||||
msgid "No Media Type Set"
|
||||
msgstr "メディアタイプ未設定"
|
||||
|
||||
msgctxt "#30163"
|
||||
msgid "Add (cc) if subtitle is available"
|
||||
msgstr "字幕がある場合(cc)を追加する"
|
||||
|
||||
msgctxt "#30166"
|
||||
msgid "Select Server"
|
||||
msgstr "サーバーを選択する"
|
||||
|
||||
msgctxt "#30167"
|
||||
msgid "Selected Server Address"
|
||||
msgstr "選択されたサーバーアドレス"
|
||||
|
||||
msgctxt "#30169"
|
||||
msgid "Address: "
|
||||
msgstr "アドレス:"
|
||||
|
||||
msgctxt "#30180"
|
||||
msgid "Select User"
|
||||
msgstr "ユーザー選択"
|
||||
|
||||
msgctxt "#30026"
|
||||
msgid "Widget item select action"
|
||||
msgstr "ウィジェット項目選択操作"
|
||||
|
||||
msgctxt "#30200"
|
||||
msgid "URL error"
|
||||
msgstr "URLエラー"
|
||||
|
||||
msgctxt "#30201"
|
||||
msgid "Unable to connect to server"
|
||||
msgstr "サーバーに接続できません"
|
||||
2
resources/language/resource.language.mk/strings.po
Normal file
2
resources/language/resource.language.mk/strings.po
Normal file
@@ -0,0 +1,2 @@
|
||||
msgid ""
|
||||
msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"
|
||||
16
resources/language/resource.language.mn/strings.po
Normal file
16
resources/language/resource.language.mn/strings.po
Normal file
@@ -0,0 +1,16 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2025-10-26 00:17+0000\n"
|
||||
"Last-Translator: Battseren Badral <bbattseren88@gmail.com>\n"
|
||||
"Language-Team: Mongolian <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/mn/>\n"
|
||||
"Language: mn\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.14\n"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Host"
|
||||
msgstr "Хост"
|
||||
1223
resources/language/resource.language.nb_NO/strings.po
Normal file
1223
resources/language/resource.language.nb_NO/strings.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-02-16 21:39+0000\n"
|
||||
"Last-Translator: Ruben Kremer <rubenkremer@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-05-11 01:54+0000\n"
|
||||
"Last-Translator: C2gl <lievens.guillaume@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/nl/>\n"
|
||||
"Language: nl\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.10.4\n"
|
||||
|
||||
msgctxt "#30257"
|
||||
msgid "Movies - Recently Added"
|
||||
@@ -137,7 +137,7 @@ msgstr "Transcode opties"
|
||||
|
||||
msgctxt "#30210"
|
||||
msgid "HTTP direct stream"
|
||||
msgstr "HTTP direct stream"
|
||||
msgstr "HTTP directe stream"
|
||||
|
||||
msgctxt "#30209"
|
||||
msgid "File direct path"
|
||||
@@ -241,7 +241,7 @@ msgstr "Content aan het laden"
|
||||
|
||||
msgctxt "#30111"
|
||||
msgid "Services"
|
||||
msgstr "Services"
|
||||
msgstr "Diensten"
|
||||
|
||||
msgctxt "#30110"
|
||||
msgid "Interface"
|
||||
@@ -309,7 +309,7 @@ msgstr "Naamformat van gefilterde aflevering"
|
||||
|
||||
msgctxt "#30018"
|
||||
msgid "Number of items to show in filtered lists"
|
||||
msgstr "Aantal weer te geven items in gefilterde lijsten"
|
||||
msgstr "Aantal items om te tonen in gefilterde lijsten"
|
||||
|
||||
msgctxt "#30017"
|
||||
msgid "Show connected clients"
|
||||
@@ -321,7 +321,7 @@ msgstr "Weergavenaam apparaat"
|
||||
|
||||
msgctxt "#30015"
|
||||
msgid "Log timing data"
|
||||
msgstr "Log timing gegevens"
|
||||
msgstr "Log timinggegevens"
|
||||
|
||||
msgctxt "#30014"
|
||||
msgid "Jellyfin"
|
||||
@@ -341,11 +341,11 @@ msgstr "Aantal vast te leggen prestatieprofielen"
|
||||
|
||||
msgctxt "#30008"
|
||||
msgid "Samba password"
|
||||
msgstr "Samba wachtwoord"
|
||||
msgstr "Samba-wachtwoord"
|
||||
|
||||
msgctxt "#30007"
|
||||
msgid "Samba username"
|
||||
msgstr "Samba gebruikersnaam"
|
||||
msgstr "Samba-gebruikersnaam"
|
||||
|
||||
msgctxt "#30006"
|
||||
msgid "Password"
|
||||
@@ -357,7 +357,7 @@ msgstr "Gebruikersnaam"
|
||||
|
||||
msgctxt "#30003"
|
||||
msgid "Verify HTTPS certificate"
|
||||
msgstr "Verifieer HTTPS certificaat"
|
||||
msgstr "Verifieer HTTPS-certificaat"
|
||||
|
||||
msgctxt "#30001"
|
||||
msgid "Port"
|
||||
@@ -1120,3 +1120,87 @@ msgstr "Willekeurig"
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Directe Mix"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Interface-modus"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Standaard"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Eenvoudig"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Volgende Herbekijken"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Terugkijkdagen (0 = uitgeschakeld)"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Forceer transcoderen av1"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Samenvoegen in de plaats van vervangen (kan vertragingen veroorzaken)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Verberg aantal items bij weergeven van titel"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " Geheel niet bekeken"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Uit te voeren actie"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Overslaan"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Vragen"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Niets doen"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Segment Overslagen"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Start Offset (seconden)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Einde Offset (seconden)"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Intro Skipper"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Krediet Skipper"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Reclame Skipper"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Preview Skipper"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Samenvatting Skipper"
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-01-17 19:51+0000\n"
|
||||
"Last-Translator: Marcin Woliński <cierdek@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-12-15 22:55+0000\n"
|
||||
"Last-Translator: Kityn <kitynska@gmail.com>\n"
|
||||
"Language-Team: Polish <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/pl/>\n"
|
||||
"Language: pl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && "
|
||||
"(n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.14\n"
|
||||
|
||||
msgctxt "#30313"
|
||||
msgid "Menu"
|
||||
@@ -118,11 +118,11 @@ msgstr "- Ostatnie"
|
||||
|
||||
msgctxt "#30287"
|
||||
msgid "TV Shows - Latest"
|
||||
msgstr "Seriale — ostatnie"
|
||||
msgstr "Seriale - Ostatnie"
|
||||
|
||||
msgctxt "#30286"
|
||||
msgid "Movies - Unwatched"
|
||||
msgstr "Filmy – nieobejrzane"
|
||||
msgstr "Filmy - Nieobejrzane"
|
||||
|
||||
msgctxt "#30285"
|
||||
msgid " - Unwatched"
|
||||
@@ -146,7 +146,7 @@ msgstr "Brak tytułu"
|
||||
|
||||
msgctxt "#30279"
|
||||
msgid "TV Shows - Unwatched"
|
||||
msgstr "Seriale - Nieoglądane"
|
||||
msgstr "Seriale - Nieobejrzane"
|
||||
|
||||
msgctxt "#30278"
|
||||
msgid " - Next Up"
|
||||
@@ -181,7 +181,7 @@ msgstr "Ustaw ulubione"
|
||||
|
||||
msgctxt "#30271"
|
||||
msgid "Mark Unwatched"
|
||||
msgstr "Oznacz nieoglądane"
|
||||
msgstr "Oznacz nieobejrzane"
|
||||
|
||||
msgctxt "#30270"
|
||||
msgid "Mark Watched"
|
||||
@@ -189,7 +189,7 @@ msgstr "Zaznacz obserwowane"
|
||||
|
||||
msgctxt "#30269"
|
||||
msgid "Movies - Random"
|
||||
msgstr "Filmy — losowe"
|
||||
msgstr "Filmy - Losowe"
|
||||
|
||||
msgctxt "#30268"
|
||||
msgid " - Recently Added"
|
||||
@@ -201,23 +201,23 @@ msgstr "- W trakcie"
|
||||
|
||||
msgctxt "#30266"
|
||||
msgid "Movies - Pages"
|
||||
msgstr "Filmy – Strony"
|
||||
msgstr "Filmy - Strony"
|
||||
|
||||
msgctxt "#30265"
|
||||
msgid "Episodes - Next Up"
|
||||
msgstr "Odcinki — Następny"
|
||||
msgstr "Odcinki - Następny"
|
||||
|
||||
msgctxt "#30264"
|
||||
msgid "Episodes - In Progress"
|
||||
msgstr "Odcinki — w toku"
|
||||
msgstr "Odcinki - W trakcie"
|
||||
|
||||
msgctxt "#30263"
|
||||
msgid "Episodes - Recently Added"
|
||||
msgstr "Odcinki — ostatnio dodane"
|
||||
msgstr "Odcinki - Ostatnio dodane"
|
||||
|
||||
msgctxt "#30262"
|
||||
msgid "TV Shows - Favorites"
|
||||
msgstr "Seriale – Ulubione"
|
||||
msgstr "Seriale - Ulubione"
|
||||
|
||||
msgctxt "#30261"
|
||||
msgid "TV Shows"
|
||||
@@ -233,11 +233,11 @@ msgstr "Filmy - Ulubione"
|
||||
|
||||
msgctxt "#30258"
|
||||
msgid "Movies - In Progress"
|
||||
msgstr "Filmy – w toku"
|
||||
msgstr "Filmy - W trakcie"
|
||||
|
||||
msgctxt "#30257"
|
||||
msgid "Movies - Recently Added"
|
||||
msgstr "Filmy — ostatnio dodane"
|
||||
msgstr "Filmy - Ostatnio dodane"
|
||||
|
||||
msgctxt "#30256"
|
||||
msgid "Movies"
|
||||
@@ -257,7 +257,7 @@ msgstr "Filmy - A-Z"
|
||||
|
||||
msgctxt "#30251"
|
||||
msgid "Movies - Genres"
|
||||
msgstr "Filmy – Gatunki"
|
||||
msgstr "Filmy - Gatunki"
|
||||
|
||||
msgctxt "#30250"
|
||||
msgid "Unknown"
|
||||
@@ -309,7 +309,7 @@ msgstr "Seriale"
|
||||
|
||||
msgctxt "#30213"
|
||||
msgid "Video force 8 bit"
|
||||
msgstr "Wymuś video 8 bit"
|
||||
msgstr "Wymuś wideo 8-bitowe"
|
||||
|
||||
msgctxt "#30224"
|
||||
msgid "Interaction"
|
||||
@@ -429,11 +429,11 @@ msgstr "Brak zestawu typu nośnika"
|
||||
|
||||
msgctxt "#30321"
|
||||
msgid " - Album Artists"
|
||||
msgstr "- Artyści albumów"
|
||||
msgstr "- Wykonawcy albumów"
|
||||
|
||||
msgctxt "#30319"
|
||||
msgid "Music - All Album Artists"
|
||||
msgstr "Muzyka — wszyscy wykonawcy albumów"
|
||||
msgstr "Muzyka - Wszyscy wykonawcy albumów"
|
||||
|
||||
msgctxt "#30332"
|
||||
msgid "Stop media playback on screensaver activation"
|
||||
@@ -794,7 +794,7 @@ msgstr "- A-Z"
|
||||
|
||||
msgctxt "#30403"
|
||||
msgid "Movies - Recommendations"
|
||||
msgstr "Filmy – rekomendacje"
|
||||
msgstr "Filmy - Rekomendacje"
|
||||
|
||||
msgctxt "#30402"
|
||||
msgid "Add to Kodi Playlist"
|
||||
@@ -996,15 +996,15 @@ msgstr "- Często odtwarzane"
|
||||
|
||||
msgctxt "#30352"
|
||||
msgid "Music - Frequently Played"
|
||||
msgstr "Muzyka — często odtwarzana"
|
||||
msgstr "Muzyka - Często odtwarzana"
|
||||
|
||||
msgctxt "#30351"
|
||||
msgid "Music - Recently Played"
|
||||
msgstr "Muzyka — ostatnio odtwarzane"
|
||||
msgstr "Muzyka - Ostatnio odtwarzane"
|
||||
|
||||
msgctxt "#30350"
|
||||
msgid "Music - Recently Added"
|
||||
msgstr "Muzyka — ostatnio dodane"
|
||||
msgstr "Muzyka - Ostatnio dodane"
|
||||
|
||||
msgctxt "#30349"
|
||||
msgid " - Recently Played"
|
||||
@@ -1044,7 +1044,7 @@ msgstr "Interwał aktualizacji obrazu tła (0 = wyłączone)"
|
||||
|
||||
msgctxt "#30340"
|
||||
msgid "Group movies into collections"
|
||||
msgstr "Grupuj filmy w kolekcję"
|
||||
msgstr "Grupuj filmy w kolekcje"
|
||||
|
||||
msgctxt "#30339"
|
||||
msgid "Person"
|
||||
@@ -1092,15 +1092,15 @@ msgstr "Opcje odtwarzania"
|
||||
|
||||
msgctxt "#30444"
|
||||
msgid "Login using Quick Connect"
|
||||
msgstr "Zaloguj używając Szybkiego Połączenia"
|
||||
msgstr "Zaloguj przy użyciu szybkiego łączenia"
|
||||
|
||||
msgctxt "#30443"
|
||||
msgid "Quick Connect"
|
||||
msgstr "Szybkie połączenie"
|
||||
msgstr "Szybkie łączenie"
|
||||
|
||||
msgctxt "#30323"
|
||||
msgid "Artists"
|
||||
msgstr "Artyści"
|
||||
msgstr "Wykonawcy"
|
||||
|
||||
msgctxt "#30439"
|
||||
msgid "Show play next episode at time left in seconds"
|
||||
@@ -1125,3 +1125,107 @@ msgstr "Tasuj"
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Natychmiastowe mieszanie"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Tryb interfejsu"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Domyślny"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Prosty"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Wymuś transkodowanie av1"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Następne ponowne oglądanie"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Dni ponownego oglądania (0 = wyłączone)"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Łącz zamiast zastępować (może powodować spowolnienie)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Ukryj liczbę pozycji wyświetlanych w tytule wpisu"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " – Zupełnie nieobejrzane"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Działanie do podjęcia"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Przesunięcie zakończenia (sekundy)"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Pomijanie napisów końcowych"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Pomijanie wprowadzeń"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Zapytaj"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Pomijanie reklam"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Pomijanie zapowiedzi"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Pomijanie podsumowań"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Pomijanie segmentów"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Przesunięcie rozpoczęcia (sekundy)"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Pomiń"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Nic nie rób"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "Seriale - Losowo"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "Wszystkie - Losowo"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Wszystkie - Ostatnio dodane"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "Wszystkie - Ulubione"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "Seriale na stronę"
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-02-13 01:39+0000\n"
|
||||
"Last-Translator: Ilya Garkavenko <fewdji@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-12-23 08:05+0000\n"
|
||||
"Last-Translator: Gallyam Biktashev <gallyamb@gmail.com>\n"
|
||||
"Language-Team: Russian <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/ru/>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.14\n"
|
||||
|
||||
msgctxt "#30332"
|
||||
msgid "Stop media playback on screensaver activation"
|
||||
@@ -345,11 +345,11 @@ msgstr "Фильмы - Недавно добавленные"
|
||||
|
||||
msgctxt "#30299"
|
||||
msgid "Cache Images"
|
||||
msgstr "Кэшировать рисунки"
|
||||
msgstr "Кэшировать изображения"
|
||||
|
||||
msgctxt "#30293"
|
||||
msgid "Cache images"
|
||||
msgstr "Кэшировать рисунки"
|
||||
msgstr "Кэшировать изображения"
|
||||
|
||||
msgctxt "#30288"
|
||||
msgid " - Latest"
|
||||
@@ -1083,10 +1083,9 @@ msgctxt "#30001"
|
||||
msgid "Port"
|
||||
msgstr "Порт"
|
||||
|
||||
#, fuzzy
|
||||
msgctxt "#30000"
|
||||
msgid "Host"
|
||||
msgstr "Хост"
|
||||
msgstr "Адрес сервера"
|
||||
|
||||
msgctxt "#30444"
|
||||
msgid "Login using Quick Connect"
|
||||
@@ -1120,3 +1119,111 @@ msgstr "Перемешать"
|
||||
msgctxt "#30447"
|
||||
msgid "Max Play Queue Size"
|
||||
msgstr "Максимальный размер очереди"
|
||||
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Мгновенное перемешивание"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Режим интерфейса"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "По умолчанию"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Простой"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Принудительное перекодирование av1"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Объединение вместо замены (может привести к замедлению работы)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Скрыть количество элементов в заголовке"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Далее Повторный просмотр"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Дни повторного просмотра (0 = отключено)"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " Общее непросмотренное"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Пропустить"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Действие для выполнения"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Начальное смещение (в секундах)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Конечное смещение (в секундах)"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Пропуск сегментов"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Спросить"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Ничего не делать"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Пропуск вступления"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Пропуск титров"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Пропуск рекламы"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Пропуск обзора"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Пропуск повтора"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "Телешоу - случайно"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "Всё - случайно"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Всё - недавно добавленные"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "Всё - избранное"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "Телешоу на странице"
|
||||
|
||||
1205
resources/language/resource.language.sk/strings.po
Normal file
1205
resources/language/resource.language.sk/strings.po
Normal file
File diff suppressed because it is too large
Load Diff
60
resources/language/resource.language.sq/strings.po
Normal file
60
resources/language/resource.language.sq/strings.po
Normal file
@@ -0,0 +1,60 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2025-12-13 11:55+0000\n"
|
||||
"Last-Translator: A Boci <ami@boci.co.uk>\n"
|
||||
"Language-Team: Albanian <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/sq/>\n"
|
||||
"Language: sq\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.14\n"
|
||||
|
||||
msgctxt "#30001"
|
||||
msgid "Port"
|
||||
msgstr "Port"
|
||||
|
||||
msgctxt "#30003"
|
||||
msgid "Verify HTTPS certificate"
|
||||
msgstr "Verifiko çertifikatën HTTPS"
|
||||
|
||||
msgctxt "#30006"
|
||||
msgid "Password"
|
||||
msgstr "Fjalkalimi"
|
||||
|
||||
msgctxt "#30007"
|
||||
msgid "Samba username"
|
||||
msgstr "Përdoruesi Samba"
|
||||
|
||||
msgctxt "#30008"
|
||||
msgid "Samba password"
|
||||
msgstr "Fjalkalimi Samba"
|
||||
|
||||
msgctxt "#30012"
|
||||
msgid "[Change user]"
|
||||
msgstr "[Ndrysho përdoruesin]"
|
||||
|
||||
msgctxt "#30014"
|
||||
msgid "Jellyfin"
|
||||
msgstr "Jellyfin"
|
||||
|
||||
msgctxt "#30016"
|
||||
msgid "Device display name"
|
||||
msgstr "Emri që shfaqet"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Host"
|
||||
msgstr "Host"
|
||||
|
||||
msgctxt "#30005"
|
||||
msgid "Username"
|
||||
msgstr "Përdoruesi"
|
||||
|
||||
msgctxt "#30011"
|
||||
msgid "[Detect local server]"
|
||||
msgstr "[Zbuloni serverin lokal]"
|
||||
|
||||
msgctxt "#30017"
|
||||
msgid "Show connected clients"
|
||||
msgstr "Trego klientët e lidhur"
|
||||
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-01-13 15:51+0000\n"
|
||||
"Last-Translator: Weevild <Filip.westman@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-09-10 20:11+0000\n"
|
||||
"Last-Translator: Ärik <kwakz4life@gmail.com>\n"
|
||||
"Language-Team: Swedish <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/sv/>\n"
|
||||
"Language: sv\n"
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
msgctxt "#30283"
|
||||
msgid "Play Next Episode?"
|
||||
@@ -17,7 +17,7 @@ msgstr "Spela Nästa Avsnitt?"
|
||||
|
||||
msgctxt "#30240"
|
||||
msgid "Force transcode msmpeg4v3 (divx)"
|
||||
msgstr "Tvinga msmpeg4v3 (divx) transkoding"
|
||||
msgstr "Tvinga msmpeg4v3 (divx) transkodning"
|
||||
|
||||
msgctxt "#30218"
|
||||
msgid "Play next episode after %"
|
||||
@@ -25,7 +25,7 @@ msgstr "Spela nästa avsnitt efter %"
|
||||
|
||||
msgctxt "#30239"
|
||||
msgid "Force transcode mpeg2"
|
||||
msgstr "Tvinga mpeg2 transkoding"
|
||||
msgstr "Tvinga mpeg2 transkodning"
|
||||
|
||||
msgctxt "#30224"
|
||||
msgid "Interaction"
|
||||
@@ -37,7 +37,7 @@ msgstr "Video tvinga 8 bit"
|
||||
|
||||
msgctxt "#30236"
|
||||
msgid "Force transcode h265 (hevc)"
|
||||
msgstr "Tvinga h265 (hevc) transkoding"
|
||||
msgstr "Tvinga h265 (hevc) transkodning"
|
||||
|
||||
msgctxt "#30254"
|
||||
msgid "Show add-on settings"
|
||||
@@ -53,7 +53,7 @@ msgstr "Video max bredd"
|
||||
|
||||
msgctxt "#30211"
|
||||
msgid "Transcode options"
|
||||
msgstr "Transkoding alternativ"
|
||||
msgstr "Transkoderingsinställningar"
|
||||
|
||||
msgctxt "#30163"
|
||||
msgid "Add (cc) if subtitle is available"
|
||||
@@ -225,7 +225,7 @@ msgstr "Inkludera media stream information"
|
||||
|
||||
msgctxt "#30181"
|
||||
msgid "Include plot"
|
||||
msgstr "Inkludera intrig"
|
||||
msgstr "Inkludera handling"
|
||||
|
||||
msgctxt "#30214"
|
||||
msgid "Events"
|
||||
@@ -241,7 +241,7 @@ msgstr "Tvinga mpeg4 transkodning"
|
||||
|
||||
msgctxt "#30260"
|
||||
msgid "BoxSets"
|
||||
msgstr "BoxSet"
|
||||
msgstr "Samlingsbox"
|
||||
|
||||
msgctxt "#30259"
|
||||
msgid "Movies - Favorites"
|
||||
@@ -269,7 +269,7 @@ msgstr "Avsnitt - Nyligen Tillagt"
|
||||
|
||||
msgctxt "#30275"
|
||||
msgid "Force Transcode"
|
||||
msgstr "Tvinga Transkoding"
|
||||
msgstr "Tvinga Transkodning"
|
||||
|
||||
msgctxt "#30273"
|
||||
msgid "Unset Favourite"
|
||||
@@ -313,7 +313,7 @@ msgstr "Filmer - Genrer"
|
||||
|
||||
msgctxt "#30237"
|
||||
msgid "Start from beginning"
|
||||
msgstr "Starta från början"
|
||||
msgstr "Börja från början"
|
||||
|
||||
msgctxt "#30252"
|
||||
msgid "Movies - A-Z"
|
||||
@@ -485,7 +485,7 @@ msgstr "URL error"
|
||||
|
||||
msgctxt "#30114"
|
||||
msgid "Jump back seconds"
|
||||
msgstr "Hoppa tillbaka sekunder"
|
||||
msgstr "spola tillbaka sekunder"
|
||||
|
||||
msgctxt "#30125"
|
||||
msgid "Done"
|
||||
@@ -517,7 +517,7 @@ msgstr "Använd cachad widget data"
|
||||
|
||||
msgctxt "#30440"
|
||||
msgid "Play next"
|
||||
msgstr "Spela härnest"
|
||||
msgstr "Spela härnäst"
|
||||
|
||||
msgctxt "#30250"
|
||||
msgid "Unknown"
|
||||
@@ -549,7 +549,7 @@ msgstr "[Upptäck lokal server]"
|
||||
|
||||
msgctxt "#30003"
|
||||
msgid "Verify HTTPS certificate"
|
||||
msgstr "Verifiera HTTPS-certifikat"
|
||||
msgstr "Verifiera HTTPS certifikat"
|
||||
|
||||
msgctxt "#30001"
|
||||
msgid "Port"
|
||||
@@ -653,7 +653,7 @@ msgstr "Gränssnitt"
|
||||
|
||||
msgctxt "#30135"
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
msgstr "Fel"
|
||||
|
||||
msgctxt "#30113"
|
||||
msgid "Retrieving Data"
|
||||
@@ -689,11 +689,11 @@ msgstr "Jellyfin"
|
||||
|
||||
msgctxt "#30008"
|
||||
msgid "Samba password"
|
||||
msgstr "Samba lösenord"
|
||||
msgstr "Samba-lösenord"
|
||||
|
||||
msgctxt "#30007"
|
||||
msgid "Samba username"
|
||||
msgstr "Samba användarnamn"
|
||||
msgstr "Samba-användarnamn"
|
||||
|
||||
msgctxt "#30006"
|
||||
msgid "Password"
|
||||
@@ -769,7 +769,7 @@ msgstr "Lägg till \"procent kvar\" bredvid namnen"
|
||||
|
||||
msgctxt "#30116"
|
||||
msgid "Add unwatched counts to names"
|
||||
msgstr "Lägg in en \"inte än sedd\" räknare bredvid namnen"
|
||||
msgstr "Lägg in en \"osedd\" räknare bredvid namnen"
|
||||
|
||||
msgctxt "#30279"
|
||||
msgid "TV Shows - Unwatched"
|
||||
@@ -777,7 +777,7 @@ msgstr "TV Serier- Ej sedd"
|
||||
|
||||
msgctxt "#30286"
|
||||
msgid "Movies - Unwatched"
|
||||
msgstr "Film - Osädda"
|
||||
msgstr "Film - Osedda"
|
||||
|
||||
msgctxt "#30285"
|
||||
msgid " - Unwatched"
|
||||
@@ -798,13 +798,12 @@ msgstr "- Nästa"
|
||||
msgctxt "#30277"
|
||||
msgid "JellyCon needs to prompt for resume on partily played items, Kodi can also prompt, this can cause a double prompt. Do you want to remove the double prompt?"
|
||||
msgstr ""
|
||||
"JellyCon måste fråga om att fortsätta uppspelada halvsedda filmer, Kodi kan "
|
||||
"också fråga, detta kan orsaka två prompter. Vill du ta bort den dubbla "
|
||||
"prompter?"
|
||||
"JellyCon måste fråga om att fortsätta påbörjade filmer, Kodi kan också "
|
||||
"fråga, detta kan orsaka två prompter. Vill du ta bort den dubbla prompter?"
|
||||
|
||||
msgctxt "#30276"
|
||||
msgid "Extra Resume Prompt Detected"
|
||||
msgstr "Extra uppmaning om att fortsätta upspelning upptäckt"
|
||||
msgstr "Extra uppmaning om att fortsätta uppspelning upptäckt"
|
||||
|
||||
msgctxt "#30247"
|
||||
msgid "Custom Widget Content"
|
||||
@@ -816,7 +815,7 @@ msgstr "Alternativ för uppspelning av stream"
|
||||
|
||||
msgctxt "#30220"
|
||||
msgid "Prompt to delete movie after %"
|
||||
msgstr "Uppmaning att radera film efter %"
|
||||
msgstr "Uppmana att radera film efter %"
|
||||
|
||||
msgctxt "#30219"
|
||||
msgid " - Prompt before play"
|
||||
@@ -896,7 +895,7 @@ msgstr "Logga tidsdata"
|
||||
|
||||
msgctxt "#30010"
|
||||
msgid "Number of performance profiles to capture"
|
||||
msgstr "Antal prestanda profiler som ska räknas"
|
||||
msgstr "Antal prestandaprofiler som ska räknas"
|
||||
|
||||
msgctxt "#30375"
|
||||
msgid "Receiving data packet"
|
||||
@@ -1118,3 +1117,87 @@ msgstr "Slumpa"
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Direktmix"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Gränssnitts läge"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "Standard"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Enkel"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Kombinera istället för att byta ut (kan orsaka fördröjningar)"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Tvinga transkodning av1"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Nästa På Titta Igen"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Titta Igen Dagar (0 = Avaktiverat)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Göm antal objekt som visas på huvudmenyn"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - Helt obevakad"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Inledande förskjutning (sekunder)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Avslutande förskjutning (sekunder)"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Hoppa över"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Fråga"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Gör ingenting"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Åtgärd"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Segmenthoppare"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Sluttextshoppare"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Introhoppare"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Reklamhoppare"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Förhandsgranskningshoppare"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Sammanfattningshoppare"
|
||||
|
||||
1206
resources/language/resource.language.ta/strings.po
Normal file
1206
resources/language/resource.language.ta/strings.po
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,16 +1,16 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2022-08-21 02:11+0000\n"
|
||||
"Last-Translator: lyaschuchenko <lyaschuchenko@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-12-15 22:55+0000\n"
|
||||
"Last-Translator: kscop-n1 <karpenko.serhii@outlook.com>\n"
|
||||
"Language-Team: Ukrainian <https://translate.jellyfin.org/projects/jellycon/"
|
||||
"jellycon/uk/>\n"
|
||||
"Language: uk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.13.1\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.14\n"
|
||||
|
||||
msgctxt "#30434"
|
||||
msgid "Force transcode stream bitrate (Kbits)"
|
||||
@@ -46,7 +46,7 @@ msgstr "Увійти використовуючи Quick Connect"
|
||||
|
||||
msgctxt "#30443"
|
||||
msgid "Quick Connect"
|
||||
msgstr "Quick Connect"
|
||||
msgstr "Швидке підключення"
|
||||
|
||||
msgctxt "#30442"
|
||||
msgid "Simple new content check"
|
||||
@@ -138,7 +138,7 @@ msgstr "Максимум каналів аудіо"
|
||||
|
||||
msgctxt "#30419"
|
||||
msgid "Audio codec"
|
||||
msgstr "Кодек аудіо"
|
||||
msgstr "Аудіокодек"
|
||||
|
||||
msgctxt "#30418"
|
||||
msgid "Audio bitrate (Kbits)"
|
||||
@@ -600,7 +600,7 @@ msgstr "Кешувати всі зображення Jellyfin як локаль
|
||||
|
||||
msgctxt "#30299"
|
||||
msgid "Cache Images"
|
||||
msgstr "Кешувати зображення"
|
||||
msgstr "Кешувати Зображення"
|
||||
|
||||
msgctxt "#30298"
|
||||
msgid "Deleting Kodi Images"
|
||||
@@ -1104,3 +1104,127 @@ msgstr "Хост"
|
||||
msgctxt "#30445"
|
||||
msgid "Continue Watching"
|
||||
msgstr "Продовжити перегляд"
|
||||
|
||||
msgctxt "#30439"
|
||||
msgid "Show play next episode at time left in seconds"
|
||||
msgstr "За скільки секунд до кінця пропонувати перегляд наступного епізоду"
|
||||
|
||||
msgctxt "#30446"
|
||||
msgid "There was an error logging in"
|
||||
msgstr "Виникла помилка під час входу"
|
||||
|
||||
msgctxt "#30447"
|
||||
msgid "Max Play Queue Size"
|
||||
msgstr "Максимальний розмір черги відтворення"
|
||||
|
||||
msgctxt "#30448"
|
||||
msgid "Shuffle"
|
||||
msgstr "Перемішати"
|
||||
|
||||
msgctxt "#30449"
|
||||
msgid "Instant Mix"
|
||||
msgstr "Миттєвий мікс"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "Режим інтерфейсу"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "За замовчуванням"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "Простий"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "Примусово перекодовувати av1"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "Об'єднати замість заміни (може спричинити уповільнення)"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "Далі Повторний перегляд"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "Повторний перегляд днів (0 = вимкнено)"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "Приховати кількість елементів для показу в заголовку запису"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - Цілком Непереглянуто"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "Пропуск Сегмента"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "Дії які потрібно зробити"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "Початковий зсув (секунди)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "Кінцевий зсув (секунди)"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "Пропуск Вступу"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "Пропуск титрів"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "Пропустити"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "Запитати"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "Нічого не робити"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "Пропуск реклами"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "Пропуск превʼю"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "Пропустити нагадування"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "TV шоу на сторінці"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "ТV шоу - Випадкове"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "Все - Випадково"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "Все - Нещодавно додані"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "Все - Улюблене"
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2023-02-02 09:51+0000\n"
|
||||
"Last-Translator: kid1412621 <kid1412621@gmail.com>\n"
|
||||
"Language-Team: Chinese (Simplified) <https://translate.jellyfin.org/projects/"
|
||||
"jellycon/jellycon/zh_Hans/>\n"
|
||||
"PO-Revision-Date: 2025-12-15 22:55+0000\n"
|
||||
"Last-Translator: 無情天 <kofzhanganguo@126.com>\n"
|
||||
"Language-Team: Chinese (Simplified Han script) <https://"
|
||||
"translate.jellyfin.org/projects/jellycon/jellycon/zh_Hans/>\n"
|
||||
"Language: zh_Hans\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.14\n"
|
||||
|
||||
msgctxt "#30442"
|
||||
msgid "Simple new content check"
|
||||
@@ -1118,3 +1118,107 @@ msgstr "速成合辑"
|
||||
msgctxt "#30447"
|
||||
msgid "Max Play Queue Size"
|
||||
msgstr "最大播放队列数"
|
||||
|
||||
msgctxt "#30225"
|
||||
msgid "Interface Mode"
|
||||
msgstr "接口模式"
|
||||
|
||||
msgctxt "#30226"
|
||||
msgid "Default"
|
||||
msgstr "默认值"
|
||||
|
||||
msgctxt "#30227"
|
||||
msgid "Simple"
|
||||
msgstr "简单"
|
||||
|
||||
msgctxt "#30242"
|
||||
msgid "Force transcode av1"
|
||||
msgstr "强制转码为 AV1 格式"
|
||||
|
||||
msgctxt "#30452"
|
||||
msgid "Combine instead of replace (might cause slow-down)"
|
||||
msgstr "合并而非替换(可能会导致速度减慢)"
|
||||
|
||||
msgctxt "#30451"
|
||||
msgid "Rewatch Days (0 = Disabled)"
|
||||
msgstr "重看天数(0=已禁用)"
|
||||
|
||||
msgctxt "#30450"
|
||||
msgid "Next Up Rewatching"
|
||||
msgstr "下一个重看"
|
||||
|
||||
msgctxt "#30453"
|
||||
msgid "Hide number of items to show on entry title"
|
||||
msgstr "隐藏条目标题上显示的项目数"
|
||||
|
||||
msgctxt "#30454"
|
||||
msgid " - Totally Unwatched"
|
||||
msgstr " - 完全未观看"
|
||||
|
||||
msgctxt "#30672"
|
||||
msgid "Skip"
|
||||
msgstr "跳过"
|
||||
|
||||
msgctxt "#30666"
|
||||
msgid "Segment Skipper"
|
||||
msgstr "分段跳过"
|
||||
|
||||
msgctxt "#30667"
|
||||
msgid "Action to take"
|
||||
msgstr "采取的行动"
|
||||
|
||||
msgctxt "#30668"
|
||||
msgid "Start Offset (seconds)"
|
||||
msgstr "起始偏移(秒)"
|
||||
|
||||
msgctxt "#30669"
|
||||
msgid "End Offset (seconds)"
|
||||
msgstr "结束偏移(秒)"
|
||||
|
||||
msgctxt "#30670"
|
||||
msgid "Intro Skipper"
|
||||
msgstr "简介跳过"
|
||||
|
||||
msgctxt "#30671"
|
||||
msgid "Credit Skipper"
|
||||
msgstr "片头跳过"
|
||||
|
||||
msgctxt "#30673"
|
||||
msgid "Ask"
|
||||
msgstr "询问"
|
||||
|
||||
msgctxt "#30674"
|
||||
msgid "Do Nothing"
|
||||
msgstr "无动作"
|
||||
|
||||
msgctxt "#30675"
|
||||
msgid "Commercial Skipper"
|
||||
msgstr "广告跳过"
|
||||
|
||||
msgctxt "#30677"
|
||||
msgid "Recap Skipper"
|
||||
msgstr "回顾跳过"
|
||||
|
||||
msgctxt "#30676"
|
||||
msgid "Preview Skipper"
|
||||
msgstr "预告跳过"
|
||||
|
||||
msgctxt "#30455"
|
||||
msgid "TV Shows - Random"
|
||||
msgstr "电视节目 - 随机"
|
||||
|
||||
msgctxt "#30456"
|
||||
msgid "All - Random"
|
||||
msgstr "全部 - 随机"
|
||||
|
||||
msgctxt "#30457"
|
||||
msgid "All - Recently Added"
|
||||
msgstr "全部 - 最近添加"
|
||||
|
||||
msgctxt "#30458"
|
||||
msgid "All - Favorites"
|
||||
msgstr "全部 - 收藏夹"
|
||||
|
||||
msgctxt "#30678"
|
||||
msgid "TV Shows per page"
|
||||
msgstr "每页显示的电视节目数量"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -41,6 +41,13 @@ class CacheArtwork(threading.Thread):
|
||||
last_update = 0
|
||||
home_window = HomeWindow()
|
||||
settings = xbmcaddon.Addon()
|
||||
|
||||
# Check if disk caching is disabled
|
||||
disable_disk_cache = settings.getSetting('disable_disk_cache') == 'true'
|
||||
if disable_disk_cache:
|
||||
log.debug("CacheArtwork : Disk caching disabled, artwork caching skipped")
|
||||
return
|
||||
|
||||
latest_content_hash = "never"
|
||||
check_interval = int(settings.getSetting('cacheImagesOnScreenSaver_interval'))
|
||||
check_interval = check_interval * 60
|
||||
|
||||
@@ -54,6 +54,13 @@ class DataManager:
|
||||
log.debug("last_content_url : use_cache={0} url={1}".format(use_cache, url))
|
||||
home_window.set_property("last_content_url", url)
|
||||
|
||||
# Check if disk caching is disabled
|
||||
settings = xbmcaddon.Addon()
|
||||
disable_disk_cache = settings.getSetting('disable_disk_cache') == 'true'
|
||||
if disable_disk_cache:
|
||||
use_cache = False
|
||||
log.debug("Disk caching disabled - data will be kept in RAM only")
|
||||
|
||||
user_id = self.user_details.get('user_id')
|
||||
server = self.api.server
|
||||
|
||||
@@ -164,6 +171,13 @@ class CacheManagerThread(threading.Thread):
|
||||
log.debug("CacheManagerThread : Started")
|
||||
|
||||
home_window = HomeWindow()
|
||||
settings = xbmcaddon.Addon()
|
||||
disable_disk_cache = settings.getSetting('disable_disk_cache') == 'true'
|
||||
|
||||
if disable_disk_cache:
|
||||
log.debug("CacheManagerThread : Disk caching disabled, skipping cache operations")
|
||||
return
|
||||
|
||||
is_fresh = False
|
||||
|
||||
# if the data is fresh then just save it
|
||||
|
||||
@@ -3,9 +3,11 @@ from __future__ import (
|
||||
)
|
||||
|
||||
import xbmcgui
|
||||
import xbmc
|
||||
|
||||
|
||||
from .lazylogger import LazyLogger
|
||||
from .utils import translate_string, send_event_notification
|
||||
from .utils import seconds_to_ticks, ticks_to_seconds, translate_string, send_event_notification
|
||||
|
||||
log = LazyLogger(__name__)
|
||||
|
||||
@@ -206,3 +208,57 @@ class PlayNextDialog(xbmcgui.WindowXMLDialog):
|
||||
|
||||
def get_play_called(self):
|
||||
return self.play_called
|
||||
|
||||
class SkipDialog(xbmcgui.WindowXMLDialog):
|
||||
|
||||
action_exitkeys_id = None
|
||||
media_id = None
|
||||
start = None
|
||||
end = None
|
||||
|
||||
has_been_dissmissed = False
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
log.debug("SkipDialog: __init__")
|
||||
xbmcgui.WindowXML.__init__(self, *args, **kwargs)
|
||||
|
||||
def onInit(self):
|
||||
log.debug("SkipDialog: onInit")
|
||||
self.action_exitkeys_id = [10, 13]
|
||||
|
||||
def onFocus(self, control_id):
|
||||
pass
|
||||
|
||||
def doAction(self, action_id):
|
||||
pass
|
||||
|
||||
def onMessage(self, message):
|
||||
log.debug("SkipDialog: onMessage: {0}".format(message))
|
||||
|
||||
def onAction(self, action):
|
||||
log.debug("SkipDialog: onAction: {0}".format(action.getId()))
|
||||
if action.getId() == 10 or action.getId() == 92: # ACTION_PREVIOUS_MENU & ACTION_NAV_BACK
|
||||
log.debug("SkipDialog: dismissing dialog so it does not open again")
|
||||
self.has_been_dissmissed = True
|
||||
self.close()
|
||||
|
||||
def onClick(self, control_id):
|
||||
log.debug("SkipDialog: onClick: {0}".format(control_id))
|
||||
player = xbmc.Player()
|
||||
current_ticks = seconds_to_ticks(player.getTime())
|
||||
if self.start is not None and self.end is not None and current_ticks >= self.start and current_ticks <= self.end:
|
||||
log.debug("SkipDialog: skipping segment because current ticks ({0}) is in range".format(current_ticks))
|
||||
# If click during segment, skip it
|
||||
player.seekTime(ticks_to_seconds(self.end))
|
||||
|
||||
self.close()
|
||||
|
||||
def get_play_called(self):
|
||||
return self.play_called
|
||||
|
||||
def is_button_shown(self):
|
||||
try:
|
||||
self.getFocus()
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
@@ -8,7 +8,7 @@ import re
|
||||
import xbmcaddon
|
||||
import xbmcplugin
|
||||
import xbmcgui
|
||||
from six.moves.urllib.parse import quote, unquote
|
||||
from six.moves.urllib.parse import quote, unquote, parse_qsl
|
||||
|
||||
from .datamanager import DataManager
|
||||
from .lazylogger import LazyLogger
|
||||
@@ -40,6 +40,7 @@ def get_content(url, params):
|
||||
view_type = ""
|
||||
content_type = ""
|
||||
media_type = str(media_type).lower().strip()
|
||||
url_params = dict(parse_qsl(url))
|
||||
if media_type.startswith("movie"):
|
||||
view_type = "Movies"
|
||||
content_type = 'movies'
|
||||
@@ -88,29 +89,46 @@ def get_content(url, params):
|
||||
progress.update(0, translate_string(30113))
|
||||
|
||||
# update url for paging
|
||||
start_index = 0
|
||||
page_limit = int(settings.getSetting('moviePageSize'))
|
||||
start_index = int(url_params.get("StartIndex", 0))
|
||||
url_limit = url_params.get("Limit")
|
||||
movie_page_limit = int(settings.getSetting('moviePageSize'))
|
||||
show_page_limit = int(settings.getSetting('showPageSize'))
|
||||
url_prev = None
|
||||
url_next = None
|
||||
if page_limit > 0 and media_type.startswith("movie"):
|
||||
m = re.search('StartIndex=([0-9]{1,4})', url)
|
||||
if m and m.group(1):
|
||||
if not url_limit or start_index > 0:
|
||||
if movie_page_limit > 0 and media_type.startswith("movie"):
|
||||
log.debug("UPDATING NEXT URL: {0}".format(url))
|
||||
start_index = int(m.group(1))
|
||||
log.debug("current_start : {0}".format(start_index))
|
||||
if start_index > 0:
|
||||
prev_index = start_index - page_limit
|
||||
prev_index = start_index - movie_page_limit
|
||||
if prev_index < 0:
|
||||
prev_index = 0
|
||||
url_prev = re.sub('StartIndex=([0-9]{1,4})', 'StartIndex=' + str(prev_index), url)
|
||||
url_next = re.sub('StartIndex=([0-9]{1,4})', 'StartIndex=' + str(start_index + page_limit), url)
|
||||
log.debug("UPDATING NEXT URL: {0}".format(url_next))
|
||||
url_next = re.sub('StartIndex=([0-9]{1,4})', 'StartIndex=' + str(start_index + movie_page_limit), url)
|
||||
log.debug("UPDATING NEXT URL: {0}".format(url_next))
|
||||
|
||||
else:
|
||||
log.debug("ADDING NEXT URL: {0}".format(url))
|
||||
url_next = url + "&StartIndex=" + str(start_index + page_limit) + "&Limit=" + str(page_limit)
|
||||
url = url + "&StartIndex=" + str(start_index) + "&Limit=" + str(page_limit)
|
||||
log.debug("ADDING NEXT URL: {0}".format(url_next))
|
||||
else:
|
||||
log.debug("ADDING NEXT URL: {0}".format(url))
|
||||
url_next = url + "&StartIndex=" + str(start_index + movie_page_limit) + "&Limit=" + str(movie_page_limit)
|
||||
url = url + "&StartIndex=" + str(start_index) + "&Limit=" + str(movie_page_limit)
|
||||
log.debug("ADDING NEXT URL: {0}".format(url_next))
|
||||
|
||||
if show_page_limit > 0 and media_type.startswith("tvshow"):
|
||||
log.debug("UPDATING NEXT URL: {0}".format(url))
|
||||
log.debug("current_start : {0}".format(start_index))
|
||||
if start_index > 0:
|
||||
prev_index = start_index - show_page_limit
|
||||
if prev_index < 0:
|
||||
prev_index = 0
|
||||
url_prev = re.sub('StartIndex=([0-9]{1,4})', 'StartIndex=' + str(prev_index), url)
|
||||
url_next = re.sub('StartIndex=([0-9]{1,4})', 'StartIndex=' + str(start_index + show_page_limit), url)
|
||||
log.debug("UPDATING NEXT URL: {0}".format(url_next))
|
||||
|
||||
else:
|
||||
log.debug("ADDING NEXT URL: {0}".format(url))
|
||||
url_next = url + "&StartIndex=" + str(start_index + show_page_limit) + "&Limit=" + str(show_page_limit)
|
||||
url = url + "&StartIndex=" + str(start_index) + "&Limit=" + str(show_page_limit)
|
||||
log.debug("ADDING NEXT URL: {0}".format(url_next))
|
||||
|
||||
use_cache = params.get("use_cache", "true") == "true"
|
||||
|
||||
@@ -120,24 +138,43 @@ def get_content(url, params):
|
||||
|
||||
log.debug("total_records: {0}".format(total_records))
|
||||
|
||||
# add paging items
|
||||
if page_limit > 0 and media_type.startswith("movie"):
|
||||
if url_prev:
|
||||
list_item = xbmcgui.ListItem("Prev Page (" + str(start_index - page_limit + 1) + "-" + str(start_index) +
|
||||
" of " + str(total_records) + ")")
|
||||
u = sys.argv[0] + "?url=" + quote(url_prev) + "&mode=GET_CONTENT&media_type=movies"
|
||||
log.debug("ADDING PREV ListItem: {0} - {1}".format(u, list_item))
|
||||
dir_items.insert(0, (u, list_item, True))
|
||||
if not url_limit or start_index > 0:
|
||||
# add paging items
|
||||
if movie_page_limit > 0 and media_type.startswith("movie"):
|
||||
if url_prev:
|
||||
list_item = xbmcgui.ListItem("Prev Page (" + str(start_index - movie_page_limit + 1) + "-" + str(start_index) +
|
||||
" of " + str(total_records) + ")")
|
||||
u = sys.argv[0] + "?url=" + quote(url_prev) + "&mode=GET_CONTENT&media_type=movies"
|
||||
log.debug("ADDING PREV ListItem: {0} - {1}".format(u, list_item))
|
||||
dir_items.insert(0, (u, list_item, True))
|
||||
|
||||
if start_index + page_limit < total_records:
|
||||
upper_count = start_index + (page_limit * 2)
|
||||
if upper_count > total_records:
|
||||
upper_count = total_records
|
||||
list_item = xbmcgui.ListItem("Next Page (" + str(start_index + page_limit + 1) + "-" +
|
||||
str(upper_count) + " of " + str(total_records) + ")")
|
||||
u = sys.argv[0] + "?url=" + quote(url_next) + "&mode=GET_CONTENT&media_type=movies"
|
||||
log.debug("ADDING NEXT ListItem: {0} - {1}".format(u, list_item))
|
||||
dir_items.append((u, list_item, True))
|
||||
if start_index + movie_page_limit < total_records:
|
||||
upper_count = start_index + (movie_page_limit * 2)
|
||||
if upper_count > total_records:
|
||||
upper_count = total_records
|
||||
list_item = xbmcgui.ListItem("Next Page (" + str(start_index + movie_page_limit + 1) + "-" +
|
||||
str(upper_count) + " of " + str(total_records) + ")")
|
||||
u = sys.argv[0] + "?url=" + quote(url_next) + "&mode=GET_CONTENT&media_type=movies"
|
||||
log.debug("ADDING NEXT ListItem: {0} - {1}".format(u, list_item))
|
||||
dir_items.append((u, list_item, True))
|
||||
# add paging items
|
||||
if show_page_limit > 0 and media_type.startswith("tvshow"):
|
||||
if url_prev:
|
||||
list_item = xbmcgui.ListItem("Prev Page (" + str(start_index - show_page_limit + 1) + "-" + str(start_index) +
|
||||
" of " + str(total_records) + ")")
|
||||
u = sys.argv[0] + "?url=" + quote(url_prev) + "&mode=GET_CONTENT&media_type=tvshows"
|
||||
log.debug("ADDING PREV ListItem: {0} - {1}".format(u, list_item))
|
||||
dir_items.insert(0, (u, list_item, True))
|
||||
|
||||
if start_index + show_page_limit < total_records:
|
||||
upper_count = start_index + (show_page_limit * 2)
|
||||
if upper_count > total_records:
|
||||
upper_count = total_records
|
||||
list_item = xbmcgui.ListItem("Next Page (" + str(start_index + show_page_limit + 1) + "-" +
|
||||
str(upper_count) + " of " + str(total_records) + ")")
|
||||
u = sys.argv[0] + "?url=" + quote(url_next) + "&mode=GET_CONTENT&media_type=tvshows"
|
||||
log.debug("ADDING NEXT ListItem: {0} - {1}".format(u, list_item))
|
||||
dir_items.append((u, list_item, True))
|
||||
|
||||
# set the Kodi content type
|
||||
if content_type:
|
||||
@@ -154,7 +191,9 @@ def get_content(url, params):
|
||||
xbmcplugin.setContent(pluginhandle, content_type)
|
||||
|
||||
# set the sort items
|
||||
if page_limit > 0 and media_type.startswith("movie"):
|
||||
if movie_page_limit > 0 and media_type.startswith("movie"):
|
||||
xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_UNSORTED)
|
||||
elif show_page_limit > 0 and media_type.startswith("tvshow"):
|
||||
xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_UNSORTED)
|
||||
else:
|
||||
set_sort(pluginhandle, view_type, default_sort)
|
||||
@@ -302,9 +341,10 @@ def process_directory(url, progress, params, use_cache_data=False):
|
||||
|
||||
detected_type = None
|
||||
dir_items = []
|
||||
|
||||
OnlyTotallyUnwatchedTvShow = params.get("OnlyTotallyUnwatchedTvShow", None)
|
||||
for item_details in item_list:
|
||||
|
||||
if OnlyTotallyUnwatchedTvShow == "1" and item_details.watched_episodes > 0:
|
||||
continue
|
||||
item_details.total_items = item_count
|
||||
|
||||
if progress is not None:
|
||||
|
||||
@@ -41,16 +41,22 @@ from .tracking import timer
|
||||
from .skin_cloner import clone_default_skin
|
||||
from .play_utils import play_file
|
||||
|
||||
__addon__ = xbmcaddon.Addon()
|
||||
__addondir__ = translate_path(__addon__.getAddonInfo('profile'))
|
||||
__cwd__ = __addon__.getAddonInfo('path')
|
||||
PLUGINPATH = translate_path(os.path.join(__cwd__))
|
||||
addon_id = __addon__.getAddonInfo('id')
|
||||
try:
|
||||
__addon__ = xbmcaddon.Addon()
|
||||
__addondir__ = translate_path(__addon__.getAddonInfo('profile'))
|
||||
__cwd__ = __addon__.getAddonInfo('path')
|
||||
PLUGINPATH = translate_path(os.path.join(__cwd__))
|
||||
addon_id = __addon__.getAddonInfo('id')
|
||||
except Exception:
|
||||
# During installation/update, addon might not be fully registered yet
|
||||
__addon__ = None
|
||||
__addondir__ = ''
|
||||
__cwd__ = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
PLUGINPATH = __cwd__
|
||||
addon_id = 'plugin.video.jellycon'
|
||||
|
||||
log = LazyLogger(__name__)
|
||||
|
||||
user_details = load_user_details()
|
||||
|
||||
|
||||
@timer
|
||||
def main_entry_point():
|
||||
@@ -119,7 +125,8 @@ def main_entry_point():
|
||||
elif mode == "CLONE_SKIN":
|
||||
clone_default_skin()
|
||||
elif mode == "SHOW_SETTINGS":
|
||||
__addon__.openSettings()
|
||||
addon = xbmcaddon.Addon()
|
||||
addon.openSettings()
|
||||
window = xbmcgui.getCurrentWindowId()
|
||||
if window == 10000:
|
||||
log.debug(
|
||||
@@ -252,23 +259,23 @@ def unmark_item_favorite(item_id):
|
||||
|
||||
|
||||
def delete(item_id):
|
||||
|
||||
item = api.delete("/Users/{}/Items/{}".format(api.user_id, item_id))
|
||||
item = api.get("/Users/{}/Items/{}".format(api.user_id, item_id))
|
||||
|
||||
item_id = item.get("Id")
|
||||
item_name = item.get("Name", "")
|
||||
series_name = item.get("SeriesName", "")
|
||||
ep_number = item.get("IndexNumber", -1)
|
||||
|
||||
final_name = ""
|
||||
final_name_parts = []
|
||||
|
||||
if series_name:
|
||||
final_name += "{} -".format(series_name)
|
||||
final_name_parts.append(series_name)
|
||||
|
||||
if ep_number != -1:
|
||||
final_name += "Episode {:02d} - ".format(ep_number)
|
||||
final_name_parts.append("Episode {:02d}".format(ep_number))
|
||||
|
||||
final_name += item_name
|
||||
final_name_parts.append(item_name)
|
||||
final_name = " - ".join(final_name_parts)
|
||||
|
||||
if not item.get("CanDelete", False):
|
||||
xbmcgui.Dialog().ok(
|
||||
@@ -343,6 +350,12 @@ def show_menu(params):
|
||||
li.setProperty('menu_id', 'play')
|
||||
action_items.append(li)
|
||||
|
||||
# Add "Play with track selection" for Movies and Episodes
|
||||
if result["Type"] in ["Episode", "Movie"]:
|
||||
li = xbmcgui.ListItem(translate_string(30701), offscreen=True)
|
||||
li.setProperty('menu_id', 'play_with_track_selection')
|
||||
action_items.append(li)
|
||||
|
||||
if result["Type"] in ["Season", "MusicArtist", "MusicAlbum", "Playlist",
|
||||
"MusicGenre"]:
|
||||
li = xbmcgui.ListItem(translate_string(30317), offscreen=True)
|
||||
@@ -473,6 +486,11 @@ def show_menu(params):
|
||||
log.debug("Play Item")
|
||||
play_action(params)
|
||||
|
||||
elif selected_action == "play_with_track_selection":
|
||||
log.debug("Play Item with Track Selection")
|
||||
params["force_track_selection"] = "true"
|
||||
play_action(params)
|
||||
|
||||
elif selected_action == "set_view":
|
||||
log.debug("Setting view type for {0} to {1}".format(
|
||||
view_key, container_view_id)
|
||||
@@ -923,6 +941,9 @@ def play_action(params):
|
||||
audio_stream_index = params.get("audio_stream_index")
|
||||
log.debug("audio_stream_index: {0}".format(audio_stream_index))
|
||||
|
||||
force_track_selection = params.get("force_track_selection", "false") == "true"
|
||||
log.debug("force_track_selection: {0}".format(force_track_selection))
|
||||
|
||||
action = params.get("action", "play")
|
||||
|
||||
# set the current playing item id
|
||||
@@ -939,13 +960,18 @@ def play_action(params):
|
||||
play_info["media_source_id"] = media_source_id
|
||||
play_info["subtitle_stream_index"] = subtitle_stream_index
|
||||
play_info["audio_stream_index"] = audio_stream_index
|
||||
play_info["force_track_selection"] = force_track_selection
|
||||
log.info("Sending jellycon_play_action : {0}".format(play_info))
|
||||
play_file(play_info)
|
||||
|
||||
|
||||
def play_item_trailer(item_id):
|
||||
log.debug("== ENTER: playTrailer ==")
|
||||
handle = int(sys.argv[1]) if sys.argv and len(sys.argv) > 1 else -1
|
||||
if handle != -1:
|
||||
xbmcplugin.endOfDirectory(handle, succeeded=False, updateListing=False, cacheToDisc=False)
|
||||
|
||||
user_details = load_user_details()
|
||||
url = "/Users/{}/Items/{}/LocalTrailers?format=json".format(
|
||||
user_details.get('user_id'), item_id
|
||||
)
|
||||
@@ -1021,7 +1047,7 @@ def play_item_trailer(item_id):
|
||||
elif trailer.get("type") == "remote":
|
||||
youtube_id = trailer.get("url").rsplit('=', 1)[1]
|
||||
url_root = "plugin.video.youtube/play/?video_id="
|
||||
play_url = "RunPlugin(plugin://{}{})".format(url_root, youtube_id)
|
||||
play_url = "PlayMedia(plugin://{}{})".format(url_root, youtube_id)
|
||||
log.debug("youtube_plugin: {0}".format(play_url))
|
||||
|
||||
xbmc.executebuiltin(play_url)
|
||||
|
||||
158
resources/lib/intro_skipper.py
Normal file
158
resources/lib/intro_skipper.py
Normal file
@@ -0,0 +1,158 @@
|
||||
from __future__ import (
|
||||
division, absolute_import, print_function, unicode_literals
|
||||
)
|
||||
|
||||
import os
|
||||
import threading
|
||||
|
||||
import xbmc
|
||||
import xbmcaddon
|
||||
import xbmcgui
|
||||
|
||||
from resources.lib.play_utils import get_media_segments
|
||||
from resources.lib.utils import seconds_to_ticks, ticks_to_seconds, translate_path
|
||||
from resources.lib.intro_skipper_utils import get_setting_skip_action, set_correct_skip_info
|
||||
|
||||
|
||||
from .lazylogger import LazyLogger
|
||||
from .dialogs import SkipDialog
|
||||
|
||||
from typing import Literal
|
||||
|
||||
log = LazyLogger(__name__)
|
||||
|
||||
|
||||
class IntroSkipperService(threading.Thread):
|
||||
|
||||
stop_thread = False
|
||||
monitor = None
|
||||
|
||||
def __init__(self, play_monitor):
|
||||
super(IntroSkipperService, self).__init__()
|
||||
self.monitor = play_monitor
|
||||
|
||||
def run(self):
|
||||
|
||||
from .play_utils import get_jellyfin_playing_item
|
||||
settings = xbmcaddon.Addon()
|
||||
plugin_path = settings.getAddonInfo('path')
|
||||
plugin_path_real = translate_path(os.path.join(plugin_path))
|
||||
|
||||
skip_intro_dialog = None
|
||||
skip_credit_dialog = None
|
||||
skip_commercial_dialog = None
|
||||
skip_preview_dialog = None
|
||||
skip_recap_dialog = None
|
||||
|
||||
segments = None
|
||||
playing_item_id = None
|
||||
|
||||
log.debug("SkipService: starting service")
|
||||
|
||||
while not xbmc.Monitor().abortRequested() and not self.stop_thread:
|
||||
player = xbmc.Player()
|
||||
if player.isPlaying():
|
||||
item_id = get_jellyfin_playing_item()
|
||||
if item_id is not None:
|
||||
log.debug("SkipService: playing item is from jellyfin : {0}".format(item_id))
|
||||
|
||||
# If item id has changed or is new, retrieve segments
|
||||
if playing_item_id is None or playing_item_id != item_id :
|
||||
log.debug("SkipService: item is new, retrieving media segments : {0}".format(item_id))
|
||||
segments = get_media_segments(item_id)
|
||||
|
||||
# Setting global playing item to current playing item
|
||||
playing_item_id = item_id
|
||||
|
||||
# Handle skip only on jellyfin items
|
||||
current_ticks = seconds_to_ticks(player.getTime())
|
||||
|
||||
# Handle Intros
|
||||
skip_intro_dialog = self.handle_dialog(plugin_path_real, skip_intro_dialog, item_id, current_ticks, player, segments, "Intro")
|
||||
# Handle Credits
|
||||
skip_credit_dialog = self.handle_dialog(plugin_path_real, skip_credit_dialog, item_id, current_ticks, player, segments, "Outro")
|
||||
# Handle commercial
|
||||
skip_commercial_dialog = self.handle_dialog(plugin_path_real, skip_commercial_dialog, item_id, current_ticks, player, segments, "Commercial")
|
||||
# Handle preview
|
||||
skip_preview_dialog = self.handle_dialog(plugin_path_real, skip_preview_dialog, item_id, current_ticks, player, segments, "Preview")
|
||||
# Handle recap
|
||||
skip_recap_dialog = self.handle_dialog(plugin_path_real, skip_recap_dialog, item_id, current_ticks, player, segments, "Recap")
|
||||
|
||||
else:
|
||||
playing_item_id = None
|
||||
if skip_intro_dialog is not None:
|
||||
log.debug("SkipService: Playback stopped, killing Intro dialog")
|
||||
skip_intro_dialog.close()
|
||||
skip_intro_dialog = None
|
||||
|
||||
if skip_credit_dialog is not None:
|
||||
log.debug("SkipService: Playback stopped, killing Outro dialog")
|
||||
skip_credit_dialog.close()
|
||||
skip_credit_dialog = None
|
||||
|
||||
if skip_commercial_dialog is not None:
|
||||
log.debug("SkipService: Playback stopped, killing Commercial dialog")
|
||||
skip_commercial_dialog.close()
|
||||
skip_commercial_dialog = None
|
||||
|
||||
if skip_preview_dialog is not None:
|
||||
log.debug("SkipService: Playback stopped, killing Preview dialog")
|
||||
skip_preview_dialog.close()
|
||||
skip_preview_dialog = None
|
||||
|
||||
if skip_recap_dialog is not None:
|
||||
log.debug("SkipService: Playback stopped, killing Recap dialog")
|
||||
skip_recap_dialog.close()
|
||||
skip_recap_dialog = None
|
||||
|
||||
if xbmc.Monitor().waitForAbort(1):
|
||||
break
|
||||
|
||||
xbmc.sleep(200)
|
||||
|
||||
|
||||
def handle_dialog(self, plugin_path_real: str, dialog: SkipDialog, item_id: str, current_ticks: float, player: xbmc.Player, segments, type: Literal["Commercial", "Preview", "Recap", "Outro", "Intro"]):
|
||||
skip_action = get_setting_skip_action(type)
|
||||
|
||||
# In case do nothing is selected return
|
||||
if skip_action == "2":
|
||||
log.debug("SkipService: ignore {0} is selected".format(type))
|
||||
return None
|
||||
|
||||
if dialog is None:
|
||||
log.debug("SkipService: init dialog")
|
||||
dialog = SkipDialog("SkipDialog.xml", plugin_path_real, "default", "720p")
|
||||
|
||||
set_correct_skip_info(item_id, dialog, segments, type)
|
||||
|
||||
is_segment = False
|
||||
if dialog.start is not None and dialog.end is not None:
|
||||
# Resets the dismiss var so that button can reappear in case of navigation in the timecodes
|
||||
if (current_ticks < dialog.start or current_ticks > dialog.end) and dialog.has_been_dissmissed is True:
|
||||
log.debug("SkipService: {0} skip was dismissed. It is reset beacause timecode is outside of segment")
|
||||
dialog.has_been_dissmissed = False
|
||||
|
||||
# Checks if segment is playing
|
||||
is_segment = current_ticks >= dialog.start and current_ticks <= dialog.end
|
||||
|
||||
if skip_action == "1" and is_segment:
|
||||
log.debug("SkipService: {0} is set to automatic skip, skipping segment".format(type))
|
||||
# If auto skip is enabled, skips to semgent ends automatically
|
||||
player.seekTime(ticks_to_seconds(dialog.end))
|
||||
xbmcgui.Dialog().notification("JellyCon", "{0} Skipped".format(type))
|
||||
elif skip_action == "0":
|
||||
# Otherwise show skip dialog
|
||||
if is_segment and not dialog.has_been_dissmissed:
|
||||
log.debug("SkipService: {0} is playing, showing dialog".format(type))
|
||||
dialog.show()
|
||||
else:
|
||||
# Could not find doc on what happens when closing a closed dialog, but it seems fine
|
||||
log.debug("SkipService: {0} is not playing, closing dialog".format(type))
|
||||
dialog.close()
|
||||
|
||||
return dialog
|
||||
|
||||
|
||||
def stop_service(self):
|
||||
log.debug("IntroSkipperService Stop Called")
|
||||
self.stop_thread = True
|
||||
72
resources/lib/intro_skipper_utils.py
Normal file
72
resources/lib/intro_skipper_utils.py
Normal file
@@ -0,0 +1,72 @@
|
||||
from typing import Literal
|
||||
|
||||
import xbmcaddon
|
||||
|
||||
from .lazylogger import LazyLogger
|
||||
from .dialogs import SkipDialog
|
||||
|
||||
from .utils import seconds_to_ticks
|
||||
|
||||
log = LazyLogger(__name__)
|
||||
|
||||
def get_setting_skip_action(type: Literal["Commercial", "Preview", "Recap", "Outro", "Intro"]):
|
||||
settings = xbmcaddon.Addon()
|
||||
if (type == "Commercial"):
|
||||
return settings.getSetting("commercial_skipper_action")
|
||||
elif (type == "Preview"):
|
||||
return settings.getSetting("preview_skipper_action")
|
||||
elif (type == "Recap"):
|
||||
return settings.getSetting("recap_skipper_action")
|
||||
elif (type == "Outro"):
|
||||
return settings.getSetting("credit_skipper_action")
|
||||
elif (type == "Intro"):
|
||||
return settings.getSetting("intro_skipper_action")
|
||||
return ""
|
||||
|
||||
def get_setting_skip_start_offset(type: Literal["Commercial", "Preview", "Recap", "Outro", "Intro"]):
|
||||
settings = xbmcaddon.Addon()
|
||||
if (type == "Commercial"):
|
||||
return settings.getSettingInt("commercial_skipper_start_offset")
|
||||
elif (type == "Preview"):
|
||||
return settings.getSettingInt("preview_skipper_start_offset")
|
||||
elif (type == "Recap"):
|
||||
return settings.getSettingInt("recap_skipper_start_offset")
|
||||
elif (type == "Outro"):
|
||||
return settings.getSettingInt("credit_skipper_start_offset")
|
||||
elif (type == "Intro"):
|
||||
return settings.getSettingInt("intro_skipper_start_offset")
|
||||
return 0
|
||||
|
||||
def get_setting_skip_end_offset(type: Literal["Commercial", "Preview", "Recap", "Outro", "Intro"]):
|
||||
settings = xbmcaddon.Addon()
|
||||
if (type == "Commercial"):
|
||||
return settings.getSettingInt("commercial_skipper_end_offset")
|
||||
elif (type == "Preview"):
|
||||
return settings.getSettingInt("preview_skipper_end_offset")
|
||||
elif (type == "Recap"):
|
||||
return settings.getSettingInt("recap_skipper_end_offset")
|
||||
elif (type == "Outro"):
|
||||
return settings.getSettingInt("credit_skipper_end_offset")
|
||||
elif (type == "Intro"):
|
||||
return settings.getSettingInt("intro_skipper_end_offset")
|
||||
return 0
|
||||
|
||||
def set_correct_skip_info(item_id: str, skip_dialog: SkipDialog, segments, type: Literal["Commercial", "Preview", "Recap", "Outro", "Intro"]):
|
||||
if (skip_dialog.media_id is None or skip_dialog.media_id != item_id) and item_id is not None:
|
||||
# If playback item has changed (or is new), sets its id and set media segments info
|
||||
log.debug("SkipDialogInfo : Media Id has changed to {0}, setting segments".format(item_id))
|
||||
skip_dialog.media_id = item_id
|
||||
skip_dialog.has_been_dissmissed = False
|
||||
if segments is not None:
|
||||
# Find the intro and outro timings
|
||||
start = next((segment["StartTicks"] for segment in segments if segment["Type"] == type), None)
|
||||
end = next((segment["EndTicks"] for segment in segments if segment["Type"] == type), None)
|
||||
|
||||
# Sets timings with offsets if defined in settings
|
||||
if start is not None:
|
||||
skip_dialog.start = start + seconds_to_ticks(get_setting_skip_start_offset(type))
|
||||
log.debug("SkipDialogInfo : Setting {0} start to {1}".format(type, skip_dialog.start))
|
||||
if end is not None:
|
||||
skip_dialog.end = end - seconds_to_ticks(get_setting_skip_end_offset(type))
|
||||
log.debug("SkipDialogInfo : Setting {0} end to {1}".format(type, skip_dialog.end))
|
||||
|
||||
@@ -11,7 +11,6 @@ import xbmcaddon
|
||||
from .lazylogger import LazyLogger
|
||||
|
||||
log = LazyLogger(__name__)
|
||||
addon = xbmcaddon.Addon()
|
||||
|
||||
|
||||
class HomeWindow:
|
||||
@@ -41,6 +40,7 @@ def add_menu_directory_item(label, path, folder=True, art=None, properties=None)
|
||||
li = xbmcgui.ListItem(label, path=path, offscreen=True)
|
||||
if art is None:
|
||||
art = {}
|
||||
addon = xbmcaddon.Addon()
|
||||
art["thumb"] = addon.getAddonInfo('icon')
|
||||
if properties is not None:
|
||||
li.setProperties(properties)
|
||||
|
||||
@@ -12,8 +12,13 @@ from kodi_six import xbmc, xbmcaddon
|
||||
|
||||
from .utils import translate_path
|
||||
|
||||
__addon__ = xbmcaddon.Addon(id='plugin.video.jellycon')
|
||||
__pluginpath__ = translate_path(__addon__.getAddonInfo('path'))
|
||||
try:
|
||||
__addon__ = xbmcaddon.Addon(id='plugin.video.jellycon')
|
||||
__pluginpath__ = translate_path(__addon__.getAddonInfo('path'))
|
||||
except Exception:
|
||||
# During installation/update, addon might not be fully registered yet
|
||||
__addon__ = None
|
||||
__pluginpath__ = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
|
||||
def getLogger(name=None):
|
||||
@@ -32,27 +37,36 @@ class LogHandler(logging.StreamHandler):
|
||||
|
||||
self.sensitive = {'Token': [], 'Server': []}
|
||||
|
||||
settings = xbmcaddon.Addon()
|
||||
self.server = settings.getSetting('server_address')
|
||||
self.debug = settings.getSetting('log_debug')
|
||||
try:
|
||||
settings = xbmcaddon.Addon()
|
||||
self.server = settings.getSetting('server_address')
|
||||
self.debug = settings.getSetting('log_debug')
|
||||
except Exception:
|
||||
# During installation/update, settings might not be available yet
|
||||
self.server = ''
|
||||
self.debug = 'false'
|
||||
|
||||
def emit(self, record):
|
||||
|
||||
if self._get_log_level(record.levelno):
|
||||
string = self.format(record)
|
||||
try:
|
||||
string = self.format(record)
|
||||
|
||||
# Hide server URL in logs
|
||||
string = string.replace(
|
||||
self.server or "{server}", "{jellyfin-server}"
|
||||
)
|
||||
# Hide server URL in logs
|
||||
string = string.replace(
|
||||
self.server or "{server}", "{jellyfin-server}"
|
||||
)
|
||||
|
||||
py_version = sys.version_info.major
|
||||
# Log level notation changed in Kodi v19
|
||||
if py_version > 2:
|
||||
log_level = xbmc.LOGINFO
|
||||
else:
|
||||
log_level = xbmc.LOGNOTICE
|
||||
xbmc.log(string, level=log_level)
|
||||
py_version = sys.version_info.major
|
||||
# Log level notation changed in Kodi v19
|
||||
if py_version > 2:
|
||||
log_level = xbmc.LOGINFO
|
||||
else:
|
||||
log_level = xbmc.LOGNOTICE
|
||||
xbmc.log(string, level=log_level)
|
||||
except Exception:
|
||||
# Silently fail if logging is disabled globally in Kodi
|
||||
pass
|
||||
|
||||
def _get_log_level(self, level):
|
||||
|
||||
@@ -92,13 +106,16 @@ class MyFormatter(logging.Formatter):
|
||||
return result
|
||||
|
||||
def formatException(self, exc_info):
|
||||
_pluginpath_real = os.path.realpath(__pluginpath__)
|
||||
try:
|
||||
_pluginpath_real = os.path.realpath(__pluginpath__)
|
||||
except Exception:
|
||||
_pluginpath_real = None
|
||||
res = []
|
||||
|
||||
for o in traceback.format_exception(*exc_info):
|
||||
o = ensure_text(o, get_filesystem_encoding())
|
||||
|
||||
if o.startswith(' File "'):
|
||||
if _pluginpath_real and o.startswith(' File "'):
|
||||
"""
|
||||
If this split can't handle your file names,
|
||||
you should seriously consider renaming your files.
|
||||
@@ -114,7 +131,10 @@ class MyFormatter(logging.Formatter):
|
||||
|
||||
def _gen_rel_path(self, record):
|
||||
if record.pathname:
|
||||
record.relpath = os.path.relpath(record.pathname, __pluginpath__)
|
||||
try:
|
||||
record.relpath = os.path.relpath(record.pathname, __pluginpath__)
|
||||
except Exception:
|
||||
record.relpath = record.pathname
|
||||
|
||||
|
||||
def get_filesystem_encoding():
|
||||
|
||||
@@ -11,11 +11,12 @@ import xbmcaddon
|
||||
from six import ensure_binary, ensure_text
|
||||
from six.moves.urllib.parse import quote
|
||||
|
||||
from .dir_functions import get_content
|
||||
from .jellyfin import api
|
||||
from .kodi_utils import add_menu_directory_item, HomeWindow
|
||||
from .lazylogger import LazyLogger
|
||||
from .utils import (
|
||||
get_jellyfin_url, translate_string, get_art_url,
|
||||
get_filtered_items_count_text, get_jellyfin_url, translate_string, get_art_url,
|
||||
get_default_filters, get_current_user_id
|
||||
)
|
||||
from .item_functions import get_art
|
||||
@@ -573,6 +574,10 @@ def display_main_menu():
|
||||
handle = int(sys.argv[1])
|
||||
xbmcplugin.setContent(handle, 'files')
|
||||
|
||||
if settings.getSetting("interface_mode") == "1":
|
||||
display_library_views(None)
|
||||
return
|
||||
|
||||
add_menu_directory_item(translate_string(30406),
|
||||
"plugin://plugin.video.jellycon/?mode=SHOW_ADDON_MENU&type=library")
|
||||
add_menu_directory_item(translate_string(30407),
|
||||
@@ -654,7 +659,7 @@ def display_homevideos_type(menu_params, view):
|
||||
params["Limit"] = item_limit
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=homevideos"
|
||||
add_menu_directory_item(view_name + translate_string(30267) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30267) + get_filtered_items_count_text(), url)
|
||||
|
||||
# Recently added
|
||||
params = {}
|
||||
@@ -668,7 +673,7 @@ def display_homevideos_type(menu_params, view):
|
||||
params["Limit"] = item_limit
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=homevideos"
|
||||
add_menu_directory_item(view_name + translate_string(30268) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30268) + get_filtered_items_count_text(), url)
|
||||
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
|
||||
@@ -709,6 +714,11 @@ def display_tvshow_type(menu_params, view):
|
||||
if view is not None:
|
||||
base_params["ParentId"] = view.get("Id")
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", base_params)
|
||||
|
||||
if settings.getSetting("interface_mode") == "1":
|
||||
get_content(path, { "media_type": "tvshows" })
|
||||
return
|
||||
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=tvshows"
|
||||
add_menu_directory_item(view_name + translate_string(30405), url)
|
||||
|
||||
@@ -728,6 +738,14 @@ def display_tvshow_type(menu_params, view):
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=tvshows"
|
||||
add_menu_directory_item(view_name + translate_string(30285), url)
|
||||
|
||||
# Totally unwatched tv shows
|
||||
params = {}
|
||||
params.update(base_params)
|
||||
params["IsPlayed"] = False
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=tvshows&OnlyTotallyUnwatchedTvShow=1"
|
||||
add_menu_directory_item(view_name + translate_string(30454), url)
|
||||
|
||||
# In progress episodes
|
||||
params = {}
|
||||
params.update(base_params)
|
||||
@@ -739,7 +757,7 @@ def display_tvshow_type(menu_params, view):
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=Episodes&sort=none"
|
||||
url += "&name_format=" + quote('Episode|episode_name_format')
|
||||
add_menu_directory_item(view_name + translate_string(30267) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30267) + get_filtered_items_count_text(), url)
|
||||
|
||||
# Latest Episodes
|
||||
params = {}
|
||||
@@ -750,7 +768,7 @@ def display_tvshow_type(menu_params, view):
|
||||
params["IncludeItemTypes"] = "Episode"
|
||||
path = get_jellyfin_url("/Users/{userid}/Items/Latest", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=tvshows&sort=none"
|
||||
add_menu_directory_item(view_name + translate_string(30288) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30288) + get_filtered_items_count_text(), url)
|
||||
|
||||
# Recently Added
|
||||
params = {}
|
||||
@@ -763,7 +781,7 @@ def display_tvshow_type(menu_params, view):
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=Episodes&sort=none"
|
||||
url += "&name_format=" + quote('Episode|episode_name_format')
|
||||
add_menu_directory_item(view_name + translate_string(30268) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30268) + get_filtered_items_count_text(), url)
|
||||
|
||||
# Next Up Episodes
|
||||
params = {}
|
||||
@@ -777,7 +795,7 @@ def display_tvshow_type(menu_params, view):
|
||||
path = get_jellyfin_url("/Shows/NextUp", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=Episodes&sort=none"
|
||||
url += "&name_format=" + quote('Episode|episode_name_format')
|
||||
add_menu_directory_item(view_name + translate_string(30278) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30278) + get_filtered_items_count_text(), url)
|
||||
|
||||
# TV Show Genres
|
||||
path = "plugin://plugin.video.jellycon/?mode=GENRES&item_type=tvshow"
|
||||
@@ -808,6 +826,11 @@ def display_music_type(menu_params, view):
|
||||
"IncludeItemTypes": "MusicAlbum"
|
||||
}
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
|
||||
if settings.getSetting("interface_mode") == "1":
|
||||
get_content(path, { "media_type": "MusicAlbums" })
|
||||
return
|
||||
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=MusicAlbums"
|
||||
add_menu_directory_item(view_name + translate_string(30320), url)
|
||||
|
||||
@@ -820,7 +843,7 @@ def display_music_type(menu_params, view):
|
||||
}
|
||||
path = get_jellyfin_url("/Users/{userid}/Items/Latest", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=MusicAlbums"
|
||||
add_menu_directory_item(view_name + translate_string(30268) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30268) + get_filtered_items_count_text(), url)
|
||||
|
||||
# recently played
|
||||
params = {
|
||||
@@ -835,7 +858,7 @@ def display_music_type(menu_params, view):
|
||||
}
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=MusicAlbum"
|
||||
add_menu_directory_item(view_name + translate_string(30349) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30349) + get_filtered_items_count_text(), url)
|
||||
|
||||
# most played
|
||||
params = {
|
||||
@@ -850,7 +873,7 @@ def display_music_type(menu_params, view):
|
||||
}
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=MusicAlbum"
|
||||
add_menu_directory_item(view_name + translate_string(30353) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30353) + get_filtered_items_count_text(), url)
|
||||
|
||||
# artists
|
||||
params = {
|
||||
@@ -976,6 +999,11 @@ def display_movies_type(menu_params, view):
|
||||
|
||||
# All Movies
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", base_params)
|
||||
|
||||
if settings.getSetting("interface_mode") == "1":
|
||||
get_content(path, { "media_type": "movies" })
|
||||
return
|
||||
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=movies"
|
||||
add_menu_directory_item('{}{}'.format(view_name, translate_string(30405)), url)
|
||||
|
||||
@@ -1010,7 +1038,7 @@ def display_movies_type(menu_params, view):
|
||||
params["Limit"] = item_limit
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=movies&sort=none"
|
||||
add_menu_directory_item('{}{} ({})'.format(view_name, translate_string(30349), item_limit), url)
|
||||
add_menu_directory_item(('{}{}{}').format(view_name, translate_string(30349), get_filtered_items_count_text()), url)
|
||||
|
||||
# Resumable Movies
|
||||
params = {}
|
||||
@@ -1021,7 +1049,7 @@ def display_movies_type(menu_params, view):
|
||||
params["Limit"] = item_limit
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=movies&sort=none"
|
||||
add_menu_directory_item('{}{} ({})'.format(view_name, translate_string(30267), item_limit), url)
|
||||
add_menu_directory_item(('{}{}{}').format(view_name, translate_string(30267), get_filtered_items_count_text()), url)
|
||||
|
||||
# Recently Added Movies
|
||||
params = {}
|
||||
@@ -1034,7 +1062,7 @@ def display_movies_type(menu_params, view):
|
||||
params["Limit"] = item_limit
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=movies&sort=none"
|
||||
add_menu_directory_item('{}{} ({})'.format(view_name, translate_string(30268), item_limit), url)
|
||||
add_menu_directory_item(('{}{}{}').format(view_name, translate_string(30268), get_filtered_items_count_text()), url)
|
||||
|
||||
# Collections
|
||||
params = {}
|
||||
@@ -1113,6 +1141,11 @@ def display_mixed_type(params, view):
|
||||
if view is not None:
|
||||
base_params["ParentId"] = view.get("Id")
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", base_params)
|
||||
|
||||
if settings.getSetting("interface_mode") == "1":
|
||||
get_content(path, { "media_type": "mixed" })
|
||||
return
|
||||
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=mixed"
|
||||
add_menu_directory_item(view_name + translate_string(30405), url)
|
||||
|
||||
@@ -1143,7 +1176,7 @@ def display_mixed_type(params, view):
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=mixed&sort=none"
|
||||
url += "&name_format=" + quote('Episode|episode_name_format')
|
||||
add_menu_directory_item(view_name + translate_string(30267) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30267) + get_filtered_items_count_text(), url)
|
||||
|
||||
# Latest mixed
|
||||
params = {}
|
||||
@@ -1154,7 +1187,7 @@ def display_mixed_type(params, view):
|
||||
params["IncludeItemTypes"] = "Episode"
|
||||
path = get_jellyfin_url("/Users/{userid}/Items/Latest", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=mixed&sort=none"
|
||||
add_menu_directory_item(view_name + translate_string(30288) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30288) + get_filtered_items_count_text(), url)
|
||||
|
||||
# Recently Added
|
||||
params = {}
|
||||
@@ -1167,7 +1200,7 @@ def display_mixed_type(params, view):
|
||||
path = get_jellyfin_url("/Users/{userid}/Items", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=mixed&sort=none"
|
||||
url += "&name_format=" + quote('Episode|episode_name_format')
|
||||
add_menu_directory_item(view_name + translate_string(30268) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30268) + get_filtered_items_count_text(), url)
|
||||
|
||||
# Next Up Episodes
|
||||
params = {}
|
||||
@@ -1181,7 +1214,7 @@ def display_mixed_type(params, view):
|
||||
path = get_jellyfin_url("/Shows/NextUp", params)
|
||||
url = sys.argv[0] + "?url=" + quote(path) + "&mode=GET_CONTENT&media_type=Episodes&sort=none"
|
||||
url += "&name_format=" + quote('Episode|episode_name_format')
|
||||
add_menu_directory_item(view_name + translate_string(30278) + " (" + item_limit + ")", url)
|
||||
add_menu_directory_item(view_name + translate_string(30278) + get_filtered_items_count_text(), url)
|
||||
|
||||
# Mixed Genres
|
||||
path = "plugin://plugin.video.jellycon/?mode=GENRES&item_type=mixed"
|
||||
@@ -1306,29 +1339,37 @@ def display_library_view(params):
|
||||
display_mixed_type(params, view_info)
|
||||
|
||||
|
||||
def show_widgets():
|
||||
item_limit = settings.getSetting("show_x_filtered_items")
|
||||
|
||||
def show_widgets():
|
||||
add_menu_directory_item("All Movies",
|
||||
'plugin://plugin.video.jellycon/library/movies')
|
||||
|
||||
item_limit_text = get_filtered_items_count_text()
|
||||
|
||||
add_menu_directory_item(translate_string(30257) + " (" + item_limit + ")",
|
||||
add_menu_directory_item(translate_string(30257) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=recent_movies')
|
||||
add_menu_directory_item(translate_string(30258) + " (" + item_limit + ")",
|
||||
add_menu_directory_item(translate_string(30258) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=inprogress_movies')
|
||||
add_menu_directory_item(translate_string(30269) + " (" + item_limit + ")",
|
||||
add_menu_directory_item(translate_string(30269) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=random_movies')
|
||||
add_menu_directory_item(translate_string(30403) + " (" + item_limit + ")",
|
||||
add_menu_directory_item(translate_string(30403) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=movie_recommendations')
|
||||
|
||||
add_menu_directory_item(translate_string(30287) + " (" + item_limit + ")",
|
||||
add_menu_directory_item(translate_string(30287) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=recent_tvshows')
|
||||
add_menu_directory_item(translate_string(30263) + " (" + item_limit + ")",
|
||||
add_menu_directory_item(translate_string(30455) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=random_tvshows')
|
||||
add_menu_directory_item(translate_string(30263) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=recent_episodes')
|
||||
add_menu_directory_item(translate_string(30264) + " (" + item_limit + ")",
|
||||
add_menu_directory_item(translate_string(30264) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=inprogress_episodes')
|
||||
add_menu_directory_item(translate_string(30265) + " (" + item_limit + ")",
|
||||
add_menu_directory_item(translate_string(30265) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=nextup_episodes')
|
||||
add_menu_directory_item(translate_string(30457) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=recent_all')
|
||||
add_menu_directory_item(translate_string(30458),
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=favorites_all')
|
||||
add_menu_directory_item(translate_string(30456) + item_limit_text,
|
||||
'plugin://plugin.video.jellycon/?mode=WIDGET_CONTENT&type=random_all')
|
||||
|
||||
xbmcplugin.endOfDirectory(int(sys.argv[1]))
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import os
|
||||
import re
|
||||
import sys
|
||||
import binascii
|
||||
from datetime import timedelta
|
||||
import datetime
|
||||
|
||||
import xbmc
|
||||
import xbmcgui
|
||||
@@ -242,8 +242,10 @@ def play_file(play_info):
|
||||
media_source_id = play_info.get("media_source_id", "")
|
||||
subtitle_stream_index = play_info.get("subtitle_stream_index", None)
|
||||
audio_stream_index = play_info.get("audio_stream_index", None)
|
||||
force_track_selection = play_info.get("force_track_selection", False)
|
||||
|
||||
log.debug("playFile id({0}) resume({1}) force_transcode({2})".format(item_id, auto_resume, force_transcode))
|
||||
log.debug("playFile id({0}) resume({1}) force_transcode({2}) force_track_selection({3})".format(
|
||||
item_id, auto_resume, force_transcode, force_track_selection))
|
||||
|
||||
addon_path = settings.getAddonInfo('path')
|
||||
force_auto_resume = settings.getSetting('forceAutoResume') == 'true'
|
||||
@@ -286,7 +288,7 @@ def play_file(play_info):
|
||||
*all* items in that parent.
|
||||
* Taking the max queue size setting into account
|
||||
'''
|
||||
if result.get("Type") in ["Season", "MusicArtist", "MusicAlbum",
|
||||
if result.get("Type") in ["Season", "Series", "MusicArtist", "MusicAlbum",
|
||||
"Playlist", "CollectionFolder", "MusicGenre"]:
|
||||
max_queue = int(settings.getSetting('max_play_queue'))
|
||||
log.debug("PlayAllFiles for parent item id: {0}".format(item_id))
|
||||
@@ -405,8 +407,8 @@ def play_file(play_info):
|
||||
if user_data.get("PlaybackPositionTicks") != 0:
|
||||
|
||||
reasonable_ticks = int(user_data.get("PlaybackPositionTicks")) / 1000
|
||||
seek_time = reasonable_ticks / 10000
|
||||
display_time = str(timedelta(seconds=seek_time))
|
||||
seek_time = round(reasonable_ticks / 10000,0)
|
||||
display_time = (datetime.datetime(1,1,1) + datetime.timedelta(seconds=seek_time)).strftime('%H:%M:%S')
|
||||
|
||||
resume_dialog = ResumeDialog("ResumeDialog.xml", addon_path, "default", "720p")
|
||||
resume_dialog.setResumeTime("Resume from " + display_time)
|
||||
@@ -461,7 +463,7 @@ def play_file(play_info):
|
||||
|
||||
if playback_type == "2": # if transcoding then prompt for audio and subtitle
|
||||
playurl = audio_subs_pref(playurl, list_item, selected_media_source, item_id, audio_stream_index,
|
||||
subtitle_stream_index)
|
||||
subtitle_stream_index, force_track_selection)
|
||||
log.debug("New playurl for transcoding: {0}".format(playurl))
|
||||
|
||||
elif playback_type == "1": # for direct stream add any streamable subtitles
|
||||
@@ -730,8 +732,20 @@ def set_list_item_props(item_id, list_item, result, server, extra_props, title):
|
||||
|
||||
details = {
|
||||
'title': title,
|
||||
'mediatype': mediatype
|
||||
'mediatype': mediatype,
|
||||
'artist': "Unknown Artist",
|
||||
'album': "Unknown Album"
|
||||
}
|
||||
artist = result.get("Artists", [])
|
||||
if artist:
|
||||
details['artist'] = artist[0]
|
||||
track = result.get("IndexNumber")
|
||||
if track:
|
||||
details['tracknumber'] = track
|
||||
album = result.get("Album")
|
||||
if album:
|
||||
details['album'] = album
|
||||
|
||||
list_item.setInfo("Music", infoLabels=details)
|
||||
|
||||
else:
|
||||
@@ -766,12 +780,14 @@ def set_list_item_props(item_id, list_item, result, server, extra_props, title):
|
||||
# Present the list of audio and subtitles to select from
|
||||
# for external streamable subtitles add the URL to the Kodi item and let Kodi handle it
|
||||
# else ask for the subtitles to be burnt in when transcoding
|
||||
def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, subtitle_stream_index):
|
||||
def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, subtitle_stream_index, force_track_selection=False):
|
||||
dialog = xbmcgui.Dialog()
|
||||
audio_streams_list = {}
|
||||
audio_streams = []
|
||||
audio_streams_data = [] # Store full stream data for preference matching
|
||||
subtitle_streams_list = {}
|
||||
subtitle_streams = ['No subtitles']
|
||||
subtitle_streams_data = [] # Store full stream data for preference matching
|
||||
downloadable_streams = []
|
||||
select_audio_index = audio_stream_index
|
||||
select_subs_index = subtitle_stream_index
|
||||
@@ -780,6 +796,60 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s
|
||||
default_sub = media_source.get('DefaultSubtitleStreamIndex', "")
|
||||
source_id = media_source["Id"]
|
||||
|
||||
# Read user preferences
|
||||
# Map select index to language code
|
||||
lang_index_map = ['ger', 'eng', 'fra', 'spa', 'ita', 'jpn', 'rus', ''] # '' = other/custom
|
||||
sub_lang_index_map = ['', 'ger', 'eng', 'fra', 'spa', 'ita', 'jpn', 'rus', ''] # First is 'none'
|
||||
|
||||
audio_lang_index = int(settings.getSetting("preferred_audio_language") or "0")
|
||||
preferred_audio_lang = lang_index_map[audio_lang_index] if audio_lang_index < len(lang_index_map) else ''
|
||||
|
||||
auto_select_default_audio = settings.getSetting("auto_select_default_audio") == "true"
|
||||
|
||||
sub_lang_index = int(settings.getSetting("preferred_subtitle_language") or "1")
|
||||
preferred_sub_lang = sub_lang_index_map[sub_lang_index] if sub_lang_index < len(sub_lang_index_map) else ''
|
||||
|
||||
prefer_forced = settings.getSetting("prefer_forced_subtitles") == "true"
|
||||
only_forced = settings.getSetting("only_forced_subtitles") == "true"
|
||||
|
||||
# Subtitle codec preference: 0=PGS, 1=SRT, 2=No preference
|
||||
codec_pref_index = int(settings.getSetting("subtitle_codec_preference") or "0")
|
||||
prefer_pgs = codec_pref_index == 0
|
||||
prefer_srt = codec_pref_index == 1
|
||||
# codec_pref_index == 2 means no preference (both prefer_pgs and prefer_srt are False)
|
||||
|
||||
auto_no_subs = settings.getSetting("auto_no_subtitles_if_no_match") == "true"
|
||||
|
||||
# Language code mapping for better matching
|
||||
language_map = {
|
||||
'ger': ['ger', 'deu', 'de', 'german', 'deutsch'],
|
||||
'eng': ['eng', 'en', 'english'],
|
||||
'fra': ['fra', 'fr', 'fre', 'french', 'français'],
|
||||
'spa': ['spa', 'es', 'spanish', 'español'],
|
||||
'ita': ['ita', 'it', 'italian', 'italiano'],
|
||||
'jpn': ['jpn', 'ja', 'japanese', '日本語'],
|
||||
'rus': ['rus', 'ru', 'russian'],
|
||||
}
|
||||
|
||||
# Helper function to check if language matches
|
||||
def language_matches(stream_lang, preferred_lang):
|
||||
stream_lang = stream_lang.lower()
|
||||
preferred_lang = preferred_lang.lower()
|
||||
|
||||
# Direct match
|
||||
if preferred_lang in stream_lang or stream_lang in preferred_lang:
|
||||
return True
|
||||
|
||||
# Check against language map
|
||||
for key, variations in language_map.items():
|
||||
if preferred_lang in variations:
|
||||
# Check if stream language matches any variation
|
||||
for variant in variations:
|
||||
if variant in stream_lang or stream_lang.startswith(variant[:2]):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
media_streams = media_source['MediaStreams']
|
||||
|
||||
for stream in media_streams:
|
||||
@@ -789,6 +859,7 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s
|
||||
if 'Audio' in stream['Type']:
|
||||
codec = stream.get('Codec', None)
|
||||
channel_layout = stream.get('ChannelLayout', "")
|
||||
title = stream.get('Title', '')
|
||||
|
||||
if not codec:
|
||||
# Probably tvheadend and has no other info
|
||||
@@ -801,30 +872,161 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s
|
||||
# Track doesn't include language
|
||||
track = "%s - %s %s" % (index, codec, channel_layout)
|
||||
|
||||
# Add title if available
|
||||
if title:
|
||||
track = "%s - %s" % (track, title)
|
||||
|
||||
audio_streams_list[track] = index
|
||||
audio_streams.append(track)
|
||||
audio_streams_data.append(stream)
|
||||
|
||||
elif 'Subtitle' in stream['Type']:
|
||||
try:
|
||||
# Track includes language
|
||||
track = "%s - %s" % (index, stream['Language'])
|
||||
except KeyError:
|
||||
# Track doesn't include language
|
||||
track = "%s - %s" % (index, stream['Codec'])
|
||||
language = stream.get('Language', 'Unknown')
|
||||
codec = stream.get('Codec', 'Unknown')
|
||||
|
||||
codec_names = {
|
||||
'subrip': 'SRT',
|
||||
'hdmv_pgs_subtitle': 'PGS',
|
||||
'dvd_subtitle': 'VobSub',
|
||||
'ass': 'ASS'
|
||||
}
|
||||
codec_display = codec_names.get(codec.lower(), codec.upper())
|
||||
|
||||
track = "%s - %s (%s)" % (index, language, codec_display)
|
||||
|
||||
default = stream['IsDefault']
|
||||
forced = stream['IsForced']
|
||||
hearing_impaired = stream.get('IsHearingImpaired', False)
|
||||
downloadable = stream['IsTextSubtitleStream'] and stream['IsExternal'] and stream['SupportsExternalStream']
|
||||
|
||||
if default:
|
||||
track = "%s - Default" % track
|
||||
if forced:
|
||||
track = "%s - Forced" % track
|
||||
if hearing_impaired:
|
||||
track = "%s - SDH" % track
|
||||
if downloadable:
|
||||
downloadable_streams.append(index)
|
||||
|
||||
subtitle_streams_list[track] = index
|
||||
subtitle_streams.append(track)
|
||||
subtitle_streams_data.append(stream)
|
||||
|
||||
# Auto-select audio track based on preferences
|
||||
# Only auto-select if not already set by server/remote control AND not forcing manual selection
|
||||
if not force_track_selection and select_audio_index is None and len(audio_streams_data) > 0 and (preferred_audio_lang or auto_select_default_audio):
|
||||
auto_selected = None
|
||||
best_score = -1
|
||||
|
||||
# Try to match preferred language with scoring
|
||||
if preferred_audio_lang:
|
||||
for stream in audio_streams_data:
|
||||
score = 0
|
||||
stream_lang = stream.get('Language', '')
|
||||
|
||||
# Match against common variations using language map
|
||||
if language_matches(stream_lang, preferred_audio_lang):
|
||||
score += 100 # Language match
|
||||
|
||||
# Bonus for default track
|
||||
if stream.get('IsDefault', False):
|
||||
score += 50
|
||||
|
||||
# Bonus based on channel count (more channels = better quality)
|
||||
channels = stream.get('Channels', 2)
|
||||
score += min(channels * 5, 40) # Max +40 for 8 channels
|
||||
|
||||
# Bonus for high-quality codecs
|
||||
codec = stream.get('Codec', '').lower()
|
||||
if 'truehd' in codec or 'dts-hd' in codec or 'dts-ma' in codec:
|
||||
score += 30
|
||||
elif 'dts' in codec:
|
||||
score += 20
|
||||
elif 'ac3' in codec or 'eac3' in codec:
|
||||
score += 10
|
||||
|
||||
# Penalty for commentary tracks
|
||||
title = stream.get('Title', '').lower()
|
||||
display_title = stream.get('DisplayTitle', '').lower()
|
||||
if 'commentary' in title or 'kommentar' in title or 'commentary' in display_title:
|
||||
score -= 100 # Effectively exclude commentary
|
||||
|
||||
log.debug("Audio score for {0} ({1}): {2} (channels={3}, codec={4}, default={5})".format(
|
||||
stream_lang, stream['Index'], score, channels, codec, stream.get('IsDefault', False)))
|
||||
|
||||
if score > best_score:
|
||||
best_score = score
|
||||
auto_selected = stream['Index']
|
||||
|
||||
# Fall back to default audio if enabled and no language match
|
||||
if auto_selected is None and auto_select_default_audio:
|
||||
auto_selected = default_audio
|
||||
log.debug("Auto-selected default audio (index {0})".format(auto_selected))
|
||||
|
||||
if auto_selected is not None:
|
||||
select_audio_index = auto_selected
|
||||
if best_score > 0:
|
||||
log.debug("Auto-selected audio (index {0}, score {1})".format(auto_selected, best_score))
|
||||
|
||||
# Auto-select subtitle track based on preferences
|
||||
# Only auto-select if not already set by server/remote control AND not forcing manual selection
|
||||
if force_track_selection:
|
||||
log.debug("Forcing manual track selection (from context menu)")
|
||||
elif select_subs_index is not None:
|
||||
log.debug("Using subtitle index from server/remote: {0}".format(select_subs_index))
|
||||
elif len(subtitle_streams_data) == 0:
|
||||
log.debug("No subtitle streams available")
|
||||
elif len(subtitle_streams_data) > 0 and preferred_sub_lang: # Only if user configured a language preference
|
||||
auto_selected = None
|
||||
best_score = -1
|
||||
|
||||
log.debug("Auto-selecting subtitle: preferred_lang={0}, prefer_forced={1}, only_forced={2}, prefer_pgs={3}, prefer_srt={4}".format(
|
||||
preferred_sub_lang, prefer_forced, only_forced, prefer_pgs, prefer_srt))
|
||||
|
||||
for stream in subtitle_streams_data:
|
||||
score = 0
|
||||
stream_lang = stream.get('Language', '')
|
||||
codec = stream.get('Codec', '').lower()
|
||||
is_forced = stream.get('IsForced', False)
|
||||
is_default = stream.get('IsDefault', False)
|
||||
|
||||
# Skip non-forced subtitles if only_forced is enabled
|
||||
if only_forced and not is_forced:
|
||||
log.debug("Skipping non-forced subtitle {0} ({1}) - only_forced is enabled".format(
|
||||
stream_lang, stream['Index']))
|
||||
continue
|
||||
|
||||
# Score based on language match
|
||||
if preferred_sub_lang and language_matches(stream_lang, preferred_sub_lang):
|
||||
score += 100
|
||||
|
||||
# Bonus for forced if preferred
|
||||
if prefer_forced and is_forced:
|
||||
score += 50
|
||||
|
||||
# Bonus for codec preference
|
||||
if prefer_pgs and codec in ['hdmv_pgs_subtitle', 'pgs']:
|
||||
score += 30
|
||||
elif prefer_srt and codec in ['subrip', 'srt']:
|
||||
score += 30
|
||||
|
||||
# Small bonus for default
|
||||
if is_default:
|
||||
score += 10
|
||||
|
||||
log.debug("Subtitle score for {0} ({1}): {2} (forced={3}, codec={4})".format(
|
||||
stream_lang, stream['Index'], score, is_forced, codec))
|
||||
|
||||
if score > best_score:
|
||||
best_score = score
|
||||
auto_selected = stream['Index']
|
||||
|
||||
if auto_selected is not None and best_score >= 100: # Only auto-select if language matched
|
||||
select_subs_index = auto_selected
|
||||
log.debug("Auto-selected subtitle (index {0}, score {1})".format(auto_selected, best_score))
|
||||
elif auto_no_subs and preferred_sub_lang: # No match found but user wants auto "no subs"
|
||||
select_subs_index = -1 # Special value to indicate "no subtitles"
|
||||
log.debug("No matching subtitle found - auto-selected 'No subtitles'")
|
||||
|
||||
# set audio index
|
||||
if select_audio_index is not None:
|
||||
@@ -842,15 +1044,19 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s
|
||||
|
||||
# set subtitle index
|
||||
if select_subs_index is not None:
|
||||
# Handle special "no subtitles" value
|
||||
if select_subs_index == -1:
|
||||
# User wants no subtitles - do nothing
|
||||
pass
|
||||
# Load subtitles in the listitem if downloadable
|
||||
if select_subs_index in downloadable_streams:
|
||||
elif select_subs_index in downloadable_streams:
|
||||
subtitle_url = "%s/Videos/%s/%s/Subtitles/%s/Stream.srt"
|
||||
subtitle_url = subtitle_url % (settings.getSetting('server_address'), item_id, source_id, select_subs_index)
|
||||
log.debug("Streaming subtitles url: {0} {1}".format(select_subs_index, subtitle_url))
|
||||
list_item.setSubtitles([subtitle_url])
|
||||
else:
|
||||
# Burn subtitles
|
||||
playurlprefs += "&SubtitleStreamIndex=%s" % select_subs_index
|
||||
playurlprefs += "&SubtitleStreamIndex=%s&SubtitleMethod=Encode" % select_subs_index
|
||||
|
||||
elif len(subtitle_streams) > 1:
|
||||
resp = dialog.select(translate_string(30292), subtitle_streams)
|
||||
@@ -870,10 +1076,10 @@ def audio_subs_pref(url, list_item, media_source, item_id, audio_stream_index, s
|
||||
list_item.setSubtitles([subtitle_url])
|
||||
else:
|
||||
# Burn subtitles
|
||||
playurlprefs += "&SubtitleStreamIndex=%s" % select_subs_index
|
||||
playurlprefs += "&SubtitleStreamIndex=%s&SubtitleMethod=Encode" % select_subs_index
|
||||
|
||||
else: # User backed out of selection
|
||||
playurlprefs += "&SubtitleStreamIndex=%s" % default_sub
|
||||
playurlprefs += "&SubtitleStreamIndex=%s&SubtitleMethod=Encode" % default_sub
|
||||
|
||||
new_url = url + playurlprefs
|
||||
|
||||
@@ -891,9 +1097,7 @@ def external_subs(media_source, list_item, item_id):
|
||||
sub_names = []
|
||||
|
||||
server = settings.getSetting('server_address')
|
||||
|
||||
for stream in media_streams:
|
||||
|
||||
for idx, stream in enumerate(media_streams):
|
||||
if (stream['Type'] == "Subtitle"
|
||||
and stream['IsExternal']
|
||||
and stream['IsTextSubtitleStream']
|
||||
@@ -904,20 +1108,22 @@ def external_subs(media_source, list_item, item_id):
|
||||
language = '{}.default'.format(language)
|
||||
if language and stream['IsForced']:
|
||||
language = '{}.forced'.format(language)
|
||||
is_sdh = stream.get('Title') and stream['Title'] in ('sdh', 'cc')
|
||||
if language and is_sdh:
|
||||
language = '{}.{}'.format(language, stream['Title'])
|
||||
if language and stream['IsHearingImpaired']:
|
||||
language = '{}.SDH'.format(language)
|
||||
codec = stream.get('Codec', '')
|
||||
|
||||
url = '{}{}'.format(server, stream.get('DeliveryUrl'))
|
||||
if language:
|
||||
title = str(idx)
|
||||
if stream.get('Title'):
|
||||
title = stream['Title']
|
||||
'''
|
||||
Starting in 10.8, the server no longer provides language
|
||||
specific download points. We have to download the file
|
||||
and name it with the language code ourselves so Kodi
|
||||
will parse it correctly
|
||||
'''
|
||||
subtitle_file = download_external_sub(language, codec, url)
|
||||
subtitle_file = download_external_sub(language, codec, url, title)
|
||||
else:
|
||||
# If there is no language defined, we can go directly to the server
|
||||
subtitle_file = url
|
||||
@@ -1031,7 +1237,7 @@ def prompt_for_stop_actions(item_id, data):
|
||||
prompt_delete_movie_percentage == 100):
|
||||
return
|
||||
|
||||
# if no runtime we can't calculate perceantge so just return
|
||||
# if no runtime we can't calculate percentage so just return
|
||||
if duration == 0:
|
||||
log.debug("No duration so returning")
|
||||
return
|
||||
@@ -1044,10 +1250,9 @@ def prompt_for_stop_actions(item_id, data):
|
||||
if (next_episode is not None and
|
||||
prompt_next_percentage < 100 and
|
||||
item_type == "Episode" and
|
||||
percentage_complete > prompt_next_percentage):
|
||||
percentage_complete >= prompt_next_percentage):
|
||||
|
||||
if play_prompt:
|
||||
|
||||
plugin_path = settings.getAddonInfo('path')
|
||||
plugin_path_real = translate_path(os.path.join(plugin_path))
|
||||
|
||||
@@ -1058,6 +1263,14 @@ def prompt_for_stop_actions(item_id, data):
|
||||
if not play_next_dialog.get_play_called():
|
||||
xbmc.executebuiltin("Container.Refresh")
|
||||
|
||||
else:
|
||||
play_info = {
|
||||
"item_id": next_episode.get("Id"),
|
||||
"auto_resume": "-1",
|
||||
"force_transcode": False
|
||||
}
|
||||
send_event_notification("jellycon_play_action", play_info)
|
||||
|
||||
|
||||
def stop_all_playback():
|
||||
|
||||
@@ -1175,6 +1388,16 @@ def get_playing_data():
|
||||
|
||||
return {}
|
||||
|
||||
def get_jellyfin_playing_item():
|
||||
home_window = HomeWindow()
|
||||
play_data_string = home_window.get_property('now_playing')
|
||||
try:
|
||||
play_data = json.loads(play_data_string)
|
||||
except ValueError:
|
||||
# This isn't a JellyCon item
|
||||
return None
|
||||
|
||||
return play_data.get("item_id")
|
||||
|
||||
def get_play_url(media_source, play_session_id, channel_id=None):
|
||||
log.debug("get_play_url - media_source: {0}", media_source)
|
||||
@@ -1254,13 +1477,22 @@ def get_play_url(media_source, play_session_id, channel_id=None):
|
||||
audio_max_channels = settings.getSetting("audio_max_channels")
|
||||
playback_video_force_8 = settings.getSetting("playback_video_force_8") == "true"
|
||||
|
||||
# Determine target video codec for transcoding
|
||||
transcode_target_codec_setting = settings.getSetting("transcode_target_video_codec")
|
||||
if transcode_target_codec_setting == "1":
|
||||
transcode_video_codec = "hevc"
|
||||
elif transcode_target_codec_setting == "2":
|
||||
transcode_video_codec = "av1"
|
||||
else:
|
||||
transcode_video_codec = "h264"
|
||||
|
||||
transcode_params = {
|
||||
"MediaSourceId": item_id,
|
||||
"DeviceId": device_id,
|
||||
"PlaySessionId": play_session_id,
|
||||
"api_key": user_token,
|
||||
"SegmentContainer": "ts",
|
||||
"VideoCodec": "h264",
|
||||
"VideoCodec": transcode_video_codec,
|
||||
"VideoBitrate": bitrate,
|
||||
"MaxWidth": playback_max_width,
|
||||
"AudioCodec": audio_codec,
|
||||
@@ -1505,7 +1737,12 @@ class PlaybackService(xbmc.Monitor):
|
||||
|
||||
def get_item_playback_info(item_id, force_transcode):
|
||||
|
||||
# Filter codecs that should NEVER be played directly (always force transcoding)
|
||||
# These settings work independently from the target codec setting below
|
||||
# Example: force_transcode_h264=true + target=hevc means: H.264 files will be transcoded to H.265
|
||||
filtered_codecs = []
|
||||
if settings.getSetting("force_transcode_h264") == "true":
|
||||
filtered_codecs.append("h264")
|
||||
if settings.getSetting("force_transcode_h265") == "true":
|
||||
filtered_codecs.append("hevc")
|
||||
filtered_codecs.append("h265")
|
||||
@@ -1515,6 +1752,8 @@ def get_item_playback_info(item_id, force_transcode):
|
||||
filtered_codecs.append("msmpeg4v3")
|
||||
if settings.getSetting("force_transcode_mpeg4") == "true":
|
||||
filtered_codecs.append("mpeg4")
|
||||
if settings.getSetting("force_transcode_av1") == "true":
|
||||
filtered_codecs.append("av1")
|
||||
|
||||
if not force_transcode:
|
||||
bitrate = get_bitrate(settings.getSetting("max_stream_bitrate"))
|
||||
@@ -1527,6 +1766,19 @@ def get_item_playback_info(item_id, force_transcode):
|
||||
|
||||
audio_bitrate = int(audio_playback_bitrate) * 1000
|
||||
|
||||
# Determine target video codec for transcoding
|
||||
# Note: force_transcode_* settings filter codecs for DirectPlay independently
|
||||
# This setting only affects what codec the server transcodes TO when transcoding is needed
|
||||
transcode_target_codec_setting = settings.getSetting("transcode_target_video_codec")
|
||||
log.debug("Transcode target codec setting value: '{0}'".format(transcode_target_codec_setting))
|
||||
if transcode_target_codec_setting == "1":
|
||||
transcode_video_codec = "hevc"
|
||||
elif transcode_target_codec_setting == "2":
|
||||
transcode_video_codec = "av1"
|
||||
else:
|
||||
transcode_video_codec = "h264"
|
||||
log.debug("Transcode target video codec: {0}".format(transcode_video_codec))
|
||||
|
||||
profile = {
|
||||
"Name": "Kodi",
|
||||
"MaxStaticBitrate": bitrate,
|
||||
@@ -1542,7 +1794,7 @@ def get_item_playback_info(item_id, force_transcode):
|
||||
"Protocol": "hls",
|
||||
"Type": "Video",
|
||||
"AudioCodec": audio_codec,
|
||||
"VideoCodec": "h264",
|
||||
"VideoCodec": transcode_video_codec,
|
||||
"MaxAudioChannels": audio_max_channels
|
||||
},
|
||||
{
|
||||
@@ -1684,3 +1936,11 @@ def get_item_playback_info(item_id, force_transcode):
|
||||
log.debug("PlaybackInfo : {0}".format(play_info_result))
|
||||
|
||||
return play_info_result
|
||||
|
||||
def get_media_segments(item_id):
|
||||
url = "/MediaSegments/{}".format(item_id)
|
||||
result = api.get(url)
|
||||
if result is None or result["Items"] is None:
|
||||
log.debug("GetMediaSegments : Media segments cloud not be retrieved")
|
||||
return None
|
||||
return result["Items"]
|
||||
|
||||
1731
resources/lib/play_utils.py.orig
Normal file
1731
resources/lib/play_utils.py.orig
Normal file
File diff suppressed because it is too large
Load Diff
@@ -88,8 +88,11 @@ def send_event_notification(method, data=None, hexlify=False):
|
||||
if hexlify:
|
||||
# Used exclusively for the upnext plugin
|
||||
data_str = ensure_text(binascii.hexlify(ensure_binary(data_str)))
|
||||
data = '["{}"]'.format(data_str)
|
||||
else:
|
||||
data = '"[{}]"'.format(data_str.replace('"', '\\"'))
|
||||
|
||||
sender = 'plugin.video.jellycon'
|
||||
data = '"[{}]"'.format(data_str.replace('"', '\\"'))
|
||||
|
||||
xbmc.executebuiltin('NotifyAll({}, {}, {})'.format(sender, method, data))
|
||||
|
||||
@@ -421,7 +424,7 @@ def translate_path(path):
|
||||
return xbmc.translatePath(path)
|
||||
|
||||
|
||||
def download_external_sub(language, codec, url):
|
||||
def download_external_sub(language, codec, url, title):
|
||||
addon_settings = xbmcaddon.Addon()
|
||||
verify_cert = addon_settings.getSetting('verify_cert') == 'true'
|
||||
|
||||
@@ -430,7 +433,7 @@ def download_external_sub(language, codec, url):
|
||||
r.raise_for_status()
|
||||
|
||||
# Write the subtitle file to the local filesystem
|
||||
file_name = 'Stream.{}.{}'.format(language, codec)
|
||||
file_name = 'Stream.{}.{}.{}'.format(title, language, codec)
|
||||
file_path = py2_decode(
|
||||
translate_path('special://temp/{}'.format(file_name))
|
||||
)
|
||||
@@ -448,3 +451,16 @@ def get_bitrate(enum_value):
|
||||
7000, 8000, 9000, 10000, 12000, 14000, 16000, 18000,
|
||||
20000, 25000, 30000, 35000, 40000, 100000, 1000000, 2147483]
|
||||
return bitrate[int(enum_value) if enum_value else 24] * 1000
|
||||
|
||||
def get_filtered_items_count_text():
|
||||
settings = xbmcaddon.Addon()
|
||||
if settings.getSetting("hide_x_filtered_items_count") == 'true' :
|
||||
return ""
|
||||
else:
|
||||
return " (" + settings.getSetting("show_x_filtered_items") + ")"
|
||||
|
||||
def seconds_to_ticks(seconds:float):
|
||||
return seconds * 10000000
|
||||
|
||||
def ticks_to_seconds(ticks:int):
|
||||
return round(ticks / 10000000, 1)
|
||||
|
||||
@@ -33,11 +33,11 @@ class WebSocketClient(threading.Thread):
|
||||
|
||||
self.__dict__ = self._shared_state
|
||||
self.monitor = xbmc.Monitor()
|
||||
self.retry_count = 0
|
||||
|
||||
self.device_id = get_device_id()
|
||||
|
||||
self._library_monitor = library_change_monitor
|
||||
self.websocket_error = False
|
||||
|
||||
threading.Thread.__init__(self)
|
||||
|
||||
@@ -230,11 +230,16 @@ class WebSocketClient(threading.Thread):
|
||||
xbmc.executebuiltin(builtin[command])
|
||||
|
||||
def on_open(self, ws):
|
||||
# Wait to make sure previous keepalive cycle has ended
|
||||
if self.websocket_error:
|
||||
time.sleep(30)
|
||||
self.websocket_error = False
|
||||
log.debug("Connected")
|
||||
self.retry_count = 0
|
||||
self.post_capabilities()
|
||||
self.send_keepalive(ws)
|
||||
|
||||
def on_error(self, ws, error):
|
||||
self.websocket_error = True
|
||||
log.debug("Error: {0}".format(error))
|
||||
|
||||
def run(self):
|
||||
@@ -269,8 +274,7 @@ class WebSocketClient(threading.Thread):
|
||||
|
||||
while not self.monitor.abortRequested():
|
||||
|
||||
time.sleep(self.retry_count * 5)
|
||||
self._client.run_forever(ping_interval=10)
|
||||
self._client.run_forever(reconnect=30)
|
||||
|
||||
if self._stop_websocket:
|
||||
break
|
||||
@@ -279,8 +283,6 @@ class WebSocketClient(threading.Thread):
|
||||
# Abort was requested, exit
|
||||
break
|
||||
|
||||
if self.retry_count < 12:
|
||||
self.retry_count += 1
|
||||
log.debug("Reconnecting WebSocket")
|
||||
|
||||
log.debug("WebSocketClient Stopped")
|
||||
@@ -304,3 +306,22 @@ class WebSocketClient(threading.Thread):
|
||||
)
|
||||
|
||||
api.post_capabilities()
|
||||
|
||||
def send_keepalive(self, ws):
|
||||
# Stop the keepalive cycle if an error has been detected
|
||||
if self.websocket_error:
|
||||
return
|
||||
keepalive_payload = json.dumps({"MessageType": "KeepAlive", "Data": 30})
|
||||
# Send the keepalive, or register an error
|
||||
try:
|
||||
ws.send(keepalive_payload)
|
||||
except:
|
||||
self.websocket_error = True
|
||||
return
|
||||
# Schedule the next message
|
||||
self.schedule_keepalive(ws)
|
||||
|
||||
def schedule_keepalive(self, ws):
|
||||
# Schedule a keepalive message in 30 seconds
|
||||
timer = threading.Timer(30, self.send_keepalive, kwargs={'ws': ws})
|
||||
timer.start()
|
||||
|
||||
73
resources/lib/websocket_client.py.rej
Normal file
73
resources/lib/websocket_client.py.rej
Normal file
@@ -0,0 +1,73 @@
|
||||
@@ -46,7 +46,12 @@
|
||||
result = json.loads(message)
|
||||
message_type = result['MessageType']
|
||||
|
||||
- if message_type == 'Play':
|
||||
+ if message_type == 'ForceKeepAlive':
|
||||
+ timeout_seconds = result.get('Data', 60)
|
||||
+ log.debug("Received ForceKeepAlive with timeout: {0}s".format(timeout_seconds))
|
||||
+ self._send_keep_alive()
|
||||
+
|
||||
+ elif message_type == 'Play':
|
||||
data = result['Data']
|
||||
self._play(data)
|
||||
|
||||
@@ -237,6 +242,9 @@
|
||||
def on_error(self, ws, error):
|
||||
log.debug("Error: {0}".format(error))
|
||||
|
||||
+ def on_close(self, ws, close_status_code, close_msg):
|
||||
+ log.debug("WebSocket closed. Code: {0}, Message: {1}".format(close_status_code, close_msg))
|
||||
+
|
||||
def run(self):
|
||||
|
||||
token = None
|
||||
@@ -259,17 +267,23 @@
|
||||
)
|
||||
log.debug("websocket url: {0}".format(websocket_url))
|
||||
|
||||
- self._client = websocket.WebSocketApp(
|
||||
- websocket_url,
|
||||
- on_open=lambda ws: self.on_open(ws),
|
||||
- on_message=lambda ws, message: self.on_message(ws, message),
|
||||
- on_error=lambda ws, error: self.on_error(ws, error))
|
||||
-
|
||||
log.debug("Starting WebSocketClient")
|
||||
|
||||
while not self.monitor.abortRequested():
|
||||
|
||||
- self._client.run_forever(ping_interval=5, reconnect=13, ping_timeout=2)
|
||||
+ # Create a new WebSocketApp for each connection attempt to avoid
|
||||
+ # memory leaks from reusing a potentially dirty connection object
|
||||
+ self._client = websocket.WebSocketApp(
|
||||
+ websocket_url,
|
||||
+ on_open=lambda ws: self.on_open(ws),
|
||||
+ on_message=lambda ws, message: self.on_message(ws, message),
|
||||
+ on_error=lambda ws, error: self.on_error(ws, error),
|
||||
+ on_close=lambda ws, status, msg: self.on_close(ws, status, msg))
|
||||
+
|
||||
+ # Use ping_interval without ping_timeout to keep connection alive
|
||||
+ # without forcing disconnection. The server's ForceKeepAlive/KeepAlive
|
||||
+ # mechanism handles the actual keepalive logic.
|
||||
+ self._client.run_forever(ping_interval=10)
|
||||
|
||||
if self._stop_websocket:
|
||||
break
|
||||
@@ -291,6 +305,17 @@
|
||||
self._client.close()
|
||||
log.debug("Stopping WebSocket (stop_client called)")
|
||||
|
||||
+ def _send_keep_alive(self):
|
||||
+ """Send a KeepAlive message to the server to maintain the connection."""
|
||||
+ try:
|
||||
+ keep_alive_message = json.dumps({
|
||||
+ 'MessageType': 'KeepAlive'
|
||||
+ })
|
||||
+ self._client.send(keep_alive_message)
|
||||
+ log.debug("Sent KeepAlive message")
|
||||
+ except Exception as error:
|
||||
+ log.debug("Error sending KeepAlive: {0}".format(error))
|
||||
+
|
||||
def post_capabilities(self):
|
||||
|
||||
settings = xbmcaddon.Addon()
|
||||
@@ -5,6 +5,7 @@ from __future__ import (
|
||||
import hashlib
|
||||
import random
|
||||
import time
|
||||
import datetime
|
||||
|
||||
import xbmcaddon
|
||||
import xbmcplugin
|
||||
@@ -66,6 +67,85 @@ def set_random_movies():
|
||||
home_window.set_property("random-movies", movies_list_string)
|
||||
home_window.set_property("random-movies-changed", new_widget_hash)
|
||||
|
||||
@timer
|
||||
def set_random_tvshows():
|
||||
log.debug("set_random_tvshows Called")
|
||||
|
||||
settings = xbmcaddon.Addon()
|
||||
item_limit = settings.getSetting("show_x_filtered_items")
|
||||
hide_watched = settings.getSetting("hide_watched") == "true"
|
||||
user_id = get_current_user_id()
|
||||
|
||||
url_params = {}
|
||||
url_params["Recursive"] = True
|
||||
url_params["limit"] = item_limit
|
||||
if hide_watched:
|
||||
url_params["IsPlayed"] = False
|
||||
url_params["SortBy"] = "Random"
|
||||
url_params["IncludeItemTypes"] = "Series"
|
||||
url_params["ImageTypeLimit"] = 0
|
||||
|
||||
url = get_jellyfin_url("/Users/{}/Items".format(user_id), url_params)
|
||||
|
||||
results = api.get(url)
|
||||
|
||||
random_tvshows_list = []
|
||||
if results is not None:
|
||||
items = results.get("Items", [])
|
||||
for item in items:
|
||||
random_tvshows_list.append(item.get("Id"))
|
||||
|
||||
random.shuffle(random_tvshows_list)
|
||||
tvshow_list_string = ",".join(random_tvshows_list)
|
||||
home_window = HomeWindow()
|
||||
m = hashlib.md5()
|
||||
m.update(tvshow_list_string.encode())
|
||||
new_widget_hash = m.hexdigest()
|
||||
|
||||
log.debug("set_random_tvshows: {0}".format(tvshow_list_string))
|
||||
log.debug("set_random_tvshows: {0}".format(new_widget_hash))
|
||||
home_window.set_property("random-tvshows", tvshow_list_string)
|
||||
home_window.set_property("random-tvshows-changed", new_widget_hash)
|
||||
|
||||
@timer
|
||||
def set_random_all():
|
||||
log.debug("set_random_all Called")
|
||||
|
||||
settings = xbmcaddon.Addon()
|
||||
item_limit = settings.getSetting("show_x_filtered_items")
|
||||
hide_watched = settings.getSetting("hide_watched") == "true"
|
||||
user_id = get_current_user_id()
|
||||
|
||||
url_params = {}
|
||||
url_params["Recursive"] = True
|
||||
url_params["limit"] = item_limit
|
||||
if hide_watched:
|
||||
url_params["IsPlayed"] = False
|
||||
url_params["SortBy"] = "Random"
|
||||
url_params["IncludeItemTypes"] = "Movie,Series"
|
||||
url_params["ImageTypeLimit"] = 0
|
||||
|
||||
url = get_jellyfin_url("/Users/{}/Items".format(user_id), url_params)
|
||||
|
||||
results = api.get(url)
|
||||
|
||||
random_items = []
|
||||
if results is not None:
|
||||
items = results.get("Items", [])
|
||||
for item in items:
|
||||
random_items.append(item.get("Id"))
|
||||
|
||||
random.shuffle(random_items)
|
||||
item_list_string = ",".join(random_items)
|
||||
home_window = HomeWindow()
|
||||
m = hashlib.md5()
|
||||
m.update(item_list_string.encode())
|
||||
new_widget_hash = m.hexdigest()
|
||||
|
||||
log.debug("set_random_all: {0}".format(item_list_string))
|
||||
log.debug("set_random_all: {0}".format(new_widget_hash))
|
||||
home_window.set_property("random-all", item_list_string)
|
||||
home_window.set_property("random-all-changed", new_widget_hash)
|
||||
|
||||
def set_background_image(force=False):
|
||||
log.debug("set_background_image Called forced={0}".format(force))
|
||||
@@ -332,6 +412,11 @@ def get_widget_content(handle, params):
|
||||
xbmcplugin.setContent(handle, 'movies')
|
||||
url_params["Ids"] = home_window.get_property("random-movies")
|
||||
|
||||
elif widget_type == "random_tvshows":
|
||||
home_window = HomeWindow()
|
||||
xbmcplugin.setContent(handle, 'tvshows')
|
||||
url_params["Ids"] = home_window.get_property("random-tvshows")
|
||||
|
||||
elif widget_type == "recent_tvshows":
|
||||
xbmcplugin.setContent(handle, 'episodes')
|
||||
url_verb = '/Users/{}/Items/Latest'.format(user_id)
|
||||
@@ -377,7 +462,14 @@ def get_widget_content(handle, params):
|
||||
url_params["Limit"] = item_limit
|
||||
url_params["userid"] = user_id
|
||||
url_params["Recursive"] = True
|
||||
url_params["enableResumable"] = False
|
||||
url_params["ImageTypeLimit"] = 1
|
||||
# check if rewatching is enabled and combine is disabled
|
||||
rewatch_days = int(settings.getSetting("rewatch_days"))
|
||||
if rewatch_days > 0 and settings.getSetting("rewatch_combine") != "true":
|
||||
rewatch_since = datetime.datetime.today() - datetime.timedelta(days=rewatch_days)
|
||||
url_params["nextUpDateCutoff"] = rewatch_since.strftime("%Y-%m-%d")
|
||||
url_params["enableRewatching"] = True
|
||||
# Collect InProgress items to be combined with NextUp
|
||||
inprogress_url_verb = "/Users/{}/Items".format(user_id)
|
||||
inprogress_url_params = url_params.copy()
|
||||
@@ -389,6 +481,8 @@ def get_widget_content(handle, params):
|
||||
inprogress_url_params["IncludeItemTypes"] = "Episode"
|
||||
inprogress_url_params["Limit"] = item_limit
|
||||
|
||||
|
||||
|
||||
elif widget_type == "movie_recommendations":
|
||||
suggested_items_url_params = {}
|
||||
suggested_items_url_params["userId"] = user_id
|
||||
@@ -428,6 +522,39 @@ def get_widget_content(handle, params):
|
||||
log.debug("Recommended Items : {0}".format(len(ids)))
|
||||
url_params["Ids"] = id_list
|
||||
|
||||
elif widget_type == "random_all":
|
||||
home_window = HomeWindow()
|
||||
xbmcplugin.setContent(handle, 'movies')
|
||||
url_params["Ids"] = home_window.get_property("random-all")
|
||||
|
||||
elif widget_type == "recent_all":
|
||||
xbmcplugin.setContent(handle, 'movies')
|
||||
url_verb = '/Users/{}/Items/Latest'.format(user_id)
|
||||
url_params["GroupItems"] = True
|
||||
url_params["Recursive"] = True
|
||||
url_params["SortBy"] = "DateCreated"
|
||||
url_params["SortOrder"] = "Descending"
|
||||
url_params["Limit"] = 45
|
||||
url_params["Filters"] = "IsNotFolder"
|
||||
url_params["Fields"] = get_default_filters()
|
||||
if hide_watched:
|
||||
url_params["IsPlayed"] = False
|
||||
url_params["IsVirtualUnaired"] = False
|
||||
url_params["IncludeItemTypes"] = "Episode, Movie"
|
||||
url_params["ImageTypeLimit"] = 1
|
||||
|
||||
elif widget_type == "favorites_all":
|
||||
home_window = HomeWindow()
|
||||
xbmcplugin.setContent(handle, 'movies')
|
||||
|
||||
url_params.update({
|
||||
"Filters": "IsFavorite",
|
||||
"IncludeItemTypes": "Movie,Series",
|
||||
"Recursive": True,
|
||||
"SortBy": "Name",
|
||||
"SortOrder": "Ascending",
|
||||
})
|
||||
|
||||
items_url = get_jellyfin_url(url_verb, url_params)
|
||||
|
||||
if (url_params.get('IncludeItemTypes', '') == 'Episode' or
|
||||
@@ -448,6 +575,17 @@ def get_widget_content(handle, params):
|
||||
|
||||
list_items = inprogress + list_items
|
||||
|
||||
# add rewatch combine is enabled
|
||||
if rewatch_days > 0 and settings.getSetting("rewatch_combine") == "true":
|
||||
rewatch_since = datetime.datetime.today() - datetime.timedelta(days=rewatch_days)
|
||||
url_params["nextUpDateCutoff"] = rewatch_since.strftime("%Y-%m-%d")
|
||||
url_params["enableRewatching"] = True
|
||||
rewatch_items_url = get_jellyfin_url(url_verb, url_params)
|
||||
rewatch_items, detected_type, total_records = process_directory(rewatch_items_url, None, params, use_cached_widget_data)
|
||||
for ri in rewatch_items:
|
||||
if not any(i[1].getProperty("id") == ri[1].getProperty("id") for i in list_items):
|
||||
list_items.append(ri)
|
||||
|
||||
if detected_type is not None:
|
||||
# if the media type is not set then try to use the detected type
|
||||
log.debug("Detected content type: {0}".format(detected_type))
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<setting label="30388" type="lsep"/>
|
||||
<setting label="30011" type="action" action="RunScript(plugin.video.jellycon,0,?mode=DETECT_SERVER_USER)" option="close"/>
|
||||
<setting id="ipaddress" type="text" label="30000" default="" visible="false" enable="false" />
|
||||
<setting id="protocol" type="select" label="30390" lvalues="30391|30392" default="0" visible="false"/>
|
||||
<setting id="protocol" type="select" label="30390" lvalues="30391|30392" default="0" visible="false"/>
|
||||
<setting id="port" type="text" label="30001" default="8096" visible="false" enable="false" />
|
||||
<setting id="server_address" type="text" label="30000" default="" visible="true" enable="true" />
|
||||
<setting id="verify_cert" type="bool" label="30003" default="true" visible="true" enable="true" />
|
||||
@@ -30,10 +30,13 @@
|
||||
<setting type="sep" />
|
||||
<setting id="max_stream_bitrate" type="enum" label="30208" values="0.5 Mbps|1 Mbps|1.5 Mbps|2.0 Mbps|2.5 Mbps|3.0 Mbps|4.0 Mbps|5.0 Mbps|6.0 Mbps|7.0 Mbps|8.0 Mbps|9.0 Mbps|10.0 Mbps|12.0 Mbps|14.0 Mbps|16.0 Mbps|18.0 Mbps|20.0 Mbps|25.0 Mbps|30.0 Mbps|35.0 Mbps|40.0 Mbps|100.0 Mbps|1000.0 Mbps [default]|Maximum" visible="true" default="23" />
|
||||
<setting id="allow_direct_file_play" type="bool" label="30433" default="false" visible="true" enable="true" />
|
||||
<setting id="transcode_target_video_codec" type="select" label="30679" lvalues="30680|30681|30683" default="0" visible="true" />
|
||||
<setting id="force_transcode_h264" type="bool" label="30682" default="false" visible="true" />
|
||||
<setting id="force_transcode_h265" type="bool" label="30236" default="false" visible="true" enable="true" />
|
||||
<setting id="force_transcode_mpeg2" type="bool" label="30239" default="false" visible="true" enable="true" />
|
||||
<setting id="force_transcode_msmpeg4v3" type="bool" label="30240" default="false" visible="true" enable="true" />
|
||||
<setting id="force_transcode_mpeg4" type="bool" label="30241" default="false" visible="true" enable="true" />
|
||||
<setting id="force_transcode_av1" type="bool" label="30242" default="false" visible="true" enable="true" />
|
||||
<setting id="direct_stream_sub_select" type="select" label="30379" lvalues="30380|30381|30382" default="0" visible="true"/>
|
||||
|
||||
<setting label="30211" type="lsep"/>
|
||||
@@ -44,6 +47,16 @@
|
||||
<setting id="audio_codec" type="select" label="30419" values="ac3|aac" default="ac3"/>
|
||||
<setting id="audio_playback_bitrate" type="select" label="30418" values="128|160|192|256|320|384|448|640" default="256" visible="true"/>
|
||||
<setting id="audio_max_channels" type="slider" label="30420" default="8" range="2,1,8" option="int" visible="true"/>
|
||||
|
||||
<setting label="30685" type="lsep"/>
|
||||
<setting type="sep" />
|
||||
<setting id="preferred_audio_language" type="select" label="30686" lvalues="30691|30692|30693|30694|30695|30696|30697|30698" default="0" visible="true"/>
|
||||
<setting id="auto_select_default_audio" type="bool" label="30687" default="true" visible="true"/>
|
||||
<setting id="preferred_subtitle_language" type="select" label="30688" lvalues="30699|30691|30692|30693|30694|30695|30696|30697|30698" default="1" visible="true"/>
|
||||
<setting id="prefer_forced_subtitles" type="bool" label="30689" default="true" visible="true"/>
|
||||
<setting id="only_forced_subtitles" type="bool" label="30702" default="true" visible="true"/>
|
||||
<setting id="subtitle_codec_preference" type="select" label="30703" lvalues="30704|30705|30706" default="0" visible="true"/>
|
||||
<setting id="auto_no_subtitles_if_no_match" type="bool" label="30700" default="true" visible="true"/>
|
||||
<setting id="max_play_queue" type="slider" label="30447" default="200" range="20, 10, 1000" option="int" visible="true"/>
|
||||
|
||||
</category>
|
||||
@@ -80,6 +93,7 @@
|
||||
<setting id="addCounts" type="bool" label="30116" default="false" visible="true" enable="true" />
|
||||
<setting id="addResumePercent" type="bool" label="30118" default="false" visible="true" enable="true" />
|
||||
<setting id="addSubtitleAvailable" type="bool" label="30163" default="false" visible="true" enable="true" />
|
||||
<setting id="hide_x_filtered_items_count" type="bool" label="30453" default="false" visible="true" enable="true" />
|
||||
<setting id="include_overview" type="bool" label="30181" default="true" visible="true" enable="true" />
|
||||
<setting id="include_media" type="bool" label="30182" default="true" visible="true" enable="true" />
|
||||
<setting id="add_user_ratings" type="bool" label="30348" default="true" visible="true" enable="true" />
|
||||
@@ -95,16 +109,48 @@
|
||||
<setting id="show_empty_folders" type="bool" label="30328" default="false" visible="true" enable="true" />
|
||||
<setting id="hide_watched" type="bool" label="30432" default="true" visible="true" enable="true" />
|
||||
|
||||
<setting label="30450" type="lsep"/>
|
||||
<setting type="sep" />
|
||||
<setting id="rewatch_days" type="slider" label="30451" default="0" range="0,1,365" option="int" visible="true"/>
|
||||
<setting id="rewatch_combine" type="bool" label="30452" default="false" visible="true" enable="true" />
|
||||
|
||||
<setting label="30223" type="lsep"/>
|
||||
<setting type="sep" />
|
||||
<setting id="moviePageSize" type="slider" label="30331" default="0" range="0,1,100" option="int" visible="true"/>
|
||||
<setting id="showPageSize" type="slider" label="30678" default="0" range="0,1,100" option="int" visible="true"/>
|
||||
<setting id="show_x_filtered_items" type="slider" label="30018" default="20" range="5,1,100" option="int" visible="true"/>
|
||||
|
||||
<setting label="30224" type="lsep"/>
|
||||
<setting type="sep" />
|
||||
<setting id="widget_select_action" type="select" label="30026" lvalues="30313|30314" default="0" visible="true"/>
|
||||
<setting id="interface_mode" type="select" label="30225" lvalues="30226|30227" default="0" visible="true"/>
|
||||
|
||||
</category>
|
||||
|
||||
<category label="30666">
|
||||
|
||||
<setting label="30670" type="lsep"/>
|
||||
<setting id="intro_skipper_action" type="select" label="30667" lvalues="30673|30672|30674" default="0" visible="true" enable="true" />
|
||||
<setting id="intro_skipper_start_offset" type="slider" label="30668" default="0" range="0,1,3" option="int" visible="true" enable="true"/>
|
||||
<setting id="intro_skipper_end_offset" type="slider" label="30669" default="1" range="0,1,3" option="int" visible="true" enable="true"/>
|
||||
<setting label="30671" type="lsep"/>
|
||||
<setting id="credit_skipper_action" type="select" label="30667" lvalues="30673|30672|30674" default="0" visible="true" enable="true" />
|
||||
<setting id="credit_skipper_start_offset" type="slider" label="30668" default="0" range="0,1,3" option="int" visible="true" enable="true" />
|
||||
<setting id="credit_skipper_end_offset" type="slider" label="30669" default="1" range="0,1,3" option="int" visible="true" enable="true" />
|
||||
<setting label="30675" type="lsep"/>
|
||||
<setting id="commercial_skipper_action" type="select" label="30667" lvalues="30673|30672|30674" default="0" visible="true" enable="true" />
|
||||
<setting id="commercial_skipper_start_offset" type="slider" label="30668" default="0" range="0,1,3" option="int" visible="true" enable="true"/>
|
||||
<setting id="commercial_skipper_end_offset" type="slider" label="30669" default="1" range="0,1,3" option="int" visible="true" enable="true"/>
|
||||
<setting label="30676" type="lsep"/>
|
||||
<setting id="preview_skipper_action" type="select" label="30667" lvalues="30673|30672|30674" default="0" visible="true" enable="true" />
|
||||
<setting id="preview_skipper_start_offset" type="slider" label="30668" default="0" range="0,1,3" option="int" visible="true" enable="true" />
|
||||
<setting id="preview_skipper_end_offset" type="slider" label="30669" default="1" range="0,1,3" option="int" visible="true" enable="true" />
|
||||
<setting label="30677" type="lsep"/>
|
||||
<setting id="recap_skipper_action" type="select" label="30667" lvalues="30673|30672|30674" default="0" visible="true" enable="true" />
|
||||
<setting id="recap_skipper_start_offset" type="slider" label="30668" default="0" range="0,1,3" option="int" visible="true" enable="true"/>
|
||||
<setting id="recap_skipper_end_offset" type="slider" label="30669" default="1" range="0,1,3" option="int" visible="true" enable="true"/>
|
||||
</category>
|
||||
|
||||
<category label="30111">
|
||||
|
||||
<setting label="30343" type="lsep"/>
|
||||
@@ -123,7 +169,8 @@
|
||||
<setting id="profile_count" type="slider" label="30010" default="0" range="0,1,20" option="int" visible="true" />
|
||||
<setting id="log_debug" type="bool" label="30027" default="false" visible="true" enable="true" />
|
||||
<setting id="log_timing" type="bool" label="30015" default="false" visible="true" enable="true" />
|
||||
<setting id="use_cache" type="bool" label="30345" default="true" visible="true" enable="true" />
|
||||
<setting id="disable_disk_cache" type="bool" label="30684" default="true" visible="true" enable="true" />
|
||||
<setting id="use_cache" type="bool" label="30345" default="false" visible="true" enable="true" />
|
||||
<setting id="use_cached_widget_data" type="bool" label="30441" default="false" visible="true" enable="true" />
|
||||
<setting id="showLoadProgress" type="bool" label="30120" default="false" visible="true" enable="true" />
|
||||
<setting id="suppressErrors" type="bool" label="30315" default="false" visible="true" enable="true" />
|
||||
|
||||
25
resources/skins/default/720p/SkipDialog.xml
Normal file
25
resources/skins/default/720p/SkipDialog.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<window id="10000">
|
||||
<defaultcontrol always="true">9000</defaultcontrol>
|
||||
<zorder>2</zorder>
|
||||
<coordinates>
|
||||
<system>1</system>
|
||||
<left>0</left>
|
||||
<top>0</top>
|
||||
</coordinates>
|
||||
|
||||
<controls>
|
||||
<control type="button" id="9000">
|
||||
<left>1020</left>
|
||||
<top>550</top>
|
||||
<width>150</width>
|
||||
<height>65</height>
|
||||
<visible>true</visible>
|
||||
<label>Skip</label>
|
||||
<align>center</align>
|
||||
<texture border="1" colordiffuse="ff161616">white.png</texture>
|
||||
<font>font12</font>
|
||||
<onright>3014</onright>
|
||||
</control>
|
||||
</controls>
|
||||
</window>
|
||||
37
service.py
37
service.py
@@ -11,7 +11,7 @@ import xbmcgui
|
||||
from resources.lib.lazylogger import LazyLogger
|
||||
from resources.lib.play_utils import Service, PlaybackService, send_progress
|
||||
from resources.lib.kodi_utils import HomeWindow
|
||||
from resources.lib.widgets import set_background_image, set_random_movies
|
||||
from resources.lib.widgets import set_background_image, set_random_movies, set_random_tvshows, set_random_all
|
||||
from resources.lib.websocket_client import WebSocketClient
|
||||
from resources.lib.menu_functions import set_library_window_values
|
||||
from resources.lib.server_detect import check_server, check_connection_speed
|
||||
@@ -20,12 +20,16 @@ from resources.lib.datamanager import clear_old_cache_data
|
||||
from resources.lib.tracking import set_timing_enabled
|
||||
from resources.lib.image_server import HttpImageServerThread
|
||||
from resources.lib.playnext import PlayNextService
|
||||
from resources.lib.intro_skipper import IntroSkipperService
|
||||
|
||||
settings = xbmcaddon.Addon()
|
||||
|
||||
log_timing_data = settings.getSetting('log_timing') == "true"
|
||||
if log_timing_data:
|
||||
set_timing_enabled(True)
|
||||
try:
|
||||
settings = xbmcaddon.Addon()
|
||||
log_timing_data = settings.getSetting('log_timing') == "true"
|
||||
if log_timing_data:
|
||||
set_timing_enabled(True)
|
||||
except Exception:
|
||||
# During installation/update, addon might not be fully registered yet
|
||||
pass
|
||||
|
||||
# clear user and token when logging in
|
||||
home_window = HomeWindow()
|
||||
@@ -63,6 +67,8 @@ last_progress_update = time.time()
|
||||
last_content_check = time.time()
|
||||
last_background_update = 0
|
||||
last_random_movie_update = 0
|
||||
last_random_tvshow_update = 0
|
||||
last_random_all_update = 0
|
||||
|
||||
# start the library update monitor
|
||||
library_change_monitor = LibraryChangeMonitor()
|
||||
@@ -87,6 +93,10 @@ if context_menu:
|
||||
context_monitor = ContextMonitor()
|
||||
context_monitor.start()
|
||||
|
||||
# Start the skip service monitor
|
||||
intro_skipper = IntroSkipperService(monitor)
|
||||
intro_skipper.start()
|
||||
|
||||
background_interval = int(settings.getSetting('background_interval'))
|
||||
newcontent_interval = int(settings.getSetting('new_content_check_interval'))
|
||||
random_movie_list_interval = int(settings.getSetting('random_movie_refresh_interval'))
|
||||
@@ -104,7 +114,6 @@ first_run = True
|
||||
home_window.set_property('exit', 'False')
|
||||
|
||||
while home_window.get_property('exit') == 'False':
|
||||
|
||||
try:
|
||||
if xbmc.Player().isPlaying():
|
||||
last_random_movie_update = time.time() - (random_movie_list_interval - 15)
|
||||
@@ -124,8 +133,7 @@ while home_window.get_property('exit') == 'False':
|
||||
user_changed = True
|
||||
|
||||
if user_changed or first_run:
|
||||
settings = xbmcaddon.Addon()
|
||||
server_speed_check_data = settings.getSetting("server_speed_check_data")
|
||||
settings = xbmcaddon.Addon()
|
||||
server_speed_check_data = settings.getSetting("server_speed_check_data")
|
||||
server_host = settings.getSetting('server_address')
|
||||
if server_host is not None and server_host != "" and server_host != "<none>" and server_host not in server_speed_check_data:
|
||||
@@ -142,6 +150,14 @@ while home_window.get_property('exit') == 'False':
|
||||
last_random_movie_update = time.time()
|
||||
set_random_movies()
|
||||
|
||||
if user_changed or (random_movie_list_interval != 0 and (time.time() - last_random_tvshow_update) > random_movie_list_interval):
|
||||
last_random_tvshow_update = time.time()
|
||||
set_random_tvshows()
|
||||
|
||||
if user_changed or (random_movie_list_interval != 0 and (time.time() - last_random_all_update) > random_movie_list_interval):
|
||||
last_random_all_update = time.time()
|
||||
set_random_all()
|
||||
|
||||
if user_changed or (newcontent_interval != 0 and (time.time() - last_content_check) > newcontent_interval):
|
||||
last_content_check = time.time()
|
||||
library_change_monitor.check_for_updates()
|
||||
@@ -185,6 +201,9 @@ if play_next_service:
|
||||
if context_monitor:
|
||||
context_monitor.stop_monitor()
|
||||
|
||||
if intro_skipper:
|
||||
intro_skipper.stop_service()
|
||||
|
||||
# clear user and token when logging off
|
||||
home_window.clear_property("user_name")
|
||||
home_window.clear_property("AccessToken")
|
||||
|
||||
Reference in New Issue
Block a user