1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge branch 'master' of https://github.com/jellyfin/jellyfin-web into item-detail-page-

# Conflicts:
#	src/assets/css/librarybrowser.css
#	src/itemdetails.html
This commit is contained in:
grafixeyehero 2020-01-23 20:51:30 +03:00
commit 709b48a8a8
129 changed files with 2629 additions and 1199 deletions

View file

@ -20,24 +20,21 @@ jobs:
steps: steps:
- task: NodeTool@0 - task: NodeTool@0
displayName: 'Install Node.js' displayName: 'Install Node'
inputs: inputs:
versionSpec: '10.x' versionSpec: '10.x'
- script: | - script: 'yarn install'
yarn install displayName: 'Install Dependencies'
displayName: 'Install dependencies'
- script: | - script: 'test -d dist'
test -d dist displayName: 'Check Build'
displayName: 'Check dist directory'
- script: | - script: 'yarn pack --filename jellyfin-web.tgz'
yarn pack --filename jellyfin-web.tgz displayName: 'Bundle Release'
displayName: 'Build package'
- task: PublishPipelineArtifact@1 - task: PublishPipelineArtifact@1
displayName: 'Publish package' displayName: 'Publish Release'
condition: succeeded() condition: succeeded()
inputs: inputs:
targetPath: '$(Build.SourcesDirectory)/jellyfin-web.tgz' targetPath: '$(Build.SourcesDirectory)/jellyfin-web.tgz'
@ -51,14 +48,12 @@ jobs:
steps: steps:
- task: NodeTool@0 - task: NodeTool@0
displayName: 'Install Node.js' displayName: 'Install Node'
inputs: inputs:
versionSpec: '10.x' versionSpec: '10.x'
- script: | - script: 'yarn install'
yarn install displayName: 'Install Dependencies'
displayName: 'Install dependencies'
- script: | - script: 'yarn run lint'
yarn run lint
displayName: 'Run ESLint' displayName: 'Run ESLint'

View file

@ -5,14 +5,12 @@
"repository": "https://github.com/jellyfin/jellyfin-web", "repository": "https://github.com/jellyfin/jellyfin-web",
"license": "GPL-2.0-or-later", "license": "GPL-2.0-or-later",
"devDependencies": { "devDependencies": {
"autoprefixer": "^9.7.3",
"clean-webpack-plugin": "^3.0.0", "clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^5.1.1", "copy-webpack-plugin": "^5.1.1",
"css-loader": "^2.1.0", "css-loader": "^2.1.0",
"eslint": "^5.16.0", "eslint": "^5.16.0",
"file-loader": "^3.0.1", "file-loader": "^3.0.1",
"html-webpack-plugin": "^3.2.0", "html-webpack-plugin": "^3.2.0",
"postcss-loader": "^3.0.0",
"style-loader": "^0.23.1", "style-loader": "^0.23.1",
"webpack": "^4.41.0", "webpack": "^4.41.0",
"webpack-cli": "^3.3.9", "webpack-cli": "^3.3.9",

View file

@ -1,5 +0,0 @@
module.exports = {
plugins: [
require('autoprefixer')
]
}

41
scripts/scdup.py Normal file
View file

@ -0,0 +1,41 @@
import sys
import os
import json
# load every key in the source language
# check the keys in all translations
# remove keys that only exist in translations
cwd = os.getcwd()
langdir = cwd + '/../src/strings'
langlst = os.listdir(langdir)
langlst.remove('en-us.json')
print(langlst)
input('press enter to continue')
keysus = []
with open(langdir + '/' + 'en-us.json') as en:
langus = json.load(en)
for key in langus:
keysus.append(key)
for lang in langlst:
with open(langdir + '/' + lang, 'r') as f:
inde = 2
if '\n \"' in f.read():
inde = 4
f.close()
with open(langdir + '/' + lang, 'r+') as f:
langjson = json.load(f)
langjnew = {}
for key in langjson:
if key in keysus:
langjnew[key] = langjson[key]
f.seek(0)
f.write(json.dumps(langjnew, indent=inde, sort_keys=False, ensure_ascii=False))
f.write('\n')
f.truncate()
f.close()
print('DONE')

40
scripts/scgen.py Normal file
View file

@ -0,0 +1,40 @@
import os
import subprocess
import json
# load all keys in the source language
# check entire codebase for usages
# print unused keys to a text file
# TODO: dynamic string usages cause false positives
cwd = os.getcwd()
langdir = cwd + '/../src/strings'
langlst = []
langlst.append('en-us.json')
# unused keys
dep = []
def grep(key):
command = 'grep -r -E "(\(\\\"|\(\'|\{)%s(\\\"|\'|\})" --include=\*.{js,html} --exclude-dir=../src/strings ../src' % key
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = p.stdout.readlines()
if output:
print('DONE: ' + key)
return True
print('UNUSED: ' + key)
dep.append(key)
return False
for lang in langlst:
with open(langdir + '/' + lang) as f:
langjson = json.load(f)
for key in langjson:
grep(key)
print(dep)
print('LENGTH: ' + str(len(dep)))
with open('scout.txt', 'w') as out:
for item in dep:
out.write(item + '\n')
out.close()

34
scripts/scrm.py Normal file
View file

@ -0,0 +1,34 @@
import sys
import os
import json
# load text file containing unused keys
# remove the keys from all string files
cwd = os.getcwd()
langdir = cwd + '/../src/strings'
langlst = os.listdir(langdir)
keys = []
with open('scout.txt', 'r') as f:
for line in f:
keys.append(line.strip('\n'))
for lang in langlst:
with open(langdir + '/' + lang, 'r') as f:
inde = 2
if '\n \"' in f.read():
inde = 4
f.close()
with open(langdir + '/' + lang, 'r+') as f:
langjson = json.load(f)
for key in keys:
langjson.pop(key, None)
f.seek(0)
f.write(json.dumps(langjson, indent=inde, sort_keys=False, ensure_ascii=False))
f.write('\n')
f.truncate()
f.close()
print('DONE')

View file

@ -1,10 +1,7 @@
<div id="addPluginPage" data-role="page" class="page type-interior pluginConfigurationPage" data-backbutton="true"> <div id="addPluginPage" data-role="page" class="page type-interior pluginConfigurationPage" data-backbutton="true">
<div> <div>
<div class="content-primary"> <div class="content-primary">
<div class="readOnlyContent"> <div class="readOnlyContent">
<div class="verticalSection"> <div class="verticalSection">
<div class="sectionTitleContainer flex align-items-center"> <div class="sectionTitleContainer flex align-items-center">
<h1 class="sectionTitle pluginName"></h1> <h1 class="sectionTitle pluginName"></h1>
@ -13,9 +10,7 @@
<p id="tagline" style="font-style: italic;"></p> <p id="tagline" style="font-style: italic;"></p>
<p id="pPreviewImage"></p> <p id="pPreviewImage"></p>
<p id="overview"></p> <p id="overview"></p>
</div> </div>
<div class="verticalSection"> <div class="verticalSection">
@ -27,12 +22,12 @@
<select id="selectVersion" name="selectVersion" is="emby-select" label="${LabelSelectVersionToInstall}"></select> <select id="selectVersion" name="selectVersion" is="emby-select" label="${LabelSelectVersionToInstall}"></select>
</div> </div>
<p id="btnInstallDiv" class="hide"> <div id="btnInstallDiv" class="hide">
<button is="emby-button" type="submit" id="btnInstall" class="raised button-submit block"> <button is="emby-button" type="submit" id="btnInstall" class="raised button-submit block">
<span>${Install}</span> <span>${Install}</span>
</button> </button>
<div class="fieldDescription">${ServerRestartNeededAfterPluginInstall}</div> <div class="fieldDescription">${ServerRestartNeededAfterPluginInstall}</div>
</p> </div>
<p id="nonServerMsg"></p> <p id="nonServerMsg"></p>
</form> </form>
</div> </div>

View file

@ -2,9 +2,7 @@
<div> <div>
<div class="content-primary"> <div class="content-primary">
<div class="detailSectionHeader"> <div class="detailSectionHeader">
<h2 style="margin:.6em 0;vertical-align:middle;display:inline-block;"> <h2 style="margin:.6em 0;vertical-align:middle;display:inline-block;">${HeaderApiKeys}</h2>
${HeaderApiKeys}
</h2>
<button is="emby-button" type="button" class="fab btnNewKey submit" style="margin-left:1em;" title="${ButtonAdd}"> <button is="emby-button" type="button" class="fab btnNewKey submit" style="margin-left:1em;" title="${ButtonAdd}">
<i class="md-icon">add</i> <i class="md-icon">add</i>
</button> </button>

View file

@ -1,6 +1,8 @@
.dashboardColumn, .dashboardColumn,
.dashboardSections { .dashboardSections {
flex-direction: column; flex-direction: column;
-webkit-box-orient: vertical;
-webkit-box-direction: normal
} }
.dashboardFooter { .dashboardFooter {
@ -14,6 +16,8 @@
progress { progress {
appearance: none; appearance: none;
-moz-appearance: none;
-webkit-appearance: none;
margin: 0; margin: 0;
background: #ccc !important background: #ccc !important
} }
@ -73,17 +77,23 @@ progress[aria-valuenow]:before {
div[data-role=controlgroup] a[data-role=button] { div[data-role=controlgroup] a[data-role=button] {
display: inline-block !important; display: inline-block !important;
margin: 0 !important; margin: 0 !important;
-webkit-box-shadow: none !important;
box-shadow: none !important; box-shadow: none !important;
-webkit-border-radius: 0;
border-radius: 0 border-radius: 0
} }
div[data-role=controlgroup] a[data-role=button]:first-child { div[data-role=controlgroup] a[data-role=button]:first-child {
-webkit-border-bottom-left-radius: .3125em;
border-bottom-left-radius: .3125em; border-bottom-left-radius: .3125em;
-webkit-border-top-left-radius: .3125em;
border-top-left-radius: .3125em border-top-left-radius: .3125em
} }
div[data-role=controlgroup] a[data-role=button]:last-child { div[data-role=controlgroup] a[data-role=button]:last-child {
-webkit-border-bottom-right-radius: .3125em;
border-bottom-right-radius: .3125em; border-bottom-right-radius: .3125em;
-webkit-border-top-right-radius: .3125em;
border-top-right-radius: .3125em border-top-right-radius: .3125em
} }
@ -137,14 +147,23 @@ div[data-role=controlgroup] a.ui-btn-active {
} }
.dashboardSections { .dashboardSections {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-flex-direction: column;
flex-direction: column flex-direction: column
} }
.dashboardColumn { .dashboardColumn {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-flex-direction: column;
flex-direction: column; flex-direction: column;
-webkit-flex-shrink: 0;
flex-shrink: 0; flex-shrink: 0;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1 flex-grow: 1
} }
@ -153,6 +172,7 @@ div[data-role=controlgroup] a.ui-btn-active {
} }
.dashboardSection { .dashboardSection {
-webkit-flex-shrink: 0;
flex-shrink: 0; flex-shrink: 0;
margin: 0 0 2em margin: 0 0 2em
} }
@ -168,7 +188,11 @@ div[data-role=controlgroup] a.ui-btn-active {
@media all and (min-width:70em) { @media all and (min-width:70em) {
.dashboardSections { .dashboardSections {
-webkit-flex-wrap: wrap;
flex-wrap: wrap; flex-wrap: wrap;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-flex-direction: row;
flex-direction: row flex-direction: row
} }
@ -273,6 +297,7 @@ div[data-role=controlgroup] a.ui-btn-active {
} }
.sessionNowPlayingContent { .sessionNowPlayingContent {
-webkit-background-size: cover;
background-size: cover; background-size: cover;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center center; background-position: center center;
@ -371,6 +396,7 @@ div[data-role=controlgroup] a.ui-btn-active {
} }
.disabledUser { .disabledUser {
-webkit-filter: grayscale(100%);
filter: grayscale(100%) filter: grayscale(100%)
} }
@ -392,6 +418,9 @@ div[data-role=controlgroup] a.ui-btn-active {
a[data-role=button] { a[data-role=button] {
background-clip: padding-box; background-clip: padding-box;
-webkit-font-smoothing: antialiased;
-webkit-user-select: none;
-webkit-background-clip: padding-box;
cursor: pointer !important; cursor: pointer !important;
font-family: inherit !important; font-family: inherit !important;
font-weight: 500 !important; font-weight: 500 !important;
@ -403,21 +432,37 @@ a[data-role=button] {
background: #292929 !important; background: #292929 !important;
} }
@keyframes rotating { @-webkit-keyframes rotating {
from { from {
-webkit-transform: rotate(0);
transform: rotate(0) transform: rotate(0)
} }
to { to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg)
}
}
@keyframes rotating {
from {
-webkit-transform: rotate(0);
transform: rotate(0)
}
to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg) transform: rotate(360deg)
} }
} }
.rotatingCircle { .rotatingCircle {
-webkit-animation: rotating 2s linear infinite;
animation: rotating 2s linear infinite animation: rotating 2s linear infinite
} }
.pluginPreviewImg { .pluginPreviewImg {
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37) box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37)
} }

View file

@ -4,6 +4,7 @@ html {
html { html {
font-size: 93%; font-size: 93%;
-webkit-text-size-adjust: 100%;
text-size-adjust: 100%; text-size-adjust: 100%;
} }

View file

@ -15,6 +15,7 @@
.headerSelectedPlayer, .headerSelectedPlayer,
.itemMiscInfo, .itemMiscInfo,
.navMenuOptionText { .navMenuOptionText {
-o-text-overflow: ellipsis;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden overflow: hidden
} }
@ -47,6 +48,8 @@
z-index: 1; z-index: 1;
margin: 0 !important; margin: 0 !important;
top: 6.9em !important; top: 6.9em !important;
-webkit-transition: -webkit-transform .2s ease-out;
-o-transition: transform .2s ease-out;
transition: transform .2s ease-out transition: transform .2s ease-out
} }
@ -55,14 +58,17 @@
} }
.headerUserImage { .headerUserImage {
-webkit-background-size: contain;
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center center; background-position: center center;
-webkit-border-radius: 100em;
border-radius: 100em; border-radius: 100em;
display: inline-block display: inline-block
} }
.headerUserButtonRound div { .headerUserButtonRound div {
-webkit-border-radius: 100em;
border-radius: 100em; border-radius: 100em;
background-size: cover; background-size: cover;
background-repeat: no-repeat; background-repeat: no-repeat;
@ -70,6 +76,7 @@
} }
.headerButton { .headerButton {
-webkit-flex-shrink: 0;
flex-shrink: 0 flex-shrink: 0
} }
@ -83,25 +90,35 @@
} }
.pageTitle { .pageTitle {
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: inline-flex; display: inline-flex;
margin: .3em 0 0 .5em; margin: .3em 0 0 .5em;
height: 1.7em; height: 1.7em;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center; align-items: center;
-webkit-flex-shrink: 1;
flex-shrink: 1 flex-shrink: 1
} }
.headerLeft, .headerLeft,
.skinHeader { .skinHeader {
display: flex; display: -webkit-box;
display: -webkit-flex
} }
.detailButton, .detailButton,
.skinHeader { .skinHeader {
flex-direction: column; flex-direction: column;
-webkit-flex-direction: column;
-webkit-box-orient: vertical;
-webkit-box-direction: normal
} }
.pageTitleWithLogo { .pageTitleWithLogo {
background-position: left center; background-position: left center;
-webkit-background-size: contain;
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
width: 13.2em width: 13.2em
@ -121,7 +138,7 @@
.headerLeft, .headerLeft,
.headerRight { .headerRight {
justify-content: center; -webkit-box-align: center
} }
.hiddenViewMenuBar .skinHeader { .hiddenViewMenuBar .skinHeader {
@ -134,10 +151,13 @@
.headerLeft { .headerLeft {
display: flex; display: flex;
-webkit-align-items: center;
align-items: center; align-items: center;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1; flex-grow: 1;
overflow: hidden; overflow: hidden;
justify-content: left; justify-content: flex-start;
} }
.sectionTabs { .sectionTabs {
@ -145,8 +165,13 @@
} }
.headerRight { .headerRight {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-align-items: center;
align-items: center; align-items: center;
-webkit-box-pack: end;
-webkit-justify-content: flex-end;
justify-content: flex-end justify-content: flex-end
} }
@ -155,19 +180,27 @@
} }
.navMenuOption { .navMenuOption {
display: -webkit-box !important;
display: -webkit-flex !important;
display: flex !important; display: flex !important;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center; align-items: center;
text-decoration: none; text-decoration: none;
color: inherit; color: inherit;
padding: .9em 0 .9em 2.4em !important; padding: .9em 0 .9em 2.4em !important;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1; flex-grow: 1;
font-weight: 400 !important; font-weight: 400 !important;
margin: 0 !important; margin: 0 !important;
-webkit-border-radius: 0 !important;
border-radius: 0 !important border-radius: 0 !important
} }
.navMenuOptionIcon { .navMenuOptionIcon {
margin-right: 1.2em; margin-right: 1.2em;
-webkit-flex-shrink: 0;
flex-shrink: 0 flex-shrink: 0
} }
@ -181,6 +214,8 @@
} }
.dashboardDocument .skinBody { .dashboardDocument .skinBody {
-webkit-transition: left ease-in-out .3s, padding ease-in-out .3s;
-o-transition: left ease-in-out .3s, padding ease-in-out .3s;
transition: left ease-in-out .3s, padding ease-in-out .3s; transition: left ease-in-out .3s, padding ease-in-out .3s;
position: absolute; position: absolute;
top: 0; top: 0;
@ -210,7 +245,9 @@
z-index: inherit !important; z-index: inherit !important;
left: 0 !important; left: 0 !important;
top: 0 !important; top: 0 !important;
-webkit-transform: none !important;
transform: none !important; transform: none !important;
-webkit-box-shadow: none !important;
box-shadow: none !important; box-shadow: none !important;
width: 20.205em !important; width: 20.205em !important;
font-size: 94% font-size: 94%
@ -293,6 +330,8 @@
} }
.flexPageTabContent.is-active { .flexPageTabContent.is-active {
display: -webkit-box !important;
display: -webkit-flex !important;
display: flex !important display: flex !important
} }
@ -308,6 +347,7 @@
margin: 1.5em 0; margin: 1.5em 0;
background: #222; background: #222;
padding: .8em .8em .8em 3em; padding: .8em .8em .8em 3em;
-webkit-border-radius: .3em;
border-radius: .3em; border-radius: .3em;
position: relative position: relative
} }
@ -366,6 +406,7 @@
} }
.itemBackdrop { .itemBackdrop {
-webkit-background-size: cover;
background-size: cover; background-size: cover;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
@ -468,6 +509,7 @@
position: absolute; position: absolute;
top: 14.5%; top: 14.5%;
right: 10.5%; right: 10.5%;
-webkit-background-size: contain;
background-size: contain background-size: contain
} }
@ -498,6 +540,7 @@
.itemDetailImage { .itemDetailImage {
width: 100% !important; width: 100% !important;
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
} }
@media all and (max-width:62.5em) { @media all and (max-width:62.5em) {
@ -528,8 +571,7 @@
top: 50%; top: 50%;
left: 50%; left: 50%;
margin: -2.2em 0 0 -2.2em; margin: -2.2em 0 0 -2.2em;
border: 2.7px solid rgba(255, 255, 255, .6); padding: 0.4em !important;
padding: .38em !important;
color: rgba(255, 255, 255, .76) color: rgba(255, 255, 255, .76)
} }
@ -566,6 +608,8 @@
.detailButton, .detailButton,
.mainDetailButtons { .mainDetailButtons {
display: flex; display: flex;
display: -webkit-box;
display: -webkit-flex
} }
.itemName { .itemName {
@ -586,7 +630,10 @@
.mainDetailButtons { .mainDetailButtons {
display: flex; display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center; align-items: center;
-webkit-flex-wrap: wrap;
flex-wrap: wrap; flex-wrap: wrap;
margin: 1em 0; margin: 1em 0;
} }
@ -594,6 +641,7 @@
.recordingFields button { .recordingFields button {
margin-left: 0; margin-left: 0;
margin-right: .5em; margin-right: .5em;
-webkit-flex-shrink: 0;
flex-shrink: 0 flex-shrink: 0
} }
@ -604,7 +652,11 @@
.detailButton { .detailButton {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center; justify-content: center;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center; align-items: center;
margin: 0 !important; margin: 0 !important;
padding: .5em .7em !important padding: .5em .7em !important
@ -632,9 +684,18 @@
} }
.detailButton-content { .detailButton-content {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
flex-direction: column; flex-direction: column;
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center; justify-content: center;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center align-items: center
} }
@ -706,14 +767,21 @@
} }
.itemMiscInfo { .itemMiscInfo {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-flex-wrap: wrap;
flex-wrap: wrap; flex-wrap: wrap;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center align-items: center
} }
@media all and (max-width:31.25em) { @media all and (max-width:31.25em) {
.mobileDetails .itemMiscInfo { .mobileDetails .itemMiscInfo {
text-align: center; text-align: center;
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center justify-content: center
} }
@ -793,6 +861,7 @@
} }
.btnSyncComplete i { .btnSyncComplete i {
-webkit-border-radius: 100em;
border-radius: 100em border-radius: 100em
} }
@ -801,9 +870,14 @@
} }
.mediaInfoIcons { .mediaInfoIcons {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center; align-items: center;
margin: 1em 0; margin: 1em 0;
-webkit-flex-wrap: wrap;
flex-wrap: wrap flex-wrap: wrap
} }
@ -841,6 +915,7 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
.sectionTitleButton { .sectionTitleButton {
margin-left: 1.5em !important; margin-left: 1.5em !important;
-webkit-flex-shrink: 0;
flex-shrink: 0 flex-shrink: 0
} }
@ -850,17 +925,22 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
.sectionTitleIconButton { .sectionTitleIconButton {
margin-left: 1.5em !important; margin-left: 1.5em !important;
-webkit-flex-shrink: 0;
flex-shrink: 0; flex-shrink: 0;
font-size: 84% !important; font-size: 84% !important;
padding: .5em !important padding: .5em !important
} }
.horizontalItemsContainer { .horizontalItemsContainer {
display: -webkit-box;
display: -webkit-flex;
display: flex display: flex
} }
.sectionTitleTextButton { .sectionTitleTextButton {
margin: 0 !important; margin: 0 !important;
display: -webkit-inline-box !important;
display: -webkit-inline-flex !important;
display: inline-flex !important; display: inline-flex !important;
color: inherit !important color: inherit !important
} }
@ -932,6 +1012,8 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
} }
.itemsViewSettingsContainer { .itemsViewSettingsContainer {
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center justify-content: center
} }

