diff --git a/gulpfile.js b/gulpfile.js index 973c400263..4556e71bc8 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -183,6 +183,12 @@ function copy(query) { .pipe(browserSync.stream()); } +function copyIndex() { + return src(options.injectBundle.query, { base: './src/' }) + .pipe(dest('dist/')) + .pipe(browserSync.stream()); +} + function injectBundle() { return src(options.injectBundle.query, { base: './src/' }) .pipe(inject( @@ -193,9 +199,9 @@ function injectBundle() { } function build(standalone) { - return series(clean, parallel(javascript, apploader(standalone), webpack, css, html, images, copy), injectBundle); + return series(clean, parallel(javascript, apploader(standalone), webpack, css, html, images, copy)); } -exports.default = build(false); -exports.standalone = build(true); +exports.default = series(build(false), copyIndex); +exports.standalone = series(build(true), injectBundle); exports.serve = series(exports.standalone, serve); diff --git a/package.json b/package.json index fd7d445d1b..4e79ea3c39 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "document-register-element": "^1.14.3", "fast-text-encoding": "^1.0.1", "flv.js": "^1.5.0", + "headroom.js": "^0.11.0", "hls.js": "^0.13.1", "howler": "^2.1.3", "intersection-observer": "^0.7.0", diff --git a/src/assets/css/site.css b/src/assets/css/site.css index 67416663e7..e59b639f45 100644 --- a/src/assets/css/site.css +++ b/src/assets/css/site.css @@ -96,3 +96,16 @@ div[data-role=page] { margin-right: auto; width: 85%; } + +.headroom { + will-change: transform; + transition: transform 200ms linear; +} + +.headroom--pinned { + transform: translateY(0%); +} + +.headroom--unpinned { + transform: translateY(-100%); +} diff --git a/src/bundle.js b/src/bundle.js index eb358797e6..8a829103fa 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -146,3 +146,9 @@ var screenfull = require("screenfull"); _define("screenfull", function () { return screenfull; }); + +// headroom.js +var headroom = require("headroom.js/dist/headroom"); +_define("headroom", function () { + return headroom; +}); diff --git a/src/elements/emby-scroller/emby-scroller.js b/src/elements/emby-scroller/emby-scroller.js index cb5bae818f..3df40fa6c2 100644 --- a/src/elements/emby-scroller/emby-scroller.js +++ b/src/elements/emby-scroller/emby-scroller.js @@ -96,17 +96,6 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro } } - function initHeadroom(elem) { - require(['headroom'], function (Headroom) { - var headroom = new Headroom([], { - scroller: elem - }); - - headroom.add(document.querySelector('.skinHeader')); - elem.headroom = headroom; - }); - } - ScrollerPrototype.attachedCallback = function () { if (this.getAttribute('data-navcommands')) { inputManager.on(this, onInputCommand); @@ -120,8 +109,6 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro slider.style['white-space'] = 'nowrap'; } - var bindHeader = this.getAttribute('data-bindheader') === 'true'; - var scrollFrame = this; var enableScrollButtons = layoutManager.desktop && horizontal && this.getAttribute('data-scrollbuttons') !== 'false'; @@ -137,7 +124,7 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro dragHandle: 1, autoImmediate: true, skipSlideToWhenVisible: this.getAttribute('data-skipfocuswhenvisible') === 'true', - dispatchScrollEvent: enableScrollButtons || bindHeader || this.getAttribute('data-scrollevent') === 'true', + dispatchScrollEvent: enableScrollButtons || this.getAttribute('data-scrollevent') === 'true', hideScrollbar: enableScrollButtons || this.getAttribute('data-hidescrollbar') === 'true', allowNativeSmoothScroll: this.getAttribute('data-allownativesmoothscroll') === 'true' && !enableScrollButtons, allowNativeScroll: !enableScrollButtons, @@ -155,10 +142,6 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro initCenterFocus(this, this.scroller); } - if (bindHeader && layoutManager.mobile) { - initHeadroom(this); - } - if (enableScrollButtons) { loadScrollButtons(this); } diff --git a/src/scripts/apploader.js b/src/scripts/apploader.js index 7001c4c614..1ee74178b1 100644 --- a/src/scripts/apploader.js +++ b/src/scripts/apploader.js @@ -29,6 +29,16 @@ ); } + try { + Promise.resolve(); + } catch (ex) { + // this checks for several cases actually, typical is + // Promise() being missing on some legacy browser, and a funky one + // is Promise() present but buggy on WebOS 2 + window.Promise = undefined; + self.Promise = undefined; + } + if (!self.Promise) { // Load Promise polyfill if they are not natively supported injectScriptElement( diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index fe7c3bcaf2..79c4c09e78 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -733,8 +733,8 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " function initHeadRoom(elem) { require(["headroom"], function (Headroom) { - var headroom = new Headroom([], {}); - headroom.add(elem); + var headroom = new Headroom(elem); + headroom.init(); }); } diff --git a/src/scripts/site.js b/src/scripts/site.js index 917d75fafd..5558de36e4 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -350,11 +350,6 @@ var AppInfo = {}; return layoutManager; } - function createWindowHeadroom(Headroom) { - var headroom = new Headroom([], {}); - return headroom; - } - function createSharedAppFooter(appFooter) { return new appFooter({}); } @@ -705,7 +700,8 @@ var AppInfo = {}; "fast-text-encoding", "intersection-observer", "classlist-polyfill", - "screenfull" + "screenfull", + "headroom" ] }, urlArgs: urlArgs, @@ -764,7 +760,6 @@ var AppInfo = {}; // TODO remove these libraries // all of these have been modified so we need to fix that first - define("headroom", [bowerPath + "/headroom/headroom"], returnFirstDependency); define("scroller", [bowerPath + "/scroller"], returnFirstDependency); define("navdrawer", [bowerPath + "/navdrawer/navdrawer"], returnFirstDependency); diff --git a/src/strings/he.json b/src/strings/he.json index 381b9bc181..0eafd988fc 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -277,10 +277,10 @@ "MaxParentalRatingHelp": "תוכן עם דירוג גובה יותר יוסתר מהמשתמש.", "MessageAreYouSureDeleteSubtitles": "האם אתה בטוח שברצונך למחוק קובץ כתובית זה?", "MessageConfirmRecordingCancellation": "‏האם אתה בטוח שברצונך לבטל הקלטה זו?", - "MessageDownloadQueued": "הורד תור", + "MessageDownloadQueued": "הורדה נוספה לתור.", "MessageItemSaved": "הפריט נשמר.", "MessageItemsAdded": "פריטים נוספו.", - "MessageLeaveEmptyToInherit": "השאר ריק כדי לרשת את ההגדרות מפריט אב, או את ערך ברירת המחדל הגלובלי.", + "MessageLeaveEmptyToInherit": "השאר ריק כדי לרשת את ההגדרות מפריט אב או את ערך ברירת המחדל הגלובלי.", "MessageNothingHere": "אין כאן כלום.", "MessagePleaseEnsureInternetMetadata": "בבקשה וודא כי הורדת מידע מהאינטרנט מאופשרת", "MinutesAfter": "דקות אחרי", @@ -528,7 +528,7 @@ "Audio": "שמע", "AspectRatio": "יחס גובה-רוחב", "AlwaysPlaySubtitlesHelp": "כתוביות בשפה המועדפת ייטענו ללא קשר לשפת השמע.", - "AlwaysPlaySubtitles": "הפעל כתוביות תמיד", + "AlwaysPlaySubtitles": "הפעל תמיד", "AllowRemoteAccessHelp": "אם לא מסומן, כל החיבורים המרוחקים ייחסמו.", "AllowRemoteAccess": "אפשר חיבור מרוחק לשרת Jellyfin זה.", "AllowMediaConversionHelp": "אפשר או חסום גישה להמרת מדיה.", @@ -548,8 +548,8 @@ "HeaderContinueWatching": "המשך לצפות", "AllowOnTheFlySubtitleExtraction": "אפשר חילוץ כתוביות בזמן אמת", "AllowHWTranscodingHelp": "אפשר למלקט לקודד הזרמות בזמן אמת. זה עשוי לעזור בהפחתת הקידוד שנעשה ע\"י השרת.", - "AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB\\IDX וכדומה)", - "AddItemToCollectionHelp": "הוסף פריטים לאוספים ע\"י חיפושם ושימוש בלחצן ימני או הקשה על התפריט כדי להוסיף אותם לאוסף.", + "AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB/IDX)", + "AddItemToCollectionHelp": "הוסף חפצים לאוסף על ידי חיפוש שלהם ולחיצה על כפתור ימני בעכבר או כפתור התפריט כדי להוסיף לאוסף.", "Songs": "שירים", "Shows": "סדרות", "DownloadsValue": "{0} הורדות", @@ -741,5 +741,25 @@ "Browse": "עיין", "BoxRear": "מארז (מאחור)", "BookLibraryHelp": "ניתן להוסיף ספרים מוקלטים וספרים כתובים. עיינו {0}במדריך מתן שמות לספרים{1}.", - "Desktop": "שולחן עבודה" + "Desktop": "שולחן עבודה", + "MessageUnauthorizedUser": "אין לך גישה לשרת ברגע זה. אנא צור קשר עם מנהל השרת למידע נוסף.", + "MessageDeleteTaskTrigger": "האם אתה בטוח שברצונך למחוק את מפעיל המשימה הזה?", + "LastSeen": "נראה לאחרונה ב-{0}", + "PersonRole": "כ-{0}", + "ListPaging": "{0}-{1} מתוך {2}", + "EveryXHours": "בכל {0} שעות", + "OnApplicationStartup": "באתחול היישום", + "DeleteUserConfirmation": "האם אתה בטוח שברצונך למחוק את המשתמש?", + "DeleteDeviceConfirmation": "האם אתה בטוח שברצונך למחוק את המכשיר? הוא יופיע שוב בפעם הבאה שמשתמש ייכנס באמצעותו.", + "ColorSpace": "מרחב צבע", + "CinemaModeConfigurationHelp": "מצב קולנוע מביא את חוויית הקולנוע היישר אל הסלון עם האפשרות להפעיל טריילרים וקדימונים מותאמים אישית לפני הסרט.", + "ChannelAccessHelp": "בחר את הערוצים לשיתוף עם משתמש זה. מנהלים יוכלו לערוך את כל הערוצים בעזרת \"מנהל המטא-דאטה\".", + "ButtonResetEasyPassword": "אתחל קוד פין פשוט", + "ButtonOff": "כיבוי", + "ButtonLibraryAccess": "הרשאות גישה לספרייה", + "BurnSubtitlesHelp": "מחליט אם על השרת לצרוב כתוביות בזמן קידוד וידאו. הימנעות מכך תשפר מאוד את הביצועים. בחר \"אוטומטי\" לצריבת כתוביות על בסיס פורמט תמונה (VOBSUB, PGS, SUB, IDX) וכתוביות ASS או SSA מסויימות.", + "Artist": "אמן", + "AllowedRemoteAddressesHelp": "רשימת IP \\ מיסוך רשת המופרדת בפסיקים עבור רשתות שיורשו להתחבר מרחוק. במידה ותישאר ריקה, כל הכתובות יורשו להתחבר.", + "Album": "אלבום", + "AlbumArtist": "אמן האלבום" } diff --git a/src/strings/it.json b/src/strings/it.json index 842f6edf75..0f9cee571a 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1500,5 +1500,6 @@ "BoxSet": "Cofanetto", "AlbumArtist": "Artisti dell'Album", "ReleaseGroup": "Release Group", - "UnsupportedPlayback": "Jellyfin non è in grado di decriptare i contenuti protetti da DRM ma tutti i contenuti verranno tentati a prescindere, compresi quelli protetti. Alcuni file potrebbero apparire completamente neri a causa della crittografia o di altre funzionalità non supportate, come i titoli interattivi." + "UnsupportedPlayback": "Jellyfin non è in grado di decriptare i contenuti protetti da DRM ma tutti i contenuti verranno tentati a prescindere, compresi quelli protetti. Alcuni file potrebbero apparire completamente neri a causa della crittografia o di altre funzionalità non supportate, come i titoli interattivi.", + "MessageUnauthorizedUser": "Non sei autorizzato ad accedere in questo momento al server. Contatta l'amministratore per ulteriori dettagli." } diff --git a/src/strings/nl.json b/src/strings/nl.json index 37d2ca34ad..25ab546d58 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -26,7 +26,7 @@ "AllowRemoteAccess": "Externe verbindingen met deze Jellyfin Server toestaan.", "AllowRemoteAccessHelp": "Indien niet aangevinkt worden alle externe verbindingen geblokkeerd.", "AllowedRemoteAddressesHelp": "Komma-gescheiden lijst van IP-adressen of IP/netmask adressen voor netwerken die op afstand verbinding mogen maken. Indien blanco, worden alle externe adressen toegestaan.", - "AlwaysPlaySubtitles": "Altijd ondertitels weergeven", + "AlwaysPlaySubtitles": "Altijd afspelen", "AlwaysPlaySubtitlesHelp": "Ondertitels die met de taalvoorkeur overeenkomen worden weergegeven, ongeacht de audiotaal.", "AnyLanguage": "Elke taal", "Anytime": "Op elk moment", @@ -49,7 +49,7 @@ "BoxRear": "Hoes (achterkant)", "Browse": "Bladeren", "BrowsePluginCatalogMessage": "Bekijk de Plugin catalogus voor beschikbare Plug-ins.", - "BurnSubtitlesHelp": "Bepaalt of de server ondertitels moet inbranden wanneer video's op basis van het soort ondertitels geconverteerd moeten worden. Het inbranden van ondertitels heeft een negatief effect op de server performance. Selecteer Automatisch om op afbeelding gebaseerde formaten (VOBSUB, PGS, SUB/IDX etc.) en bepaalde ASS/SSA ondertitels in te branden.", + "BurnSubtitlesHelp": "Bepaalt of de server ondertitels moet branden bij het transcoderen van video's. Als u dit vermijd, worden de prestaties aanzienlijk verbeterd. Selecteer Auto om op afbeeldingen gebaseerde formaten (VOBSUB, PGS, SUB/IDX etc.) en bepaalde ASS/SSA ondertitels te branden.", "ButtonAdd": "Toevoegen", "ButtonAddMediaLibrary": "Voeg Media Bibliotheek toe", "ButtonAddScheduledTaskTrigger": "Trigger Toevoegen", @@ -1463,5 +1463,14 @@ "OptionAuto": "Auto", "OptionProfileVideo": "Video", "AlbumArtist": "Album Artiest", - "Album": "Album" + "Album": "Album", + "DeinterlaceMethodHelp": "Selecteer de deinterlacingmethode die u wilt gebruiken bij het transcoderen van geïnterlinieerde inhoud.", + "CopyStreamURLError": "Er trad een fout op tijdens het kopieren van de URL.", + "ClientSettings": "Client instellingen", + "ButtonSplit": "Splitsen", + "BoxSet": "Box Set", + "AskAdminToCreateLibrary": "Vraag een beheerder om een bibliotheek te maken.", + "Artist": "Artiest", + "AllowFfmpegThrottlingHelp": "Wanneer een transcode of remux ver genoeg voorloopt op de huidige afspeelpositie, pauzeer het proces, zodat het minder middelen verbruikt. Dit is vooral handig wanneer u kijkt zonder vaak te zoeken. Schakel dit uit als u afspeelproblemen ondervindt.", + "AllowFfmpegThrottling": "Throttle Transcodes" } diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index fb6cf88081..f5020837f8 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -1677,5 +1677,6 @@ "Episode": "劇集", "DeinterlaceMethodHelp": "選擇對隔行掃描內容進行轉碼時所用的反交錯方法。", "BoxSet": "套裝", - "UnsupportedPlayback": "Jellyfin 無法解密受 DRM 保護的內容,但仍然會嘗試播放所有內容。某些檔案由於被加密或包含如互動標題等不受支援的內容,在播放時可能會沒有畫面。" + "UnsupportedPlayback": "Jellyfin 無法解密受 DRM 保護的內容,但仍然會嘗試播放所有內容。某些檔案由於被加密或包含如互動標題等不受支援的內容,在播放時可能會沒有畫面。", + "MessageUnauthorizedUser": "您目前無權存取伺服器,請與您的伺服器管理員聯繫以獲取更多訊息。" } diff --git a/yarn.lock b/yarn.lock index 099117476e..55d6a104d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5527,6 +5527,11 @@ he@1.2.x, he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +headroom.js@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/headroom.js/-/headroom.js-0.11.0.tgz#26547a932025e4243abf8ace001b4ce5e110ed20" + integrity sha512-yI4ciZRD1WH22wa5uJDg2kMtRvhJwUJWo2l41Eby0BoAD+lzXL98lf5jDFxP4Q5W3HmlrpfItSfmqc3jCtasbw== + hex-color-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" @@ -11317,10 +11322,10 @@ svgo@^1.0.0, svgo@^1.3.2: unquote "~1.1.1" util.promisify "~1.0.0" -swiper@^5.3.1: - version "5.3.6" - resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.3.6.tgz#102b7f8145d734ec4c30e04602160382356b5948" - integrity sha512-FUz50g6RuvGAuXQWmR5lRPoA129leRUZ/p57ckr8+P5kR7VktElVQ47JGmWD86mOJCFfvMhUf0hinyC5UFL5iw== +swiper@^5.3.7: + version "5.3.7" + resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.3.7.tgz#1349c055730e9247e4482b72631166119b83f409" + integrity sha512-BFpXllmUNj1k/Uz6FRW7ykZfUfeCpfqUZxOxeTFZKYy3gv/kOWULHjwy0xlQIJdsiVGF5nZgRG2VbVl6XWy3gw== dependencies: dom7 "^2.1.3" ssr-window "^1.0.1"