12 Commits

Author SHA1 Message Date
mcarlton00
c963176bba Merge pull request #398 from jellyfin/prepare-0.9.0
Some checks failed
CodeQL Analysis / analyze (python, 3.9) (push) Has been cancelled
Release Drafter / Update release draft (push) Has been cancelled
Test JellyCon / test (3.9) (push) Has been cancelled
Build JellyCon / build (py2) (push) Has been cancelled
Build JellyCon / build (py3) (push) Has been cancelled
Prepare for release v0.9.0
2026-01-02 10:54:04 -05:00
jellyfin-bot
06ffff3031 bump version to 0.9.0 2026-01-02 15:14:54 +00:00
ittelicra
2021f76dfd Translated using Weblate (Italian)
Currently translated at 100.0% (302 of 302 strings)

Translation: Jellycon/Jellycon
Translate-URL: https://translate.jellyfin.org/projects/jellycon/jellycon/it/
2026-01-02 12:03:37 +00:00
Stelios Karakapzoudis
112e244fbc Translated using Weblate (Greek)
Currently translated at 94.3% (285 of 302 strings)

Translation: Jellycon/Jellycon
Translate-URL: https://translate.jellyfin.org/projects/jellycon/jellycon/el/
2025-12-31 00:05:53 +00:00
mcarlton00
a655d49ce3 Merge pull request #396 from manuelschneider/websocket-renderer-issue
Fix websocket reconnects
2025-12-29 12:23:00 -05:00
mcarlton00
ddb47065bb Merge pull request #395 from mcarlton00/prioritize-filtered-limits
Ensure the filtered limit takes precedence over page limit
2025-12-29 11:45:37 -05:00
Spillutvikler
e94873c011 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (302 of 302 strings)

Translation: Jellycon/Jellycon
Translate-URL: https://translate.jellyfin.org/projects/jellycon/jellycon/nb_NO/
2025-12-29 13:05:53 +00:00
ilker
8f07d44a4d Translated using Weblate (Turkish)
Currently translated at 100.0% (302 of 302 strings)

Translation: Jellycon/Jellycon
Translate-URL: https://translate.jellyfin.org/projects/jellycon/jellycon/tr/
2025-12-29 13:05:52 +00:00
Gargotaire
d63b4321c2 Translated using Weblate (Catalan)
Currently translated at 100.0% (302 of 302 strings)

Translation: Jellycon/Jellycon
Translate-URL: https://translate.jellyfin.org/projects/jellycon/jellycon/ca/
2025-12-23 08:05:53 +00:00
rimasx
b1c9f3877b Translated using Weblate (Estonian)
Currently translated at 96.0% (290 of 302 strings)

Translation: Jellycon/Jellycon
Translate-URL: https://translate.jellyfin.org/projects/jellycon/jellycon/et/
2025-12-23 08:05:52 +00:00
Manuel Schneider
a24f921804 use libs reconnect functionality 2025-12-20 17:15:29 +01:00
mcarlton00
854d72fe15 Ensure the filtered limit takes precedence over page limit 2025-12-13 11:20:08 -05:00
9 changed files with 208 additions and 89 deletions

View File