View file

@ -28,13 +28,17 @@
.jstree-wholerow-hovered { .jstree-wholerow-hovered {
background: #38c !important; background: #38c !important;
-webkit-border-radius: 0 !important;
border-radius: 0 !important; border-radius: 0 !important;
-webkit-box-shadow: none !important;
box-shadow: none !important box-shadow: none !important
} }
.jstree-default .jstree-hovered { .jstree-default .jstree-hovered {
background: 0 0 !important; background: 0 0 !important;
-webkit-border-radius: 0 !important;
border-radius: 0 !important; border-radius: 0 !important;
-webkit-box-shadow: none !important;
box-shadow: none !important; box-shadow: none !important;
color: #fff !important color: #fff !important
} }

View file

@ -1,5 +1,6 @@
.scrollX { .scrollX {
overflow-x: auto; overflow-x: auto;
-webkit-overflow-scrolling: touch;
overflow-y: hidden; overflow-y: hidden;
white-space: nowrap; white-space: nowrap;
} }
@ -9,11 +10,11 @@
} }
.hiddenScrollX, .layout-tv .scrollX { .hiddenScrollX, .layout-tv .scrollX {
scrollbar-width: none; -ms-overflow-style: none;
} }
.hiddenScrollX-forced { .hiddenScrollX-forced {
scrollbar-width: none; overflow: -moz-scrollbars-none;
} }
.hiddenScrollX::-webkit-scrollbar, .layout-tv .scrollX::-webkit-scrollbar { .hiddenScrollX::-webkit-scrollbar, .layout-tv .scrollX::-webkit-scrollbar {
@ -23,21 +24,25 @@
.scrollY { .scrollY {
overflow-y: auto; overflow-y: auto;
-webkit-overflow-scrolling: touch;
overflow-x: hidden; overflow-x: hidden;
} }
.smoothScrollY { .smoothScrollY {
overflow-y: auto; overflow-y: auto;
-webkit-overflow-scrolling: touch;
overflow-x: hidden; overflow-x: hidden;
scroll-behavior: smooth; scroll-behavior: smooth;
} }
.hiddenScrollY, .layout-tv .smoothScrollY { .hiddenScrollY, .layout-tv .smoothScrollY {
scrollbar-width: none; -ms-overflow-style: none;
/* Can't do this because it not only hides the scrollbar, but also prevents scrolling */
/*overflow: -moz-scrollbars-none;*/
} }
.hiddenScrollY-forced { .hiddenScrollY-forced {
scrollbar-width: none; overflow: -moz-scrollbars-none;
} }
.hiddenScrollY::-webkit-scrollbar, .layout-tv .smoothScrollY::-webkit-scrollbar, .layout-tv .scrollY::-webkit-scrollbar { .hiddenScrollY::-webkit-scrollbar, .layout-tv .smoothScrollY::-webkit-scrollbar, .layout-tv .scrollY::-webkit-scrollbar {

View file

@ -20,12 +20,18 @@ html {
.layout-mobile, .layout-mobile,
.layout-tv { .layout-tv {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none user-select: none
} }
body { body {
overflow-x: hidden; overflow-x: hidden;
background-color: transparent !important; background-color: transparent !important;
-webkit-font-smoothing: antialiased
} }
.mainAnimatedPage { .mainAnimatedPage {

View file

@ -1,6 +1,9 @@
.chapterThumbTextContainer, .chapterThumbTextContainer,
.videoOsdBottom { .videoOsdBottom {
user-select: none; user-select: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none
} }
.osdPoster img, .osdPoster img,
@ -12,10 +15,13 @@
} }
.osdHeader { .osdHeader {
-webkit-transition: opacity .3s ease-out;
-o-transition: opacity .3s ease-out;
transition: opacity .3s ease-out; transition: opacity .3s ease-out;
position: relative; position: relative;
z-index: 1; z-index: 1;
background: rgba(0, 0, 0, 0.7) !important; background: rgba(0, 0, 0, 0.7) !important;
-webkit-backdrop-filter: none !important;
backdrop-filter: none !important; backdrop-filter: none !important;
color: #eee !important; color: #eee !important;
} }
@ -29,13 +35,17 @@
} }
.chapterThumbContainer { .chapterThumbContainer {
-webkit-box-shadow: 0 0 1.9vh #000;
box-shadow: 0 0 1.9vh #000; box-shadow: 0 0 1.9vh #000;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1; flex-grow: 1;
position: relative position: relative
} }
.chapterThumb { .chapterThumb {
background-position: center center; background-position: center center;
-webkit-background-size: contain;
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
border: 0; border: 0;
@ -81,12 +91,20 @@
position: fixed; position: fixed;
background-color: rgba(0, 0, 0, 0.7); background-color: rgba(0, 0, 0, 0.7);
padding: 1%; padding: 1%;
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-flex-direction: row;
flex-direction: row; flex-direction: row;
will-change: opacity; will-change: opacity;
-webkit-transition: opacity 0.3s ease-out;
-o-transition: opacity 0.3s ease-out;
transition: opacity 0.3s ease-out; transition: opacity 0.3s ease-out;
color: #fff; color: #fff;
user-select: none user-select: none;
-webkit-touch-callout: none
} }
.videoOsdBottom-hidden { .videoOsdBottom-hidden {
@ -94,35 +112,51 @@
} }
.osdControls { .osdControls {
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1 flex-grow: 1
} }
.videoOsdBottom .buttons { .videoOsdBottom .buttons {
padding: .25em 0 0; padding: .25em 0 0;
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-flex-wrap: wrap;
flex-wrap: wrap; flex-wrap: wrap;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center align-items: center
} }
.osdVolumeSliderContainer { .osdVolumeSliderContainer {
width: 9em; width: 9em;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1 flex-grow: 1
} }
.osdMediaInfo, .osdMediaInfo,
.volumeButtons { .volumeButtons {
display: flex; display: flex;
display: -webkit-box;
display: -webkit-flex;
align-items: center; align-items: center;
-webkit-box-align: center
} }
.volumeButtons { .volumeButtons {
margin: 0 .5em 0 auto; margin: 0 .5em 0 auto;
display: flex; display: flex;
-webkit-align-items: center;
align-items: center align-items: center
} }
.osdTimeText { .osdTimeText {
margin-left: 1em; margin-left: 1em;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none user-select: none
} }
@ -136,10 +170,15 @@
position: absolute; position: absolute;
height: auto; height: auto;
width: 100%; width: 100%;
-webkit-box-shadow: 0 0 1.9vh #000;
box-shadow: 0 0 1.9vh #000; box-shadow: 0 0 1.9vh #000;
border: .08em solid #222; border: .08em solid #222;
user-drag: none; user-drag: none;
user-select: none user-select: none;
-moz-user-select: none;
-webkit-user-drag: none;
-webkit-user-select: none;
-ms-user-select: none
} }
.osdTitle, .osdTitle,
@ -149,6 +188,7 @@
.osdMediaInfo { .osdMediaInfo {
display: flex; display: flex;
-webkit-align-items: center;
align-items: center align-items: center
} }
@ -157,14 +197,23 @@
} }
.osdTextContainer { .osdTextContainer {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center; align-items: center;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; user-select: none;
margin-bottom: .7em; margin-bottom: .7em;
padding-left: .5em padding-left: .5em
} }
.osdMainTextContainer { .osdMainTextContainer {
-webkit-box-align: baseline;
-webkit-align-items: baseline;
align-items: baseline align-items: baseline
} }
@ -172,13 +221,28 @@
margin-left: auto; margin-left: auto;
} }
@-moz-keyframes spin {
100% {
-moz-transform: rotate(360deg);
}
}
@-webkit-keyframes spin {
100% {
-webkit-transform: rotate(360deg);
}
}
@keyframes spin { @keyframes spin {
100% { 100% {
-webkit-transform: rotate(360deg);
transform:rotate(360deg); transform:rotate(360deg);
} }
} }
.osdMediaStatus .animate { .osdMediaStatus .animate {
-webkit-animation:spin 4s linear infinite;
-moz-animation:spin 4s linear infinite;
animation:spin 4s linear infinite; animation:spin 4s linear infinite;
} }

View file

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Before After
Before After

View file

@ -17,7 +17,7 @@ _define("fetch", function() {
}); });
// flvjs // flvjs
var flvjs = require("flv.js").default; var flvjs = require("flv.js/dist/flv").default;
_define("flvjs", function() { _define("flvjs", function() {
return flvjs; return flvjs;
}); });

View file

@ -1,4 +1,4 @@
define(['browser', 'connectionManager', 'playbackManager', 'dom', 'css!./backdrop'], function (browser, connectionManager, playbackManager, dom) { define(['browser', 'connectionManager', 'playbackManager', 'dom', "userSettings", 'css!./backdrop'], function (browser, connectionManager, playbackManager, dom, userSettings) {
'use strict'; 'use strict';
function enableAnimation(elem) { function enableAnimation(elem) {
@ -236,10 +236,15 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'css!./backdro
return true; return true;
} }
function enabled() {
return userSettings.enableBackdrops();
}
var rotationInterval; var rotationInterval;
var currentRotatingImages = []; var currentRotatingImages = [];
var currentRotationIndex = -1; var currentRotationIndex = -1;
function setBackdrops(items, imageOptions, enableImageRotation) { function setBackdrops(items, imageOptions, enableImageRotation) {
if (enabled()) {
var images = getImageUrls(items, imageOptions); var images = getImageUrls(items, imageOptions);
if (images.length) { if (images.length) {
@ -248,6 +253,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', 'css!./backdro
clearBackdrop(); clearBackdrop();
} }
} }
}
function startRotation(images, enableImageRotation) { function startRotation(images, enableImageRotation) {
if (arraysEqual(images, currentRotatingImages)) { if (arraysEqual(images, currentRotatingImages)) {

View file

@ -18,6 +18,7 @@ button {
padding: 0; padding: 0;
display: block; display: block;
color: inherit !important; color: inherit !important;
-webkit-tap-highlight-color: rgba(0,0,0,0);
outline: none !important; outline: none !important;
cursor: pointer; cursor: pointer;
contain: layout style; contain: layout style;
@ -79,6 +80,8 @@ button {
margin: 0.6em; margin: 0.6em;
transition: none; transition: none;
border: 0 solid transparent; border: 0 solid transparent;
/* These both are needed in case cardBox is a button */
-webkit-tap-highlight-color: rgba(0,0,0,0);
outline: none !important; outline: none !important;
contain: layout; contain: layout;
contain: style; contain: style;
@ -146,6 +149,7 @@ button {
background-size: cover; background-size: cover;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center center; background-position: center center;
display: -webkit-flex;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -179,6 +183,7 @@ button {
margin: 0 !important; margin: 0 !important;
/* Needed in safari */ /* Needed in safari */
height: 100%; height: 100%;
-webkit-tap-highlight-color: rgba(0,0,0,0);
outline: none !important; outline: none !important;
contain: strict; contain: strict;
} }
@ -342,6 +347,7 @@ button {
border: 0 !important; border: 0 !important;
padding: 0 !important; padding: 0 !important;
cursor: pointer; cursor: pointer;
-webkit-tap-highlight-color: rgba(0,0,0,0);
outline: none !important; outline: none !important;
color: inherit; color: inherit;
vertical-align: middle; vertical-align: middle;

View file

@ -16,6 +16,7 @@
.dialog { .dialog {
margin: 0; margin: 0;
border-radius: .2em; border-radius: .2em;
-webkit-font-smoothing: antialiased;
border: 0; border: 0;
padding: 0; padding: 0;
will-change: transform, opacity; will-change: transform, opacity;

View file

@ -155,7 +155,7 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro
initCenterFocus(this, this.scroller); initCenterFocus(this, this.scroller);
} }
if (bindHeader) { if (bindHeader && layoutManager.mobile) {
initHeadroom(this); initHeadroom(this);
} }

View file

@ -5,6 +5,7 @@
margin-top: 0 !important; margin-top: 0 !important;
margin-bottom: 0 !important; margin-bottom: 0 !important;
margin-right: 0 !important; margin-right: 0 !important;
-webkit-border-radius: 0 !important;
border-radius: 0 !important; border-radius: 0 !important;
max-height: none !important; max-height: none !important;
max-width: none !important max-width: none !important
@ -28,8 +29,8 @@
@media all and (min-width:400px) { @media all and (min-width:400px) {
.dynamicFilterDialog { .dynamicFilterDialog {
width: 300px; width: 20.16em;
margin-left: -150px !important; margin-left: -10.08em !important;
left: 50% !important left: 50% !important
} }
} }

View file

@ -13,11 +13,13 @@
.homeLibraryIcon { .homeLibraryIcon {
margin-left: .5em; margin-left: .5em;
margin-right: .5em; margin-right: .5em;
-webkit-flex-shrink: 0;
flex-shrink: 0 flex-shrink: 0
} }
.homeLibraryText { .homeLibraryText {
white-space: nowrap; white-space: nowrap;
-o-text-overflow: ellipsis;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden overflow: hidden
} }

View file

@ -95,23 +95,19 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
} }
function getMediaStreamAudioTracks(mediaSource) { function getMediaStreamAudioTracks(mediaSource) {
return mediaSource.MediaStreams.filter(function (s) { return mediaSource.MediaStreams.filter(function (s) {
return s.Type === 'Audio'; return s.Type === 'Audio';
}); });
} }
function getMediaStreamTextTracks(mediaSource) { function getMediaStreamTextTracks(mediaSource) {
return mediaSource.MediaStreams.filter(function (s) { return mediaSource.MediaStreams.filter(function (s) {
return s.Type === 'Subtitle'; return s.Type === 'Subtitle';
}); });
} }
function zoomIn(elem) { function zoomIn(elem) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
var duration = 240; var duration = 240;
elem.style.animation = 'htmlvideoplayer-zoomin ' + duration + 'ms ease-in normal'; elem.style.animation = 'htmlvideoplayer-zoomin ' + duration + 'ms ease-in normal';
dom.addEventListener(elem, dom.whichAnimationEvent(), resolve, { dom.addEventListener(elem, dom.whichAnimationEvent(), resolve, {
@ -1429,7 +1425,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
if (!appHost.supports('htmlvideoautoplay')) { if (!appHost.supports('htmlvideoautoplay')) {
html += '<video class="' + cssClass + '" preload="metadata" autoplay="autoplay" controls="controls" webkit-playsinline playsinline>'; html += '<video class="' + cssClass + '" preload="metadata" autoplay="autoplay" controls="controls" webkit-playsinline playsinline>';
} else { } else {
// Chrome 35 won't play with preload none // Chrome 35 won't play with preload none
html += '<video class="' + cssClass + '" preload="metadata" autoplay="autoplay" webkit-playsinline playsinline>'; html += '<video class="' + cssClass + '" preload="metadata" autoplay="autoplay" webkit-playsinline playsinline>';
} }
@ -1805,7 +1800,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
}; };
HtmlVideoPlayer.prototype.getAspectRatio = function () { HtmlVideoPlayer.prototype.getAspectRatio = function () {
return this._currentAspectRatio; return this._currentAspectRatio || "auto";
}; };
HtmlVideoPlayer.prototype.getSupportedAspectRatios = function () { HtmlVideoPlayer.prototype.getSupportedAspectRatios = function () {

View file

@ -42,6 +42,7 @@ video::-webkit-media-controls {
.htmlvideoplayer::cue { .htmlvideoplayer::cue {
background-color: transparent; background-color: transparent;
text-shadow: 0.14em 0.14em 0.14em rgba(0, 0, 0, 1); text-shadow: 0.14em 0.14em 0.14em rgba(0, 0, 0, 1);
-webkit-font-smoothing: antialiased;
font-family: inherit; font-family: inherit;
} }

View file

@ -18,9 +18,21 @@
.lazy-image-fadein { .lazy-image-fadein {
opacity: 0; opacity: 0;
-webkit-animation-duration: .8s;
-moz-animation-duration: .8s;
-o-animation-duration: .8s;
animation-duration: .8s; animation-duration: .8s;
-webkit-animation-name: popInAnimation;
-moz-animation-name: popInAnimation;
-o-animation-name: popInAnimation;
animation-name: popInAnimation; animation-name: popInAnimation;
-webkit-animation-fill-mode: forwards;
-moz-animation-fill-mode: forwards;
-o-animation-fill-mode: forwards;
animation-fill-mode: forwards; animation-fill-mode: forwards;
-webkit-animation-timing-function: cubic-bezier(0,0,.5,1);
-moz-animation-timing-function: cubic-bezier(0,0,.5,1);
-o-animation-timing-function: cubic-bezier(0,0,.5,1);
animation-timing-function: cubic-bezier(0,0,.5,1); animation-timing-function: cubic-bezier(0,0,.5,1);
} }

View file

@ -14,6 +14,7 @@
.indicator { .indicator {
border-radius: 100em; border-radius: 100em;
display: -webkit-flex;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -42,6 +43,7 @@
.countIndicator { .countIndicator {
border-radius: 100em; border-radius: 100em;
display: -webkit-flex;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -53,6 +55,7 @@
.playedIndicator { .playedIndicator {
border-radius: 100em; border-radius: 100em;
display: -webkit-flex;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -64,6 +67,7 @@
.videoIndicator { .videoIndicator {
background: #444; background: #444;
border-radius: 100em; border-radius: 100em;
display: -webkit-flex;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View file

@ -70,7 +70,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
commands.push({ commands.push({
name: globalize.translate("InstantMix"), name: globalize.translate("InstantMix"),
id: "instantmix", id: "instantmix",
icon: "shuffle" icon: "explore"
}); });
} }
} }
@ -178,7 +178,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
commands.push({ commands.push({
name: globalize.translate("EditImages"), name: globalize.translate("EditImages"),
id: "editimages", id: "editimages",
icon: "edit" icon: "image"
}); });
} }
} }

View file

@ -35,6 +35,8 @@
} }
.listItem-indexnumberleft { .listItem-indexnumberleft {
min-width: 2%;
text-align: center;
margin-right: 1em; margin-right: 1em;
} }

View file

@ -7,11 +7,20 @@
.mdlSpinnerActive { .mdlSpinnerActive {
display: inline-block; display: inline-block;
-webkit-animation: mdl-spinner__container-rotate 1568.23529412ms linear infinite;
animation: mdl-spinner__container-rotate 1568.23529412ms linear infinite; animation: mdl-spinner__container-rotate 1568.23529412ms linear infinite;
} }
@-webkit-keyframes mdl-spinner__container-rotate {
to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes mdl-spinner__container-rotate { @keyframes mdl-spinner__container-rotate {
to { to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); transform: rotate(360deg);
} }
} }
@ -28,6 +37,7 @@
} }
.mdl-spinner__layer-1-active { .mdl-spinner__layer-1-active {
-webkit-animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
} }
@ -36,6 +46,7 @@
} }
.mdl-spinner__layer-2-active { .mdl-spinner__layer-2-active {
-webkit-animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
} }
@ -44,6 +55,7 @@
} }
.mdl-spinner__layer-3-active { .mdl-spinner__layer-3-active {
-webkit-animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
} }
@ -52,39 +64,90 @@
} }
.mdl-spinner__layer-4-active { .mdl-spinner__layer-4-active {
-webkit-animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
} }
@keyframes mdl-spinner__fill-unfill-rotate { @-webkit-keyframes mdl-spinner__fill-unfill-rotate {
12.5% { 12.5% {
-webkit-transform: rotate(135deg);
transform: rotate(135deg); transform: rotate(135deg);
} }
25% { 25% {
-webkit-transform: rotate(270deg);
transform: rotate(270deg); transform: rotate(270deg);
} }
37.5% { 37.5% {
-webkit-transform: rotate(405deg);
transform: rotate(405deg); transform: rotate(405deg);
} }
50% { 50% {
-webkit-transform: rotate(540deg);
transform: rotate(540deg); transform: rotate(540deg);
} }
62.5% { 62.5% {
-webkit-transform: rotate(675deg);
transform: rotate(675deg); transform: rotate(675deg);
} }
75% { 75% {
-webkit-transform: rotate(810deg);
transform: rotate(810deg); transform: rotate(810deg);
} }
87.5% { 87.5% {
-webkit-transform: rotate(945deg);
transform: rotate(945deg); transform: rotate(945deg);
} }
to { to {
-webkit-transform: rotate(1080deg);
transform: rotate(1080deg);
}
}
@keyframes mdl-spinner__fill-unfill-rotate {
12.5% {
-webkit-transform: rotate(135deg);
transform: rotate(135deg);
}
25% {
-webkit-transform: rotate(270deg);
transform: rotate(270deg);
}
37.5% {
-webkit-transform: rotate(405deg);
transform: rotate(405deg);
}
50% {
-webkit-transform: rotate(540deg);
transform: rotate(540deg);
}
62.5% {
-webkit-transform: rotate(675deg);
transform: rotate(675deg);
}
75% {
-webkit-transform: rotate(810deg);
transform: rotate(810deg);
}
87.5% {
-webkit-transform: rotate(945deg);
transform: rotate(945deg);
}
to {
-webkit-transform: rotate(1080deg);
transform: rotate(1080deg); transform: rotate(1080deg);
} }
} }
@ -98,6 +161,32 @@
* - https://github.com/Polymer/paper-spinner/issues/9 * - https://github.com/Polymer/paper-spinner/issues/9
* - https://code.google.com/p/chromium/issues/detail?id=436255 * - https://code.google.com/p/chromium/issues/detail?id=436255
*/ */
@-webkit-keyframes mdl-spinner__layer-1-fade-in-out {
from {
opacity: 0.99;
}
25% {
opacity: 0.99;
}
26% {
opacity: 0;
}
89% {
opacity: 0;
}
90% {
opacity: 0.99;
}
100% {
opacity: 0.99;
}
}
@keyframes mdl-spinner__layer-1-fade-in-out { @keyframes mdl-spinner__layer-1-fade-in-out {
from { from {
opacity: 0.99; opacity: 0.99;
@ -124,6 +213,28 @@
} }
} }
@-webkit-keyframes mdl-spinner__layer-2-fade-in-out {
from {
opacity: 0;
}
15% {
opacity: 0;
}
25% {
opacity: 0.99;
}
50% {
opacity: 0.99;
}
51% {
opacity: 0;
}
}
@keyframes mdl-spinner__layer-2-fade-in-out { @keyframes mdl-spinner__layer-2-fade-in-out {
from { from {
opacity: 0; opacity: 0;
@ -146,6 +257,28 @@
} }
} }
@-webkit-keyframes mdl-spinner__layer-3-fade-in-out {
from {
opacity: 0;
}
40% {
opacity: 0;
}
50% {
opacity: 0.99;
}
75% {
opacity: 0.99;
}
76% {
opacity: 0;
}
}
@keyframes mdl-spinner__layer-3-fade-in-out { @keyframes mdl-spinner__layer-3-fade-in-out {
from { from {
opacity: 0; opacity: 0;
@ -168,6 +301,28 @@
} }
} }
@-webkit-keyframes mdl-spinner__layer-4-fade-in-out {
from {
opacity: 0;
}
65% {
opacity: 0;
}
75% {
opacity: 0.99;
}
90% {
opacity: 0.99;
}
100% {
opacity: 0;
}
}
@keyframes mdl-spinner__layer-4-fade-in-out { @keyframes mdl-spinner__layer-4-fade-in-out {
from { from {
opacity: 0; opacity: 0;
@ -211,6 +366,7 @@
border-color: inherit; border-color: inherit;
border-bottom-color: transparent !important; border-bottom-color: transparent !important;
border-radius: 50%; border-radius: 50%;
-webkit-animation: none;
animation: none; animation: none;
position: absolute; position: absolute;
top: 0; top: 0;
@ -221,47 +377,91 @@
.mdl-spinner__circleLeft { .mdl-spinner__circleLeft {
border-right-color: transparent !important; border-right-color: transparent !important;
-webkit-transform: rotate(129deg);
transform: rotate(129deg); transform: rotate(129deg);
} }
.mdl-spinner__circleLeft-active { .mdl-spinner__circleLeft-active {
-webkit-animation: mdl-spinner__left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: mdl-spinner__left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
} }
.mdl-spinner__circleRight { .mdl-spinner__circleRight {
left: -100%; left: -100%;
border-left-color: transparent !important; border-left-color: transparent !important;
-webkit-transform: rotate(-129deg);
transform: rotate(-129deg); transform: rotate(-129deg);
} }
.mdl-spinner__circleRight-active { .mdl-spinner__circleRight-active {
-webkit-animation: mdl-spinner__right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
animation: mdl-spinner__right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
} }
@keyframes mdl-spinner__left-spin { @-webkit-keyframes mdl-spinner__left-spin {
from { from {
-webkit-transform: rotate(130deg);
transform: rotate(130deg); transform: rotate(130deg);
} }
50% { 50% {
-webkit-transform: rotate(-5deg);
transform: rotate(-5deg); transform: rotate(-5deg);
} }
to { to {
-webkit-transform: rotate(130deg);
transform: rotate(130deg); transform: rotate(130deg);
} }
} }
@keyframes mdl-spinner__left-spin {
from {
-webkit-transform: rotate(130deg);
transform: rotate(130deg);
}
50% {
-webkit-transform: rotate(-5deg);
transform: rotate(-5deg);
}
to {
-webkit-transform: rotate(130deg);
transform: rotate(130deg);
}
}
@-webkit-keyframes mdl-spinner__right-spin {
from {
-webkit-transform: rotate(-130deg);
transform: rotate(-130deg);
}
50% {
-webkit-transform: rotate(5deg);
transform: rotate(5deg);
}
to {
-webkit-transform: rotate(-130deg);
transform: rotate(-130deg);
}
}
@keyframes mdl-spinner__right-spin { @keyframes mdl-spinner__right-spin {
from { from {
-webkit-transform: rotate(-130deg);
transform: rotate(-130deg); transform: rotate(-130deg);
} }
50% { 50% {
-webkit-transform: rotate(5deg);
transform: rotate(5deg); transform: rotate(5deg);
} }
to { to {
-webkit-transform: rotate(-130deg);
transform: rotate(-130deg); transform: rotate(-130deg);
} }
} }

View file

@ -160,7 +160,7 @@ define(["pluginManager"], function (pluginManager) {
elem.classList.add("logoScreenSaver"); elem.classList.add("logoScreenSaver");
document.body.appendChild(elem); document.body.appendChild(elem);
elem.innerHTML = '<img class="logoScreenSaverImage" src="' + pluginManager.mapPath(self, "logowhite.png") + '" />'; elem.innerHTML = '<img class="logoScreenSaverImage" src="' + pluginManager.mapPath(self, "assets/img/banner-light.png") + '" />';
} }
stopInterval(); stopInterval();

View file

@ -9,20 +9,29 @@
.touch-menu-la { .touch-menu-la {
background-color: #FFF; background-color: #FFF;
will-change: transform; will-change: transform;
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-transition: -webkit-transform ease-out 40ms, left ease-out 260ms;
-o-transition: transform ease-out 40ms, left ease-out 260ms;
transition: transform ease-out 40ms, left ease-out 260ms; transition: transform ease-out 40ms, left ease-out 260ms;
z-index: 1099 z-index: 1099
} }
.touch-menu-la.transition { .touch-menu-la.transition {
-webkit-transition: -webkit-transform ease-out 240ms, left ease-out 260ms;
-o-transition: transform ease-out 240ms, left ease-out 260ms;
transition: transform ease-out 240ms, left ease-out 260ms transition: transform ease-out 240ms, left ease-out 260ms
} }
.drawer-open { .drawer-open {
-webkit-box-shadow: 2px 0 12px rgba(0, 0, 0, .4);
box-shadow: 2px 0 12px rgba(0, 0, 0, .4) box-shadow: 2px 0 12px rgba(0, 0, 0, .4)
} }
.scrollContainer { .scrollContainer {
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1 flex-grow: 1
} }
@ -32,6 +41,8 @@
background-color: #000; background-color: #000;
opacity: 0; opacity: 0;
z-index: 1098; z-index: 1098;
-webkit-transition: opacity ease-in-out .38s, visibility ease-in-out .38s;
-o-transition: opacity ease-in-out .38s, visibility ease-in-out .38s;
transition: opacity ease-in-out .38s, visibility ease-in-out .38s; transition: opacity ease-in-out .38s, visibility ease-in-out .38s;
will-change: opacity; will-change: opacity;
background-color: rgba(0, 0, 0, .3) background-color: rgba(0, 0, 0, .3)

View file

@ -1,5 +1,10 @@
.nowPlayingInfoContainer { .nowPlayingInfoContainer {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-flex-direction: row;
flex-direction: row flex-direction: row
} }
@ -7,6 +12,26 @@
text-align: center text-align: center
} }
.btnArrowUp{
border-radius: 40% 40% 10% 10%;
}
.btnArrowLeft{
border-radius: 40% 10% 10% 40%;
}
.btnArrowRight{
border-radius: 10% 40% 40% 10%;
}
.btnArrowDown{
border-radius: 10% 10% 40% 40%;
}
.btnOk{
border-radius: 10%;
}
.nowPlayingPageTitle { .nowPlayingPageTitle {
margin: 0 0 .5em .5em margin: 0 0 .5em .5em
} }
@ -16,20 +41,28 @@
} }
.nowPlayingInfoButtons { .nowPlayingInfoButtons {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center; align-items: center;
-webkit-flex-wrap: wrap;
flex-wrap: wrap flex-wrap: wrap
} }
.nowPlayingInfoControls, .nowPlayingInfoControls,
.nowPlayingTime { .nowPlayingTime {
display: flex; display: flex;
display: -webkit-box;
display: -webkit-flex
} }
.nowPlayingPageImageContainer { .nowPlayingPageImageContainer {
width: 20%; width: 20%;
margin-right: .25em; margin-right: .25em;
position: relative; position: relative;
-webkit-flex-shrink: 0;
flex-shrink: 0 flex-shrink: 0
} }
@ -40,9 +73,16 @@
} }
.nowPlayingInfoControls { .nowPlayingInfoControls {
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1; flex-grow: 1;
display: flex; display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
flex-direction: column; flex-direction: column;
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center justify-content: center
} }
@ -51,15 +91,25 @@
left: 0; left: 0;
right: 0; right: 0;
width: 100%; width: 100%;
-webkit-box-shadow: 0 0 1.9vh #000;
box-shadow: 0 0 1.9vh #000; box-shadow: 0 0 1.9vh #000;
border: .1em solid #222; border: .1em solid #222;
user-drag: none; user-drag: none;
user-select: none; user-select: none;
-moz-user-select: none;
-webkit-user-drag: none;
-webkit-user-select: none;
-ms-user-select: none
} }
@media all and (orientation:portrait) and (max-width:50em) { @media all and (orientation:portrait) and (max-width:50em) {
.nowPlayingInfoContainer { .nowPlayingInfoContainer {
-webkit-box-orient: vertical !important;
-webkit-box-direction: normal !important;
-webkit-flex-direction: column !important;
flex-direction: column !important; flex-direction: column !important;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center align-items: center
} }
@ -73,6 +123,8 @@
} }
.nowPlayingInfoButtons { .nowPlayingInfoButtons {
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center justify-content: center
} }
@ -100,20 +152,33 @@
.nowPlayingTime { .nowPlayingTime {
display: flex; display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center; align-items: center;
margin: 0 1em margin: 0 1em
} }
.nowPlayingSecondaryButtons { .nowPlayingSecondaryButtons {
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center; align-items: center;
-webkit-flex-wrap: wrap;
flex-wrap: wrap; flex-wrap: wrap;
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center justify-content: center
} }
@media all and (min-width:50em) { @media all and (min-width:50em) {
.nowPlayingSecondaryButtons { .nowPlayingSecondaryButtons {
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1; flex-grow: 1;
-webkit-box-pack: end;
-webkit-justify-content: flex-end;
justify-content: flex-end justify-content: flex-end
} }
} }
@ -130,11 +195,13 @@
.smallBackdropPosterItem .cardOverlayInner>div { .smallBackdropPosterItem .cardOverlayInner>div {
white-space: nowrap; white-space: nowrap;
-o-text-overflow: ellipsis;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden overflow: hidden
} }
.playlistIndexIndicatorImage { .playlistIndexIndicatorImage {
-webkit-background-size: initial initial !important;
background-size: initial !important; background-size: initial !important;
background-image: url(assets/img/equalizer.gif) !important; background-image: url(assets/img/equalizer.gif) !important;
} }
@ -151,6 +218,9 @@
.nowPlayingInfoButtons .nowPlayingPageUserDataButtons { .nowPlayingInfoButtons .nowPlayingPageUserDataButtons {
display: none !important display: none !important
} }
.navigationSection .collapseContent i{
font-size: 4em;
}
} }
@media all and (max-width:47em) { @media all and (max-width:47em) {

View file

@ -215,23 +215,12 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
context.querySelector(".sendTextSection").classList.add("hide"); context.querySelector(".sendTextSection").classList.add("hide");
} }
if (!currentPlayer.isLocalPlayer) { if (-1 != supportedCommands.indexOf("Select") && !currentPlayer.isLocalPlayer) {
context.querySelector(".navigationSection").classList.remove("hide"); context.querySelector(".navigationSection").classList.remove("hide");
} else { } else {
context.querySelector(".navigationSection").classList.add("hide"); context.querySelector(".navigationSection").classList.add("hide");
} }
buttonVisible(context.querySelector(".btnArrowUp"), -1 != supportedCommands.indexOf("MoveUp"));
buttonVisible(context.querySelector(".btnArrowLeft"), -1 != supportedCommands.indexOf("MoveDown"));
buttonVisible(context.querySelector(".btnArrowRight"), -1 != supportedCommands.indexOf("MoveRight"));
buttonVisible(context.querySelector(".btnArrowDown"), -1 != supportedCommands.indexOf("MoveLeft"));
buttonVisible(context.querySelector(".btnOk"), -1 != supportedCommands.indexOf("Select"));
buttonVisible(context.querySelector(".btnBack"), -1 != supportedCommands.indexOf("Back"));
buttonVisible(context.querySelector(".btnContextMenu"), -1 != supportedCommands.indexOf("ToggleContextMenu"));
buttonVisible(context.querySelector(".btnShowSearch"), -1 != supportedCommands.indexOf("GoToSearch"));
buttonVisible(context.querySelector(".bthShowSettings"), -1 != supportedCommands.indexOf("GoToSettings"));
buttonVisible(context.querySelector(".btnGoHome"), -1 != supportedCommands.indexOf("GoHome"));
buttonVisible(context.querySelector(".btnStop"), null != item); buttonVisible(context.querySelector(".btnStop"), null != item);
buttonVisible(context.querySelector(".btnNextTrack"), null != item); buttonVisible(context.querySelector(".btnNextTrack"), null != item);
buttonVisible(context.querySelector(".btnPreviousTrack"), null != item); buttonVisible(context.querySelector(".btnPreviousTrack"), null != item);