@@ -1,8 +1,19 @@
version: '0.8.3'
version: '0.9.0'
changelog: |-
CI & build changes
------------------
+ Swap legacy secrets for current secrets (#371) @joshuaboniface
:tada: New features and improvements
------------------------------------
+ Add a page limit setting for tv shows (#393) @mcarlton00
+ Add New Widgets (#381) @Aydanill
+ Include track details in audio playback (#378) @davembg
+ Add segment skip ability (#368) @Gorgorot38
Bug Fixes
---------
+ Fix websocket reconnects (#396) @manuelschneider
+ Ensure the filtered limit takes precedence over page limit (#395) @mcarlton00
+ fix subtitle burn in (#384) @loztcf
+ fix sdh/cc/hi subtitle for jellyfin > v10.9.0 (#385) @AndryYosua
+ Fix bug with multiple external subtitles in the same languages (#369) @Gorgorot38
dependencies:
py2:
- addon: 'xbmc.python'

View File

@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-12-18 13:55+0000\n"
"Last-Translator: pol busquets <canpinetell@gmail.com>\n"
"PO-Revision-Date: 2025-12-23 08:05+0000\n"
"Last-Translator: Gargotaire <gargots@gmail.com>\n"
"Language-Team: Catalan <https://translate.jellyfin.org/projects/jellycon/"
"jellycon/ca/>\n"
"Language: ca\n"
@@ -1217,7 +1217,7 @@ msgstr "Tot Aleatori"
msgctxt "#30457"
msgid "All - Recently Added"
msgstr "Tot Afegits Recentment"
msgstr "Tot Afegits recentment"
msgctxt "#30458"
msgid "All - Favorites"

View File

@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2024-10-29 12:41+0000\n"
"Last-Translator: Antonios <anthonyv156@outlook.com>\n"
"PO-Revision-Date: 2025-12-31 00:05+0000\n"
"Last-Translator: Stelios Karakapzoudis <stelioskpz@gmail.com>\n"
"Language-Team: Greek <https://translate.jellyfin.org/projects/jellycon/"
"jellycon/el/>\n"
"Language: el\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 5.7.2\n"
"X-Generator: Weblate 5.15.1\n"
msgctxt "#30000"
msgid "Host"
@@ -1168,3 +1168,31 @@ msgstr "Παίξε το επόμενο"
msgctxt "#30441"
msgid "Use cached widget data"
msgstr "Χρήση προσωρινής μνήμης δεδομένων widget"
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 "#30670"
msgid "Intro Skipper"
msgstr "Παράβλεψη Εισαγωγής"
msgctxt "#30671"
msgid "Credit Skipper"
msgstr "Παράβλεψη Τίτλων Τέλους"
msgctxt "#30672"
msgid "Skip"
msgstr "Παράβλεψη"

View File

@@ -1,6 +1,6 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-10-09 12:51+0000\n"
"PO-Revision-Date: 2025-12-23 08:05+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 5.11.4\n"
"X-Generator: Weblate 5.14\n"
msgctxt "#30021"
msgid "Show all episodes item"
@@ -1145,3 +1145,31 @@ 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 pealkirjas kuvatavate üksuste arv"
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"

View File

@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-12-20 09:55+0000\n"
"Last-Translator: Stefano Mazzoleni <stefano.mazzoleni0704@gmail.com>\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 5.14\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"
@@ -601,7 +601,7 @@ msgstr "Seleziona fonte sottotitoli"
msgctxt "#30293"
msgid "Cache images"
msgstr "Memorizza immagini"
msgstr "Memorizza in cache immagini"
msgctxt "#30310"
msgid "Enable Jellyfin remote control"
@@ -669,7 +669,7 @@ msgstr "Avviso"
msgctxt "#30299"
msgid "Cache Images"
msgstr "Memorizza immagini"
msgstr "Memorizza in cache le immagini"
msgctxt "#30300"
msgid "Cache all Jellyfin images as local Kodi images?"
@@ -1206,3 +1206,19 @@ 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"

View File

@@ -1,8 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-05-05 07:15+0000\n"
"Last-Translator: Samuel Tønnessen "
"<probable@users.noreply.translate.jellyfin.org>\n"
"PO-Revision-Date: 2025-12-29 13:05+0000\n"
"Last-Translator: Spillutvikler <sivertnhjortland@gmail.com>\n"
"Language-Team: Norwegian Bokmål <https://translate.jellyfin.org/projects/"
"jellycon/jellycon/nb_NO/>\n"
"Language: nb_NO\n"
@@ -10,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 5.10.4\n"
"X-Generator: Weblate 5.15.1\n"
msgctxt "#30000"
msgid "Host"
@@ -1202,3 +1201,23 @@ msgstr "Sniktitthopper"
msgctxt "#30677"
msgid "Recap Skipper"
msgstr "Oppsummeringshopper"
msgctxt "#30455"
msgid "TV Shows - Random"
msgstr "TV Show - Tilfeldig"
msgctxt "#30456"
msgid "All - Random"
msgstr "Alle - Tilfeldig"
msgctxt "#30457"
msgid "All - Recently Added"
msgstr "Alle - Nylig lagt til"
msgctxt "#30458"
msgid "All - Favorites"
msgstr "Alle - Favoritter"
msgctxt "#30678"
msgid "TV Shows per page"
msgstr "TV Show per side"

View File

@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-11-17 08:43+0000\n"
"Last-Translator: Eray <erayturkaysocial@gmail.com>\n"
"PO-Revision-Date: 2025-12-29 13:05+0000\n"
"Last-Translator: ilker <isaglam@gmail.com>\n"
"Language-Team: Turkish <https://translate.jellyfin.org/projects/jellycon/"
"jellycon/tr/>\n"
"Language: tr\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 5.14\n"
"X-Generator: Weblate 5.15.1\n"
msgctxt "#30237"
msgid "Start from beginning"
@@ -1203,3 +1203,23 @@ msgstr "Başlangıç Ofseti (saniye)"
msgctxt "#30669"
msgid "End Offset (seconds)"
msgstr "Son Ofset (saniye)"
msgctxt "#30455"
msgid "TV Shows - Random"
msgstr "Diziler - Rastgele"
msgctxt "#30456"
msgid "All - Random"
msgstr "Hepsi - Rastgele"
msgctxt "#30457"
msgid "All - Recently Added"
msgstr "Hepsi - Son Eklenen"
msgctxt "#30458"
msgid "All - Favorites"
msgstr "Hepsi - Favoriler"
msgctxt "#30678"
msgid "TV Shows per page"
msgstr "Sayfa başına Diziler"

View File

@@ -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,50 +89,46 @@ def get_content(url, params):
progress.update(0, translate_string(30113))
# update url for paging
start_index = 0
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 movie_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 - 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 + movie_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 + 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))
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"):
m = re.search('StartIndex=([0-9]{1,4})', url)
if m and m.group(1):
if show_page_limit > 0 and media_type.startswith("tvshow"):
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 - 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))
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))
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"
@@ -141,42 +138,43 @@ def get_content(url, params):
log.debug("total_records: {0}".format(total_records))
# 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 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 + 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 + 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))
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:

View File

@@ -269,8 +269,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(ping_interval=5, reconnect=13, ping_timeout=2)
if self._stop_websocket:
break