View file

@ -34,15 +34,12 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr
id: "dark", id: "dark",
isDefault: true, isDefault: true,
isDefaultServerDashboard: true isDefaultServerDashboard: true
}, {
name: "Emby",
id: "emby"
}, { }, {
name: "Light", name: "Light",
id: "light" id: "light"
}, { }, {
name: "Purple Haze", name: "Purple Haze",
id: "purple-haze" id: "purplehaze"
}, { }, {
name: "Windows Media Center", name: "Windows Media Center",
id: "wmc" id: "wmc"

View file

@ -41,6 +41,9 @@
height: auto; height: auto;
max-width: 100%; max-width: 100%;
max-height: 100%; max-height: 100%;
-ms-transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
position: absolute; position: absolute;
left: 50%; left: 50%;

View file

@ -40,6 +40,8 @@
margin-right: 1%; margin-right: 1%;
top: 2.5em; top: 2.5em;
height: 1.4em; height: 1.4em;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1; flex-grow: 1;
border-radius: .3em; border-radius: .3em;
z-index: 1; z-index: 1;

View file

@ -11,6 +11,7 @@
background-color: rgba(0, 0, 0, 0.7); background-color: rgba(0, 0, 0, 0.7);
color: #fff; color: #fff;
user-select: none; user-select: none;
-webkit-touch-callout: none;
} }
.upNextDialog-hidden { .upNextDialog-hidden {
@ -66,4 +67,8 @@
border: 0; border: 0;
user-drag: none; user-drag: none;
user-select: none; user-select: none;
-moz-user-select: none;
-webkit-user-drag: none;
-webkit-user-select: none;
-ms-user-select: none;
} }

View file

@ -1,4 +1,4 @@
define(["loading", "appRouter", "layoutManager", "userSettings", "connectionManager", "cardBuilder", "datetime", "mediaInfo", "backdrop", "listView", "itemContextMenu", "itemHelper", "dom", "indicators", "apphost", "imageLoader", "libraryMenu", "globalize", "browser", "events", "scrollHelper", "playbackManager", "libraryBrowser", "scrollStyles", "emby-itemscontainer", "emby-checkbox", "emby-button", "emby-playstatebutton", "emby-ratingbutton", "emby-scroller", "emby-select"], function (loading, appRouter, layoutManager, userSettings, connectionManager, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, dom, indicators, appHost, imageLoader, libraryMenu, globalize, browser, events, scrollHelper, playbackManager, libraryBrowser) { define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuilder", "datetime", "mediaInfo", "backdrop", "listView", "itemContextMenu", "itemHelper", "dom", "indicators", "apphost", "imageLoader", "libraryMenu", "globalize", "browser", "events", "scrollHelper", "playbackManager", "libraryBrowser", "scrollStyles", "emby-itemscontainer", "emby-checkbox", "emby-button", "emby-playstatebutton", "emby-ratingbutton", "emby-scroller", "emby-select"], function (loading, appRouter, layoutManager, connectionManager, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, dom, indicators, appHost, imageLoader, libraryMenu, globalize, browser, events, scrollHelper, playbackManager, libraryBrowser) {
"use strict"; "use strict";
function getPromise(apiClient, params) { function getPromise(apiClient, params) {
@ -445,19 +445,13 @@ define(["loading", "appRouter", "layoutManager", "userSettings", "connectionMana
} }
} }
function enabled() {
return userSettings.enableBackdrops();
}
function renderBackdrop(page, item, apiClient) { function renderBackdrop(page, item, apiClient) {
if (enabled()) {
if (dom.getWindowSize().innerWidth >= 1000) { if (dom.getWindowSize().innerWidth >= 1000) {
backdrop.setBackdrops([item]); backdrop.setBackdrops([item]);
} else { } else {
backdrop.clear(); backdrop.clear();
} }
} }
}
function renderDetailPageBackdrop(page, item, apiClient) { function renderDetailPageBackdrop(page, item, apiClient) {
var imgUrl; var imgUrl;

View file

@ -187,16 +187,12 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
switch (providerId = providerId.toLowerCase()) { switch (providerId = providerId.toLowerCase()) {
case "m3u": case "m3u":
return "M3U"; return "M3U";
case "hdhomerun": case "hdhomerun":
return "HDHomerun"; return "HDHomeRun";
case "hauppauge": case "hauppauge":
return "Hauppauge"; return "Hauppauge";
case "satip": case "satip":
return "DVB"; return "DVB";
default: default:
return "Unknown"; return "Unknown";
} }
@ -206,13 +202,8 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
switch (providerId = providerId.toLowerCase()) { switch (providerId = providerId.toLowerCase()) {
case "schedulesdirect": case "schedulesdirect":
return "Schedules Direct"; return "Schedules Direct";
case "xmltv": case "xmltv":
return "Xml TV"; return "XMLTV";
case "emby":
return "Emby Guide";
default: default:
return "Unknown"; return "Unknown";
} }
@ -222,12 +213,8 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
switch (providerId = providerId.toLowerCase()) { switch (providerId = providerId.toLowerCase()) {
case "xmltv": case "xmltv":
return "livetvguideprovider.html?type=xmltv"; return "livetvguideprovider.html?type=xmltv";
case "schedulesdirect": case "schedulesdirect":
return "livetvguideprovider.html?type=schedulesdirect"; return "livetvguideprovider.html?type=schedulesdirect";
case "emby":
return "livetvguideprovider.html?type=emby";
} }
} }
@ -238,7 +225,7 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
id: "SchedulesDirect" id: "SchedulesDirect"
}); });
menuItems.push({ menuItems.push({
name: "Xml TV", name: "XMLTV",
id: "xmltv" id: "xmltv"
}); });

View file

@ -114,7 +114,10 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader
shape: getPortraitShape(), shape: getPortraitShape(),
scalable: true, scalable: true,
overlayMoreButton: true, overlayMoreButton: true,
allowBottomPadding: false allowBottomPadding: true,
showTitle: true,
centerText: true,
showYear: true
}); });
} }
if (result.Items.length >= query.Limit) { if (result.Items.length >= query.Limit) {

View file

@ -105,10 +105,8 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="dashboardFooter"> <div class="dashboardFooter">
@ -118,5 +116,4 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,10 +1,7 @@
<div id="dashboardGeneralPage" data-role="page" class="page type-interior dashboardHomePage"> <div id="dashboardGeneralPage" data-role="page" class="page type-interior dashboardHomePage">
<div> <div>
<div class="content-primary"> <div class="content-primary">
<form class="dashboardGeneralForm"> <form class="dashboardGeneralForm">
<div class="verticalSection"> <div class="verticalSection">
<div class="sectionTitleContainer flex align-items-center"> <div class="sectionTitleContainer flex align-items-center">
<h2 class="sectionTitle">${TabSettings}</h2> <h2 class="sectionTitle">${TabSettings}</h2>
@ -31,9 +28,7 @@
<input is="emby-checkbox" type="checkbox" id="chkAutoRunWebApp" /> <input is="emby-checkbox" type="checkbox" id="chkAutoRunWebApp" />
<span>${LaunchWebAppOnStartup}</span> <span>${LaunchWebAppOnStartup}</span>
</label> </label>
<div class="fieldDescription checkboxFieldDescription"> <div class="fieldDescription checkboxFieldDescription">${LaunchWebAppOnStartupHelp}</div>
${LaunchWebAppOnStartupHelp}
</div>
</div> </div>
</div> </div>
@ -94,7 +89,6 @@
</button> </button>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,11 +1,7 @@
<div id="devicePage" data-role="page" class="page type-interior devicesPage noSecondaryNavPage"> <div id="devicePage" data-role="page" class="page type-interior devicesPage noSecondaryNavPage">
<div> <div>
<div class="content-primary"> <div class="content-primary">
<form class="deviceForm"> <form class="deviceForm">
<div class="verticalSection verticalSection-extrabottompadding"> <div class="verticalSection verticalSection-extrabottompadding">
<div class="sectionTitleContainer flex align-items-center"> <div class="sectionTitleContainer flex align-items-center">
<h2 class="sectionTitle reportedName"></h2> <h2 class="sectionTitle reportedName"></h2>
@ -18,10 +14,11 @@
</div> </div>
</div> </div>
<div> <div>
<button is="emby-button" type="submit" class="raised button-submit block"><span>${ButtonSave}</span></button> <button is="emby-button" type="submit" class="raised button-submit block">
<span>${ButtonSave}</span>
</button>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>

View file

@ -7,9 +7,7 @@
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/server/devices.html">${Help}</a> <a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/server/devices.html">${Help}</a>
</div> </div>
</div> </div>
<div is="emby-itemscontainer" class="devicesList vertical-wrap" data-multiselect="false"></div>
<div is="emby-itemscontainer" class="devicesList vertical-wrap" data-multiselect="false">
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -8,7 +8,7 @@
<div class="verticalSection"> <div class="verticalSection">
<div class="sectionTitleContainer flex align-items-center"> <div class="sectionTitleContainer flex align-items-center">
<h2 class="sectionTitle">${TabSettings}</h2> <h2 class="sectionTitle">${TabSettings}</h2>
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://jellyfin.org/docs/general/administration/connectivity.html#DLNA">${Help}</a> <a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/administration/connectivity.html#DLNA">${Help}</a>
</div> </div>
</div> </div>

View file

@ -9,6 +9,9 @@
font-family: inherit; font-family: inherit;
color: inherit; color: inherit;
outline-width: 0; outline-width: 0;
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none; user-select: none;
cursor: pointer; cursor: pointer;
z-index: 0; z-index: 0;
@ -21,6 +24,8 @@
outline: none !important; outline: none !important;
position: relative; position: relative;
font-weight: 600; font-weight: 600;
/* Disable webkit tap highlighting */
-webkit-tap-highlight-color: rgba(0,0,0,0);
text-decoration: none; text-decoration: none;
/* Not crazy about this but it normalizes heights between anchors and buttons */ /* Not crazy about this but it normalizes heights between anchors and buttons */
line-height: 1.35; line-height: 1.35;
@ -94,6 +99,9 @@
font-size: inherit; font-size: inherit;
font-family: inherit; font-family: inherit;
color: inherit; color: inherit;
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none; user-select: none;
cursor: pointer; cursor: pointer;
z-index: 0; z-index: 0;
@ -110,6 +118,8 @@
position: relative; position: relative;
overflow: hidden; overflow: hidden;
border-radius: 50%; border-radius: 50%;
/* Disable webkit tap highlighting */
-webkit-tap-highlight-color: rgba(0,0,0,0);
justify-content: center; justify-content: center;
transform-origin: center; transform-origin: center;
transition: 0.2s; transition: 0.2s;

View file

@ -38,6 +38,9 @@
margin: 0; margin: 0;
padding: 0; padding: 0;
opacity: 0; opacity: 0;
-ms-appearance: none;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none; appearance: none;
border: none; border: none;
} }
@ -121,3 +124,13 @@
padding: 0; padding: 0;
} }
} }
@-webkit-keyframes repaintChrome {
from {
padding: 0;
}
to {
padding: 0;
}
}

View file

@ -10,8 +10,10 @@
font-weight: inherit; font-weight: inherit;
padding: .4em .25em; padding: .4em .25em;
/* Prevent padding from causing width overflow */ /* Prevent padding from causing width overflow */
-webkit-box-sizing: border-box;
box-sizing: border-box; box-sizing: border-box;
outline: none !important; outline: none !important;
-webkit-tap-highlight-color: rgba(0,0,0,0);
width: 100%; width: 100%;
} }
@ -33,5 +35,6 @@
} }
.emby-input-iconbutton { .emby-input-iconbutton {
-webkit-align-self: flex-end;
align-self: flex-end; align-self: flex-end;
} }

View file

@ -27,6 +27,9 @@
margin: 0; margin: 0;
padding: 0; padding: 0;
opacity: 0; opacity: 0;
-ms-appearance: none;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none; appearance: none;
border: none; border: none;
} }
@ -67,13 +70,17 @@
cursor: pointer; cursor: pointer;
transition-duration: 0.28s; transition-duration: 0.28s;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-property: -webkit-transform;
transition-property: transform; transition-property: transform;
transition-property: transform, -webkit-transform;
-webkit-transform: scale3d(0, 0, 0);
transform: scale3d(0, 0, 0); transform: scale3d(0, 0, 0);
border-radius: 50%; border-radius: 50%;
background: #00a4dc; background: #00a4dc;
} }
.mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle { .mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle {
-webkit-transform: scale3d(1, 1, 1);
transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1);
} }

View file

@ -12,6 +12,7 @@
/* Prevent padding from causing width overflow */ /* Prevent padding from causing width overflow */
box-sizing: border-box; box-sizing: border-box;
outline: none !important; outline: none !important;
-webkit-tap-highlight-color: rgba(0,0,0,0);
width: 100%; width: 100%;
} }
@ -19,6 +20,8 @@
background: none !important; background: none !important;
border-color: transparent !important; border-color: transparent !important;
color: inherit !important; color: inherit !important;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none; appearance: none;
} }
@ -38,6 +41,7 @@
.emby-select-focusscale { .emby-select-focusscale {
transition: transform 180ms ease-out !important; transition: transform 180ms ease-out !important;
-webkit-transform-origin: center center;
transform-origin: center center; transform-origin: center center;
} }
@ -73,6 +77,7 @@
} }
.emby-select-withcolor { .emby-select-withcolor {
-webkit-appearance: none;
appearance: none; appearance: none;
border-radius: .2em; border-radius: .2em;
} }

View file

@ -1,21 +1,32 @@
_:-ms-input-placeholder { _:-ms-input-placeholder {
appearance: none; appearance: none;
-ms-appearance: none;
height: 2.223em; height: 2.223em;
margin: 0; margin: 0;
} }
.mdl-slider { .mdl-slider {
width: 100%; width: 100%;
-webkit-appearance: none;
-moz-appearance: none;
-ms-appearance: none;
appearance: none; appearance: none;
height: 150%;/*150% is needed, else ie and edge won't display the thumb properly*/ height: 150%;/*150% is needed, else ie and edge won't display the thumb properly*/
background: transparent; background: transparent;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; user-select: none;
outline: 0; outline: 0;
color: #00a4dc; color: #00a4dc;
-webkit-align-self: center;
-ms-flex-item-align: center;
align-self: center; align-self: center;
z-index: 1; z-index: 1;
cursor: pointer; cursor: pointer;
margin: 0; margin: 0;
/* Disable webkit tap highlighting */
-webkit-tap-highlight-color: rgba(0,0,0,0);
display: block; display: block;
} }
@ -59,7 +70,7 @@ _:-ms-input-placeholder {
} }
.mdl-slider::-webkit-slider-thumb { .mdl-slider::-webkit-slider-thumb {
appearance: none; -webkit-appearance: none;
width: 1.2em; width: 1.2em;
height: 1.2em; height: 1.2em;
box-sizing: border-box; box-sizing: border-box;
@ -98,7 +109,7 @@ _:-ms-input-placeholder {
} }
.mdl-slider::-ms-thumb { .mdl-slider::-ms-thumb {
appearance: none; -webkit-appearance: none;
width: 1.8em; width: 1.8em;
height: 1.8em; height: 1.8em;
box-sizing: border-box; box-sizing: border-box;

View file

@ -13,6 +13,7 @@
/* Prevent padding from causing width overflow */ /* Prevent padding from causing width overflow */
box-sizing: border-box; box-sizing: border-box;
outline: none !important; outline: none !important;
-webkit-tap-highlight-color: rgba(0,0,0,0);
width: 100%; width: 100%;
} }

View file

@ -9,6 +9,10 @@
margin: 0; margin: 0;
padding: 0; padding: 0;
overflow: visible; overflow: visible;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; user-select: none;
flex-direction: row-reverse; flex-direction: row-reverse;
justify-content: flex-end; justify-content: flex-end;
@ -24,6 +28,9 @@
margin: 0; margin: 0;
padding: 0; padding: 0;
opacity: 0; opacity: 0;
-ms-appearance: none;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none; appearance: none;
border: none; border: none;
} }
@ -82,6 +89,7 @@
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50%; left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
display: inline-block; display: inline-block;
box-sizing: border-box; box-sizing: border-box;

View file

@ -22,6 +22,7 @@
</select> </select>
<div class="fieldDescription">${LabelHardwareAccelerationTypeHelp}</div> <div class="fieldDescription">${LabelHardwareAccelerationTypeHelp}</div>
</div> </div>
<div class="inputContainer hide fldVaapiDevice"> <div class="inputContainer hide fldVaapiDevice">
<input is="emby-input" type="text" id="txtVaapiDevice" label="${LabelVaapiDevice}" /> <input is="emby-input" type="text" id="txtVaapiDevice" label="${LabelVaapiDevice}" />
<div class="fieldDescription">${LabelVaapiDeviceHelp}</div> <div class="fieldDescription">${LabelVaapiDeviceHelp}</div>
@ -142,7 +143,9 @@
</div> </div>
<div> <div>
<button is="emby-button" type="submit" class="raised button-submit block"><span>${ButtonSave}</span></button> <button is="emby-button" type="submit" class="raised button-submit block">
<span>${ButtonSave}</span>
</button>
</div> </div>
</form> </form>
</div> </div>

View file

@ -1,9 +1,6 @@
<div data-role="page" id="forgotPasswordPage" class="page standalonePage forgotPasswordPage"> <div data-role="page" id="forgotPasswordPage" class="page standalonePage forgotPasswordPage">
<div> <div>
<form class="forgotPasswordForm" style="text-align: center; margin: 0 auto;"> <form class="forgotPasswordForm" style="text-align: center; margin: 0 auto;">
<div style="text-align: left;"> <div style="text-align: left;">
<h1>${HeaderForgotPassword}</h1> <h1>${HeaderForgotPassword}</h1>
@ -23,6 +20,5 @@
</div> </div>
</div> </div>
</form> </form>
</div> </div>
</div> </div>

View file

@ -1,9 +1,6 @@
<div data-role="page" class="page standalonePage forgotPasswordPinPage"> <div data-role="page" class="page standalonePage forgotPasswordPinPage">
<div> <div>
<form class="forgotPasswordPinForm" style="text-align: center; margin: 0 auto;"> <form class="forgotPasswordPinForm" style="text-align: center; margin: 0 auto;">
<div style="text-align: left;"> <div style="text-align: left;">
<h2>${HeaderPasswordReset}</h2> <h2>${HeaderPasswordReset}</h2>
@ -22,6 +19,5 @@
</div> </div>
</div> </div>
</form> </form>
</div> </div>
</div> </div>

View file

@ -45,7 +45,7 @@
<button is="emby-button" type="button" class="button-flat btnInstantMix hide detailButton"> <button is="emby-button" type="button" class="button-flat btnInstantMix hide detailButton">
<div class="detailButton-content"> <div class="detailButton-content">
<i class="md-icon detailButton-icon">shuffle</i> <i class="md-icon detailButton-icon">explore</i>
<div class="detailButton-text">${HeaderInstantMix}</div> <div class="detailButton-text">${HeaderInstantMix}</div>
</div> </div>
</button> </button>

View file

@ -1,11 +1,7 @@
<div id="liveTvGuideProviderPage" data-role="page" class="page type-interior liveTvSettingsPage"> <div id="liveTvGuideProviderPage" data-role="page" class="page type-interior liveTvSettingsPage">
<div> <div>
<div class="content-primary"> <div class="content-primary">
<div class="readOnlyContent providerTemplate" style="margin-top: 2em;"></div>
<div class="readOnlyContent providerTemplate" style="margin-top: 2em;">
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,11 +1,7 @@
<div id="loginPage" data-role="page" class="page standalonePage" data-backbutton="false"> <div id="loginPage" data-role="page" class="page standalonePage" data-backbutton="false">
<div class="padded-left padded-right padded-bottom-page"> <div class="padded-left padded-right padded-bottom-page">
<form class="manualLoginForm hide" style="margin: 0 auto;"> <form class="manualLoginForm hide" style="margin: 0 auto;">
<h1 style="margin-top:1em;text-align: left;">${HeaderPleaseSignIn}</h1> <h1 style="margin-top:1em;text-align: left;">${HeaderPleaseSignIn}</h1>
<div style="height:0; overflow: hidden;"> <div style="height:0; overflow: hidden;">
<input type="text" name="fakeusernameremembered" tabindex="-1" /> <input type="text" name="fakeusernameremembered" tabindex="-1" />
<input type="password" name="fakepasswordremembered" tabindex="-1" /> <input type="password" name="fakepasswordremembered" tabindex="-1" />
@ -27,6 +23,7 @@
<button is="emby-button" type="submit" class="raised button-submit block"> <button is="emby-button" type="submit" class="raised button-submit block">
<span>${ButtonSignIn}</span> <span>${ButtonSignIn}</span>
</button> </button>
<div style="margin-top:.5em;"> <div style="margin-top:.5em;">
<button is="emby-button" type="button" class="raised cancel block btnCancel"> <button is="emby-button" type="button" class="raised cancel block btnCancel">
<span>${ButtonCancel}</span> <span>${ButtonCancel}</span>
@ -56,6 +53,5 @@
<p class="disclaimer" style="text-align: center; margin-top: 2em;"></p> <p class="disclaimer" style="text-align: center; margin-top: 2em;"></p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,5 +1,4 @@
{ {
"name": "Jellyfin", "name": "Jellyfin",
"description": "Jellyfin: the Free Software Media System.", "description": "Jellyfin: the Free Software Media System.",
"lang": "en-US", "lang": "en-US",
@ -8,7 +7,8 @@
"theme_color": "#101010", "theme_color": "#101010",
"background_color": "#101010", "background_color": "#101010",
"display": "standalone", "display": "standalone",
"icons": [{ "icons": [
{
"sizes": "72x72", "sizes": "72x72",
"src": "touchicon72.png", "src": "touchicon72.png",
"type": "image/png" "type": "image/png"

View file

@ -5,7 +5,7 @@
<div class="verticalSection verticalSection-extrabottompadding"> <div class="verticalSection verticalSection-extrabottompadding">
<div class="sectionTitleContainer flex align-items-center"> <div class="sectionTitleContainer flex align-items-center">
<h2 class="sectionTitle">${TabNetworking}</h2> <h2 class="sectionTitle">${TabNetworking}</h2>
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://jellyfin.org/docs/general/administration/networking.html">${Help}</a> <a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/administration/networking.html">${Help}</a>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">

View file

@ -72,22 +72,24 @@
</div> </div>
</div> </div>
</div> </div>
<div class="navigationSection">
<br />
<div> <div>
<button is="paper-icon-button-light" class="btnArrowUp btnCommand autoSize raised" title="${ButtonArrowUp}" data-command="MoveUp"> <div class="navigationSection">
<div is="emby-collapse" title="${HeaderNavigation}">
<div class="collapseContent">
<div>
<button is="paper-icon-button-light" class="btnArrowUp btnCommand autoSize button-submit" title="${ButtonArrowUp}" data-command="MoveUp">
<i class="md-icon">keyboard_arrow_up</i> <i class="md-icon">keyboard_arrow_up</i>
</button> </button>
</div> </div>
<br /> <br />
<div> <div>
<button is="paper-icon-button-light" class="btnArrowLeft btnCommand autoSize raised" title="${ButtonArrowLeft}" data-command="MoveLeft"> <button is="paper-icon-button-light" class="btnArrowLeft btnCommand autoSize button-submit" title="${ButtonArrowLeft}" data-command="MoveLeft">
<i class="md-icon">keyboard_arrow_left</i> <i class="md-icon">keyboard_arrow_left</i>
</button> </button>
<button is="paper-icon-button-light" class="btnOk btnCommand autoSize raised" title="${ButtonOk}" data-command="Select"> <button is="paper-icon-button-light" class="btnOk btnCommand autoSize button-submit" title="${ButtonOk}" data-command="Select">
<i class="md-icon">keyboard_return</i> <i class="md-icon">keyboard_return</i>
</button> </button>
<button is="paper-icon-button-light" class="btnArrowRight btnCommand autoSize raised" title="${ButtonArrowRight}" data-command="MoveRight"> <button is="paper-icon-button-light" class="btnArrowRight btnCommand autoSize button-submit" title="${ButtonArrowRight}" data-command="MoveRight">
<i class="md-icon">keyboard_arrow_right</i> <i class="md-icon">keyboard_arrow_right</i>
</button> </button>
</div> </div>
@ -96,7 +98,7 @@
<button is="paper-icon-button-light" class="btnBack btnCommand autoSize" title="${ButtonBack}" data-command="Back"> <button is="paper-icon-button-light" class="btnBack btnCommand autoSize" title="${ButtonBack}" data-command="Back">
<i class="md-icon">arrow_back</i> <i class="md-icon">arrow_back</i>
</button> </button>
<button is="paper-icon-button-light" class="btnArrowDown btnCommand autoSize raised" title="${ButtonArrowDown}" data-command="MoveDown"> <button is="paper-icon-button-light" class="btnArrowDown btnCommand autoSize button-submit" title="${ButtonArrowDown}" data-command="MoveDown">
<i class="md-icon">keyboard_arrow_down</i> <i class="md-icon">keyboard_arrow_down</i>
</button> </button>
<button is="paper-icon-button-light" class="btnContextMenu btnCommand autoSize" title="${ButtonInfo}" data-command="ToggleContextMenu"> <button is="paper-icon-button-light" class="btnContextMenu btnCommand autoSize" title="${ButtonInfo}" data-command="ToggleContextMenu">
@ -116,6 +118,9 @@
</button> </button>
</div> </div>
</div> </div>
</div>
</div>
</div>
<div> <div>
<div class="sendMessageSection"> <div class="sendMessageSection">
<div is="emby-collapse" title="${HeaderSendMessage}"> <div is="emby-collapse" title="${HeaderSendMessage}">

View file

@ -1,7 +1,6 @@
<div id="scheduledTaskPage" data-role="page" class="page type-interior scheduledTasksConfigurationPage"> <div id="scheduledTaskPage" data-role="page" class="page type-interior scheduledTasksConfigurationPage">
<div> <div>
<div class="content-primary"> <div class="content-primary">
<div class="verticalSection"> <div class="verticalSection">
<div class="sectionTitleContainer flex align-items-center"> <div class="sectionTitleContainer flex align-items-center">
<h2 class="sectionTitle taskName"></h2> <h2 class="sectionTitle taskName"></h2>
@ -12,9 +11,7 @@
<div class="readOnlyContent"> <div class="readOnlyContent">
<div> <div>
<h2 style="vertical-align: middle; display: inline-block;"> <h2 style="vertical-align: middle; display: inline-block;">${HeaderTaskTriggers}</h2>
${HeaderTaskTriggers}
</h2>
<button is="emby-button" type="button" class="fab fab-mini btnAddTrigger submit" style="margin-left: 1em;" title="${ButtonAddScheduledTaskTrigger}"> <button is="emby-button" type="button" class="fab fab-mini btnAddTrigger submit" style="margin-left: 1em;" title="${ButtonAddScheduledTaskTrigger}">
<i class="md-icon">add</i> <i class="md-icon">add</i>
</button> </button>

View file

@ -1,5 +1,4 @@
<div id="scheduledTasksPage" data-role="page" class="page type-interior scheduledTasksConfigurationPage"> <div id="scheduledTasksPage" data-role="page" class="page type-interior scheduledTasksConfigurationPage">
<style> <style>
.taskProgressOuter { .taskProgressOuter {
height: 6px; height: 6px;
@ -15,7 +14,6 @@
</style> </style>
<div> <div>
<div class="content-primary"> <div class="content-primary">
<div class="divScheduledTasks readOnlyContent"></div> <div class="divScheduledTasks readOnlyContent"></div>
</div> </div>
</div> </div>

View file

@ -6,15 +6,12 @@ define(['browser'], function (browser) {
} }
function canPlayH265(videoTestElement, options) { function canPlayH265(videoTestElement, options) {
if (browser.tizen || browser.orsay || browser.xboxOne || browser.web0s || options.supportsHevc) { if (browser.tizen || browser.orsay || browser.xboxOne || browser.web0s || options.supportsHevc) {
return true; return true;
} }
var userAgent = navigator.userAgent.toLowerCase(); var userAgent = navigator.userAgent.toLowerCase();
if (browser.chromecast) { if (browser.chromecast) {
var isChromecastUltra = userAgent.indexOf('aarch64') !== -1; var isChromecastUltra = userAgent.indexOf('aarch64') !== -1;
if (isChromecastUltra) { if (isChromecastUltra) {
return true; return true;
@ -31,7 +28,6 @@ define(['browser'], function (browser) {
var _supportsTextTracks; var _supportsTextTracks;
function supportsTextTracks() { function supportsTextTracks() {
if (browser.tizen || browser.orsay) { if (browser.tizen || browser.orsay) {
return true; return true;
} }
@ -46,15 +42,14 @@ define(['browser'], function (browser) {
var _canPlayHls; var _canPlayHls;
function canPlayHls(src) { function canPlayHls(src) {
if (_canPlayHls == null) { if (_canPlayHls == null) {
_canPlayHls = canPlayNativeHls() || canPlayHlsWithMSE(); _canPlayHls = canPlayNativeHls() || canPlayHlsWithMSE();
} }
return _canPlayHls; return _canPlayHls;
} }
function canPlayNativeHls() { function canPlayNativeHls() {
if (browser.tizen || browser.orsay) { if (browser.tizen || browser.orsay) {
return true; return true;
} }
@ -77,8 +72,23 @@ define(['browser'], function (browser) {
return false; return false;
} }
function canPlayAudioFormat(format) { function supportsAc3(videoTestElement) {
if (browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s) {
return true;
}
return videoTestElement.canPlayType('audio/mp4; codecs="ac-3"').replace(/no/, '');
}
function supportsEac3(videoTestElement) {
if (browser.tizen || browser.orsay || browser.web0s) {
return true;
}
return videoTestElement.canPlayType('audio/mp4; codecs="ec-3"').replace(/no/, '');
}
function canPlayAudioFormat(format) {
var typeString; var typeString;
if (format === 'flac') { if (format === 'flac') {
@ -97,14 +107,12 @@ define(['browser'], function (browser) {
} }
} else if (format === 'opus') { } else if (format === 'opus') {
typeString = 'audio/ogg; codecs="opus"'; typeString = 'audio/ogg; codecs="opus"';
if (document.createElement('audio').canPlayType(typeString).replace(/no/, '')) { if (document.createElement('audio').canPlayType(typeString).replace(/no/, '')) {
return true; return true;
} }
return false; return false;
} else if (format === 'mp2') { } else if (format === 'mp2') {
// For now // For now
return false; return false;
} }
@ -113,14 +121,6 @@ define(['browser'], function (browser) {
typeString = 'audio/webm'; typeString = 'audio/webm';
} else if (format === 'mp2') { } else if (format === 'mp2') {
typeString = 'audio/mpeg'; typeString = 'audio/mpeg';
} else if (format === 'ogg' || format === 'oga') {
// chrome says probably, but seeing failures
if (browser.chrome) {
return false;
}
typeString = 'audio/' + format;
} else { } else {
typeString = 'audio/' + format; typeString = 'audio/' + format;
} }
@ -133,7 +133,6 @@ define(['browser'], function (browser) {
} }
function testCanPlayMkv(videoTestElement) { function testCanPlayMkv(videoTestElement) {
if (browser.tizen || browser.orsay || browser.web0s) { if (browser.tizen || browser.orsay || browser.web0s) {
return true; return true;
} }
@ -147,7 +146,6 @@ define(['browser'], function (browser) {
// Unfortunately there's no real way to detect mkv support // Unfortunately there's no real way to detect mkv support
if (browser.chrome) { if (browser.chrome) {
// Not supported on opera tv // Not supported on opera tv
if (browser.operaTv) { if (browser.operaTv) {
return false; return false;
@ -162,7 +160,6 @@ define(['browser'], function (browser) {
} }
if (browser.edgeUwp) { if (browser.edgeUwp) {
return true; return true;
} }
@ -174,17 +171,15 @@ define(['browser'], function (browser) {
} }
function supportsMpeg2Video() { function supportsMpeg2Video() {
return browser.orsay || browser.tizen || browser.edgeUwp || browser.web0s; return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp;
} }
function supportsVc1() { function supportsVc1() {
return browser.orsay || browser.tizen || browser.edgeUwp || browser.web0s; return browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp;
} }
function getFlvMseDirectPlayProfile() { function getFlvMseDirectPlayProfile() {
var videoAudioCodecs = ['aac']; var videoAudioCodecs = ['aac'];
if (!browser.edge && !browser.msie) { if (!browser.edge && !browser.msie) {
videoAudioCodecs.push('mp3'); videoAudioCodecs.push('mp3');
} }
@ -198,13 +193,11 @@ define(['browser'], function (browser) {
} }
function getDirectPlayProfileForVideoContainer(container, videoAudioCodecs, videoTestElement, options) { function getDirectPlayProfileForVideoContainer(container, videoAudioCodecs, videoTestElement, options) {
var supported = false; var supported = false;
var profileContainer = container; var profileContainer = container;
var videoCodecs = []; var videoCodecs = [];
switch (container) { switch (container) {
case 'asf': case 'asf':
supported = browser.tizen || browser.orsay || browser.edgeUwp; supported = browser.tizen || browser.orsay || browser.edgeUwp;
videoAudioCodecs = []; videoAudioCodecs = [];
@ -279,16 +272,12 @@ define(['browser'], function (browser) {
} }
function getMaxBitrate() { function getMaxBitrate() {
return 120000000; return 120000000;
} }
function getGlobalMaxVideoBitrate() { function getGlobalMaxVideoBitrate() {
var userAgent = navigator.userAgent.toLowerCase(); var userAgent = navigator.userAgent.toLowerCase();
if (browser.chromecast) { if (browser.chromecast) {
var isChromecastUltra = userAgent.indexOf('aarch64') !== -1; var isChromecastUltra = userAgent.indexOf('aarch64') !== -1;
if (isChromecastUltra) { if (isChromecastUltra) {
return null; return null;
@ -319,27 +308,9 @@ define(['browser'], function (browser) {
(browser.tizen && isTizenFhd ? 20000000 : null))); (browser.tizen && isTizenFhd ? 20000000 : null)));
} }
function supportsAc3(videoTestElement) {
if (browser.edgeUwp || browser.tizen || browser.orsay || browser.web0s) {
return true;
}
return (videoTestElement.canPlayType('audio/mp4; codecs="ac-3"').replace(/no/, '') && !browser.osx && !browser.iOS);
}
function supportsEac3(videoTestElement) {
if (browser.tizen || browser.orsay || browser.web0s) {
return true;
}
return videoTestElement.canPlayType('audio/mp4; codecs="ec-3"').replace(/no/, '');
}
return function (options) { return function (options) {
options = options || {}; options = options || {};
var physicalAudioChannels = options.audioChannels || (browser.tv || browser.ps4 || browser.xboxOne ? 6 : 2); var physicalAudioChannels = options.audioChannels || (browser.tv || browser.ps4 || browser.xboxOne ? 6 : 2);
var bitrateSetting = getMaxBitrate(); var bitrateSetting = getMaxBitrate();
@ -417,7 +388,6 @@ define(['browser'], function (browser) {
// PS4 fails to load HLS with mp3 audio // PS4 fails to load HLS with mp3 audio
if (!browser.ps4) { if (!browser.ps4) {
// mp3 encoder only supports 2 channels, so only make that preferred if we're only requesting 2 channels // mp3 encoder only supports 2 channels, so only make that preferred if we're only requesting 2 channels
// Also apply it for chromecast because it no longer supports AAC 5.1 // Also apply it for chromecast because it no longer supports AAC 5.1
if (physicalAudioChannels <= 2) { if (physicalAudioChannels <= 2) {
@ -425,14 +395,15 @@ define(['browser'], function (browser) {
} }
} }
} }
if (canPlayAacVideoAudio) {
if (canPlayAacVideoAudio) {
if (videoAudioCodecs.indexOf('aac') === -1) { if (videoAudioCodecs.indexOf('aac') === -1) {
videoAudioCodecs.push('aac'); videoAudioCodecs.push('aac');
} }
hlsVideoAudioCodecs.push('aac'); hlsVideoAudioCodecs.push('aac');
} }
if (supportsMp3VideoAudio) { if (supportsMp3VideoAudio) {
// PS4 fails to load HLS with mp3 audio // PS4 fails to load HLS with mp3 audio
if (!browser.ps4) { if (!browser.ps4) {
@ -525,6 +496,7 @@ define(['browser'], function (browser) {
if (canPlayVp8) { if (canPlayVp8) {
mp4VideoCodecs.push('vp8'); mp4VideoCodecs.push('vp8');
} }
if (canPlayVp9) { if (canPlayVp9) {
mp4VideoCodecs.push('vp9'); mp4VideoCodecs.push('vp9');
} }
@ -563,20 +535,17 @@ define(['browser'], function (browser) {
['opus', 'mp3', 'mp2', 'aac', 'flac', 'alac', 'webma', 'wma', 'wav', 'ogg', 'oga'].filter(canPlayAudioFormat).forEach(function (audioFormat) { ['opus', 'mp3', 'mp2', 'aac', 'flac', 'alac', 'webma', 'wma', 'wav', 'ogg', 'oga'].filter(canPlayAudioFormat).forEach(function (audioFormat) {
if (audioFormat === 'mp2') { if (audioFormat === 'mp2') {
profile.DirectPlayProfiles.push({ profile.DirectPlayProfiles.push({
Container: 'mp2,mp3', Container: 'mp2,mp3',
Type: 'Audio', Type: 'Audio',
AudioCodec: audioFormat AudioCodec: audioFormat
}); });
} else if (audioFormat === 'mp3') { } else if (audioFormat === 'mp3') {
profile.DirectPlayProfiles.push({ profile.DirectPlayProfiles.push({
Container: audioFormat, Container: audioFormat,
Type: 'Audio', Type: 'Audio',
AudioCodec: audioFormat AudioCodec: audioFormat
}); });
} else { } else {
profile.DirectPlayProfiles.push({ profile.DirectPlayProfiles.push({
Container: audioFormat === 'webma' ? 'webma,webm' : audioFormat, Container: audioFormat === 'webma' ? 'webma,webm' : audioFormat,
@ -586,7 +555,6 @@ define(['browser'], function (browser) {
// aac also appears in the m4a container // aac also appears in the m4a container
if (audioFormat === 'aac' || audioFormat === 'alac') { if (audioFormat === 'aac' || audioFormat === 'alac') {
profile.DirectPlayProfiles.push({ profile.DirectPlayProfiles.push({
Container: 'm4a', Container: 'm4a',
AudioCodec: audioFormat, AudioCodec: audioFormat,
@ -619,7 +587,6 @@ define(['browser'], function (browser) {
if (canPlayHls() && browser.enableHlsAudio !== false) { if (canPlayHls() && browser.enableHlsAudio !== false) {
profile.TranscodingProfiles.push({ profile.TranscodingProfiles.push({
// hlsjs, edge, and android all seem to require ts container // hlsjs, edge, and android all seem to require ts container
Container: !canPlayNativeHls() || browser.edge || browser.android ? 'ts' : 'aac', Container: !canPlayNativeHls() || browser.edge || browser.android ? 'ts' : 'aac',
Type: 'Audio', Type: 'Audio',
@ -636,7 +603,6 @@ define(['browser'], function (browser) {
// But for static (offline sync), it will be just fine. // But for static (offline sync), it will be just fine.
// Prioritize aac higher because the encoder can accept more channels than mp3 // Prioritize aac higher because the encoder can accept more channels than mp3
['aac', 'mp3', 'opus', 'wav'].filter(canPlayAudioFormat).forEach(function (audioFormat) { ['aac', 'mp3', 'opus', 'wav'].filter(canPlayAudioFormat).forEach(function (audioFormat) {
profile.TranscodingProfiles.push({ profile.TranscodingProfiles.push({
Container: audioFormat, Container: audioFormat,
Type: 'Audio', Type: 'Audio',
@ -648,7 +614,6 @@ define(['browser'], function (browser) {
}); });
['opus', 'mp3', 'aac', 'wav'].filter(canPlayAudioFormat).forEach(function (audioFormat) { ['opus', 'mp3', 'aac', 'wav'].filter(canPlayAudioFormat).forEach(function (audioFormat) {
profile.TranscodingProfiles.push({ profile.TranscodingProfiles.push({
Container: audioFormat, Container: audioFormat,
Type: 'Audio', Type: 'Audio',
@ -804,7 +769,8 @@ define(['browser'], function (browser) {
Condition: 'LessThanEqual', Condition: 'LessThanEqual',
Property: 'VideoLevel', Property: 'VideoLevel',
Value: maxH264Level.toString() Value: maxH264Level.toString()
}] }
]
}); });
if (!browser.edgeUwp && !browser.tizen && !browser.orsay && !browser.web0s) { if (!browser.edgeUwp && !browser.tizen && !browser.orsay && !browser.web0s) {
@ -888,7 +854,6 @@ define(['browser'], function (browser) {
// External vtt or burn in // External vtt or burn in
profile.SubtitleProfiles = []; profile.SubtitleProfiles = [];
if (supportsTextTracks()) { if (supportsTextTracks()) {
profile.SubtitleProfiles.push({ profile.SubtitleProfiles.push({
Format: 'vtt', Format: 'vtt',
Method: 'External' Method: 'External'
@ -896,7 +861,6 @@ define(['browser'], function (browser) {
} }
profile.ResponseProfiles = []; profile.ResponseProfiles = [];
profile.ResponseProfiles.push({ profile.ResponseProfiles.push({
Type: 'Video', Type: 'Video',
Container: 'm4v', Container: 'm4v',

View file

@ -108,8 +108,10 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
headerCastButton.addEventListener("click", onCastButtonClicked); headerCastButton.addEventListener("click", onCastButtonClicked);
} }
if (layoutManager.mobile) {
initHeadRoom(skinHeader); initHeadRoom(skinHeader);
} }
}
function onCastButtonClicked() { function onCastButtonClicked() {
var btn = this; var btn = this;
@ -424,7 +426,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
return getToolsMenuHtml(apiClient).then(function (toolsMenuHtml) { return getToolsMenuHtml(apiClient).then(function (toolsMenuHtml) {
var html = ""; var html = "";
html += '<a class="adminDrawerLogo clearLink" is="emby-linkbutton" href="home.html">'; html += '<a class="adminDrawerLogo clearLink" is="emby-linkbutton" href="home.html">';
html += '<img src="assets/img/logo.png" />'; html += '<img src="assets/img/icon-transparent.png" />';
html += "</a>"; html += "</a>";
html += toolsMenuHtml; html += toolsMenuHtml;
navDrawerScrollContainer.innerHTML = html; navDrawerScrollContainer.innerHTML = html;

View file

@ -16,44 +16,72 @@ define([
function defineRoute(newRoute) { function defineRoute(newRoute) {
var path = newRoute.path; var path = newRoute.path;
console.log("Defining route: " + path); console.log("defining route: " + path);
newRoute.dictionary = "core"; newRoute.dictionary = "core";
Emby.Page.addRoute(path, newRoute); Emby.Page.addRoute(path, newRoute);
} }
console.log("Defining core routes"); console.log("defining core routes");
defineRoute({ defineRoute({
path: "/addplugin.html", path: "/addplugin.html",
autoFocus: false, autoFocus: false,
roles: "admin", roles: "admin",
controller: "addpluginpage" controller: "dashboard/plugins/add"
}); });
defineRoute({ defineRoute({
path: "/autoorganizelog.html", path: "/mypreferencesmenu.html",
roles: "admin"
});
defineRoute({
path: "/channelsettings.html",
autoFocus: false, autoFocus: false,
roles: "admin" transition: "fade",
controller: "user/menu"
});
defineRoute({
path: "/myprofile.html",
autoFocus: false,
transition: "fade",
controller: "user/profile"
}); });
defineRoute({ defineRoute({
path: "/addserver.html", path: "/addserver.html",
autoFocus: false, autoFocus: false,
anonymous: true, anonymous: true,
startup: true, startup: true,
controller: "addserver" controller: "auth/addserver"
}); });
defineRoute({
path: "/mypreferencesdisplay.html",
autoFocus: false,
transition: "fade",
controller: "user/display"
});
defineRoute({
path: "/mypreferenceshome.html",
autoFocus: false,
transition: "fade",
controller: "user/home"
});
defineRoute({
path: "/mypreferencesplayback.html",
autoFocus: false,
transition: "fade",
controller: "user/playback"
});
defineRoute({
path: "/mypreferencessubtitles.html",
autoFocus: false,
transition: "fade",
controller: "user/subtitles"
});
defineRoute({ defineRoute({
path: "/dashboard.html", path: "/dashboard.html",
autoFocus: false, autoFocus: false,
roles: "admin", roles: "admin",
controller: "dashboardpage" controller: "dashboard/dashboard"
}); });
defineRoute({ defineRoute({
path: "/dashboardgeneral.html", path: "/dashboardgeneral.html",
controller: "dashboardgeneral", controller: "dashboard/general",
autoFocus: false, autoFocus: false,
roles: "admin" roles: "admin"
}); });
@ -61,7 +89,7 @@ define([
path: "/networking.html", path: "/networking.html",
autoFocus: false, autoFocus: false,
roles: "admin", roles: "admin",
controller: "networking" controller: "dashboard/networking"
}); });
defineRoute({ defineRoute({
path: "/devices.html", path: "/devices.html",
@ -108,14 +136,14 @@ define([
path: "/forgotpassword.html", path: "/forgotpassword.html",
anonymous: true, anonymous: true,
startup: true, startup: true,
controller: "forgotpassword" controller: "auth/forgotpassword"
}); });
defineRoute({ defineRoute({
path: "/forgotpasswordpin.html", path: "/forgotpasswordpin.html",
autoFocus: false, autoFocus: false,
anonymous: true, anonymous: true,
startup: true, startup: true,
controller: "forgotpasswordpin" controller: "auth/forgotpasswordpin"
}); });
defineRoute({ defineRoute({
path: "/home.html", path: "/home.html",
@ -191,19 +219,14 @@ define([
defineRoute({ defineRoute({
path: "/log.html", path: "/log.html",
roles: "admin", roles: "admin",
controller: "logpage" controller: "dashboard/logs"
}); });
defineRoute({ defineRoute({
path: "/login.html", path: "/login.html",
autoFocus: false, autoFocus: false,
anonymous: true, anonymous: true,
startup: true, startup: true,
controller: "loginpage" controller: "auth/login"
});
defineRoute({
path: "/metadataadvanced.html",
autoFocus: false,
roles: "admin"
}); });
defineRoute({ defineRoute({
path: "/metadataimages.html", path: "/metadataimages.html",
@ -229,57 +252,21 @@ define([
autoFocus: false, autoFocus: false,
transition: "fade" transition: "fade"
}); });
defineRoute({
path: "/mypreferencesmenu.html",
autoFocus: false,
transition: "fade",
controller: "user/menu"
});
defineRoute({
path: "/myprofile.html",
autoFocus: false,
transition: "fade",
controller: "user/profile"
});
defineRoute({
path: "/mypreferencesdisplay.html",
autoFocus: false,
transition: "fade",
controller: "user/display"
});
defineRoute({
path: "/mypreferenceshome.html",
autoFocus: false,
transition: "fade",
controller: "user/home"
});
defineRoute({
path: "/mypreferencesplayback.html",
autoFocus: false,
transition: "fade",
controller: "user/playback"
});
defineRoute({
path: "/mypreferencessubtitles.html",
autoFocus: false,
transition: "fade",
controller: "user/subtitles"
});
defineRoute({ defineRoute({
path: "/notificationsetting.html", path: "/notificationsetting.html",
autoFocus: false, autoFocus: false,
roles: "admin", roles: "admin",
controller: "notificationsetting" controller: "dashboard/notifications/notification"
}); });
defineRoute({ defineRoute({
path: "/notificationsettings.html", path: "/notificationsettings.html",
controller: "notificationsettings", controller: "dashboard/notifications/notifications",
autoFocus: false, autoFocus: false,
roles: "admin" roles: "admin"
}); });
defineRoute({ defineRoute({
path: "/nowplaying.html", path: "/nowplaying.html",
controller: "nowplayingpage", controller: "playback/nowplaying",
autoFocus: false, autoFocus: false,
transition: "fade", transition: "fade",
fullscreen: true, fullscreen: true,
@ -296,25 +283,25 @@ define([
path: "/availableplugins.html", path: "/availableplugins.html",
autoFocus: false, autoFocus: false,
roles: "admin", roles: "admin",
controller: "availableplugins" controller: "dashboard/plugins/available"
}); });
defineRoute({ defineRoute({
path: "/installedplugins.html", path: "/installedplugins.html",
autoFocus: false, autoFocus: false,
roles: "admin", roles: "admin",
controller: "installedplugins" controller: "dashboard/plugins/installed"
}); });
defineRoute({ defineRoute({
path: "/scheduledtask.html", path: "/scheduledtask.html",
autoFocus: false, autoFocus: false,
roles: "admin", roles: "admin",
controller: "scheduledtaskpage" controller: "dashboard/scheduledtasks/scheduledtask"
}); });
defineRoute({ defineRoute({
path: "/scheduledtasks.html", path: "/scheduledtasks.html",
autoFocus: false, autoFocus: false,
roles: "admin", roles: "admin",
controller: "scheduledtaskspage" controller: "dashboard/scheduledtasks/scheduledtasks"
}); });
defineRoute({ defineRoute({
path: "/search.html", path: "/search.html",
@ -325,7 +312,7 @@ define([
autoFocus: false, autoFocus: false,
anonymous: true, anonymous: true,
startup: true, startup: true,
controller: "selectserver" controller: "auth/selectserver"
}); });
defineRoute({ defineRoute({
path: "/serveractivity.html", path: "/serveractivity.html",
@ -345,11 +332,6 @@ define([
roles: "admin", roles: "admin",
controller: "streamingsettings" controller: "streamingsettings"
}); });
defineRoute({
path: "/support.html",
autoFocus: false,
roles: "admin"
});
defineRoute({ defineRoute({
path: "/tv.html", path: "/tv.html",
autoFocus: false, autoFocus: false,
@ -391,17 +373,18 @@ define([
roles: "admin", roles: "admin",
controller: "userprofilespage" controller: "userprofilespage"
}); });
defineRoute({ defineRoute({
path: "/wizardremoteaccess.html", path: "/wizardremoteaccess.html",
autoFocus: false, autoFocus: false,
anonymous: true, anonymous: true,
controller: "wizardremoteaccess" controller: "wizard/remoteaccess"
}); });
defineRoute({ defineRoute({
path: "/wizardfinish.html", path: "/wizardfinish.html",
autoFocus: false, autoFocus: false,
anonymous: true, anonymous: true,
controller: "wizardfinishpage" controller: "wizard/finish"
}); });
defineRoute({ defineRoute({
path: "/wizardlibrary.html", path: "/wizardlibrary.html",
@ -413,24 +396,25 @@ define([
path: "/wizardsettings.html", path: "/wizardsettings.html",
autoFocus: false, autoFocus: false,
anonymous: true, anonymous: true,
controller: "wizardsettings" controller: "wizard/settings"
}); });
defineRoute({ defineRoute({
path: "/wizardstart.html", path: "/wizardstart.html",
autoFocus: false, autoFocus: false,
anonymous: true, anonymous: true,
controller: "wizardstart" controller: "wizard/start"
}); });
defineRoute({ defineRoute({
path: "/wizarduser.html", path: "/wizarduser.html",
controller: "wizarduserpage", controller: "wizard/user",
autoFocus: false, autoFocus: false,
anonymous: true anonymous: true
}); });
defineRoute({ defineRoute({
path: "/videoosd.html", path: "/videoosd.html",
transition: "fade", transition: "fade",
controller: "videoosd", controller: "playback/videoosd",
autoFocus: false, autoFocus: false,
type: "video-osd", type: "video-osd",
supportsThemeMedia: true, supportsThemeMedia: true,
@ -444,6 +428,7 @@ define([
enableContentQueryString: true, enableContentQueryString: true,
roles: "admin" roles: "admin"
}); });
defineRoute({ defineRoute({
path: "/", path: "/",
isDefaultRoute: true, isDefaultRoute: true,

View file

@ -2,12 +2,10 @@
<div> <div>
<div class="content-primary"> <div class="content-primary">
<div class="verticalSection"> <div class="verticalSection">
<h2 class="sectionTitle"> <h2 class="sectionTitle"></h2>
</h2>
</div> </div>
<div class="readOnlyContent"> <div class="readOnlyContent">
<div class="paperList activityItems" data-activitylimit="100"> <div class="paperList activityItems" data-activitylimit="100"></div>
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1228,5 +1228,5 @@
"ButtonAddImage": "Προσθήκη Εικόνας", "ButtonAddImage": "Προσθήκη Εικόνας",
"BoxRear": "Κουτί(πίσω)", "BoxRear": "Κουτί(πίσω)",
"BookLibraryHelp": "Ήχος και βιβλία υποστηρίζονται.Ελέγξτε τον {0}ονομαστικό οδηγό βιβλίων{1}.", "BookLibraryHelp": "Ήχος και βιβλία υποστηρίζονται.Ελέγξτε τον {0}ονομαστικό οδηγό βιβλίων{1}.",
"AuthProviderHelp": "Επιλέξτε ένα Πάροχο Επαλήθευσης για να επαληθεύσετε το κωδικό του χρήστη." "AuthProviderHelp": "Επιλέξτε ένα Πάροχο Επαλήθευσης για να επαληθεύσετε το κωδικό αυτού του χρήστη."
} }

View file

@ -83,7 +83,7 @@
"Art": "Art", "Art": "Art",
"AsManyAsPossible": "As many as possible", "AsManyAsPossible": "As many as possible",
"Ascending": "Ascending", "Ascending": "Ascending",
"AspectRatio": "Aspect ratio", "AspectRatio": "Aspect Ratio",
"AttributeNew": "New", "AttributeNew": "New",
"Audio": "Audio", "Audio": "Audio",
"AuthProviderHelp": "Select an Authentication Provider to be used to authenticate this user's password.", "AuthProviderHelp": "Select an Authentication Provider to be used to authenticate this user's password.",
@ -565,7 +565,7 @@
"ReplaceExistingImages": "Replace existing images", "ReplaceExistingImages": "Replace existing images",
"ReplaceAllMetadata": "Replace all metadata", "ReplaceAllMetadata": "Replace all metadata",
"RepeatOne": "Repeat one", "RepeatOne": "Repeat one",
"RepeatMode": "Repeat mode", "RepeatMode": "Repeat Mode",
"RepeatEpisodes": "Repeat episodes", "RepeatEpisodes": "Repeat episodes",
"RepeatAll": "Repeat all", "RepeatAll": "Repeat all",
"Repeat": "Repeat", "Repeat": "Repeat",
@ -1459,5 +1459,8 @@
"HeaderFavoritePeople": "Favourite People", "HeaderFavoritePeople": "Favourite People",
"FetchingData": "Fetching additional data", "FetchingData": "Fetching additional data",
"ButtonAddImage": "Add Image", "ButtonAddImage": "Add Image",
"OptionRandom": "Random" "OptionRandom": "Random",
"SelectAdminUsername": "Please select a username for the admin account.",
"ButtonSplit": "Split",
"HeaderNavigation": "Navigation"
} }

View file

@ -36,7 +36,7 @@
"Artists": "Artists", "Artists": "Artists",
"AsManyAsPossible": "As many as possible", "AsManyAsPossible": "As many as possible",
"Ascending": "Ascending", "Ascending": "Ascending",
"AspectRatio": "Aspect ratio", "AspectRatio": "Aspect Ratio",
"AttributeNew": "New", "AttributeNew": "New",
"Audio": "Audio", "Audio": "Audio",
"AuthProviderHelp": "Select an Authentication Provider to be used to authenticate this user's password.", "AuthProviderHelp": "Select an Authentication Provider to be used to authenticate this user's password.",
@ -408,6 +408,7 @@
"HeaderMyDevice": "My Device", "HeaderMyDevice": "My Device",
"HeaderMyMedia": "My Media", "HeaderMyMedia": "My Media",
"HeaderMyMediaSmall": "My Media (small)", "HeaderMyMediaSmall": "My Media (small)",
"HeaderNavigation": "Navigation",
"HeaderNewApiKey": "New API Key", "HeaderNewApiKey": "New API Key",
"HeaderNewDevices": "New Devices", "HeaderNewDevices": "New Devices",
"HeaderNextEpisodePlayingInValue": "Next Episode Playing in {0}", "HeaderNextEpisodePlayingInValue": "Next Episode Playing in {0}",
@ -1258,7 +1259,7 @@
"Repeat": "Repeat", "Repeat": "Repeat",
"RepeatAll": "Repeat all", "RepeatAll": "Repeat all",
"RepeatEpisodes": "Repeat episodes", "RepeatEpisodes": "Repeat episodes",
"RepeatMode": "Repeat mode", "RepeatMode": "Repeat Mode",
"RepeatOne": "Repeat one", "RepeatOne": "Repeat one",
"ReplaceAllMetadata": "Replace all metadata", "ReplaceAllMetadata": "Replace all metadata",
"ReplaceExistingImages": "Replace existing images", "ReplaceExistingImages": "Replace existing images",
@ -1282,6 +1283,7 @@
"SearchForMissingMetadata": "Search for missing metadata", "SearchForMissingMetadata": "Search for missing metadata",
"SearchForSubtitles": "Search for Subtitles", "SearchForSubtitles": "Search for Subtitles",
"SearchResults": "Search Results", "SearchResults": "Search Results",
"SelectAdminUsername": "Please select a username for the admin account.",
"SendMessage": "Send message", "SendMessage": "Send message",
"Series": "Series", "Series": "Series",
"SeriesCancelled": "Series cancelled.", "SeriesCancelled": "Series cancelled.",

View file

@ -1,7 +1,7 @@
{ {
"AccessRestrictedTryAgainLater": "El acceso está restringido actualmente. Por favor, inténtalo más tarde.", "AccessRestrictedTryAgainLater": "El acceso está restringido actualmente. Por favor, inténtalo más tarde.",
"Add": "Añadir", "Add": "Añadir",
"AddItemToCollectionHelp": "Agregue elementos a las colecciones buscando en ellos y utilizando sus menús con el botón derecho del ratón o pulsando en los menús para agregarlos a una colección.", "AddItemToCollectionHelp": "Agregue elementos a las colecciones buscándolos y haciendo clic con el botón derecho o tocando los menús para agregarlos a una colección.",
"AddToCollection": "Añadir a la colección", "AddToCollection": "Añadir a la colección",
"AddToPlaylist": "Añadir a la lista de reproducción", "AddToPlaylist": "Añadir a la lista de reproducción",
"AddedOnValue": "Añadido {0}", "AddedOnValue": "Añadido {0}",
@ -1459,5 +1459,7 @@
"FetchingData": "Obteniendo datos adicionales", "FetchingData": "Obteniendo datos adicionales",
"ButtonAddImage": "Añadir imagen", "ButtonAddImage": "Añadir imagen",
"HeaderFavoritePeople": "Personas favoritas", "HeaderFavoritePeople": "Personas favoritas",
"OptionRandom": "Aleatorio" "OptionRandom": "Aleatorio",
"SelectAdminUsername": "Por favor seleccione un nombre de usuario para la cuenta de administrador.",
"ButtonSplit": "Dividir"
} }

View file

@ -1454,5 +1454,6 @@
"LabelBaseUrlHelp": "Vous pouvez ajouter un sous-répertoire personalisé ici pour accéder au serveur depuis une URL plus exclusive.", "LabelBaseUrlHelp": "Vous pouvez ajouter un sous-répertoire personalisé ici pour accéder au serveur depuis une URL plus exclusive.",
"HeaderFavoritePeople": "Personnes préférées", "HeaderFavoritePeople": "Personnes préférées",
"OptionRandom": "Aléatoire", "OptionRandom": "Aléatoire",
"ButtonSplit": "Découper" "ButtonSplit": "Séparer",
"SelectAdminUsername": "Veuillez choisir un nom d'utilisateur pour le compte administrateur."
} }

View file

@ -1253,7 +1253,7 @@
"DisplayMissingEpisodesWithinSeasons": "시즌 내 누락된 에피소드 표시", "DisplayMissingEpisodesWithinSeasons": "시즌 내 누락된 에피소드 표시",
"EnableBackdrops": "배경", "EnableBackdrops": "배경",
"EnableBackdropsHelp": "라이브러리를 탐색하는 동안 일부 페이지의 배경을 표시합니다.", "EnableBackdropsHelp": "라이브러리를 탐색하는 동안 일부 페이지의 배경을 표시합니다.",
"ErrorAddingXmlTvFile": "XmlTV 파일에 액세스하는 동안 오류가 발생했습니다. 파일이 존재하는지 확인 후 다시 시도하십시오.", "ErrorAddingXmlTvFile": "XMLTV 파일에 액세스하는 동안 오류가 발생했습니다. 파일이 존재하는지 확인 후 다시 시도하십시오.",
"ErrorDeletingItem": "Jellyfin 서버에서 항목을 제거하는 중에 오류가 발생했습니다. Jellyfin 서버가 미디어 폴더에 대해 쓰기 권한이 있는지 확인한 후 다시 시도하십시오.", "ErrorDeletingItem": "Jellyfin 서버에서 항목을 제거하는 중에 오류가 발생했습니다. Jellyfin 서버가 미디어 폴더에 대해 쓰기 권한이 있는지 확인한 후 다시 시도하십시오.",
"HeaderConfigureRemoteAccess": "원격 접근 구성", "HeaderConfigureRemoteAccess": "원격 접근 구성",
"HeaderCastAndCrew": "배역 및 제작진", "HeaderCastAndCrew": "배역 및 제작진",
@ -1280,5 +1280,11 @@
"ErrorAddingMediaPathToVirtualFolder": "미디어 경로를 추가하는 데에 오류가 발생했습니다. 경로를 다시 확인하거나 Jellyfin 서버가 해당 경로에 접근할 수 있는지 확인해 주세요.", "ErrorAddingMediaPathToVirtualFolder": "미디어 경로를 추가하는 데에 오류가 발생했습니다. 경로를 다시 확인하거나 Jellyfin 서버가 해당 경로에 접근할 수 있는지 확인해 주세요.",
"ErrorGettingTvLineups": "TV 구성을 다운로드 하는 중에 오류가 발생하였습니다. 정보가 맞는지 확인한 후 다시 시도해 주세요.", "ErrorGettingTvLineups": "TV 구성을 다운로드 하는 중에 오류가 발생하였습니다. 정보가 맞는지 확인한 후 다시 시도해 주세요.",
"BoxRear": "상자 (후면)", "BoxRear": "상자 (후면)",
"Absolute": "절대" "Absolute": "절대",
"LabelDropShadow": "하단 그림자:",
"LabelDiscNumber": "디스크 번호:",
"Identify": "식별자",
"HeaderMoreLikeThis": "비슷한 작품",
"DirectorsValue": "감독: {0}",
"ButtonSplit": "나누기"
} }

Some files were not shown because too many files have changed in this diff Show more